macOS companion app
Barra de menus
O que é exibido
- Exibimos o estado atual de trabalho do agente no ícone da barra de menus e na primeira linha de status do menu.
- O status de integridade fica oculto enquanto há trabalho ativo; ele retorna quando todas as sessões estão ociosas.
- Um submenu raiz "Contexto" contém sessões recentes em vez de expandi-las diretamente no menu raiz.
- O bloco "Nodes" no menu raiz lista apenas dispositivos (nodes pareados via
node.list), não entradas de cliente/presença. - Uma seção raiz "Uso" aparece abaixo de Contexto quando instantâneos de uso do provedor estão disponíveis, seguida por detalhes de custo de uso quando disponíveis.
Modelo de estado
- Sessões: eventos chegam com
runId(por execução) maissessionKeyno payload. A sessão "principal" é a chavemain; se ausente, usamos como fallback a sessão atualizada mais recentemente. - Prioridade: a principal sempre vence. Se a principal estiver ativa, seu estado é exibido imediatamente. Se a principal estiver ociosa, a sessão não principal ativa mais recentemente é exibida. Não alternamos durante a atividade; só trocamos quando a sessão atual fica ociosa ou a principal se torna ativa.
- Tipos de atividade:
job: execução de comando de alto nível (state: started|streaming|done|error).tool:phase: start|resultcomtoolNameemeta/args.
Enum IconState (Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(substituição de depuração)
ActivityKind → glifo
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- padrão → 🛠️
Mapeamento visual
idle: criatura normal.workingMain: selo com glifo, matiz completo, animação de perna "trabalhando".workingOther: selo com glifo, matiz atenuado, sem correr.overridden: usa o glifo/matiz escolhido independentemente da atividade.
Submenu Contexto
- O menu raiz mostra uma linha "Contexto" com uma contagem/status de sessões e abre um submenu.
- O cabeçalho do submenu Contexto mostra a contagem de sessões ativas nas últimas 24 horas.
- Cada linha de sessão mantém sua barra de tokens, idade, prévia, pensando/verboso, ações de redefinir, compactar e excluir.
- Mensagens de carregamento, desconexão e erro de carregamento de sessão aparecem dentro do submenu Contexto.
- Detalhes de uso do provedor e custo de uso permanecem no nível raiz abaixo de Contexto para continuarem visíveis rapidamente sem abrir o submenu.
Texto da linha de status (menu)
- Enquanto há trabalho ativo:
<Session role> · <activity label>- Exemplos:
Main · exec: pnpm test,Other · read: apps/macos/Sources/OpenClaw/AppState.swift.
- Exemplos:
- Quando ocioso: usa como fallback o resumo de integridade.
Ingestão de eventos
- Fonte: eventos
agentdo canal de controle (ControlChannel.handleAgentEvent). - Campos analisados:
stream: "job"comdata.statepara início/parada.stream: "tool"comdata.phase,name,meta/argsopcionais.
- Rótulos:
exec: primeira linha deargs.command.read/write: caminho encurtado.edit: caminho mais tipo de alteração inferido a partir demeta/contagens de diff.- fallback: nome da ferramenta.
Substituição de depuração
- Ajustes ▸ Depuração ▸ seletor "Substituição de ícone":
System (auto)(padrão)Working: main(por tipo de ferramenta)Working: other(por tipo de ferramenta)Idle
- Armazenado via
@AppStorage("iconOverride"); mapeado paraIconState.overridden.
Checklist de teste
- Acionar job da sessão principal: verifique se o ícone muda imediatamente e se a linha de status mostra o rótulo principal.
- Acionar job de sessão não principal enquanto a principal está ociosa: ícone/status mostra a não principal; permanece estável até terminar.
- Iniciar a principal enquanto outra está ativa: o ícone muda para a principal instantaneamente.
- Rajadas rápidas de ferramentas: garanta que o selo não pisque (graça de TTL em resultados de ferramentas).
- A linha de integridade reaparece quando todas as sessões ficam ociosas.