Protocolo de bridge (transporte legado de nó)
Por que ele existia
- 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.
- Emparelhamento + 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 se conectar diretamente por uma tailnet.
- WS loopback: todo o plano de controle WS permanece local, a menos que seja tunelado via SSH.
Transporte
- TCP, um objeto JSON por linha (JSONL).
- TLS opcional (quando
bridge.tls.enabledé true). - Historicamente, a porta padrão do listener era
18790(as compilações atuais não iniciam uma bridge TCP).
bridgeTls=1 mais
bridgeTlsSha256 como uma dica não secreta. Observe que registros TXT do Bonjour/mDNS não são
autenticados; 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 + emparelhamento
- O cliente envia
hellocom metadados do nó + token (se já estiver emparelhado). - Se não estiver emparelhado, o gateway responde
error(NOT_PAIRED/UNAUTHORIZED). - O cliente envia
pair-request. - O gateway aguarda aprovação e então envia
pair-okehello-ok.
hello-ok retornava serverName e podia incluir
canvasHostUrl.
Frames
Cliente → Gateway:req/res: RPC do gateway com escopo (chat, sessions, config, health, voicewake, skills.bins)event: sinais do nó (transcrição de voz, solicitação de agente, assinatura de chat, ciclo de vida de execução)
invoke/invoke-res: comandos do nó (canvas.*,camera.*,screen.record,location.get,sms.send)event: atualizações de chat para sessões assinadasping/pong: keepalive
src/gateway/server-bridge.ts (removido).
Eventos do ciclo de vida de execução
Nós podem emitir eventosexec.finished ou exec.denied para expor 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 em contrário):
sessionKey(obrigatório): sessão do agente que receberá o evento de sistema.runId: id exclusivo de execução para agrupamento.command: string de comando bruta ou formatada.exitCode,timedOut,success,output: detalhes de conclusão (apenas finished).reason: motivo da negação (apenas denied).
Uso histórico de tailnet
- Vincule a bridge a um IP de tailnet:
bridge.bind: "tailnet"em~/.openclaw/openclaw.json(somente histórico;bridge.*não é mais válido). - Clientes se conectam via nome MagicDNS ou IP de tailnet.
- Bonjour não atravessa redes; use host/porta manual ou DNS‑SD de área ampla quando necessário.