dsh-recall-restore-plugin
v1.0.0
Published
DSH 消息撤回插件(增强版):在 dsh-recall-plugin 基础上新增「撤回后把被撤回消息恢复到新会话输入框」,项目文件与对话历史一并回退,改完可直接重发。
Readme
dsh-recall-restore-plugin
撤回一条消息,项目文件、对话历史一起回去;被撤回的消息还会自动恢复到新会话输入框,改完直接重发。
简体中文 | English
这是什么
本仓库是 limbo947/dsh-recall-plugin v1.4.0 的 fork 增强版,包名改为 dsh-recall-restore-plugin。
在原版「文件 + 对话整段回退」的基础上,额外增加了一个能力:
撤回后,把被撤回消息的文本和图片自动恢复到新会话的输入框,方便你改完直接重发。
与上游的区别
| 能力 | 上游 dsh-recall-plugin | 本仓库 | | --- | --- | --- | | 文件快照回退 | ✅ | ✅ | | 会话 fork 回退 | ✅ | ✅ | | 撤回后文本恢复到输入框 | ❌ | ✅ | | 撤回后图片恢复到输入框 | ❌ | ✅ | | 切走原会话前预解码图片 | ❌ | ✅ |
新增逻辑集中在 lib/client.js:
collectImageFiles:在切走原会话前,把历史图片 blob URL 解码成浏览器File,避免原会话卸载后 blob 失效。restoreRecalledContent:拿到新会话的 composer shell,回填文本草稿,并注册图片草稿挂到输入框。executeRecall:在sessions.fork+open成功后调用上述回填逻辑,回填失败不影响撤回主流程。
功能亮点
- 文件 + 对话,整段回退:撤回的不只是聊天记录,agent 改过的文件也一并回到原样。
- 撤回后可继续编辑重发:被撤回消息的文本、图片自动回填到新会话输入框。
- 不碰你项目自己的 git:快照存在独立的影子 git 仓库里,你的分支、暂存区、未提交改动统统不受影响;
.git、node_modules自动排除。 - 项目目录保持干净:快照存在
$DSH_HOME下,不往项目里塞东西;仅当 home 不可写时才降级到项目内.dsh-recall-snapshots(页面会提示)。 - 可以反复后悔:快照全量保留、不修剪,撤回一次后还能再撤到更早。
- 先看清单再动手:确认面板展示将变更的文件清单(修改 / 恢复 / 删除),确认后才执行。
- 磁盘友好:快照走 git delta 压缩,超过 100MB 的大文件自动跳过,定期
git gc。
已知限制
- 快照在消息发送时创建,插件启用前的历史消息没有快照,不显示撤回按钮。
- 会话第一条用户消息无法回退对话(仅文件回退),因为 fork 需要更早的 turn 边界。
- 需要 git CLI;Windows 需要 PowerShell 5.1 / 7,Linux/macOS 需要 bash + git。
- 工作区内嵌套的其他 git 仓库(子目录自带
.git)不进快照。
安装
前置:git CLI、DSH 0.1.0-rc.x(依赖版本见 peerDependencies)。
# 推荐:从 GitHub 直接安装
dsh plugin --profile web add github:pepsi-ai/dsh-recall-restore-plugin如果后续发布了 npm 包,也可以:
dsh plugin --profile web add dsh-recall-restore-plugin安装后重启 DSH 进程,并硬刷新页面(Ctrl+Shift+R)。
验证:悬停任意一条插件启用后发送的用户消息,复制按钮旁出现「↶ 撤回」即生效。没有按钮通常是 DSH 进程未重启,或 git CLI 不在 PATH 里。
卸载:
dsh plugin --profile web remove dsh-recall-restore-plugin快照数据保留在 home 下 dsh-recall-snapshots/,需要彻底清除可手动删除该目录。
使用
- 悬停任意插件启用后发送的用户消息,复制按钮旁出现「↶ 撤回」。
- 点击 → 确认面板展示将变更的文件清单。
- 点「确认回退」→ 文件恢复到该消息发送前;视图切到新会话,原会话归档、可找回。
- 新会话输入框会自动带上被撤回消息的文本和图片,改完即可直接重发。
快照维护与清理
- 定期 gc:每 50 条快照或距上次 gc 24 小时(先到先触发),后台执行
git gc。可用DSH_RECALL_GC_SNAPS、DSH_RECALL_GC_HOURS覆盖阈值。 - 会话删除联动清理:会话被彻底删除后,下一次维护会自动删除该会话的全部快照。归档不算删除,快照保留。
- 用户自定义排除:打开「设置 → 插件 → 撤回设置」可视化编辑排除项;也可直接编辑
$DSH_HOME/dsh-recall-snapshots/exclude.txt(未设置时为~/.dsh/dsh-recall-snapshots/exclude.txt),一行一条 gitignore 风格 pattern。
工作原理
每条用户消息发送时(agent 动文件之前),工作区被快照进一个独立的影子 git 仓库;撤回时用 git 恢复文件、通过 DSH 官方 sessions.fork 把会话切到该消息之前。本 fork 在 fork 成功后额外把被撤回内容回填到新会话 composer。
本地开发
$pkg = '<你的仓库克隆路径>\dsh-recall-restore-plugin'
$profile = "$env:USERPROFILE\.dsh\profiles\web"
Copy-Item -Recurse -Force $pkg "$profile\node_modules\dsh-recall-restore-plugin"
# 然后编辑 $profile\package.json:
# dependencies 加 "dsh-recall-restore-plugin": "1.0.0"
# dsh.profile.bundles 加 "dsh-recall-restore-plugin"
# 重启 DSH 并硬刷新页面