dsh-recall-plugin:把文件与对话一并撤回到消息发送前

前言

在 DSH 里让 agent 改代码,常见流程是:发一条指令,等它改完文件、跑完工具,发现方向不对,再发「撤销刚才的改动」或手动 git checkout。对话侧则要新开会话,或自己在历史里找分叉点。文件状态和聊天记录是两条线,很难精确回到「发那条消息之前」的整体状态。

dsh-recall-plugin 在每条用户消息旁提供「↶ 撤回」按钮:确认后,工作区文件与对话历史一起回退到该消息发出之前。快照走独立影子 git 仓库,不碰项目自身的 git 分支与暂存区。

这是什么

  • 插件名称dsh-recall-plugin(npm 包名同名)
  • 维护者:limbo947
  • 分类:客户端(DSH web profile)
  • 当前版本:1.7.1(MIT 许可证)
  • GitHublimbo947/dsh-recall-plugin(约 25 stars)
  • 目录页SkillHub 插件页

一句话定位:在用户消息气泡旁加撤回入口,把项目文件(影子 git 快照)与对话历史(DSH 官方 sessions.fork)一并回退到该消息发送之前。

核心功能

文件 + 对话整段回退

每条用户消息发送时(agent 动文件之前),工作区被快照进独立影子 git 仓库。点「↶ 撤回」后,先弹出确认面板,列出将变更的文件(修改 / 恢复 / 删除),确认后才执行。文件恢复到该消息发送前的状态;视图切到新会话(该消息及之后的对话移除),原会话归档、可随时找回。

撤回后默认会把消息文本回填到输入框,方便修改后重发;可在设置卡片关闭。

不碰项目自身的 git

快照存在 $DSH_HOME 下的影子仓库里,默认路径为 dsh-recall-snapshots/<SHA256(项目绝对路径)>/.gitnode_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_SNAPSDSH_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/;想彻底清除可手动删除该目录。

典型用法

  1. 鼠标悬停任意插件启用后发送的用户消息,复制按钮左侧出现「↶ 撤回」。
  2. 点击后,确认面板展示将变更的文件清单。
  3. 点「确认回退」→ 文件恢复、对话切到新会话,原会话归档保留。

想直接查看影子仓库中的快照标签:

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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜