Appearance
OpenClaw Code Mode 是实验性功能,默认关闭。开启后模型只看到 exec 和 wait 两个工具,所有普通工具被隐藏到 QuickJS‑WASI 沙箱内的运行时目录。适用于工具数量多、需要模型在代码中循环搜索和组合调用的场景。启用方式:在 agent 或 runtime 配置中设置 tools.codeMode.enabled: true。调试时可通过 OPENCLAW_DEBUG_CODE_MODE=1 等环境变量记录模型工具日志。
OpenClaw Code Mode 配置与启用指南
Code Mode 是 OpenClaw 的一个实验性 agent 运行时功能,默认关闭。启用后,OpenClaw 会改变模型在一次运行中看到的工具列表:不再是直接暴露所有已启用的工具 schema,而是只暴露 exec 和 wait 两个工具。
本文档只描述 OpenClaw Code Mode,与 Codex Code Mode 不同。Codex Code Mode 是 Codex 编码框架的一部分,拥有独立的项目工作区、运行时、工具和执行语义,属于稳定功能。OpenClaw Code Mode 是 OpenClaw 自己的实验性工具表面适配器,底层使用 quickjs-wasi、一个隐藏的工具目录以及正常的 OpenClaw 工具执行器。
这是什么功能
OpenClaw Code Mode 让模型编写一段 JavaScript 或 TypeScript 程序,而不是直接从长长的工具列表中逐个选择。
Code Mode 激活后:
- 模型可见的工具列表只有
exec和wait。 exec在受限的 QuickJS‑WASI worker 中执行模型生成的 JavaScript 或 TypeScript 代码。- 所有普通 OpenClaw 工具从模型提示中隐藏,通过
ALL_TOOLS和tools对象暴露给 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 激活后,日志中模型看到的工具名称应该只有 exec 和 wait。如果需要查看发送给 provider 的完整 payload(已脱敏),可以用 OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted 进行短时调试。
运行时状态
- 运行时:
quickjs-wasi - 默认状态:关闭
- 稳定性:OpenClaw 实验性功能;Codex Code Mode 是单独的稳定功能
- 目标场景:普通 OpenClaw agent 运行
- 安全立场:模型代码视为恶意
- 面向用户的承诺:启用 Code Mode 后永远不会静默回退到直接暴露全部工具
范围
Code Mode 负责一次运行中面向模型的编排形状。它不负责模型选择、渠道行为、认证、工具策略或工具实现。
属于范围:
- 模型可见的
exec和wait工具定义 - 隐藏工具目录的构建
- JavaScript 和 TypeScript guest 执行
- QuickJS‑WASI worker 运行时
- 用于目录搜索、schema 查看和工具调用的 host 回调
- 挂起 guest 程序的可恢复状态
- 输出、超时、内存、待调用数、快照大小限制
- 嵌套工具调用的遥测和轨迹投射
不属于范围:
- provider 原生的远程代码执行
- shell 执行语义
- 修改现有工具授权
- 持久化的用户编写脚本
- guest 代码中的包管理、文件、网络或模块访问
- 直接重用 Codex Code Mode 的内部实现
provider 自有的工具(如远程 Python 沙箱)仍然是独立的工具。参见代码执行。
术语
- Code Mode:OpenClaw 运行时模式,隐藏普通工具,只暴露
exec和wait。 - 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 字段不会启用该功能。
支持字段:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | boolean | false | 只有当值为 true 时才启用 Code Mode |
runtime | string | "quickjs-wasi" | 唯一支持的运行时 |
mode | string | "only" | 暴露 exec 和 wait,隐藏所有普通模型工具 |
languages | array | ["javascript", "typescript"] | 支持的语言 |
timeoutMs | number | 10000 | 一次 exec 或 wait 的墙钟上限。运行时限制:100‑60000 |
memoryLimitBytes | number | 67108864 | QuickJS 堆大小上限。运行时限制:1048576‑1073741824 |
maxOutputBytes | number | 65536 | 返回文本、JSON、日志的总上限。运行时限制:1024‑10485760 |
maxSnapshotBytes | number | 10485760 | 序列化虚拟机快照的大小上限。运行时限制:1024‑268435456 |
maxPendingToolCalls | number | 16 | 并发嵌套调用上限。运行时限制:1‑128 |
snapshotTtlSeconds | number | 900 | 挂起虚拟机可以恢复的时间。运行时限制:1‑86400 |
searchDefaultLimit | number | 8 | 隐藏目录搜索返回条目的默认数量。运行时被 maxSearchLimit 钳位 |
maxSearchLimit | number | 50 | 隐藏目录搜索返回条目的最大数量。运行时限制:1‑50 |
如果 Code Mode 已启用但 QuickJS‑WASI 加载失败,OpenClaw 会失败关闭,不会静默回退到普通工具。
激活流程
Code Mode 在有效工具策略确定之后、最终模型请求组装之前评估。
激活顺序:
- 解析 agent、模型、provider、沙箱、渠道、发送者和运行策略
- 构建有效的 OpenClaw 工具列表
- 添加符合条件的插件、MCP 和客户端工具
- 应用允许/拒绝策略
- 如果
tools.codeMode.enabled为 false,继续普通工具暴露 - 如果已启用且当前运行有激活的工具,将有效工具注册到 Code Mode 目录
- 从模型可见工具列表中移除所有普通工具
- 添加
exec和wait
明确没有工具的运行(如裸模型调用、disableTools、空允许列表)不会激活 Code Mode,即使配置了 tools.codeMode.enabled: true。
Code Mode 目录是运行范围的,不能泄露来自其他 agent、会话、发送者或运行的工具。
模型可见的工具
Code Mode 激活后,模型只会看到这两个顶层工具:
execwait
所有其他已启用的工具都从模型工具列表中隐藏,并注册到 Code Mode 目录。
模型应该用 exec 进行工具编排、数据连接、循环、并行嵌套调用和结构化转换。只有在 exec 返回可恢复的 waiting 结果时才应该使用 wait。
exec 工具
exec 启动一个 Code Mode 单元,返回一个结果。输入的代码由模型生成,需视为恶意。
输入:
typescript
type CodeModeExecInput = {
code?: string;
command?: string;
language?: "javascript" | "typescript";
};输入规则:
code或command必须有一个非空。code是面向模型的文档字段。command被接受作为exec兼容别名,供 hook 策略和受信任的重写使用;两者同时存在时值必须一致。- 外层
exechook 事件会包含toolKind: "code_mode_exec",并在已知输入语言时包含toolInputKind: "javascript" | "typescript",方便策略区分 Code Mode 单元与同名的 shell 式exec调用。 language默认为"javascript"。- 如果
language为"typescript",OpenClaw 先编译再求值。 exec在 v1 中拒绝import、require、动态导入和模块加载模式。exec不会递归暴露普通的 shellexec实现。
结果:
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,结果中包含用于 wait 的 runId。
exec 只在 guest 虚拟机无待处理工作且最终值经过 OpenClaw 输出适配器后成为 JSON 兼容值时返回 completed。
wait 工具
wait 恢复一个挂起的 Code Mode 虚拟机。
输入:
typescript
type CodeModeWaitInput = {
runId: string;
};输出与 exec 返回的 CodeModeResult 联合类型相同。
wait 的存在是因为嵌套的 OpenClaw 工具可能很慢、需要交互、需要审批或流式更新。模型无需在 host 等待外部工作期间保持一个长 exec 调用。
QuickJS‑WASI 快照和恢复是 v1 的恢复机制:
exec执行代码直到完成、失败或挂起。- 挂起时,OpenClaw 快照 QuickJS 虚拟机并记录待处理的 host 工作。
- 待处理工作就绪后,
wait恢复虚拟机快照。 - OpenClaw 按稳定名称重新注册 host 回调。
- OpenClaw 将嵌套工具结果传入恢复的虚拟机。
- OpenClaw 清除 QuickJS 的待处理作业。
wait返回completed、failed或另一个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 桥
隐藏工具目录
隐藏目录包含经过有效策略过滤后的工具:
- OpenClaw 核心工具
- 内置插件工具
- 外部插件工具
- MCP 工具
- 当前运行的客户端工具
目录 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 自身控制工具:
execwaittool_search_codetool_searchtool_describetool_call
这样可以防止递归,并保持模型侧接口的简洁。
与 Tool Search 的关系
Code Mode 在激活后会取代 PI Tool Search 模型界面。
当 tools.codeMode.enabled 为 true 且 Code Mode 激活时:
- OpenClaw 不暴露
tool_search_code、tool_search、tool_describe或tool_call作为模型可见工具。 - 相同的目录思想移动到 guest 运行时内部。
- guest 运行时接收紧凑的
ALL_TOOLS元数据和search、describe、call辅助函数。 - 嵌套调用通过与 Tool Search 相同的 OpenClaw 执行路径分发。
已有的 Tool Search 页面描述了 PI 紧凑目录桥。Code Mode 是适用于能使用 exec 和 wait 的运行的通用 OpenClaw 替代方案。
工具名称冲突
模型可见的 exec 工具是 Code Mode 工具。如果普通 OpenClaw shell exec 工具已启用,它会被隐藏并从目录中列出来。
在 guest 运行时内部:
tools.call("openclaw:core:exec", input)可以在策略允许时调用 shellexec工具。tools.exec(...)只有在 shellexec目录条目有无歧义的安全名称时才安装。- Code Mode 的
exec工具永远不会通过tools递归可用。
如果两个工具归一化后产生相同的安全便捷名称,OpenClaw 会省略便捷函数,必须使用 tools.call(id, input)。
嵌套工具执行
每次嵌套工具调用都经过 host 桥并重新进入 OpenClaw。
嵌套执行保留:
- 当前 agent ID
- 会话 ID 和会话 key
- 发送者和渠道上下文
- 沙箱策略
- 审批策略
- 插件
before_tool_callhook - 中止信号
- 可用的流式更新
- 轨迹和审计事件
嵌套调用会投射到对话记录中,作为真实的工具调用,方便支持包查看内容。投射信息会标识父 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 不支持
import或require - 诊断错误以
failed结果返回
TypeScript 编译器仅在 TypeScript 单元时惰性加载。纯 JavaScript 单元或禁用了 Code Mode 时不加载编译器。
转换应尽量保留有用的行号。
安全边界
模型代码视为恶意。运行时采用纵深防御:
- 在主事件循环之外运行 QuickJS‑WASI
- 依赖
quickjs-wasi作为直接依赖,不通过 Codex 或传递包 - guest 中没有文件系统、网络、子进程、模块导入、环境变量或 host 全局对象
- 使用 QuickJS 内存和中断限制
- 强制父进程墙钟超时
- 强制输出、快照、日志和待调用数量上限
- 通过窄 JSON 适配器序列化 host 桥接值
- 将 host 错误转换为普通 guest 错误,绝不传递 host realm 对象
- 超时、中止、会话结束或过期时丢弃快照
- 拒绝递归访问
exec、wait和 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 报告:
- 发送给模型的可见工具名称
- 隐藏目录大小和来源分布
exec和wait调用次数- 嵌套搜索、查看和调用次数
- 调用的嵌套工具 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 不恰好包含 exec 和 wait,Code Mode 也会关闭运行。
实现结构
实现单元:
- 配置契约:
tools.codeMode - 目录构建器:有效工具到紧凑条目和 ID 映射
- 模型表面适配器:用
exec和wait替换可见工具 - QuickJS‑WASI 运行时适配器:加载、求值、快照、恢复、释放
- worker 监管器:超时、中止、崩溃隔离
- 桥接适配器:JSON 安全的 host 回调和结果传递
- TypeScript 转换适配器
- 快照存储:TTL、大小上限、运行/会话作用域
- 嵌套工具调用的轨迹投射
- 遥测计数和诊断
实现复用了 Tool Search 的目录和执行器概念,但不使用 node:vm 作为沙箱。
验证检查清单
Code Mode 覆盖应证明:
- 禁用配置保持现有工具暴露不变
- 没有
enabled: true的对象配置不启用 Code Mode - 启用配置在运行有活跃工具时只暴露
exec和wait给模型 - 裸无工具运行、
disableTools、空允许列表不触发 Code Mode payload 强制检查 - 所有有效工具出现在
ALL_TOOLS中 - 被拒绝的工具不在
ALL_TOOLS中 tools.search、tools.describe、tools.call对 OpenClaw 工具工作正常- Tool Search 控制工具既不在模型表面出现,也不在隐藏目录中
- 嵌套调用保留审批和 hook 行为
- shell
exec从模型隐藏,但策略允许时可通过目录 ID 调用 - 递归的 Code Mode
exec和wait不能从 guest 代码中调用 - TypeScript 输入被转换并求值,且不在禁用或 JavaScript 仅路径上加载 TypeScript
import、require、文件系统、网络和环境变量访问失败- 无限循环超时,不会阻塞 Gateway
- 内存上限失败终止 guest VM
- 已完成和挂起调用都强制执行输出和快照上限
wait恢复挂起的快照并返回最终值- 过期、中止、错误会话和未知
runId值失败 - 对话记录回放和持久化保留 Code Mode 控制调用
- 对话记录和遥测清晰显示嵌套工具调用
E2E 测试计划
更改运行时后,执行以下集成或端到端测试:
- 启动一个
tools.codeMode.enabled: false的 Gateway。 - 发送一个 agent 回合,包含小工具集。
- 断言模型可见工具不变。
- 重启,设置
tools.codeMode.enabled: true。 - 发送一个 agent 回合,包含 OpenClaw、插件、MCP 和客户端测试工具。
- 断言模型可见工具列表正好是
exec、wait。 - 在
exec中读取ALL_TOOLS,断言有效测试工具都存在。 - 在
exec中调用tools.search、tools.describe、tools.call。 - 断言被拒绝的工具不存在,且无法通过猜测 ID 调用。
- 启动一个嵌套工具调用,在
exec返回waiting后才解析。 - 调用
wait,断言恢复的 VM 收到了工具结果。 - 断言最终答案包含恢复后产生的输出。
- 断言超时、中止和快照过期清除了运行时状态。
- 导出轨迹,断言嵌套调用出现在父 Code Mode 调用下。
仅修改此文档时应运行 pnpm check:docs。
相关链接
常见问题
OpenClaw Code Mode 和 Codex Code Mode 有什么区别?
OpenClaw Code Mode 是 OpenClaw 的实验性工具表面适配器,底层使用 quickjs-wasi,隐藏所有普通工具,只暴露 exec 和 wait。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 如何工作?
支持 javascript 和 typescript,默认两种都启用。TypeScript 输入会先经过 OpenClaw 的源码转换(不进行类型检查)再在 QuickJS‑WASI 中求值。import 和 require 在 v1 中不被支持。