---
title: Tool 全局治理系统
created: 2026-04-19
updated: 2026-05-15
type: entity
tags: [tool, agent, config, backend, frontend]
sources: [packages/backend/src/modules/netaclaw/entity/tool.ts, packages/backend/src/modules/netaclaw/service/tool_registry.ts, packages/backend/src/modules/netaclaw/service/tool_resolver.ts, packages/backend/src/modules/netaclaw/tools/manifest.ts, packages/backend/src/modules/netaclaw/tools/runtime_policy.ts, packages/backend/src/modules/netaclaw/tools/presentation.ts, packages/frontend/src/modules/agent/views/tools.vue, packages/frontend/src/modules/agent/views/agent-edit.vue]
---

# Tool 全局治理系统

Tool 全局治理系统位于 [[tool-system]] 之上，负责把工具从“代码里的可调用函数”提升为“可同步、可禁用、可按 Agent 覆盖、可诊断、可进入子进程策略”的平台能力。

当前治理口径已经扩展到四类输出：

- 最终可用工具列表。
- Prompt Hint 和工具描述投影。
- Agent/子 Agent 的启停和 override 结果。
- Worker runtime profile 与 blocked reason，详见 [[tool-runtime-policy]]。

2026-04-22 之后，这一层又新增了两个重要职责：

- 生成 `toolRuntimeRoutes`，把“配置上允许”进一步收口为“当前运行态到底走 worker-local、main-process-proxy 还是 disabled”。
- 生成 `runtimeDiagnostic` / renderer capability 投影，供工具管理页、Agent 编辑页和对话页使用同一套解释。

2026-05-02 后，还需要把 [[tool-operations]] 看成工具执行后端维度：治理层决定某个工具是否进入 runtime，Operations 决定这个工具执行时用本地、mock、worker proxy 还是未来的远程/沙箱实现。两者不能混用：不要用 Operations 判断工具是否应显示，也不要用 DB governance 直接替代文件/进程后端注入。

2026-05-15 后，`mysql_*` 工具也纳入同一套治理口径：[[tool-catalog]] 注册 `mysql` toolset，`tool_resolver.ts` 注入 MySQL 数据源、schema 和查询服务，manifest 将这些工具统一路由为 `main-process-proxy`。治理层只决定工具是否对某个 Agent 可见；真正的数据源授权、SQL guard、脱敏列拒绝、连接池和查询审计仍留在 [[mysql-data-source]] 的服务端实现中。

## 数据模型

`netaclaw_tool` 记录全局工具治理配置。核心字段包括：

| 字段 | 含义 |
| --- | --- |
| `name` | 工具唯一标识 |
| `toolset` | 所属工具集 |
| `label` | 展示名称 |
| `description` | 展示描述 |
| `visibility` | `tool`、`skill`、`internal` |
| `capability` | `text`、`vision`、`multimodal` |
| `status` | 全局启停 |
| `isCore` | 是否核心工具 |
| `canDisable` | 核心工具是否允许 Agent 级关闭 |
| `supportsPromptHint` | 是否支持 Prompt Hint |
| `promptHint` | 运行提示覆盖 |
| `sort` | 展示顺序 |
| `extra` | 运行时扩展配置，如 `workerRoutingStrategy`、`allowInSubagent` |

## 核心服务

| 文件 | 职责 |
| --- | --- |
| `service/tool_registry.ts` | catalog 同步、DB 治理配置读写、管理端查询 |
| `service/tool_resolver.ts` | 根据全局治理、Agent 配置、运行上下文生成最终工具投影 |
| `tools/manifest.ts` | 为工具生成 worker/runtime manifest |
| `tools/runtime_policy.ts` | 推导子进程 policy、路由状态和 blocked reason |
| `tools/presentation.ts` | 统一前端展示文案和运行时投影格式 |
| `tools/operations/` | 工具底层执行后端接口与本地实现 |

## Resolver 输入

`tool_resolver.ts` 的有效决策不只来自全局开关，还包括：

- Agent 的 `tools.enabled` 和 `tools.disabled`。
- Agent 的 `toolOverrides`、`draftAgentTools`、`draftToolOverride`。
- `subagentConfig.enabled`、`allowedToolNames`、`allowedPresetAgentIds`。
- 当前模型能力，例如 vision/multimodal。
- 当前运行上下文，例如主 Agent、子 Agent、Crew、Skill、Memory。
- session cwd、workspace roots、shell/readonly 策略。
- 可选 `operations` 注入；测试、worker 或未来远程执行可替换底层后端。

## Resolver 输出

后端应该返回统一 projection，而不是让前端三处页面各自推导：

- `toolNames`: 当前真正进入 runtime 的工具名。
- `tools`: 可执行工具实例或工具元数据。
- `toolPromptHints`: Prompt Builder 消费的 hint。
- `disabledReasons`: 解释工具为何没有生效。
- `runtimeDiagnostic`: 工具运行画像、worker route、blocked reason。
- `effectiveRuntimeProfile`: 对当前 Agent 生效的 runtime profile。
- `effectiveSubagentAllowed`: 对当前 Agent/子 Agent 生效的可用性。
- `toolRuntimeRoutes`: 当前会话和策略下每个工具的实际运行路由。

这保证工具管理页、Agent 编辑页、对话页看到同一套结果。

其中有两个边界需要特别强调：

- `effectiveRuntimeProfile` 偏静态画像，描述该工具通常需要哪些权限、支持哪种 worker routing hint。
- `toolRuntimeRoutes` 偏动态结果，描述在当前 session cwd、workspace roots、allowShell、readonly 条件下的最终实际路由。

只有把这两层都看完，才能判断一个工具为什么“看起来允许但运行时被挡住”。

新增 `execute_skill` 后，Skill 工具集的治理也需要区分：`read_skill` / `read_skill_file` 是 prompt/toolkit skill 的读取入口，`execute_skill` 只应在 Agent 绑定 compute-entry skill 且工具治理允许时进入 runtime。详见 [[skill-runtime]]。

## 前端页面职责

### 工具管理页

`packages/frontend/src/modules/agent/views/tools.vue` 面向全局治理：

- 查看和同步 catalog。
- 编辑全局启停、核心工具、是否可关闭、Prompt Hint、排序。
- 展示工具 runtime profile、worker routing、renderer 绑定、文件能力标签。
- 页面需要可滚动，避免工具增多后看不到底部内容。
- 支持调用 `/admin/netaclaw/tool/runtimeDiagnostic` 查看在指定 session cwd / workspace roots / shell / readonly 条件下的真实诊断结果。

### Agent 编辑页

`packages/frontend/src/modules/agent/views/agent-edit.vue` 面向局部配置：

- 配置当前 Agent 的工具开启/关闭。
- 配置子 Agent 是否启用、并发、可用预设 Agent、允许工具。
- 预览后端返回的 effective projection。
- 保存本地存储、workspace、运行策略相关配置时，应影响子 Agent 工具推导。

这一页现在不只是“勾选工具”：

- 会直接展示每个工具的 `effectiveRuntimeProfile`。
- 会直接标记 `effectiveSubagentAllowed`，帮助判断该工具是否允许进入子代理。
- 会结合 `toolRuntimeRoutes` 告诉用户配置保存后，子 Agent 最终走哪条执行路径。

### 对话页

`packages/frontend/src/modules/agent/views/chat.vue` 面向实际运行结果：

- 展示工具调用过程。
- 展示子 Agent 批次工具路由。
- 对 blocked reason 使用同一套文案。
- 通过 [[session-tree-runtime]] 恢复历史。
- 对子 Agent 任务只显示本批次请求到的工具路由，而不是整套全局路由。

## 与 Prompt Builder 的关系

Prompt Builder 不直接读取 catalog，而是消费 resolver 输出：

```text
tool_registry/catalog
  -> tool_resolver
  -> toolNames + toolPromptHints + runtimeDiagnostic
  -> prompt_builder
  -> runAgent
```

这样工具行为提示、禁用原因、模型能力过滤可以在一处收敛。

## 与 Renderer 的关系

治理系统已经不只决定“能不能执行”，还决定“前端怎么展示”：

- `tools/presentation.ts` 负责输出 renderer capability projection。
- 工具管理页会显示某个工具是自定义渲染器还是默认绑定。
- 这使“新增工具但页面表现很差”也成为治理问题的一部分，而不只是前端细节。

## 相关页面

- [[tool-system]]
- [[tool-runtime-policy]]
- [[tool-operations]]
- [[tool-catalog]]
- [[mysql-data-source]]
- [[agent-runtime]]
- [[subagent-session]]
- [[prompt-builder]]
- [[frontend-architecture]]
