Application compagnon macOS
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.
- Le statut de santé est masqué pendant qu'un travail est actif ; il réapparaît lorsque toutes les sessions sont inactives.
- Le bloc "Nœuds" dans le menu liste uniquement les appareils (nœuds appairés via
node.list), pas les entrées client/présence. - Une section "Utilisation" apparaît sous Contexte lorsque des instantanés d'utilisation des fournisseurs sont disponibles.
Modèle d'état
- Sessions : les événements arrivent avec un
runId(par exécution) ainsi qu'unesessionKeydans 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 session principale est active, son état est affiché immédiatement. Si la session principale est inactive, la session non principale la plus récemment active est affichée. Nous ne basculons pas en plein milieu d'une activité ; nous ne changeons que lorsque la session actuelle devient inactive ou que la session principale devient active.
- Types d'activité :
job: exécution de commande de haut niveau (state: started|streaming|done|error).tool:phase: start|resultavectoolNameetmeta/args.
Enum IconState (Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(surcharge de débogage)
ActivityKind → glyphe
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- par défaut → 🛠️
Correspondance visuelle
idle: mascotte normale.workingMain: badge avec glyphe, teinte pleine, animation de "travail" de la patte.workingOther: badge avec glyphe, teinte atténuée, pas de déplacement rapide.overridden: utilise le glyphe/la teinte choisi(e) indépendamment de l'activité.
Texte de la ligne de statut (menu)
- Pendant qu'un travail est actif :
<Rôle de la session> · <libellé de l'activité>- Exemples :
Principal · exec: pnpm test,Autre · read: apps/macos/Sources/OpenClaw/AppState.swift.
- Exemples :
- Lorsqu'inactif : revient au résumé de santé.
Ingestion d'événements
- Source : événements
agentdu canal de contrôle (ControlChannel.handleAgentEvent). - Champs analysés :
stream: "job"avecdata.statepour le début/la fin.stream: "tool"avecdata.phase,name,meta/argsoptionnels.
- Libellés :
exec: première ligne deargs.command.read/write: chemin raccourci.edit: chemin plus le type de changement inféré à partir demeta/des comptages de diff.- valeur par défaut : nom de l'outil.
Surcharge de débogage
- Paramètres ▸ Débogage ▸ Sélecteur "Surcharge d'icône" :
Système (auto)(par défaut)En travail : principal(par type d'outil)En travail : autre(par type d'outil)Inactif
- Stocké via
@AppStorage("iconOverride"); mappé surIconState.overridden.
Liste de vérification pour les tests
- Déclencher un travail de session principale : vérifier que l'icône bascule immédiatement et que la ligne de statut affiche le libellé "principal".
- Déclencher un travail de session non principale pendant que la session principale est inactive : l'icône/le statut affiche "non principal" ; reste stable jusqu'à sa fin.
- Démarrer la session principale pendant qu'une autre est active : l'icône bascule instantanément vers "principal".
- Rafales rapides d'outils : s'assurer que le badge ne clignote 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.
Configuration Dev macOSVoice Wake