Logique de statut de la barre de menus
Ce qui est affiché
- Nous affichons l’état de travail actuel de l’agent dans l’icône de la barre de menus et dans la première ligne de statut du menu.
- L’état de santé est masqué pendant que le travail est actif ; il réapparaît lorsque toutes les sessions sont inactives.
- Le bloc « Nodes » du menu liste uniquement les appareils (nœuds appairés via
node.list), et non les entrées client/présence. - Une section « Usage » apparaît sous Context lorsque des instantanés d’utilisation du fournisseur sont disponibles.
Modèle d’état
- Sessions : les événements arrivent avec
runId(par exécution) plussessionKeydans la charge utile. La session « principale » est la clémain; si elle est absente, nous revenons à la session mise à jour le plus récemment. - Priorité : la session principale l’emporte toujours. Si la principale est active, son état est affiché immédiatement. Si la principale est inactive, la session non principale la plus récemment active est affichée. Nous n’alternons pas en cours d’activité ; nous basculons uniquement lorsque la session courante devient inactive ou que la principale devient active.
- Types d’activité :
job: exécution de commandes de haut niveau (state: started|streaming|done|error).tool:phase: start|resultavectoolNameetmeta/args.
Enum IconState (Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(remplacement de débogage)
ActivityKind → glyphe
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- par défaut → 🛠️
Mappage visuel
idle: créature normale.workingMain: badge avec glyphe, teinte complète, animation de pattes « en travail ».workingOther: badge avec glyphe, teinte atténuée, pas de déplacement.overridden: utilise le glyphe/la teinte choisis indépendamment de l’activité.
Texte de la ligne de statut (menu)
- Pendant que le travail est actif :
<Session role> · <activity label>- Exemples :
Main · exec: pnpm test,Other · read: apps/macos/Sources/OpenClaw/AppState.swift.
- Exemples :
- À l’inactivité : retour au récapitulatif de santé.
Ingestion des événements
- Source : événements
agentdu canal de contrôle (ControlChannel.handleAgentEvent). - Champs analysés :
stream: "job"avecdata.statepour démarrage/arrêt.stream: "tool"avecdata.phase,name,meta/argsoptionnels.
- Libellés :
exec: première ligne deargs.command.read/write: chemin raccourci.edit: chemin plus type de modification déduit demeta/comptes de diff.- repli : nom de l’outil.
Debug override
- Réglages ▸ Debug ▸ sélecteur « Icon override » :
System (auto)(par défaut)Working: main(par type d’outil)Working: other(par type d’outil)Idle
- Stocké via
@AppStorage("iconOverride"); mappé versIconState.overridden.
Liste de vérification de test
- Déclencher un job de la session principale : vérifier que l’icône bascule immédiatement et que la ligne de statut affiche le libellé principal.
- Déclencher un job de session non principale lorsque la principale est inactive : l’icône/le statut affichent la non principale ; restent stables jusqu’à la fin.
- Démarrer la principale alors qu’une autre est active : l’icône bascule instantanément vers la principale.
- Rafales rapides d’outils : s’assurer que le badge ne scintille pas (délai de grâce TTL sur les résultats d’outils).
- La ligne de santé réapparaît une fois toutes les sessions inactives.