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 原生刪除能力的缺失問題。通過側邊欄交互、重名保護、對話預覽及定期清理,幫助開發者更好地管理會話數據。

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

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

小夜