Gateway
Gateway プロトコル
Gateway WS プロトコルは、OpenClaw の単一のコントロールプレーン兼 Node トランスポートです。 オペレーターおよび Node クライアント(CLI、Web UI、macOS アプリ、iOS/Android Node、 ヘッドレス Node)は WebSocket 経由で接続し、ハンドシェイク時に ロール と スコープ を 宣言します。
npm パッケージ
これらのパッケージは OpenClaw のリリース系列に含まれます。初期ロールアウト中は、
パッケージを含む最初のリリースが公開されるまで、npm が E404 を返す場合があります。
@openclaw/gateway-protocolは、スキーマ、バリデーター、TypeScript 型、軽量なフレームおよびエラー ヘルパー、バージョン定数を公開します。その tarball には、生成された機械可読なprotocol.schema.jsonコントラクトが含まれます。@openclaw/gateway-clientは、リファレンス Node クライアントと、@openclaw/gateway-client/browserにある ブラウザーセーフなエントリを公開します。
アプリケーションのライフサイクルに関するガイダンスについては、 Gateway クライアントの構築を参照してください。Gateway を 子プロセスとして監視するアプリについては、 OpenClaw の埋め込みを参照してください。
トランスポートとフレーミング
- 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?}
レスポンスエラーでは { code, message, details?, retryable?, retryAfterMs? } を使用します。
クライアントは code と details.code に基づいて分岐する必要があります。message は人間が読める形式のままであり、
互換性に関する注記で別途規定されている場合を除き、変更される可能性があります。メソッドレベルの
認可エラーでは、構造化された不足スコープの詳細とともに、トップレベルの code: "FORBIDDEN" を使用します。
- 不足スコープ:
{ code: "MISSING_SCOPE", missingScope, requiredScopes }。requiredScopesは、要求された操作について既知のスコープをすべて含む完全なセットです。 従来のmissing scope: <scope>メッセージは古いクライアント向けに維持されています。
クライアントは最初に details を読み、従来のメッセージは互換性のための
フォールバックとしてのみ使用する必要があります。readMissingScopeError と readMissingScopeErrorDetails は
@openclaw/gateway-protocol/gateway-error-details からエクスポートされます。ブラウザーセーフな Gateway クライアントは、
これらを @openclaw/gateway-client/browser から再エクスポートします。
スキーマは @openclaw/gateway-protocol/schema から GatewayErrorDetailsSchema、
MissingScopeErrorDetailsSchema としてエクスポートされます。
HTTP スコープエラーでは、error.details の下に MISSING_SCOPE オブジェクトを反映し、
HTTP ステータス 403 を使用します。
副作用を伴うメソッドには冪等性キーが必要です(スキーマを参照)。
ハンドシェイク
Gateway は接続前チャレンジを送信します。
{ "type": "event", "event": "connect.challenge", "payload": { "nonce": "…", "ts": 1737264000000 }}クライアントは connect で応答します。
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 4, "maxProtocol": 4, "client": { "id": "cli", "version": "1.2.3", "platform": "macos", "mode": "operator" }, "role": "operator", "scopes": ["operator.read", "operator.write"], "caps": [], "commands": [], "permissions": {}, "auth": { "token": "…" }, "locale": "en-US", "userAgent": "openclaw-cli/1.2.3", "device": { "id": "device_fingerprint", "publicKey": "…", "signature": "…", "signedAt": 1737264000000, "nonce": "…" } }}Gateway は hello-ok で応答します。
{ "type": "res", "id": "…", "ok": true, "payload": { "type": "hello-ok", "protocol": 4, "server": { "version": "…", "connId": "…" }, "features": { "methods": ["…"], "events": ["…"] }, "snapshot": { "…": "…" }, "auth": { "role": "operator", "scopes": ["operator.read", "operator.write"] }, "policy": { "maxPayload": 26214400, "maxBufferedBytes": 52428800, "tickIntervalMs": 15000 } }}server、features、snapshot、policy、auth はすべて
HelloOkSchema(packages/gateway-protocol/src/schema/frames.ts)で必須です。auth は、
デバイストークンが発行されない場合でも、ネゴシエーションされたロールとスコープを報告します(上記の形式)。
pluginSurfaceUrls は省略可能で、Plugin サーフェス名(例:
canvas)をスコープ付きのホスト URL にマッピングします。有効期限が切れる場合があるため、
Node は新しいエントリを取得するために { "surface": "canvas" } を指定して
node.pluginSurface.refresh を呼び出します。
非推奨の canvasHostUrl / canvasCapability / node.canvas.capability.refresh
パスはサポートされていません。Plugin サーフェスを使用してください。
スナップショットの省略可能な appliedConfigHash は、アクティブな Gateway ランタイムが受け入れた、
解決済みのソース設定リビジョンです。クライアントはこれを
config.get.configRevisionHash と比較し、より新しく保存された設定で再起動が引き続き
必要かどうかを判断できます。config.get.hash は、設定書き込みの競合ガードで使用される
生のルートファイルリビジョンのままです。
Gateway が起動時のサイドカーの処理をまだ完了していない間、connect は
details.reason: "startup-sidecars" と retryAfterMs を伴う、再試行可能な
UNAVAILABLE エラーを返す場合があります。これを最終的なハンドシェイク失敗として扱わず、
接続予算内で再試行してください。
デバイストークンが発行されると、hello-ok.auth に追加されます。
{ "auth": { "deviceToken": "…", "role": "operator", "scopes": ["operator.read", "operator.write"] }}組み込みの QR/セットアップコードによるブートストラップは、モバイルへの引き継ぎ経路です。 ベースラインのセットアップコード接続に成功すると、プライマリ Node トークンと、範囲が限定された オペレータートークンが 1 つ返されます。
{ "auth": { "deviceToken": "…", "role": "node", "scopes": [], "deviceTokens": [ { "deviceToken": "…", "role": "operator", "scopes": ["operator.approvals", "operator.read", "operator.talk.secrets", "operator.write"] } ] }}このオペレーターへの引き継ぎは意図的に範囲が限定されています。Talk の設定読み取り用の
operator.talk.secrets を含め、モバイルオペレーターのループとネイティブセットアップを
開始するには十分ですが、ペアリング変更スコープと operator.admin は含まれません。
より広範なペアリング/管理者アクセスには、別途承認されたペアリングまたはトークンフローが必要です。
ブートストラップ認証が信頼されたトランスポート(wss:// または
loopback/ローカルペアリング)を介して実行された場合にのみ、hello-ok.auth.deviceTokens を永続化してください。
信頼された同一プロセスのバックエンドクライアント(client.id: "gateway-client"、
client.mode: "backend")は、共有 Gateway トークン/パスワードで認証する場合、
直接 loopback 接続で device を省略できます。この経路は
内部コントロールプレーン RPC(例:サブエージェントのセッション更新)専用であり、
古い CLI/デバイスのペアリングベースラインがローカルバックエンド作業を妨げることを回避します。
リモート、ブラウザーオリジン、Node、および明示的なデバイストークン/デバイス ID クライアントは、
引き続き通常のペアリングとスコープアップグレードのチェックを通過します。
ワーカーロールと閉じたプロトコル
クラウドワーカーは、Gateway が所有し、ホストキーが固定された SSH トンネルを介して、
専用の loopback イングレスを使用します。このイングレスはワーカー ID のみを受け入れ、
一般認証、Node イベント、オペレーター RPC、Plugin メソッドを決してディスパッチしません。
厳格な connect は、保存時にハッシュ化された、環境、バンドルハッシュ、
所有者エポック、RPC セットバージョン、有効期限、および null 許容の 1 セッションに
紐付けられた短期クレデンシャルを検証します。また、現在のバージョンと機能セットを個別に確認します。
成功時には最小限の worker-hello-ok が返されます。機能ネゴシエーションは、
一般プロトコルのバージョンとは独立しています。フレームは 64 KiB 未満に保たれますが、
ネゴシエーションされた worker.inference.start フレームのみ最大 25 MiB まで許可されます。
閉じた許可リストには worker.heartbeat、worker.transcript.commit、
worker.live-event、worker.inference.start、worker.inference.cancel が含まれます。
トランスクリプトのコミットでは、所有者エポックによるフェンシング、Gateway が所有するセッションバインディング、 ベースリーフの compare-and-swap、永続的なシーケンス再生を使用します。Gateway は通常のセッションライターを介して、 トランスクリプトエントリ ID と親 ID を生成します。所有権と有効期限は RPC ごとに再確認されます。
クライアント機能
オペレータークライアントは、connect.params.caps で省略可能な機能を通知できます。
tool-events:構造化されたツールライフサイクルイベントを受け入れます。inline-widgets:ホストされたインラインウィジェットのツール結果をレンダリングできます。
クライアント機能は、認可ではなく、接続されているクライアントについて記述します。エージェントツールは必要な機能を宣言できます。起点となるクライアントの caps にすべての要件が含まれていない場合、Gateway はそれらのツールを除外します。チャネル起点の実行には Gateway クライアント機能がないため、ツールポリシーで明示的に許可されている場合でも、機能によって制限されたツールは利用できません。
Node 接続の例
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 4, "maxProtocol": 4, "client": { "id": "ios-node", "version": "1.2.3", "platform": "ios", "mode": "node" }, "role": "node", "scopes": [], "caps": ["camera", "canvas", "screen", "location", "voice"], "commands": ["camera.snap", "canvas.navigate", "screen.record", "location.get"], "permissions": { "camera.capture": true, "screen.record": false }, "auth": { "token": "…" }, "locale": "en-US", "userAgent": "openclaw-ios/1.2.3", "device": { "id": "device_fingerprint", "publicKey": "…", "signature": "…", "signedAt": 1737264000000, "nonce": "…" } }}Node は接続時に機能要求を宣言します。
caps:camera、canvas、screen、location、voice、talkなどの上位カテゴリ。commands:呼び出し用のコマンド許可リスト。permissions:細粒度の切り替え(例:screen.record、camera.capture)。
Gateway はこれらを要求として扱い、サーバー側の許可リストを適用します。
ロールとスコープ
オペレータースコープの完全なモデル、承認時のチェック、共有シークレットの セマンティクスについては、オペレータースコープを参照してください。
ロール:
operator:コントロールプレーンクライアント(CLI/UI/自動化)。node:機能ホスト(camera/screen/canvas/system.run)。worker:専用の閉じたワーカープロトコル上のクラウド実行ホスト。
オペレータースコープ(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 経由で到達する一部の
スラッシュコマンドには、より厳格なコマンドレベルのチェックが適用されます。すでに低位の
オペレータースコープを保持している Gateway クライアントであっても、永続的な /config set と
/config unset の書き込みには operator.admin が必要です。
node.pair.approve には、基本メソッドスコープ(operator.pairing)に加えて、
保留中のリクエストで宣言された commands(src/infra/node-pairing-authz.ts)に基づく、
承認時の追加スコープチェックがあります。
| 宣言されたコマンド | 必要なスコープ |
|---|---|
| なし | operator.pairing |
| 通常のコマンド | operator.pairing + operator.write |
system.run、system.run.prepare、system.which、browser.proxy、fs.listDir、または system.execApprovals.get/set を含む |
operator.pairing + operator.admin |
機能/コマンド/権限(Node)
Node は接続時に機能の宣言を行います。
caps:camera、canvas、screen、location、voice、talkなどの上位レベルの機能カテゴリ。commands: 呼び出し用のコマンド許可リスト。permissions: 詳細な切り替え(例:screen.record、camera.capture)。
Gateway はこれらを宣言として扱い、サーバー側の許可リストを適用します。
接続済みの Node は、接続または再接続が成功した後に、node.pluginTools.update を使用して、任意のエージェント可視 Plugin または MCP ツールの
記述子を公開できます。ヘッドレス Node ホストでは、宣言的な MCP インベントリの
変更を適用するために再起動します。この更新メソッドが唯一の公開経路であり、Plugin ツール記述子は
connect パラメーターでは受け付けられません。各記述子は、プロバイダーで安全に使用できるツール name を使用し、Node の現在のコマンド許可リストにある
command を指定する必要があります。Gateway はペアリングされた Node からの記述子
メタデータを信頼し、承認済みのコマンド範囲外にある記述子をフィルタリングし、
Node の切断時に削除し、別の Node のカタログを変更しようとする
オペレーターの操作を拒否します。Node が公開した記述子を無視するには、gateway.nodes.pluginTools.enabled: false
を設定します。
接続済みの Node ホストは、node.skills.update を使用して、完全な Skills 置換カタログを公開します。
この Node ロールのメソッドが Node の Skills を公開する唯一の経路であり、
Skills は connect パラメーターでは受け付けられません。各記述子には、
安全な名前、説明、およびサイズが制限された SKILL.md コンテンツが含まれます。Gateway はその
コンテンツを通常の Skills ローダーで解析し、Node の接続中はエージェントの Skills スナップショットに
含め、切断時に削除します。Node が公開した Skills を無視するには、
gateway.nodes.allowSkills: false を設定します。
プレゼンス
system-presenceはデバイス ID をキーとするエントリを返します。これにはdeviceId、roles、scopesが含まれるため、オペレーターと Node の両方として 接続している場合でも、UI はデバイスごとに 1 行を表示できます。node.listには任意のlastSeenAtMsとlastSeenReasonが含まれます。接続済みの Node は、理由connectとともに現在の接続時刻を報告します。ペアリングされた Node は、 信頼済み Node イベントを介して、永続的なバックグラウンドプレゼンスも報告できます。
ネイティブ macOS Node は、入力アイドル時間を制限した、認証済みの node.presence.activity イベントも送信できます。
Gateway は自身のクロックでアクティビティのタイムスタンプを生成し、
node.list と node.describe を通じて、接続中で最も新しい Mac を公開し、
node.presence の更新を読み取りスコープを持つクライアントにブロードキャストします。
ユーザーがアクティビティ共有を無効にすると、アプリは { "action": "clear" } を送信します。
Gateway は、その認証済み Node 接続に完全に一致するタイムスタンプのみを消去します。
この確認済みアクションより前の Gateway は未処理として返すため、Mac
Node は一度再接続し、切断時のクリーンアップによって古い接続状態を削除します。
選択、プライバシー、モデルコンテキスト、および通知ルーティングの動作については、
アクティブなコンピューターのプレゼンスを参照してください。
Node のバックグラウンド生存イベント
Node は、ペアリングされた Node を接続済みとしてマークせずに、バックグラウンド復帰中に
稼働していたことを記録するため、event: "node.presence.alive" を指定して node.event を呼び出します。
{ "event": "node.presence.alive", "payloadJSON": "{\"trigger\":\"silent_push\",\"sentAtMs\":1737264000000,\"displayName\":\"Peter's iPhone\",\"version\":\"2026.4.28\",\"platform\":\"iOS 18.4.0\",\"deviceFamily\":\"iPhone\",\"modelIdentifier\":\"iPhone17,1\",\"pushTransport\":\"relay\"}"}trigger は、background、silent_push、bg_app_refresh、
significant_location、manual、connect からなる閉じた列挙型です。不明な値は
background(src/shared/node-presence.ts)に正規化されます。このイベントは、
認証済みの Node デバイスセッションに対してのみ永続化されます。デバイスのないセッションまたはペアリングされていないセッションは、
handled: false を返します。
成功した Gateway は構造化された結果を返します。
{ "ok": true, "event": "node.presence.alive", "handled": true, "reason": "persisted"}古い Gateway では、node.event に対して { "ok": true } のみが返される場合があります。これは永続的なプレゼンスの保存ではなく、確認済みの RPC として扱ってください。
ブロードキャストイベントのスコープ
サーバーからプッシュされるブロードキャストイベントはスコープによって制限されるため、ペアリングスコープまたは Node 専用のセッションがセッション内容を受動的に受信することはありません
(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、接続/切断ライフサイクル)は制限されないため、認証済みのすべてのセッションからトランスポートの健全性を監視できます。 - 未知のブロードキャストイベントファミリーは、登録済みのハンドラーが明示的に制限を緩和しない限り、デフォルトでスコープによって制限されます(フェイルクローズ)。
各クライアント接続はクライアントごとに独自のシーケンス番号を保持するため、クライアントごとにイベントストリームの異なるスコープフィルタ済みサブセットが表示される場合でも、そのソケット上のブロードキャストは単調増加の順序を維持します。
RPC メソッドファミリー
hello-ok.features.methods は、src/gateway/server-methods-list.ts と、読み込まれた Plugin/チャンネルのメソッドエクスポートから構築される控えめな検出リストです。これはすべてのメソッドを生成して列挙したものではなく、一部のメソッド(たとえば push.test、web.login.start、web.login.wait、sessions.usage)は実在して呼び出し可能であっても、意図的に検出対象から除外されています。これは src/gateway/server-methods/*.ts の完全な列挙ではなく、機能検出として扱ってください。
システムとアイデンティティ
healthは、キャッシュ済みまたは新たにプローブされた Gateway の健全性スナップショットを返します。diagnostics.stabilityは、最近の診断安定性レコーダーを上限付きで返します。内容は、イベント名、件数、バイトサイズ、メモリ測定値、キュー/セッション状態、チャンネル/Plugin 名、セッション ID です。チャットテキスト、Webhook 本文、ツール出力、生のリクエスト/レスポンス本文、トークン、Cookie、シークレットは含まれません。operator.readが必要です。statusは、/status形式の Gateway サマリーを返します。機密フィールドは、管理者スコープを持つオペレータークライアントにのみ返されます。gateway.identity.getは、リレーおよびペアリングフローで使用される Gateway のデバイスアイデンティティを返します。system-presenceは、接続中のオペレーター/Node デバイスの現在のプレゼンススナップショットを返します。system-eventは、システムイベントを追加し、プレゼンスコンテキストを更新/ブロードキャストできます。last-heartbeatは、永続化された最新の Heartbeat イベントを返します。set-heartbeatsは、Gateway での Heartbeat 処理を切り替えます。gateway.suspend.prepareは、追跡対象の Gateway 処理がアイドル状態の場合にのみ、短時間の協調的な一時停止リースを作成します。gateway.suspend.statusはそのリースを確認し、gateway.suspend.resumeは再開後またはホスト操作の中止後にリースを解放します。
モデルと使用量
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"を渡します。 どちらの使用量メソッドも、夏時間を考慮した暦日の境界とバケットのために、IANAtimeZoneを含むmode: "specific"を受け付けます。utcOffsetは、古いクライアント向け、および Gateway ランタイムが要求されたゾーンを認識しない場合のフォールバックとして引き続きサポートされます。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は、ウェイクワードトリガーを更新し、変更をブロードキャストします。
Plugin 管理
plugins.list(operator.read)は、インストール済み Plugin の一覧に加え、ローカルで選定された公式推奨項目、診断情報、および現在のインストールモードで変更が許可されているかどうかを返します。plugins.search(operator.read)は、インストール可能な ClawHub のコード Plugin およびバンドル Plugin ファミリーを検索します。空でないqueryと、任意で 1~100 のlimitを渡します。plugins.install(operator.admin)は、{ source: "official", pluginId }を使用して公式カタログエントリを、または{ source: "clawhub", packageName, version?, acknowledgeClawHubRisk? }を使用して ClawHub パッケージをインストールします。ClawHub のインストールでは、Gateway の信頼性、整合性、およびインストールポリシーのチェックが維持されます。インストールが成功した場合は、Gateway の再起動が必要です。plugins.setEnabled(operator.admin)は、{ pluginId, enabled }を使用して、インストール済みの 1 つの Plugin の有効化ポリシーを変更します。応答には、更新されたカタログエントリ、再起動メタデータ、およびスロット選択に関する警告が含まれます。plugins.uninstall(operator.admin)は、{ pluginId }を使用して、外部からインストールされた 1 つの Plugin を削除します。削除対象には、設定参照、インストール記録、および管理対象ファイルが含まれます。バンドル済み Plugin はアンインストールできず、無効化のみ可能です。応答には削除アクションが一覧表示され、常に Gateway の再起動が必要です。
メッセージングとログ
sendは、チャットランナー外でチャネル、アカウント、スレッドを対象に送信するための、直接のアウトバウンド配信 RPC です。logs.tailは、カーソル、上限、および最大バイト数の制御を使用して、設定済みの Gateway ファイルログの末尾を返します。
オペレーター端末
terminal.openは、明示的なagentIdまたはデフォルトエージェント用のホスト PTY を開始し、解決されたエージェント、作業ディレクトリ、シェル、および隔離状態を返します。terminal.input、terminal.resize、およびterminal.closeは、呼び出し元の接続が所有するセッションのみを操作します。terminal.uploadは、最大 16 MiB の base64 ファイルを 1 つ受け取り、セッションの Gateway またはペアリング済み Node のホスト上にある非公開の 24 時間一時ディレクトリに配置し、絶対パスを返します。呼び出し元は、そのパスを貼り付けるなどして使用する必要があります。RPC が端末入力を書き込んだり、コマンドを実行したりすることはありません。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 が、デタッチ済みのものも含めて閉じられます。
通話と 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は、管理対象ルームのセッショントークンを検証し、必要に応じてsession.readyまたはsession.replacedを発行し、ルーム/セッションのメタデータと最近の Talk イベントを返します。平文のトークンやそのハッシュを返すことはありません。talk.session.appendAudioは、base64 PCM 入力音声を、Gateway が所有するリアルタイムリレーおよび文字起こしセッションに追加します。talk.session.startTurn、talk.session.endTurn、およびtalk.session.cancelTurnは、状態をクリアする前に古いターンを拒否しつつ、管理対象ルームのターンライフサイクルを制御します。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 が所有するリレー、文字起こし、または管理対象ルームのセッションを閉じ、終端 Talk イベントを発行します。talk.modeは、WebChat/Control UI クライアント向けに現在の Talk モード状態を設定し、ブロードキャストします。talk.client.createは、webrtcまたはprovider-websocketを使用して、クライアントが所有するリアルタイムプロバイダーセッションを作成または再開します。この間、Gateway は認証情報、指示、ツールポリシー、および返されるvoiceSessionIdを管理します。クライアントはsessionKeyを渡し、1 回の通話中にプロバイダートランスポートを置き換える際はvoiceSessionIdを再利用します。talk.client.transcriptは、確定済みの{ role, text }項目を 1 つ、通常のエージェントセッションに追加します。必須のentryIdはvoiceSessionId内でべき等であり、再試行してもトランスクリプトメッセージは重複しません。talk.client.closeは、保留中のトランスクリプト書き込み後に論理音声セッションを閉じます。クローズ処理はべき等であり、変更のみを含む通話ダイジェストをセッションの最後の非 WebChat チャネルに配信する場合があります。talk.client.toolCallにより、クライアントが所有するリアルタイムトランスポートは、プロバイダーツール呼び出しを Gateway ポリシーに転送できます。最初にサポートされるツールはopenclaw_agent_consultです。クライアントは実行 ID を受け取り、通常のチャットライフサイクルイベントを待ってから、プロバイダー固有のツール結果を送信します。音声に紐付いた影響の大きいアクションは、その正確なアクションを後続の確定済みユーザー発話が明示的に確認し、次の問い合わせでconfirmationIdが指定されるまで、VOICE_CONFIRMATION_REQUIRED:<id>を返します。talk.client.steerは、クライアントが所有するリアルタイムトランスポートに、アクティブな実行の音声制御を送信します。Gateway はsessionKeyからアクティブな埋め込み実行を解決し、ステアリングを暗黙に破棄するのではなく、承認/拒否を示す構造化された結果を返します。talk.eventは、リアルタイム、文字起こし、STT/TTS、管理対象ルーム、テレフォニー、および会議アダプター向けの単一の Talk イベントチャネルです。talk.speakは、アクティブな Talk 音声プロバイダーを通じて音声を合成します。tts.statusは、TTS の有効状態、アクティブなプロバイダー、フォールバックプロバイダー、およびプロバイダー設定状態を返します。tts.providersは、表示可能な TTS プロバイダー一覧を返します。tts.enableおよびtts.disableは、TTS 設定状態を切り替えます。tts.setProviderは、優先する TTS プロバイダーを更新します。tts.convertは、1 回限りのテキスト読み上げ変換を実行します。tts.speak(operator.write)は、設定済みの汎用 TTS プロバイダーチェーンを使用して、空でないtextをレンダリングし、クリップ全体をaudioBase64としてインラインで返します。さらに、providerと、任意のoutputFormat、mimeType、およびfileExtensionメタデータも返します。tts.convertとは異なり、Gateway ローカルのパスは返しません。talk.speakとは異なり、Talk プロバイダーは必要ありません。tts.maxTextLengthを超えるテキストではINVALID_REQUESTが返され、音声合成に失敗した場合はUNAVAILABLEが返されます。
シークレット、設定、更新、ウィザード
secrets.reloadは、アクティブな SecretRef を再解決し、所有者を考慮したランタイム状態をアトミックに公開します。対象となる所有者の失敗は、warningCountとともにコールドまたはステイルの縮退状態として公開できます。厳格な失敗またはマッピングされていない失敗の場合、再読み込みを拒否し、アクティブなスナップショットを維持します。secrets.resolveは、特定のコマンド/ターゲットセットに対するコマンドターゲットのシークレット割り当てを解決します。config.getは、現在のディスク上の設定スナップショット、未加工のルートファイルhash、解決済みのconfigRevisionHash、およびアクティブな Gateway ランタイムが受け入れた解決済みリビジョンのオプションのappliedConfigHashを返します。config.setは、検証済みの設定ペイロードを書き込みます。config.patchは、部分的な設定更新をマージします。破壊的な配列置換では、影響を受けるパスをreplacePathsに指定する必要があります。配列エントリ内のネストされた配列には、agents.entries.*.skillsなどの[]パスを使用します。config.applyは、設定ペイロード全体を検証して置き換えます。config.schemaは、Control UI と CLI ツールで使用されるライブ設定スキーマのペイロードを返します。これには、スキーマ、uiHints、バージョン、生成メタデータ、および読み込み可能な場合は Plugin とチャンネルのスキーマメタデータが含まれます。また、該当するフィールドドキュメントが存在する場合、UI と同じラベル/ヘルプテキストに基づくtitle/descriptionメタデータが含まれ、ネストされたオブジェクト、ワイルドカード、配列項目、およびanyOf/oneOf/allOfの合成分岐にも対応します。config.schema.lookupは、1 つの設定パスに対するパススコープの検索ペイロードを返します。これには、正規化されたパス、浅いスキーマノード、一致したヒントとhintPath、オプションのreloadKind、および UI/CLI のドリルダウン用の直下の子要素の概要が含まれます。reloadKindはrestart、hot、またはnone(src/config/schema.ts)のいずれかで、要求されたパスに対する Gateway 設定再読み込みプランナーを反映します。検索スキーマノードは、ユーザー向けドキュメントと一般的な検証フィールド(title、description、type、enum、const、format、pattern、数値/文字列/配列/オブジェクトの境界、additionalProperties、deprecated、readOnly、writeOnly)を保持します。子要素の概要では、key、正規化されたpath、type、required、hasChildren、オプションのreloadKind、および一致したhint/hintPathを公開します。update.runは Gateway の更新フローを実行し、更新が成功した場合にのみ再起動をスケジュールします。セッションを持つ呼び出し元はcontinuationMessageを含めることで、起動時に再起動継続キューを介して後続のエージェントターンを 1 回再開できます。コントロールプレーンからのパッケージマネージャー更新および監視対象の git チェックアウト更新では、稼働中の Gateway 内でパッケージツリーを置き換えたり、チェックアウト/ビルド出力を変更したりする代わりに、切り離されたマネージドサービスへのハンドオフを使用します。開始されたハンドオフは、result.reason: "managed-service-handoff-started"およびhandoff.status: "started"とともにok: trueを返します。同じ Gateway プロセスによって処理される 2 つ目の同時実行update.runは、result.reason: "managed-service-handoff-already-running"およびhandoff.status: "already-running"とともにok: falseを返します。その継続は受け入れられないため、呼び出し元はアクティブな更新の完了後に再試行できます。スタンドアロンの CLI アップデーターと置換後の Gateway プロセスは、このプロセスローカルなガードの対象外です。利用不能または失敗したハンドオフは、managed-service-handoff-unavailableまたはmanaged-service-handoff-failedとともにok: falseを返し、手動のシェル更新が必要な場合はさらにhandoff.commandを返します。「利用不能」とは、systemd のOPENCLAW_SYSTEMD_UNITなど、OpenClaw に安全なスーパーバイザー境界または永続的なサービス ID がないことを意味します。開始されたハンドオフ中、再起動センチネルが一時的にstats.reason: "restart-health-pending"を報告する場合があります。CLI が再起動後の Gateway を検証し、最終的なokセンチネルを書き込むまで、継続は遅延されます。update.statusは、更新用の再起動センチネルを更新して返します。利用可能な場合は、再起動後に稼働しているバージョンも含まれます。wizard.start、wizard.next、wizard.status、およびwizard.cancelは、WS RPC 経由でオンボーディングウィザードを公開します。
エージェントとワークスペースのヘルパー
agents.listは、Gateway から可視のエージェントエントリを返します。これには、有効なモデル/ランタイムメタデータと、オプションのセマンティックkind(agentまたはsystem)が含まれます。クライアントはagent-kindハンドシェイク機能を通知することで、完全な型付き名簿を受け取ります。この機能を持たないクライアントには、システム行を含まない従来のセレクター安全な名簿が維持されます。種別を認識するクライアントは、system行を診断ビューには保持しつつ、通常のセレクターから除外します。古い v4 Gateway は、kindのない行を返す場合があります。agents.create、agents.update、およびagents.deleteは、エージェントレコードとワークスペースの接続を管理します。agents.files.list、agents.files.get、およびagents.files.setは、エージェントに公開されるブートストラップ用ワークスペースファイルを管理します。audit.activity.listは、バージョン管理されたメタデータ専用のアクティビティ台帳を返します。audit.listは、引き続き互換性を保つ run/tool RPC です。agents.workspace.listおよびagents.workspace.get(operator.read)は、オペレータースコープで説明されている信頼済みオペレータードメイン内のクライアント向けに、エージェントのワークスペースディレクトリを読み取り専用かつページ分割して閲覧できるようにします。リクエストではワークスペース相対パスのみを受け付けます。読み取りは実パス解決済みのワークスペースルート内に限定され(シンボリックリンクおよびハードリンクによる脱出は拒否)、サイズ上限が適用され、UTF-8 テキストと一般的な画像形式(base64)のみに制限されます。レスポンスでは、ホスト上のワークスペースパスを公開しません。この名前空間には書き込み操作はありません。tasks.list、tasks.get、およびtasks.cancelは、Gateway のタスク台帳を SDK とオペレータークライアントに公開します。後述のタスク台帳 RPCを参照してください。artifacts.list、artifacts.get、およびartifacts.downloadは、明示的なsessionKey、runId、またはtaskIdスコープに対して、トランスクリプトから派生したアーティファクトの概要とダウンロードを公開します。実行およびタスクのクエリでは、所有するセッションをサーバー側で解決し、出所が一致するトランスクリプトメディアのみを返します。安全でない URL ソースまたはローカル URL ソースについては、サーバー側で取得せず、未対応のダウンロードとして返します。environments.listおよびenvironments.statusは、Gateway ローカル環境と Node 環境の検出を維持します。設定済みのクラウドワーカーと以前のプロファイルが残した永続レコードには、providerId、オプションのleaseId、state、ageMs、オプションのidleMs、およびattachedSessionIdsを含むworkerメタデータが追加されます。ワーカーのライフサイクル状態は、requested、provisioning、bootstrapping、ready、attached、idle、draining、destroying、destroyed、failed、およびorphanedです。environments.create({ profileId, idempotencyKey })は、設定済みの Plugin プロバイダープロファイルからワーカーをプロビジョニングします。同じキーで再試行すると、永続化された操作が再利用されます。environments.destroy({ environmentId })は、永続的なワーカー環境のべき等な破棄を要求します。どちらもoperator.adminが必須で、コントロールプレーンへの書き込みであり、ステータスレスポンスで使用されるものと同じ形式の環境概要を返します。agent.identity.getは、エージェントまたはセッションに対する有効なアシスタント ID を返します。agent.waitは、実行が完了するまで待機し、利用可能な場合は終了時のスナップショットを返します。
セッション制御
sessions.listは、エージェントランタイムバックエンドが構成されている場合の行ごとのagentRuntimeメタデータを含む、現在のセッションインデックスを返します。クラウドワーカー配置が有効な場合、または永続的な復旧状態が存在する場合、セッション行には、クローズ済みのplacement状態(local、requested、provisioning、syncing、starting、active、draining、reconciling、reclaimed、またはfailed)に加えて、状態固有の環境、所有者エポック、ワークスペース、バンドル、ACK カーソル、または復旧フィールドも含まれます。sessions.subscribeとsessions.unsubscribeは、現在の WS クライアントに対するセッション変更イベントのサブスクリプションを切り替えます。sessions.messages.subscribeとsessions.messages.unsubscribeは、1 つのセッションに対するトランスクリプト/メッセージイベントのサブスクリプションを切り替えます。永続化された対象者にそのセッションが厳密に含まれ、かつレビュー担当者のバインディングによって購読クライアントが承認されている承認について、サニタイズ済みのsession.approvalライフサイクルイベントも受信するには、includeApprovals: trueを渡します。その場合、購読応答には上限付きの保留中approvalReplayが含まれます。これはtruncatedが false の場合に正式な情報となります。このオプトインは購読呼び出しごとに適用され、固定されません。同じセッションをincludeApprovals: trueなしで再購読すると、既存の承認サブスクリプションが削除されます。通常のセッション読み取り権限に加えて、このオプトインにはoperator.admin、またはペアリング済みデバイス上のoperator.approvalsが必要です。sessions.previewは、指定されたセッションキーの上限付きトランスクリプトプレビューを返します。sessions.describeは、厳密に一致するセッションキーについて 1 つの Gateway セッション行を返します。sessions.resolveは、セッションターゲットを解決または正規化します。sessions.createは、新しいセッションエントリを作成します。省略可能なmodelとthinkingLevelの値は、初期モデルと推論のオーバーライドをアトミックに永続化します。worktree: trueは管理対象ワークツリーをプロビジョニングします。省略可能なworktreeBaseRef/worktreeNameはベース ref とブランチ名を選択し、execNode(operator.admin)はセッションの実行を Node ホストにバインドします。作成されたワークツリーは結果に反映され、セッション行(worktree: { id, branch, repoRoot })に永続化されます。エントリは作成されたものの、ネストされた初期chat.sendが拒否された場合、成功結果にはrunStarted: falseとrunErrorが含まれます。クライアントはプロンプトを保持し、返されたセッションキーに対して再試行できます。parentSessionKeyをemitCommandHooks: trueとともに渡す呼び出し元は、別個の子のライフサイクル上の処置も宣言する必要があります。succeedsParent: trueは親をsession_endで終了し、falseは親をアクティブなまま維持し、子のsession_startのみを発行します。succeedsParentを省略すると、既存クライアント向けの従来の親ロールオーバー動作が維持されます。この処置には親とのリンクとコマンドフックの両方が必要です。フォークはその親を成功状態にできません。別個の子は作成されないため、メインセッションのその場でのリセット動作は変わりません。新しい行には、信頼された作成境界から書き込み一回限りの作成来歴(createdVia、createdActor、createdAt)が付与されます。既存キーを採用しても、再度付与されることはありません。人間のプロファイルアクターの場合、行の投影時にcreatedActor.labelが現在のユーザープロファイルから解決され、セッションエントリには一切保存されないため、プロファイル名を変更しても不整合は生じません。セッション行には、parentSessionKey(ナビゲーション上の親、永続化)、controlOwnerSessionKey(稼働中のランタイムコントローラー)、forkSource(フォーク元の厳密なキーとトランスクリプト世代)、およびpreviousSessionId(同じキーの以前のトランスクリプト世代)も含まれます。sessions.dispatch(operator.admin)は、セッション所有の管理対象ワークツリーを持つ既存のローカル OpenClaw セッションを、構成済みのクラウドワーカープロファイルへ移動します。{ key, profileId, agentId? }を渡します。ワーカープロファイルが構成されていない場合、このメソッドは存在しません。アクティブな作業をドレインする前にローカルでのターン受け付けを閉じ、配置がactiveのワーカー所有権に達した後にのみ返ります。ディスパッチは一方向です。ワーカーからローカルへの引き戻しは、この RPC の対象外です。sessions.groups.list、sessions.groups.put、sessions.groups.rename、およびsessions.groups.deleteは、Gateway が所有するカスタムセッショングループカタログ(名前と表示順)を管理します。メンバーシップは各セッションのcategoryフィールドに保持され、名前変更と削除では、メンバーセッションがサーバー側で更新されます。sessions.sendは、既存のセッションにメッセージを送信します。sessions.steerは、アクティブなセッション向けの中断および誘導バリアントです。sessions.abortは、セッションのアクティブな作業を中止します。keyと省略可能なrunIdを渡すか、Gateway がセッションを解決できるアクティブな実行についてはrunIdのみを渡します。runIdを指定すると、キャンセルの範囲がその実行に限定されます。キーのみを指定した非グローバルリクエストでclearQueued: trueを設定すると、そのセッションが所有するフォローアップキューとレーンキューも破棄されます。clearQueuedを省略する既存の呼び出し元では、これらのキューが維持されます。リテラルのglobalキーでは、既存のエージェント修飾付きchat.abort所有権ルールが維持され、非グローバルなフォローアップまたはレーンのクリーンアップは実行されません。sessions.patchは、セッションのメタデータ/オーバーライドを更新し、解決された正規モデルと有効なagentRuntimeを報告します。生成系統(spawnedBy、spawnedWorkspaceDir、spawnedCwd、spawnDepth、subagentRole、subagentControlScope)は、公開 API からパッチできなくなりました。これらの情報は信頼された作成パスによって一度だけ書き込まれ、引き続き送信するリクエストは拒否されます。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は、単一の表示可能なトランスクリプトエントリ向けに追加された、上限付きの完全メッセージ読み取り機能です。sessionKey、セッション選択がエージェントスコープの場合は省略可能なagentId、およびchat.historyを通じて以前に公開されたトランスクリプトのmessageIdを渡します。保存済みエントリが引き続き利用可能でサイズ超過でない場合、Gateway は軽量履歴の切り詰め上限なしで、同じ表示正規化済み投影を返します。chat.toolTitlesは、Control UI に表示されるツール呼び出しの短い目的タイトルを返します(バッチ処理、入力サイズに上限がある最大 24 項目)。この機能はgateway.controlUi.toolTitlesによるオプトイン方式です(デフォルトは無効)。無効な Gateway はモデルを呼び出さずに{ titles: {}, disabled: true }と応答するため、クライアントは問い合わせを停止します。有効な場合、タイトルには標準のユーティリティモデルルーティングが使用されます。明示的に構成されたutilityModel(すべてのユーティリティタスクと同様に、選択したプロバイダーへ上限付きのタスク内容を送信する可能性がある運用者の判断)があればそれを使用し、なければセッションプロバイダーが宣言した小規模モデルのデフォルトを使用するため、新しい送信先が暗黙的に追加されることはありません。空のutilityModelを指定すると完全に無効になります。タイトルがプライマリモデルへフォールバックすることはありません。結果は、ツール名と入力をキーとしてエージェントごとの状態データベースにキャッシュされるため、同じ呼び出しを繰り返し表示しても再課金されることはありません。chat.sendは、1 ターン限りのfastMode: "auto"を受け付け、自動カットオフより前に開始されたモデル呼び出しでは高速モードを使用し、それ以降に開始される再試行、フォールバック、ツール結果、または継続の呼び出しでは高速モードを使用しません。カットオフのデフォルトは 60 秒(DEFAULT_FAST_MODE_AUTO_ON_SECONDS)で、agents.defaults.models["<provider>/<model>"].params.fastAutoOnSecondsを使用してモデルごとに構成できます。chat.sendの呼び出し元は、1 ターン限りのfastAutoOnSecondsを渡して、そのリクエストのカットオフをオーバーライドできます。このリクエストに限り保存済みのキューモードをオーバーライドするには、queueMode(steer、followup、collect、またはinterrupt)を渡します。明示的な Control UI の誘導アクションではqueueMode: "steer"を使用します。対話型クライアントは、表示中のアクティブなトランスクリプトブランチのリーフをexpectedLeafEntryIdで渡すか、正式に空のトランスクリプトをnullで渡すことができます。別のクライアントが先にブランチを切り替えた場合、Gateway は送信をdetails.reason: "active-leaf-changed"で拒否します。
デバイスのペアリングとデバイストークン
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.pair.renameは、クライアントから報告された表示名より優先され、デバイスの修復または再承認後も維持される運用者ラベル({ deviceId, label })を割り当てます。device.token.rotateは、承認済みロールと呼び出し元のスコープ境界内で、ペアリング済みデバイスのトークンをローテーションします。device.token.revokeは、承認済みロールと呼び出し元のスコープ境界内で、ペアリング済みデバイスのトークンを失効させます。
セットアップコードには、有効期間の短いブートストラップ認証情報が埋め込まれています。クライアントは、 ペアリングフローの範囲を超えてこれをログに記録したり、永続化したりしてはなりません。
Node のペアリング、呼び出し、および保留中の作業
node.pair.list、node.pair.approve、node.pair.reject、およびnode.pair.removeは、Node の機能承認を扱います。node.pair.requestとnode.pair.verifyは、スタンドアロンの Node ペアリングストアとともに 2026.7 で削除されました。保留中のリクエストは、Node の接続中に Gateway によって作成されます。node.listとnode.describeは、既知/接続済みの Node の状態を返します。node.renameは、ペアリング済み Node のラベルを更新します。node.invokeは、接続済み Node にコマンドを転送します。node.invoke.resultは、呼び出しリクエストの結果を返します。mcp.tools.call.v1は、構成済みの Node ローカル MCP ツールを呼び出すための、ヘッドレス Node ホスト用コマンドです。これはnode.invokeを通じて伝送され、Node がそのコマンドを宣言している必要があり、引き続きペアリング承認とgateway.nodes.commands.denyの対象となります。node.eventは、Node で発生したイベントを Gateway に返します。node.pluginTools.updateは、接続済み Node のエージェントから見える Plugin/MCP ツール記述子を置き換える唯一の公開パスです。connectパラメーターにはこれらは含まれません。node.pending.pullとnode.pending.ackは、接続済み Node のキュー API です。node.pending.enqueueとnode.pending.drainは、オフライン/切断済み Node の永続的な保留中作業を管理します。
承認ファミリー
approval.historyは、exec、Plugin、system-agent リクエストについて、30 日間保持される終了済み承認を新しい順で返します(スコープoperator.approvals)。カーソルページネーションとオプションの種別フィルターをサポートします。保留中の承認は履歴行には含まれません。approval.getとapproval.resolveは、種別に依存しない永続的な承認メソッドです(スコープoperator.approvals)。approval.getは、安定したurlPathを持つ、サニタイズ済みの保留中または保持された終了済みプロジェクションを返します。approval.resolveは、正規の承認 ID、明示的なkind、および決定を受け取り、最初の回答を優先する解決を適用し、記録された正規の結果を常に返します。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は、Node リレーコマンドを介して Node ローカルの exec 承認ポリシーを管理します。plugin.approval.request、plugin.approval.list、plugin.approval.waitDecision、およびplugin.approval.resolveは、Plugin 定義の承認フローを扱います。
Control UI コマンド
ui.commandを使用すると、operator.write呼び出し元は、ui-commands機能を通知する接続済みの Control UI クライアントに、型付きのレイアウトおよびナビゲーションコマンドを送信できます。- コマンドは、ペインの分割/閉じる/フォーカス、サイドバーの表示状態、ターミナル/ブラウザパネルの表示状態とドッキング、およびセッションナビゲーションを扱います。
- プロトコル v1 は、意図的に、接続されている対応可能なすべての Control UI にファンアウトします。接続されているものがない場合、レイアウトが変更されたように装うのではなく、リクエストは
UNAVAILABLEで失敗します。
自動化、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:購読中のセッションに関するトランスクリプト、実行中の セッション操作、およびイベントストリームの更新。session.approval:明示的にオプトインした完全一致セッション購読者向けの、サニタイズ済みの保留中および終了済み承認の正確な状態。 子承認は永続化された祖先のオーディエンスを使用します。イベントがトランスクリプトを変更したり、エージェントをウェイクしたりすることはありません。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:ウェイクワードトリガー設定が変更されました。config.changed:設定の書き込みが永続化されました(ペイロードには設定パス、 新しいスナップショットハッシュ、およびタイムスタンプが含まれます。設定内容は決して含まれません)。オペレーター読み取り スコープです。クライアントはconfig.getを介して更新します。exec.approval.requested/exec.approval.resolved:exec 承認の ライフサイクル。plugin.approval.requested/plugin.approval.resolved:Plugin 承認の ライフサイクル。
Node ヘルパーメソッド
Node は、自動許可チェック用の Skills 実行可能ファイルの現在の一覧を取得するために、skills.bins を呼び出せます。
監査台帳 RPC
audit.activity.list は、エージェント実行、ツールアクション、およびオプトインされたメッセージのライフサイクルメタデータを、オペレータークライアント向けに安定した新しい順のビューで提供します。
operator.read が必要です。クエリは 30 日より古いレコードを除外し、共有
SQLite 台帳は 100,000 レコードに制限されます。期限切れの行は、
Gateway の起動時、1 時間ごとのメンテナンス時、および以降の書き込み時に削除されます。データモデルとプライバシーのセマンティクスについては、
監査履歴を参照してください。
- パラメーター:オプションの完全一致
agentId、sessionKey、またはrunId。オプションのkind("agent_run"、"tool_action"、または"message")。オプションのstatus("started"、"succeeded"、"failed"、"cancelled"、"timed_out"、"blocked"、または"unknown")。オプションのメッセージdirection("inbound"または"outbound")と完全一致channel。オプションの包含的なafter/beforeUnix ミリ秒境界。1から500までのオプションのlimit。および前のページから取得したオプションの 文字列cursor。 - 結果:
{ "events": AuditActivityEventV1[], "nextCursor"?: string }。
名前付き V1 結果ユニオンには、エージェント実行、ツールアクション、受信メッセージ、
および送信メッセージ用の個別のスキーマがあります。eventType 判別子はそれぞれ
agent_run、tool_action、inbound_message、または outbound_message です。kind と
メッセージ direction は、引き続きフィルタリングと表示に使用できます。すべてのイベントには
整数の schemaVersion: 1 があります。メッセージ ID 参照は正確な
hmac-sha256:v1:<32 hex key id>:<64 hex digest> 形式を使用します。チャンネル送信者のアクター
ID も同じ形式を使用します。
すべてのバリアントには、eventType、schemaVersion、eventId、sequence、
sourceSequence、occurredAt、kind、action、status、actor、および
redaction が必要です。バリアントフィールドは次のとおりです。
eventType |
必須フィールド | オプションフィールド |
|---|---|---|
agent_run |
agentId、runId、kind: "agent_run" |
sessionKey、sessionId、errorCode |
tool_action |
agentId、runId、kind: "tool_action" |
sessionKey、sessionId、toolCallId、toolName、errorCode |
inbound_message |
direction: "inbound"、channel、conversationKind、outcome |
agentId、runId、durationMs、resultCount、ID 参照、reasonCode、errorCode |
outbound_message |
direction: "outbound"、channel、conversationKind、outcome |
agentId、runId、durationMs、resultCount、ID 参照、reasonCode、deliveryKind、failureStage、errorCode |
閉じたメッセージ列挙型は次のとおりです。
conversationKind:direct、group、channel、またはunknown。- 受信
outcome:completed、skipped、またはfailed。オプションのreasonCode:duplicate、reply_operation_active、reply_operation_aborted、fast_abort、plugin_bound_handled、plugin_bound_unavailable、plugin_bound_declined、plugin_bound_error、before_dispatch_handled、acp_dispatch_completed、acp_dispatch_failed、acp_dispatch_empty、またはacp_dispatch_aborted。 - 送信
outcome:sent、suppressed、failed、またはunknown。オプションのreasonCode:cancelled_by_message_sending_hook、cancelled_by_reply_payload_sending_hook、empty_after_message_sending_hook、empty_after_reply_payload_sending_hook、 またはno_visible_payload。プラットフォーム ID を返さないアダプターはunknownです。外部への副作用がなかったことを証明できないためです。 deliveryKind:text、media、またはother。failureStage:platform_send、queue、またはunknown。
終了フィールドは相互に関連しており、個別にオプションではありません。
| バリアント | 終了時の対応関係 |
|---|---|
| エージェント実行 | started には errorCode がありません。成功以外の各完了ステータスには、対応する run_* コードが必要です。 |
| ツールアクション | started と成功には errorCode がありません。その他の各完了ステータスには、対応する tool_* コードが必要です。 |
| 受信メッセージ | 成功 = completed、ブロック = skipped、失敗 = failed と message_processing_failed。reasonCode が存在する場合、その終了ファミリーに属している必要があります。 |
| 送信メッセージ | 成功 = sent、ブロック = suppressed と reasonCode、失敗 = failed と errorCode および failureStage、不明 = unknown と failureStage。 |
各アクティビティイベントには、安定したイベント ID、単調増加する台帳シーケンス、
ソースイベントシーケンス、タイムスタンプ、アクター、アクション、ステータス、整数の
schemaVersion: 1、および redaction: "metadata_only" が含まれます。実行レコードとツールレコードには
エージェントと実行の来歴が必要であり、セッションの来歴が含まれる場合もあります。メッセージ
レコードにはエージェント ID と実行 ID が含まれる場合がありますが、意図的に
sessionKey または sessionId は含まれません。そのため、sessionKey クエリフィルターは
実行行とツール行にのみ適用されます。ツールイベントには、ツール呼び出し ID とツール名が含まれる場合があります。
メッセージレコードは message.inbound.processed または
message.outbound.finished を使用し、方向、チャンネル、会話の種類、
正規化された結果に加えて、オプションの配信種類、失敗ステージ、所要時間、
結果件数、理由コード、およびインストール環境固有のキーで生成された
アカウント/会話/メッセージ/ターゲットの仮名を追加します。これらの仮名は
相関分析に役立ちますが、匿名化ではありません。状態データベースにはそのキーが含まれますが、
RPC および CLI のエクスポートには含まれません。台帳には、プロンプト、メッセージ本文、
ツール引数、ツール結果、コマンド出力、または生のエラーテキストは保存されません。
実行/ツールの sessionKey 値は生の相関メタデータのままであり、
プラットフォームのアカウント ID またはピア ID を含む場合があります。メッセージレコードではセッションキーを省略します。
受信行では、durationMs はコアディスパッチからその終了までを測定し、
resultCount は確定済みのキュー投入ツール、ブロック、および返信ペイロードを数えます。
送信行では、durationMs は配信所有権の取得から確認応答、
デッドレター、または照合まで(キューでの待機時間を含む)を対象とし、resultCount は
識別された物理的なプラットフォーム送信を数えます。deliveryKind が存在する場合は、
フックとレンダリング後の実効ペイロードを示します。抑制された行、または
クラッシュにより結果が曖昧な行では省略されます。
現在のメッセージ対象範囲には、コアディスパッチに到達した受理済みの受信メッセージが含まれ、
コアでの重複/終了結果も含まれます。送信側では、共有の永続的な
配信に到達した元の論理返信ペイロードごとに、終了行を 1 行書き込みます。チャンク化と
アダプターのファンアウトは resultCount に集約されます。キューに投入された
再試行可能または結果が曖昧な送信は、確認応答、デッドレター、
または照合の後にのみ記録されます。これらの共有境界を迂回する Plugin ローカルおよび
直接送信の経路は、まだ対象外です。上限付きワーカーキューはベストエフォートであり、
障害や飽和時にレコードが欠落する可能性があるため、この機能は
損失のないコンプライアンスアーカイブではありません。
記録はデフォルトで有効であり、
audit.enabled で制御します。メッセージ記録は
audit.messages で個別に制御され、デフォルトは "off" です。
記録を無効にしても、audit.activity.list は以前に書き込まれたレコードを
有効期限が切れるまで引き続き提供します。
出荷済みの audit.list リクエスト、結果、および AuditEvent スキーマは
変更されておらず、エージェント実行およびツールアクションのレコードのみを返します。新しい運用クライアントは、
Gateway が audit.activity.list を公開している場合にそれを呼び出す必要があります。古い
Gateway は、unknown method: audit.activity.list、または出荷済みバージョンでは
メソッド検索より前に認可が行われていたため、読み取りスコープのリクエストに対して
missing scope: operator.admin を報告する場合があります。後者をメソッド不在として扱うのは、
そのメソッドが公開されていなかった場合に限ります。その後、クライアントはフィルターが
メッセージ種類、方向、またはチャンネルのサポートを必要としない場合に限り、
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 は、呼び出し元が指定した認証または配信コンテキストを受け入れるのではなく、 サーバー側のセッションから信頼済みランタイムコンテキストを導出します。
- レスポンスは、有効な一覧をセッションスコープでサーバーが導出した投影であり、 コア、Plugin、チャンネル、および検出済みの 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などの所有者専用コアラッパーでは、tools.invoke自体がoperator.writeであっても、 所有者/管理者のアイデンティティ(operator.admin)が必要です。- レスポンスは、
ok、toolName、オプションのoutput、および型付きerrorフィールドを持つ SDK 向けエンベロープです。承認またはポリシーによる拒否は、 Gateway のツールポリシーパイプラインを迂回せず、ペイロード内でok:falseを返します。
skills.status(operator.read)は、エージェントに表示される Skills 一覧を 取得します。agentIdはオプションです。デフォルトのエージェントワークスペースを読み取るには省略します。- レスポンスには、生のシークレット値を公開することなく、適格性、不足している要件、設定チェック、 およびサニタイズされたインストールオプションが含まれます。
skills.searchとskills.detail(operator.read)は、ClawHub の検出メタデータを返します。skills.upload.begin、skills.upload.chunk、およびskills.upload.commit(operator.admin)は、プライベートな Skills アーカイブをインストール前にステージングします。これは、 信頼済みクライアント用の独立した管理者アップロード経路であり、通常の ClawHub Skills インストールフローではありません。skills.install.allowUploadedArchivesが有効でない限り、 デフォルトでは無効です。skills.upload.begin({ kind: "skill-archive", slug, sizeBytes, sha256?, force?, idempotencyKey? })は、 そのスラッグと force 値にバインドされたアップロードを作成します。skills.upload.chunk({ uploadId, offset, dataBase64 })は、 正確なデコード済みオフセットにバイトを追加します。skills.upload.commit({ uploadId, sha256? })は、最終サイズと SHA-256 を検証します。コミットはアップロードを確定するだけで、Skills をインストールしません。- アップロードされる Skills アーカイブは、
SKILL.mdルートを含む zip アーカイブです。 アーカイブ内部のディレクトリ名がインストール先を選択することはありません。
skills.install(operator.admin)には 3 つのモードがあります。- ClawHub モード:
{ source: "clawhub", slug, version?, force? }は、 Skills フォルダーをデフォルトのエージェントワークスペースのskills/ディレクトリにインストールします。 - アップロードモード:
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }は、 コミット済みアップロードをデフォルトのエージェントワークスペースのskills/<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 モードは、デフォルトのエージェントワークスペースにある追跡対象スラッグ 1 件、 または追跡対象のすべての ClawHub インストールを更新します。
- 設定モードは、
enabled、apiKey、envなどのskills.entries.<skillKey>値にパッチを適用します。
models.list ビュー
models.list は、オプションの view パラメーター
(src/agents/model-catalog-visibility.ts)を受け入れます。
- 省略または
"default":agents.defaults.modelPolicy.allowが設定されている場合、 レスポンスは許可されたカタログとなり、provider/*エントリの 動的に検出されたモデルも含まれます。それ以外の場合、レスポンスは Gateway の 完全なカタログです。 "configured": ピッカー向けの動作です。agents.defaults.modelPolicy.allowが 設定されている場合は、provider/*エントリのプロバイダースコープ検出を含め、 引き続きそれが優先されます。許可リストがない場合、レスポンスは明示的なmodels.providers.<provider>.modelsエントリを使用し、設定済みのモデル行が存在しない場合に限り 完全なカタログへフォールバックします。"provider-config": ソースで定義されたmodels.providers.*.models一覧であり、 ピッカーの許可リストから独立しています。行には公開モデル機能と ルートを考慮した可用性が含まれますが、プロバイダーのエンドポイント、認証情報、および ランタイムリクエスト設定は省略されます。"all":agents.defaults.modelPolicy.allowを迂回する Gateway の完全なカタログです。 通常のモデルピッカーではなく、診断/検出 UI に使用します。
実行の承認
- 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を信頼できるコマンド/cwd/セッションコンテキストとして再利用します。 - 呼び出し元が準備から最終的に承認された
system.runの転送までの間に、command、rawCommand、cwd、agentId、またはsessionKeyを変更した場合、Gateway は変更されたペイロードを信頼せず、実行を拒否します。
エージェント配信のフォールバック
agentリクエストには、外部への配信を要求するためにdeliver=trueを含めることができます。bestEffortDeliver=false(デフォルト)は厳密な動作を維持します。解決できない、または 内部専用の配信先に対してはINVALID_REQUESTを返します。bestEffortDeliver=trueを指定すると、外部配信可能なルートを解決できない場合(たとえば、内部/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 Node プロトコル(現在は v3)を使用できます。軽量な再起動プローブも 同じ N-1 ウィンドウを使用します。この互換性ウィンドウによって、デバイス認証、ペアリング、スコープ、コマンドポリシー、および exec の承認は変更されません。Plugin が所有する Node の ケイパビリティとコマンドは、それらをホストするサーフェスが N-1 契約に含まれないため、Node が現在の プロトコルへアップグレードするまで提供されません。- スキーマとモデルは 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) |
| 事前認証/接続チャレンジのタイムアウト | 15_000 ms |
packages/gateway-client/src/timeouts.ts(OPENCLAW_HANDSHAKE_TIMEOUT_MS env により、ペアとなるサーバー/クライアントの時間枠を延長可能) |
| 初回再接続バックオフ | 1_000 ms |
packages/gateway-client/src/client.ts(GATEWAY_RECONNECT_POLICY) |
| 最大再接続バックオフ | 30_000 ms |
packages/gateway-client/src/client.ts(GATEWAY_RECONNECT_POLICY) |
| デバイストークンによる切断後の高速再試行上限 | 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 タイムアウトによる切断 | 無通信状態が tickIntervalMs * 2 を超えた場合はコード 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 で通知します。クライアントは、
ハンドシェイク前のデフォルト値ではなく、これらの値に従う必要があります。
保留中のすべてのリクエストに期限が設定されている場合、リファレンスクライアントでは、有限のリクエストが
設定された期限を管理します。有限の
timeoutMs がない expectFinal リクエスト、timeoutMs: null を持つリクエスト、または有限リクエストと
無期限リクエストの混在がある場合、tick ウォッチドッグは有効なままになります。受信イベントと
レスポンスが tick タイムアウトのしきい値を超えてもない場合、クライアントは
コード 4000 でソケットを閉じ、保留中のすべてのリクエストを拒否して再接続します。
再接続後に拒否されたリクエストを再実行することはありません。
認証
- 共有シークレットによる 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"など、アイデンティティを伴うモードでは、connect.params.auth.*の代わりにリクエストヘッダーから 接続認証チェックを満たします。 - プライベートイングレスの
gateway.auth.mode: "none"では、共有シークレットによる接続認証を 完全にスキップします。このモードを公開または信頼されていないイングレスに公開しないでください。 - ペアリング後、Gateway は接続のロールとスコープに限定されたデバイストークンを発行し、
hello-ok.auth.deviceTokenで返します。クライアントは、接続に成功するたびに それを永続化する必要があります。 - 保存したデバイストークンで再接続する場合は、そのトークンについて保存済みの 承認済みスコープセットも再利用する必要があります。これにより、すでに付与された読み取り、プローブ、ステータスへのアクセスが 維持され、再接続時に暗黙の管理者専用スコープへ気付かないまま狭められることを 防止できます。
- クライアント側の接続認証の組み立て(
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://は 対象になりません。
- 組み込みのセットアップコードによるブートストラップは、信頼済みモバイルへの引き渡し用に、
プライマリ Node の
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を永続化するのは、接続がwss://やループバック/ローカルペアリングなどの 信頼済みトランスポート上でブートストラップ認証を使用した場合に限ります。- クライアントが明示的な
deviceTokenまたは明示的なscopesを指定した場合、 呼び出し元が要求したそのスコープセットが引き続き優先されます。キャッシュ済みスコープが 再利用されるのは、クライアントが保存済みのデバイスごとのトークンを再利用する場合のみです。 - デバイストークンは、
device.token.rotateおよびdevice.token.revoke(operator.pairingが必要)を使用してローテーションまたは失効できます。 Node またはその他の非オペレーターロールをローテーションまたは失効する場合は、operator.adminも必要です。 device.token.rotateはローテーションのメタデータを返します。置換後の Bearer トークンを返すのは、そのデバイストークンですでに認証されている 同一デバイスからの呼び出しの場合のみです。これにより、トークンのみを使用するクライアントは、再接続前に置換トークンを永続化できます。 共有/管理者によるローテーションでは、Bearer トークンは返されません。- トークンの発行、ローテーション、失効は、そのデバイスのペアリングエントリに記録された 承認済みロールセットの範囲内に制限されます。トークンの変更によって、ペアリング承認で一度も付与されていない デバイスロールへ拡張したり、そのロールを対象にしたりすることはできません。
- ペアリング済みデバイスのトークンセッションでは、呼び出し元が
operator.adminも持っていない限り、デバイス管理は自身に限定されます。管理者以外の呼び出し元が管理できるのは、 自身のデバイスエントリのオペレータートークンのみです。Node およびその他の非オペレータートークンの 管理は、呼び出し元自身のデバイスであっても管理者専用です。 device.token.rotateとdevice.token.revokeは、対象の オペレータートークンのスコープセットも、呼び出し元の現在のセッションスコープと照合します。 管理者以外の呼び出し元は、自身がすでに保持しているものより広いオペレータートークンを ローテーションまたは失効できません。- 認証エラーには、
error.details.codeと復旧のヒントが含まれます:error.details.canRetryWithDeviceToken(真偽値)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は、デバイストークンが認識されたものの、要求された ロール/スコープを満たしていないことを意味します。これを不正なトークンとして表示せず、 再ペアリングするか、より狭い/広いスコープ契約を承認するようオペレーターに促してください。
デバイスアイデンティティとペアリング
- Node は、キーペアのフィンガープリントから導出された安定したデバイスアイデンティティ
(
device.id)を含める必要があります。 - Gateway はデバイスとロールの組み合わせごとにトークンを発行します。
- ローカルでの自動承認が有効でない限り、新しいデバイス ID には ペアリングの承認が必要です。
- ペアリングの自動承認は、直接の local loopback 接続を中心に適用されます。
- OpenClaw には、信頼済みの共有シークレットヘルパーフロー向けに、 バックエンド/コンテナローカルで自己接続する限定的な経路もあります。
- 同一ホストの tailnet または LAN 接続もペアリング上はリモートとして扱われ、 承認が必要です。
- WS クライアントは通常、
connectの際にdeviceアイデンティティを含めます (オペレーター + Node)。デバイスなしのオペレーターに対する唯一の例外は、次の明示的な信頼経路です:gateway.auth.mode: "trusted-proxy"によるオペレーター向け Control UI 認証の成功。- 予約済みの内部ヘルパー経路での、直接ループバック
gateway-clientバックエンド RPC。
- デバイスアイデンティティを省略すると、スコープに影響します。デバイスなしの
オペレーター接続が明示的な信頼経路によって許可されている場合でも、その経路に
名前付きのスコープ保持例外がない限り、OpenClaw は自己申告されたスコープを空のセットに
クリアします。その後、スコープで制限されたメソッドは
missing scopeで失敗します。 - 予約済みの直接ループバック
gateway-clientバックエンドヘルパー経路が スコープを保持するのは、内部のローカルコントロールプレーン 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 ペイロードに署名します。
connect.params.device.nonceで同じ nonce を送信します。- 推奨される署名ペイロードは
v3(packages/gateway-client/src/device-auth.tsのbuildDeviceAuthPayloadV3)です。 これは、デバイス/クライアント/ロール/スコープ/トークン/nonce フィールドに加えて、platformとdeviceFamilyをバインドします。 - 互換性のため、レガシーの
v2署名も引き続き受け入れられますが、 再接続時のコマンドポリシーは、引き続きペアリング済みデバイスのメタデータピン留めによって制御されます。
TLS とピン留め
- WS 接続では TLS がサポートされています(
gateway.tlsの設定)。 - クライアントは、
gateway.remote.tlsFingerprintまたは CLI の--tls-fingerprintを使用して、 Gateway 証明書のフィンガープリントを任意でピン留めできます。
スコープ
このプロトコルは、ステータス、チャンネル、モデル、チャット、
エージェント、セッション、Node、承認など、Gateway API の全機能を公開します。正確な対象範囲は、
packages/gateway-protocol/src/schema.ts から再エクスポートされる TypeBox スキーマによって定義されます。