Gateway
Protocole de pont
Pourquoi il existait
- Limite de sécurité : le pont expose une petite liste d’autorisations au lieu de toute la surface d’API du Gateway.
- Appairage + identité du nœud : l’admission des nœuds appartient au Gateway et est liée à un jeton par nœud.
- UX de découverte : les nœuds peuvent découvrir les Gateway via Bonjour sur le LAN, ou se connecter directement via un tailnet.
- WS en loopback : le plan de contrôle WS complet reste local sauf s’il est tunnelisé via SSH.
Transport
- TCP, un objet JSON par ligne (JSONL).
- TLS facultatif (lorsque
bridge.tls.enabledvaut true). - Le port d’écoute par défaut historique était
18790(les versions actuelles ne démarrent pas de pont TCP).
Lorsque TLS est activé, les enregistrements TXT de découverte incluent bridgeTls=1 plus
bridgeTlsSha256 comme indice non secret. Notez que les enregistrements TXT Bonjour/mDNS ne sont
pas authentifiés ; les clients ne doivent pas considérer l’empreinte annoncée comme un
épinglage faisant autorité sans intention explicite de l’utilisateur ou autre vérification hors bande.
Handshake + appairage
- Le client envoie
helloavec les métadonnées du nœud + le jeton (s’il est déjà appairé). - S’il n’est pas appairé, le Gateway répond
error(NOT_PAIRED/UNAUTHORIZED). - Le client envoie
pair-request. - Le Gateway attend l’approbation, puis envoie
pair-okethello-ok.
Historiquement, hello-ok renvoyait serverName ; les surfaces de Plugin hébergées sont désormais
annoncées via pluginSurfaceUrls. Canvas/A2UI utilise
pluginSurfaceUrls.canvas ; l’alias obsolète canvasHostUrl ne fait pas partie du
protocole refactorisé.
Trames
Client → Gateway :
req/res: RPC Gateway limitées au périmètre (chat, sessions, config, santé, voicewake, skills.bins)event: signaux du nœud (transcription vocale, requête d’agent, abonnement au chat, cycle de vie exec)
Gateway → Client :
invoke/invoke-res: commandes du nœud (canvas.*,camera.*,screen.record,location.get,sms.send)event: mises à jour de chat pour les sessions abonnéesping/pong: keepalive
L’application historique de la liste d’autorisations se trouvait dans src/gateway/server-bridge.ts (supprimé).
Événements de cycle de vie exec
Les nœuds peuvent émettre des événements exec.finished ou exec.denied pour exposer l’activité system.run.
Ils sont mappés à des événements système dans le Gateway. (Les anciens nœuds peuvent encore émettre exec.started.)
Champs de payload (tous facultatifs sauf indication contraire) :
sessionKey(obligatoire) : session d’agent qui doit recevoir l’événement système.runId: identifiant exec unique pour le regroupement.command: chaîne de commande brute ou formatée.exitCode,timedOut,success,output: détails d’achèvement (uniquement pour finished).reason: raison du refus (uniquement pour denied).
Utilisation historique du tailnet
- Liez le pont à une IP de tailnet :
bridge.bind: "tailnet"dans~/.openclaw/openclaw.json(historique uniquement ;bridge.*n’est plus valide). - Les clients se connectent via le nom MagicDNS ou l’IP de tailnet.
- Bonjour ne traverse pas les réseaux ; utilisez un hôte/port manuel ou DNS-SD étendu si nécessaire.
Gestion des versions
Le pont était une v1 implicite (pas de négociation min/max). Cette section est une référence historique uniquement ; les clients actuels de nœud/opérateur utilisent le WebSocket Gateway Protocol.