Gateway 協議(WebSocket)
Gateway WS 協議是 OpenClaw 的 單一控制平面 + 節點傳輸。所有客戶端(CLI、web UI、macOS 應用、iOS/Android 節點、無頭節點)透過 WebSocket 連接並在握手時聲明其 角色 + 範圍。傳輸
- WebSocket,具有 JSON 負載的文字框架。
- 第一個框架 必須 是
connect請求。
握手(connect)
Gateway → 客戶端(預連接挑戰):hello-ok 也包括:
節點範例
框架
- 請求:
{type:"req", id, method, params} - 回應:
{type:"res", id, ok, payload|error} - 事件:
{type:"event", event, payload, seq?, stateVersion?}
角色 + 範圍
角色
operator= 控制平面客戶端(CLI/UI/自動化)。node= 能力主機(攝影機/螢幕/畫布/system.run)。
範圍(operator)
常見範圍:operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairing
chat.send 到達的某些斜線指令在頂部套用更嚴格的指令級檢查。例如,持久 /config set 和 /config unset 寫入需要 operator.admin。
能力/指令/權限(node)
節點在連接時聲明能力聲明:caps:高級能力類別。commands:用於 invoke 的指令允許清單。permissions:細粒度切換(例如screen.record、camera.capture)。
存在
system-presence回傳由設備身分索引的項目。- 存在項目包括
deviceId、roles和scopes,讓 UI 可顯示每個設備一行,即使它同時連接為 operator 和 node。
節點協助方法
- 節點可呼叫
skills.bins以取得目前技能可執行檔清單進行自動允許檢查。
Operator 協助方法
- Operator 可呼叫
tools.catalog(operator.read)以取得代理的執行時工具目錄。回應包括已分組工具和出處中繼資料:source:core或pluginpluginId:當source="plugin"時的外掛所有者optional:外掛工具是否可選
執行批准
- 當執行請求需要批准時,Gateway 廣播
exec.approval.requested。 - Operator 客戶端透過呼叫
exec.approval.resolve解析(需要operator.approvals範圍)。 - 對於
host=node,exec.approval.request必須包括systemRunPlan(正規argv/cwd/rawCommand/會話中繼資料)。遺失systemRunPlan的請求被拒絕。
版本控制
PROTOCOL_VERSION駐留在src/gateway/protocol/schema.ts中。- 客戶端發送
minProtocol+maxProtocol;伺服器拒絕不匹配。 - 綱要 + 模型從 TypeBox 定義產生:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
驗證
- 如果設定
OPENCLAW_GATEWAY_TOKEN(或--token),connect.params.auth.token必須符合或 socket 關閉。 - 配對後,Gateway 發出針對連接角色 + 範圍的 設備權杖。它在
hello-ok.auth.deviceToken中回傳,應由客戶端持久化以供未來連接。 - 設備權杖可透過
device.token.rotate和device.token.revoke輪換/撤銷(需要operator.pairing範圍)。 - 驗證失敗包括
error.details.code加上復原提示:error.details.canRetryWithDeviceToken(布林值)error.details.recommendedNextStep(retry_with_device_token、update_auth_configuration、update_auth_credentials、wait_then_retry、review_auth_configuration)
- 客戶端行為針對
AUTH_TOKEN_MISMATCH:- 受信任客戶端可嘗試一次有界重試與快取逐設備權杖。
- 如果該重試失敗,客戶端應停止自動重新連接迴圈並表面 operator 動作指導。
設備身分 + 配對
- 節點應包括穩定設備身分(
device.id)衍生自金鑰對指紋。 - Gateway 發出各設備 + 角色的權杖。
- 新設備 ID 需要配對批准,除非啟用本地自動批准。
- 本地 連接包括環回和 Gateway 主機自身的 tailnet 地址(所以相同主機 tailnet 繫結仍可自動批准)。
- 所有 WS 客戶端必須在
connect期間包括device身分(operator + node)。 Control UI 只能在這些模式中省略它:gateway.controlUi.allowInsecureAuth=true用於 localhost 唯一不安全 HTTP 相容性。gateway.controlUi.dangerouslyDisableDeviceAuth=true(破裂玻璃,嚴重安全降級)。
- 所有連接必須簽署伺服器提供的
connect.challengenonce。
設備驗證遷移診斷
對於仍使用預挑戰簽署行為的遺留客戶端,connect 現在在 error.details.code 下回傳 DEVICE_AUTH_* 細節代碼與穩定的 error.details.reason。
常見遷移失敗:
| 訊息 | details.code | details.reason | 含義 |
|---|---|---|---|
device nonce required | DEVICE_AUTH_NONCE_REQUIRED | device-nonce-missing | 客戶端省略 device.nonce(或發送空白)。 |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | 客戶端以陳舊/錯誤 nonce 簽署。 |
device signature invalid | DEVICE_AUTH_SIGNATURE_INVALID | device-signature | 簽署負載不符 v2 負載。 |
device signature expired | DEVICE_AUTH_SIGNATURE_EXPIRED | device-signature-stale | 簽署時間戳在允許偏斜外。 |
device identity mismatch | DEVICE_AUTH_DEVICE_ID_MISMATCH | device-id-mismatch | device.id 不符公鑰指紋。 |
device public key invalid | DEVICE_AUTH_PUBLIC_KEY_INVALID | device-public-key | 公鑰格式/標準化失敗。 |
- 一律等待
connect.challenge。 - 簽署包括伺服器 nonce 的 v2 負載。
- 在
connect.params.device.nonce中發送相同 nonce。 - 偏好簽署負載是
v3,它除了設備/客戶端/角色/範圍/權杖/nonce 欄位外還繫結platform和deviceFamily。 - 遺留
v2簽署保持相容接受,但配對設備中繼資料釘選仍控制重新連接時的指令政策。
TLS + 釘選
- TLS 對 WS 連接支援。
- 客戶端可選用釘選 Gateway 憑證指紋(見
gateway.tls設定加上gateway.remote.tlsFingerprint或 CLI--tls-fingerprint)。
範圍
此協議暴露 完整 Gateway API(狀態、通道、模型、聊天、代理、會話、節點、批准等)。確切表面由src/gateway/protocol/schema.ts 中的 TypeBox 綱要定義。