limbo947
DSH-recall-plugin
DSH 消息撤回插件:回到发送该消息时的状态
- Stars
- 2
- Language
- JavaScript
- Created
- Aug 14, 2026
- Updated
- Aug 14, 2026
Introduction
dsh-recall-plugin
撤回一条消息,项目文件也一起回去。
在任意一条你发过的消息下方,点「↶ 撤回」,工作区文件和对话历史一起回到那条消息发出之前的状态。
界面预览
- 撤回按钮位置

| 确认面板 · 变更文件清单 | |
|---|---|
![]() | ![]() |
功能亮点
- 文件 + 对话,整段回退:撤回的不只是聊天记录,agent 改过的文件也一并回到原样。
- 不碰你项目自己的 git:快照存在独立的影子 git 仓库里,你的分支、暂存区、未提交改动统统不受影响;
.git、node_modules自动排除。 - 项目目录保持干净:快照始终存在
$DSH_HOME下,不会往项目里塞任何东西;与会话的沙箱权限无关(workspace-write / read-only 会话照常快照与回退),仅当 home 本身不可写(如指到只读盘)才降级到项目内.dsh-recall-snapshots(降级时页面会提示),home 恢复后自动迁走、清理干净。 - 可以反复后悔:快照全量保留、永不修剪。撤回一次后还能再撤到更早;撤回时被覆盖的文件也一直找得回来。
- 先看清单再动手:点撤回先弹出将变更的文件清单(修改 / 恢复 / 删除),确认后才执行,不会稀里糊涂覆盖。
- 磁盘友好:快照走 git delta 压缩,是增量不是整目录拷贝;超过 100MB 的大文件自动跳过。
已知限制
- 快照在消息发送时创建,插件启用前的历史消息没有快照,不显示撤回按钮。
- 会话第一条用户消息无法回退对话(仅文件回退),因为 fork 需要更早的 turn 边界。
- 仅支持 Windows(脚本用 PowerShell + git CLI);Linux/macOS 下页面会弹一次性「仅支持 Windows」提示,快照不可用、不显示撤回按钮,也不会产生任何文件副作用。
- 工作区内嵌套的其他 git 仓库(子目录自带
.git)不进快照,其内容不参与回退。 - MacOS和Linux环境未进行测试
安装
前置:Windows + git CLI(未装 git 时撤回按钮不出现,页面顶部会提示安装 git,不影响 DSH 运行);PowerShell 5.1 / 7 均可;DSH 0.1.0-rc.x(依赖版本见 peerDependencies)。
- DSH 官方插件命令:安装并自动挂载进 web profile
dsh plugin --profile web add dsh-recall-plugin
- 也可从 git 直接安装(纯 JS 无构建,免 prepare/allowBuilds):
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(同时移除依赖与挂载层),快照数据保留在 $DSH_HOME/dsh-recall-snapshots/,想彻底清除手动删掉该目录即可。
使用
- 鼠标悬停任意插件启用后发送的用户消息,复制按钮左侧出现「↶ 撤回」。
- 点击 → 确认面板展示将变更的文件清单(修改 / 恢复 / 删除)。
- 点「确认回退」→ 文件恢复到该消息发送前的状态;视图切到新会话(该消息及之后的对话移除),原会话归档、随时可找回。
工作原理
每条用户消息发送时(agent 动文件之前),工作区被快照进一个独立的影子 git 仓库;撤回时用 git archive 恢复文件、通过 DSH 官方 sessions.fork 机制把会话切到该消息之前。二进制安全,全程不触碰项目自身的 git 状态。
-
快照存储:
$DSH_HOME/dsh-recall-snapshots/<SHA256(项目绝对路径)>/,内含影子 git 仓库(git/,tag 名为snap-<消息ID>)与索引文件index.json(消息 ID → 快照时间 / 会话)。 -
想直接翻历史快照:
git --git-dir="<store>\git\.git" tag -l git --git-dir="<store>\git\.git" ls-tree -r --name-only snap-<消息ID>
本地开发(无需发布)
# 把包目录放进 web profile 的 node_modules,并登记到 bundles
$pkg = '<你的仓库克隆路径>\dsh-recall-plugin'
$profile = "$env:USERPROFILE\.dsh\profiles\web"
Copy-Item -Recurse -Force $pkg "$profile\node_modules\dsh-recall-plugin"
# 手动编辑 $profile\package.json:
# dependencies 加 "dsh-recall-plugin": "1.0.0"
# dsh.profile.bundles 加 "dsh-recall-plugin"
# 然后重启 DSH 并硬刷新页面
License
MIT

