第三层 · 源码级深入

仓库与包总览

这一层我们离开概念,进入真实代码。本章先建立目录地图命名约定,让你知道任何一块功能住在哪。依据 packages/README.mdAGENTS.mddocs/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-promptprompt 段落与工具 schema 装配ctx.systemPrompt
core/tools带作用域的工具注册表与受守卫的执行管道ctx.tools
core/agentAgent 接口、实时注册表、agent/* 事件ctx.agents
core/agent-loop实现该接口的默认驱动器ctx.agentLoop
core/scope逐 agent 的作用域注册原语库,无 ctx 键
llm/llm消息与流词汇 + 适配器接缝ctx.llm
scope 为什么无 ctx 键
scope/ 是唯一非服务包:零依赖的库(createScope/scopeOf/scopeTarget),在 module graph 里位于 session/ 与 system-prompt 之下,好让它们消费它而不成环。agent-loopAgent 契约的唯一具体实现,扩展插件依赖 agent(拿发起 Agent)而绝不直接依赖 agent-loop——所以循环可替换。

命名与产物约定

两个跨包类型模式

…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:ContentBlockMapMessageSourceMapFinishReasonMap(都在 dsh-llm)、TurnTriggerMapTurnEndReasonMapSessionEventMap(都在 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/sessioncore/toolscore/agent+agent-loopllmcore/scope。每节带真实类型签名与源码定位,建议对照打开仓库跟着读。