如何回退 DSH 对话并恢复文件:FileSnap 安装与使用教程
安装 DeepSeek Harness 的 dsh-filesnap 插件,同步回退对话和已追踪文件,保留原对话,并用 /redo 撤销选错的回退。
DSH Rewind & Redo — by FileSnap 是 DeepSeek Harness 的回退插件,安装包名是 dsh-filesnap。它把对话和已追踪文件一起恢复,保留原对话,以新分支继续;如果回退点选错了,可以用 /redo 撤销回退。无需 Git 仓库。filesnap Rust 引擎负责存储,dsh-filesnap 负责 DSH 轮次集成与 Web UI 控件;与 App Store 的 File Converter — FileSnap 无关。
English tutorial · DSH 回退插件选型比较
我们是 dsh-filesnap 的维护者。本文按 0.2.2 编写,资料核查日期为 2026 年 9 月 9 日。截图来自已有的 0.2.2 Web UI 实际会话,宿主为 DSH 0.1.2-rc.1 本地构建;这不代表已经验证后续所有宿主版本。
与 SiriLee 的 dsh-rewind-plugin 0.9.1 相比,本文版本提供 /redo,以及共享存储中跨路径、保留版本和会话的整文件内容复用。参见 固定版本比较与 7 组存储实验;对方则提供原会话交互和仅回退对话的选项。
跨助手应用:Codex、DSH 与 Pi
FileSnap 的快照设计源自我们已发布的 codex-rewind(codexr)实践,独立引擎已用于 DSH 的 dsh-filesnap 和 Pi 的 pi-better-rewind-redo。截至 2026-09-10,DSH 插件发布版为 0.2.2,依赖 filesnap ^0.4.0;Pi 扩展发布版为 0.1.1,依赖 filesnap 0.5.0;Codex 增强发行版为 0.151.0-rewind.0,保留同源的内置快照模块。
这套设计已积累 Codex、DSH 和 Pi 的轮次接入、文件恢复与 redo 实践,是我们说明工程成熟度的具体依据。Codex 保留内置实现,DSH 与 Pi 使用不同版本的独立引擎;各自的兼容性与验证范围见项目文档。
完整操作演示(1.5 倍速)
在 B 站观看完整演示 · English walkthrough (YouTube)
这段演示约 2 分 24 秒,保留完整录屏画面,语音和画面同步按 1.5 倍速播放,仅去掉等待和少量重复内容。从准备文件开始,连续展示删除、回退恢复、保留原对话、用 /redo 撤销,以及再次选择更早的恢复点。Redo 会回到回退前的状态,在这个例子中也会让文件再次被删除。
安装到 Web UI profile
需要 Node.js ^22.19 或 >=24,支持 Linux、macOS、Windows 的 x64 和 arm64。安装包包含 FileSnap 原生引擎,无需自行安装 Rust 工具链。
卸载插件不会删除对话记录或工作区文件。当前的读取限制是:已包含插件记录的会话,需要重装插件后才能在 DSH 中重新打开。从源码目录用 pnpm dsh 启动,也可能遇到同样的事件注册错误;请使用构建好的 CLI 或 npm 安装的 CLI。参见安装与故障排查说明。
dsh plugin --profile web add dsh-filesnap
该命令安装当前可用版本。要复现本文的插件版本,可把包名换成 dsh-filesnap@0.2.2。安装后重启 Web UI profile。0.2.2 已声明 bundle,不需要手动添加加载项。
从 0.2.1 或更早版本升级? 启动 0.2.2 前,先删除 profile 的 cordis.patch.yml 中以前手动添加的 id: filesnap 项,否则会与 bundle 提供的同名项冲突。
1.先产生记录,再练习恢复
在一个可丢弃的测试工作区中,让 agent 新建一个小文件,然后在下一轮修改它。每轮都等待执行结束。要练习误删恢复,可以再让它删除这个文件。
FileSnap 只能恢复已经捕获的状态。在误删之后才安装插件,不能找回之前从未记录过的文件版本。
把鼠标放在已完成的 assistant 回复上,找到回退按钮。先读提示里的目标轮次和覆盖范围,不要只根据按钮所在位置猜测会恢复到哪里。

截图是另一段编辑 data.txt 的真实演示会话;你练习时的轮次编号和文件数量可能不同。界面截图保留原始英文,操作含义在正文中说明。
2.选定一个明确的恢复点
在对话中输入下面的命令,列出已捕获的恢复点:
/rewind

使用列表中显示的轮次编号或恢复点 ID。例如,只有当你的目标确实是列表中的第 2 轮时,才输入:
/rewind 2
它表示回到该目标轮次之前,不是“往回退两轮”。误删恢复练习中,选择删除发生前的恢复点。回退会写入真实工作区,因此先用测试文件练习,并等待 agent 停止工作。
Web UI 的回退按钮会打开新产生的子会话。直接输入 /rewind 命令时,结果会给出子会话 ID;如果界面仍停在原会话,请自行打开返回的子会话。

3.理解保留原对话的含义
原对话仍然可用,子会话从选定位置继续。会话列表会给离开的原对话加上箭头标记。

两个对话共用同一个物理工作区。 对话分支不是独立的 Git worktree,也不是第二份目录。恢复文件会影响那个目录,切换会话不会自动切换成各自独立的文件副本。
4.恢复点选早了?撤销这次回退
先不要继续修改,在子会话中输入:
/redo
插件利用回退前捕获的救援状态撤销恢复,并把原对话作为继续操作的目标。使用命令操作时,根据返回的会话信息切换。

Redo 也会恢复文件。对于刚才的误删练习,这意味着文件可能再次被删除:它让你回到执行 rewind 之前的状态,而不是再做一次文件救援。在产生新修改之前试用,最容易看清这两步的关系。
5.检查哪些文件受保护
/rewind status

捕获范围由已知路径、DSH ctx.fs 写入或编辑时观察到的路径,以及近期工作区变化的有限扫描共同组成。观察到的路径可以位于项目根目录之外。有限扫描能补充一部分 shell 修改,但不是对所有 shell 操作影响范围的无限备份。
.filesnapignore 的排除规则同时作用于捕获和恢复。不可读、过大及其他被排除的文件可能不受保护;应结合 status 输出和目标快照覆盖范围判断。当前 status 不能证明旧快照里一定存在某个文件。详见捕获与恢复机制。
接下来怎么验证
完整走一遍:记录文件 → 修改或删除 → 回退恢复 → redo 撤销回退。每一步都检查磁盘上的文件和当前所在的会话。