Logik des Menüleistenstatus
Was angezeigt wird
- Wir zeigen den aktuellen Arbeitsstatus des Agenten im Menüleistensymbol und in der ersten Statuszeile des Menüs an.
- Der Gesundheitsstatus wird ausgeblendet, während Arbeit aktiv ist; er erscheint wieder, wenn alle Sitzungen inaktiv sind.
- Der Block „Nodes“ im Menü listet nur Geräte (gekoppelte Nodes über
node.list), keine Client-/Presence-Einträge. - Ein Abschnitt „Usage“ erscheint unter „Context“, wenn Usage-Snapshots des Anbieters verfügbar sind.
Zustandsmodell
- Sitzungen: Ereignisse treffen mit
runId(pro Lauf) sowiesessionKeyim Payload ein. Die „Haupt“-Sitzung ist der Schlüsselmain; falls nicht vorhanden, greifen wir auf die zuletzt aktualisierte Sitzung zurück. - Priorität: Die Hauptsitzung gewinnt immer. Ist die Hauptsitzung aktiv, wird ihr Zustand sofort angezeigt. Ist die Hauptsitzung inaktiv, wird die zuletzt aktive Nicht‑Hauptsitzung angezeigt. Wir wechseln nicht während einer Aktivität hin und her; ein Wechsel erfolgt nur, wenn die aktuelle Sitzung inaktiv wird oder die Hauptsitzung aktiv wird.
- Aktivitätsarten:
job: Ausführung von Befehlen auf hoher Ebene (state: started|streaming|done|error).tool:phase: start|resultmittoolNameundmeta/args.
IconState-Enum (Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(Debug-Override)
ActivityKind → Glyph
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- Standard → 🛠️
Visuelles Mapping
idle: normales Critter.workingMain: Badge mit Glyph, volle Tönung, „arbeitende“ Beinanimation.workingOther: Badge mit Glyph, gedämpfte Tönung, kein Huschen.overridden: verwendet das gewählte Glyph/die gewählte Tönung unabhängig von der Aktivität.
Text der Statuszeile (Menü)
- Während Arbeit aktiv ist:
<Session role> · <activity label>- Beispiele:
Main · exec: pnpm test,Other · read: apps/macos/Sources/OpenClaw/AppState.swift.
- Beispiele:
- Im Leerlauf: fällt auf die Gesundheitszusammenfassung zurück.
Ereignisaufnahme
- Quelle: Control-Channel-
agent-Ereignisse (ControlChannel.handleAgentEvent). - Geparste Felder:
stream: "job"mitdata.statefür Start/Stopp.stream: "tool"mitdata.phase,name, optionalmeta/args.
- Beschriftungen:
exec: erste Zeile vonargs.command.read/write: verkürzter Pfad.edit: Pfad plus abgeleitete Änderungsart ausmeta/Diff-Zählungen.- Fallback: Werkzeugname.
Debug-Override
- Einstellungen ▸ Debug ▸ Auswahl „Icon override“:
System (auto)(Standard)Working: main(pro Werkzeugart)Working: other(pro Werkzeugart)Idle
- Gespeichert über
@AppStorage("iconOverride"); zugeordnet zuIconState.overridden.
Test-Checkliste
- Job der Hauptsitzung auslösen: prüfen, dass das Symbol sofort wechselt und die Statuszeile das Hauptlabel anzeigt.
- Job einer Nicht‑Hauptsitzung auslösen, während die Hauptsitzung inaktiv ist: Symbol/Status zeigen die Nicht‑Hauptsitzung; bleibt stabil, bis sie beendet ist.
- Hauptsitzung starten, während eine andere aktiv ist: Symbol wechselt sofort zur Hauptsitzung.
- Schnelle Werkzeug-Bursts: sicherstellen, dass das Badge nicht flackert (TTL‑Schonfrist bei Werkzeugergebnissen).
- Die Gesundheitszeile erscheint wieder, sobald alle Sitzungen inaktiv sind.