跳轉到主要內容

概觀

  • 單一長時間執行的閘道擁有所有訊息介面(WhatsApp 經由 Baileys、Telegram 經由 grammY、Slack、Discord、Signal、iMessage、WebChat)。
  • 控制平面用戶端(macOS app、命令列介面、網頁 UI、自動化)會透過設定的綁定主機(預設 127.0.0.1:18789)上的 WebSocket 連線到閘道。
  • 節點(macOS/iOS/Android/headless)也會透過 WebSocket 連線,但會以明確的 caps/commands 宣告 role: node
  • 每台主機一個閘道;它是唯一會開啟 WhatsApp 工作階段的地方。
  • canvas host 由閘道 HTTP 伺服器在以下路徑提供:
    • /__openclaw__/canvas/(代理程式可編輯的 HTML/CSS/JS)
    • /__openclaw__/a2ui/(A2UI host)
    它使用與閘道相同的連接埠(預設 18789)。

元件與流程

閘道(daemon)

  • 維護 provider 連線。
  • 公開具型別的 WS API(請求、回應、伺服器推送事件)。
  • 依據 JSON Schema 驗證傳入 frame。
  • 發出如 agentchatpresencehealthheartbeatcron 等事件。

用戶端(Mac app / 命令列介面 / web admin)

  • 每個用戶端一條 WS 連線。
  • 傳送請求(healthstatussendagentsystem-presence)。
  • 訂閱事件(tickagentpresenceshutdown)。

節點(macOS / iOS / Android / headless)

  • role: node 連線到同一個 WS 伺服器
  • connect 中提供裝置身分;配對是以裝置為基礎(角色 node),且 核准資料位於裝置配對儲存區。
  • 公開如 canvas.*camera.*screen.recordlocation.get 等命令。
協定詳細資訊:閘道協定

WebChat

  • 靜態 UI,使用閘道 WS API 取得聊天歷史並傳送訊息。
  • 在遠端設定中,會透過與其他用戶端相同的 SSH/Tailscale 通道連線。

連線生命週期(單一用戶端)

線路協定(摘要)

  • 傳輸:WebSocket,帶有 JSON payload 的文字 frame。
  • 第一個 frame 必須connect
  • 握手之後:
    • 請求:{type:"req", id, method, params}{type:"res", id, ok, payload|error}
    • 事件:{type:"event", event, payload, seq?, stateVersion?}
  • hello-ok.features.methods / events 是探索中繼資料,不是 每個可呼叫 helper route 的產生式傾印。
  • Shared-secret auth 會使用 connect.params.auth.tokenconnect.params.auth.password,取決於設定的 gateway auth mode。
  • 帶有身分的模式,例如 Tailscale Serve (gateway.auth.allowTailscale: true) 或非 loopback 的 gateway.auth.mode: "trusted-proxy",會從請求標頭滿足 auth, 而不是使用 connect.params.auth.*
  • Private-ingress gateway.auth.mode: "none" 會完全停用 shared-secret auth; 請勿在公開/不受信任的 ingress 上啟用該模式。
  • 具副作用的方法(sendagent)需要 idempotency key 才能 安全重試;伺服器會保留短時間存活的去重快取。
  • 節點必須在 connect 中包含 role: "node" 以及 caps/commands/permissions。

配對與本機信任

  • 所有 WS 用戶端(操作員 + 節點)都會在 connect 上包含裝置身分
  • 新裝置 ID 需要配對核准;閘道會發出裝置 token 供後續連線使用。
  • 直接的 local loopback 連線可自動核准,以維持同主機 UX 順暢。
  • OpenClaw 也有一條狹窄的後端/container-local 自我連線路徑,用於 受信任的 shared-secret helper 流程。
  • Tailnet 與 LAN 連線,包括同主機 tailnet 綁定,仍然需要 明確的配對核准。
  • 所有連線都必須簽署 connect.challenge nonce。簽章 payload v3 也會綁定 platformdeviceFamily;閘道會在重新連線時釘選已配對的中繼資料, 並在中繼資料變更時要求修復配對。
  • 非本機連線仍然需要明確核准。
  • 閘道 auth(gateway.auth.*)仍套用於所有連線,無論本機或 遠端。
詳細資訊:閘道協定配對安全性

協定型別與 codegen

  • TypeBox schemas 定義協定。
  • JSON Schema 由這些 schemas 產生。
  • Swift models 由 JSON Schema 產生。

遠端存取

  • 首選:Tailscale 或 VPN。
  • 替代方案:SSH 通道
    ssh -N -L 18789:127.0.0.1:18789 user@gateway-host
    
  • 相同的握手 + auth token 會套用於通道上。
  • 在遠端設定中,可為 WS 啟用 TLS + 選用 pinning。

維運快照

  • 啟動:openclaw gateway(前景執行,記錄到 stdout)。
  • 健康狀態:透過 WS 的 health(也包含在 hello-ok 中)。
  • 監督:launchd/systemd 用於自動重新啟動。

不變條件

  • 每台主機上,只有一個閘道控制單一 Baileys 工作階段。
  • 握手是強制的;任何非 JSON 或非 connect 的第一個 frame 都會被硬性關閉。
  • 事件不會重放;用戶端必須在出現缺口時重新整理。

相關