dsh-patch-library
官方 DSH 内核补丁,以「数据」形式发布 —— 五种方式随你挑。
十条自成体系的补丁,针对 @deepseek-ai/dsh-* 与 @earendil-works/pi-ai;配一个小巧的
应用器,它会自己找到你的 DSH 安装位置。没有硬编码路径,仓库里没有任何个人信息,
全程不需要联网。
> 面向 @deepseek-ai/dsh 0.1.5-rc.2(1.5 系列)。每条补丁都记录了它所期待的原文件与
> 它产出的新文件各自的 sha256,所以应用器在动手之前就能告诉你 exact / applied /
> conflict。
>
> 🌐 English README → README.md
>
> 另外两份中文材料:给 agent 的中文提示词 ·
> 五种方式的详细步骤。
为什么会有这个仓库
有些修复没法做成插件:它们必须跑在官方文件内部,在 Cordis 没有暴露成接缝的函数中间。
其中一批已经做成了插件(dsh-context-reclaim、dsh-capability-composer、
dsh-composer-launcher、dsh-aux-degrade)。剩下的那些 —— 以及只有想凑齐全套时才需要的
那些 —— 就住在这里,是普通的 unified diff:任何人可以阅读、审查、应用、回退、重新生成。
这里没有二进制黑盒,也没有魔法:patches//change.diff 就是一份普通的补丁,
manifest.json 是让脚本能安全、可回退地应用它的元数据。
十条补丁
| id | 包 → 文件 | 类型 | 规模 | 需重启 | 已有插件代劳? |
|---|---|---|---|---|---|
dsh-llm-writable-request |
@deepseek-ai/dsh-llm → lib/index.js |
lines | +18 −1 | 是 | 是 —— dsh-context-reclaim |
agent-loop-snapshot-prompt |
@deepseek-ai/dsh-agent-loop → lib/index.js |
lines | +97 −20 | 是 | 否 |
llm-pi-ai-system-prompt |
@deepseek-ai/dsh-llm-pi-ai → lib/index.js |
lines | +96 −54 | 是 | 否 |
compaction-pruner |
@deepseek-ai/dsh-compaction-tool-result-pruner → lib/index.js |
lines | +354 −14 | 是 | 否 |
ui-renderer-turntail |
@deepseek-ai/dsh-client-ui-renderer → lib/client.js |
lines | +9 −1 | 否 | 否 |
ui-sidebar-wrap |
@deepseek-ai/dsh-client-ui-sidebar → lib/lib-client.js |
regex | +1 −1 | 否 | 否 |
session-format-v1-to-v2 |
@deepseek-ai/dsh-session-format-v1-to-v2 → lib/index.js |
lines | +2 −1 | 是 | 否 |
session-persistence-jsonl |
@deepseek-ai/dsh-session-persistence-jsonl → lib/worker.cjs |
lines | +2 −1 | 是 | 否 |
mcp-client |
@deepseek-ai/dsh-mcp-client → lib/index.js |
lines | +59 −6 | 是 | 否 |
pi-ai-max-tokens-floor |
@earendil-works/pi-ai → dist/api/simple-options.js |
lines | +11 −1 | 是 | 否 |
每条补丁都有自己的 patches//NOTES.md,中英双语写明改了什么、什么时候需要它、
怎么验证、和你的构建对不上时怎么办。
ui-sidebar-wrap 故意做成正则补丁:侧栏的类名前缀是构建哈希,行级 diff 一旦遇到重建就
失效。patches//change.json 里存着模式串以及它显式的逆操作。
五种应用方式
挑你顺手的。五种的详细步骤都在 docs/methods.zh-CN.md
(英文:docs/methods.md)。
| 方式 | 命令 | |
|---|---|---|
| A | 脚本(推荐) | node apply.mjs --check,然后 node apply.mjs --apply --all |
| B | git apply |
cd <包目录> && git apply -p1 <库>/patches//change.diff |
| C | 交给你自己的 AI agent | 把 PROMPT.zh-CN.md 里的整块复制给它,让它按 A 或 B 打 |
| D | 为你的构建重新生成 | node tools/make-patch.mjs --file <改后> --orig <原文件> --pkg <包> --rel <相对路径> |
| E | 回退 | node apply.mjs --revert --all,或手工把任一 *.orig 还原回去 |
十条 diff 全部在包目录里通过了 git apply -p1 --check,所以方式 B 对每一条都可用。
方式 A 全流程
node apply.mjs --list # 这里有什么
node apply.mjs --roots # 本机找到了哪些 DSH 安装
node apply.mjs --check # 逐文件状态:exact / applied / conflict / missing
node apply.mjs --apply --all # 应用所有能对上的
node apply.mjs --apply --only mcp-client,compaction-pruner
node apply.mjs --revert --all # 把所有 .orig 备份还原回去
--check 会给出五种状态之一:
| 状态 | 含义 |
|---|---|
exact |
文件正是本库构建时所用的原版 —— 应用是安全的 |
applied |
文件已经等于打补丁后的版本,无需操作 |
variant |
版本号相同但构建不同(哈希不同)而 hunks 仍能对上 —— 需要 --allow-variant,或用方式 D |
conflict |
hunks 对不上。不会写入任何东西。 用方式 D 为你的构建重新生成 |
missing |
找到的这个安装里没有这个包 |
应用器的硬保证
- 它去找你的安装,而不是假设某台电脑。
--root、$DSH_APP_ROOT、$DSH_INSTALL_ROOT、
$DSH_HOME(含profiles/*)、当前进程自己的 DSH 路径、从当前目录做的node解析,以及
对 Windows / macOS / Linux 常规安装位置做的有界扫描 —— 见lib/discover.mjs。
--root的含义是「就这一个」,绝不会变成「这一个 + 顺便扫到的那些」。 .orig是圣物。 备份只在文件旁边写一次,永不覆盖;已存在就直接复用。- 每次改写都做语法检查。 写入后立刻
node --check;失败就立即还原备份,并把该条报为失败。 - 对不上的 hunk 是冲突,不是猜测。 引擎要求 hunk 的旧侧在它被记录的位置附近精确匹配、
且只匹配一处。 - 只在解析出的根目录内写入。 除了你显式把
--root指向某个 profile 目录(那是该 profile
自己的node_modules副本),不会碰$DSH_HOME下的任何东西。
退出码:0 成功,1 某个请求的操作失败或冲突,2 没找到安装。
如果你已经在用那四个插件
dsh-llm-writable-request 可以跳过 —— dsh-context-reclaim 在插件内部接管了这条路径,
官方补丁保持原样即可。--check 会明说:
= dsh-llm-writable-request already node_modules/@deepseek-ai/dsh-llm/lib/index.js
not needed: the dsh-context-reclaim plugin already handles this
其余九条与插件互不依赖:插件装不装、装一个还是四个,都行。
自检
node verify.mjs
离线运行,不需要装 DSH。它会检查:每条 diff 都能解析、hunk 行数与声明一致、声明的 marker
确实由该补丁新增、应用/回退引擎在合成样本上来回一趟是恒等变换、重复上下文会被拒绝而不是
被猜、正则补丁能在任意类名前缀上往返 —— 以及仓库里没有任何文件含盘符、个人主目录或私有
工作区名(这条扫描是测试套件的一部分,不是一个口头承诺)。
verify.mjs 最后会对本机找到的安装做一次只读的 --check 汇总。
仓库结构
apply.mjs 应用器:--list --roots --check --apply --revert --show
verify.mjs 离线自检 + 个人信息扫描
manifest.json 每条补丁的元数据:哈希、字节数、marker、风险、为什么、何时该打
lib/manifest.mjs manifest 加载与 schema 校验
lib/discover.mjs 自适应定位 DSH 安装(跨平台)
lib/unified.mjs unified diff 解析/应用/回退引擎
lib/backup.mjs .orig 备份与还原
lib/hash.mjs sha256 小工具
patches//change.diff 补丁本体(路径相对包根)
patches//change.json 正则补丁:模式串 + 显式逆操作
patches//NOTES.md 改了什么/何时需要/怎么验证,中英双语
tools/make-patch.mjs 为同版本的另一种构建重新生成补丁
docs/methods.zh-CN.md 五种方式的分步说明
PROMPT.zh-CN.md 复制粘贴给自己 agent 的提示词
如实说明边界
- 这些补丁是按 0.1.5-rc.2 构建的。如果你的构建不同,
--check会告诉你
(variant/conflict)—— 那是信息,不是失败。方式 D 就是为这种情况准备的。 - 打补丁就是在改你 DSH 安装里的文件 —— 补丁的本义如此。应用器为它碰过的每个文件留下
.orig,
--revert能把它们放回去。卸载或升级 DSH 会整体替换目录树,补丁也随之消失。 - manifest 里的
restartRequired说明受影响的代码跑在主进程(重启 DSH)还是渲染进程
(刷新窗口即可)。 - 这些补丁是修复,它们不构成对 DSH 的安全审计。应用之前请读一读
patches//change.diff—— 把补丁当数据发布,图的就是这个选项。
许可
MIT。上游包的权利归其作者所有;本仓库只包含针对它们的 diff。