前言¶
在 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 子会话。勾选目标后一次性执行:
- 从所有工作区成员表移除(
Workspace.detachSession,持久化)。 - 从归档集合移除(
workspaceRegistry.unarchiveSession,持久化)。 - 删除会话转录目录(整目录,含旧代际日志)。
- 删除
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。
典型用法¶
- 重启 DSH 后打开设置,在左侧进入「会话清理」。
- 在列表中查看归档会话的引用与运行状态,勾选需要彻底移除的项。
- 按需保留或关闭可选回收项(独占/孤儿附件、subagent、request-images 缓存等,默认全开)。
- 确认执行;若备份失败或存在运行中会话、非归档 id,操作会被拒绝或中止。
- 其他已打开页面依靠
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