Skip to content

OpenClaw Code Mode 是实验性功能,默认关闭。开启后模型只看到 execwait 两个工具,所有普通工具被隐藏到 QuickJS‑WASI 沙箱内的运行时目录。适用于工具数量多、需要模型在代码中循环搜索和组合调用的场景。启用方式:在 agent 或 runtime 配置中设置 tools.codeMode.enabled: true。调试时可通过 OPENCLAW_DEBUG_CODE_MODE=1 等环境变量记录模型工具日志。

OpenClaw Code Mode 配置与启用指南

Code Mode 是 OpenClaw 的一个实验性 agent 运行时功能,默认关闭。启用后,OpenClaw 会改变模型在一次运行中看到的工具列表:不再是直接暴露所有已启用的工具 schema,而是只暴露 execwait 两个工具。

本文档只描述 OpenClaw Code Mode,与 Codex Code Mode 不同。Codex Code Mode 是 Codex 编码框架的一部分,拥有独立的项目工作区、运行时、工具和执行语义,属于稳定功能。OpenClaw Code Mode 是 OpenClaw 自己的实验性工具表面适配器,底层使用 quickjs-wasi、一个隐藏的工具目录以及正常的 OpenClaw 工具执行器。

这是什么功能

OpenClaw Code Mode 让模型编写一段 JavaScript 或 TypeScript 程序,而不是直接从长长的工具列表中逐个选择。

Code Mode 激活后:

  • 模型可见的工具列表只有 execwait
  • exec 在受限的 QuickJS‑WASI worker 中执行模型生成的 JavaScript 或 TypeScript 代码。
  • 所有普通 OpenClaw 工具从模型提示中隐藏,通过 ALL_TOOLStools 对象暴露给 guest 代码。
  • guest 代码可以搜索隐藏目录、查看工具 schema、调用工具 – 调用走的是与普通 agent 回合相同的 OpenClaw 执行路径。
  • wait 在嵌套工具调用尚未返回时,恢复一个挂起的 Code Mode 运行。

关键区别:Code Mode 改变了模型侧的编排表面,不替换 OpenClaw 工具、插件工具、MCP 工具、认证、审批策略、渠道行为或模型选择。

Code Mode 的好处

  • 提示更小:provider 只收到两个控制工具,而不是几十上百个完整工具 schema。
  • 更好编排:模型可以在一个代码单元内使用循环、组合、小转换、条件逻辑和并行嵌套调用。
  • provider 无关:对 OpenClaw 工具、插件、MCP、客户端工具都有效,不依赖 provider 自身的代码执行能力。
  • 保留现有策略:嵌套调用仍然经过 OpenClaw 的策略、审批、hook、会话上下文和审计路径。
  • 清晰的失败模式:当 Code Mode 被显式启用但运行时不可用时,OpenClaw 会失败关闭,不会自动回退到直接暴露全部工具。

特别适合拥有大量启用工具的 agent,或模型需要反复搜索、组合和调用工具后才能给出答案的工作流。

怎么启用 Code Mode

在 agent 或 runtime 配置中添加 tools.codeMode.enabled: true

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

也支持简写:

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

tools.codeMode 被省略、设为 false 或设为对象但没有 enabled: true 时,Code Mode 保持关闭。

如需更严格的边界限制,可以同时设置以下字段:

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

当 Code Mode 激活后,日志中模型看到的工具名称应该只有 execwait。如果需要查看发送给 provider 的完整 payload(已脱敏),可以用 OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted 进行短时调试。

运行时状态

  • 运行时quickjs-wasi
  • 默认状态:关闭
  • 稳定性:OpenClaw 实验性功能;Codex Code Mode 是单独的稳定功能
  • 目标场景:普通 OpenClaw agent 运行
  • 安全立场:模型代码视为恶意
  • 面向用户的承诺:启用 Code Mode 后永远不会静默回退到直接暴露全部工具

范围

Code Mode 负责一次运行中面向模型的编排形状。它不负责模型选择、渠道行为、认证、工具策略或工具实现。

属于范围:

  • 模型可见的 execwait 工具定义
  • 隐藏工具目录的构建
  • JavaScript 和 TypeScript guest 执行
  • QuickJS‑WASI worker 运行时
  • 用于目录搜索、schema 查看和工具调用的 host 回调
  • 挂起 guest 程序的可恢复状态
  • 输出、超时、内存、待调用数、快照大小限制
  • 嵌套工具调用的遥测和轨迹投射

不属于范围:

  • provider 原生的远程代码执行
  • shell 执行语义
  • 修改现有工具授权
  • 持久化的用户编写脚本
  • guest 代码中的包管理、文件、网络或模块访问
  • 直接重用 Codex Code Mode 的内部实现

provider 自有的工具(如远程 Python 沙箱)仍然是独立的工具。参见代码执行

术语

  • Code Mode:OpenClaw 运行时模式,隐藏普通工具,只暴露 execwait
  • Guest runtime:运行模型代码的 QuickJS‑WASI JavaScript 虚拟机。
  • Host bridge:guest 代码返回 OpenClaw 的窄 JSON 兼容回调接口。
  • Catalog:一次运行中所有有效工具(经过工具策略、插件、MCP、客户端工具解析后)的列表。
  • Nested tool call:从 guest 代码通过 host bridge 发起的工具调用。
  • Snapshot:QuickJS‑WASI 虚拟机序列化状态,使 wait 可以继续挂起的 Code Mode 运行。

配置参数

tools.codeMode.enabled 是激活开关。设置其他 Code Mode 字段不会启用该功能。

支持字段:

字段类型默认值说明
enabledbooleanfalse只有当值为 true 时才启用 Code Mode
runtimestring"quickjs-wasi"唯一支持的运行时
modestring"only"暴露 execwait,隐藏所有普通模型工具
languagesarray["javascript", "typescript"]支持的语言
timeoutMsnumber10000一次 execwait 的墙钟上限。运行时限制:10060000
memoryLimitBytesnumber67108864QuickJS 堆大小上限。运行时限制:10485761073741824
maxOutputBytesnumber65536返回文本、JSON、日志的总上限。运行时限制:102410485760
maxSnapshotBytesnumber10485760序列化虚拟机快照的大小上限。运行时限制:1024268435456
maxPendingToolCallsnumber16并发嵌套调用上限。运行时限制:1128
snapshotTtlSecondsnumber900挂起虚拟机可以恢复的时间。运行时限制:186400
searchDefaultLimitnumber8隐藏目录搜索返回条目的默认数量。运行时被 maxSearchLimit 钳位
maxSearchLimitnumber50隐藏目录搜索返回条目的最大数量。运行时限制:150

如果 Code Mode 已启用但 QuickJS‑WASI 加载失败,OpenClaw 会失败关闭,不会静默回退到普通工具。

激活流程

Code Mode 在有效工具策略确定之后、最终模型请求组装之前评估。

激活顺序:

  1. 解析 agent、模型、provider、沙箱、渠道、发送者和运行策略
  2. 构建有效的 OpenClaw 工具列表
  3. 添加符合条件的插件、MCP 和客户端工具
  4. 应用允许/拒绝策略
  5. 如果 tools.codeMode.enabled 为 false,继续普通工具暴露
  6. 如果已启用且当前运行有激活的工具,将有效工具注册到 Code Mode 目录
  7. 从模型可见工具列表中移除所有普通工具
  8. 添加 execwait

明确没有工具的运行(如裸模型调用、disableTools、空允许列表)不会激活 Code Mode,即使配置了 tools.codeMode.enabled: true

Code Mode 目录是运行范围的,不能泄露来自其他 agent、会话、发送者或运行的工具。

模型可见的工具

Code Mode 激活后,模型只会看到这两个顶层工具:

  • exec
  • wait

所有其他已启用的工具都从模型工具列表中隐藏,并注册到 Code Mode 目录。

模型应该用 exec 进行工具编排、数据连接、循环、并行嵌套调用和结构化转换。只有在 exec 返回可恢复的 waiting 结果时才应该使用 wait

exec 工具

exec 启动一个 Code Mode 单元,返回一个结果。输入的代码由模型生成,需视为恶意。

输入

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

输入规则:

  • codecommand 必须有一个非空。
  • code 是面向模型的文档字段。
  • command 被接受作为 exec 兼容别名,供 hook 策略和受信任的重写使用;两者同时存在时值必须一致。
  • 外层 exec hook 事件会包含 toolKind: "code_mode_exec",并在已知输入语言时包含 toolInputKind: "javascript" | "typescript",方便策略区分 Code Mode 单元与同名的 shell 式 exec 调用。
  • language 默认为 "javascript"
  • 如果 language"typescript",OpenClaw 先编译再求值。
  • exec 在 v1 中拒绝 importrequire、动态导入和模块加载模式。
  • exec 不会递归暴露普通的 shell 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 虚拟机挂起并保存了可恢复状态时返回 waiting,结果中包含用于 waitrunId

exec 只在 guest 虚拟机无待处理工作且最终值经过 OpenClaw 输出适配器后成为 JSON 兼容值时返回 completed

wait 工具

wait 恢复一个挂起的 Code Mode 虚拟机。

输入

typescript
type CodeModeWaitInput = {
  runId: string;
};

输出与 exec 返回的 CodeModeResult 联合类型相同。

wait 的存在是因为嵌套的 OpenClaw 工具可能很慢、需要交互、需要审批或流式更新。模型无需在 host 等待外部工作期间保持一个长 exec 调用。

QuickJS‑WASI 快照和恢复是 v1 的恢复机制:

  1. exec 执行代码直到完成、失败或挂起。
  2. 挂起时,OpenClaw 快照 QuickJS 虚拟机并记录待处理的 host 工作。
  3. 待处理工作就绪后,wait 恢复虚拟机快照。
  4. OpenClaw 按稳定名称重新注册 host 回调。
  5. OpenClaw 将嵌套工具结果传入恢复的虚拟机。
  6. OpenClaw 清除 QuickJS 的待处理作业。
  7. wait 返回 completedfailed 或另一个 waiting 结果。

快照是运行时状态,不是用户工件。它们有大小限制、过期时间,并且作用域限制在创建它们的运行和会话。

wait 在以下情况会失败:

  • runId 未知
  • 快照已过期
  • 父运行或会话已中止
  • 调用者不在同一个运行/会话作用域内
  • QuickJS‑WASI 恢复失败
  • 恢复后会超出配置限制

Guest 运行时 API

guest 运行时暴露一个小的全局 API:

typescript
declare const ALL_TOOLS: ToolCatalogEntry[];
declare const tools: ToolCatalog;

declare function text(value: unknown): void;
declare function json(value: unknown): void;
declare function yield_control(reason?: string): Promise<void>;

ALL_TOOLS 是运行范围目录的紧凑元数据。默认不包含完整 schema。

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

完整 schema 只按需加载:

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

目录辅助函数:

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

当安全名称无歧义时,guest 运行时还会安装便捷工具函数:

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" });

// 如果隐藏目录中有一个无歧义的 web_search 条目:
const hits = await tools.web_search({ query: "OpenClaw code mode" });

guest 运行时不能直接暴露 host 对象。输入和输出通过 JSON 兼容值经过尺寸限制的桥接。

输出 API

text(value) 将人类可读输出追加到 output 数组。

json(value) 在 JSON 兼容序列化后追加一个结构化输出项。

guest 代码最终的返回值会成为 completed 结果中的 value

输出项:

typescript
type CodeModeOutput = { type: "text"; text: string } | { type: "json"; value: unknown };

输出规则:

  • 输出顺序与 guest 调用顺序一致
  • 输出总量受 maxOutputBytes 限制
  • 不可序列化的值会被转换为普通字符串或错误
  • 二进制值在 v1 中不支持
  • 图片和文件通过普通 OpenClaw 工具传递,不经过 Code Mode 桥

隐藏工具目录

隐藏目录包含经过有效策略过滤后的工具:

  1. OpenClaw 核心工具
  2. 内置插件工具
  3. 外部插件工具
  4. MCP 工具
  5. 当前运行的客户端工具

目录 ID 在一次运行内是稳定的,并且在工具集等价时尽量确定。

推荐 ID 格式:

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

示例:

text
openclaw:core:message
plugin:browser:browser_request
mcp:github:create_issue
client:app:select_file

目录不包含 Code Mode 自身控制工具:

  • exec
  • wait
  • tool_search_code
  • tool_search
  • tool_describe
  • tool_call

这样可以防止递归,并保持模型侧接口的简洁。

与 Tool Search 的关系

Code Mode 在激活后会取代 PI Tool Search 模型界面。

tools.codeMode.enabled 为 true 且 Code Mode 激活时:

  • OpenClaw 不暴露 tool_search_codetool_searchtool_describetool_call 作为模型可见工具。
  • 相同的目录思想移动到 guest 运行时内部。
  • guest 运行时接收紧凑的 ALL_TOOLS 元数据和 searchdescribecall 辅助函数。
  • 嵌套调用通过与 Tool Search 相同的 OpenClaw 执行路径分发。

已有的 Tool Search 页面描述了 PI 紧凑目录桥。Code Mode 是适用于能使用 execwait 的运行的通用 OpenClaw 替代方案。

工具名称冲突

模型可见的 exec 工具是 Code Mode 工具。如果普通 OpenClaw shell exec 工具已启用,它会被隐藏并从目录中列出来。

在 guest 运行时内部:

  • tools.call("openclaw:core:exec", input) 可以在策略允许时调用 shell exec 工具。
  • tools.exec(...) 只有在 shell exec 目录条目有无歧义的安全名称时才安装。
  • Code Mode 的 exec 工具永远不会通过 tools 递归可用。

如果两个工具归一化后产生相同的安全便捷名称,OpenClaw 会省略便捷函数,必须使用 tools.call(id, input)

嵌套工具执行

每次嵌套工具调用都经过 host 桥并重新进入 OpenClaw。

嵌套执行保留:

  • 当前 agent ID
  • 会话 ID 和会话 key
  • 发送者和渠道上下文
  • 沙箱策略
  • 审批策略
  • 插件 before_tool_call hook
  • 中止信号
  • 可用的流式更新
  • 轨迹和审计事件

嵌套调用会投射到对话记录中,作为真实的工具调用,方便支持包查看内容。投射信息会标识父 Code Mode 工具调用和嵌套的工具 ID。

并行嵌套调用数量上限为 maxPendingToolCalls

运行时状态机

每个 Code Mode 运行时都有一个状态机:

  • running:VM 正在执行或嵌套调用在进行中。
  • waiting:VM 快照存在,可以通过 wait 恢复。
  • completed:最终值已返回,快照已删除。
  • failed:错误已返回,快照已删除。
  • expired:快照或挂起状态超过保留时间,无法恢复。
  • aborted:父运行/会话已取消,快照已删除。

状态按 agent 运行、会话和工具调用 ID 确定作用域。来自不同运行或会话的 wait 调用会失败。

快照存储有边界:

  • 每次运行的最大快照字节数
  • 每个进程的最大活跃快照数
  • 快照 TTL
  • 在运行结束时清理
  • 在 Gateway 关闭时清理(不支持持久化的场景)

QuickJS‑WASI 运行时

OpenClaw 将 quickjs-wasi 作为所在包的直接依赖加载。运行时不依赖为 Proxy、PAC 等其他无关功能安装的传递依赖。

运行时职责:

  • 编译或加载 QuickJS‑WASI WebAssembly 模块
  • 为每次 Code Mode 运行或恢复创建一个隔离的 VM
  • 按稳定名称注册 host 回调
  • 设置内存和中断限制
  • 执行 JavaScript
  • 清除待处理作业
  • 快照挂起的 VM 状态
  • wait 恢复快照
  • 到达终止状态后释放 VM 句柄和快照

运行时在 OpenClaw 主事件循环之外的一个 worker 中执行。guest 的无限循环不能无限阻塞 Gateway 进程。

TypeScript 支持

TypeScript 支持仅进行源码转换:

  • 输入:一段 TypeScript 代码字符串
  • 输出:由 QuickJS‑WASI 执行的 JavaScript 字符串
  • 不进行类型检查
  • 无模块解析
  • v1 不支持 importrequire
  • 诊断错误以 failed 结果返回

TypeScript 编译器仅在 TypeScript 单元时惰性加载。纯 JavaScript 单元或禁用了 Code Mode 时不加载编译器。

转换应尽量保留有用的行号。

安全边界

模型代码视为恶意。运行时采用纵深防御:

  • 在主事件循环之外运行 QuickJS‑WASI
  • 依赖 quickjs-wasi 作为直接依赖,不通过 Codex 或传递包
  • guest 中没有文件系统、网络、子进程、模块导入、环境变量或 host 全局对象
  • 使用 QuickJS 内存和中断限制
  • 强制父进程墙钟超时
  • 强制输出、快照、日志和待调用数量上限
  • 通过窄 JSON 适配器序列化 host 桥接值
  • 将 host 错误转换为普通 guest 错误,绝不传递 host realm 对象
  • 超时、中止、会话结束或过期时丢弃快照
  • 拒绝递归访问 execwait 和 Tool Search 控制工具
  • 防止便捷名称冲突覆盖目录辅助函数

沙箱只是一个安全层。对于高风险部署,操作员仍可能需要 OS 级别的加固。

错误码

typescript
type CodeModeErrorCode =
  | "runtime_unavailable"
  | "invalid_config"
  | "invalid_input"
  | "unsupported_language"
  | "typescript_transform_failed"
  | "module_access_denied"
  | "timeout"
  | "memory_limit_exceeded"
  | "output_limit_exceeded"
  | "snapshot_limit_exceeded"
  | "snapshot_expired"
  | "snapshot_restore_failed"
  | "too_many_pending_tool_calls"
  | "nested_tool_failed"
  | "aborted"
  | "internal_error";

返回给 guest 的错误是纯数据。host Error 实例、栈对象、原型和 host 函数不会进入 QuickJS。

遥测

Code Mode 报告:

  • 发送给模型的可见工具名称
  • 隐藏目录大小和来源分布
  • execwait 调用次数
  • 嵌套搜索、查看和调用次数
  • 调用的嵌套工具 ID
  • 超时、内存、快照和输出上限失败
  • 快照生命周期事件

遥测不能包含秘密、原始环境值或未经脱敏的工具输入(除非符合 OpenClaw 已有的轨迹策略)。

调试方法

当 Code Mode 的行为与普通工具运行不同时,使用有针对性的模型传输日志:

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

对于 payload 形状调试,使用 OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted。这会记录一个从上限中脱敏的 JSON 快照;仅限调试时使用,因为提示和消息文本仍可能出现。

对于流式调试,使用 OPENCLAW_DEBUG_SSE=peek 记录前五个脱敏 SSE 事件。如果 Code Mode 表面激活后,最终 provider payload 不恰好包含 execwait,Code Mode 也会关闭运行。

实现结构

实现单元:

  • 配置契约:tools.codeMode
  • 目录构建器:有效工具到紧凑条目和 ID 映射
  • 模型表面适配器:用 execwait 替换可见工具
  • QuickJS‑WASI 运行时适配器:加载、求值、快照、恢复、释放
  • worker 监管器:超时、中止、崩溃隔离
  • 桥接适配器:JSON 安全的 host 回调和结果传递
  • TypeScript 转换适配器
  • 快照存储:TTL、大小上限、运行/会话作用域
  • 嵌套工具调用的轨迹投射
  • 遥测计数和诊断

实现复用了 Tool Search 的目录和执行器概念,但不使用 node:vm 作为沙箱。

验证检查清单

Code Mode 覆盖应证明:

  • 禁用配置保持现有工具暴露不变
  • 没有 enabled: true 的对象配置不启用 Code Mode
  • 启用配置在运行有活跃工具时只暴露 execwait 给模型
  • 裸无工具运行、disableTools、空允许列表不触发 Code Mode payload 强制检查
  • 所有有效工具出现在 ALL_TOOLS
  • 被拒绝的工具不在 ALL_TOOLS
  • tools.searchtools.describetools.call 对 OpenClaw 工具工作正常
  • Tool Search 控制工具既不在模型表面出现,也不在隐藏目录中
  • 嵌套调用保留审批和 hook 行为
  • shell exec 从模型隐藏,但策略允许时可通过目录 ID 调用
  • 递归的 Code Mode execwait 不能从 guest 代码中调用
  • TypeScript 输入被转换并求值,且不在禁用或 JavaScript 仅路径上加载 TypeScript
  • importrequire、文件系统、网络和环境变量访问失败
  • 无限循环超时,不会阻塞 Gateway
  • 内存上限失败终止 guest VM
  • 已完成和挂起调用都强制执行输出和快照上限
  • wait 恢复挂起的快照并返回最终值
  • 过期、中止、错误会话和未知 runId 值失败
  • 对话记录回放和持久化保留 Code Mode 控制调用
  • 对话记录和遥测清晰显示嵌套工具调用

E2E 测试计划

更改运行时后,执行以下集成或端到端测试:

  1. 启动一个 tools.codeMode.enabled: false 的 Gateway。
  2. 发送一个 agent 回合,包含小工具集。
  3. 断言模型可见工具不变。
  4. 重启,设置 tools.codeMode.enabled: true
  5. 发送一个 agent 回合,包含 OpenClaw、插件、MCP 和客户端测试工具。
  6. 断言模型可见工具列表正好是 execwait
  7. exec 中读取 ALL_TOOLS,断言有效测试工具都存在。
  8. exec 中调用 tools.searchtools.describetools.call
  9. 断言被拒绝的工具不存在,且无法通过猜测 ID 调用。
  10. 启动一个嵌套工具调用,在 exec 返回 waiting 后才解析。
  11. 调用 wait,断言恢复的 VM 收到了工具结果。
  12. 断言最终答案包含恢复后产生的输出。
  13. 断言超时、中止和快照过期清除了运行时状态。
  14. 导出轨迹,断言嵌套调用出现在父 Code Mode 调用下。

仅修改此文档时应运行 pnpm check:docs

相关链接

常见问题

OpenClaw Code Mode 和 Codex Code Mode 有什么区别?

OpenClaw Code Mode 是 OpenClaw 的实验性工具表面适配器,底层使用 quickjs-wasi,隐藏所有普通工具,只暴露 execwait。Codex Code Mode 是 Codex 编码框架的一部分,拥有独立的项目工作区、运行时、工具和执行语义,是稳定的 Codex 功能。两者不互通。

启用 Code Mode 后,还能用 shell exec 工具吗?

可以,但必须通过隐藏目录中的工具 ID 调用。普通 OpenClaw shell exec 工具在启用 Code Mode 后从模型工具列表中隐藏,但仍在隐藏目录中。如果策略允许,guest 代码可以通过 tools.call("openclaw:core:exec", input) 调用它。如果该工具的安全名称无歧义,也可以使用便捷函数 tools.exec(...)

Code Mode 中支持哪些语言?TypeScript 如何工作?

支持 javascripttypescript,默认两种都启用。TypeScript 输入会先经过 OpenClaw 的源码转换(不进行类型检查)再在 QuickJS‑WASI 中求值。importrequire 在 v1 中不被支持。