Gateway-owned Pairing (Option B)
在 Gateway-owned 配對中,Gateway 是關於允許哪些 Nodes 加入的 Source of Truth。UI (macOS app, 未來的 Clients) 僅是核准或拒絕待處理請求 (Pending Requests) 的前端。 重要: WS Nodes 在connect 期間使用 Device Pairing (Role node)。node.pair.* 是分開的 Pairing Store 且 不 作為 WS Handshake 的閘道。僅顯式呼叫 node.pair.* 的 Clients 使用此流程。
概念
- Pending request (待處理請求): Node 請求加入;需要核准。
- Paired node (已配對 Node): 已核准的 Node,附帶發行的 Auth Token。
- Transport (傳輸): Gateway WS Endpoint 轉發請求但不決定成員資格。(舊版 TCP Bridge 支援已停用/移除。)
配對如何運作
- Node 連線至 Gateway WS 並請求配對。
- Gateway 儲存 Pending Request 並發出
node.pair.requested。 - 您核准或拒絕該請求 (CLI 或 UI)。
- 核准後,Gateway 發行 新 Token (Tokens 在重新配對時會輪替)。
- Node 使用 Token 重新連線,現在狀態為 “Paired”。
CLI Workflow (Headless Friendly)
nodes status 顯示 Paired/Connected Nodes 及其 Capabilities。
API Surface (Gateway Protocol)
Events:node.pair.requested— 當新的 Pending Request 建立時發出。node.pair.resolved— 當 Request 被 Approve/Reject/Expire 時發出。
node.pair.request— 建立或重複使用 Pending Request。node.pair.list— 列出 Pending + Paired Nodes。node.pair.approve— 核准 Pending Request (發行 Token)。node.pair.reject— 拒絕 Pending Request。node.pair.verify— 驗證{ nodeId, token }。
node.pair.request對每個 Node 是冪等的 (Idempotent):重複呼叫回傳相同的 Pending Request。- 核准 總是 產生全新的 Token;
node.pair.request從不回傳 Token。 - Requests 可包含
silent: true作為自動核准流程的提示。
自動核准 (macOS App)
macOS App 可選用性地嘗試 Silent Approval,當:- 請求被標記為
silent,且 - App 能使用相同的使用者驗證對 Gateway Host 的 SSH 連線。
儲存 (本地, 私有)
Pairing State 儲存於 Gateway State Directory 下 (預設~/.openclaw):
~/.openclaw/nodes/paired.json~/.openclaw/nodes/pending.json
OPENCLAW_STATE_DIR,nodes/ 資料夾會隨之移動。
安全性註記:
- Tokens 是機密;將
paired.json視為敏感資料。 - 輪替 Token 需要重新核准 (或刪除該 Node 項目)。
傳輸行為 (Transport Behavior)
- Transport 是 無狀態的 (Stateless);它不儲存成員資格。
- 若 Gateway 離線或配對被停用,Nodes 無法配對。
- 若 Gateway 處於 Remote Mode,配對仍在 Remote Gateway 的 Store 進行。