前言¶
在 DSH 里用 AI 改代码、跑脚本,一个回合往往同时留下两类痕迹:对话里的消息,以及工作区里的文件。若只想「回到某一步重来」,只回退对话会留下改到一半的文件;只手动还原文件,对话上下文仍停在错误分支。常见做法是开新会话或自己清理 out/、dist/ 等目录,代价是丢上下文或容易误删。
下面介绍社区插件 dsh-any-rollback(维护者 xinstart-1):在当前对话窗口内回退到任意一条历史用户消息,并可选择同时把文件还原到那一刻的状态,包括渲染、ffmpeg、构建脚本等命令产出的文件,而不只是模型通过 write/edit 改过的源码。插件分类为「工作流」,可在 SkillHub 目录页 查看条目;SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系。DSH 本身遵循「一切皆插件」的扩展方式,本插件以 MIT 许可发布,安装前建议自行查看 GitHub 仓库 源码与许可证;插件在当前 DSH 进程权限下运行,备份与还原范围与宿主可访问的路径一致。
这是什么¶
dsh-any-rollback 是 DSH 的对话回退插件:不 fork 会话、不开新窗口,点消息旁的 ↶ 或使用 /rewind 等命令,即可把对话视图撤回到指定用户消息之前,并把输入框填回被撤回的那句话;可选地依据插件自有的备份目录,把工作区文件一并还原。会话日志仍只追加、不删除,回退仅改变界面上的对话视图。
核心功能¶
按消息回退对话¶
每条用户消息旁有 ↶ 按钮。点击后,该消息之后的内容从对话视图上撤下,输入框自动填回被撤回的用户文本,改一改即可重新提问。
也可使用命令:
| 命令 | 作用 |
|---|---|
/rewind <序号> |
回退到第 N 条用户消息之前 |
/rewind @<seq> |
按会话内序号回退 |
/undo |
取消上一次回退 |
同时还原工作区文件¶
回退时可选择只退对话、只退文件,或两者都退。文件还原只写回插件真正备份过的内容,不猜测、不推断。
追踪命令产出的文件¶
多数工具只备份模型直接编辑的文件;本插件在每个回合边界记录一份工作区清单(路径 → 大小 + mtime + sha256),对发生变化的文件按内容摘要缓存(相同字节不重复占空间)。回退时逐文件判断:有备份则还原字节;目标时刻不存在、现在却有的文件移入隔离区;超大或未缓存且无法还原的,移入隔离区并提示需重新生成。隔离区只移动、从不删除,去向记在 quarantine/index.json,可人工取回。
默认跳过 node_modules、dist、build、out 等目录(可通过 artifactExclude 调整);点目录(如 .output/)默认参与追踪,固定跳过 .git、.dsh 等 VCS 与工具状态目录。
快照自动清理¶
备份会占磁盘空间,插件支持按策略自动清理,也可查看状态或手动执行:
| 命令 | 作用 |
|---|---|
/snapshot-auto-cleanup |
查看当前状态 |
/snapshot-auto-cleanup on\|off |
启用 / 停用自动清理 |
/snapshot-auto-cleanup max-age <天数> |
设置闲置天数上限 |
/snapshot-auto-cleanup run [--apply] |
预演,或真正执行清理 |
/snapshot-auto-cleanup run --current [--apply] |
只清理当前会话的备份 |
DSH 插件页还提供独立设置卡片,可开关文件备份、调整自动清理,无需手改配置文件。
配置项(节选)¶
| 键 | 默认值 | 说明 |
|---|---|---|
fileCheckpointingEnabled |
true |
是否记录新的文件备份 |
maxFileBytes |
8388608(8 MiB) |
单文件备份上限,0 表示不限制 |
snapshotDir |
~/.dsh/rewind-snapshots/ |
备份存放根目录 |
artifactTrackingEnabled |
true |
是否追踪命令产出的文件 |
artifactMaxFileBytes |
67108864(64 MiB) |
命令产物单文件缓存上限 |
artifactExclude |
node_modules,dist,build,out,... |
追踪时跳过的目录 |
autoCleanupEnabled |
true |
自动清理开关 |
autoCleanupMaxAgeDays |
30 |
备份闲置多少天后可清理 |
完整说明见仓库 README「配置项」一节。
数据存放位置¶
备份目录与工作区分离,删掉备份目录只会丢失回退能力,不会动项目本身:
~/.dsh/rewind-snapshots/<会话ID>/
<消息序号>/ # 每条消息对应的文件备份
artifacts/
manifests/ # 每个回合边界一份工作区清单
quarantine/ # 回退时移出的文件
quarantine/index.json
安装与启用¶
环境要求:DSH >=0.2.1-rc.1 <0.3.0-0;Node.js ^22.19.0 或 >=24.0.0。
从 Release 安装(推荐)¶
在 profile 的 package.json 中加入依赖(版本以 Release 为准,当前资料为 v0.19.1-any.8):
"dependencies": {
"dsh-any-rollback": "https://github.com/xinstart-1/dsh-any-rollback/releases/download/v0.19.1-any.8/dsh-any-rollback-0.19.1-any.8.tgz"
}
在 profile 目录执行安装并重启 DSH(Windows 示例,路径中的 <profile> 换成你的 profile 名):
$node = "$env:USERPROFILE\.dsh\dsh-runtimes\dsh-primary-runtime\dependencies\node\bin\node.exe"
$pnpm = "$env:USERPROFILE\.dsh\dsh-runtimes\dsh-primary-runtime\dependencies\pnpm\bin\pnpm.mjs"
& $node $pnpm install --dir "$env:USERPROFILE\.dsh\profiles\<profile>" --prefer-offline
必须把 dsh-any-rollback 写入该 profile 的 dsh.profile.bundles 数组,该数组才是加载插件的开关。装完后重启 DSH;跑一个回合后,确认 ~/.dsh/rewind-snapshots/<会话ID>/artifacts/manifests/ 下出现清单,且用户消息旁出现 ↶。
仓库提供 node scripts/verify.mjs 校验已装包内关键文件的 SHA-256,期望值见 README「校验安装」表格。
卸载¶
从 dependencies 和 dsh.profile.bundles 移除 dsh-any-rollback 后重新安装依赖;备份数据不会自动删除,需手动删除 ~/.dsh/rewind-snapshots/ 才能彻底清理。
典型用法¶
- 多轮试错后,在某条用户消息旁点 ↶,选择同时回退对话与文件,从该步在同窗口继续改 prompt 或任务。
- 生成视频或构建产物跑了几版,想回到较早一轮:回退后命令新建的文件会进隔离区,已备份的内容写回工作区,无需手删
out/里一堆 mp4。 - 误操作回退后,用
/undo撤销上一次回退。 - 磁盘紧张时,先
/snapshot-auto-cleanup run预演,再run --apply执行清理。
适用场景与注意¶
适合:需要在同一 DSH 会话里「原地」回到任意用户消息,且希望文件状态(含脚本/命令产物)与对话上下文一致的场景。
边界(README 已写明):
- 回退依赖已有备份;插件启用前、或关闭备份期间的改动无法还原。
- 会话被 compact 之后,早于压缩点的消息不再出现在回退列表。
- 超过
maxFileBytes/artifactMaxFileBytes的文件不缓存内容,跨上限的改动无法还原,回退时会提示并保持或移入隔离区,不再误删工作区文件。
设计取舍上:会话日志只追加;回退移出的文件一律进隔离区、不直接删除;只还原有备份的字节。
结尾¶
dsh-any-rollback 把「撤对话」和「还原工作区(含命令产物)」绑在同一次操作里,适合在 DSH 里长对话、多轮跑脚本试错的开发流程。目录与说明: