它存在的原因
- 安全边界:暴露一个小型允许列表,而不是完整的 Gateway 网关 API 表面。
- 配对 + 节点身份:节点准入由 Gateway 网关负责,并绑定到每个节点的令牌。
- 设备发现 UX:节点可以通过局域网中的 Bonjour 发现 Gateway 网关,或通过尾网直接连接。
- 回环 WS:完整的 WS 控制平面保持在本地,除非通过 SSH 建立隧道。
传输
- TCP,每行一个 JSON 对象(JSONL)。
- 可选 TLS(
bridge.tls.enabled: true)。 - 默认监听端口是
18790。
bridgeTls=1,并包含 bridgeTlsSha256 作为非机密提示。Bonjour/mDNS TXT 记录未经身份验证;如果没有其他带外验证,客户端不能将通告的指纹视为权威固定值。
握手和配对
- 客户端发送带有节点元数据和令牌(如果已配对)的
hello。 - 如果未配对,Gateway 网关回复
error(NOT_PAIRED/UNAUTHORIZED)。 - 客户端发送
pair-request。 - Gateway 网关等待批准,然后发送
pair-ok和hello-ok。
hello-ok 过去会返回 serverName;托管插件界面现在通过当前 Gateway 网关协议上的 pluginSurfaceUrls 通告(Canvas/A2UI 使用 pluginSurfaceUrls.canvas)。
帧
客户端到 Gateway 网关:req/res:限定范围的 Gateway 网关 RPC(聊天、会话、配置、健康、voicewake、skills.bins)。event:节点信号(语音转录、智能体请求、聊天订阅、exec 生命周期)。
invoke/invoke-res:节点命令(canvas.*、camera.*、screen.record、location.get、sms.send)。event:已订阅会话的聊天更新。ping/pong:keepalive。
src/gateway/server-bridge.ts(已移除)。
Exec 生命周期事件
节点会发出exec.finished 来呈现已完成的 system.run 活动,并由 Gateway 网关映射为系统事件(旧版节点也可以发出 exec.started)。exec.denied 将被拒绝的 system.run 尝试标记为终端拒绝,不会将系统事件加入队列,也不会唤醒智能体工作。
载荷字段(除非注明,否则均为可选):
| 字段 | 说明 |
|---|---|
sessionKey | 必填。用于事件关联的智能体会话;对于 exec.finished,也用于系统事件投递。 |
runId | 用于分组的唯一 exec ID。 |
command | 原始或格式化后的命令字符串。 |
exitCode, timedOut, output | 完成详情(仅 finished)。 |
reason | 拒绝原因(仅 denied)。 |
历史尾网用法
- 将桥接器绑定到尾网 IP:在
~/.openclaw/openclaw.json中设置bridge.bind: "tailnet"(仅作历史参考;bridge.*不再是有效配置)。 - 客户端通过 MagicDNS 名称或尾网 IP 连接。
- Bonjour 不会跨网络工作;否则需要广域 DNS-SD 或手动主机/端口。