dsh-session-cleaner:DSH 会话回收站与清理管理器

前言

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"}'

注意事项

  1. 会话恢复:恢复的会话需重启 DSH 后才会重新出现在侧边栏列表,因为宿主 workspace registry 无外部收养 API。
  2. 未闭合步骤保护:有未闭合 step 的会话会被拒绝删除,防止数据截断。只有当状态落定后,才能被删除。
  3. 活跃会话判定:isLive 判定不能使用 SessionStore 的内存加载状态(DSH 会将打开过的会话常驻内存,导致所有空闲会话被误判为活跃)。本插件只认 projcache 的 openStep/pendingCalls 硬信号。
  4. 自动清空不可逆:自动清空是后台直接删除操作,一旦执行不可恢复。
  5. Scoped 包冲突:npm 上存在同名裸包 dsh-session-cleaner(fountunt 发布),两者功能不同。本插件为 @luchenglong/dsh-session-cleaner,两者互不冲突。

结语

dsh-session-cleaner 提供了一套功能完整的会话回收站方案,解决了 DSH 原生删除能力的缺失问题。通过侧边栏交互、重名保护、对话预览及定期清理,帮助开发者更好地管理会话数据。

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

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

小夜