9.2 KiB
Lime 工具治理架构
1. 设计目标
本次工具治理的设计目标只有四个:
- 只保留一套 metadata 解释器
- 只保留一份 native tool catalog
- MCP 独立运行,但统一注入 Agent runtime
- 把“工具发现”和“工具权限执行”彻底分开
2. 核心事实源
2.1 统一元数据事实源
路径:src-tauri/crates/core/src/tool_calling.rs
负责:
deferred_loadingalways_visibleallowed_callerstagsinput_examples- tool search 打分
- caller 归一化
任何地方如果还在自己读 x-lime / x_lime,都应视为治理退化。
2.2 native 目录事实源
路径:src-tauri/src/agent_tools/catalog.rs
负责:
- 工具目录完整性
- source / lifecycle / capability / permission_plane
- 默认 allowlist 子集
- Creator / Browser Assist surface 裁剪
- MCP extension surface 聚合
2.3 执行权限事实源
路径:src-tauri/src/agent_tools/execution.rs
负责:
- execution 层 warning gate 收口
- workspace 参数限制模板收口
- sandbox profile 归类
- permission 模板生成
- inventory execution profile 暴露
- 默认策略、persisted policy、runtime session override 的优先级合并
2.4 MCP runtime 事实源
路径:src-tauri/crates/mcp/src/manager.rs
负责:
- MCP server lifecycle
- tool cache
list_toolslist_tools_for_contextsearch_tools- runtime metadata 继承与自动 defer 策略
2.5 Agent 注入事实源
路径:src-tauri/src/commands/aster_agent_cmd.rs
负责:
tool_searchbridge tool- MCP -> Aster extension 注入
- workspace tool allowlist
- runtime tool inventory 命令
2.6 轻量测试载体
路径:
src-tauri/crates/agent/src/lib.rssrc-tauri/crates/agent/src/agent_tools/mod.rs
负责:
- 把
src-tauri/src/agent_tools/catalog.rs - 把
src-tauri/src/agent_tools/execution.rs - 把
src-tauri/src/agent_tools/inventory.rs
以模块方式复用到 lime-agent crate 内,供纯逻辑单测执行。
注意:
- 它不是新的 runtime 事实源
- 它只是测试载体,避免
lime主包为 Tauri/App wiring 做超大链接 - 运行时事实源仍然是 app crate 下的
catalog.rs/execution.rs/inventory.rs
3. 总体架构图
graph TD
UI[前端 / agentRuntime.ts] --> CMD[aster_agent_cmd.rs]
CMD --> CAT[agent_tools/catalog.rs]
CMD --> EXEC[agent_tools/execution.rs]
CMD --> INV[agent_tools/inventory.rs]
CMD --> META[lime_core::tool_calling.rs]
CMD --> MCP[lime_mcp::manager.rs]
CMD --> AGENT[Aster Agent]
TEST[lime-agent test carrier] -. 复用纯逻辑 .-> CAT
TEST -. 复用纯逻辑 .-> EXEC
TEST -. 复用纯逻辑 .-> INV
MCP --> MCPTOOLS[MCP Runtime Tools]
MCP --> PROMPTS[MCP Prompts / Resources]
AGENT --> REG[ToolRegistry]
AGENT --> EXT[ExtensionManager]
MCPTOOLS --> EXT
META --> MCP
META --> CMD
META --> PROVIDERS[Provider Tool Conversion]
CAT --> EXEC
CAT --> INV
EXEC --> INV
REG --> INV
EXT --> INV
MCP --> INV
4. 初始化时序图
下面是 Lime 启动 Agent 并把 MCP 工具面注入 Aster 的主链路。
sequenceDiagram
participant UI as 前端
participant CMD as aster_agent_init
participant STATE as AsterAgentState
participant MCP as McpClientManager
participant META as lime_core::tool_calling
participant EXT as Aster ExtensionManager
UI->>CMD: aster_agent_init()
CMD->>STATE: init_agent_with_db()
CMD->>MCP: ensure_lime_mcp_servers_running()
CMD->>MCP: list_tools()
MCP->>META: extract_tool_surface_metadata()
MCP-->>CMD: McpToolDefinition[]
CMD->>CMD: build_mcp_extension_surface()
CMD->>EXT: add_client(extension, bridge_client)
CMD->>CMD: ensure_tool_search_tool_registered()
CMD-->>UI: initialized + tool surface ready
5. 工具检索 / 按需加载流程图
这个流程对应 Anthropic Tool Search / Codex defer loading 的同类思路。
flowchart TD
A[用户任务] --> B{现有默认上下文能否完成?}
B -- 是 --> C[直接使用默认可见工具]
B -- 否 --> D[调用 tool_search]
D --> E[查询 native registry + extension searchable tools]
E --> F{目标工具是否 deferred?}
F -- 否 --> G[直接执行]
F -- 是 --> H[通过 ExtensionManager 加载目标工具]
H --> I[把工具加入可执行工具面]
I --> G
G --> J[执行时再走 sandbox / approval / 参数限制]
关键点:
tool_search负责“找工具”allowed_callers负责“谁能看见 / 调用”deferred_loading负责“是否默认进上下文”- sandbox / approval 负责“执行时能不能做”
6. 权限平面拆分
6.1 目录层
由 catalog.rs 定义。
回答的问题:
- 这个工具属于哪个产品 surface
- 是 current 还是 compat
- 是 Aster builtin、Lime injected 还是 Browser compatibility
6.2 上下文层
由 tool_calling.rs + mcp manager + tool_search 定义。
回答的问题:
- 默认可见还是 deferred
- caller 是否匹配
- 是否需要 tool_search 后再进入
6.3 执行层
由 agent_tools/execution.rs + Aster ToolPermissionManager + workspace sandbox / runtime approval 定义。
回答的问题:
- 参数是否受限
- 是否要求审批
- 是否要进入 sandbox
- 当前 workspace 是否允许
结论:不要再让目录层和执行层共享同一套“权限”语义。
7. 与 Codex 的对照
6.4 执行策略解析时序图
下面是一次工具执行前,effective execution policy 的解析链路。
sequenceDiagram
participant UI as 前端 / request.metadata
participant CMD as aster_agent_cmd.rs
participant CFG as NativeAgentConfig.tool_execution
participant EXEC as agent_tools/execution.rs
participant PERM as ToolPermissionManager
UI->>CMD: submit turn / get inventory(metadata)
CMD->>CFG: 读取 persisted policy
CMD->>EXEC: resolve_tool_execution_policy(tool, config, metadata)
EXEC->>EXEC: 合并默认策略
EXEC->>EXEC: 叠加 persisted override
EXEC->>EXEC: 叠加 runtime override
EXEC-->>CMD: effective policy
CMD->>PERM: build_workspace_execution_permissions(...)
CMD-->>UI: inventory / runtime 权限结果
结论:
catalog.rs仍只定义目录层事实execution.rs独占执行层合并逻辑aster_agent_cmd.rs只负责 orchestration,不再手工散写 permission 模板- provenance 也在
execution.rs统一生成,inventory 只消费结果,不再自行推断来源
7. 与 Codex 的对照
7.1 Codex 怎么做
参考:
codex-rs/app-server-protocol/src/protocol/v2.rscodex-rs/state/src/runtime/threads.rs
Codex 的关键点:
-
小型常驻工具配置
ToolsV2只保留少量稳定入口,例如web_search、view_image
-
动态工具独立建模
DynamicToolSpec单独描述动态工具- 包含
defer_loading
-
线程级动态工具持久化
thread_dynamic_tools- 动态工具跟着 thread,而不是全局把所有 schema 塞进 prompt
-
权限与工具发现分离
AppToolsConfig管具体 app tool 的 enable / approval mode- sandbox / approval 是另一套系统
7.2 Lime 应该学什么
Lime 不需要一比一复制 Codex,但要学到这三个原则:
- 常驻工具面要小
- 长尾工具靠搜索和 deferred loading
- 权限执行不要和工具目录绑死
7.3 Lime 当前对应关系
| Codex | Lime 对应实现 |
|---|---|
DynamicToolSpec.defer_loading |
x-lime.deferred_loading + McpToolDefinition.deferred_loading |
thread_dynamic_tools |
Aster ExtensionManager searchable tools + MCP runtime cache |
| 小常驻工具面 | workspace_default_allowed_tool_names(...) |
| app tool config / approval 分离 | catalog.rs + execution.rs + workspace sandbox / Aster permission |
| persisted permissions profile | NativeAgentConfig.tool_execution |
| thread/request runtime override | request.metadata.harness.executionPolicy |
8. MCP 在架构里的位置
MCP 不是 native tools 的附属物,也不是另起一套 Agent。
它在 Lime 中应被视为:
- 独立的 runtime tool fabric
- 但通过 统一的 extension 注入边界 进入 Agent
这意味着:
- MCP server 启停、缓存、resource/prompt 仍然独立
- Agent 只看到统一后的 prefixed tool surface
- 工具搜索可以同时搜 native 与 extension
- 库存命令可以同时做 catalog / runtime / MCP 三视角盘点
9. dead-candidate 说明
以下路径当前不在主链路:
src-tauri/crates/agent/src/tool_permissions.rssrc-tauri/crates/agent/src/shell_security.rs
状态建议:
- 当前标记为
dead-candidate - 暂不删除
- 如果后续确认完全无运行时回流,再单独发起一次“删除旧权限系统”的治理变更