ARCHITECTURE · 02
Cordis 框架:DeepSeek Harness 的插件地基
直接答案
Cordis 是 DeepSeek Harness 底层的插件框架,但它不是 DeepSeek 自研——它是第三方开源项目(上游 cordiverse/cordis),dsh 以 vendor(固定源码副本)方式引入自己仓库。理解它只需抓住五个概念:插件、上下文、依赖注入、类型化事件、可逆注册。Cordis 从哪来:第三方框架,vendor 引入
Cordis 的上游是 github.com/cordiverse/cordis,其设计写在一篇论文《A Programming Paradigm for Spatiotemporal Composability》里。dsh 仓库的 vendor/ 目录是带上游 SHA 清单的固定源码副本,同步流程写在 vendor/README.md。
vendor 进来的包被重新命名(rescope)为 @deepseek-ai/* 且标记为 private: true。@deepseek-ai/cordis 是每个 harness 包的 peerDependency(同伴依赖,即由使用方提供而不是重复安装)。vendor 引入与分层的关系见架构总览。
写作红线:Cordis 不是 DeepSeek 自研,任何"DeepSeek 开发的 Cordis"表述都是错的。
五个核心概念
出自官方 docs/cordis-primer.zh.md:
- 插件:一个实现 Service 的对象——可以是带
inject声明和apply(ctx)方法的函数,也可以是Service子类。 - 上下文(Context):服务容器。每个服务占据一个稳定的键名,比如
ctx.tools、ctx.sessions。 - 依赖注入(inject):插件用
inject声明自己依赖哪些服务,Cordis 等依赖就绪后才启动它。 - 类型化事件:插件之间靠类型化事件通信(下一节展开)。
- 可逆注册:注册是可逆副作用——用
ctx.effect()/ctx.on()注册的东西,在插件 reload(重载)或 teardown(卸载)时会被撤销。这就是 dsh"插件卸载时撤销注册"的底层机制(插件系统如何用这个机制,见插件系统页)。
四种事件分发模式
Cordis 的事件有四种分发模式,分发模式是事件公开约定的一部分,官方源码里用 @mode 标签记录:
| 模式 | 是否等待(await) | 有无返回值 | 典型用途 |
|---|---|---|---|
emit | 否 | 无 | 广播通知 |
waterfall | 否 | 有 | 中间件式加工,可短路 |
parallel | 是 | 无 | 并行扇出,等全部完成 |
serial | 是 | 有 | 按顺序执行 |
新手最常踩的坑有两个:
emit和waterfall都不会等待监听器完成。需要等监听器跑完,得用serial或parallel;其中只有serial会带回返回值。- waterfall 监听器必须调
next()才能把处理委托给下游。监听器收到(...args, next);调用next()可以委托下游并包装返回值;不调next()直接 return,是"短路"(后面的人收不到),不是"透传"。官方 AGENTS.md 用 MUST 级别的措辞强调这一点。prepend: true只在该监听器必须先于普通注册运行时才用。
Loader 与配置文件:!!js 与三种 yml
- Cordis 的 Loader 配置由
@deepseek-ai/cordis-plugin-include处理:!!js会被解析为表达式节点(注意是!!js两个感叹号,不是!js)。config基于插件上下文插值,disabled在每次挂载决策时基于 loader 上下文插值;需要按环境选择插件时应使用 overlay(覆盖层)。 cordis.yml里只允许!!js出现在插件的config和条目的disabled下,其余元数据保持字面值。- 配置文件有三种形态:
cordis.yml(插件树)、cordis.patch.yml(按 id 覆盖或插入条目)、cordis.snapshot.yml(快照回放替换,只识别特定文件 basename)。前两种在本站《Profile / 组合包 / Patch》页有展开。
为什么普通用户也需要懂一点 Cordis
你不写插件的话,不需要掌握 Cordis API。但有两个场景绕不开它:一是改 cordis.patch.yml 调整配置时,你其实就是在写 Cordis 配置(见教程《Profile 与配置分层》);二是排查"插件装了没生效"时,理解"注册是可逆副作用、Bundle 层变更要重启"(教程实测口径,详见插件系统页第 4 节)能省很多时间。把 Cordis 想成 dsh 世界的"地基图纸":不用会画,但看得懂图例很有用。
EVIDENCE
证据与来源
本页包含:官方事实 / DSHOPC 分析
| # | 事实声明 | 状态 | 来源 |
|---|---|---|---|
| 1 | Cordis 上游为 cordiverse/cordis,dsh vendor 引入,vendor 流程见 vendor/README.md | 官方事实 | |
| 2 | 五个核心概念(插件 / 上下文 / inject / 类型化事件 / 可逆注册) | 官方事实 | |
| 3 | 四种分发模式语义及 @mode 标签 | 官方事实 | |
| 4 | waterfall 短路语义、next() 委托、prepend: true 使用限制 | 官方事实 | |
| 5 | !!js 规则、config / disabled 插值、overlay 建议 | 官方事实 | |
| 6 | rescope 为 @deepseek-ai/*、peerDependency | 官方事实 | |
| 7 | 三种配置文件形态(cordis.yml / cordis.patch.yml / cordis.snapshot.yml) | 官方事实 | |
| 8 | 第 5 节的场景建议 | DSHOPC 分析 |
|