把 DSH 会话删入可恢复的回收站——子会话随其父会话作为一棵树处理,支持批量归档、恢复与彻底删除,只有彻底清除才会真正销毁数据。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-recycle-bin
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:WangLemna/dsh-recycle-bin
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
给 DSH 补上删除会话的能力——删除即移入可恢复的回收站,子会话跟随主会话整树处理。
DSH 没有删除会话的接口。本插件把它补上,并且做成两步:删除 = 移入回收站,随时可以恢复;只有「彻底删除」才真正销毁磁盘上的字节。
为什么选它
能删除会话的插件不少,本插件围绕三条约定设计:
- 一条条目 = 一棵树。 一个会话名下的子代理会话不会被落下指向一个不存在的父会话。删除一个会话会带走整棵树;回收站里它是一条条目,恢复与彻底删除都把树当成一个整体。
- 不会悄悄销毁任何东西。 删除与销毁前,确认框都会写清楚有几个子会话会跟着走;没有静默批量清空。
- 做得正。 侧栏入口、会话菜单、模型工具三处入口共用同一批 Host 方法,行为一致。
安装
插件已在 npm 发布为 dsh-recycle-bin。
dsh plugin --profile <profile> add dsh-recycle-bin
也可以直接在市场里搜索 会话回收站 / Session Recycle Bin 点安装。装完 刷新一次页面(Ctrl+F5),侧栏入口会出现在「插件」「定时」「市场」那一排。
本地开发安装(源码即运行代码,不需要 build):
plugin_manager { action: "install_bundle", target: "<本目录绝对路径>" }
你能得到什么
| 位置 | 作用 |
|---|---|
| 会话右键菜单 → 红色「删除会话…」 | 先弹确认框(不会单击即删),并写明有几个子会话会一并移入 |
| 会话右键菜单 →「批量操作…」 | 对某个工作区的全部会话批量归档或删除;独立确认框,写明整个选中集合带多少子会话 |
| 侧栏「会话回收站」 | 主区打开完整页面:每条会话行首有复选框、行尾是恢复与彻底删除,上方是选择栏,可批量操作 |
| 右键侧栏图标 | 「清空回收站…」——一键清空的捷径,同样先过写明条数的确认框 |
| 设置 → 会话回收站 | 同一个回收站页,给习惯在设置里操作的人 |
delete_session 工具(给模型用) |
preview / trash / trashMany / archiveMany / list / restore / restoreMany / purge / purgeMany / purgeAll,与 UI 共用同一批 Host 方法 |
删除确认框会写明带走的子会话数:
彻底删除前同样先报数:
一次删除做了什么
- 先解析整棵树:按每个会话日志 header 里的
origin: 'subagent'+parentSession找到全部子代理会话(任意深度),不依赖侧栏当前显示什么。 - 先过准入:调 DSH 官方的归档准入,检查这个会话是否还有正在跑的工作(进行中的回合、后台 job、活着的子代理、定时提醒)。有工作就拒绝删除,返回
session-open。 - 搬运:会话日志与投影缓存被移动到
~/.dsh/session-recycle-bin/<时间戳>-<id>/,并从工作区登记里摘除,侧栏行随即消失。 - 失败全部回滚:任何一步失败,已经搬走的东西都会搬回原位,不会丢字节。
恢复是反过程,并且先检查整棵树的所有目标路径再动任何一个字节:只要有一个会话会与现有目录冲突,整条恢复就被拒绝,不会出现「父会话回来了、子会话还在回收站」的半棵树。
安全边界与已知限制
- 只有「还有工作」的会话会被拒绝删除。 你若只是打开过会话,没有在跑的任务,它就能被删除,恢复后也能继续对话。
- 不会误销毁。 清空回收站不可撤销,所以它总是走同一个确认对话框:对话框打开期间整个回收站页冻结,正文永远写明要销毁的条目数与子会话日志数。
- 永远不碰:附件目录(
~/.dsh/attachments/v1/objects,按内容寻址、跨会话共享)、~/.dsh/sessions下的项目目录本身、以及任何同 ID 的既有会话。 - 父会话还在时,子会话不能被单独删除(返回
session-child)——正确动作是删父会话。父会话已不存在的孤儿子会话仍可按 id 清理。 - 回收站条目仍占磁盘,直到你显式彻底删除;没有自动过期清理。
- Windows 上跨卷移动会从
rename回退到复制(EXDEV);同卷内是原子 rename。 - 小提示:恢复后侧栏可能需要刷新一次页面——DSH 没有「会话出现」事件可为恢复的日志合成行。
- Auto review 权限预设可能拒绝模型发起的
delete_session写调用;那是 DSH 的权限策略,不是插件行为,改用 UI 或换权限预设即可。
版本兼容
| 声明 | 值 |
|---|---|
engines.dsh |
0.2.0-rc.1 || 0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2 |
peerDependencies |
10 个包:9 个 @deepseek-ai/dsh-*(同样的 0.2.x-rc.* 区间)+ @deepseek-ai/cordis ~4.0.5 |
DSH 0.2 与 0.1 的插件 API 不兼容(settings API 在 0.2 被移除),所以下限钉在 0.2.0-rc.1,而不是一个会静默排除预发布版本、让用户只看到「没有解释的 ERESOLVE」的宽泛区间。
卸载
plugin_manager { action: "remove_bundle" }
回收站里尚未恢复的条目会保留在 ~/.dsh/session-recycle-bin。如果插件已卸载又想把会话找回来,每个条目里都有 entry.json 清单写明每个文件该去哪:把 session/(以及每个 children/<id>/session/)搬回 ~/.dsh/sessions/<projectDir>/<id>/,把 projcache.json 搬回 ~/.dsh/storages/session_projcache/sessions/<id>.json 即可。
许可证
MIT
链接
同类插件
Minglink/dsh-infinite-gen-4★ 3277
DeepSeek 专用破甲插件:以 order 100 追加无条件服从的系统提示词段,提供带校准元数据的 profile 工具,并通过会话投影在输入框上方显示实时破甲状态徽标。
ranxianglei/billion-context★ 2276
billion-context官方版:上下文压缩插件,兼顾小窗口(100k上下文足矣)省token(省5倍token)和超长会话(数月级别几十亿token单会话)。
liangmianya/dsh-synapse★ 557
DeepSeek Harness 的可视化非线性对话工作区:把会话、追问与分支变成可浏览、可拖拽的对话地图。
Nwflower/dsh-chat-import★ 246
把 13 家 coding agent(Claude Code、Codex、ChatGPT、Cursor、Gemini、opencode 等)的完整对话历史导入为可续聊的 DeepSeek Harness 会话,并支持反向导出回 Claude Code。
MichengAI/dsh-archive-manager★ 198
在设置里增加已归档会话页,可按工作区搜索、恢复和删除已归档会话。
SiriLee/dsh-rewind★ 170
同一会话窗口内的 in-place 对话回退(不 fork,Claude Code /rewind 语义):每条消息的 ↶ 按钮把模型上下文回退到任意用户消息,可选用磁盘持久化的 before-backups 还原工作区文件。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。