Détection des agents
Comment MadoHub identifie l'agent IA en cours d'exécution et suit son état.
MadoHub surveille la sortie du terminal en temps réel pour détecter quel agent IA est en cours d'exécution et dans quel état il se trouve. Cela alimente les indicateurs visuels dans les barres de titre des tiles et déclenche les connexions de routage.
Agents pris en charge
Claude Code
Détecté à partir de marqueurs Unicode dans la sortie du terminal :
| Marqueur | Signification |
|---|---|
| ❯ (U+2770) | Invite de Claude Code |
| ✽ (U+273D) | Indicateur de réflexion / spinner |
| ⏺ (U+23FA) | Indicateur d'utilisation d'un outil |
Correspond aussi à la chaîne littérale "Claude Code" dans la sortie.
OpenAI Codex CLI
Détecté à partir des motifs suivants :
OpenAI Codex— Ligne de marquecodex>— Invite TUIopenai/codex— Référence de paquetcodex v[0-9]— Chaîne de version> _ OpenAI Codex— Bannière de démarragecodex --dangerously— Indicateur de contournement du sandbox (insensible à la casse)codex...fast— Invocation du modèle rapide (insensible à la casse)gpt-[0-9.]+ x?high— Informations sur le modèle
Amp et OpenCode
Amp et OpenCode sont également reconnus comme des types d'agents, mais pas par le détecteur de texte de terminal du frontend décrit ci-dessus — celui-ci ne classe que Claude Code, Codex et le shell générique. Les sessions Amp et OpenCode sont identifiées séparément, par une analyse de l'arborescence des processus côté backend qui parcourt les processus descendants du terminal à la recherche de leurs exécutables.
Shell générique
Si aucun marqueur d'agent n'est détecté, le terminal est traité comme une session shell standard.
États de l'agent
MadoHub suit sept états pour chaque terminal :
| État | Détection | Visuel |
|---|---|---|
| Working | "esc to interrupt" dans la barre d'état, ou ✽/⏺ avec des points de suspension | Bordure verte pulsante |
| Idle | "? for shortcuts" dans la barre d'état | Aucun indicateur |
| Waiting | Boîtes de dialogue "Allow once" / "Allow always" / "Deny" / "Do you want to proceed?" / "(y/n)" / "requires approval" | Bordure orange |
| Stopped | Mot-clé de complétion détecté par lecture du terminal (ambigu — la tâche a peut-être réussi ou non) | Indicateur rouge |
| Completed | Fin réussie confirmée, extraite du journal de session JSONL/DB de l'agent lui-même (p. ex. task_complete de Codex) | Indicateur vert |
| Failed | Échec confirmé, extrait du journal de session JSONL/DB de l'agent lui-même (p. ex. turn_aborted / error de Codex) | Indicateur rouge |
| Exited | Le processus PTY sous-jacent n'existe plus (état terminal) | Indicateur gris/estompé |
Chaque état porte une étiquette stateSource, soit pty-scrape soit jsonl-watcher, permettant à l'UI (et à toute logique de routage) de distinguer une estimation obtenue en direct par lecture du terminal d'un verdict confirmé par la lecture de la transcription de session de l'agent lui-même. "Stopped" est toujours pty-scrape et intrinsèquement ambigu ; "Completed" et "Failed" proviennent de jsonl-watcher et sont considérés comme faisant autorité.
Détection de complétion
MadoHub détecte quand un agent termine une tâche en faisant correspondre une forme, et non une liste de mots fixe : un glyphe de spinner en début de ligne, suivi d'un verbe au participe passé commençant par une majuscule, suivi de " for " et d'une durée.
Le motif 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 fait tourner le verbe d'une version à l'autre (Worked, Churned, Sautéed, Cogitated, entre autres), si bien que le verbe lui-même n'est délibérément pas énumérable — la correspondance repose sur la forme à la place. Une correspondance réelle ressemble à :
✽ Worked for 2m 30sL'ancrage du glyphe en début de ligne (l'un de ✶✽✳✢·∗*) est ce qui empêche les faux positifs sur une prose ordinaire comme "Retried for 3s". Sautéed et Cogitated ne survivent dans le motif qu'à titre de solution de repli héritée, sans glyphe, pour les sorties de CLI plus anciennes antérieures au format ancré par glyphe.
Lorsqu'une complétion est détectée, l'état de l'agent passe à "stopped" et tous les déclencheurs de routage connectés peuvent se déclencher.