Gateway
Protocollo ponte
Perché esisteva
- Confine di sicurezza: il bridge espone una piccola lista consentita invece dell'intera superficie API del gateway.
- Pairing + identità del node: l'ammissione dei node è gestita dal gateway ed è legata a un token per node.
- UX di discovery: i node possono rilevare i gateway tramite Bonjour sulla LAN, oppure connettersi direttamente tramite una tailnet.
- WS di local loopback: il piano di controllo WS completo resta locale, salvo tunneling tramite SSH.
Trasporto
- TCP, un oggetto JSON per riga (JSONL).
- TLS opzionale (quando
bridge.tls.enabledè true). - La porta del listener predefinita storica era
18790(le build attuali non avviano un bridge TCP).
Quando TLS è abilitato, i record TXT di discovery includono bridgeTls=1 più bridgeTlsSha256 come suggerimento non segreto. Nota che i record TXT Bonjour/mDNS non sono autenticati; i client non devono trattare l'impronta digitale pubblicizzata come un pin autorevole senza un'intenzione esplicita dell'utente o un'altra verifica fuori banda.
Handshake + pairing
- Il client invia
hellocon metadati del node + token (se già associato). - Se non è associato, il gateway risponde con
error(NOT_PAIRED/UNAUTHORIZED). - Il client invia
pair-request. - Il gateway attende l'approvazione, poi invia
pair-okehello-ok.
Storicamente, hello-ok restituiva serverName e poteva includere canvasHostUrl.
Frame
Client → Gateway:
req/res: RPC gateway con ambito limitato (chat, sessioni, configurazione, salute, voicewake, skills.bins)event: segnali del node (trascrizione vocale, richiesta dell'agente, sottoscrizione chat, ciclo di vita exec)
Gateway → Client:
invoke/invoke-res: comandi del node (canvas.*,camera.*,screen.record,location.get,sms.send)event: aggiornamenti chat per le sessioni sottoscritteping/pong: keepalive
L'applicazione della lista consentita legacy risiedeva in src/gateway/server-bridge.ts (rimosso).
Eventi del ciclo di vita exec
I node possono emettere eventi exec.finished o exec.denied per esporre l'attività system.run.
Questi vengono mappati a eventi di sistema nel gateway. (I node legacy possono ancora emettere exec.started.)
Campi del payload (tutti opzionali salvo diversa indicazione):
sessionKey(obbligatorio): sessione dell'agente che deve ricevere l'evento di sistema.runId: id exec univoco per il raggruppamento.command: stringa di comando grezza o formattata.exitCode,timedOut,success,output: dettagli di completamento (solo finished).reason: motivo del rifiuto (solo denied).
Uso storico della tailnet
- Associa il bridge a un IP tailnet:
bridge.bind: "tailnet"in~/.openclaw/openclaw.json(solo storico;bridge.*non è più valido). - I client si connettono tramite nome MagicDNS o IP tailnet.
- Bonjour non attraversa le reti; usa host/porta manuali o DNS-SD wide-area quando necessario.
Versioning
Il bridge era v1 implicito (nessuna negoziazione min/max). Questa sezione è solo un riferimento storico; i client node/operatore attuali usano il protocollo Gateway WebSocket.