前言¶
DeepSeek Harness (DSH) 采用插件化架构,扩展能力依赖社区插件。在 Web GUI 中,原生交互缺乏会话删除能力,导致用户无法妥善管理已废弃或测试用的会话,或因误操作造成数据丢失。dsh-session-cleaner 为 DSH 补上了这一原生缺失的会话删除能力,通过侧边栏原生交互提供两级可恢复删除设计,并内置重名防误删、对话预览、定期自动清空等功能,界面主题与 DSH 保持一致。
核心功能¶
- 可逆回收站:支持将会话移入回收站(物理目录移至
dsh-home/.session-cleaner-trash),可随时恢复或彻底清除。 - 重名防误删:精确提取 sessionId,不依赖标题猜测。二次确认弹窗展示同名会话摘要与首条指令对照,防止误删。
- 对话内容预览:通过 zstd 解压与 JSONL 提取,展示会话标题、轮次、用户与助手消息。自动过滤系统注入消息,确保首条用户指令为真人提示词。
- 定期自动清空:支持开启/关闭,可配置保留天数(1–3650)与检查间隔(15–1440 分钟)。回收站内展示剩余天数与过期状态。
- 主题一致:内嵌官方设计令牌(light/dark),组件使用
--dsw-alias-*语义变量,确保界面风格与 DSH 主体统一。 - 安全加固:包含 Session ID 路径穿越校验;基于
projcache的openStep/pendingCalls硬信号判定活跃会话,拒绝删除未闭合步骤。
安装与启用¶
本插件以 scoped 包 @luchenglong/dsh-session-cleaner 发布。
安装命令:
dsh plugin --profile web add @luchenglong/dsh-session-cleaner
安装后,bundle 补丁层会自动注册插件(dsh.bundle.patch → cordis.patch.yml,id: session-cleaner)。DSH 会自动热加载,刷新一次页面(F5)后,侧边栏将出现「回收站」入口与菜单项。
验证安装:
访问 GET /api/session-cleaner/sessions,返回 200 即表示插件已生效。
日常操作¶
移入回收站¶
在侧边栏任一会话上点击「⋯」菜单,选择「移入回收站」。
二次确认¶
系统会弹出确认窗口。窗口中会显示完整的 sessionId、首条用户指令。如果存在同名会话,黄色警示区会列出各自的指令进行对比,防止误删。
恢复会话¶
在侧边栏底部点击「回收站」,找到对应会话并点击「恢复」。
注意:恢复的会话需重启 DSH 后才会重新出现在侧边栏列表。
查看对话¶
在管理页(/session-cleaner)点击「💬 查看对话」,行内展开卡片查看对话内容。
彻底清除¶
在回收站内点击「彻底清除」,或通过定期自动清空功能处理。
定期清空设置¶
在管理页「回收站」区块的设置卡片中,可以配置定期自动清空功能:
- 开关:开启或关闭自动清空。
- 保留天数:会话移入回收站后,保留的天数。
- 检查间隔:系统检查并清理过期会话的时间间隔(分钟)。
配置持久化到 dsh-home/session-cleaner-settings.json。默认配置为开启、保留 30 天、每 60 分钟检查一次。管理页还提供「立即清理已过期」按钮。
HTTP API¶
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/session-cleaner/sessions |
会话列表(含 archived/subagent/visible/live 标记) |
| GET | /api/session-cleaner/trash |
回收站列表(服务端过滤 + 过期/剩余天数计算) |
| GET/POST | /api/session-cleaner/settings |
读取或保存定期清空设置 |
| POST | /api/session-cleaner/purge-expired |
立即清理已过期条目 |
| GET | /api/session-cleaner/preview?sessionId= |
对话内容预览(zstd 解压 + JSONL 提取) |
| POST | /api/session-cleaner/delete |
{ sessionId, confirm: "DELETE" } 移入回收站 |
| POST | /api/session-cleaner/restore |
{ sessionId } 恢复 |
| POST | /api/session-cleaner/purge |
{ sessionId, confirm: "PURGE" } 或 confirm: "PURGE-ALL" 彻底清除 |
| GET | /session-cleaner |
管理页(支持 #trash 锚点与对话展开) |
示例:移入回收站
$base = 'http://127.0.0.1:58644' # 请替换为实际 GUI 地址
Invoke-RestMethod "$base/api/session-cleaner/delete" -Method Post -ContentType 'application/json' `
-Body '{"sessionId":"session-xxxxxxxx","confirm":"DELETE"}'
注意事项¶
- 会话恢复:恢复的会话需重启 DSH 后才会重新出现在侧边栏列表,因为宿主 workspace registry 无外部收养 API。
- 未闭合步骤保护:有未闭合 step 的会话会被拒绝删除,防止数据截断。只有当状态落定后,才能被删除。
- 活跃会话判定:
isLive判定不能使用 SessionStore 的内存加载状态(DSH 会将打开过的会话常驻内存,导致所有空闲会话被误判为活跃)。本插件只认projcache的openStep/pendingCalls硬信号。 - 自动清空不可逆:自动清空是后台直接删除操作,一旦执行不可恢复。
- Scoped 包冲突:npm 上存在同名裸包
dsh-session-cleaner(fountunt 发布),两者功能不同。本插件为@luchenglong/dsh-session-cleaner,两者互不冲突。
结语¶
dsh-session-cleaner 提供了一套功能完整的会话回收站方案,解决了 DSH 原生删除能力的缺失问题。通过侧边栏交互、重名保护、对话预览及定期清理,帮助开发者更好地管理会话数据。