← Volver al catálogo

🤖 Bot Telegram — Secretario (CEOSEC)

Archivo: /Users/user/rifai-agents/bot-telegram.ts · Plist: com.rifai.bot · Horario: daemon permanente (KeepAlive=true, RunAtLoad=true); arranca al cargar y se reinicia solo si muere. No tiene horario, está siempre escuchando.

Qué hace

Es el bot conversacional principal del CEO en Telegram (token ceosec). Recibe los mensajes del chat personal del dueño (TELEGRAM_CHAT_ID = 6577521052) y actúa como secretario: cualquier texto natural lo pasa al cerebro Router Central, y los /comandos los ejecuta como acciones rápidas. Mantiene una conversación viva por sesión del bot. Es la puerta de entrada para mandar órdenes a la flota desde el móvil.

Cómo funciona

1. Parsea .env y exige TELEGRAM_BOT_TOKEN y TELEGRAM_CHAT_ID; si faltan, aborta.

2. Entra en bucle infinito de long-polling: getUpdates con offset = lastUpdateId+1 y timeout=25s (AbortController a 35s).

3. Por cada update con texto, ignora los que no vengan del CHAT_ID del CEO (filtro de seguridad).

4. Despacha comandos: /help y /start y ayuda muestran ayuda; /panel da los URLs del Control Center; /reset borra la conversación; /run <agente> llama a runAgent() de ceo.ts; /lanza <id> ejecuta launch-product con ese product_id; /leads <query> <ciudad> <n> lanza scraper-maps-leads.ts por subproceso.

5. Cualquier otro texto → importa agentes/sec/router-central.ts y llama procesar(text); la respuesta se trocea a 3800 chars y se envía con tgSend.

6. Suprime el ruido de errores transitorios de polling: solo loggea tras 5 fallos seguidos y hace backoff progresivo.

Datos/APIs

  • Telegram Bot API (long-polling y envío) — vía tools/telegram.ts (tgSend) y fetch directo a getUpdates.
  • Control Center local: referencia a http://localhost:3000 (panel y asistente) — informativo en /panel.
  • ceo.ts (runAgent) para /run y /lanza.
  • agentes/sec/router-central.ts (procesar) para texto libre — su propio cerebro (NLP + datos reales).
  • scraper-maps-leads.ts por subproceso para /leads.
  • Vars .env: TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID. (El router y los agentes que invoca pueden requerir más vars propias.)

Cómo probarlo

cd /Users/user/rifai-agents && npx tsx bot-telegram.ts

Espera: imprime 🤖 Bot RifAI (secretario via panel) iniciado, manda 🤖 Secretario online al chat del CEO y se queda en polling. Escríbele /help desde Telegram para ver la ayuda, o un texto normal para probar el router. Corta con Ctrl-C.

⚠️ Invariante: un solo consumidor de getUpdates por token. No lo corras a mano mientras el daemon o bot-listener también leen el token ceosec, o se pisan los mensajes.

Si se rompe / recuperar

launchctl unload ~/Library/LaunchAgents/com.rifai.bot.plist
launchctl load   ~/Library/LaunchAgents/com.rifai.bot.plist

Logs: /Users/user/rifai-agents/logs/bot.log. Al ser KeepAlive=true, launchd lo revive solo; si entra en bucle de crash, revisa el log y que .env tenga token y chat_id. Confirma que ningún otro proceso lea el mismo token.

Cómo replicarlo

  • Un bot de Telegram con su token (rol secretario/CEOSEC) y el chat_id del dueño.
  • .env con TELEGRAM_BOT_TOKEN + TELEGRAM_CHAT_ID y el helper tools/telegram.ts.
  • El orquestador ceo.ts (runAgent) para comandos directos y el cerebro agentes/sec/router-central.ts para texto libre.
  • Bucle de long-polling con getUpdates/offset, filtro por chat_id, troceo a <4096 chars y backoff de errores.
  • Plist launchd con KeepAlive=true + RunAtLoad=true redirigiendo a logs/bot.log.