トランスポートとフレーミング
- WebSocket、テキストフレーム、JSON ペイロード。
- 最初のフレームは 必ず
connectリクエストである必要があります。 - 接続前フレームは 64 KiB(
MAX_PREAUTH_PAYLOAD_BYTES)に制限されます。ハンドシェイク後はhello-ok.policy.maxPayloadとhello-ok.policy.maxBufferedBytesに従います。診断が有効な場合、過大な受信フレームと低速な送信バッファは、Gateway がフレームを閉じるかドロップする前にpayload.largeイベントを発行します。これらのイベントにはsurface、バイトサイズ、制限、安全な理由コードが含まれますが、メッセージ本文、添付ファイルの内容、生フレームバイト、トークン、Cookie、シークレットは含まれません。
- リクエスト:
{type:"req", id, method, params} - レスポンス:
{type:"res", id, ok, payload|error} - イベント:
{type:"event", event, payload, seq?, stateVersion?}
ハンドシェイク
Gateway は接続前チャレンジを送信します:connect で応答します:
hello-ok で応答します:
server、features、snapshot、policy、auth はすべて HelloOkSchema(packages/gateway-protocol/src/schema/frames.ts)で必須です。auth は、デバイストークンが発行されない場合でも、ネゴシエートされた role/scopes を報告します(上記の形状)。pluginSurfaceUrls は任意で、Plugin サーフェス名(例: canvas)をスコープ付きホスト URL にマッピングします。有効期限が切れる場合があるため、ノードは新しいエントリを取得するために { "surface": "canvas" } で node.pluginSurface.refresh を呼び出します。非推奨の canvasHostUrl / canvasCapability / node.canvas.capability.refresh パスはサポートされていません。Plugin サーフェスを使用してください。
Gateway がまだ起動サイドカーの完了中である場合、connect は details.reason: "startup-sidecars" と retryAfterMs を伴う再試行可能な UNAVAILABLE エラーを返すことがあります。これを終端的なハンドシェイク失敗として扱うのではなく、接続予算内で再試行してください。
デバイストークンが発行されると、hello-ok.auth に追加されます:
operator.talk.secrets を含め、モバイルオペレーターループとネイティブセットアップを開始するには十分ですが、ペアリング変更スコープや operator.admin は含まれません。より広いペアリング/管理アクセスには、別途承認済みのペアリングまたはトークンフローが必要です。hello-ok.auth.deviceTokens は、ブートストラップ認証が信頼済みトランスポート(wss:// または loopback/local pairing)上で実行された場合にのみ永続化してください。
信頼済みの同一プロセスバックエンドクライアント(client.id: "gateway-client"、client.mode: "backend")は、共有 Gateway トークン/パスワードで認証する直接 loopback 接続では device を省略できます。このパスは内部コントロールプレーン RPC(例: サブエージェントセッション更新)用に予約されており、古い CLI/デバイスペアリングベースラインがローカルバックエンド作業をブロックすることを避けます。リモート、ブラウザー由来、ノード、明示的なデバイストークン/デバイス ID クライアントは、通常のペアリングとスコープアップグレードチェックを引き続き通過します。
ノード接続の例
caps:camera、canvas、screen、location、voice、talkなどの高レベルカテゴリ。commands: invoke 用のコマンド許可リスト。permissions: きめ細かなトグル(例:screen.record、camera.capture)。
ロールとスコープ
完全なオペレータースコープモデル、承認時チェック、共有シークレットのセマンティクスについては、オペレータースコープ を参照してください。 ロール:operator: コントロールプレーンクライアント(CLI/UI/自動化)。node: capability ホスト(camera/screen/canvas/system.run)。
src/gateway/operator-scopes.ts)、完全な閉集合:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
includeSecrets: true を伴う talk.config には operator.talk.secrets(または operator.admin)が必要です。シークレットが含まれる場合は、アクティブな Talk プロバイダー認証情報を talk.resolved.config.apiKey から読み取ります。talk.providers.<id>.apiKey はソース形状のままであり、SecretRef オブジェクトまたは墨消し済み文字列である場合があります。
Plugin 登録済みの Gateway RPC メソッドは独自のオペレータースコープを要求できますが、これらの予約済みコアプレフィックスは常に operator.admin(src/shared/gateway-method-policy.ts)に解決されます: config.*、exec.approvals.*、wizard.*、update.*。
メソッドスコープは最初のゲートにすぎません。chat.send 経由で到達する一部のスラッシュコマンドは、より厳格なコマンドレベルチェックを適用します。永続的な /config set と /config unset の書き込みには、すでに低いオペレータースコープを保持している Gateway クライアントであっても operator.admin が必要です。
node.pair.approve には、ベースメソッドスコープ(operator.pairing)に加えて、保留中リクエストで宣言された commands(src/infra/node-pairing-authz.ts)に基づく追加の承認時スコープチェックがあります:
| 宣言されたコマンド | 必要なスコープ |
|---|---|
| なし | operator.pairing |
| 非 exec コマンド | operator.pairing + operator.write |
system.run、system.run.prepare、または system.which を含む | operator.pairing + operator.admin |
Presence
system-presenceは、deviceId、roles、scopesを含む、デバイス ID をキーにしたエントリを返します。そのため UI は、デバイスが operator と node の両方として接続している場合でも、デバイスごとに 1 行を表示できます。node.listには任意のlastSeenAtMsとlastSeenReasonが含まれます。接続中のノードは理由connectで現在の接続時刻を報告します。ペアリング済みノードは、信頼済みノードイベント経由で永続的なバックグラウンド presence も報告できます。
ノードバックグラウンド alive イベント
ノードはevent: "node.presence.alive" を伴う node.event を呼び出し、ペアリング済みノードがバックグラウンド wake 中に生存していたことを、接続中としてマークせずに記録します:
trigger は閉じた enum です: background、silent_push、bg_app_refresh、significant_location、manual、connect。不明な値は background(src/shared/node-presence.ts)に正規化されます。このイベントは、認証済みノードデバイスセッションに対してのみ永続化されます。デバイスなしまたは未ペアリングのセッションは handled: false を返します。
成功した Gateway は構造化された結果を返します:
node.event に対して { "ok": true } のみを返す場合があります。それは永続的な presence 永続化ではなく、RPC が確認応答されたものとして扱ってください。
ブロードキャストイベントのスコープ設定
サーバーからプッシュされるブロードキャストイベントはスコープでゲートされるため、ペアリングスコープのみ、またはノードのみのセッションがセッション内容を受動的に受信することはありません(src/gateway/server-broadcast.ts):
- チャット、エージェント、ツール結果フレーム(ストリーミングされた
agentイベント、ツール結果イベント)には少なくともoperator.readが必要です。それを持たないセッションは、これらのフレームを完全にスキップします。 - Plugin 定義の
plugin.*ブロードキャストは、デフォルトでoperator.writeまたはoperator.adminにゲートされます。plugin.approval.requested/plugin.approval.resolvedなどの明示的なエントリは、代わりにoperator.approvalsを使用します。 - ステータス/トランスポートイベント(
heartbeat、presence、tick、接続/切断ライフサイクル)は制限なしのままなので、すべての認証済みセッションがトランスポートの健全性を観測できます。 - 不明なブロードキャストイベントファミリーは、登録済みハンドラーが明示的に緩和しない限り、デフォルトでスコープゲートされます(fail-closed)。
RPC メソッドファミリー
hello-ok.features.methods は、src/gateway/server-methods-list.ts に読み込まれた Plugin/チャネルメソッドエクスポートを加えて構築される保守的な discovery リストです。すべてのメソッドを生成してダンプしたものではなく、一部のメソッド(例: push.test、web.login.start、web.login.wait、sessions.usage)は、実在して呼び出し可能なメソッドであっても意図的に discovery から除外されています。これは src/gateway/server-methods/*.ts の完全な列挙ではなく、機能 discovery として扱ってください。
モデルと使用量
モデルと使用量
models.listは、ランタイムで許可されたモデルカタログを返します。下記の「models.listビュー」を参照してください。usage.statusは、プロバイダーの使用量ウィンドウ/残りクォータのサマリーを返します。usage.costは、日付範囲の集計済みコスト使用量サマリーを返します。1 つのエージェントにはagentIdを渡し、設定済みエージェントを集計するにはagentScope: "all"を渡します。doctor.memory.statusは、アクティブなデフォルトエージェントワークスペースのベクトルメモリ/キャッシュ済み埋め込みの準備状態を返します。明示的にライブ埋め込みプロバイダーへ ping する場合にのみ、{ "probe": true }または{ "deep": true }を渡します。Dreaming ストア統計を 1 つのエージェントワークスペースに限定するには{ "agentId": "agent-id" }を渡します。省略すると、設定済みの Dreaming ワークスペースが集計されます。doctor.memory.dreamDiary、doctor.memory.backfillDreamDiary、doctor.memory.resetDreamDiary、doctor.memory.resetGroundedShortTerm、doctor.memory.repairDreamingArtifacts、doctor.memory.dedupeDreamDiaryは、任意で{ "agentId": "agent-id" }を受け取ります。省略すると、設定済みのデフォルトエージェントワークスペースを操作します。doctor.memory.remHarnessは、リモートコントロールプレーンのクライアント向けに、境界付きの読み取り専用 REM ハーネスプレビューを返します。これには、ワークスペースパス、メモリスニペット、レンダリング済みの根拠付き Markdown、深い昇格候補が含まれます。operator.readが必要です。sessions.usageは、セッションごとの使用量サマリーを返します。1 つのエージェントにはagentIdを渡し、設定済みエージェントをまとめて一覧表示するにはagentScope: "all"を渡します。sessions.usage.timeseriesは、1 つのセッションの時系列使用量を返します。sessions.usage.logsは、1 つのセッションの使用量ログエントリを返します。
チャンネルとログインヘルパー
チャンネルとログインヘルパー
channels.statusは、組み込み + バンドル済みチャンネル/Plugin のステータスサマリーを返します。channels.logoutは、チャンネルが対応している場合に、特定のチャンネル/アカウントからログアウトします。web.login.startは、現在の QR 対応 Web チャンネルプロバイダーの QR/Web ログインフローを開始します。web.login.waitは、そのフローの完了を待ち、成功時にチャンネルを開始します。push.testは、登録済み iOS Node にテスト用 APNs プッシュを送信します。voicewake.getは、保存済みのウェイクワードトリガーを返します。voicewake.setは、ウェイクワードトリガーを更新し、変更をブロードキャストします。
メッセージングとログ
メッセージングとログ
sendは、チャットランナー外でチャネル/アカウント/スレッドを対象に送信するための、直接のアウトバウンド配信 RPC です。logs.tailは、カーソル/制限と最大バイト制御付きで、構成済みの Gateway ファイルログ末尾を返します。
オペレーター端末
オペレーター端末
terminal.openは、明示的なagentIdまたはデフォルトエージェントのホスト PTY を開始し、解決されたエージェント、作業ディレクトリ、シェル、閉じ込め状態を返します。terminal.input、terminal.resize、terminal.closeは、呼び出し元接続が所有するセッションに対してのみ動作します。terminal.dataおよびterminal.exitイベントは、セッションを所有する接続にのみストリーミングされます。- 接続が切断されたセッションは終了されず、デタッチされます。最近の出力は境界付きのサーバー側バッファに蓄積され、その間
gateway.terminal.detachedSessionTimeoutSeconds(デフォルト 300。0は切断時に終了する動作を復元)だけ再アタッチ可能なままになります。 terminal.listはアタッチ可能なセッションを返します。terminal.attachはライブまたはデタッチ済みセッションを呼び出し元接続に再バインドし、再生バッファを返します(tmux 方式のテイクオーバー — 以前のライブ所有者は理由detachedのterminal.exitを受け取ります)。terminal.textはアタッチせずにバッファをプレーンテキストとして読み取ります。- すべての端末メソッドには
operator.adminが必要です。gateway.terminal.enabledは明示的に true でなければなりません。完全にサンドボックス化されたエージェントは拒否され、エージェントポリシー変更により、既存および処理中の PTY はデタッチ済みのものを含めて閉じられます。
Talk と TTS
Talk と TTS
talk.catalogは、音声合成、ストリーミング文字起こし、リアルタイム音声向けの読み取り専用 Talk プロバイダーカタログを返します。正規プロバイダー ID、レジストリエイリアス、ラベル、構成状態、省略可能なグループレベルのready結果、公開モデル/音声 ID、正規モード、トランスポート、ブレイン戦略、リアルタイム音声/機能フラグを含み、プロバイダーシークレットを返したりグローバル構成を変更したりしません。現在の Gateway は実行時プロバイダー選択の適用後にreadyを設定します。古い Gateway で存在しない場合は未検証として扱ってください。talk.configは有効な Talk 構成ペイロードを返します。includeSecretsにはoperator.talk.secrets(またはoperator.admin)が必要です。talk.session.createは、realtime/gateway-relay、transcription/gateway-relay、またはstt-tts/managed-room用に Gateway 所有の Talk セッションを作成します。stt-tts/managed-roomでは、sessionKeyを渡すoperator.write呼び出し元は、スコープ付きセッションキー可視性のためにspawnedByも渡す必要があります。スコープなしのsessionKey作成とbrain: "direct-tools"にはoperator.adminが必要です。talk.session.joinは managed-room セッショントークンを検証し、必要に応じてsession.readyまたはsession.replacedを発行し、ルーム/セッションメタデータと最近の Talk イベントを返します。平文トークンやそのハッシュは返しません。talk.session.appendAudioは、base64 PCM 入力音声を Gateway 所有のリアルタイムリレーおよび文字起こしセッションに追加します。talk.session.startTurn、talk.session.endTurn、talk.session.cancelTurnは、状態がクリアされる前に古いターンを拒否しながら、managed-room のターンライフサイクルを駆動します。talk.session.cancelOutputはアシスタント音声出力を停止します。主に Gateway リレーセッションで VAD によって制御される割り込みに使用します。talk.session.submitToolResultは、Gateway 所有のリアルタイムリレーセッションが発行したプロバイダーツール呼び出しを完了します。最終結果が後続する中間ツール出力にはoptions: { willContinue: true }を渡し、別のリアルタイム応答を開始せずにツール結果でプロバイダー呼び出しを満たす場合はoptions: { suppressResponse: true }を渡します。talk.session.steerは、Gateway 所有のエージェント支援 Talk セッションにアクティブ実行の音声制御を送信します:{ sessionId, text, mode? }。ここでmodeはstatus、steer、cancel、またはfollowupです。省略したモードは発話テキストから分類されます。talk.session.closeは、Gateway 所有のリレー、文字起こし、または managed-room セッションを閉じ、終端 Talk イベントを発行します。talk.modeは、WebChat/Control UI クライアント向けに現在の Talk モード状態を設定/ブロードキャストします。talk.client.createは、Gateway が構成、認証情報、指示、ツールポリシーを所有したまま、webrtcまたはprovider-websocketを使ってクライアント所有のリアルタイムプロバイダーセッションを作成します。talk.client.toolCallは、クライアント所有のリアルタイムトランスポートがプロバイダーツール呼び出しを Gateway ポリシーに転送できるようにします。最初にサポートされるツールはopenclaw_agent_consultです。クライアントは実行 ID を受け取り、通常のチャットライフサイクルイベントを待ってから、プロバイダー固有のツール結果を送信します。talk.client.steerは、クライアント所有のリアルタイムトランスポート向けにアクティブ実行の音声制御を送信します。Gateway はsessionKeyからアクティブな埋め込み実行を解決し、ステアリングを黙って破棄する代わりに、構造化された受理/拒否結果を返します。talk.eventは、リアルタイム、文字起こし、STT/TTS、managed-room、テレフォニー、会議アダプター向けの単一の Talk イベントチャネルです。talk.speakは、アクティブな Talk 音声合成プロバイダーを通じて音声を合成します。tts.statusは、TTS の有効状態、アクティブプロバイダー、フォールバックプロバイダー、プロバイダー構成状態を返します。tts.providersは、可視の TTS プロバイダーインベントリを返します。tts.enableとtts.disableは TTS 設定状態を切り替えます。tts.setProviderは優先 TTS プロバイダーを更新します。tts.convertは単発のテキスト読み上げ変換を実行します。tts.speak(operator.write)は、構成済みの汎用 TTS プロバイダーチェーンで空でないtextをレンダリングし、audioBase64として 1 つの完全なクリップをインラインで返します。あわせてproviderと、省略可能なoutputFormat、mimeType、fileExtensionメタデータも返します。tts.convertとは異なり、Gateway ローカルパスを返しません。talk.speakとは異なり、Talk プロバイダーを必要としません。messages.tts.maxTextLengthを超えるテキストはINVALID_REQUESTを返し、合成失敗はUNAVAILABLEを返します。
エージェントとワークスペースのヘルパー
エージェントとワークスペースのヘルパー
agents.listは、実効モデルとランタイムメタデータを含む、設定済みのエージェントエントリを返します。agents.create、agents.update、agents.deleteは、エージェントレコードとワークスペースの接続を管理します。agents.files.list、agents.files.get、agents.files.setは、エージェントに公開されるブートストラップワークスペースファイルを管理します。audit.listは、エージェント実行とツールアクションイベントの、境界付きでメタデータのみの台帳を返します。agents.workspace.listとagents.workspace.get(operator.read)は、オペレータースコープで説明されている信頼済みオペレータードメイン内のクライアントに対し、エージェントのワークスペースディレクトリを読み取り専用かつページ分割で参照できるようにします。リクエストはワークスペース相対パスのみを受け付けます。読み取りは realpath 化されたワークスペースルート内に制限され(シンボリックリンクとハードリンクによる脱出は拒否)、サイズ上限があり、UTF-8 テキストと一般的な画像タイプ(base64)に限定されます。レスポンスはホスト上のワークスペースパスを公開しません。この名前空間には書き込み操作はありません。tasks.list、tasks.get、tasks.cancelは、Gateway タスク台帳を SDK とオペレータークライアントに公開します。下記のタスク台帳 RPCを参照してください。artifacts.list、artifacts.get、artifacts.downloadは、明示的なsessionKey、runId、またはtaskIdスコープに対して、トランスクリプト由来のアーティファクト要約とダウンロードを公開します。実行クエリとタスククエリは、所有するセッションをサーバー側で解決し、一致する来歴を持つトランスクリプトメディアのみを返します。安全でない、またはローカル URL のソースは、サーバー側で取得せず、未対応のダウンロードを返します。environments.listとenvironments.statusは、SDK クライアント向けに、読み取り専用の Gateway ローカル環境とノード環境の検出を公開します。agent.identity.getは、エージェントまたはセッションの実効アシスタント ID を返します。agent.waitは、実行の完了を待機し、利用可能な場合は終端スナップショットを返します。
セッション制御
セッション制御
sessions.listは現在のセッションインデックスを返します。エージェントランタイムバックエンドが設定されている場合は、行ごとのagentRuntimeメタデータも含まれます。sessions.subscribeとsessions.unsubscribeは、現在の WS クライアントに対するセッション変更イベント購読を切り替えます。sessions.messages.subscribeとsessions.messages.unsubscribeは、1 つのセッションに対するトランスクリプト/メッセージイベント購読を切り替えます。sessions.previewは、特定のセッションキーに対する境界付きのトランスクリプトプレビューを返します。sessions.describeは、正確なセッションキーに対する 1 つの Gateway セッション行を返します。sessions.resolveは、セッションターゲットを解決または正規化します。sessions.createは、新しいセッションエントリを作成します。sessions.sendは、既存のセッションにメッセージを送信します。sessions.steerは、アクティブなセッションに対する割り込みおよび誘導バリアントです。sessions.abortは、セッションのアクティブな作業を中止します。keyと任意のrunIdを渡すか、Gateway がセッションへ解決できるアクティブな実行についてはrunIdのみを渡します。sessions.patchは、セッションメタデータ/オーバーライドを更新し、解決された正規モデルと実効agentRuntimeを報告します。sessions.reset、sessions.delete、sessions.compactは、セッションメンテナンスを実行します。sessions.getは、保存済みの完全なセッション行を返します。- チャット実行では、引き続き
chat.history、chat.send、chat.abort、chat.injectを使用します。chat.historyは UI クライアント向けに表示正規化されます。インラインディレクティブタグは表示テキストから削除され、プレーンテキストのツール呼び出し XML ペイロード(<tool_call>...</tool_call>、<function_call>...</function_call>、<tool_calls>...</tool_calls>、<function_calls>...</function_calls>、および切り詰められたツール呼び出しブロック)と漏れた ASCII/全角のモデル制御トークンは削除され、純粋なサイレントトークンのアシスタント行(完全一致のNO_REPLY/no_reply)は省略され、過大な行はプレースホルダーで置き換えられる場合があります。 chat.message.getは、1 つの可視トランスクリプトエントリに対する追加的な境界付き全文メッセージリーダーです。sessionKey、セッション選択がエージェントスコープの場合は任意のagentId、および以前にchat.historyを通じて公開されたトランスクリプトmessageIdを渡します。保存済みエントリがまだ利用可能で過大でない場合、Gateway は軽量履歴の切り詰め上限なしで、同じ表示正規化済み投影を返します。chat.sendは、1 ターンのfastMode: "auto"を受け付け、自動カットオフ前に開始されたモデル呼び出しには高速モードを使用し、その後に開始される再試行、フォールバック、ツール結果、または継続呼び出しは高速モードなしで開始します。カットオフの既定値は 60 秒(DEFAULT_FAST_MODE_AUTO_ON_SECONDS)で、agents.defaults.models["<provider>/<model>"].params.fastAutoOnSecondsによりモデルごとに設定できます。chat.sendの呼び出し元は、そのリクエストのカットオフを上書きするために、1 ターンのfastAutoOnSecondsを渡すことができます。
デバイスペアリングとデバイストークン
デバイスペアリングとデバイストークン
device.pair.listは、保留中および承認済みのペアリング済みデバイスを返します。device.pair.setupCodeは、モバイルセットアップコードと、既定では PNG QR データ URL を作成します。operator.adminが必要で、広告される検出からは意図的に除外されています。結果にはsetupCode、任意のqrDataUrl、gatewayUrl、シークレットではないauthラベル、urlSourceが含まれます。device.pair.approve、device.pair.reject、device.pair.removeは、デバイスペアリングレコードを管理します。device.token.rotateは、承認済みロールと呼び出し元スコープの境界内で、ペアリング済みデバイストークンをローテーションします。device.token.revokeは、承認済みロールと呼び出し元スコープの境界内で、ペアリング済みデバイストークンを取り消します。
ノードペアリング、呼び出し、保留中の作業
ノードペアリング、呼び出し、保留中の作業
node.pair.request、node.pair.list、node.pair.approve、node.pair.reject、node.pair.remove、node.pair.verifyは、ノードペアリングとブートストラップ検証を扱います。node.listとnode.describeは、既知/接続済みノードの状態を返します。node.renameは、ペアリング済みノードのラベルを更新します。node.invokeは、接続済みノードへコマンドを転送します。node.invoke.resultは、呼び出しリクエストの結果を返します。node.eventは、ノード発のイベントを Gateway に戻します。node.pending.pullとnode.pending.ackは、接続済みノードキュー API です。node.pending.enqueueとnode.pending.drainは、オフライン/切断済みノード向けの永続的な保留作業を管理します。
承認ファミリー
承認ファミリー
exec.approval.request、exec.approval.get、exec.approval.list、exec.approval.resolveは、ワンショットの exec 承認リクエストと、保留中の承認の検索/再生を扱います。exec.approval.waitDecisionは、保留中の 1 つの exec 承認を待機し、最終判断(またはタイムアウト時はnull)を返します。exec.approvals.getとexec.approvals.setは、Gateway の exec 承認ポリシースナップショットを管理します。exec.approvals.node.getとexec.approvals.node.setは、ノードリレーコマンドを介してノードローカルの exec 承認ポリシーを管理します。plugin.approval.request、plugin.approval.list、plugin.approval.waitDecision、plugin.approval.resolveは、Plugin 定義の承認フローを扱います。
自動化、Skills、ツール
自動化、Skills、ツール
- 自動化:
wakeは即時または次の Heartbeat でのウェイクテキスト注入をスケジュールします。cron.get、cron.list、cron.status、cron.add、cron.update、cron.remove、cron.run、cron.runsはスケジュール済み作業を管理します。 cron.runは、手動実行用のエンキュー型 RPC のままです。完了セマンティクスが必要なクライアントは、返されたrunIdを読み取り、cron.runsをポーリングする必要があります。cron.runsは、任意の空でないrunIdフィルターを受け付けるため、クライアントは同じジョブの他の履歴エントリと競合せずに、キューに入った 1 つの手動実行を追跡できます。- Skills とツール:
commands.list、skills.*、tools.catalog、tools.effective、tools.invoke。下記のオペレーターヘルパーメソッドを参照してください。
共通イベントファミリー
chat:chat.injectなどの UI チャット更新、およびトランスクリプト専用のその他のチャット イベント。プロトコル v4 では、差分ペイロードはdeltaTextを運び、messageは 累積されたアシスタントのスナップショットのままです。非プレフィックス置換はreplace=trueを設定し、deltaTextを置換テキストとして使用します。session.message、session.operation、session.tool: 購読中セッションのトランスクリプト、進行中の セッション操作、およびイベントストリーム更新。sessions.changed: セッションインデックスまたはメタデータが変更されました。presence: システムプレゼンスのスナップショット更新。tick: 定期的なキープアライブ/生存確認イベント。health: Gateway ヘルススナップショット更新。heartbeat: Heartbeat イベントストリーム更新。cron: Cron 実行/ジョブ変更イベント。shutdown: Gateway シャットダウン通知。node.pair.requested/node.pair.resolved: Node ペアリングライフサイクル。node.invoke.request: Node 呼び出しリクエストのブロードキャスト。device.pair.requested/device.pair.resolved: ペアリング済みデバイスのライフサイクル。voicewake.changed: ウェイクワードトリガー設定が変更されました。exec.approval.requested/exec.approval.resolved: exec 承認 ライフサイクル。plugin.approval.requested/plugin.approval.resolved: plugin 承認 ライフサイクル。
Node ヘルパーメソッド
Node は、自動許可チェック用に現在のスキル実行ファイル一覧を取得するためにskills.bins を呼び出せます。
監査台帳 RPC
audit.list は、オペレータークライアントに、エージェント実行と
ツールアクションメタデータの安定した新しい順ビューを提供します。これには
operator.read が必要です。クエリは 30 日より古いレコードを除外し、共有 SQLite 台帳は 100,000 レコードに制限されます。
期限切れの行は、Gateway 起動時、1 時間ごとのメンテナンス時、および以後の
書き込み時に削除されます。
- パラメータ: 任意の完全一致
agentId、sessionKey、またはrunId; 任意のkind("agent_run"または"tool_action"); 任意のstatus("started"、"succeeded"、"failed"、"cancelled"、"timed_out"、"blocked"、または"unknown"); 任意の包含的なafter/beforeUnix ミリ秒境界;1から500までの任意のlimit; および前ページからの任意の文字列cursor。 - 結果:
{ "events": AuditEvent[], "nextCursor"?: string }。
redaction フィールドは常に "metadata_only" です。台帳は
プロンプト、メッセージ、ツール引数、ツール結果、コマンド出力、または
生のエラーテキストを保存しません。
記録はデフォルトで有効で、
audit.enabled によって制御されます。無効にした場合も、
audit.list は以前に書き込まれたレコードが期限切れになるまで提供し続けます。
テキストクエリと上限付き JSON エクスポートには openclaw audit を使用します。
タスク台帳 RPC
オペレータークライアントは、タスク台帳 RPC (packages/gateway-protocol/src/schema/tasks.ts) を通じて Gateway バックグラウンドタスクレコードを確認およびキャンセルします。これらは
生のランタイム状態ではなく、サニタイズ済みタスク要約を返します。
tasks.listにはoperator.readが必要です。- パラメータ: 任意の
status("queued"、"running"、"completed"、"failed"、"cancelled"、または"timed_out") またはそれらのステータスの配列、 任意のagentId、任意のsessionKey、1から500までの任意のlimit、および任意の文字列cursor。 - 結果:
{ "tasks": TaskSummary[], "nextCursor"?: string }。
- パラメータ: 任意の
tasks.getにはoperator.readが必要です。- パラメータ:
{ "taskId": string }。 - 結果:
{ "task": TaskSummary }。 - 存在しないタスク ID は、Gateway の not-found エラー形状を返します。
- パラメータ:
tasks.cancelにはoperator.writeが必要です。- パラメータ:
{ "taskId": string, "reason"?: string }。 - 結果:
{ "found": boolean, "cancelled": boolean, "reason"?: string, "task"?: TaskSummary }。 foundは、台帳に一致するタスクがあったかどうかを報告します。cancelledは、 ランタイムがキャンセルを受け入れたか、または記録したかを報告します。
- パラメータ:
TaskSummary には id、status、および任意のメタデータが含まれます: kind、
runtime、title、agentId、sessionKey、childSessionKey、ownerKey、
runId、taskId、flowId、parentTaskId、sourceId、タイムスタンプ、進捗、
終端要約、およびサニタイズ済みエラーテキスト。agentId はタスクを実行しているエージェントを
識別します。sessionKey と ownerKey は、リクエスターと制御
コンテキストを保持します。
オペレーターヘルパーメソッド
commands.list(operator.read) は、エージェントのランタイムコマンドインベントリを 取得します。agentIdは任意です。省略するとデフォルトのエージェントワークスペースを読み取ります。scopeは、プライマリnameが対象とするサーフェスを制御します。textは 先頭の/なしのプライマリテキストコマンドトークンを返します。nativeと デフォルトのbothパスは、利用可能な場合、プロバイダー対応のネイティブ名を返します。textAliasesは/modelや/mなどの完全一致スラッシュエイリアスを運びます。nativeNameは、存在する場合にプロバイダー対応のネイティブコマンド名を運びます。providerは任意で、ネイティブ命名とネイティブ plugin コマンドの可用性にのみ影響します。includeArgs=falseは、シリアライズ済み引数メタデータをレスポンスから省略します。
tools.catalog(operator.read) は、エージェントのランタイムツールカタログを 取得します。レスポンスには、グループ化されたツールと由来メタデータが含まれます:source:coreまたはpluginpluginId:source="plugin"の場合の plugin 所有者optional: plugin ツールが任意かどうか
tools.effective(operator.read) は、セッションのランタイム有効ツール インベントリを取得します。sessionKeyは必須です。- Gateway は、呼び出し元が提供する認証や配信コンテキストを受け入れるのではなく、 サーバー側のセッションから信頼済みランタイムコンテキストを導出します。
- レスポンスは、アクティブなインベントリのセッションスコープのサーバー導出プロジェクションであり、 core、plugin、channel、およびすでに検出済みの MCP サーバーツールを含みます。
tools.effectiveは MCP に対して読み取り専用です。ウォームセッション MCP カタログを最終ツールポリシー経由で投影することはありますが、MCP ランタイムの作成、 トランスポート接続、またはtools/listの発行は行いません。一致するウォームカタログが 存在しない場合、レスポンスにはmcp-not-yet-connected、mcp-not-yet-listed、またはmcp-stale-catalogなどの通知が含まれる場合があります。- 有効なツールエントリは
source="core"、source="plugin"、source="channel"、またはsource="mcp"を使用します。
tools.invoke(operator.write) は、/tools/invokeと同じ Gateway ポリシーパスを通じて、利用可能なツールを 1 つ呼び出します。nameは必須です。args、sessionKey、agentId、confirm、およびidempotencyKeyは任意です。sessionKeyとagentIdの両方が存在する場合、解決されたセッションエージェントはagentIdと一致する必要があります。cron、gateway、nodesなどの owner 専用 core ラッパーには、tools.invoke自体はoperator.writeであっても、owner/admin ID (operator.admin) が必要です。- レスポンスは SDK 向けエンベロープで、
ok、toolName、任意のoutput、および型付きerrorフィールドを含みます。承認またはポリシー拒否は、 Gateway ツールポリシーパイプラインを迂回せず、ペイロード内のok:falseとして返されます。
skills.status(operator.read) は、エージェントに表示されるスキルインベントリを 取得します。agentIdは任意です。省略するとデフォルトのエージェントワークスペースを読み取ります。- レスポンスには、適格性、不足している要件、設定チェック、 および生のシークレット値を公開しないサニタイズ済みインストールオプションが含まれます。
skills.searchとskills.detail(operator.read) は ClawHub 検出メタデータを返します。skills.upload.begin、skills.upload.chunk、およびskills.upload.commit(operator.admin) は、インストール前にプライベートスキルアーカイブをステージングします。これは 信頼済みクライアント向けの別個の admin アップロードパスであり、通常の ClawHub スキルインストールフローではありません。また、skills.install.allowUploadedArchivesが有効でない限りデフォルトで無効です。skills.upload.begin({ kind: "skill-archive", slug, sizeBytes, sha256?, force?, idempotencyKey? })は、その slug と force 値に紐づいたアップロードを作成します。skills.upload.chunk({ uploadId, offset, dataBase64 })は、正確なデコード済みオフセットに バイトを追加します。skills.upload.commit({ uploadId, sha256? })は、最終サイズと SHA-256 を検証します。commit はアップロードを完了するだけで、スキルはインストールしません。- アップロードされたスキルアーカイブは、ルート
SKILL.mdを含む zip アーカイブです。アーカイブの 内部ディレクトリ名がインストール先を選択することはありません。
skills.install(operator.admin) には 3 つのモードがあります:- ClawHub モード:
{ source: "clawhub", slug, version?, force? }は、 スキルフォルダーをデフォルトのエージェントワークスペースのskills/ディレクトリにインストールします。 - アップロードモード:
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }は、コミット済みアップロードをデフォルトのエージェントワークスペースのskills/<slug>ディレクトリにインストールします。slug と force 値は、 元のskills.upload.beginリクエストと一致する必要があります。skills.install.allowUploadedArchivesが有効でない限り拒否されます。この設定は ClawHub インストールには影響しません。 - Gateway インストーラーモード:
{ name, installId, timeoutMs? }は、 Gateway ホスト上で宣言済みのmetadata.openclaw.installアクションを実行します。古いクライアントは まだdangerouslyForceUnsafeInstallを送信する場合があります。このフィールドは非推奨で、 プロトコル互換性のためにのみ受け入れられ、無視されます。オペレーター所有のインストール判断にはsecurity.installPolicyを使用してください。
- ClawHub モード:
skills.update(operator.admin) には 2 つのモードがあります:- ClawHub モードは、デフォルトのエージェントワークスペース内の追跡対象 slug 1 つ、または追跡対象のすべての ClawHub インストールを更新します。
- 設定モードは、
enabled、apiKey、envなどのskills.entries.<skillKey>値にパッチを適用します。
models.list ビュー
models.list は任意の view パラメータを受け入れます
(src/agents/model-catalog-visibility.ts):
- 省略または
"default":agents.defaults.modelsが設定されている場合、 レスポンスは許可済みカタログになり、provider/*エントリについて 動的に検出されたモデルを含みます。それ以外の場合、レスポンスは Gateway カタログ全体です。 "configured": ピッカーサイズの挙動です。agents.defaults.modelsが 設定されている場合、provider/*エントリのプロバイダースコープ検出を含め、 それが引き続き優先されます。許可リストがない場合、レスポンスは明示的なmodels.providers.<provider>.modelsエントリを使用し、設定済みモデル行が存在しない場合にのみ カタログ全体にフォールバックします。"all":agents.defaults.modelsを迂回する Gateway カタログ全体。通常のモデルピッカーではなく、 診断/検出 UI に使用します。
Exec 承認
- exec リクエストに承認が必要な場合、Gateway は
exec.approval.requestedをブロードキャストします。 - オペレータークライアントは、
exec.approval.resolveを呼び出して解決します (operator.approvalsが必要)。 host=nodeの場合、exec.approval.requestにはsystemRunPlan(正規のargv/cwd/rawCommand/セッションメタデータ) を含める必要があります。systemRunPlanがないリクエストは拒否されます。- 承認後、転送された
node.invoke system.run呼び出しは、その 正規のsystemRunPlanを、信頼できる command/cwd/session コンテキストとして再利用します。 - 呼び出し元が prepare と最終承認済み
system.run転送の間にcommand、rawCommand、cwd、agentId、またはsessionKeyを変更した場合、Gateway は変更されたペイロードを信頼せず、実行を拒否します。
エージェント配信フォールバック
agentリクエストには、外部配信を要求するためにdeliver=trueを含められます。bestEffortDeliver=false(デフォルト) は厳格な挙動を維持します。解決不能または 内部専用の配信先はINVALID_REQUESTを返します。bestEffortDeliver=trueは、外部に配信可能なルートを解決できない場合 (たとえば internal/webchat セッションやあいまいなマルチチャンネル設定) に、 セッション専用実行へのフォールバックを許可します。- 最終的な
agent結果には、配信が要求された場合にresult.deliveryStatusが含まれる場合があり、openclaw agent --json --deliverで文書化されているものと同じsent、suppressed、partial_failed、およびfailedステータスを使用します。
バージョニング
PROTOCOL_VERSION、MIN_CLIENT_PROTOCOL_VERSION、MIN_NODE_PROTOCOL_VERSION、MIN_PROBE_PROTOCOL_VERSIONはpackages/gateway-protocol/src/version.tsにあります。- クライアントは
minProtocol+maxProtocolを送信します。オペレーターおよび UI クライアントは その範囲に現在のプロトコルを含める必要があります。現在のクライアントとサーバーは プロトコル v4 で動作します。 role: "node"とclient.mode: "node"の両方を持つ認証済みクライアントは、 N-1 ノードプロトコル(現在は v3)を使用できます。軽量な再起動プローブは 同じ N-1 ウィンドウを使用します。デバイス認証、ペアリング、スコープ、コマンドポリシー、exec 承認は、この互換性ウィンドウによって変更されません。Plugin 所有のノード 機能とコマンドは、そのホスト面が N-1 コントラクトの一部ではないため、ノードが現在の プロトコルへアップグレードされるまで保留されます。- スキーマとモデルは TypeBox 定義から生成されます:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
クライアント定数
リファレンスクライアント実装はpackages/gateway-client/src/ にあります
(OpenClaw は薄い src/gateway/client.ts ファサード経由でこれをラップします)。これらの
デフォルトはプロトコル v4 全体で安定しており、サードパーティクライアントに期待される
ベースラインです。
| 定数 | デフォルト | ソース |
|---|---|---|
PROTOCOL_VERSION | 4 | packages/gateway-protocol/src/version.ts |
MIN_CLIENT_PROTOCOL_VERSION | 4 | packages/gateway-protocol/src/version.ts |
MIN_NODE_PROTOCOL_VERSION | 3 | packages/gateway-protocol/src/version.ts |
MIN_PROBE_PROTOCOL_VERSION | 3 | packages/gateway-protocol/src/version.ts |
| リクエストタイムアウト(RPC あたり) | 30_000 ms | packages/gateway-client/src/client.ts (requestTimeoutMs) |
| 事前認証 / connect-challenge タイムアウト | 15_000 ms | packages/gateway-client/src/timeouts.ts (OPENCLAW_HANDSHAKE_TIMEOUT_MS env はペアのサーバー/クライアント予算を引き上げ可能) |
| 初期再接続バックオフ | 1_000 ms | packages/gateway-client/src/client.ts (backoffMs) |
| 最大再接続バックオフ | 30_000 ms | packages/gateway-client/src/client.ts (scheduleReconnect) |
| デバイストークン close 後の高速リトライ上限 | 250 ms | packages/gateway-client/src/client.ts |
terminate() 前の強制停止猶予 | 250 ms | FORCE_STOP_TERMINATE_GRACE_MS |
stopAndWait() デフォルトタイムアウト | 1_000 ms | STOP_AND_WAIT_TIMEOUT_MS |
デフォルト tick 間隔(hello-ok 前) | 30_000 ms | packages/gateway-client/src/client.ts |
| tick タイムアウト close | 無音が tickIntervalMs * 2 を超えた場合は code 4000 | packages/gateway-client/src/client.ts |
MAX_PAYLOAD_BYTES | 25 * 1024 * 1024 (25 MB) | src/gateway/server-constants.ts |
policy.tickIntervalMs、
policy.maxPayload、policy.maxBufferedBytes を hello-ok で通知します。クライアントは
ハンドシェイク前のデフォルトではなく、これらの値に従う必要があります。
認証
- 共有シークレットの Gateway 認証は、設定された
gateway.auth.mode("none" | "token" | "password" | "trusted-proxy") に応じて、connect.params.auth.tokenまたはconnect.params.auth.passwordを使用します。 - Tailscale Serve (
gateway.auth.allowTailscale: true) や 非ループバックのgateway.auth.mode: "trusted-proxy"などの ID 付きモードは、connect.params.auth.*ではなくリクエストヘッダーから connect 認証チェックを満たします。 - プライベートイングレスの
gateway.auth.mode: "none"は、共有シークレットの connect 認証を 完全にスキップします。そのモードを公開/信頼されていないイングレスで公開しないでください。 - ペアリング後、Gateway は接続ロール + スコープに限定されたデバイストークンを発行し、
hello-ok.auth.deviceTokenで返します。クライアントは connect が成功したら必ずこれを永続化する必要があります。 - 保存済みのそのデバイストークンで再接続する場合は、そのトークンに対して保存済みの 承認済みスコープセットも再利用する必要があります。これにより、すでに付与された 読み取り/プローブ/ステータスアクセスが維持され、再接続が暗黙の管理者専用スコープへ 黙って狭められることを避けられます。
- クライアント側の connect 認証組み立て(
packages/gateway-client/src/client.tsのselectConnectAuth):auth.passwordは直交しており、設定されている場合は常に転送されます。auth.tokenは優先順位に従って設定されます。まず明示的な共有トークン、 次に明示的なdeviceToken、最後に保存済みのデバイス別トークン(deviceId+roleでキー付け)です。auth.bootstrapTokenは、上記のどれもauth.tokenを解決しなかった場合にのみ送信されます。共有トークンまたは解決済みのデバイストークンがあれば これを抑制します。- 1 回限りの
AUTH_TOKEN_MISMATCHリトライで保存済みデバイストークンを自動昇格する処理は、 信頼済みエンドポイントのみに制限されます。つまりループバック、 または固定されたtlsFingerprintを持つwss://です。固定なしの公開wss://は 条件を満たしません。
- 組み込みのセットアップコードブートストラップは、主要ノードの
hello-ok.auth.deviceTokenに加えて、信頼済みモバイル引き渡し用の限定オペレータートークンをhello-ok.auth.deviceTokensで返します。オペレータートークンには ネイティブ Talk 設定読み取り用のoperator.talk.secretsが含まれますが、 ペアリング変更スコープとoperator.adminは除外されます。 - 非ベースラインのセットアップコードブートストラップが承認待ちの間、
PAIRING_REQUIRED詳細にはrecommendedNextStep: "wait_then_retry"、retryable: true、pauseReconnect: falseが含まれます。リクエストが承認されるか トークンが無効になるまで、同じブートストラップトークンで再接続を続けてください。 hello-ok.auth.deviceTokensは、connect がwss://やループバック/local ペアリングなどの 信頼済みトランスポート上でブートストラップ認証を使用した場合にのみ永続化してください。- クライアントが明示的な
deviceTokenまたは明示的なscopesを提供した場合、 その呼び出し元が要求したスコープセットが引き続き権威になります。キャッシュされたスコープは、 クライアントが保存済みのデバイス別トークンを再利用している場合にのみ再利用されます。 - デバイストークンは
device.token.rotateとdevice.token.revokeでローテーション/失効できます(operator.pairingが必要)。ノードまたはその他の 非オペレーターロールのローテーションまたは失効には、operator.adminも必要です。 device.token.rotateはローテーションメタデータを返します。同じデバイストークンで すでに認証済みの同一デバイス呼び出しにのみ、置換用 bearer トークンをエコーします。これにより、 トークンのみのクライアントは再接続前に置換トークンを永続化できます。共有/管理者ローテーションは bearer トークンをエコーしません。- トークンの発行、ローテーション、失効は、そのデバイスのペアリングエントリに記録された 承認済みロールセットに限定されます。トークン変更は、ペアリング承認が付与していない デバイスロールを拡張したり対象にしたりできません。
- ペアリング済みデバイストークンセッションでは、呼び出し元が
operator.adminも持たない限り、 デバイス管理は自身のスコープに限定されます。非管理者の呼び出し元が管理できるのは、 自分自身のデバイスエントリのオペレータートークンのみです。ノードおよびその他の非オペレータートークン管理は、 呼び出し元自身のデバイスであっても管理者専用です。 device.token.rotateとdevice.token.revokeは、対象の オペレータートークンスコープセットも、呼び出し元の現在のセッションスコープに照らしてチェックします。 非管理者の呼び出し元は、自分がすでに保持している範囲より広いオペレータートークンを ローテーションまたは失効できません。- 認証失敗には
error.details.codeと復旧ヒントが含まれます:error.details.canRetryWithDeviceToken(boolean)error.details.recommendedNextStep:retry_with_device_token、update_auth_configuration、update_auth_credentials、wait_then_retry、review_auth_configurationのいずれか (packages/gateway-protocol/src/connect-error-details.ts)。
AUTH_TOKEN_MISMATCHに対するクライアント動作:- 信頼済みクライアントは、キャッシュされたデバイス別 トークンで 1 回の限定リトライを試行できます。
- そのリトライが失敗した場合、自動再接続ループを停止し、オペレーター向けの 対処ガイダンスを表示します。
AUTH_SCOPE_MISMATCHは、デバイストークンは認識されたが、要求されたロール/スコープを カバーしていないことを意味します。これを不正なトークンとして提示しないでください。オペレーターに 再ペアリングするか、より狭い/広いスコープコントラクトを承認するよう促してください。
デバイス ID とペアリング
- ノードは、キーペアフィンガープリントから派生した安定したデバイス ID(
device.id)を 含める必要があります。 - Gateway はデバイス + ロールごとにトークンを発行します。
- local 自動承認が有効でない限り、新しいデバイス ID にはペアリング承認が必要です。
- ペアリング自動承認は、直接の local loopback connect を中心にしています。
- OpenClaw には、信頼済み共有シークレットヘルパーフロー向けの狭いバックエンド/コンテナローカル 自己接続パスもあります。
- 同一ホストの tailnet または LAN connect も、ペアリングでは引き続きリモートとして扱われ、 承認が必要です。
- WS クライアントは通常、
connect時にdeviceID を含めます(オペレーター + ノード)。デバイスなしのオペレーター例外は、明示的な信頼パスのみです:- localhost 専用の安全でない
HTTP 互換性のための
gateway.controlUi.allowInsecureAuth=true。 - 成功した
gateway.auth.mode: "trusted-proxy"オペレーター Control UI 認証。 gateway.controlUi.dangerouslyDisableDeviceAuth=true(緊急回避、重大な セキュリティ低下)。- 予約済み内部ヘルパーパス上の direct-loopback
gateway-clientバックエンド RPC。
- localhost 専用の安全でない
HTTP 互換性のための
- デバイス ID を省略するとスコープに影響します。デバイスなしの
オペレーター接続が明示的な信頼パスを通じて許可された場合でも、OpenClaw は
そのパスに名前付きのスコープ保持例外がない限り、自己宣言スコープを空セットにクリアします。
その後、スコープで保護されたメソッドは
missing scopeで失敗します。 gateway.controlUi.dangerouslyDisableDeviceAuth=trueは、Control UI の 緊急回避スコープ保持パスです。任意のカスタムバックエンドまたは CLI 形状の WebSocket クライアントに スコープを付与するものではありません。- 予約済みの direct-loopback
gateway-clientバックエンドヘルパーパスは、 内部 local コントロールプレーン RPC にのみスコープを保持します。カスタムバックエンド ID は この例外を受けません。 - すべての接続は、サーバー提供の
connect.challengenonce に署名する必要があります。
デバイス認証移行診断
チャレンジ前の署名動作をまだ使用しているレガシークライアントの場合、connect は
安定した error.details.reason とともに、error.details.code の下で
DEVICE_AUTH_* 詳細コードを返します。
一般的な移行失敗:
| メッセージ | details.code | details.reason | 意味 |
|---|---|---|---|
device nonce required | DEVICE_AUTH_NONCE_REQUIRED | device-nonce-missing | クライアントが device.nonce を省略した(または空で送信した)。 |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | クライアントが古い、または誤った nonce で署名した。 |
device signature invalid | DEVICE_AUTH_SIGNATURE_INVALID | device-signature | 署名ペイロードが v2 ペイロードと一致しない。 |
device signature expired | DEVICE_AUTH_SIGNATURE_EXPIRED | device-signature-stale | 署名済みタイムスタンプが許容スキューの範囲外。 |
device identity mismatch | DEVICE_AUTH_DEVICE_ID_MISMATCH | device-id-mismatch | device.id が公開鍵フィンガープリントと一致しない。 |
device public key invalid | DEVICE_AUTH_PUBLIC_KEY_INVALID | device-public-key | 公開鍵の形式または正規化に失敗した。 |
- 常に
connect.challengeを待つ。 - サーバー nonce を含む v2 ペイロードに署名する。
- 同じ nonce を
connect.params.device.nonceで送信する。 - 推奨される署名ペイロードは
v3(packages/gateway-client/src/device-auth.tsのbuildDeviceAuthPayloadV3)で、 device/client/role/scopes/token/nonce フィールドに加えてplatformとdeviceFamilyをバインドする。 - レガシー
v2署名は互換性のため引き続き受け入れられるが、ペアリング済みデバイスの メタデータピン留めは再接続時のコマンドポリシーを引き続き制御する。
TLS とピン留め
- WS 接続では TLS がサポートされる(
gateway.tls設定)。 - クライアントは任意で、
gateway.remote.tlsFingerprintまたは CLI--tls-fingerprintによって Gateway 証明書フィンガープリントをピン留めできる。
範囲
このプロトコルは Gateway API 全体を公開する: status、channels、models、chat、 agent、sessions、nodes、approvals など。正確なサーフェスはpackages/gateway-protocol/src/schema.ts から再エクスポートされる TypeBox スキーマによって定義される。