dsh-session-delete:为 DSH 侧栏补齐可恢复的会话删除

前言

在 DeepSeek Harness(DSH)里管理多个工作区会话时,侧栏自带的能力主要是「归档」——把会话从列表里藏起来,磁盘上的日志目录仍在。若你希望像常见桌面软件一样,先「删除」到一处可复查的垃圾箱,再决定恢复或永久清掉,DSH 核心并没有这条路径。社区插件 dsh-session-delete(仓库 ColdRainLab/dsh-session-delete)在客户端侧栏接入「移入垃圾箱」和「垃圾箱」面板,由宿主把会话目录整体挪到独立 trash 树,并在账目上 detach,从而补齐「外部移除 + 垃圾箱」流程;只有用户在垃圾箱里执行「彻底删除」或「清空垃圾箱」,才会真正删除磁盘数据。

这是什么

dsh-session-delete 是 ColdRainLab 维护的 客户端 类 DSH 插件(当前包版本 0.2.4,许可证 MIT)。它在会话行菜单增加「移入垃圾箱」,在工作区侧栏底部(设置旁)增加「垃圾箱」入口,通过宿主 API 移动本地会话目录并维护垃圾箱元数据,支持恢复与彻底删除。插件不联网,无第三方依赖,路由与宿主其它插件一样仅面向本机回环,请以当前 DSH 进程权限对待其文件操作;安装前建议自行查看仓库源码与许可证。

DSH 采用「一切皆插件」的扩展方式;插件目录站点 skillhub.cn 为社区收录,与 DeepSeek / 幻方无官方从属关系。

核心功能

移入垃圾箱

在侧栏会话行打开「…」菜单,可见危险色样式的 移入垃圾箱(位于归档、会话 ID 等项之后;自 0.2.4 起菜单项 order 固定为 10000,其它插件新增的会话菜单项会排在它前面)。确认框会显示会话标题,并说明可随时恢复、彻底删除才永久移除;可取消。

确认后宿主会:

  1. 将会话日志目录从 <DSH_HOME>/sessions/<项目键>/<会话 id>/ 移动到 <DSH_HOME>/trash/dsh-session-delete/<trashId>/session/(同卷 rename,跨卷则复制后删除源目录);
  2. 写入垃圾箱条目 entry.json(含 sessionId、title、cwd、workspacePath、deletedAt、sizeBytes、archived、pinned 等);
  3. 从工作区账目 detach,并清理 archivedSessionIds、pinnedSessionIds 中的残留。

删除成功后刷新会话列表;若删的是当前展示的会话,会清空主面板(失败时退回页面刷新)。正在运行的会话(回合、任务、子代理、提醒等)会被 409 session-active 拒绝;自 0.2.2 起,本次启动后打开过但当前空闲的会话会先 sessions.flush() 再 detach 后移动,真正在跑的仍不能移入垃圾箱。

垃圾箱面板

侧栏底部 sidebar.footer.action 提供 垃圾箱 入口;有待恢复项时显示红色数量徽标,侧栏折叠为 56px 轨道时仅显示图标。点击后在 shell.overlay 浮层中打开面板(不挤压会话列表),列出标题(无标题时回退会话 id)、删除时间、占用大小;每条可 恢复 或 彻底删除(行内二次确认);左下可 清空垃圾箱。恢复时会话目录移回 <sessions root>/<项目键>/<会话 id>/ 并重新挂回工作区(保留原归档、置顶标记);若目标路径已存在同名目录则拒绝(409),垃圾箱条目保留。垃圾箱 没有自动过期,条目一直保留直到手动彻底删除、清空,或直接删除 <DSH_HOME>/trash/dsh-session-delete/ 目录。

兼容性与版本准入

项 值
DSH 版本 >=0.2.1-rc.2 <0.3.0(package.json → engines.dsh;README 记载已在 0.2.1-rc.2、0.2.1-rc.3 验证)
profile 桌面端(--profile desktop)与网页端(--profile web)
客户端 slot sidebar.workspaces.session.menu.item、sidebar.footer.action、shell.overlay
平台 README 记载 Windows 已验证构建/加载;路径逻辑为 Node path 通用实现

若 DSH 自动升级后菜单与垃圾箱入口一起消失,常见原因是宿主兼容性准入跳过整个插件(日志形如 skipping profile bundle "dsh-session-delete": Plugin dsh-session-delete@x is incompatible with dsh y)。插件与垃圾箱数据仍在磁盘。处理方式是安装声明了新 engines.dsh 范围的插件版本,或临时执行:

dsh plugin --profile desktop allow-version dsh-session-delete@<版本> --dsh-version <DSH版本> --accept-risk

然后重启 DSH。大版本升到 engines.dsh 范围外(例如 0.3+)时同样需要更新插件或临时授权。

安装与启用

桌面端(README 示例路径请按本机 DSH 安装位置与插件包路径替换):

& "D:\Program Files\Deepseek Harness\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add "C:/Users/ROG-STRIX/.dsh/plugin-archives/dsh-session-delete/v0.2.3/dsh-session-delete-0.2.3.tgz"

宿主半边可由 HMR 热加载;客户端 bundle 经宿主 /plugins 图热更新,刷新页面(Ctrl+R)后应能看到垃圾箱入口。若菜单仍无该项,完整退出 DeepSeek Harness 再打开。

网页端:

dsh plugin --profile web add "link:<仓库或本目录绝对路径>/plugins/dsh-session-delete"
# 然后重启 dsh web,刷新浏览器页面

安装会把包注册进 profile 的 dependencies,并由包内 dsh.bundle.patch 自动加入 dsh.profile.bundles,不改动其它插件。

典型用法

  1. 侧栏会话列表 → 悬停会话行 →「…」→ 移入垃圾箱 → 确认。
  2. 侧栏底部 垃圾箱(N) → 在面板中 恢复 或 彻底删除。
  3. 需要一次性清空时,使用面板左下 清空垃圾箱(确认后删除全部条目)。

健康检查可调用宿主接口 GET /api/session-delete/health,成功时返回 { ok, version }。

数据位置与卸载

默认 DSH_HOME 为 ~/.dsh。垃圾箱根目录为 <DSH_HOME>/trash/dsh-session-delete/,与 ~/.dsh/sessions 为兄弟目录,会话后端不会把垃圾箱内的目录当作活跃会话列出。体积约等于被删会话日志目录大小,可在面板中查看每条大小。

卸载(桌面端示例):

& "D:\Program Files\Deepseek Harness\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop remove dsh-session-delete

重启 DSH 后插件不再加载;卸载不会删除垃圾箱里的会话数据。若要彻底清掉,请先「清空垃圾箱」,或手动删除 <DSH_HOME>/trash/dsh-session-delete/。

适用场景与注意

适合在本地 DSH 桌面端或网页端长期使用、会话目录堆积、又希望删除前有缓冲区的开发者。插件仅处理 本地 数据,不做云端操作;storages/session_projcache/ 中可能残留很小的孤儿投影文件,README 记载不影响使用。恢复要求原路径可写且目标不存在;多进程同时操作同一 DSH_HOME 未做跨进程锁。加载失败不会阻止 DSH 启动,仅表现为侧栏没有相应菜单,可查看 DSH 日志中与 dsh-session-delete 相关的行。

结尾

dsh-session-delete 在 DSH 归档能力之外补上「移入垃圾箱 → 恢复或彻底删除」的闭环,数据落在 ~/.dsh/trash/dsh-session-delete/,与活跃 sessions 树隔离。进一步了解可在社区目录页 ColdRainLab/dsh-session-delete 查看收录信息,在 GitHub 仓库 阅读完整 README、宿主 API 表与测试说明。

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

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

小夜