Protocolo de bridge (transporte de nó legado)
O protocolo Bridge é um transporte de nó legado (TCP JSONL). Novos clientes de nó devem usar o protocolo WebSocket unificado do Gateway em vez disso. Se você está criando um operador ou cliente de nó, use o protocolo do Gateway. Nota: As builds atuais do OpenClaw não incluem mais o listener de bridge TCP; este documento é mantido para referência histórica. As chaves de configuração legadasbridge.* não fazem mais parte do esquema de configuração.
Por que temos ambos
- Limite de segurança: a bridge expõe uma pequena lista de permissões em vez de toda a superfície da API do gateway.
- Pareamento + identidade do nó: a admissão de nós é controlada pelo gateway e vinculada a um token por nó.
- UX de descoberta: nós podem descobrir gateways via Bonjour na LAN ou conectar-se diretamente por um tailnet.
- WS em loopback: o plano de controle WS completo permanece local, a menos que seja tunelado via SSH.
Transporte
- TCP, um objeto JSON por linha (JSONL).
- TLS opcional (quando
bridge.tls.enabledé true). - A porta padrão legada do listener era
18790(as builds atuais não iniciam uma bridge TCP).
bridgeTls=1 além de
bridgeTlsSha256 para que os nós possam fixar o certificado. Observe que os registros TXT do Bonjour/mDNS são
não autenticados; os clientes não devem tratar a impressão digital anunciada como um
pin autoritativo sem intenção explícita do usuário ou outra verificação fora de banda.
Handshake + pareamento
- O cliente envia
hellocom metadados do nó + token (se já estiver pareado). - Se não estiver pareado, o gateway responde
error(NOT_PAIRED/UNAUTHORIZED). - O cliente envia
pair-request. - O gateway aguarda aprovação e, em seguida, envia
pair-okehello-ok.
hello-ok retorna serverName e pode incluir canvasHostUrl.
Quadros
Cliente → Gateway:req/res: RPC do gateway com escopo (chat, sessões, configuração, saúde, voicewake, skills.bins)event: sinais do nó (transcrição de voz, solicitação de agente, inscrição em chat, ciclo de vida de exec)
invoke/invoke-res: comandos do nó (canvas.*,camera.*,screen.record,location.get,sms.send)event: atualizações de chat para sessões inscritasping/pong: keepalive
src/gateway/server-bridge.ts (removido).
Eventos do ciclo de vida de exec
Os nós podem emitir eventosexec.finished ou exec.denied para expor a atividade de system.run.
Eles são mapeados para eventos de sistema no gateway. (Nós legados ainda podem emitir exec.started.)
Campos do payload (todos opcionais, salvo indicação):
sessionKey(obrigatório): sessão do agente para receber o evento de sistema.runId: id único de exec para agrupamento.command: string de comando bruta ou formatada.exitCode,timedOut,success,output: detalhes de conclusão (apenas finalizado).reason: motivo da negação (apenas negado).
Uso de tailnet
- Vincule a bridge a um IP de tailnet:
bridge.bind: "tailnet"em~/.openclaw/openclaw.json. - Os clientes se conectam via nome MagicDNS ou IP do tailnet.
- O Bonjour não cruza redes; use host/porta manual ou DNS‑SD de área ampla quando necessário.