仓库与包总览
这一层我们离开概念,进入真实代码。本章先建立目录地图与命名约定,让你知道任何一块功能住在哪。依据 packages/README.md、AGENTS.md、docs/architecture.md。
顶层布局
| 目录 | 是什么 |
|---|---|
vendor/ | vendored Cordis 源码(论文参考实现);含 cordis/loader/include/hmr/schemastery/cosmokit/timer 等,全部 rescope 到 @deepseek-ai |
packages/ | DSH 自有工作区:@deepseek-ai/dsh-<pkg>,按 group 组织在 packages/<group>/<pkg>/ |
python/ | Python SDK 与打包运行时 |
native/ | @deepseek-ai/node-addon-landlock-run 原生模块源(Linux 沙箱) |
examples/ | 可运行的 cordis.yml 叶子(在 packages/examples bundle 之上) |
docs/ | 架构、生成的目录、postmortem、cookbook |
scripts/ | 仓库门禁与生成器(doc-sync、module-graph、cordis-catalog 等) |
website/ | 选编文档的 VitePress 投影站点 |
.agents/ | Agent 工作流与 Agent Notes(决策记录) |
packages/ 的 group 划分
group 持有 packages/<group>/<pkg>/,包名保持 @deepseek-ai/dsh-<pkg>。按职责归类:
核心脊柱(stable API)
| group | 角色 |
|---|---|
core/ | 产品 API 脊柱:session、system-prompt、tools、agent、agent-loop、scope |
llm/ | LLM 能力族:抽象服务 + provider 适配器 |
api/ · typert/ | 远程 BFF 装配 + Typert RPC 网关 / 类型图生成与运行时注册表 |
goal/ · schedule/ · feedback/ · identity/ | 同会话目标、定时跟进、人类反馈、匿名身份 |
能力族(capability families,stable)
每个能力族通常是一个完整接缝(Service Definition + Provider + Consumer):shell、terminal、subprocess、sandbox、fs、lsp、skill、compaction、context、subagent、jobs、workflow、web、attachment、spill、code-runtime、e2b。
运行时与数据平面
| group | 角色 |
|---|---|
boot/ · host/ · client/ | 启动装配 / Web-GUI host 半边 / 浏览器半边 |
session/ · session-query/ | 持久会话数据平面(JSONL/SQLite)/ 会话检索 |
settings/ · credentials/ · storage/ · workspace/ | 用户设置 / 凭据引用 / 非会话存储 / 工作区实体 |
sdk/ · acp/ | 进程外运行时 SDK(JSON-RPC)/ 自动化 ACP 服务器 |
interaction/ · hooks/ · extensions/ | 人机协作面 / hook 桥 / agent 自我修改 |
bundle/ · preset/ · guard/ · todo/ · plan/ | profile patch 层 / 预设 / 循环卫生守卫 / todo 工具 / plan 状态 |
util/ · test-support/ · examples/ | 零依赖工具 / 测试基建 / 示例 |
核心包与 ctx 键
整条 turn 流经这六个包,它们构成脊柱:
| 包 | 拥有 | ctx 键 |
|---|---|---|
core/session | 追加式 SessionEvent 日志与内存存储 | ctx.sessions |
core/system-prompt | prompt 段落与工具 schema 装配 | ctx.systemPrompt |
core/tools | 带作用域的工具注册表与受守卫的执行管道 | ctx.tools |
core/agent | Agent 接口、实时注册表、agent/* 事件 | ctx.agents |
core/agent-loop | 实现该接口的默认驱动器 | ctx.agentLoop |
core/scope | 逐 agent 的作用域注册原语 | 库,无 ctx 键 |
llm/llm | 消息与流词汇 + 适配器接缝 | ctx.llm |
scope/ 是唯一非服务包:零依赖的库(createScope/scopeOf/scopeTarget),在 module graph 里位于 session/ 与 system-prompt 之下,好让它们消费它而不成环。agent-loop 是 Agent 契约的唯一具体实现,扩展插件依赖 agent(拿发起 Agent)而绝不直接依赖 agent-loop——所以循环可替换。
命名与产物约定
- 每个 npm 包是
@deepseek-ai/dsh-<name>;vendored 包 rescope 成@deepseek-ai/cordis等、private: true。@deepseek-ai/cordis是每个 harness 包的 peerDependency(+dev)。 - 全 ESM(
"type": "module")。跨包用包名,本地相对导入用.ts。 - 每个包有
src/types.ts(仅类型,无运行时代码)、./invariant(事件/数据关系检查或空安装器的理由)、README(含 Model Experience 与 Known Limitations)。
两个跨包类型模式
…Map → derived-union(声明合并扩展)
几乎所有可扩展的联合类型都用同一种模式:一个按键分判的 interface(…Map),用 keyof 派生联合。插件不改源包就能加变体:
interface ThingMap {
'a': { kind: 'a'; /* … */ }
'b': { kind: 'b'; /* … */ }
}
type ThingKind = keyof ThingMap // 'a' | 'b'
type Thing = ThingMap[keyof ThingMap] // 判别联合
// 别的插件扩展它,不动源包:
declare module '@deepseek-ai/dsh-llm' {
interface ThingMap { 'c': { kind: 'c'; /* … */ } }
}
六个规范 map:ContentBlockMap、MessageSourceMap、FinishReasonMap(都在 dsh-llm)、TurnTriggerMap、TurnEndReasonMap、SessionEventMap(都在 dsh-session)。switch 联合类型时按 tag 走,别用 if 链——这样每个分支能收窄,写错 tag 编译就报错。
Branded IDs
跨包传递的 id 是带品牌的——结构上是 string,但类型层不可互换(一个 SessionId 塞不进要 CallId 的地方)。构造走每类型一个工厂;比较/日志/JSON 当普通 string。Branded<B> 在零依赖的 dsh-brand。
依赖图是生成的
完整的包依赖图见 docs/module-graph.md,由 pnpm run gen-module-graph 生成并在 CI 里做新鲜度门禁。扩展插件依赖 Service Definition,从不依赖具体 provider。
core/session → core/tools → core/agent+agent-loop → llm → core/scope。每节带真实类型签名与源码定位,建议对照打开仓库跟着读。