Menüleisten-Status-Logik

Was angezeigt wird

  • Der aktuelle Arbeitsstatus des Agent wird im Menüleisten-Icon und in der ersten Statuszeile des Menüs angezeigt.
  • Der Health-Status wird ausgeblendet, während der Agent arbeitet. Er erscheint wieder, sobald alle Sessions im Leerlauf sind.
  • Der “Nodes”-Block im Menü listet nur Geräte auf (gepaarte Nodes über node.list), keine Client- oder Presence-Einträge.
  • Ein “Usage”-Bereich erscheint unter Context, wenn Provider-Nutzungsstatistiken verfügbar sind.

State-Modell

  • Sessions: Events kommen mit runId (pro Durchlauf) plus sessionKey in der Payload an. Die “main”-Session hat den Key main. Falls nicht vorhanden, wird auf die zuletzt aktualisierte Session zurückgegriffen.
  • Priorität: main gewinnt immer. Wenn main aktiv ist, wird ihr Status sofort angezeigt. Wenn main im Leerlauf ist, wird die zuletzt aktive Nicht-main-Session angezeigt. Wir wechseln nicht während einer Aktivität hin und her – nur wenn die aktuelle Session in den Leerlauf geht oder main aktiv wird.
  • Aktivitätsarten:
    • job: High-Level-Befehlsausführung (state: started|streaming|done|error).
    • tool: phase: start|result mit toolName und meta/args.

IconState enum (Swift)

  • idle
  • workingMain(ActivityKind)
  • workingOther(ActivityKind)
  • overridden(ActivityKind) (Debug-Override)

ActivityKind → Glyph

  • exec → 💻
  • read → 📄
  • write → ✍️
  • edit → 📝
  • attach → 📎
  • default → 🛠️

Visuelle Zuordnung

  • idle: normales Critter.
  • workingMain: Badge mit Glyph, volle Färbung, Bein-”Working”-Animation.
  • workingOther: Badge mit Glyph, gedämpfte Färbung, kein Scurry.
  • overridden: verwendet das gewählte Glyph/Färbung unabhängig von der Aktivität.

Statuszeilen-Text (Menü)

  • Während der Agent arbeitet: <Session-Rolle> · <Aktivitätslabel>
    • Beispiele: Main · exec: pnpm test, Other · read: apps/macos/Sources/OpenClaw/AppState.swift.
  • Im Leerlauf: fällt zurück auf die Health-Zusammenfassung.

Event-Verarbeitung

  • Quelle: Control-Channel agent-Events (ControlChannel.handleAgentEvent).
  • Geparste Felder:
    • stream: "job" mit data.state für Start/Stop.
    • stream: "tool" mit data.phase, name, optional meta/args.
  • Labels:
    • exec: erste Zeile von args.command.
    • read/write: gekürzter Pfad.
    • edit: Pfad plus abgeleitete Änderungsart aus meta/Diff-Counts.
    • Fallback: Tool-Name.

Debug-Override

  • Settings ▸ Debug ▸ “Icon override”-Auswahl:
    • System (auto) (Standard)
    • Working: main (pro Tool-Art)
    • Working: other (pro Tool-Art)
    • Idle
  • Gespeichert über @AppStorage("iconOverride"); gemappt auf IconState.overridden.

Test-Checkliste

  • Main-Session-Job auslösen: prüfe, ob das Icon sofort wechselt und die Statuszeile das Main-Label zeigt.
  • Nicht-main-Session-Job auslösen, während main im Leerlauf ist: Icon/Status zeigt Nicht-main; bleibt stabil, bis es fertig ist.
  • Main starten, während andere aktiv ist: Icon wechselt sofort zu main.
  • Schnelle Tool-Bursts: stelle sicher, dass das Badge nicht flackert (TTL-Gnadenfrist bei Tool-Results).
  • Health-Zeile erscheint wieder, sobald alle Sessions im Leerlauf sind.