dsh-session-recycle-bin:为 DeepSeek Harness 补上可还原的会话删除

前言

在 DeepSeek Harness(DSH)里管理会话时,侧栏菜单通常只有重命名、分叉、归档。归档只是把会话从侧栏藏起来,磁盘上的会话日志并不会少一个字节;而若要把某条会话从磁盘上清掉,官方 sessionPersistence 契约里写明:没有删除或保留 API,清理会话属于带外维护。不少人只能手动进 %USERPROFILE%\.dsh\sessions\ 删目录,既容易误删,也容易让会话列表、投影缓存、工作区注册表状态不一致,删完后还可能留下空的 --C-Users-...-- 项目文件夹。

社区插件 dsh-session-recycle-bin(维护者 Afgkwyp,分类:记忆)把「删除会话」做成两步:先归档进回收站、可随时还原,确认不要了再真正删除磁盘日志。下面介绍它做什么、怎么装、怎么用,以及永久删除时的边界。

这是什么

dsh-session-recycle-bin 是 DSH 的「会话回收站」插件:头部垃圾桶按钮与侧栏「删除会话」先移入回收站(软删除,日志不动),设置页集中管理归档会话,支持还原、永久删除与批量清理。实现上是零依赖、零构建,单文件宿主(index.js)加单文件客户端(client.js);package.json 当前版本为 1.0.3,README 标明适用 DeepSeek Harness 0.2.1-rc.2(Desktop / Web profile),Node >=22,许可证 MIT。

核心功能

界面入口

位置 作用
会话头部(标题右侧工具行) 垃圾桶按钮:把当前会话移入回收站
侧栏会话「⋯」菜单 删除会话(红色,order 500,排在官方 pin / 重命名 / 分叉 / 归档 / 会话 ID 之后)
设置 → 会话回收站 归档会话集中管理:多选还原、永久删除、清空回收站、删除 30 天前的会话;展示工作区路径、删除时间、日志体积、子代理会话数、「运行中」标记

软删除经确认后,会话从侧栏消失并进入回收站;日志、子代理会话、投影缓存都保留,可随时还原。回收站成员 = 官方归档集合(workspaceRegistry 的 archived set)与插件记录的并集,因此通过官方「归档会话」归档的条目也会出现在这里。

还原与永久删除

还原会把会话移出归档集合,侧栏恢复原位,磁盘文件不被触碰。

永久删除才会动磁盘,顺序在 README 中有意固定(不可交换):释放驻留会话 → 停止仍在跑的工作并等待清零 → 持久化 flush 屏障 → 删除日志目录 / 子代理目录 / 投影缓存 → 清理注册表引用 → 广播 api-session/removed。会删除的内容包括:$DSH_HOME/sessions/<项目>/<会话 id>/ 整目录、同项目下该会话的子代理日志目录、变空时的项目目录(1.0.1+)、session_projcache 中相关投影检查点、storages/workspace.json 中的归档 / 置顶 / 成员引用。不删除附件对象(内容寻址、跨会话共享)、会话工作区里的文件、以及作为独立对话的分叉(fork)会话。

批量清理与确认

工具栏只放对所选的动作(还原所选 / 永久删除所选);「删除 30 天前的会话」「清空回收站」放在列表下方「危险操作」区,并注明适用范围。按天清理只删有可靠时间依据且确实够老的会话:优先删除记录,否则用日志最后修改时间;两者都没有的条目一律保留并在结果中报告。单条永久删除在该行行内确认(问句含会话标题);批量 / 清空 / 按天清理用顶部确认卡,确认期间其它行操作被锁住。

安全边界(摘要)

情况 行为
会话仍在运行 归档时拒绝,可提供「停止并删除」,走官方 workspace/session-stop
当前界面仍打开该会话 永久删除拒绝,提示先切换会话
目录名与会话 id 不匹配 跳过并报告,不猜测路径

回收站展示用的旁路记录写在 $DSH_HOME/session-recycle-bin.json,删掉不影响归档状态本身。

安装与启用

插件以当前 DSH 进程权限访问 $DSH_HOME 下的会话与存储;安装前建议通读仓库源码与 MIT 许可证。SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系;安装方式以 README 为准,需先把插件目录放到本机,再按 profile 挂载。

方式 A:图形界面(README 推荐)

  1. 将仓库放到本机某一目录(README 示例为克隆到本地路径)。
  2. 侧栏 → 插件 → 添加插件 → 填写该目录的绝对路径。
  3. 宿主侧半即时生效;浏览器侧刷新页面一次。

方式 B:CLI

dsh plugin --profile <profile-name> add "C:/path/to/dsh-session-recycle-bin"

将 C:/path/to/dsh-session-recycle-bin 换成你本机上的实际路径。

方式 C:手工写 profile

在 <DSH_HOME>/profiles/<profile>/cordis.patch.yml 插入插件行,并在同名 profile 的 package.json 依赖中加入 "dsh-session-recycle-bin": "file:C:/path/to/dsh-session-recycle-bin"(路径同样需为本机绝对路径)。具体字段见 README 中的 insert 示例。

更新:拉取新版本后,在插件页关闭再打开本插件并刷新页面;替换已安装包时重启应用更稳妥。卸载:插件页移除即可;可选删除 session-recycle-bin.json 旁路记录。

验证是否生效

  • 会话头部出现垃圾桶;侧栏「⋯」出现「删除会话」;
  • 设置 → 会话回收站能列出已归档会话;
  • 宿主激活后会在 $DSH_HOME/plugin-session-recycle-bin.json 写入激活记录(构建号、seam、时间戳),排查「改了代码没生效」时可先看该文件。

可选配置(写在插件行的 config 下,均可省略):

- id: session-recycle-bin
  name: 'dsh-session-recycle-bin'
  config:
    home: 'C:/Users/me/.dsh'   # 默认 $DSH_HOME 或 ~/.dsh
    stopWaitMs: 8000           # 停止后等待工作清零的上限(毫秒)

典型用法

  1. 日常「删掉侧栏里的会话」:打开某会话,点头部垃圾桶;或侧栏该会话「⋯」→ 删除会话 → 确认。会话进入回收站,磁盘日志未删。
  2. 误删恢复:设置 → 会话回收站 → 选中条目 → 还原所选。
  3. 确认不要了:在同一页选中会话 → 永久删除所选(或单条行内确认)→ 按提示完成;若会话仍在跑,需先走「停止并删除」。
  4. 定期减负:在「危险操作」使用「删除 30 天前的会话」或「清空回收站」,注意说明中的作用范围;时间未知的条目不会被按天清理误删。

宿主半提供 /api/session-recycle-bin.{health,list,archive,restore,purge} 等路由;浏览器半通过同源 fetch 与请求头 x-dsh-session-recycle-bin: 1 调用,与官方插件方式一致。

开发者可在插件目录执行自测(无需启动完整 Harness):

node test/host-test.mjs

或 npm test(package.json 中 test 脚本指向同一文件)。README 记载 fixture 检查为 39/39。

适用场景与注意

适合谁:长期在 DSH 里积累大量会话、需要可控清理磁盘、又希望删除可撤销的 Desktop / Web profile 用户;依赖 connection、sessionPersistence、workspaceRegistry 以及客户端若干 slot(侧栏菜单、会话头部工具、设置区块等),README 在 0.2.1-rc.2(Windows Desktop,web profile)上实测。

务必注意:插件与 DSH 同进程权限运行,永久删除不可恢复(除附件与工作区文件按设计保留外)。多 profile 时,装到哪个 profile 只在该 profile 生效。若永久删除后侧栏未即时刷新,可切换会话或刷新页面;1.0.1 起会清理变空的 sessions/--C-Users-...--/ 项目目录,升级后仍见空目录可重载插件。

结尾

dsh-session-recycle-bin 用回收站补齐 DSH 会话生命周期里「可还原删除」与「真正清磁盘」之间的缺口,并把官方归档与插件归档统一到设置页管理。进一步了解可从社区目录页与 GitHub README 查看安装细节、永久删除清单与更新日志(当前包版本 1.0.3)。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜