--- summary: "代码模式实现布局、验证检查表和 E2E 测试计划" title: "代码模式维护者注释" doc-schema-version: 1 read_when: - "您正在更改代码模式源并需要文件布局" - "您正在验证代码模式更改,然后再登陆它" - "您正在撰写或审阅代码模式 E2E 报道" --- ## 实现布局 - 配置契约:`tools.codeMode` - 目录构建器:有效工具,用于压缩条目和 id 映射 - 模型表面适配器:用control/direct工具替换可见工具 - 执行合约:评估、继续、处置 - Node 执行器:工作线程和 VM 上下文在等待期间保留 - QuickJS 执行者:WASM 加载、评估、快照、恢复、处置 - 工作线程监管器:超时、终止、崩溃隔离 - bridge 适配器:JSON-safe 主机回调和结果传递 - 延续所有者:TTL、容量、run/session 范围、执行器固定 - 嵌套工具调用的轨迹投影 - 遥测计数器和诊断 共享目录和工具桥保留策略所有权。执行器拥有 JavaScript 执行和延续状态。 Node的`node:vm`是可信执行,不是沙箱安全边界。 重建 `before_tool_call` 挂钩必须按其原始顺序保留周围的执行包装器。调用者权限、取消、活动和运行生命周期检查包含准备和结果最终确定以及工具主体。执行包装器在复制工具元数据时注册其重建功能;仅模式副本保留该注册。 工具搜索将每个已发布的目录条目数组视为不可变的描述符快照。注册、限制和执行器重新绑定替换该数组;通过目录所有者发布架构或描述更改。每个快照都会延迟渲染搜索文本一次,而热搜索会重用内容寻址的词汇索引。每次搜索都会检查可见性,包括可变权限集,并且 BM25 统计数据仅使用该有效库存。缓存的词汇数据不包含工具执行器。 ## 验证清单 代码模式覆盖应证明: - 没有启用覆盖的禁用配置使现有工具暴露保持不变 - omited `enabled`,包括设置其他字段的对象配置,保持禁用状态,除非代理或模型覆盖启用它 - per-model `true`、`false` 和未设置值保留激活优先级、后备模型选择和封闭选项的限制 - 启用的配置在运行期间工具处于激活状态时,会向模型暴露 `exec`、`wait`,以及仅必需的 direct-only 工具 - omited执行者选择Node;显式 QuickJS 选择捆绑的插件,并且不可用的执行器会失败而不会回退 - 显式旧版 `runtime: "quickjs-wasi"` 迁移到 `executor: "quickjs"` - 全局和每个代理执行器选择在每个 `wait` 中保持固定 - 原始无工具运行、`disableTools` 和空允许列表不会触发代码模式载荷强制 - 每个符合目录资格的有效非 MCP 名称都有一名可调用的获胜者 - direct-only 工具保持模型可见,并且不会出现在 `catalog` 中 - denied 工具没有全局或目录句柄 - 裸全局变量、可调用 `catalog.search` 结果、`catalog.all` 以及处理 OpenClaw 和客户端工具的 `describe()` 工作,而无需暴露确切的 ID - `API.list("mcp")` 和 `API.read("mcp/.d.ts")` 公开 TypeScript-style MCP 声明,无需 bridge/tool 调用 - MCP 命名空间 `$api()` 作为架构的内联回退仍然可用 - MCP 命名空间调用适用于具有一个对象输入的可见 MCP 工具,而搜索句柄使用相同的命名空间调度程序,并且 `catalog.all()` 保持本机 - Tool Search 控制工具对模型表面和隐藏目录都不可见 - 嵌套调用会保留审批和钩子行为 - 捕获和未捕获的嵌套故障仍然可以恢复,而不会重播之前执行的副作用 - 网络控制的故障保留不受信任的内容包装和清理 - shell `exec` 对模型隐藏,但在允许时可作为来宾全局调用 - 递归的代码模式 `exec` 和 `wait` 不能从 guest 代码中调用 - 可执行单元接受普通 JavaScript,而类型化发现仍然可用 - TypeScript-only 语法和已停用的 `language`/`typecheck` 参数在任何嵌套工具分派之前失败 - 预期的访客 API 省略了 `import`、`require`、文件系统、网络和环境访问; QuickJS 隔离与 Node 的编程约束分开进行测试 - 无限循环会超时,且不能阻塞 Gateway - 执行器内存故障终止执行 - 输出上限适用于两个执行器;序列化快照上限适用于 QuickJS - `wait` 恢复执行器继续并返回最终值 - 过期、已中止、错误会话和未知的 `runId` 值会失败 - 转录回放和持久化会保留代码模式控制调用 - 转录和遥测会清晰显示嵌套工具调用 ## E2E 测试计划 更改运行时时对两个执行器运行这些: 1. 启动一个 `tools.codeMode.enabled: false` 的 Gateway。 2. 使用一个小型直接工具集发送一次 agent turn。 3. 断言模型可见的工具未发生变化。 4. 以 `tools.codeMode.enabled: true` 重启。 5. 使用 OpenClaw、plugin、MCP 和 client 测试工具发送一次 agent turn。 6. 断言模型可见的工具列表为 `exec`、`wait`,外加仅配置的 direct-only 工具。 7. 在`exec`中,调用安全裸全局变量并断言规范化名称、保留名称和冲突名称与快速索引匹配。 8. 搜索`catalog`,检查句柄metadata/`describe()`,并调用OpenClaw/plugin/client句柄而不观察确切的id。 9. 在 `exec` 中,调用 `API.list("mcp")` 和 `API.read("mcp/.d.ts")`, 并断言声明文件描述了可见的 MCP 工具。 10. 在`exec`中,在本机和MCP工具中按任务意图搜索,检查MCP句柄的声明,并调用它。验证规范化名称冲突、精确的命名空间查找、有界远程元数据和不受信任的输出包装器。直接 `MCP..({ ...input })` 调用必须同意,并且 `catalog.all()` 搜索后必须保持本机。 11. 断言被拒绝的工具不存在,并且无法通过猜测 id 来调用。 12. 启动一个嵌套工具调用,该调用在 `exec` 返回 `waiting` 后才解析完成。 13. 调用 `wait` 并断言持续上下文接收工具结果。 14. 断言最终答案包含恢复后生成的输出,无需重播。 15. Assert 超时、中止和继续到期清理运行时状态。 16. 导出轨迹,并断言嵌套调用在父级代码模式调用下可见。 仅限文档的对此页面的更改仍应运行 `pnpm check:docs`。