Presença
A “presença” do OpenClaw é uma visão leve e best-effort de:- o próprio Gateway, e
- clientes conectados ao Gateway (app Mac, WebChat, CLI etc.)
Campos de presença (o que aparece)
Entradas de presença são objetos estruturados com campos como:instanceId(opcional, mas fortemente recomendado): identidade estável do cliente (normalmenteconnect.client.instanceId)host: nome de host amigável para humanosip: endereço IP best-effortversion: string da versão do clientedeviceFamily/modelIdentifier: dicas 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: timestamp da última atualização (ms desde epoch)
Produtores (de onde vem a presença)
As entradas de presença são produzidas por várias fontes e mescladas.1) Entrada própria do Gateway
O Gateway sempre inicializa uma entrada “self” ao iniciar 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. Após um handshake bem-sucedido, o
Gateway faz upsert de uma entrada de presença para essa conexão.
Por que comandos únicos da CLI não aparecem
A CLI frequentemente se conecta para comandos curtos e pontuais. Para evitar poluir a lista Instances,client.mode === "cli" não é transformado em uma entrada de presença.
3) Beacons system-event
Clientes podem enviar beacons periódicos mais ricos via o método system-event. O app Mac
usa isso para informar 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 upsert de uma entrada de presença para esse node (o 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áximo 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 válido informado pelo cliente,
endereços remotos de loopback são ignorados.
Consumidores
Aba Instances do macOS
O app macOS renderiza a saída desystem-presence e aplica um pequeno indicador
de status (Active/Idle/Stale) 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