docs/gateway/bridge-protocol.md
bridge.tls.enabled: true).18790.When TLS was enabled, discovery TXT records included bridgeTls=1 plus bridgeTlsSha256 as a non-secret hint. Bonjour/mDNS TXT records are unauthenticated; clients could not treat the advertised fingerprint as an authoritative pin without other out-of-band verification.
hello with node metadata plus token (if already paired).error (NOT_PAIRED / UNAUTHORIZED).pair-request.pair-ok and hello-ok.hello-ok used to return serverName; hosted plugin surfaces are now advertised through pluginSurfaceUrls on the current Gateway protocol (Canvas/A2UI uses pluginSurfaceUrls.canvas).
Client to gateway:
req / res: scoped gateway RPC (chat, sessions, config, health, voicewake, skills.bins).event: node signals (voice transcript, agent request, chat subscribe, exec lifecycle).Gateway to client:
invoke / invoke-res: node commands (canvas.*, camera.*, screen.record, location.get, sms.send).event: chat updates for subscribed sessions.ping / pong: keepalive.Allowlist enforcement lived in src/gateway/server-bridge.ts (removed).
Nodes emitted exec.finished to surface completed system.run activity, mapped to system events by the gateway (legacy nodes could also emit exec.started). exec.denied marked a denied system.run attempt as a terminal denial without enqueuing a system event or waking agent work.
Payload fields (all optional unless noted):
| Field | Notes |
|---|---|
sessionKey | Required. Agent session for event correlation and, for exec.finished, system event delivery. |
runId | Unique exec id for grouping. |
command | Raw or formatted command string. |
exitCode, timedOut, output | Completion details (finished only). |
reason | Denial reason (denied only). |
bridge.bind: "tailnet" in ~/.openclaw/openclaw.json (historical only; bridge.* is no longer valid config).The bridge was implicit v1, with no min/max negotiation. Current node/operator clients use the WebSocket Gateway protocol, which does negotiate a protocol version range.