Skip to content

工作区 ​

dsh 是在根 package.json 中声明的 pnpm 工作区:

json
"workspaces": [
  "vendor/*",
  "packages/*/*",
  "native/landlock-run",
  "native/landlock-run/packages/*",
  "apps/*",
  "website"
]

这里可见三种结构性模式:

  • packages/*/*——产品本体,组织为 packages/<group>/<pkg>,即「一组包」的直观形态。
  • vendor/*——内嵌的框架层(Cordis 及其伙伴),行为上像一个独立层级。
  • apps/*、native/...、website、python——产品组装物与部署根。

顶层布局 ​

apps/         产品启动器:`cli`(`dsh` 二进制)与 `web`(前端)
docs/         官方双语文档源(上游)
native/       原生代码:`landlock-run` 及其按平台拆分的包
packages/     产品层——51 个组目录
python/       Python SDK 及其运行时
scripts/      仓库工具(门禁、生成器、发布)
vendor/       源码内嵌的 Cordis 框架与基础库
website/      投影 docs/ 源选集的 VitePress 站点(`@deepseek-ai/website`)

packages 层:51 个组 ​

按目录统计,packages/ 下共有 51 个组目录;解析 packages/*/*/package.json glob 得到 251 个 包层包。本 commit 下可复现的数值是 51 个组、251 个包层项目,加上 apps/vendor/native/website 后共 267 个工作区成员。各组及其角色:

组一行角色
coreagent 主循环、会话、scope、工具注册表、系统提示词
sessionSessionEvent 日志、会话领域、投影/引用材料
context喂入模型可见历史的上下文来源
compaction把长日志整理成摘要上下文
sandbox限制后端、沙箱策略、文件系统观测
fs文件系统服务、本地/沙箱提供商、文件系统工具
shellbash/pwsh 能力接缝与工具(典型接缝示例)
llmLLM 服务、DeepSeek 提供商、Token 计量
apiAPI 网关与 remotes(Host↔Client RPC)
hostHost 平台:webserver、frontend-static、plugin-inventory、directory-picker 家族
client浏览器/运行时一侧与每个 UI 模块(ui-*)
sdkJSON-RPC SDK:client、server、protocol
subagent子代理能力接缝及其众多提供商
workflow工作流/worker-thread 编排
goal同会话目标与目标轮次驱动
plan计划模式
skill技能注册表、文件系统技能、tool-skill
mcpMCP 客户端
lspLSP 集成
acpAgent Client Protocol 服务器端
hooksClaude Code / Codex hooks 桥
storage持久化后端
settings设置服务
credentials凭据存储
guard超时 / 重复提醒守卫
feedback用户反馈采集
identity节点身份 / 会话身份
interaction运行时的命令、提问、审批
jobs后台任务服务
schedule持久提醒
spill上下文溢出(spill)
attachment消息附件
bundle组合束:base、web-app、headless
boot启动胶水与命令行:app-boot、cmdline
code-runtime代码执行运行时
e2bE2B 提供商
examplesagent-spine-demo——幸存的演示包(顶层 demos 已退役)
experimental排除在官方发布之外的实验性能力:agent-team 家族、跨领域 inspector、webworker 运行时/打包器
extensions额外扩展点
runtime-diagnostics运行时诊断工具
test-support测试框架、mock LLM 服务器
typert类型反射 / 代码生成器
util小型共享工具(home-paths、timeout、brand…)
webweb/搜索能力工具(tool-web、web-fetch-http、搜索提供商)
webhook经验证的外部事件 → Sessions:webhook 运行时 + webhook-github 签名适配器
workspace工作区模型(根、选择)
presetagent preset 组合
session-query会话上的查询/日志导出
subprocess进程派生
terminal持久终端(PTY)后端
todotodo 工具

(有些组把面向模型的工具放进兄弟组——例如 todo/tool-todo、session-query/tool-session-query——而 非内联,这就是为什么用一行给出某个组的角色只是近似。docs/module-graph.md 是生成的、权威的依赖图。)

其余层级 ​

在 packages/ 之外,工作区还包含:

层成员角色
apps/cli(@deepseek-ai/dsh)、web(@deepseek-ai/dsh-web-frontend)dsh 启动器与浏览器前端构建
vendor/9 个包(cordis、loader、include、group、hmr、timer、logger-console、cosmokit、schemastery)源码内嵌框架,重命名进 @deepseek-ai 作用域
native/landlock-run + Linux arm64/x64 平台包 + entryLandlock 沙箱启动器
website/@deepseek-ai/website文档站
python/sdk、sdk-runtimePython SDK(deepseek-harness-sdk)与捆绑运行时部署根

顶层的 examples/ 层已被退役(上游 commit 4125514a08 "refactor(repo): retire top-level examples"): 演示移入 apps/cli/config/examples/{cordis,github-review,mcp-memory,schedule} 作为补丁覆盖,测试移入 apps/cli/tests/profiles/{acp,headless,sdk}。packages/examples/ 作为产品组仍存在,但现在只包含 agent-spine-demo。

vendor 层对读者而言或许是意义最大的层:产品中任何一处 import 的 cordis,实际解析为 vendor/cordis 下的 @deepseek-ai/cordis,因此框架本身也是本仓库中一个固定、带差异防护的部分(参见内嵌(Vendor)库)。

命名约定 ​

每个产品包都是 @deepseek-ai/dsh-<name>——即 harness 家族。值得注意的是:

  • CLI 包就叫 @deepseek-ai/dsh(无后缀),根清单是 @deepseek-ai/dsh-root,前端是 @deepseek-ai/dsh-web-frontend。
  • 内嵌框架使用同样的作用域,但使用不同的家族标记:@deepseek-ai/cordis、 @deepseek-ai/cordis-plugin-loader 等,让 harness 包(dsh-*)与托管的框架(cordis-*)在视觉上区分开来。
  • 在同一组内,包共享 dsh- 前缀并常有角色后缀:@deepseek-ai/dsh-tool-bash、@deepseek-ai/dsh-bash-local、 @deepseek-ai/dsh-bash-sandbox。

一个能力接缝 → 若干包 ​

命名是更深层组织原则的症状:一个能力接缝对应多个包,每包一个角色。 位于 packages/shell/ 的 bash/shell 接缝是典型示例:

包角色
@deepseek-ai/dsh-shell服务定义——ShellExecutor(ctx.shell)+ 词汇
@deepseek-ai/dsh-bash-local服务提供商——本地子进程
@deepseek-ai/dsh-bash-sandbox服务提供商——同样的机制,经由 ctx.sandbox 限制
@deepseek-ai/dsh-tool-bash消费者——面向模型的 bash 工具

这正是 docs/architecture.md 中「服务定义 / 提供商 / 消费者」三角色模式,它在整个 monorepo 中反复 出现:子代理(定义 subagent/subagent、提供商 subagent-*、消费者 tool-subagent)、文件系统 (fs/fs、fs/fs-local + fs/fs-sandbox、fs/tool-fs)、LLM(llm/llm、llm-* 提供商、无常设 工具)。一个包可以合并角色,但单独一个角色并非接缝——这就是仓库往往在一个组里放多个小包而非一个肥大包的 原因。

这些数字从何而来 ​

两个生成文件给出了结构的可验证基准:

  • docs/module-graph.md —— 从每个包的 peerDependencies 推导的包间依赖图,并按 packages/<group>/<pkg> 分组。
  • docs/graph-atlas.md —— 关系图的索引(模块图、工具目录、能力接缝、应用组合、事件矩阵、生命周期)。

用 pnpm run gen-module-graph 重新生成模块图;用 pnpm run verify-module-graph 验证。apps/cli/composition.md 文件渲染了 CLI 组合后的 dsh-base 共享 profile。

延伸阅读 ​