# Ciclo de Vida de los Agentes ## Estados del Agente ``` ┌──────────────┐ │ Initializing │ └──────┬───────┘ │ ▼ ┌──────┐ ┌──────┐ │ Idle │◄───►│ Busy │ └───┬──┘ └──┬───┘ │ │ │ │ ▼ ▼ ┌───────┐ ┌───────┐ │ Error │ │Offline│ └───────┘ └───────┘ ``` ## Inicialización ### 1. Creación del Pod ```typescript // Backend crea el pod const agentManager = new AgentManager() const agent = await agentManager.createAgent(['javascript', 'react']) // Resultado { id: 'agent-abc123', podName: 'claude-agent-abc123', namespace: 'agents', status: 'initializing' } ``` ### 2. Arranque del Contenedor ```bash # En el pod (entrypoint.sh) echo "🤖 Starting agent: $AGENT_ID" # 1. Setup SSH echo "$GIT_SSH_KEY" > /root/.ssh/id_ed25519 chmod 600 /root/.ssh/id_ed25519 # 2. Configure Claude Code MCP cat > /root/.claude-code/config.json </dev/null || true # Kill background jobs kill $HEARTBEAT_PID 2>/dev/null || true echo "👋 Goodbye" exit 0 } trap cleanup SIGTERM SIGINT # Wait for signals wait ``` ## Auto-Scaling ```typescript // Auto-scaler que corre cada 30s async function autoScale() { // Get metrics const pendingTasks = await db.query.tasks.findMany({ where: eq(tasks.state, 'backlog'), }) const idleAgents = await db.query.agents.findMany({ where: eq(agents.status, 'idle'), }) const busyAgents = await db.query.agents.findMany({ where: eq(agents.status, 'busy'), }) const totalAgents = idleAgents.length + busyAgents.length // Decision logic let targetAgents = totalAgents // Scale up if: // - More than 3 pending tasks // - No idle agents if (pendingTasks.length > 3 && idleAgents.length === 0) { targetAgents = Math.min(totalAgents + 2, 10) // Max 10 } // Scale down if: // - No pending tasks // - More than 2 idle agents if (pendingTasks.length === 0 && idleAgents.length > 2) { targetAgents = Math.max(totalAgents - 1, 2) // Min 2 } if (targetAgents !== totalAgents) { logger.info(`Auto-scaling: ${totalAgents} → ${targetAgents}`) await agentManager.scaleAgents(targetAgents) } } setInterval(autoScale, 30000) ``` ## Métricas del Ciclo de Vida ```typescript // Endpoint para métricas de agentes router.get('/agents/metrics', async (req, res) => { const agents = await db.query.agents.findMany() const metrics = { total: agents.length, byStatus: { idle: agents.filter((a) => a.status === 'idle').length, busy: agents.filter((a) => a.status === 'busy').length, error: agents.filter((a) => a.status === 'error').length, offline: agents.filter((a) => a.status === 'offline').length, }, totalTasksCompleted: agents.reduce((sum, a) => sum + a.tasksCompleted, 0), avgTasksPerAgent: agents.reduce((sum, a) => sum + a.tasksCompleted, 0) / agents.length || 0, totalRuntime: agents.reduce((sum, a) => sum + a.totalRuntimeMinutes, 0), } res.json(metrics) }) ``` ## Dashboard Visualization En el frontend, mostrar: - **Estado actual** de cada agente (idle/busy/error) - **Tarea actual** si está busy - **Historial** de tareas completadas - **Métricas** (tareas/hora, uptime, etc.) - **Botones** para restart/delete agente - **Logs en tiempo real** de cada agente