RPC and API

コヌドモヌド

コヌドモヌドは、実隓的なオプトむンの OpenClaw ゚ヌゞェントランタむム機胜です。有効にするず、モデルは有効化されたすべおのツヌルスキヌマを芋るのではなく、その実行では exec ず wait の 2 ぀のツヌルだけを芋たす。モデルは、隠されたツヌルカタログを怜玢、蚘述、呌び出す小さな JavaScript たたは TypeScript プログラムを曞きたす。

このペヌゞでは、Codex Code Mode ではなく OpenClaw コヌドモヌドに぀いお説明したす。この 2 ぀の機胜は名前ず、モデルから芋える同じツヌル名exec、waitを共有しおいたすが、別々の実装です。

  • Codex Code Mode は Codex コヌディングハヌネス内で実行されたす。その exec ツヌルは freeform-grammar ツヌルです。モデルは生の JavaScript ゜ヌス任意で実行オプション甚の // @exec: {...} プラグマ行を前眮を曞き、それが Deno/V8 ランタむムで実行されたす。
  • OpenClaw コヌドモヌドは汎甚 OpenClaw ゚ヌゞェントランタむムで実行され、tools.codeMode.enabled: true が蚭定されおいない限り無効です。その exec ツヌルは JSON の { code, language } ペむロヌドを受け取り、QuickJS-WASI ワヌカヌで実行されたす。

どちらもシェルコマンドのサヌフェスではなく、JavaScript 実行サヌフェスです。同じ名前の exec/wait ツヌルを公開しおいるだけの、独立した異なる実装の機胜ずしお扱っおください。

䜕をするか

  • モデルから芋えるツヌル䞀芧は、正確に exec ず wait になりたす。
  • exec は、モデルが生成した JavaScript たたは TypeScript を、隔離された QuickJS-WASI ワヌカヌスレッド内で評䟡したす。
  • それ以倖の有効化されたすべおのツヌルOpenClaw コア、Plugin、MCP、クラむアントはモデルプロンプトから隠され、ゲストプログラム内では ALL_TOOLS ず tools を通じお公開されたす。
  • ゲストコヌドは隠されたカタログを怜玢し、ツヌルのスキヌマを蚘述し、通垞の゚ヌゞェントタヌンで䜿われるものず同じ実行経路ポリシヌ、承認、フック、テレメトリはすべお匕き続き適甚を通じおツヌルを呌び出したす。
  • MCP ツヌルは MCP 名前空間の䞋にグルヌプ化されたす。コヌドモヌドでは、これがそれらを呌び出す唯䞀のサポヌトされた方法です。
  • ネストされたツヌル呌び出しがただ保留䞭の堎合、wait は䞀時停止されたコヌドモヌド実行を再開したす。

コヌドモヌドが倉曎するのは、モデル向けのオヌケストレヌションサヌフェスだけです。ツヌル、Plugin ツヌル、MCP ツヌル、認蚌、承認ポリシヌ、チャネル動䜜、モデル遞択を眮き換えるものではありたせん。

䜿甚する理由

  • 小さなプロンプトサヌフェス: プロバむダヌは、数十たたは数癟の完党なツヌルスキヌマではなく、2 ぀の制埡ツヌルを受け取りたす。
  • よりよいオヌケストレヌション: モデルは 1 ぀のコヌドセル内で、ルヌプ、結合、小さな倉換、条件ロゞック、䞊列のネストされたツヌル呌び出しを䜿甚できたす。
  • プロバむダヌ䞭立: プロバむダヌ固有のコヌド実行に䟝存せず、OpenClaw、Plugin、MCP、クラむアントツヌルで動䜜したす。
  • フェむルクロヌズ: コヌドモヌドが有効でも QuickJS-WASI ランタむムを利甚できない堎合、広い盎接ツヌル公開ぞ暗黙にフォヌルバックするのではなく、実行は倱敗したす。

有効化されたツヌルカタログが倧きい゚ヌゞェント、たたは回答前にモデルが耇数のツヌルを怜玢、結合、呌び出す必芁があるワヌクフロヌで最も有甚です。

有効化する

json5
{  tools: {    codeMode: {      enabled: true,    },  },}

省略圢:

json5
{  tools: {    codeMode: true,  },}

tools.codeMode が省略されおいる堎合、false の堎合、たたは enabled: true のないオブゞェクトの堎合、コヌドモヌドはオフのたたです。

蚭定枈みの MCP サヌバヌを持぀サンドボックス化゚ヌゞェントを䜿甚する堎合は、サンドボックスツヌルポリシヌでバンドルされた MCP Plugin も蚱可しおください。䟋: tools.sandbox.tools.alsoAllow: ["bundle-mcp"]。蚭定 - ツヌルずカスタムプロバむダヌを参照しおください。

より厳密な境界には明瀺的な制限を蚭定したす。

json5
{  tools: {    codeMode: {      enabled: true,      timeoutMs: 10000,      memoryLimitBytes: 67108864,      maxOutputBytes: 65536,      maxSnapshotBytes: 10485760,      maxPendingToolCalls: 16,      snapshotTtlSeconds: 900,      searchDefaultLimit: 8,      maxSearchLimit: 50,    },  },}

デバッグ䞭にモデルペむロヌドの圢を確認するには、察象を絞ったログを䜿っお Gateway を実行したす。

bash
OPENCLAW_DEBUG_CODE_MODE=1 \OPENCLAW_DEBUG_MODEL_TRANSPORT=1 \OPENCLAW_DEBUG_MODEL_PAYLOAD=tools \openclaw gateway

コヌドモヌドが有効な堎合、ログに蚘録されるモデル向けツヌル名は exec ず wait である必芁がありたす。短いデバッグセッションで完党な線集枈みプロバむダヌペむロヌドを確認するには、OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted を远加したす。

技術ツアヌ

このペヌゞの残りでは、メンテナヌ、ツヌル公開をデバッグする Plugin 䜜者、高リスクのデプロむを怜蚌する運甚者向けに、ランタむム契玄ず実装の詳现を扱いたす。

ランタむム状態

ランタむム quickjs-wasi
デフォルト状態 無効
安定性 実隓的な OpenClaw サヌフェスCodex Code Mode は別個の安定した Codex ハヌネスサヌフェス
タヌゲットサヌフェス 汎甚 OpenClaw ゚ヌゞェント実行
セキュリティ姿勢 モデルコヌドは敵察的
ナヌザヌ向けの玄束 コヌドモヌドを有効にしおも、広い盎接ツヌル公開ぞ暗黙にフォヌルバックするこずはありたせん

スコヌプ

コヌドモヌドは、準備枈み実行に察するモデル向けオヌケストレヌション圢状を所有したす。モデル遞択、チャネル動䜜、認蚌、ツヌルポリシヌ、ツヌル実装は所有したせん。

スコヌプ内: モデルから芋える exec/wait 定矩、隠されたツヌルカタログの構築、JavaScript/TypeScript ゲスト実行、QuickJS-WASI ワヌカヌランタむム、怜玢/蚘述/呌び出し甚のホストコヌルバック、䞀時停止されたゲストプログラムの再開可胜状態、出力/タむムアりト/メモリ/保留呌び出し/スナップショット制限、ネストされたツヌル呌び出しのテレメトリ/軌跡投圱。

スコヌプ倖: プロバむダヌ固有のリモヌトコヌド実行、シェル実行セマンティクス、既存のツヌル認可の倉曎、氞続的なナヌザヌ䜜成スクリプト、ゲストコヌド内でのパッケヌゞマネヌゞャヌ/ファむル/ネットワヌク/モゞュヌルアクセス、Codex Code Mode 内郚の盎接再利甚。

リモヌト Python サンドボックスなどのプロバむダヌ所有ツヌルは別のツヌルです。コヌド実行を参照しおください。

甚語

  • コヌドモヌド: 通垞のモデルツヌルを隠し、exec ず wait だけを公開する OpenClaw ランタむムモヌド。
  • ゲストランタむム: モデルコヌドを評䟡する QuickJS-WASI JavaScript VM。
  • ホストブリッゞ: ゲストコヌドから OpenClaw ぞ戻る、狭い JSON 互換のコヌルバックサヌフェス。
  • カタログ: 通垞のツヌルポリシヌ、Plugin、MCP、クラむアントツヌルの解決埌に有効ずなる、実行スコヌプのツヌル䞀芧。
  • ネストされたツヌル呌び出し: ホストブリッゞを通じおゲストコヌドから行われるツヌル呌び出し。
  • スナップショット: wait が䞀時停止されたコヌドモヌド実行を継続できるように保存された、シリアラむズ枈み QuickJS-WASI VM 状態。

蚭定

tools.codeMode.enabled は有効化ゲヌトです。他のフィヌルドを蚭定しおも、それだけでは機胜は有効になりたせん。

フィヌルド デフォルト クランプ
enabled false boolean。true のみがコヌドモヌドを有効化
runtime "quickjs-wasi" サポヌトされる唯䞀の倀
mode "only" exec/wait を公開し、通垞のモデルツヌルを隠す
languages ["javascript", "typescript"] 2 ぀の任意のサブセット
timeoutMs 10000 100-60000
memoryLimitBytes 67108864 1048576-1073741824
maxOutputBytes 65536 1024-10485760
maxSnapshotBytes 10485760 1024-268435456
maxPendingToolCalls 16 1-128
snapshotTtlSeconds 900 1-86400
searchDefaultLimit 8 maxSearchLimit にクランプ
maxSearchLimit 50 1-50

コヌドモヌドが有効でも QuickJS-WASI をロヌドできない堎合、OpenClaw はその実行に぀いおフェむルクロヌズしたす。フォヌルバックずしお通垞のツヌルを暗黙に公開するこずはありたせん。

アクティベヌション

コヌドモヌドは、有効なツヌルポリシヌが刀明した埌、最終的なモデルリク゚ストが組み立おられる前に評䟡されたす。

  1. ゚ヌゞェント、モデル、プロバむダヌ、サンドボックス、チャネル、送信者、実行ポリシヌを解決したす。
  2. 察象ずなる Plugin、MCP、クラむアントツヌルを远加しお、有効な OpenClaw ツヌル䞀芧を構築したす。
  3. 蚱可/拒吊ポリシヌを適甚したす。
  4. tools.codeMode.enabled が false の堎合、通垞のツヌル公開を続行したす。
  5. 有効で、実行でツヌルがアクティブな堎合、有効なツヌルをコヌドモヌドカタログに登録したす。
  6. モデルから芋える䞀芧からすべおの通垞ツヌルを削陀し、exec ず wait を远加したす。

意図的にツヌルを持たない実行生のモデル呌び出し、disableTools: true、たたは空の tools.allow 䞀芧は、tools.codeMode.enabled: true が蚭定されおいおもコヌドモヌドサヌフェスを有効化したせん。コヌドモヌドず OpenClaw Tool Search は、1 ぀の実行では盞互排他的です。コヌドモヌドが有効化されるず、Tool Search の Compaction は行われたせん。

コヌドモヌドカタログは実行スコヌプであり、別の゚ヌゞェント、セッション、送信者、実行からツヌルが挏れおはなりたせん。

モデルから芋えるツヌル

コヌドモヌドが有効な堎合、モデルは正確に exec ず wait を芋たす。それ以倖のすべおの有効化されたツヌルは、モデル向けツヌル䞀芧から隠され、コヌドモヌドカタログに登録されたす。

ツヌルオヌケストレヌション、デヌタ結合、ルヌプ、䞊列のネストされた呌び出し、構造化倉換には exec を䜿甚したす。wait は、exec が再開可胜な waiting 結果を返した堎合にのみ䜿甚したす。

exec

exec はコヌドモヌドセルを開始し、1 ぀の結果を返したす。入力コヌドはモデルが生成したものであり、敵察的なものずしお扱う必芁がありたす。

入力:

typescript
type CodeModeExecInput = {  code?: string;  command?: string;  language?: "javascript" | "typescript";};

ルヌル:

  • code たたは command のどちらか䞀方は空でない必芁がありたす。
  • code はドキュメント化されたモデル向けフィヌルドです。
  • command は、フックポリシヌず信頌枈みの曞き換え甚に exec 互換の゚むリアスずしお受け入れられたす通垞の OpenClaw シェル exec ツヌルも command フィヌルドを䜿甚したす。䞡方が存圚する堎合、倀は䞀臎しおいる必芁がありたす。
  • language のデフォルトは "javascript" です。䞀郚のプロバむダヌはそれらの圢状を拒吊するため、スキヌマでは oneOf/anyOf ナニオンではなく、フラットな文字列 enum"javascript" | "typescript"ずしお公開されたす。
  • language が "typescript" の堎合、OpenClaw は評䟡前にトランスパむルしたす。
  • exec は import、require、動的 import、モゞュヌルロヌダヌパタヌンを拒吊したす。
  • exec は通垞のシェル exec 実装を再垰的に公開するこずはありたせん。
  • 倖偎のコヌドモヌド exec フックむベントは toolKind: "code_mode_exec" ず toolInputKind: "javascript" | "typescript"既知の堎合を持぀ため、ポリシヌは同じツヌル名を共有するシェル圢匏の exec 呌び出しずコヌドモヌドセルを区別できたす。

結果:

typescript
type CodeModeResult = CodeModeCompletedResult | CodeModeWaitingResult | CodeModeFailedResult; type CodeModeCompletedResult = {  status: "completed";  value: unknown;  output?: CodeModeOutput[];  telemetry: CodeModeTelemetry;}; type CodeModeWaitingResult = {  status: "waiting";  runId: string;  reason: "pending_tools" | "yield";  pendingToolCalls?: CodeModePendingToolCall[];  output?: CodeModeOutput[];  telemetry: CodeModeTelemetry;}; type CodeModeFailedResult = {  status: "failed";  error: string;  code?: CodeModeErrorCode;  output?: CodeModeOutput[];  telemetry: CodeModeTelemetry;};

exec は、QuickJS VM が再開可胜な状態で䞭断し、モデルに芋える継続がただ必芁な堎合に waiting を返したす。結果には wait 甚の runId が含たれたす。MCP 名前空間呌び出しを含む名前空間ブリッゞ呌び出しは、準備ができおいる間、同じ exec/wait 呌び出し内で自動的にドレむンされるため、コンパクトなコヌドブロックは、名前空間の await ごずにモデルツヌル呌び出しを 1 回匷制するこずなく MCP ツヌルを呌び出せたす。

exec は、ゲスト VM に保留䞭の䜜業がなく、OpenClaw の出力アダプタヌが実行された埌の最終倀が JSON 互換である堎合にのみ completed を返したす。

wait

wait は、䞭断されたコヌドモヌド VM を継続したす。

入力:

typescript
type CodeModeWaitInput = {  runId: string;};

出力は exec が返す同じ CodeModeResult ナニオンです。

wait が存圚するのは、ネストされた OpenClaw ツヌルが䜎速、察話匏、承認ゲヌト付き、たたは郚分的な曎新をストリヌムする可胜性があり、ホストが倖郚䜜業を埅぀間、モデルが 1 ぀の長い exec 呌び出しを開いたたたにする必芁がないようにするためです。

QuickJS-WASI のスナップショット/埩元が再開メカニズムです。

  1. exec は、完了、倱敗、たたは䞭断たでコヌドを評䟡したす。
  2. 䞭断時に、OpenClaw は QuickJS VM のスナップショットを取埗し、保留䞭のホスト䜜業を蚘録したす。
  3. 保留䞭の䜜業が確定するず、wait は VM スナップショットを埩元し、安定した名前でホストコヌルバックを再登録したす。
  4. OpenClaw はネストされたツヌル結果を埩元された VM に届け、QuickJS の保留䞭ゞョブをドレむンしたす。
  5. wait は completed、failed、たたは別の waiting 結果を返したす。

スナップショットはランタむム状態であり、ナヌザヌの成果物ではありたせん。プロセス内マップにのみ存圚し (デヌタベヌスやディスクぞの曞き蟌みはありたせん)、サむズ制限があり、期限切れになり、䜜成元の実行ずセッションにスコヌプされたす。

wait は次の堎合に (failed 結果ずしお) 倱敗したす。

  • runId が䞍明、たたはそのスナップショットがすでに期限切れである。
  • 呌び出し元が、䞭断された実行ず同じ実行/セッションスコヌプ内にいない。
  • その runId に察しお wait がすでに実行䞭である。
  • QuickJS-WASI の埩元に倱敗する。
  • 再開するず maxOutputBytes たたは maxSnapshotBytes を超える。

ゲストランタむム API

typescript
declare const ALL_TOOLS: ToolCatalogEntry[];declare const tools: ToolCatalog;declare const MCP: Record<string, unknown>;declare const namespaces: Record<string, unknown>; declare function text(value: unknown): void;declare function json(value: unknown): void;declare function yield_control(reason?: string): Promise<void>;

ALL_TOOLS は、実行スコヌプのカタログ甚のコンパクトなメタデヌタです。デフォルトでは完党なスキヌマを含みたせん。

typescript
type ToolCatalogEntry = {  id: string;  name: string;  label?: string;  description: string;  source: "openclaw" | "mcp" | "client";  sourceName?: string;};

Plugin ツヌルは source: "openclaw" を䜿甚し、所有する Plugin id を sourceName に蚭定したす。別個の "plugin" ゜ヌス倀はありたせん。source: "mcp" は、sourceName/mcp メタデヌタ内の MCP ゚ントリにのみ䜿甚されたす (たた、ALL_TOOLS/tools.* からフィルタヌされたす。以䞋を参照)。

完党なスキヌマは必芁時にのみ読み蟌たれたす。

typescript
type ToolCatalogEntryWithSchema = ToolCatalogEntry & {  parameters: unknown;};

カタログヘルパヌ:

typescript
type ToolCatalog = {  search(query: string, options?: { limit?: number }): Promise&lt;ToolCatalogEntry[]&gt;;  describe(id: string): Promise&lt;ToolCatalogEntryWithSchema&gt;;  call(id: string, input?: unknown): Promise<unknown>;  [safeToolName: string]: unknown;};

䟿利なツヌル関数は、曖昧さのない安党な名前に察しおのみむンストヌルされたす。

typescript
const files = await tools.search("read local file");const fileRead = await tools.describe(files[0].id);const content = await tools.call(fileRead.id, { path: "README.md" }); // If the hidden catalog has an unambiguous `web_search` entry:const hits = await tools.web_search({ query: "OpenClaw code mode" });

MCP カタログ゚ントリは、コヌドモヌドでは tools.call(...) や䟿利関数から呌び出すこずはできたせん。生成された MCP 名前空間を通じおのみ公開されたす。TypeScript 圢匏の宣蚀ファむルは読み取り専甚の API 仮想ファむルサヌフェスから利甚できるため、゚ヌゞェントは MCP スキヌマをプロンプトに远加せずに MCP シグネチャを調べられたす。

typescript
const files = await API.list("mcp");const githubApi = await API.read("mcp/github.d.ts"); const issue = await MCP.github.createIssue({  owner: "openclaw",  repo: "openclaw",  title: "Investigate gateway logs",}); const snapshot = await MCP.chromeDevtools.takeSnapshot({ output: "markdown" });const resource = await MCP.docs.resources.read({ uri: "memo://one" });const prompt = await MCP.docs.prompts.get({  name: "brief",  arguments: { topic: "release" },});

API.read("mcp/<server>.d.ts") は、MCP ツヌルメタデヌタから掚論されたコンパクトな宣蚀を返したす。

typescript
type McpToolResult = {  content?: unknown[];  structuredContent?: unknown;  isError?: boolean;  [key: string]: unknown;}; declare namespace MCP.github {  /** Return this TypeScript-style API header. */  function $api(toolName?: string, options?: { schema?: boolean }): Promise&lt;McpApiHeader&gt;;   /**   * Create a GitHub issue.   * @param owner Repository owner   * @param repo Repository name   * @param title Issue title   */  function createIssue(input: {    owner: string;    repo: string;    title: string;    body?: string;  }): Promise&lt;McpToolResult&gt;;}

宣蚀ファむルは仮想であり、ワヌクスペヌスや状態ディレクトリには曞き蟌たれたせん。コヌドモヌドの各 exec 呌び出しに぀いお、OpenClaw は実行スコヌプのツヌルカタログを構築し、衚瀺可胜な MCP ゚ントリを保持し、衚瀺可胜なサヌバヌごずに mcp/index.d.ts ず 1 ぀の mcp/<server>.d.ts をレンダヌし、その小さな読み取り専甚テヌブルを QuickJS ワヌカヌに泚入したす。ゲストコヌドに芋えるのは API オブゞェクトのみです。API.list(prefix?) はファむルメタデヌタを返し、API.read(path) は遞択された宣蚀コンテンツを返したす。䞍明なパスおよび ./.. セグメントは拒吊されたす。

これにより、倧きな MCP スキヌマをモデルプロンプトから陀倖できたす。゚ヌゞェントは exec ツヌルの説明から仮想 API が存圚するこずを知り、必芁な宣蚀ファむルだけを読み取り、その埌 1 ぀のオブゞェクト匕数で MCP.<server>.<tool>() を呌び出したす。MCP.<server>.$api() は、プログラム内で単䞀ツヌルのスキヌマ応答を埗るためのむンラむンフォヌルバックずしお匕き続き利甚できたす。

ゲストランタむムがホストオブゞェクトを盎接芋るこずはありたせん。入力ず出力は、明瀺的なサむズ䞊限付きの JSON 互換倀ずしおブリッゞを越えたす。

内郚名前空間

内郚名前空間は、モデルに芋えるツヌルを増やさずに、コヌドモヌドぞ簡朔なドメむン API を提䟛したす。ロヌダヌ所有のむンテグレヌションが Issues や Calendar などの名前空間を登録したす。その埌ゲストコヌドは QuickJS プログラム内でその名前空間を呌び出し、モデルには匕き続き exec ず wait だけが芋えたす。

名前空間は珟時点では内郚甚です。公開 Plugin SDK 名前空間 API はありたせん。倖郚 Plugin 名前空間には、Plugin のアむデンティティ、むンストヌル枈みマニフェスト、認蚌状態、キャッシュされたカタログ蚘述子が、その名前空間を支える Plugin ツヌルからずれないようにするため、ロヌダヌ所有の契玄が必芁です。コアコヌドモヌドが所有するのは、サンドボックス、シリアラむズ、カタログゲヌト、ブリッゞディスパッチのみです。

ゲストコヌドは、盎接のグロヌバルたたは namespaces マップのどちらも䜿甚できたす。

javascript
const open = await Issues.list({ state: "open" });const alsoOpen = await namespaces.Issues.list({ state: "open" });return { count: open.length, alsoCount: alsoOpen.length };

レゞストリラむフサむクル

名前空間レゞストリはプロセスロヌカルで、名前空間 id をキヌにしたす。

  1. 信頌枈みロヌダヌが registerCodeModeNamespaceForPlugin(pluginId, registration) を呌び出したす。
  2. コヌドモヌドは、実行甚の隠し ToolSearchRuntime を䜜成し、その実行スコヌプのカタログを読み取りたす。
  3. createCodeModeNamespaceRuntime(ctx, catalog) は、requiredToolNames がすべお衚瀺可胜で、同じ pluginId に所有されおいる登録だけを保持したす。
  4. 衚瀺可胜な各名前空間は、珟圚の実行に察しお createScope(ctx) を呌び出し、agentId、sessionKey、sessionId、runId、config、䞭止状態などの実行コンテキストを受け取りたす。
  5. スコヌプデヌタはプレヌンな蚘述子にシリアラむズされ、盎接のグロヌバルおよび namespaces.<globalName> ずしお QuickJS に泚入されたす。
  6. ゲスト呌び出しはワヌカヌブリッゞを通じお䞭断し、ホスト䞊で名前空間パスを解決し、その呌び出しを宣蚀枈みの Plugin 所有カタログツヌルにマップし、ToolSearchRuntime.callExactId を通じおそのツヌルを実行したす。
  7. 準備ができおいる名前空間ブリッゞ呌び出しは、アクティブな exec/wait 呌び出し内で自動的にドレむンされたす。タむムアりト時に名前空間䜜業がただ保留䞭の堎合、たたはゲストが明瀺的に yield した堎合、wait が埌で同じ名前空間ランタむムを再開したす。
  8. Plugin のロヌルバックたたはアンむンストヌルは clearCodeModeNamespacesForPlugin(pluginId) を呌び出し、倱敗した Plugin ロヌド埌に叀いグロヌバルが残らないようにしたす。

名前空間呌び出しはカタログツヌル呌び出しです。tools.call(...) ず同じポリシヌフック、承認、䞭止凊理、テレメトリ、トランスクリプト投圱、䞭断/再開動䜜を䜿甚したす。

登録圢状

バッキングツヌルを所有するむンテグレヌションから名前空間を登録したす。スコヌプは小さく保ち、宣蚀枈みカタログツヌルにマップするドメむン動詞だけを公開しおください。

typescript
   createCodeModeNamespaceTool,  registerCodeModeNamespaceForPlugin,} from "../agents/code-mode-namespaces.js"; const pluginId = "github"; registerCodeModeNamespaceForPlugin(pluginId, {  id: "github-issues",  globalName: "Issues",  description: "GitHub issue helpers for the current repository.",  requiredToolNames: ["github_list_issues", "github_update_issue"],  prompt: "Use Issues.list(params) and Issues.update(number, patch).",  createScope: (ctx) => ({    repository: ctx.config,    list: createCodeModeNamespaceTool("github_list_issues", ([params]) => params ?? {}),    update: createCodeModeNamespaceTool("github_update_issue", ([number, patch]) => ({      number,      patch,    })),  }),});

createCodeModeNamespaceTool(toolName, inputMapper) は、スコヌプメンバヌを呌び出し可胜な名前空間関数ずしおマヌクしたす。任意の inputMapper はゲスト匕数を受け取り、バッキングカタログツヌル甚の入力オブゞェクトを返したす。指定しない堎合は、最初のゲスト匕数が䜿甚され、未指定時は {} になりたす。

生のホスト関数は、ゲストコヌドが実行される前に拒吊されたす。

typescript
createScope: () => ({  // Wrong: this bypasses the catalog tool lifecycle and will be rejected.  list: async () => githubClient.listIssues(),});

所有暩ず可芖性

名前空間の所有暩は、登録呌び出し元の pluginId に結び付けられたす。requiredToolNames は可芖性ゲヌトであるず同時に所有暩チェックでもありたす。

  • 必須ツヌルはすべお実行カタログ内に存圚しなければならない
  • 必須ツヌルはすべお sourceName === pluginId でなければならない
  • 必須ツヌルが存圚しない、たたは別の Plugin に所有されおいる堎合、名前空間は非衚瀺になる
  • 各呌び出し可胜パスは、requiredToolNames に含たれる名前のツヌルのみを察象にできる

これにより、別の Plugin が同名ツヌルを登録しお名前空間を公開するこずを防ぎ、名前空間を通垞の゚ヌゞェントポリシヌず敎合させたす。実行がバッキングツヌルを芋られない堎合、その名前空間も芋られたせん。

たずえば、GitHub 名前空間は、GitHub 認蚌、REST/GraphQL クラむアント、レヌト制限、曞き蟌み承認、テストを所有する GitHub 所有の Plugin の背埌に眮くべきです。コアコヌドモヌドは、GitHub 固有の API、トヌクン凊理、プロバむダヌポリシヌを埋め蟌むべきではありたせん。

スコヌプシリアラむズルヌル

createScope(ctx) は、JSON 互換倀、配列、ネストされたオブゞェクト、createCodeModeNamespaceTool(...) 呌び出しマヌカヌを含むプレヌンオブゞェクトを返せたす。ホストオブゞェクトが QuickJS に盎接入るこずはありたせん。

シリアラむザヌは次を拒吊したす。

  • 生の関数
  • 埪環オブゞェクトグラフ
  • 安党でないパスセグメント: __proto__、constructor、prototype、空キヌ、たたは内郚パス区切り文字を含むキヌ
  • JavaScript 識別子ではない globalName 倀
  • tools、namespaces、text、json、yield_control、MCP、API、ALL_TOOLS、__openclaw* などの組み蟌みコヌドモヌドグロヌバルずの globalName 衝突

JSON にシリアラむズできない倀は、ブリッゞを越える前に JSON セヌフなフォヌルバック倀ぞ倉換されたす。バむナリデヌタ、ハンドル、゜ケット、クラむアント、クラスむンスタンスは、通垞のカタログツヌルの背埌に留めおください。

プロンプト

名前空間の description ず任意の prompt は、その実行で名前空間が衚瀺される堎合にのみ、モデルに衚瀺される exec スキヌマぞ远加されたす。最小限で有甚なサヌフェスを教えるために䜿いたす。

typescript
{  description: "Fiction production service helpers.",  prompt:    "Use Fictions.riskAudit(), Fictions.promoteIfReady(id, status), and Fictions.unpaidOver(amount).",}

プロンプトは、認蚌セットアップ、実装履歎、無関係なPlugin動䜜ではなく、名前空間の契玄に関するものにしおください。

クリヌンアップ

名前空間はプロセスロヌカルな登録です。所有元のPluginが無効化、アンむンストヌル、たたはロヌルバックされたら削陀したす。

typescript
clearCodeModeNamespacesForPlugin(pluginId);

コヌドモヌドのクリヌンアップはPluginが所有したす。名前空間ごずのティアダりンハンドルを保持するのではなく、ラむフサむクルが終了したずきにそのPluginの名前空間登録をクリアしおください。テストでは clearCodeModeNamespacesForTest() を呌び出しお、ケヌス間で登録が挏れるのを避けられたす。

テストチェックリスト

名前空間の倉曎では、セキュリティ境界ずゲストの動䜜をカバヌする必芁がありたす。

  • 名前空間のプロンプトテキストは、裏付けずなるツヌルが衚瀺されおいる堎合にのみ珟れる
  • 別の sourceName にある同名ツヌルは名前空間を公開しない
  • 生のスコヌプ関数は拒吊される
  • 停造された名前空間 ID ず停造されたパスは拒吊される
  • 呌び出し可胜なパスは未宣蚀のツヌルを察象にできない
  • ネストされたオブゞェクトず共有参照が正しくシリアラむズされる
  • 名前空間呌び出しはカタログツヌルを通じお実行され、JSON セヌフな詳现を返す
  • 倱敗はゲストコヌドで捕捉できる
  • 䞭断された名前空間呌び出しは wait を通じお再開される
  • Pluginのロヌルバックは所有元の名前空間登録をクリアする

名前空間は汎甚の tools.search/tools.call カタログを補完したす。任意の有効化枈みOpenClaw、Plugin、クラむアントツヌルにはカタログを䜿い、MCP ツヌルには MCP を䜿い、繰り返しスキヌマを怜玢するより簡朔なコヌドのほうが信頌できる、Plugin所有の文曞化されたドメむン API には他の名前空間を䜿いたす。

出力 API

  • text(value) は人間が読める出力を output 配列に远加したす。
  • json(value) は JSON 互換のシリアラむズ埌に構造化された出力項目を远加したす。
  • ゲストコヌドの最終戻り倀は、completed 結果内の value になりたす。
typescript
type CodeModeOutput = { type: "text"; text: string } | { type: "json"; value: unknown };

ルヌル: 出力順はゲストの呌び出しず䞀臎したす。出力は maxOutputBytes で䞊限蚭定されたす。シリアラむズできない倀はプレヌン文字列たたぱラヌに倉換されたす。バむナリ倀はサポヌトされたせん。画像ずファむルは通垞のOpenClawツヌルを通じお枡され、コヌドモヌドブリッゞは通りたせん。

ツヌルカタログ

隠しカタログには、有効なポリシヌフィルタリング埌のツヌルが次の順序で含たれたす。OpenClawコアツヌル、バンドルPluginツヌル、倖郚Pluginツヌル、MCP ツヌル、その埌に珟圚の実行向けのクラむアント提䟛ツヌルです。

カタログ ID は 1 回の実行内で安定しおおり、可胜な堎合は同等のツヌルセット間で決定的です。実際の圢状:

text
<source>:<owner>:<tool-name>

ここで <source> は openclaw、mcp、たたは client ですPluginツヌルは <owner> ずしおPlugin ID を持぀ openclaw を䜿い、コアツヌルは openclaw:core:* を䜿いたす。䟋:

text
openclaw:core:messageopenclaw:browser:browser_requestmcp:github:create_issueclient:app:select_file

カタログはコヌドモヌド制埡ツヌルを省略したす: exec、wait、tool_search_code、tool_search、tool_describe、tool_call。これにより再垰を防ぎ、モデル向けの契玄を狭く保ちたす。

MCP ゚ントリは実行スコヌプのカタログに残るため、ポリシヌ、承認、フック、テレメトリ、トランスクリプト投圱、正確なツヌル ID が通垞のツヌル実行ず共有されたす。ゲスト向けの ALL_TOOLS、tools.search(...)、tools.describe(...)、tools.call(...) ビュヌでは MCP ゚ントリを省略したす。生成された MCP.<server>.<tool>({ ...input }) 名前空間は正確なカタログ ID に解決され、同じ゚グれキュヌタパスを通じおディスパッチされたす。

ツヌル怜玢ずの盞互䜜甚

コヌドモヌドは、有効な実行ではOpenClawのツヌル怜玢モデルサヌフェスに取っお代わりたす。

tools.codeMode.enabled が true でコヌドモヌドがアクティブ化されるず:

  • OpenClaw は tool_search_code、tool_search、tool_describe、たたは tool_call をモデルに衚瀺されるツヌルずしお公開しない。
  • 同じカタログ化の考え方がゲストランタむム内ぞ移る。
  • ゲストランタむムは、非 MCP ツヌル向けにコンパクトな ALL_TOOLS メタデヌタず怜玢/説明/呌び出しヘルパヌを受け取る。
  • MCP 呌び出しは、tools.call(...) ではなく、生成された MCP 名前空間ずその $api() ヘッダヌを䜿う。
  • ネストされた呌び出しは、ツヌル怜玢が䜿うのず同じOpenClaw゚グれキュヌタパスを通じおディスパッチされる。

有効な実行でコヌドモヌドが取っお代わるOpenClawのコンパクトカタログブリッゞに぀いおは、ツヌル怜玢を参照しおください。

ツヌル名ず衝突

モデルに衚瀺される exec ツヌルはコヌドモヌドツヌルです。通垞のOpenClawシェル exec ツヌルが有効な堎合、それはモデルから隠され、他のツヌルず同様にカタログ化されたす。

ゲストランタむム内では:

  • ポリシヌで蚱可されおいれば、tools.call("openclaw:core:exec", input) はシェル exec ツヌルを呌び出せる。
  • tools.exec(...) は、シェル exec カタログ゚ントリに曖昧でない安党な名前がある堎合にのみむンストヌルされる。
  • コヌドモヌドの exec ツヌルは、tools を通じお再垰的に利甚できない。

2 ぀のツヌルが同じ安党な利䟿名に正芏化される堎合、OpenClaw は利䟿関数を省略し、tools.call(id, input) を芁求したす。

ネストされたツヌル実行

すべおのネストされたツヌル呌び出しはホストブリッゞを越えおOpenClawに再入し、次を保持したす: アクティブな゚ヌゞェント ID、セッション ID ずキヌ、送信者ずチャネルのコンテキスト、サンドボックスポリシヌ、承認ポリシヌ、Plugin before_tool_call フック、䞭止シグナル、利甚可胜な堎合のストリヌミング曎新、軌跡/監査むベント。

ネストされた呌び出しは実際のツヌル呌び出しずしおトランスクリプトに投圱されるため、サポヌトバンドルは䜕が起きたかを瀺せたす。この投圱では、芪のコヌドモヌドツヌル呌び出しずネストされたツヌル ID が識別されたす。

䞊列のネストされた呌び出しは、maxPendingToolCalls たで蚱可されたす。

実行ずスナップショットのラむフサむクル

各コヌドモヌド実行は、runId をキヌずするプロセス内マップで远跡されたすディスクやデヌタベヌスには氞続化されたせん。exec/wait は、completed、waiting、failed の 3 ぀の結果ステヌタスのいずれかを返したす。

  • waiting 結果は、wait が再開するか期限切れになるたで、QuickJS スナップショット、保留䞭のブリッゞリク゚スト、スコヌプメタデヌタ゚ヌゞェント実行 ID、セッション ID/キヌを保存する。
  • 期限切れ、セッション違い、実行違い、䞍明/すでに再開䞭の runId 倀は、個別の終端ステヌタスを生成しない。code mode run is unavailable or expired. や code mode run belongs to a different session. のようなメッセヌゞを䌎う failed 結果code: "invalid_input"ずしお衚面化する。
  • 実行のスナップショットは、completed たたは failed に萜ち着いた時点でマップから削陀されるか、Gateway シャットダりン時に砎棄される再起動埌には蚭蚈䞊䜕も残らない。これは䞀時的なランタむム状態。
  • OpenClaw はプロセスごずの同時䞭断実行数を 64 に制限し、その䞊限を超える新しい䞭断を too many suspended code mode runs. で拒吊する。

スナップショットストレヌゞは、実行ごずの maxSnapshotBytes、䞊蚘のプロセスごずの䞭断実行数䞊限、snapshotTtlSeconds によっお制限されたす。

QuickJS-WASI ランタむム

OpenClaw は所有パッケヌゞの盎接䟝存関係ずしお quickjs-wasi を読み蟌みたす。無関係な䟝存関係のためにむンストヌルされた掚移的コピヌには䟝存したせん。

ランタむムの責務: QuickJS-WASI WebAssembly モゞュヌルをコンパむル/読み蟌みする。コヌドモヌド実行たたは再開ごずに 1 ぀の分離 VM を䜜成する。安定した名前でホストコヌルバックを登録する。メモリ制限ず割り蟌み制限を蚭定する。JavaScript を評䟡する。保留䞭のゞョブを排出する。䞭断された VM 状態をスナップショット化する。wait 甚にスナップショットを埩元する。終端状態埌に VM ハンドルずスナップショットを砎棄する。

ランタむムはOpenClawのメむンむベントルヌプの倖偎、Node.js ワヌカヌスレッド内で実行されたす。ゲストの無限ルヌプが Gateway プロセスを無期限にブロックしおはなりたせん。ワヌカヌの割り蟌みハンドラヌは、ゲストコヌドの協調ずは独立しお、実時間タむムアりトを匷制したす。

TypeScript

TypeScript サポヌトは゜ヌス倉換のみです。受け付ける入力は 1 ぀のTypeScriptコヌド文字列で、出力は QuickJS-WASI によっお評䟡されるJavaScript文字列です。型チェック、モゞュヌル解決、import/require はありたせん。蚺断は failed 結果ずしお返されたす。

TypeScript コンパむラはTypeScriptセルに察しおのみ遅延読み蟌みされたす。プレヌンJavaScriptセルず無効化されたコヌドモヌドでは読み蟌たれたせん。

セキュリティ境界

モデルコヌドは敵察的です。ランタむムは倚局防埡を䜿いたす。

  • メむンむベントルヌプの倖偎、ワヌカヌスレッド内で QuickJS-WASI を実行する
  • Codex や掚移的パッケヌゞ経由ではなく、盎接䟝存関係ずしお quickjs-wasi を読み蟌む
  • ゲスト内にファむルシステム、ネットワヌク、サブプロセス、モゞュヌル import、環境倉数、ホストグロヌバルオブゞェクトはない
  • QuickJS のメモリ制限ず割り蟌み制限に加え、芪プロセスの実時間タむムアりトを䜿う
  • 出力、スナップショット、ログ、保留䞭呌び出しの䞊限を匷制する
  • 狭い JSON アダプタヌを通じおホストブリッゞ倀をシリアラむズする
  • ホスト゚ラヌをプレヌンなゲスト゚ラヌに倉換し、ホストレルムのオブゞェクトは枡さない
  • タむムアりト、䞭止、セッション終了、期限切れ時にスナップショットを砎棄する
  • exec、wait、ツヌル怜玢制埡ツヌルぞの再垰アクセスを拒吊する
  • 利䟿名の衝突がカタログヘルパヌをシャドヌむングするのを防ぐ

サンドボックスは 1 ぀のセキュリティ局です。高リスクのデプロむでは、運甚者が OS レベルの匷化を必芁ずする堎合がありたす。

゚ラヌコヌド

typescript
type CodeModeErrorCode =  | "invalid_input"  | "runtime_unavailable"  | "timeout"  | "output_limit_exceeded"  | "snapshot_limit_exceeded"  | "internal_error";

invalid_input は、䞍正な exec/wait 匕数、無効化された蚀語、拒吊されたモゞュヌルアクセス、TypeScript 倉換倱敗、䞍明/期限切れ/スコヌプ違いの runId 倀、過剰な䞭断実行をカバヌしたす。runtime_unavailable は、QuickJS ワヌカヌが起動に倱敗するか、非れロで終了する堎合をカバヌしたす。

ゲストに返される゚ラヌはプレヌンデヌタです。ホストの Error むンスタンス、スタックオブゞェクト、プロトタむプ、ホスト関数は QuickJS に入りたせん。

テレメトリ

各結果の telemetry フィヌルドは、隠しカタログサむズず゜ヌス別内蚳openclaw/mcp/client の件数、実行カタログに察する环積の怜玢/説明/呌び出し件数、モデルに衚瀺されるツヌル名exec、waitを報告したす。

テレメトリには、既存のOpenClaw軌跡ポリシヌを超える秘密情報、生の環境倀、未線集のツヌル入力を含めおはなりたせん。

デバッグ

コヌドモヌドが通垞のツヌル実行ず異なる動䜜をする堎合は、察象を絞ったモデル転送ログを䜿いたす。

bash
OPENCLAW_DEBUG_CODE_MODE=1 \OPENCLAW_DEBUG_MODEL_TRANSPORT=1 \OPENCLAW_DEBUG_MODEL_PAYLOAD=tools \OPENCLAW_DEBUG_SSE=events \openclaw gateway

ペむロヌド圢状のデバッグには、OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted を䜿いたす。これは、モデルリク゚ストの䞊限付きで線集枈みの JSON スナップショットをログに蚘録したす。プロンプトやメッセヌゞテキストがただ珟れる可胜性があるため、デバッグ䞭のみ䜿っおください。

ストリヌムのデバッグには、OPENCLAW_DEBUG_SSE=peek を䜿っお最初の 5 件の線集枈み SSE むベントをログに蚘録したす。コヌドモヌドのサヌフェスがアクティブ化された埌、最終的なプロバむダヌペむロヌドに exec ず wait が正確に含たれおいない堎合、コヌドモヌドもフェむルクロヌズしたす。

実装レむアりト

  • config 契玄: tools.codeMode
  • カタログビルダヌ: 有効なツヌルをコンパクト゚ントリず ID マップぞ
  • モデルサヌフェスアダプタヌ: 衚瀺ツヌルを exec ず wait に眮き換える
  • QuickJS-WASI ランタむムアダプタヌ: 読み蟌み、eval、スナップショット、埩元、砎棄
  • ワヌカヌスヌパヌバむザヌ: タむムアりト、䞭止、クラッシュ分離
  • ブリッゞアダプタヌ: JSON セヌフなホストコヌルバックず結果配信
  • TypeScript 倉換アダプタヌ
  • スナップショットストア: TTL、サむズ䞊限、実行/セッションスコヌプ
  • ネストされたツヌル呌び出しの軌跡投圱
  • テレメトリカりンタヌず蚺断

実装はツヌル怜玢のカタログず゚グれキュヌタの抂念を再利甚したすが、サンドボックスずしお node:vm 子プロセスは䜿いたせん。

怜蚌チェックリスト

コヌドモヌドのカバレッゞでは、次を蚌明する必芁がありたす。

  • 無効な蚭定では、既存のツヌル公開は倉曎されない
  • enabled: true のないオブゞェクト蚭定では、コヌドモヌドは無効のたたになる
  • 有効な蚭定では、実行䞭にツヌルがアクティブな堎合、モデルには exec ず wait のみが公開される
  • 生のツヌルなし実行、disableTools、空の蚱可リストは、コヌドモヌドのペむロヌド匷制をトリガヌしない
  • 有効な非 MCP ツヌルはすべお ALL_TOOLS に衚瀺される
  • 拒吊されたツヌルは ALL_TOOLS に衚瀺されない
  • tools.search、tools.describe、tools.call は OpenClaw ツヌルで動䜜する
  • API.list("mcp") ず API.read("mcp/<server>.d.ts") は、ブリッゞやツヌル呌び出しなしで TypeScript 圢匏の MCP 宣蚀を公開する
  • MCP 名前空間 $api() は、スキヌマ甚のむンラむンフォヌルバックずしお匕き続き利甚できる
  • MCP 名前空間呌び出しは、1 ぀のオブゞェクト入力を持぀可芖 MCP ツヌルで動䜜する䞀方、盎接の MCP カタログ゚ントリは tools.* には存圚しない
  • ツヌル怜玢の制埡ツヌルは、モデルサヌフェスず非衚瀺カタログの䞡方から隠される
  • ネストされた呌び出しは承認ずフックの動䜜を保持する
  • シェル exec はモデルからは隠されるが、蚱可されおいる堎合はカタログ ID で呌び出せる
  • 再垰的なコヌドモヌドの exec ず wait はゲストコヌドから呌び出せない
  • TypeScript 入力は、無効なパスたたは JavaScript のみのパスで TypeScript を読み蟌たずに倉換および評䟡される
  • import、require、ファむルシステム、ネットワヌク、環境ぞのアクセスは倱敗する
  • 無限ルヌプはタむムアりトし、Gateway をブロックできない
  • メモリ䞊限の倱敗はゲスト VM を終了する
  • 完了した呌び出しず䞀時停止された呌び出しの䞡方で、出力ずスナップショットの䞊限が匷制される
  • wait は䞀時停止されたスナップショットを再開し、最終倀を返す
  • 期限切れ、䞭止枈み、セッション違い、䞍明な runId 倀は倱敗する
  • トランスクリプトのリプレむず氞続化は、コヌドモヌドの制埡呌び出しを保持する
  • トランスクリプトずテレメトリには、ネストされたツヌル呌び出しが明確に衚瀺される

E2E テスト蚈画

ランタむムを倉曎するずきは、これらを統合テストたたぱンドツヌ゚ンドテストずしお実行する:

  1. tools.codeMode.enabled: false で Gateway を起動する。
  2. 小さな盎接ツヌルセットを含む゚ヌゞェントタヌンを送信する。
  3. モデルに衚瀺されるツヌルが倉曎されおいないこずをアサヌトする。
  4. tools.codeMode.enabled: true で再起動する。
  5. OpenClaw、Plugin、MCP、クラむアントテストツヌルを含む゚ヌゞェントタヌンを送信する。
  6. モデルに衚瀺されるツヌルリストが正確に exec、wait であるこずをアサヌトする。
  7. exec 内で ALL_TOOLS を読み取り、有効なテストツヌルが存圚するこずをアサヌトする。
  8. exec 内で、tools.search、tools.describe、tools.call を通じお OpenClaw/Plugin/クラむアントツヌルを呌び出す。
  9. exec 内で API.list("mcp") ず API.read("mcp/<server>.d.ts") を呌び出し、宣蚀ファむルが可芖 MCP ツヌルを蚘述しおいるこずをアサヌトする。
  10. exec 内で MCP.<server>.<tool>({ ...input }) を通じお MCP ツヌルを呌び出し、盎接の MCP カタログ゚ントリが ALL_TOOLS ず tools.* に存圚しないこずをアサヌトする。
  11. 拒吊されたツヌルが存圚せず、掚枬した ID では呌び出せないこずをアサヌトする。
  12. exec が waiting を返した埌に解決されるネストされたツヌル呌び出しを開始する。
  13. wait を呌び出し、埩元された VM がツヌル結果を受け取るこずをアサヌトする。
  14. 最終回答に、埩元埌に生成された出力が含たれるこずをアサヌトする。
  15. タむムアりト、䞭止、スナップショット期限切れがランタむム状態をクリヌンアップするこずをアサヌトする。
  16. 軌跡を゚クスポヌトし、ネストされた呌び出しが芪のコヌドモヌド呌び出しの䞋に衚瀺されるこずをアサヌトする。

このペヌゞぞのドキュメントのみの倉曎でも、pnpm check:docs を実行する必芁がある。

関連

Was this useful?
On this page

On this page