macOS companion app

Barre de menus

Éléments affichés

  • L’état de travail actuel de l’agent s’affiche dans l’icône de la barre des menus et dans la première ligne d’état du menu.
  • L’état de santé est masqué tant qu’une activité est en cours ; il réapparaît lorsque toutes les sessions sont inactives.
  • Un élément racine « Contexte » ouvre un sous-menu contenant les sessions récentes au lieu de les développer dans le menu racine.
  • Un bloc « Nœuds » dans le menu racine répertorie uniquement les appareils appairés (provenant de node.list), et non les entrées de client ou de présence.
  • Une section racine « Utilisation » s’affiche sous Contexte lorsque des instantanés d’utilisation du fournisseur sont disponibles, suivie des détails de coût lorsqu’ils sont disponibles.

Modèle d’état

  • Source : WorkActivityStore (apps/macos/Sources/OpenClaw/WorkActivityStore.swift).
  • Les événements arrivent sous forme de ControlAgentEvent avec un runId ; le gestionnaire (ControlChannel.routeWorkActivity) lit sessionKey dans la charge utile de l’événement et utilise "main" par défaut en son absence.
  • Priorité : la session principale (sessionKey == "main" par défaut) est toujours prioritaire. Si la session principale est active, son état s’affiche immédiatement. Si elle est inactive, l’état de la session non principale la plus récemment active s’affiche à sa place. Le magasin ne change pas de session en cours d’activité ; il ne bascule 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|result avec name et, facultativement, meta/args.

Énumération IconState (Swift)

  • idle
  • workingMain(ActivityKind)
  • workingOther(ActivityKind)
  • overridden(ActivityKind) (remplacement de débogage)

ActivityKind -> symbole du badge

ActivityKind encapsule un ToolKind (bash, read, write, edit, attach, other) ou un simple job. Chacun correspond à un symbole SF affiché comme badge sur l’icône de la créature (IconState.badgeSymbolName) :

Type Symbole
bash chevron.left.slash.chevron.right
read doc
write pencil
edit pencil.tip
attach paperclip
other / job gearshape.fill

Correspondance visuelle

  • idle : créature normale, sans badge.
  • workingMain : badge avec symbole, teinte pleine (importance .primary), animation « en activité » des pattes.
  • workingOther : badge avec symbole, teinte atténuée (importance .secondary), sans déplacement rapide.
  • overridden : utilise le symbole et la teinte choisis, indépendamment de l’activité réelle.

Sous-menu Contexte

  • Le menu racine affiche une ligne « Contexte » avec le nombre et l’état des sessions ; elle ouvre un sous-menu (MenuSessionsInjector).
  • L’en-tête du sous-menu affiche le nombre de sessions actives au cours des dernières 24 heures.
  • Chaque ligne de session conserve sa barre de jetons, son ancienneté, son aperçu, le bouton d’activation de la réflexion et du mode détaillé, ainsi que les actions de réinitialisation, de Compaction et de suppression.
  • Les messages de chargement, de déconnexion et d’erreur de chargement des sessions s’affichent dans le sous-menu Contexte.
  • Les sections d’utilisation et de coût restent au niveau racine, sous Contexte, afin de rester consultables d’un coup d’œil sans ouvrir le sous-menu.

Texte de la ligne d’état (menu)

  • Pendant que le travail est en cours : &lt;Session role&gt; · <activity label> ("\(roleLabel) · \(activity.label)" dans MenuContentView), où le libellé du rôle est Main ou Other.
  • En cas d’inactivité : revient au résumé de l’état de santé.

Ingestion des événements

  • Source : événements agent du canal de contrôle, acheminés par ControlChannel.routeWorkActivity(from:).
  • Champs analysés :
    • stream: "job" avec data.state pour le démarrage/l’arrêt.
    • stream: "tool" avec data.phase, data.name et, facultativement, data.meta/data.args.
  • Les libellés des outils proviennent de ToolDisplayRegistry.resolve(name:args:meta:) ; les noms non résolus utilisent par défaut le nom brut de l’outil.

Remplacement pour le débogage

  • Sélecteur Settings > Debug > "Icon override" :
    • System (auto) (par défaut)
    • Working: main / Working: other (selon le type d’outil : bash, lecture, écriture, modification, autre)
    • Idle
  • Stocké sous la clé UserDefaults openclaw.iconOverride ; associé à IconState.overridden.

Liste de vérification des tests

  • Déclencher une tâche de la session principale : l’icône change immédiatement et la ligne d’état affiche le libellé principal.
  • Déclencher une tâche d’une session non principale lorsque la session principale est inactive : l’icône et l’état affichent la session non principale et restent stables jusqu’à la fin de la tâche.
  • Démarrer la session principale lorsqu’une autre session est active : l’icône bascule instantanément vers la session principale.
  • Rafales rapides d’outils : le badge ne scintille pas (délai de grâce de 2 s avant d’effacer un outil terminé, WorkActivityStore.toolResultGrace).
  • La ligne d’état de santé réapparaît lorsque toutes les sessions sont inactives.

Pages associées

Was this useful?
On this page

On this page