前言¶
在 DSH 里让 agent 改代码,常见流程是:发一条指令,等它改完文件、跑完工具,发现方向不对,再发「撤销刚才的改动」或手动 git checkout。对话侧则要新开会话,或自己在历史里找分叉点。文件状态和聊天记录是两条线,很难精确回到「发那条消息之前」的整体状态。
dsh-recall-plugin 在每条用户消息旁提供「↶ 撤回」按钮:确认后,工作区文件与对话历史一起回退到该消息发出之前。快照走独立影子 git 仓库,不碰项目自身的 git 分支与暂存区。
这是什么¶
- 插件名称:
dsh-recall-plugin(npm 包名同名) - 维护者:limbo947
- 分类:客户端(DSH web profile)
- 当前版本:1.7.1(MIT 许可证)
- GitHub:limbo947/dsh-recall-plugin(约 25 stars)
- 目录页:SkillHub 插件页
一句话定位:在用户消息气泡旁加撤回入口,把项目文件(影子 git 快照)与对话历史(DSH 官方 sessions.fork)一并回退到该消息发送之前。
核心功能¶
文件 + 对话整段回退¶
每条用户消息发送时(agent 动文件之前),工作区被快照进独立影子 git 仓库。点「↶ 撤回」后,先弹出确认面板,列出将变更的文件(修改 / 恢复 / 删除),确认后才执行。文件恢复到该消息发送前的状态;视图切到新会话(该消息及之后的对话移除),原会话归档、可随时找回。
撤回后默认会把消息文本回填到输入框,方便修改后重发;可在设置卡片关闭。
不碰项目自身的 git¶
快照存在 $DSH_HOME 下的影子仓库里,默认路径为 dsh-recall-snapshots/<SHA256(项目绝对路径)>/。.git、node_modules 自动排除;项目的分支、暂存区、未提交改动不受影响。快照走 git delta 压缩,是增量而非整目录拷贝;超过 100MB 的大文件自动跳过,阈值可在设置卡片修改。
当 home 不可写(如指到只读盘)时,会降级到项目内 .dsh-recall-snapshots,页面会提示;home 恢复后可自动迁走并清理。
可以反复后悔¶
只要会话还在(含归档),快照全量保留、不修剪。撤回一次后还能再撤到更早;撤回时被覆盖的文件也可找回。会话被彻底删除后,其快照会在下一次维护时自动清理;归档不算删除。
故障提示与自愈(1.7.0+)¶
快照失败、跳过路径、连续失败熔断会在页面顶部 toast 提示(同类故障 10 分钟只提示一次);失败原因可在设置卡片「最近错误」查看。快照失败后会自动清理残骸对象;连续 3 次失败起指数退避熔断,冷却后自动重试。嵌入式 git 仓库、无读权限等无法索引的路径会跳过,不再导致整条快照失败;撤回时既不恢复也不删除这些路径。
快照维护¶
- 定期 gc:每 50 条快照或距上次 gc 24 小时(先到先触发),后台执行
git gc。阈值可在设置卡片修改,或用环境变量DSH_RECALL_GC_SNAPS、DSH_RECALL_GC_HOURS覆盖。 - 排除表:设置 → 插件配置 → 撤回插件,或直接编辑
$DSH_HOME/dsh-recall-snapshots/exclude.txt(未设置$DSH_HOME时为~/.dsh/dsh-recall-snapshots/exclude.txt),一行一条 gitignore 风格 pattern。 - 树形快照管理:设置页按工作区 → 会话 → 快照三级展示,支持展开/折叠与分级删除。
安装与启用¶
前置:git CLI(未安装时撤回按钮不出现,页面顶部会提示);Windows 需 PowerShell 5.1 / 7,Linux/macOS 需 bash + git;DSH 0.1.0-rc.x(peer 依赖见包内 peerDependencies,含 @deepseek-ai/dsh-session 等 ^0.1.1-rc.2)。Node.js >= 20。
下面用 DSH 官方插件命令安装并挂载到 web profile:
dsh plugin --profile web add dsh-recall-plugin
也可从 GitHub 直接安装(纯 JS,无构建步骤):
dsh plugin --profile web add github:limbo947/dsh-recall-plugin
安装后重启 DSH 进程:
dsh web # 前台直接启动
pm2 restart <你的dsh进程名> # 若用 pm2 托管
验证:重启后硬刷新页面(Ctrl+Shift+R),悬停插件启用后发送的任意用户消息——复制按钮旁出现「↶」即生效。没有按钮时,常见原因是未重启 DSH 进程,或 git CLI 不在 PATH 里。
卸载:
dsh plugin --profile web remove dsh-recall-plugin
快照数据保留在 home 下 dsh-recall-snapshots/;想彻底清除可手动删除该目录。
典型用法¶
- 鼠标悬停任意插件启用后发送的用户消息,复制按钮左侧出现「↶ 撤回」。
- 点击后,确认面板展示将变更的文件清单。
- 点「确认回退」→ 文件恢复、对话切到新会话,原会话归档保留。
想直接查看影子仓库中的快照标签:
git --git-dir="<store>\git\.git" tag -l
git --git-dir="<store>\git\.git" ls-tree -r --name-only snap-<消息ID>
其中 <store> 为对应项目的快照存储目录。
适用场景与注意¶
适合谁:经常在 DSH 里让 agent 改代码、需要精确回到某条指令之前整体状态(文件 + 对话)的开发者。
已知限制(来自 README):
- 快照在消息发送时创建;插件启用前的历史消息没有快照,不显示撤回按钮。
- 会话第一条用户消息无法回退对话(仅文件回退),因为 fork 需要更早的 turn 边界。
- 工作区内嵌套的其他 git 仓库(子目录自带
.git)无法索引,其余部分照常快照,但嵌套仓库内容不参与回退。 - Windows 真机验证充分;Linux 已在 WSL2(Ubuntu 26.04)实测;macOS 脚本按 bash 3.2 兼容编写,尚未真机实测。
安全提示:插件以当前 DSH 进程权限运行,会读写工作区文件并在 home 下维护影子仓库。安装前建议查看 GitHub 源码 与 MIT 许可证;SkillHub 为社区目录站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-recall-plugin 把「撤回一条消息」做成可确认、可反复操作的整体回退:文件走影子 git,对话走官方 fork,两者对齐到同一时间点。若你在 DSH 生态里找客户端侧的撤回能力,可从目录页或 GitHub 安装试用。
- 目录页:https://www.skillhub.cn/plugins/limbo947/dsh-recall-plugin
- GitHub:https://github.com/limbo947/dsh-recall-plugin