Gateway / Protocol • 5分で読める
ブリッジプロトコル
旧ノードのトランスポート(TCP JSONL):ペアリング、スコープ RPC、イベント
Bridge プロトコルはレガシーなノード転送(TCP JSONL)です。新しいノードクライアントは統一された Gateway WebSocket プロトコルを使用してください。
operator やノードクライアントを作る場合は、Gateway プロトコルを利用してください。
Gateway プロトコル を参照してください。
注意: 現在の OpenClaw は TCP ブリッジリスナーを提供しません。本ページは歴史的参照として残されています。
旧 bridge.* の設定キーは、もはや設定スキーマの一部ではありません。
Tutorial.step
なぜ両方あったのか
- セキュリティ境界:ブリッジは Gateway API 全体ではなく、小さな allowlist のみを公開していました。
- ペアリング + ノードID:ノードの受け入れは Gateway 側で管理され、ノードごとのトークンに紐付きました。
- 発見 UX:ノードは LAN では Bonjour で Gateway を発見でき、また tailnet 経由で直接接続もできました。
- Loopback WS:完全な WS 制御プレーンは、SSH トンネルしない限りローカルに留まりました。
Tutorial.step
トランスポート
- TCP(1行につき1つの JSON オブジェクト:JSONL)。
- TLS は任意(
bridge.tls.enabledが true の場合)。 - 旧デフォルトの待受ポートは
18790(現在は TCP ブリッジを起動しません)。
TLS 有効時、発見用 TXT には bridgeTls=1 と bridgeTlsSha256 が含まれ、ノード側で証明書を pin できました。
Tutorial.step
ハンドシェイク + ペアリング
- クライアントは
helloを送り、ノードメタデータ + トークン(ペア済みの場合)を含めます。 - 未ペアの場合、Gateway は
error(NOT_PAIRED/UNAUTHORIZED)を返します。 - クライアントは
pair-requestを送ります。 - Gateway は承認を待ち、
pair-okとhello-okを送ります。
hello-ok は serverName を返し、canvasHostUrl を含むこともありました。
Tutorial.step
フレーム
クライアント → Gateway:
req/res: scoped gateway RPC (chat, sessions, config, health, voicewake, skills.bins)event:ノードシグナル(音声録音、エージェント要求、チャット購読、exec ライフサイクル)。
Gateway → クライアント:
invoke/invoke-res:ノードコマンド(canvas.*、camera.*、screen.record、location.get、sms.send)。event:購読セッションのチャット更新。ping/pong:keepalive。
旧 allowlist の強制は src/gateway/server-bridge.ts(削除済み)にありました。
Tutorial.step
Exec ライフサイクルイベント
ノードは exec.started のイベント面に exec.started または exec.started を送出できました。
Payload fields (all optional unless noted):
payload フィールド(注記がない限り任意):
sessionKey(必須):システムイベントを受け取るエージェントセッション。runId:グルーピング用の一意な exec ID。command:生の/整形済みコマンド文字列。exitCode、timedOut、success、output:完了時の詳細(finished のみ)。reason:拒否理由(denied のみ)。
Tutorial.step
Tailnet usage
- ブリッジを tailnet IP にバインド:
bridge.bind: "tailnet"で~/.openclaw/openclaw.json。 - クライアントは MagicDNS 名または tailnet IP で接続します。
- Bonjour はネットワークを越えません。必要なら手動 host/port または wide-area DNS‑SD を使ってください。
Tutorial.step
バージョニング
Bridge は実質暗黙の v1(min/max 交渉なし)でした。後方互換が前提で、破壊的変更の前にプロトコルバージョンフィールドを追加します。