👔 CEO — Orquestador maestro
Archivo: /Users/user/rifai-agents/ceo.ts · Plist: _ninguno_ (no es un daemon ni un cron; es librería + CLI). Se ejecuta bajo demanda: importado por bot-telegram.ts (/run, /lanza) o lanzado a mano por terminal.
Qué hace
Es el registro central y despachador de toda la flota: mapea nombres cortos de agente (p.ej. audit-store, monitor-meta, daily-report) a sus scripts reales en agentes/. Expone runAgent(name, env) que ejecuta el agente pedido como subproceso npx tsx y devuelve su salida. No corre solo en bucle ni programado: es la pieza que el bot Telegram usa para lanzar agentes puntuales, y también sirve como CLI para listar y disparar agentes desde la terminal.
Cómo funciona
1. Define AGENT_MAP: diccionario nombre → { script, descripcion } con ~40 agentes agrupados por dominio (Pedidos, Tienda, Marketing, Compras, Finanzas, Clientes RifAI, Operaciones internas, migrados n8n v6).
2. runAgent(name, env): busca el nombre en el mapa; si no existe devuelve { ok:false, output } con la lista de disponibles. Si existe, hace spawnSync('npx', ['tsx', script]) con cwd fijo en /Users/user/rifai-agents, timeout 20 min, maxBuffer 50 MB y env mezclado (process.env + el env que se le pase, p.ej. ARGS/FORCE).
3. Devuelve { ok: status===0, output: stdout + [STDERR]... }.
4. Modo CLI: si se ejecuta directo (import.meta.url === file://argv[1]) sin argumento, imprime la tabla de agentes; con un argumento, ejecuta ese agente, imprime la salida y sale con su código de retorno.
Datos/APIs
- No llama a APIs externas directamente. Su único "servicio" es
spawnSyncdenpx tsxsobre los scripts deagentes/. - Importa
tools/telegram.ts(tgSend) ytools/claude.ts(claudeAsk) — disponibles, aunque la lógica principal de despacho no los usa en este archivo. - Vars
.env: ninguna propia. Heredaprocess.envy reenvía a los subagentes elenvextra (cada agente hijo parsea su propio.env).
Cómo probarlo
# Listar todos los agentes disponibles
cd /Users/user/rifai-agents && npx tsx ceo.ts
# Ejecutar un agente concreto a través del orquestador
cd /Users/user/rifai-agents && npx tsx ceo.ts health-check
Espera: sin argumento, imprime CEO — Orquestador RifAI y la tabla nombre descripción. Con un nombre válido, lanza ese agente y vuelca su stdout/stderr, saliendo con su mismo exit code. Con un nombre inexistente, imprime el error con la lista de agentes válidos.
Si se rompe / recuperar
No hay plist que recargar (no es un servicio). Si runAgent falla siempre, suele ser por: npx/tsx no en el PATH, el script del mapa no existe, o un agente hijo que peta (mira su propio log en /Users/user/rifai-agents/logs/<agente>.log). Para depurar, ejecuta el script hijo directo: npx tsx agentes/<x>.ts. No tiene log propio salvo cuando lo invoca el bot (queda en logs/bot.log).
Cómo replicarlo
- Un diccionario
nombre → {script, descripcion}como única fuente de verdad de qué agentes existen. - Una función
runAgentque hagaspawnSyncconcwdabsoluto del repo, timeout ymaxBuffergenerosos, yenvmezclado para pasar flags (ARGS,FORCE). - Un guard
import.meta.url === file://argv[1]para doble uso librería/CLI: sin arg lista, con arg ejecuta y propaga exit code. - Convención de que cada agente hijo se autoejecuta con
npx tsxy parsea su propio.env.