Presença
A “presença” do OpenClaw é uma visão leve e de melhor esforço de:- o próprio Gateway, e
- clientes conectados ao Gateway (app para macOS, WebChat, CLI, etc.)
Campos de presença (o que aparece)
As entradas de presença são objetos estruturados com campos como:instanceId(opcional, mas fortemente recomendado): identidade estável do cliente (geralmenteconnect.client.instanceId)host: nome do host amigávelip: endereço IP de melhor esforçoversion: string de versão do clientedeviceFamily/modelIdentifier: indícios de hardwaremode:ui,webchat,cli,backend,probe,test,node, …lastInputSeconds: “segundos desde a última entrada do usuário” (se conhecido)reason:self,connect,node-connected,periodic, …ts: carimbo de data/hora da última atualização (ms desde a época)
Produtores (de onde a presença vem)
As entradas de presença são produzidas por várias fontes e mescladas.1. Entrada do próprio Gateway
O Gateway sempre inicializa uma entrada “self” na inicialização para que as UIs mostrem o host do gateway mesmo antes de qualquer cliente se conectar.2. Conexão WebSocket
Todo cliente WS começa com uma solicitaçãoconnect. Em um handshake bem-sucedido, o
Gateway faz um upsert de uma entrada de presença para essa conexão.
Por que comandos pontuais da CLI não aparecem
A CLI frequentemente se conecta para comandos curtos e pontuais. Para evitar poluir a lista de Instances,client.mode === "cli" não é transformado em uma entrada de presença.
3. Beacons system-event
Os clientes podem enviar beacons periódicos mais ricos por meio do método system-event. O app para macOS
usa isso para relatar nome do host, IP e lastInputSeconds.
4. Conexões de node (papel: node)
Quando um node se conecta pelo WebSocket do Gateway comrole: node, o Gateway
faz um upsert de uma entrada de presença para esse node (mesmo fluxo de outros clientes WS).
Regras de mesclagem + deduplicação (por que instanceId importa)
As entradas de presença são armazenadas em um único mapa em memória:
- As entradas são indexadas por uma chave de presença.
- A melhor chave é um
instanceIdestável (deconnect.client.instanceId) que sobrevive a reinicializações. - As chaves não diferenciam maiúsculas de minúsculas.
instanceId estável, ele pode aparecer como uma
linha duplicada.
TTL e tamanho limitado
A presença é intencionalmente efêmera:- TTL: entradas com mais de 5 minutos são removidas
- Máx. de entradas: 200 (as mais antigas são descartadas primeiro)
Observação sobre remoto/túnel (IPs de loopback)
Quando um cliente se conecta por um túnel SSH / encaminhamento de porta local, o Gateway pode ver o endereço remoto como127.0.0.1. Para evitar sobrescrever um IP informado corretamente pelo cliente,
endereços remotos de loopback são ignorados.
Consumidores
Aba Instances do macOS
O app para macOS renderiza a saída desystem-presence e aplica um pequeno indicador de status
(Ativo/Ocioso/Obsoleto) com base na idade da última atualização.
Dicas de depuração
- Para ver a lista bruta, chame
system-presenceno Gateway. - Se você vir duplicatas:
- confirme que os clientes enviam um
client.instanceIdestável no handshake - confirme que os beacons periódicos usam o mesmo
instanceId - verifique se a entrada derivada da conexão está sem
instanceId(duplicatas são esperadas)
- confirme que os clientes enviam um