Lógica de Status da 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 o trabalho está ativo; ele retorna quando todas as sessões ficam ociosas.
- O bloco “Nodes” no menu lista apenas dispositivos (nodes pareados via
node.list), não entradas de cliente/presença. - Uma seção “Uso” aparece em Context quando snapshots de uso do provedor estão disponíveis.
Modelo de estado
- Sessões: os eventos chegam com
runId(por execução) maissessionKeyno payload. A sessão “principal” é a chavemain; se ela estiver ausente, usamos a sessão atualizada mais recentemente como fallback. - Prioridade: a principal sempre vence. Se a principal estiver ativa, seu estado será exibido imediatamente. Se a principal estiver ociosa, a sessão não principal ativa mais recente será exibida. Não alternamos no meio da 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: badge com glifo, tonalidade completa, animação de perna “em atividade”.workingOther: badge com glifo, tonalidade suave, sem correria.overridden: usa o glifo/tonalidade escolhidos independentemente da atividade.
Texto da linha de status (menu)
- Enquanto o trabalho está ativo:
<Função da sessão> · <rótulo da atividade>- Exemplos:
Principal · exec: pnpm test,Outra · read: apps/macos/Sources/OpenClaw/AppState.swift.
- Exemplos:
- Quando está ocioso: volta ao resumo de integridade.
Ingestão de eventos
- Origem: 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 abreviado.edit: caminho mais o tipo de mudança inferido a partir demeta/contagens do diff.- fallback: nome da ferramenta.
Substituição de depuração
- Configurações ▸ 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 testes
- Dispare um job da sessão principal: verifique se o ícone muda imediatamente e se a linha de status mostra o rótulo da principal.
- Dispare um job de uma sessão não principal enquanto a principal estiver ociosa: o ícone/status mostra a não principal; permanece estável até ela terminar.
- Inicie a principal enquanto outra estiver ativa: o ícone muda para a principal instantaneamente.
- Rajadas rápidas de ferramentas: garanta que o badge não oscile (tolerância TTL nos resultados das ferramentas).
- A linha de integridade reaparece quando todas as sessões ficam ociosas.