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