Logik der Menüleisten-Statusanzeige
Was angezeigt wird
- Wir zeigen den aktuellen Arbeitsstatus des Agenten im Symbol der Menüleiste und in der ersten Statuszeile des Menüs an.
- Der Gesundheitsstatus wird ausgeblendet, während Arbeit aktiv ist; er kehrt zurück, sobald alle Sitzungen untätig sind.
- Der Block „Nodes“ im Menü listet nur Geräte auf (gepairte Nodes über
node.list), nicht Client-/Presence-Einträge. - Ein Abschnitt „Usage“ erscheint unter Context, wenn Nutzungs-Snapshots des Providers verfügbar sind.
Zustandsmodell
- Sitzungen: Ereignisse kommen mit
runId(pro Lauf) plussessionKeyin der Payload. Die Sitzung „main“ hat den Schlüsselmain; wenn sie fehlt, greifen wir auf die zuletzt aktualisierte Sitzung zurück. - Priorität: main gewinnt immer. Wenn main aktiv ist, wird ihr Zustand sofort angezeigt. Wenn main untätig ist, wird die zuletzt aktive Nicht-Main-Sitzung angezeigt. Wir wechseln nicht mitten in aktiver Arbeit hin und her; wir wechseln nur, wenn die aktuelle Sitzung untätig wird oder main 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-Überschreibung)
ActivityKind → Glyphe
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- Standard → 🛠️
Visuelles Mapping
idle: normales Critter.workingMain: Badge mit Glyphe, volle Tönung, Beinanimation „working“.workingOther: Badge mit Glyphe, gedämpfte Tönung, kein Huschen.overridden: verwendet die ausgewählte Glyphe/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:
- Wenn untätig: fällt auf die Gesundheitszusammenfassung zurück.
Ereignisaufnahme
- Quelle:
agent-Ereignisse des Control Channel (ControlChannel.handleAgentEvent). - Geparste Felder:
stream: "job"mitdata.statefür Start/Stopp.stream: "tool"mitdata.phase,name, optionalmeta/args.
- Labels:
exec: erste Zeile vonargs.command.read/write: gekürzter Pfad.edit: Pfad plus abgeleitete Änderungsart ausmeta/Diff-Anzahlen.- Fallback: Toolname.
Debug-Überschreibung
- Settings ▸ Debug ▸ Picker „Icon override“:
System (auto)(Standard)Working: main(pro Tool-Art)Working: other(pro Tool-Art)Idle
- Gespeichert über
@AppStorage("iconOverride"); abgebildet aufIconState.overridden.
Test-Checkliste
- Hauptsitzungs-Job auslösen: prüfen, dass das Symbol sofort wechselt und die Statuszeile die Main-Beschriftung zeigt.
- Nicht-Main-Sitzungs-Job auslösen, während main untätig ist: Symbol/Status zeigt Nicht-Main; bleibt stabil, bis der Job endet.
- Main starten, während other aktiv ist: Symbol wechselt sofort zu main.
- Schnelle Tool-Bursts: sicherstellen, dass das Badge nicht flackert (TTL-Kulanz bei Tool-Ergebnissen).
- Die Gesundheitszeile erscheint erneut, sobald alle Sitzungen untätig sind.