dsh-recall-plugin

24Star2Fork4Issue0Watching

在 DSH 用户消息旁加「撤回」按钮,把项目文件与对话历史一并回退到该消息发送之前;底层用影子 git 仓库快照+官方 sessions.fork。

机审证据安装命令仓库已核验dsh-plugin Topic许可证READMEAI 百科
语言
JavaScript
License
MIT
分支
main
cordisdeepseek-harnessdshdsh-pluginpluginwindows

安装

$ dsh plugin --profile web add github:limbo947/dsh-recall-plugin

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

对话式安装

帮我安装 DeepSeek Harness 插件 limbo947/dsh-recall-plugin:先查看仓库 https://github.com/limbo947/dsh-recall-plugin.git 确认安全性,然后执行安装命令并验证插件加载成功。

把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。

一句话定位

在 DSH 的用户消息气泡旁加「↶ 撤回」按钮,点一下就把工作区文件和对话历史一起回退到该消息发送之前;底层用独立的影子仓库做文件快照,用官方 sessions.fork 切会话。

核心能力

  • 一键回退整段交互:撤回时把项目文件恢复、对话切到该消息之前、新会话打开、原会话归档可随时找回
  • 文件与对话双轨同步:先弹文件清单确认(修改 / 恢复 / 删除),确认后才动手,不会盲目覆盖
  • 影子 git 仓库存储:快照存在 home 下的独立 git 仓库(~/.dsh/dsh-recall-snapshots/<工作区路径 SHA256>/),不污染项目自带的 git、不动暂存区、不动未提交改动
  • 自动维护磁盘:每积累 50 条快照或 24 小时后台跑 git gc 压缩;会话日志彻底删除后该会话的全部快照自动清理
  • 可视化排除配置:设置页编辑 exclude.txt(gitignore 语法),保存后下一次快照/回退即时生效;超过 100MB 的大文件自动跳过
  • 树形快照管理:设置页按 工作区 → 会话 → 快照 三级树形展示与删除,叶子显示对应消息内容摘要

技术实现

  • 语言: 纯 JavaScript(ESM,零构建步骤)
  • 关键依赖: @deepseek-ai/cordis(插件框架)、@deepseek-ai/dsh-shell(PowerShell/bash 执行器)、@deepseek-ai/dsh-session-query(冷日志读取)、@deepseek-ai/dsh-sandbox-policy(会话 cwd 解析)
  • 架构模式: 双 bundle 持久挂载:Host 半通过 cordis.patch.yml 的 insert 行注入,注册 /api/recall/* HTTP API 给前端调用;Client 半通过 dsh.client bundle 注入浏览器,注册 conversation.chat.node 渲染槽(priority -1 起、负向递减重试到 -3)渲染用户消息气泡
  • 入口文件: lib/index.js(Host 主入口,791 行装配各域模块) / lib/client.js(Client 主入口,UI 注入 927 行) / lib/snapshots.js(快照域:captureSnapshot / diffFor / rollbackFor / resolveCutSeq)

适用场景

AI 帮你改了一堆文件后发现方向不对、想回到"这条消息之前"的状态继续——传统做法是手动 git stash 或丢弃改动,但还得保留对话上下文继续推进。本插件让"撤回到某条消息"成为一次点击的操作,且文件与对话同时回到那一刻。适合用 DSH 长时间迭代、改动频繁、回退需求多的开发场景。

前置依赖与兼容性

依赖最低版本说明
DSH>= 0.1.0-rc.8peerDependencies 中 cordis ^4.0.1、dsh-session/shell/sandbox-policy/session-query/host-webserver/client-web-react 均 ^0.1.0-rc.8
Node.js>= 20engines.node 声明
git任意可执行版本探测不到时撤回按钮不出现、页面顶部提示 gitMissing,DSH 本身不受影响
WindowsPowerShell 5.1 / 7脚本模板用 [Text.Encoding]::UTF8SHA256::Create() 兼容 PS 5.1
Linux / macOSbash 3.2+POSIX 模板与 pwsh 模板同名导出,按平台在 store.js 单选
React^18.2.0Client 半的 peerDependency

安装方式

dsh plugin --profile web add github:limbo947/dsh-recall-plugin

安装后需重启 DSH 进程dsh web 前台重启或 pm2 restart <你的dsh进程名>),然后硬刷新浏览器页面(Ctrl+Shift+R)——悬停任意一条插件启用后发送的用户消息,复制按钮旁出现「↶」即生效。

配置项

配置类型说明默认值
gcSnaps整数每积累多少条快照触发一次 git gc50
gcHours整数距上次 gc 超过多少小时触发(与条数先到先触发)24
maxFileBytes整数(字节)超过该大小的文件不进快照、不参与回退104857600 (100MB)
baseExcludes字符串数组基础排除表(gitignore 语法),对所有项目生效['.git', 'node_modules/', '.dsh-recall-snapshots/']
DSH_RECALL_GC_SNAPS(环境变量)整数同 gcSnaps,但优先级高于上述配置
DSH_RECALL_GC_HOURS(环境变量)整数同 gcHours,但优先级高于上述配置

配置写在 profile 的 cordis.patch.yml 里按 id: recall 重述整行即可覆盖默认值;最常用的「加一项排除」请直接编辑 exclude.txt 或设置页,无需重启。

常见问题

Q: 撤回按钮没出现怎么办?

A: 九成是 DSH 进程没重启,或 git CLI 不在 PATH。重启后硬刷新页面(Ctrl+Shift+R)即可。插件启用之前发送的消息也没有快照,按钮不会出现在那些消息上。

Q: 撤回会污染项目自己的 git 仓库吗?

A: 不会。快照存放在 home 下的独立影子 git 仓库(~/.dsh/dsh-recall-snapshots/<SHA256>/git/),不会动你项目内的 .git、暂存区、未提交改动;.gitnode_modules 已被默认排除。

Q: home 不可写时数据存哪里?

A: 降级到项目内 .dsh-recall-snapshots/,页面顶部会一次性弹降级提示。home 恢复可用后,下一条快照前会自动把项目内数据迁回 home 并清理干净。

Q: 如何把某个目录排除出快照?

A: 设置 → 插件 → 撤回设置 可视化编辑 exclude.txt(gitignore 语法,一行一条),保存后下一次快照/回退即时生效;或直接编辑 home 下 dsh-recall-snapshots/exclude.txt。回退到更早快照时,当时尚未排除的文件仍会被恢复(这是回退的语义)。

Q: 会话被删除后快照还在吗?

A: 归档不算删除——撤回功能自己归档的原会话快照保留可找回;只有会话日志从磁盘真正消失时,下次维护才会自动清理该会话的全部快照。判断保守:冷着的会话不会被误清。

Q: 撤回错了能找回来吗?

A: 能。回退前会自动打一个 snap-pre-rollback-<时间戳> 安全快照 tag(不进 index 列表,但 git tag -l 仍能看到),从该 tag 恢复即可——这是堵住"撤回是唯一不可逆操作"的兜底。

Q: 卸载后快照数据会一起删吗?

A: 不会。dsh plugin --profile web remove 仅移除依赖与挂载层,快照数据保留在 home 下 dsh-recall-snapshots/;想彻底清除手动删除该目录即可。

上手难度

入门 — 安装重启即可用,无强制配置;进阶用法(自定义排除、手动 gc、批量删除快照)全部在设置页可视化完成。

已知问题与限制

  • 仅快照启用后发送的消息:插件启用之前的历史消息没有快照,自然不显示撤回按钮(README.md:44)
  • 首条消息仅回退文件:会话第一条用户消息无法回退对话,因为 sessions.fork 需要更早的 turn 边界(README.md:45)
  • macOS 尚未真机实测:脚本按 bash 3.2 兼容编写,但目前只跑了 Windows 真机与 WSL2 Ubuntu(bash 5.3 + git 2.53)的全流程(README.md:46)
  • 嵌套 git 仓库不进快照:工作区子目录里自带 .git 的子仓库(gitlink)内容不参与快照与回退(scripts.pwsh.js:36-39)
  • 文件名含换行/TAB 解析异常:diff 清单的解析按 TAB 切分,文件名含这两种字符的极端情况会被错乱解析(scripts.pwsh.js:191-194)
  • 撤回需 git CLI:未装 git 时撤回按钮不出现、页面顶部一次性提示,DSH 本身不受影响(README.md:52)
  • fork 不继承原标题递增:已经修复——多次撤回新会话不会变「xxx 2/3/4」(CHANGELOG.md:84-85, lib v1.2.2)

收录徽章

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/limbo947/dsh-recall-plugin)

把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。

返回插件目录
dsh-recall-plugin — DeepSeek Harness 插件 | deepseek-plugin.org