← Volver al catálogo

👔 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 spawnSync de npx tsx sobre los scripts de agentes/.
  • Importa tools/telegram.ts (tgSend) y tools/claude.ts (claudeAsk) — disponibles, aunque la lógica principal de despacho no los usa en este archivo.
  • Vars .env: ninguna propia. Hereda process.env y reenvía a los subagentes el env extra (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 runAgent que haga spawnSync con cwd absoluto del repo, timeout y maxBuffer generosos, y env mezclado 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 tsx y parsea su propio .env.