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ùsessionKeynel payload. La sessione "main" è la chiavemain; 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|resultcontoolNameemeta/args.
Enum IconState (Swift)
idleworkingMain(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:
<Session role> · <activity label>- Esempi:
Main · exec: pnpm test,Other · read: apps/macos/Sources/OpenClaw/AppState.swift.
- Esempi:
- Quando è inattivo: ripiega sul riepilogo dello stato di salute.
Acquisizione eventi
- Origine: eventi
agentdel canale di controllo (ControlChannel.handleAgentEvent). - Campi analizzati:
stream: "job"condata.stateper avvio/arresto.stream: "tool"condata.phase,name,meta/argsopzionali.
- Etichette:
exec: prima riga diargs.command.read/write: percorso abbreviato.edit: percorso più tipo di modifica dedotto dameta/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 aIconState.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.