dsh-session-delete
Manifest validAdds a trash for DSH sessions.
@xrn1997/dsh-session-delete
给 DeepSeek Harness(DSH)加一个删除会话的能力。DSH 官方有归档、没有删除——归档只是把会话从列表里挪走,文件还在。本插件补上删除,并且让删除可恢复:删除 = 移入回收站,另有一个显式的「彻底删除」。

快速开始
-
安装:
dsh plugin --profile <profile> add @xrn1997/dsh-session-delete -
重启宿主(Node 半不走 HMR)。
-
用起来:
- 删一条:会话行「⋯」→「删除」。
- 删一批:会话行「⋯」→「多选」,勾选后点浮条里的「移入回收站 N 条」。
- 管理回收站:侧栏的「回收站」。
兼容性与离线安装见安装与兼容性。
目录
功能一览
| 想做什么 | 从哪进 | 结果 |
|---|---|---|
| 删一条会话 | 会话行「⋯」→「删除」 | 确认后移入回收站,连同盘上的子会话与更深后代;6 秒内可撤销 |
| 删一批会话 | 会话行「⋯」→「多选」→ 勾选 → 浮条「移入回收站 N 条」 | 一次确认、一次批量执行;失败的留在框里可重试,成功的 6 秒内可整批撤销 |
| 看回收站、判断该不该恢复 | 侧栏「回收站」 | 左清单、右详情;可折叠分组、拖分栏 |
| 恢复一条 | 回收站行右侧「恢复」 | 直接放回原项目目录,恢复删除前的归档状态 |
| 批量恢复 | 回收站「多选」→ 勾选 → 页脚「恢复 N 条」 | 确认框逐条列出目标;回到各自的原项目目录 |
| 彻底删一条 / 清空 | 回收站行右侧「彻底删除…」/ 页脚「清空回收站…」 | 二次确认后真的移除文件,不可恢复 |
| 批量彻底删除 | 回收站「多选」→ 勾选 → 页脚「彻底删除 N 条」 | 二次确认后执行,失败原因留在该行 |
删除会话
单条删除
会话行「⋯」→「删除」→ 确认框「移入回收站」。确认框在点之前就说明这一组的规模:

- 「含 N 个子会话,将一起移入回收站。」——只在 N>0 时出现;
- 删完有一条停留 6 秒的撤销提示,点「撤销」即恢复。
删除按整组走:父会话在盘上的子会话与更深后代一起移走(那些行宿主本来就不显示)。任一组员正在运行 ⇒ 整组拒绝、零副作用,报的是那个运行中的 id。
批量删除
宿主会话列表上的批量删除是显式模式:

- 入口:会话行「⋯」→「多选」;模式内再点同一条(变成「退出多选」)退出。模式外不显示勾选框。
- 模式内:点整行勾选/取消,且不会切换会话;行首出勾选框(有状态点或归档的行没有这一格,用行尾那颗兜底);在跑的会话勾不动,悬停说明原因。
- 浮条在多选模式内常驻(0 条也显示,给退出入口):已选条数、读得到时合计「含 K 个子会话,跟着整组走」;「查看已选」展开限高可滚的清单(可逐条移除);同一个位置按当前可见可选行在「全选 / 取消全选」之间切换(折叠组、归档过滤外的行不算);「移入回收站 N 条」;「退出多选」。
- 确认框逐条列出这批会话(有子会话的那条标「含 M 个子会话」),汇总再说一次这一批会带走多少;卡片限高 280px 滚动,计数在开框时重新问。
- 执行是一次批量请求。部分失败不关框,原文落在失败那一行,按钮变成「重试这 N 条」;成功的条目 6 秒内可整批撤销(撤销 = 一次批量恢复)。
- 计数读不到就整句不说,也不因此锁死确认按钮——不拿 0 冒充「没有」。
级联与运行中拒绝
- 删除按传递闭包取子会话:子会话的子会话也跟着走,一层层取到底。
- 任一成员在跑(包括宿主的列表里看不见的子会话)⇒ 整组拒绝、零副作用。本插件不替用户终止正在进行的活。
- 运行中的父会话在菜单里置灰,提示「会话正在运行,先停止再删除」。
回收站
清单与详情
侧栏面板列表里的「回收站」一行(与「插件」同层)。面板用满中央列:
- 盒子宽 ≥900px 时左右两栏:左清单(默认 420px)、右详情。中央列更窄时改成下钻——点一条看详情,「← 返回清单」回来。
- 清单按项目分组,每条两行:标题 / 「刚刚删除 · 24KB」或「删除于 7分钟前 · 350KB」。带子会话的行会说「含 N 个子会话」;级联落地前删掉的存量说「盘上还剩 M 个子会话」——两个数各说各的。
- 点行选中并在右边看详情;行右侧是「恢复」(描边)与「彻底删除…」(安静的红)。
- 头部是条数与合计占用(多选态换成已选条数);页脚是回收站位置说明与「清空回收站…」(多选态换成两颗动作按钮)。
- 组头可单独折叠,也可一键全部折叠/展开;折叠起来的组条目直接收掉,计数还留在组头上。两栏之间那根线可拖(键盘 ←→ / Home / End 也行),最窄 330px,Home 回默认 420px。
- 详情有四组元信息(时间/体量/计数/位置)和正文:只列你真实发的提问与助手的文字,宿主注入的上下文与工具调用不进正文。助手文字按 Markdown 排版,你的提问保持原话。
- 面板有读数中 / 空 / 失败 / 有条目;详情有未选中 / 读数中 / 失败 / 有内容。失败时把宿主原文上屏并给「重试」;详情坏掉只坏详情那一块,清单照常可用。空态时底部不出现「清空回收站…」。
恢复
- 单条恢复不需要确认框:按记录的原目录名放回原项目目录,并还原删除前的可见性——原来未归档的仍未归档,原来归档的仍在归档态。
- 原工作区已经被删掉也照常恢复:跳过账本挂接,会话归入「未分组」。清单行在点之前就说「原工作区已不存在,恢复后归入未分组」,批量恢复的确认框逐条重复同一句。
多选:批量恢复与批量彻底删除
回收站工具栏的「多选」进入:
- 模式内行右侧两颗按钮退场、标题左侧出勾选框,点行就是切换勾选;组头多出一颗三态勾选框,点它把这个项目的全部会话选上(包括折叠起来看不见的),只勾了几条时显示半选。退出多选即清空勾选,不留看不见的勾选。
- 页脚换成两颗:「恢复 N 条」描边 + 「彻底删除 N 条」实心红;一条没勾时两颗都置灰并说明原因。
- 批量恢复带确认框(单行恢复仍直接执行):逐条列出标题与项目名,正文说明「这一批会回到它们各自的原项目目录」。
- 批量彻底删除同样先确认;确认框说清这一批不可恢复。
- 两者都是一次批量请求;失败的原文留在它自己那行,成功的随清单重读消失、已选计数下降。批量恢复失败后多选态保持,方便直接处理剩下的。
彻底删除与清空
- 单条「彻底删除…」与页脚「清空回收站…」共用同一个二次确认;单条那张卡片报的是这一次会释放多少(父加跟着进来的孩子,与页脚合计同一个数)。
- 没有自动过期,只有显式彻底删除或清空才会真的丢字节。
安装与兼容性
dsh plugin --profile <profile> add @xrn1997/dsh-session-delete
dsh plugin --profile <profile> remove @xrn1997/dsh-session-delete
装完重启宿主(Node 半不走 HMR)。卸载只移除插件,~/.dsh/session-trash/ 下的已有目录不会被自动清理。
也可以离线分发:pnpm pack 出 tarball 后 dsh plugin add ./dsh-session-delete-<版本>.tgz。包里带预构建产物(prepack 会跑 build),这条路不需要为构建脚本授权。
兼容性分两层,别混:
- 装得上由
package.json的peerDependencies决定——宿主的dsh plugin add会拿运行中的宿主版本逐项比对@deepseek-ai/dsh*peer 区间,不满足即拒绝并回滚。本插件一条dsh-*peer 都没有(控件与图标已固化在src/client/ui/*,浏览器半只 require React 家族三个冻结平台模块),所以这道闸不限制它装在哪些代上。 - 真跑过由
dsh.compatibility.dshReleases记录,只列实测过的宿主:DSH Desktop 0.2.0-rc.2(compatible)。别的版本装得上,但没验过。
数据与安全
| 东西 | 位置 |
|---|---|
| 回收站本体 | ~/.dsh/session-trash/<时间戳>-<原目录名>/ |
| 回收站清单 | 本插件自己的 storage domain(介质在 ~/.dsh/storages/) |
- 回收站与
~/.dsh/sessions/同卷:搬进搬出靠整目录rename,原子、瞬时。 - 一格目录 = 一个会话:父会话与跟着它进来的子会话各占一格,面板上折成一行。手工翻回收站目录时看到比清单多的目录,那是子会话。
- 清单丢了不致命:会话文件自描述,解压后第一行即 header,含
id与cwd;每次读清单都会与回收站目录对账。 - 不自动过期:不设天数上限,清空是显式动作;界面显示条数与占用。
- 附件不连坐:附件是全局内容寻址的,与会话不是父子关系——删除不连带,也不会回收;被删会话独享的附件会留成垃圾(要回收得先有引用计数,属另一件事)。
- 回收站本体留在本机、不联网、不上传。
界面语言
中文 / English 挂在宿主自己的 locale 服务上,跟随设置的界面语言;服务不可用时退回内置中文。
常见问题
装完侧栏没有「回收站」,会话菜单里也没有「删除」?
先重启宿主。若仍没有,确认这一代宿主上本插件激活过——取数通道探测不过时,本插件一个入口都不注册:页面上看不出它的存在,但也不会因此把宿主拖死。这是有意用「入口不出现」表达不可用,不是禁用态。
删完之后侧栏那一行怎么还在?
本插件只在宿主确实不再列它时才通告客户端把那一行去掉;拿不准时宁可沉默(那时说「已移除」是假话)。刚巧遇上就刷新页面,那一行会自己消失。本机运行期没打开过的冷会话走正常路径,删完即走。
正在运行的会话为什么删不掉?
判据用的是宿主自己的活跃检查(与官方归档的准入同源)。一律拒绝,不替用户终止正在进行的活——先停下这个会话再删。它正在跑的子会话也算:一条父会话的子会话在跑时,整条删除会被拒绝,报的是那个子会话的 id(那一行宿主的列表里不显示,所以别看列表没在跑就以为删得掉)。
批量删除/恢复为什么只成功了一部分?
执行是逐条的,失败不会连坐。批量删除的确认框不关,原文留在失败那一行,按钮变成「重试这 N 条」;批量恢复失败的条目留在清单自己那行,多选态保持,成功的已经消失。重试只处理失败名单。
把工作区删了,回收站里的会话还能恢复吗?
能。宿主的「删除工作区」只删注册、保留目录和每个会话日志;恢复照常回盘,只是跳过账本挂接,会话落在「未分组」。清单行和批量恢复确认框都会在点之前说明。
能恢复多久?
不存在时间上限。不自动过期,只有显式清空或彻底删除才会真的丢字节。
开发
pnpm install
pnpm build # tsdown:Node 半 + 浏览器半(含浏览器半的纯度门)
pnpm test # vitest run
pnpm typecheck # tsc --noEmit
本地源码调试
lib/ 是构建产物且不入库,从源码目录链进 profile 的安装方式不会替你构建它。
pnpm build # 必须在源码目录手动跑一次
dsh plugin --profile <profile> add "link:<本仓绝对路径>"
改动生效分两半:浏览器半(src/client/)由宿主 HMR 推到浏览器,无需重启;Node 半不在热重载链路内,必须重启宿主。
设计住在 docs/design/2026-09-30-session-delete-design.md;回收站两栏、详情与批量动作另见 docs/design/2026-10-15-trash-detail-design.md。README 不复述。
贡献
欢迎 Issue 与 PR。提交改动前请确保 pnpm test 与 pnpm typecheck 都通过,且两条命令的退出码都亲眼看过——跑门要把输出先灌进文件、再单独打印退出码,管道会把红吃掉。提交即表示你同意以 Apache-2.0 协议授权你的贡献。
许可
Comments
Loading…
Similar plugins
Adds delete and batch delete to the session list menu; sessions go to the Windows Recycle Bin instead of being erased, and the files a session produced are listed first so you decide whether to remove
★ 0
dsh plugin --profile web add dsh-session-deleteAdds a permanent-delete row to the sidebar menu of archived sessions, removing the session log, its projection cache and its workspace registration.
★ 0
dsh plugin --profile web add dsh-session-purgeby DelayNooMore
DSH (DeepSeek Harness) 会话回收站插件:移入回收站、恢复、永久删除,设置页管理
★ 1
MIT
JavaScript
Oct 2, 2026
dsh plugin --profile web add dsh-plugin-session-trashPermanently delete a DSH session from the sidebar session row menu (danger-styled) with a confirm modal and a seven-stage, independently-degrading deletion pipeline (validate → running guard → workspace ledger → archive set → on-disk logs → in-memory drop → broadcast).
★ 0
dsh plugin --profile web add dsh-session-deleteby txlznbzsdj-collab
Adds a "Delete" item to the sidebar session menu with a confirmation dialog, then hard-deletes the session.
★ 0
↓ 283/wk
JavaScript
Aug 18, 2026
dsh plugin --profile web add dsh-session-deleteAdds a Delete session action to the sidebar session menu that permanently deletes the local records of that session, while refusing sessions that are running.
★ 0
dsh plugin --profile web add dsh-session-delete-next