macOS companion app

Barra dei menu

Cosa viene mostrato

  • Mostriamo lo stato di lavoro corrente dell'agente nell'icona della barra dei menu e nella prima riga di stato del menu.
  • Lo stato di salute è nascosto mentre il lavoro è attivo; ritorna quando tutte le sessioni sono inattive.
  • Un sottomenu radice "Contesto" contiene le sessioni recenti invece di espanderle direttamente nel menu radice.
  • Il blocco "Nodes" nel menu radice elenca solo i dispositivi (nodi associati tramite node.list), non le voci client/presenza.
  • Una sezione radice "Utilizzo" appare sotto Contesto quando sono disponibili snapshot dell'utilizzo del provider, seguita dai dettagli sui costi di utilizzo quando disponibili.

Modello di stato

  • Sessioni: gli eventi arrivano con runId (per esecuzione) più sessionKey nel payload. La sessione "main" è la chiave main; se assente, ripieghiamo sulla sessione aggiornata più di recente.
  • Priorità: main vince sempre. Se main è attiva, il suo stato viene mostrato immediatamente. Se main è inattiva, viene mostrata la sessione non-main attiva più di recente. Non oscilliamo durante l'attività; cambiamo solo quando la sessione corrente diventa inattiva o main diventa attiva.
  • Tipi di attività:
    • job: esecuzione di comandi ad alto livello (state: started|streaming|done|error).
    • tool: phase: start|result con toolName e meta/args.

Enum IconState (Swift)

  • idle
  • workingMain(ActivityKind)
  • workingOther(ActivityKind)
  • overridden(ActivityKind) (override di debug)

ActivityKind → glifo

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

Mappatura visiva

  • idle: creatura normale.
  • workingMain: badge con glifo, tinta piena, animazione "working" delle zampe.
  • workingOther: badge con glifo, tinta attenuata, nessuno scatto.
  • overridden: usa il glifo/la tinta scelti indipendentemente dall'attività.

Sottomenu Contesto

  • Il menu radice mostra una riga "Contesto" con conteggio/stato delle sessioni e apre un sottomenu.
  • L'intestazione del sottomenu Contesto mostra il conteggio delle sessioni attive nelle ultime 24 ore.
  • Ogni riga di sessione mantiene la propria barra dei token, età, anteprima, azioni di thinking/verbose, reset, compact ed eliminazione.
  • I messaggi di caricamento, disconnessione ed errore di caricamento delle sessioni appaiono nel sottomenu Contesto.
  • I dettagli di utilizzo del provider e dei costi di utilizzo restano a livello radice sotto Contesto, così rimangono consultabili a colpo d'occhio senza aprire il sottomenu.

Testo della riga di stato (menu)

  • Mentre il lavoro è attivo: &lt;Session role&gt; · <activity label>
    • Esempi: Main · exec: pnpm test, Other · read: apps/macos/Sources/OpenClaw/AppState.swift.
  • Quando è inattivo: ripiega sul riepilogo dello stato di salute.

Acquisizione eventi

  • Origine: eventi agent del canale di controllo (ControlChannel.handleAgentEvent).
  • Campi analizzati:
    • stream: "job" con data.state per avvio/arresto.
    • stream: "tool" con data.phase, name, meta/args opzionali.
  • Etichette:
    • exec: prima riga di args.command.
    • read/write: percorso abbreviato.
    • edit: percorso più tipo di modifica dedotto da meta/conteggi diff.
    • ripiego: nome dello strumento.

Override di debug

  • Impostazioni ▸ Debug ▸ selettore "Override icona":
    • System (auto) (predefinito)
    • Working: main (per tipo di strumento)
    • Working: other (per tipo di strumento)
    • Idle
  • Salvato tramite @AppStorage("iconOverride"); mappato a IconState.overridden.

Checklist di test

  • Attiva un job della sessione main: verifica che l'icona cambi immediatamente e che la riga di stato mostri l'etichetta main.
  • Attiva un job di sessione non-main mentre main è inattiva: icona/stato mostrano la non-main; resta stabile finché non termina.
  • Avvia main mentre un'altra sessione è attiva: l'icona passa istantaneamente a main.
  • Raffiche rapide di strumenti: assicurati che il badge non lampeggi (grazia TTL sui risultati degli strumenti).
  • La riga di salute riappare quando tutte le sessioni sono inattive.

Correlati