@dsh-external/turn-rewind
DeepSeek Harness 的回合级对话和工作区回退,由持久化变更账本(Change Ledger)驱动。
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:Anionex/dsh-turn-rewind说明文档
阅读完整 README ↗DSH Turn Rewind
为 DeepSeek Harness 提供 Turn 级项目文件恢复,并可选择从恢复后的这一轮继续新对话。
Turn Rewind 是用户看到的功能名、仓库名和 Profile Bundle 名。Change Ledger 是底层持久恢复引擎;ctx.changeLedger 服务、磁盘格式和存储路径继续保留这个名字,因为它们描述的是可复用的快照与恢复层,而不只是 Web 上的回退按钮。
它给 DSH Session 增加一条明确的安全边界:
创建恢复点
↓
Agent / 用户 / 外部程序修改工作树
↓
预览逐路径变化
↓
审阅全部或部分恢复计划
↓
在回退弹窗中按下最终恢复按钮
↓
先建救援点 → 恢复 → 哈希验证
插件不会自动 commit、stash、reset、切分支、修改 Git index,也不会替用户判断某项改动“应该回滚”。
效果预览
每条用户消息下方依次显示时间、DSH 原生“复制”和第三个纯图标“回退”:

打开后会先展示受影响文件,可选择“恢复文件并从这里继续”或“只恢复文件”:

为什么底层需要 Change Ledger
普通 Git 面板可以展示当前 diff,但不拥有完整、持久的恢复生命周期。Change Ledger 独立负责:
- 内容寻址的恢复点 manifest;
- Git worktree、HEAD、分支和进行中 Git 操作的状态围栏;
- 从审阅到执行之间的 stale plan 检测;
- 短期确认码与 DSH 人工批准双门槛;
- 每次恢复前自动建立救援点;
- 恢复后的内容哈希验证;
- 恢复失败后的自动回滚;
- DSH 重启时对未完成操作日志进行对账;
- 可供其他插件依赖的
ctx.changeLedger公共服务。
持久格式见 docs/FORMAT.md,安全与故障模型见 SECURITY.md。
安全契约
- **只做显式操作:**任何恢复都不会自动发生——每一次恢复都从用户在 Web 弹窗中按下最终按钮开始,或来自对服务 API 的显式调用。
- **先读后写:**弹窗预览基于当前工作树生成短期、会话绑定的计划,不修改任何文件。
- **人工门禁:**弹窗中审阅受影响文件并按下最终恢复按钮就是人的决定;没有实时会话绑定计划对的直接修改请求一律 fail closed。
- **先救援再修改:**恢复任何文件前,先持久化当前 eligible tree 的救援点。
- **不静默漏文件:**遇到 submodule、sparse checkout、超限文件、总量超限或特殊文件类型时,创建恢复点直接失败。
- **不允许路径逃逸:**所有持久路径必须是规范的工作树相对路径;恢复拒绝穿过 symlink 父目录,也拒绝覆盖非空目录。
- **不覆盖审阅后的新变化:**执行时重新检查所选路径,以及审阅过的 HEAD、分支和 Git 操作状态;任何相关变化都会使计划失效。
- **不碰 Git 控制面:**index、分支、HEAD、stash 和 commit 均保持原样。