macOS companion app
Menüleiste
Was angezeigt wird
- Wir zeigen den aktuellen Arbeitszustand des Agenten im Menüleisten-Icon und in der ersten Statuszeile des Menüs an.
- Der Health-Status wird ausgeblendet, während Arbeit aktiv ist; er kehrt zurück, wenn alle Sitzungen inaktiv sind.
- Ein Root-Untermenü „Kontext“ enthält aktuelle Sitzungen, statt sie direkt im Root-Menü aufzuklappen.
- Der Block „Nodes“ im Root-Menü listet nur Geräte auf (gekoppelte Nodes über
node.list), keine Client-/Präsenz-Einträge. - Ein Root-Abschnitt „Nutzung“ erscheint unter Kontext, wenn Provider-Nutzungs-Snapshots verfügbar sind, gefolgt von Nutzungskosten-Details, wenn verfügbar.
Zustandsmodell
- Sitzungen: Ereignisse kommen mit
runId(pro Lauf) plussessionKeyin der Payload an. Die „Haupt“-Sitzung ist der Schlüsselmain; falls er fehlt, greifen wir auf die zuletzt aktualisierte Sitzung zurück. - Priorität: Haupt gewinnt immer. Wenn Haupt aktiv ist, wird ihr Zustand sofort angezeigt. Wenn Haupt inaktiv ist, wird die zuletzt aktive Nicht-Haupt-Sitzung angezeigt. Wir wechseln nicht mitten in der Aktivität hin und her; wir wechseln nur, wenn die aktuelle Sitzung inaktiv wird oder Haupt aktiv wird.
- Aktivitätsarten:
job: Ausführung eines High-Level-Befehls (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 → 🛠️
Visuelle Zuordnung
idle: normales Tierchen.workingMain: Badge mit Glyph, vollständige Tönung, „Working“-Beinanimation.workingOther: Badge mit Glyph, gedämpfte Tönung, kein Huschen.overridden: verwendet unabhängig von der Aktivität den gewählten Glyph/die gewählte Tönung.
Kontext-Untermenü
- Das Root-Menü zeigt eine Zeile „Kontext“ mit Sitzungsanzahl/-status und öffnet ein Untermenü.
- Die Kopfzeile des Kontext-Untermenüs zeigt die Anzahl aktiver Sitzungen der letzten 24 Stunden.
- Jede Sitzungszeile behält ihre Token-Leiste, ihr Alter, ihre Vorschau, Denken/ausführlich sowie die Aktionen Zurücksetzen, Komprimieren und Löschen.
- Lade-, Getrennt- und Sitzungslade-Fehlermeldungen erscheinen im Kontext-Untermenü.
- Provider-Nutzung und Nutzungskosten-Details bleiben auf Root-Ebene unter Kontext, damit sie ohne Öffnen des Untermenüs auf einen Blick sichtbar bleiben.
Statuszeilentext (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 inaktiven Zustand: fällt auf die Health-Zusammenfassung 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.
- Labels:
exec: erste Zeile vonargs.command.read/write: gekürzter Pfad.edit: Pfad plus ausmeta/Diff-Zählwerten abgeleitete Änderungsart.- Fallback: Tool-Name.
Debug-Override
- Einstellungen ▸ Debug ▸ Auswahl „Icon-Override“:
System (auto)(Standard)Working: main(pro Tool-Art)Working: other(pro Tool-Art)Idle
- Gespeichert über
@AppStorage("iconOverride"); zugeordnet zuIconState.overridden.
Test-Checkliste
- Hauptsitzungs-Job auslösen: prüfen, dass das Icon sofort wechselt und die Statuszeile das Haupt-Label anzeigt.
- Nicht-Haupt-Sitzungs-Job auslösen, während Haupt inaktiv ist: Icon/Status zeigt Nicht-Haupt an; bleibt stabil, bis er abgeschlossen ist.
- Haupt starten, während Andere aktiv ist: Icon wechselt sofort zu Haupt.
- Schnelle Tool-Bursts: sicherstellen, dass das Badge nicht flackert (TTL-Kulanz bei Tool-Ergebnissen).
- Health-Zeile erscheint wieder, sobald alle Sitzungen inaktiv sind.