---
title: Tool Operations 接口层
created: 2026-05-02
updated: 2026-05-02
type: concept
tags: [tool, runtime, backend, architecture]
sources: [docs/superpowers/specs/2026-05-01-tool-pluggable-operations-design.md, packages/backend/src/modules/netaclaw/tools/operations/, packages/backend/src/modules/netaclaw/tools/builtin/, packages/backend/src/modules/netaclaw/service/tool_resolver.ts, packages/backend/test/tool_operations.test.ts]
---

# Tool Operations 接口层

Tool Operations 是 2026-05-01 后引入的工具执行后端抽象层。它把 [[tool-system]] 中 `bash`、`read_file`、`write_file`、`list_dir`、`find_files`、`grep`、`edit`、`patch` 这些内置工具的业务逻辑，与底层文件系统 / 子进程 / 搜索命令调用解耦。

它不是替代 [[tool-governance]] 或 [[tool-runtime-policy]]：治理层仍决定工具是否可见、是否能进子 Agent、走哪种 worker route；Operations 层只负责“被允许执行后，具体由哪个后端完成 I/O 和进程操作”。

## 三组接口

`tools/operations/types.ts` 定义三组接口，并聚合为 `ToolOperations`：

| 接口 | 核心方法 | 用途 |
| --- | --- | --- |
| `FileOperations` | `readFile`、`writeFile`、`appendFile`、`access`、`readDir`、`mkdir`、`realpath` | 文件读写、目录枚举、写队列 realpath key |
| `ProcessOperations` | `exec(command, cwd, options)` | shell 命令执行、流式 stdout/stderr、超时和 abort |
| `SearchOperations` | `ripgrep`、`fd` | `grep` / `find_files` 的搜索后端 |

`tools/operations/local.ts` 是默认本地实现，使用 `fs/promises` 和 `comm/child_process.spawn`。`getDefaultOperations()` 通过 `tools/operations/index.ts` 提供单例，避免每次 resolver 重新创建实现对象。

## 当前落地范围

最近提交已完成四个阶段：

1. 建立 `ToolOperations` 接口、本地实现和 `tool_operations.test.ts` 契约测试。
2. 将 read/write/list、edit/patch、find/grep/bash 迁移到 factory + operations 注入模式。
3. 在 `tool_resolver.ts` 统一注入 `operations?: ToolOperations`，主进程默认使用 `getDefaultOperations()`。
4. 清理旧的 queue 签名和 bash 自有 operations，工具业务文件不再直接承担底层 spawn / fs 抽象职责。

因此新增或测试内置文件工具时，应优先 mock `ToolOperations`，而不是真实读写宿主机文件系统。

## 与子 Agent 的关系

[[subagent-session]] 仍以 [[tool-runtime-policy]] 的 manifest route 判断某个工具是 `worker-local`、`main-process-proxy` 还是 `disabled`。Operations 改造后的价值是让 worker / 主进程可以在构建工具实例时注入不同后端，而不用改工具的参数校验、diff 计算、输出截断等业务逻辑。

当前实现先保持原有工具粒度路由，不把权限下沉到每个 file/process 方法。未来如果需要远程 workspace、Docker 沙箱或 SSH 后端，可以新增 `ToolOperations` 实现，再由 resolver 按会话策略注入。

## 运行时细节

- `LocalProcessOperations.exec()` 统一通过 `comm/child_process.spawn`，继承 Windows 下隐藏控制台窗口的处理。
- bash 输出中的 ANSI escape code 在 LocalOperations 层剥离，避免每个工具重复清理。
- `withFileMutationQueueOps()` 用注入的 `FileOperations.realpath()` 取队列 key，后续远程文件系统可以自定义“同一文件”的判断。
- `SearchOperations` 单独抽出是因为 ripgrep/fd 的缺失、fallback 和参数语义与普通 shell 命令不同。

## 设计边界

- Operations 不负责判断工具是否可用；最终可见性仍看 [[tool-governance]] 的 resolver 输出。
- Operations 不改变 LLM 看到的工具 schema；prompt 和参数兼容旧工具。
- Operations 不负责 Session Tree 写入；工具结果仍由 [[agent-runtime]] / [[session-tree-runtime]] 记录。
- Operations 不包含 `memory_*`、`delegate_*`、`clarify`、`todo` 等不直接做文件或进程操作的工具。

## 相关页面

- [[tool-system]]
- [[tool-governance]]
- [[tool-runtime-policy]]
- [[subagent-session]]
- [[agent-runtime]]
