Gateway プロトコル(WebSocket)
Gateway WS プロトコルは、OpenClaw の 単一のコントロールプレーン + ノード転送 です。すべてのクライアント(CLI、Web UI、macOS アプリ、iOS/Android ノード、ヘッドレス ノード)は WebSocket 経由で接続し、ハンドシェイク時に role と scope を宣言します。 すべてのクライアント(CLI、web UI、macOSアプリ、iOS/Androidノード、ヘッドレス ノード)はWebSocket経由で接続し、 ハンドシェイク時間にrole + scope を宣言します。トランスポート
- WebSocket、JSON ペイロードを含むテキスト フレーム。
- 最初のフレームは 必ず
connectのリクエストでなければなりません。
ハンドシェイク(接続)
Gateway → クライアント(接続前チャレンジ):hello-ok には次も含まれます:
ノードの例
フレーミング
- Request:
{type:"req", id, method, params} - Response:
{type:"res", id, ok, payload|error} - Event:
{type:"event", event, payload, seq?, stateVersion?}
ロール + スコープ
ロール
operator= コントロールプレーン クライアント(CLI/UI/自動化)。node= 機能ホスト(camera/screen/canvas/system.run)。
スコープ(オペレーター)
一般的なスコープ:operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairing
Caps/コマンド/権限(ノード)
ノードは接続時に機能クレームを宣言します:caps:高レベルの機能カテゴリ。commands:invoke 用のコマンド許可リスト。permissions:粒度の細かいトグル(例:screen.record、camera.capture)。
Presence
system-presenceは、デバイス アイデンティティをキーとするエントリを返します。- プレゼンス エントリには
deviceId、roles、scopesが含まれるため、operator と node の両方として接続している場合でも、UI はデバイスごとに 1 行で表示できます。
ノード ヘルパー メソッド
- ノードは
skills.binsを呼び出して、オート許可チェック用の現在の skill 実行ファイル一覧を取得できます。
実行承認
- 実行リクエストに承認が必要な場合、Gateway は
exec.approval.requestedをブロードキャストします。 - オペレーター クライアントは
exec.approval.resolveを呼び出して解決します(operator.approvalsスコープが必要)。
Versioning
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が一致しなければソケットはクローズされます。- ペアリング後、ゲートウェイは接続
ロール + スコープにスコープ付きの デバイストークン を発行します。 これは
hello-ok.auth.deviceTokenに返され、今後の接続のためにクライアントによって継続される である必要があります。 これはhello-ok.auth.deviceTokenに返され、今後の接続のためにクライアントによって継続される である必要があります。 - デバイス トークンは
device.token.rotateおよびdevice.token.revokeからローテーション/失効できます(operator.pairingスコープが必要)。
デバイス アイデンティティ + ペアリング
- ノードは、鍵ペアのフィンガープリントから導出した安定したデバイス アイデンティティ(
device.id)を含める必要があります。 - Gateway はデバイス + ロールごとにトークンを発行します。
- 新しいデバイス ID には、ローカル自動承認が有効でない限り、ペアリング承認が必要です。
- ローカル 接続には、ループバックおよび Gateway ホスト自身の tailnet アドレスが含まれます(同一ホストの tailnet バインドでも自動承認できるようにするため)。
- すべてのWSクライアントは、
connect(演算子+ノード)中にdeviceidentityを含める必要があります。 すべての WS クライアントは、connect(operator + node)中にdeviceのアイデンティティを含める必要があります。 コントロール UI は、gateway.controlUi.allowInsecureAuthが有効な場合に のみ 省略できます (またはブレークグラス用途としてgateway.controlUi.dangerouslyDisableDeviceAuth)。 すべての WS クライアントは、connect(operator + node)中にdeviceのアイデンティティを含める必要があります。 コントロール UI は、gateway.controlUi.allowInsecureAuthが有効な場合に のみ 省略できます (またはブレークグラス用途としてgateway.controlUi.dangerouslyDisableDeviceAuth)。 - 非ローカル接続は、サーバーが提供する
connect.challengeの nonce に署名する必要があります。
TLS + ピンニング
- WS 接続では TLS がサポートされています。
- クライアントは、Gateway の証明書フィンガープリントを任意でピン留めできます(
gateway.tlsの設定、ならびにgateway.remote.tlsFingerprintまたは CLI の--tls-fingerprintを参照)。
スコープ
このプロトコルは 完全な Gateway API(ステータス、チャンネル、モデル、チャット、エージェント、セッション、ノード、承認など)を公開します。正確な API サーフェスは、src/gateway/protocol/schema.ts にある TypeBox スキーマによって定義されています。 正確なサーフェスは src/gateway/protocol/schema.ts の
TypeBox スキーマによって定義されます。