@nianchu/dsh-rollback
TRAE-style conversation rollback for DeepSeek Harness: per-turn checkpoints, file restore + in-place conversation truncation, a /rollback command, and a Web rollback button with an affected-file diff preview. 适合需要版本控制式对话回退、文件恢复及变更预览的开发者。
설치
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:ZhaoZeW/dsh-rollback在 DSH 的插件管理界面,或使用 CLI:
dsh plugin --profile web add file:C:\path\to\dsh-rollback
> **必须把包登记进 profile 的 `dsh.profile.bundles`**。`dsh plugin add` 只写 `dependencies`,不会登记 bundles;漏登记的表现是「插件装好了但完全不生效」。
### 方式二:npm(上架后)
```powershell
dsh plugin --profile web add @nianchu/dsh-rollback
两种方式对运行时完全等价:DSH 从 profile 的 node_modules 解析插件,不要求它来自 npm。
使用
- Web 按钮:每条已完成 AI 回复的动作条里出现 ↩「回退」→ 弹窗列出受影响文件与 diff → 确认。
- 人工命令:
/rollback list— 列出可回退到的轮次/rollback preview/preview last— 预览会影响的文件与 diff(不执行)/rollback— 回退到第 n 轮发起之前/rollback undo-last— 回退最近一轮/rollback doctor— 契约自检
架构
| 文件 | 职责 |
|---|---|
src/core/ | 纯逻辑、零 DSH 依赖:检查点模型、捕获合并、回退规划、截断规划、滑动窗口、会话折叠、预览格式、契约自检、字面量编辑、空目录规划 |
src/service.ts | Host 侧执行:tools/result 捕获写/改前置内容、session/event 折叠轮次、预览实时读盘、执行恢复/删除/截断 |
src/index.ts | 插件体:/rollback 命令(含 doctor/undo-last)与系统提示词注入 |
src/client/index.ts | 浏览器侧:动作条与轮次页脚按钮、带 diff 的确认弹窗、标记驱动的隐藏(可开关)、欢迎页、本地化 |
scripts/ | 构建、产物校验、测试运行器 |
构建与验证
node scripts/build.mjs # 产出 lib/index.js、lib/invariant.js、lib/client.js
node scripts/verify-artifacts.mjs # 产物契约校验(19 项断言)
node scripts/run-tests.mjs # 全部单元测试
scripts/build.mjs 直接驱动 rolldown(tsdown 的底层引擎)而不是 tsdown CLI,原因见该文件顶部注释:本机 pnpm 安装只填满了虚拟店 .pnpm/ 却没有创建顶层符号链接,任何按包名解析自身依赖的工具(tsdown 需要 ansis、vitest 需要 @vitest/utils)都无法启动。构建脚本按绝对路径加载 rolldown,产物契约与 tsdown.config.ts 完全一致。
同理,scripts/run-tests.mjs 用 Node 原生类型剥离执行测试,并通过模块钩子把 vitest 解析到 scripts/tests-shim.mjs(只实现这批判测试用到的 describe/it/expect 子集)。若你的环境 pnpm 链接正常,pnpm exec vitest run 可直接使用,是更权威的通道。
已知限制
- 无法恢复的文件被跳过,而不是中止整次回退:能恢复的照做、对话照样截断,跳过项在预览里就标着「跳过」,其记录保留以便下次重试。
- 超出保留范围的回退目标被拒绝:检查点是 10 轮滑动窗口,更早的状态无法重建。
- 聊天轨迹仍保留已回退的消息:日志 append-only 且表层
replace只作用于模型上下文,界面隐藏由日志里的持久标记驱动。 - 模型会读到一行检查点文字(约 34 token),词表由字符预算测试钉住。
- shell 新建的文件、以及从未被文件工具碰过的文件不在回退范围:插件只从
write/edit的结果捕获改动,并在轮次边界复查已登记路径。 - 边界重扫的未变判定只比较 size + mtime:同一尺寸、同一毫秒内的改写会被漏检(真实操作间隔远大于 1ms,风险极低)。
- 回退不可撤销:执行即替换历史,不提供 redo。
- 新建文件删除与空目录清理走本地文件系统:文件系统抽象层没有删除原语,因此仅对本地后端可靠。
许可证
MIT。本仓库包含源自 @domitor-syh/dsh-rollback(作者 domitor-syh,MIT)的工作,已按 MIT 条款保留其许可与出处说明;随后的修改与维护由 nianchu 进行。
使用
- Web 按钮:每条已完成 AI 回复的动作条里出现 ↩「回退」→ 弹窗列出受影响文件与 diff → 确认。
- 人工命令:
/rollback list— 列出可回退到的轮次/rollback preview/preview last— 预览会影响的文件与 diff(不执行)/rollback— 回退到第 n 轮发起之前/rollback undo-last— 回退最近一轮/rollback doctor— 契约自检