Gateway
Bridgeprotocol
Waarom deze bestond
- Beveiligingsgrens: stelde een kleine toelatingslijst beschikbaar in plaats van het volledige API-oppervlak van de Gateway.
- Koppeling + node-identiteit: toelating van nodes werd beheerd door de Gateway en was gekoppeld aan een token per node.
- Detectie-UX: nodes konden Gateways via Bonjour op het LAN detecteren of rechtstreeks via een tailnet verbinding maken.
- Loopback-WS: het volledige WS-besturingsvlak bleef lokaal, tenzij het via SSH werd getunneld.
Transport
- TCP, één JSON-object per regel (JSONL).
- Optionele TLS (
bridge.tls.enabled: true). - De standaardlistenerpoort was
18790.
Wanneer TLS was ingeschakeld, bevatten TXT-records voor detectie bridgeTls=1 plus bridgeTlsSha256 als niet-geheime aanwijzing. Bonjour-/mDNS-TXT-records zijn niet geauthenticeerd; clients konden de geadverteerde vingerafdruk zonder andere verificatie buiten het communicatiekanaal niet als gezaghebbende pin beschouwen.
Handshake en koppeling
- De client verzendt
hellomet nodemetadata plus een token (indien al gekoppeld). - Indien niet gekoppeld, antwoordt de Gateway met
error(NOT_PAIRED/UNAUTHORIZED). - De client verzendt
pair-request. - De Gateway wacht op goedkeuring en verzendt vervolgens
pair-okenhello-ok.
hello-ok retourneerde voorheen serverName; gehoste Plugin-oppervlakken worden nu via pluginSurfaceUrls in het huidige Gateway-protocol aangekondigd (Canvas/A2UI gebruikt pluginSurfaceUrls.canvas).
Frames
Van client naar Gateway:
req/res: afgebakende Gateway-RPC (chat, sessies, configuratie, status, voicewake, skills.bins).event: nodesignalen (spraaktranscript, agentverzoek, chatabonnement, uitvoeringslevenscyclus).
Van Gateway naar client:
invoke/invoke-res: nodeopdrachten (canvas.*,camera.*,screen.record,location.get,sms.send).event: chatupdates voor sessies waarop een abonnement bestond.ping/pong: keepalive.
De handhaving van de toelatingslijst bevond zich in src/gateway/server-bridge.ts (verwijderd).
Gebeurtenissen in de uitvoeringslevenscyclus
Nodes verzonden exec.finished om voltooide system.run-activiteit beschikbaar te stellen, die door de Gateway aan systeemgebeurtenissen werd gekoppeld (verouderde nodes konden ook exec.started verzenden). exec.denied markeerde een geweigerde system.run-poging als definitieve weigering zonder een systeemgebeurtenis in de wachtrij te plaatsen of agentwerk te activeren.
Payloadvelden (allemaal optioneel, tenzij anders vermeld):
| Veld | Opmerkingen |
|---|---|
sessionKey |
Vereist. Agentsessie voor gebeurteniscorrelatie en, voor exec.finished, aflevering van systeemgebeurtenissen. |
runId |
Unieke uitvoerings-id voor groepering. |
command |
Onbewerkte of opgemaakte opdrachttekenreeks. |
exitCode, timedOut, output |
Voltooiingsdetails (alleen indien voltooid). |
reason |
Reden voor weigering (alleen indien geweigerd). |
Historisch tailnet-gebruik
- Koppel de bridge aan een tailnet-IP:
bridge.bind: "tailnet"in~/.openclaw/openclaw.json(alleen historisch;bridge.*is niet langer een geldige configuratie). - Clients maakten verbinding via een MagicDNS-naam of tailnet-IP.
- Bonjour werkt niet over verschillende netwerken; anders was wide-area DNS-SD of een handmatig opgegeven host/poort vereist.
Versiebeheer
De bridge was impliciet v1, zonder onderhandeling over een minimum- en maximumversie. Huidige node-/operatorclients gebruiken het WebSocket-Gateway-protocol, dat wel over een bereik van protocolversies onderhandelt.