bridge.* 構成キーは、現在の構成スキーマからは削除されています。
なぜ 2 つのプロトコルがあるのか
- セキュリティ境界: ブリッジは、ゲートウェイの全 API ではなく、許可リスト(allowlist)に基づいた最小限の機能のみを公開します。
- ペアリングとノード識別: ノードの参加許可はゲートウェイが管理し、ノードごとのトークンに紐付けられます。
- 検出体験 (UX): ノードは LAN 上の Bonjour 経由でゲートウェイを自動検出したり、Tailnet 経由で直接接続したりできます。
- ループバック WS: 完全な WebSocket コントロールプレーンは、SSH トンネル等を使用しない限りローカル環境内に留まります。
通信方式(トランスポート)
- TCP を使用し、1 行につき 1 つの JSON オブジェクトを送信します (JSONL)。
- オプションで TLS に対応しています(
bridge.tls.enabledが true の場合)。 - レガシーなデフォルトの待機ポートは
18790でした(現在のビルドでは TCP ブリッジは開始されません)。
bridgeTls=1 と bridgeTlsSha256 が含まれます。Bonjour/mDNS の TXT レコードは 未認証(署名なし) であることに注意してください。ユーザーによる明示的な同意や他の手段による検証がない限り、クライアントは公開されたフィンガープリントを信頼できるピンとして扱ってはいけません。
ハンドシェイクとペアリング
- クライアントが
helloを送信します。これにはノードのメタデータと、ペアリング済みであればトークンが含まれます。 - ペアリングされていない場合、ゲートウェイは
error(NOT_PAIRED/UNAUTHORIZED) を返します。 - クライアントが
pair-requestを送信します。 - ゲートウェイは承認を待ち、その後
pair-okとhello-okを送信します。
hello-ok レスポンスには serverName が含まれ、オプションで canvasHostUrl が含まれる場合があります。
フレーム(データ構造)
クライアント → ゲートウェイ:req/res: スコープ制限されたゲートウェイ RPC (chat, sessions, config, health, voicewake, skills.bins)event: ノードからの信号 (音声の書き起こし、エージェント要求、チャット購読、exec のライフサイクル)
invoke/invoke-res: ノードコマンド (canvas.*,camera.*,screen.record,location.get,sms.send)event: 購読済みセッションのチャット更新情報ping/pong: 生存確認(キープアライブ)
src/gateway/server-bridge.ts に実装されていました(現在は削除済み)。
Exec ライフサイクルイベント
ノードはexec.finished または exec.denied イベントを発行して、system.run の実行状況を知らせることができます。これらはゲートウェイ側でシステムイベントにマップされます(レガシーなノードは依然として exec.started を発行する場合があります)。
ペイロードのフィールド(注記がない限りすべてオプション):
sessionKey(必須): システムイベントを受け取るエージェントセッション。runId: グループ化のための一意の実行 ID。command: 生の、または整形されたコマンド文字列。exitCode,timedOut,success,output: 完了時の詳細情報(finished の場合のみ)。reason: 拒否理由(denied の場合のみ)。
Tailnet での利用
- ブリッジを Tailnet IP にバインドする場合:
~/.openclaw/openclaw.jsonでbridge.bind: "tailnet"を設定。 - クライアントは MagicDNS 名または Tailnet IP を介して接続。
- Bonjour はネットワークの境界を越えられません。必要に応じて、ホスト/ポートを手動指定するか、広域 DNS-SD を使用してください。