数据截至 (上游 commit 99f6f02fecdb)
第 6 章 · 每会话独立组装与产品外壳:presets、系统提示词、RPC 与多前端
30 秒导读: 前五章讲的是「一个 agent 怎么跑起来」。这一章讲最上层的两件事——同一个进程里,每个会话怎么拥有自己那一套工具和提示词;以及这套内核怎么长出 Web / CLI / SDK / ACP 四种产品外壳。
1. 这一章要解决的问题
1.1 矛盾在哪
第 1 章说过:整个产品是一棵 Cordis 插件树,cordis.yml 里写什么,进程里就有什么。
问题来了:一棵树是全进程唯一的。
但产品要的是:同一个进程里同时跑三个会话,会话 A 用「标准模式」(十几个工具),会话 B 用「PTC 模式」(工具收敛成一个 run_code),会话 C 用「极简模式」(只有 bash 和 str_replace_editor)。
如果工具注册表是全局的,三个会话看到的工具就一模一样。
1.2 解法两句话
- 切视图,不切树。 引入一个叫 scope(作用域) 的东西:每个 agent 有一把不可见的钥匙,注册表按钥匙分层,读的时候只把「自己这一层 + 祖先层」合并出来。
- 每套配置只装一份,会话去认领。 一个 preset(预设配置)在进程里只挂载一次,形成一份常驻挂载(standing mount);会话不重新装一遍,而是把自己的钥匙认到这份挂载名下,从此继承它的全部注册。
1.3 用起来什么样
用户视角就是 Web 界面上一个下拉框。仓库自带四个 preset,每个是 apps/cli/config/agent-presets/ 下的一个目录:
| preset 目录 | 显示名 | 这套配置给的能力 |
|---|---|---|
standard | 标准模式 | 完整编码 agent:文件编辑、Shell、检索、Skills、计划、目标、子代理、工作流 |
code | PTC 模式 | 与 standard 完全一致,只多一行——工具改用 Code Mode 呈现 |
cordis | 创造模式 | standard 全部能力 + 运行时自检 + preset 创作指导 |
minimal | 极简模式 | 只有持久 bash 与 str_replace_editor,人格固定,无压缩 |
依据:apps/cli/config/agent-presets/{standard,code,cordis,minimal}/preset.yml。
2. 顶层全景
2.1 一张图:三个平面
怎么读:从下往上是「越来越私有」。同一列的东西共享,不同列的东西互不可见。
┌──────────────────────────────────────────────┐
host plane │ 宿主平面(全进程一份,全局层) │
(第 1 章) │ 工具注册表本体 · 沙箱 · 审批 · 持久化 · 模型路由 │
└───────── ──────┬──────────────────────────────┘
│ registrations 向下继承
┌─────────────────────┼─────────────────────┐
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ standing │ │ standing │ │ standing │ ← preset 常驻挂载
│ mount │ │ mount │ │ mount │ 每个 preset 只有一份
│ standard │ │ code │ │ minimal │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
│ 认父(bindScopeParent) │
┌───┴────┐ ┌─┴──┐ ┌──┴─┐
▼ ▼ ▼ ▼ ▼ ▼
会话A 会话B 会话C 会话D 会话E 会话F ← agent scope
(事件沿同一条链向上冒泡 ↑)
2.2 部件一句话职责
| 部件 | 干什么 | 在哪 |
|---|---|---|
dsh-scope | 造钥匙、连父子链、按链分层存/取、按链路由事件 | packages/core/scope/src/{index,store}.ts |
dsh-agent-presets | 认识 preset 目录、挂常驻挂载、把 agent 认到挂载名下 | packages/preset/agent-presets/src/ |
dsh-system-prompt | 收集四类提示词贡献、排序去重、组装成一次请求的输入 | packages/core/system-prompt/src/index.ts |
| Typert + api/gateway | 从 TypeScript 类型图生成 RPC 契约,落成运行时服务 | packages/typert/*、packages/api/* |
| host/webserver 等 | HTTP 路由、静态托管、浏览器 RPC 代理 | packages/host/* |