跳转至

Code Mode 执行器

启用后,Code Mode 默认使用 Node。当你需要加固的访客运行时,请选择 QuickJS。两个执行器运行相同的纯 JavaScript 代码单元,暴露相同的类型化工具发现机制,并使用相同的 exec 和 wait 工具。未设置全局 Code Mode 时,将按模型自动激活。在 Labs 中选择执行器会保留激活状态。在配置中编写对象时,请包含 enabled: "auto" 以保留自动激活。

选择执行器

执行器 预期用途 执行方式 挂起状态
node(默认) 在你的 Gateway 主机上进行可信执行 在 Worker 线程中运行 Node.js node:vm 存活的 Worker 和 JavaScript 上下文
quickjs 加固的访客隔离 在 Worker 线程中运行 QuickJS-WASI,由内置执行器插件提供 序列化的 VM 快照

Warning

Node 的 node:vm 不是安全边界。Worker 将访客计算移出 Gateway 事件循环,但它共享 Gateway 进程的操作系统特权。请将 Node Code Mode 视为可信的主机执行。

预期的访客 API 不会暴露 Node 的文件系统、网络、进程、环境或模块加载 API。模块守卫和少量全局变量有助于让代码单元专注于工具编排;它们不会让 node:vm 对恶意 JavaScript 变得安全。当访客隔离属于你的威胁模型的一部分时,请使用 QuickJS;当你需要更强的主机边界时,请使用单独的操作系统用户、容器或主机。

QuickJS 提供独立的 WASM 访客环境,没有任何环境主机访问权限。如果你的工具策略授予了权限,它仍然可以调用强大的工具。在任一执行器下,通过 Code Mode 工具桥发起的调用都保留 OpenClaw 正常的策略、审批、钩子和会话所有权。这些检查可以对工具调用进行调解;它们无法约束逃逸 Node VM 上下文的恶意代码。

设置执行器

在 Web 界面中,打开 设置 → 代理与工具 → Labs,使用 Code Mode 执行器 选择 Node.js(默认) 或 QuickJS(隔离)。激活和执行器选择是彼此独立的:选择执行器并不会启用 Code Mode。

要使用默认的 Node 执行器启用 Code Mode:

{
  tools: {
    codeMode: {
      enabled: true,
      executor: "node",
    },
  },
}

如需加固的访客隔离,请在同一个对象中设置 executor: "quickjs"。内置插件 ID 是 code-mode-quickjs;选择其执行器无需单独的插件启用步骤。显式选择执行器会激活此内置运行时,即使 plugins.enabled 为 false 或受限的 plugins.allow 列表未包含它也是如此。它不会启用其他插件。显式的 plugins.deny 条目或 plugins.entries.code-mode-quickjs.enabled: false 仍会阻止它。外部插件可以提供 quickjs 执行器选项,并且仍然受完整的插件激活策略约束。请为该选项启用且仅启用一个所有者。可选的执行器 ID 是 node 和 quickjs;node 由核心拥有。

所选执行器必须可用。如果它缺失、被禁用、被拒绝或无法加载,运行将失败并报 runtime_unavailable;OpenClaw 绝不会静默切换到 Node,也不会广泛地直接暴露工具。当配置的 QuickJS 执行器不可用时,请检查插件策略。

设置 agents.entries.<agent>.tools.codeMode.executor 可为单个代理覆盖全局选择。未设置该字段的代理将继承全局选择。有关激活优先级和限制,请参阅 Code Mode 配置。

理解等待与限制

每个代码单元在整个生命周期内都会保留其所选执行器,包括每次 wait。更改配置只会影响新的代码单元;它不会在引擎之间移动挂起的 JavaScript,也不会重放已完成的工具调用。

Node 在挂起时会保留其存活的 Worker 上下文。QuickJS 可以在序列化访客后释放其 Worker,并在 wait 时恢复快照。两种延续都是临时的:完成、失败、取消、过期或 Gateway 关机会释放它们。两者都无法在 Gateway 重启后存活。

timeoutMs、输出限制、待处理调用限制、挂起运行容量和 snapshotTtlSeconds 对两个执行器都适用。历史名称 snapshotTtlSeconds 也控制着 Node 的挂起上下文生命周期。主机通过终止超时的 Worker 来强制执行 Node 的执行截止时间,包括同步循环和 Promise 延续。超时之前产生的输出在配置的输出限制内仍然可用。QuickJS 还会根据 maxSnapshotBytes 检查序列化的 VM 状态。Node 没有序列化的 VM 快照,因此该设置不会限制其存活堆。保存的 JSON 结果保留其共享内存/快照数据配额。

memoryLimitBytes 限制 QuickJS 访客内存。对于 Node,它会在 V8 的老年代和新生代之间配置一个尽力而为的 Worker 堆预算,并受引擎最小值约束。该预算包含 Worker 运行时分配,但不包含外部缓冲区;它不是按上下文测量的堆指标,也不是安全边界。任一执行器的该设置都不会限制 Gateway 总 RSS。Worker 开销和主机侧工具结果也会消耗内存。保留的 Node 上下文可能比有大小限制的 QuickJS 快照占用更多的主机总内存。64 个挂起代码单元和预留恢复槽位的共享限制仍然适用;没有单独的全局内存配额。有关状态所有权和保留,请参阅 Code Mode 内部机制。

升级现有配置

Doctor 和符合条件的 Gateway 启动迁移会将显式的 runtime: "quickjs-wasi" 替换为 executor: "quickjs",从而保留该显式选择。当两个字段同时存在时,现有的 executor 设置优先。激活和其他限制保持不变。

迁移后的显式 QuickJS 选择在通用插件被禁用或加入允许列表时也能正常工作,而无需启用无关插件。对 code-mode-quickjs 的显式拒绝仍会阻止执行。

未显式选择运行时的配置将使用新的 Node 默认值。显式设置 executor: "quickjs" 可保留加固的来宾隔离。已弃用的 runtime 字段不是运行时别名;对于旧配置,请使用 openclaw doctor --fix。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw