dsh-cleaner
给 DeepSeek Harness(DSH) 桌面版 / Web 版补上删除会话能力的客户端插件。
DSH 本身没有任何删除会话的途径:会话只能归档,官方文档明确写着「删除工作区注册记录不会删除会话」。时间久了,~/.dsh/sessions/ 里的历史会话日志只增不减。本插件把这个缺口补上,并且把删除做彻底——会话日志、投影缓存、工作区注册表引用、派生搜索索引、连同全部子代理会话,一次清干净。
以上为示意图(演示数据)。
功能
- 三个入口:侧边栏会话「⋯」菜单 → 删除会话(带确认弹窗);侧边栏「会话清理」页面(与「插件」「自动化任务」同级的全局面板:按工作区分组 + 筛选 + 批量删除);模型 Tool
session_delete(默认 dry-run)。 - 删除立即生效:Host 侧通过运行中的
workspaceRegistry服务(unarchiveSession/unpinSession/detachSession)摘除注册表引用并推送投影增量,客户端在删除完成后重拉一次会话列表(session/list本就是实时扫盘)——侧边栏的行当场消失,无需重启 DSH;已打开的「会话清理」面板也会收到删除信号自动重扫,工具栏另有「重新扫描」按钮兜住模型 Tool 删除的场景。宿主未发布该服务时自动回退为直接编辑workspace.json的离线模式(重启后生效),删除结果里的registrySync字段标明走了哪条路。 - 标题化列表:清理面板按工作区分组展示(组头:短名 + 完整路径 + 会话统计,可展开/收缩,组级三态勾选),会话行显示标题(取自投影缓存,缺失回退 id),子代理会话嵌套在父会话下并带徽标;按标题、id、工作区或路径筛选,命中的组自动展开。
- 对话预览:双击会话行或点行内「预览」按钮,即可在删除前查看该会话的对话内容(标题、会话 ID 与随删的子代理会话 ID、双方消息与模型名;自动过滤 DSH 注入的运行时上下文等系统内容,多帧 zstd 日志完整解码)。弹窗默认宽
min(92vw, 920px),右下角手柄可拖拽调整大小(双击恢复默认,Esc / 点遮罩关闭)。 - 级联清理:删除主会话时,由它派生的全部子代理会话一并删除(含多级)。
- 勾选即删除闭包:批量面板勾选主会话会自动带上其子代理,选中数量与释放空间和实际删除完全一致。
- 安全设计:三重路径校验、运行中的会话先停止再删、当前打开的会话拒绝删除、不可撤销操作前明确确认;注册表服务在线时由它做
workspace.json的唯一写者(避免与宿主的内存态写回互相覆盖),摘除失败仅告警不回滚——文件已删,残留记账会在下次启动时被宿主自动剪除。 - 界面与宿主一致:菜单行、确认弹窗使用 DSH 官方 primitives 组件渲染;预览弹窗因官方 Modal 宽度固定(380px)且不可定制,改用复用宿主设计变量(layer-2 填充、同款遮罩/圆角/阴影)的宽幅可调自制卡片。
安装
推荐:DSH「添加插件」对话框。在 DSH 的「插件」页打开「添加插件」,输入包名 dsh-plugin-session-cleaner(npm 官方源与中国大陆镜像源均已上架),确认添加后完全退出并重启 DSH。
也可以手动声明 profile 依赖(效果等价):
// ~/.dsh/profiles//package.json
{
"dependencies": { "dsh-plugin-session-cleaner": "^0.3.0" },
"dsh": { "profile": { "bundles": [ /* ... */, "dsh-plugin-session-cleaner" ] } }
}
随后在 profile 目录执行 pnpm install,完全退出并重启 DSH(Host 会把插件元数据缓存在内存里直到重启)。
本地开发:把依赖指回工作树 "file:<本仓库的克隆路径>\plugin",改完代码重新 pnpm install 并重启。
它删什么
| 位置 | 内容 |
|---|---|
~/.dsh/sessions/<工作区slug>// |
会话日志(唯一真相) |
~/.dsh/storages/session_projcache/sessions/ |
投影缓存 |
~/.dsh/storages/workspace.json |
注册表中的引用 |
~/.dsh/storages/*.db |
派生搜索索引(无法对齐时移除,自动重建) |
不碰凭据、设置、skills、profiles 与工作区注册本身。没有回收站,删除不可撤销。
开发
node build/client.mjs # 构建 lib/
node --test tests/cleaner.test.mjs \
tests/plugin.test.mjs \
tests/client.test.mjs # 67 个测试
零运行时依赖,离线可构建。插件分两半:Host 侧(服务、Remote 契约、模型 Tool)与 Web 客户端侧(菜单项、确认弹窗、全局面板页),共用同一份 strict 编解码契约。
完整文档——包括 DSH 客户端插件开发的踩坑记录(Cordis 服务注入、Remote namespace 组合键、官方 primitives 组件、slot props 约定等)——见 plugin/README.md。
License
MIT