Detección de agentes
Cómo MadoHub identifica qué agente de IA está en ejecución y rastrea su estado.
MadoHub monitorea la salida del terminal en tiempo real para detectar qué agente de IA está en ejecución y en qué estado se encuentra. Esto alimenta los indicadores visuales en las barras de título de los tiles y activa las conexiones de enrutamiento.
Agentes admitidos
Claude Code
Se detecta mediante marcadores Unicode en la salida del terminal:
| Marcador | Significado |
|---|---|
| ❯ (U+2770) | Prompt de Claude Code |
| ✽ (U+273D) | Pensando / indicador giratorio |
| ⏺ (U+23FA) | Indicador de uso de herramientas |
También coincide con la cadena literal "Claude Code" en la salida.
OpenAI Codex CLI
Se detecta mediante estos patrones:
OpenAI Codex— Línea de marcacodex>— Prompt de la TUIopenai/codex— Referencia del paquetecodex v[0-9]— Cadena de versión> _ OpenAI Codex— Banner de iniciocodex --dangerously— Flag de bypass de sandbox (sin distinción de mayúsculas/minúsculas)codex...fast— Invocación de modelo rápido (sin distinción de mayúsculas/minúsculas)gpt-[0-9.]+ x?high— Información del modelo
Amp y OpenCode
Amp y OpenCode también se reconocen como tipos de agente, pero no a través del detector de texto de terminal del frontend descrito arriba — ese detector solo clasifica Claude Code, Codex y shell genérico. Las sesiones de Amp y OpenCode se identifican por separado, mediante un escaneo del árbol de procesos en el backend que recorre los procesos descendientes del terminal buscando sus ejecutables.
Shell genérico
Si no se detectan marcadores de agente, el terminal se trata como una sesión de shell estándar.
Estados del agente
MadoHub rastrea siete estados para cada terminal:
| Estado | Detección | Visual |
|---|---|---|
| Working | "esc to interrupt" en la barra de estado, o ✽/⏺ con puntos suspensivos | Borde verde pulsante |
| Idle | "? for shortcuts" en la barra de estado | Sin indicador |
| Waiting | Diálogos "Allow once" / "Allow always" / "Deny" / "Do you want to proceed?" / "(y/n)" / "requires approval" | Borde naranja |
| Stopped | Palabra clave de finalización detectada mediante lectura del terminal (ambiguo — la tarea puede haber terminado con éxito o no) | Indicador rojo |
| Completed | Finalización exitosa confirmada, obtenida del log de sesión JSONL/DB del propio agente (p. ej. task_complete de Codex) | Indicador verde |
| Failed | Fallo confirmado, obtenido del log de sesión JSONL/DB del propio agente (p. ej. turn_aborted / error de Codex) | Indicador rojo |
| Exited | El proceso PTY subyacente ya no existe (estado terminal) | Indicador gris/atenuado |
Cada estado lleva una etiqueta stateSource, ya sea pty-scrape o jsonl-watcher, de modo que la UI (y cualquier lógica de enrutamiento) pueda distinguir una suposición obtenida en vivo mediante lectura del terminal de un veredicto confirmado leyendo la transcripción de sesión del propio agente. "Stopped" siempre es pty-scrape y es inherentemente ambiguo; "Completed" y "Failed" provienen de jsonl-watcher y se tratan como autoritativos.
Detección de finalización
MadoHub detecta cuándo un agente termina una tarea haciendo coincidir una forma, no una lista fija de palabras: un glifo de spinner al inicio de línea, seguido de un verbo en participio pasado con mayúscula inicial, seguido de " for " y una duración.
El patrón regex:
/(?:^\s*[✶✽✳✢·∗*]\s*([A-Z][a-zé]+(?:ed|t))|\b(Saut[ée]*d|Cogitated))\s+for\s+(?:\d+\s*[hm]\s*)*\d+\s*[hms]\b/Claude Code rota el verbo entre versiones (Worked, Churned, Sautéed, Cogitated, entre otros), así que el verbo en sí deliberadamente no se enumera — la coincidencia se basa en la forma en su lugar. Una coincidencia real se ve así:
✽ Worked for 2m 30sEl ancla del glifo al inicio de línea (uno de ✶✽✳✢·∗*) es lo que evita falsos positivos con prosa ordinaria como "Retried for 3s". Sautéed y Cogitated sobreviven en el patrón únicamente como un fallback heredado sin glifo, para salidas de CLI más antiguas anteriores al formato anclado por glifo.
Cuando se detecta una finalización, el estado del agente cambia a "stopped" y cualquier disparador de enrutamiento conectado puede activarse.