dsh-session-purge:归档会话真删与附件 blob 回收

前言

在 DSH(DeepSeek Harness)里长期使用后,归档列表里往往会堆积大量历史会话。官方归档通常只把会话移出工作区视图,转录目录、投影缓存和磁盘上的附件引用未必一并清掉;若手动删目录,又容易漏掉 workspace.json 里的归属记录,或与仍在运行的会话、共享附件发生冲突。

下面介绍的 dsh-session-purge 是社区插件(维护者 w1w218,分类 admin-security),在 DSH 设置里增加「会话清理」页,通过官方 registry API 做记账,再删除归档会话并可选回收不再被任何会话引用的附件 blob。针对的是 DSH 0.2.2-rc.1 的公开 Service 契约;不替换官方 workspace 行、不读取宿主私有成员。

这是什么

一句话:DSH Web 插件,入口为设置面板 → 左侧导航「会话清理」(见仓库 assets/session-purge.png)。

  • 仓库:https://github.com/w1w218/dsh-session-purge
  • 社区目录:https://www.skillhub.cn/plugins/w1w218/dsh-session-purge
  • 许可证:MIT(package.json 版本 0.1.0)

核心功能

列表与删除流水线

插件能列出归档集合里的会话,展示标题、ID、转录大小、附件引用数、是否运行中、是否有 subagent 子会话。勾选目标后一次性执行:

  1. 从所有工作区成员表移除(Workspace.detachSession,持久化)。
  2. 从归档集合移除(workspaceRegistry.unarchiveSession,持久化)。
  3. 删除会话转录目录(整目录,含旧代际日志)。
  4. 删除 storages/session_projcache/sessions/<id>.json 投影缓存。

删除前自动备份 storages/workspace.json;备份失败则整批不执行。成功后通过 api-session/removed 通知已连接页面,侧边栏对应行可即时消失。

可选回收(默认全开)

  • 连带删除选中会话的 subagent 子会话(递归)。
  • 回收独占附件:仅被待删会话引用、且无幸存会话引用的对象。
  • 回收孤儿附件:磁盘存在但已无任何会话引用(含历史遗留)。
  • 清空 cache/attachments/request-images 派生图缓存(会按需重建)。

引用扫描读取磁盘上全部会话转录(含未归档、子会话、多代际日志),用 sha256:<64hex> 匹配附件 id;只有不在「幸存引用」并集里的对象才会被回收。

安全与边界

  • 不退出 DSH,归档/归属变更走官方 registry API;只处理归档会话(id 必须在归档集合中,级联子会话除外)。
  • 运行中会话拒绝删除(ctx.agents.get(id)?.status === 'running');idle 的已加载会话会先 sessions.flush() 再删。
  • fail-closed:任一幸存会话日志无法解码则整次中止,不删文件。
  • 待删路径须严格位于 sessions/、attachments/v1/、session_projcache/sessions/、cache/ 等预期根下;HTTP 接口复用 connection.admit() 的 Host/Origin 与 cookie 认证,仅 POST + JSON。
  • 不清理 dsh-spill-* 临时目录;DSH home 取 $DSH_HOME,否则 ~/.dsh。

附件引用基于日志文本匹配,偏保守(工具参数里的 sha256:... 也算引用)。标题取自最后一条 session/title 事件,无标题则显示会话 ID。

安装与启用

需要已安装 DSH(Desktop 或 Web profile 均可)。安装后需重启一次 DSH,设置里才会出现「会话清理」。

资料中的安装方式为本地 bundle(非凭名称拼接的远程 add 命令):

git clone https://github.com/w1w218/dsh-session-purge.git
cd dsh-session-purge
dsh plugin --profile <profile> add .

将 <profile> 换成你的 profile 名(Desktop 默认 desktop,Web 默认 web)。也可在 DSH 插件管理器中选择「安装本地 bundle」,指向克隆后的目录。

卸载:

dsh plugin --profile <profile> remove dsh-session-purge

package.json 标明客户端注入 @deepseek-ai/dsh-client-ui-settings,platform: web,immediately: true。

典型用法

  1. 重启 DSH 后打开设置,在左侧进入「会话清理」。
  2. 在列表中查看归档会话的引用与运行状态,勾选需要彻底移除的项。
  3. 按需保留或关闭可选回收项(独占/孤儿附件、subagent、request-images 缓存等,默认全开)。
  4. 确认执行;若备份失败或存在运行中会话、非归档 id,操作会被拒绝或中止。
  5. 其他已打开页面依靠 api-session/removed 更新;设置页列表在删除后会重新扫描。

维护者在仓库提供自测:

node test/self-test.mjs

覆盖扫描、独占与孤儿识别、备份、运行中拒绝、损坏幸存日志中止等场景。也可用 npm test(脚本同命令)。

适用场景与注意

适合谁:需要定期压缩 DSH 磁盘占用、且愿意只清理已归档会话的管理员或长期单机/Web 部署的开发者。

权限与信任:插件以当前 DSH 进程权限读写 home 目录下的 storages、sessions、attachments 等;安装前应阅读源码与 MIT 许可,确认与自有备份策略一致。社区目录站点(如 SkillHub)与 DeepSeek / 幻方无官方从属关系,属于「一切皆插件」生态中的第三方条目。

与「只归档」的区别:本插件做的是 registry 记账 + 文件删除 + 可选 blob 回收,不是替代官方归档按钮;共享仍被其他会话引用的附件会被保留。

结尾

dsh-session-purge 把「归档」从视图层推进到可审计的真删流程:先备份 workspace、再走官方 API、再删转录与缓存,并在保守引用扫描下回收独占与孤儿附件。若你要在 DSH 里做会话维度的空间治理,可从社区目录或 GitHub 获取仓库,按上述 profile 安装并重启后使用设置中的「会话清理」页。

  • 目录页:https://www.skillhub.cn/plugins/w1w218/dsh-session-purge
  • GitHub:https://github.com/w1w218/dsh-session-purge
羽毛球分组比赛记分
小程序二维码

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

小夜