前言¶
在 DeepSeek Harness(DSH)裏,側邊欄的會話列表會隨使用變長。原廠對會話的處理是「可以歸檔,但不提供刪除」——歸檔只是把行藏起來,<DSH home>/sessions/ 下的日誌目錄、投影緩存、各工作區 workspace.json 裏的 sessionIds 以及全局歸檔/置頂列表都還在。對需要徹底清掉試驗性會話、錯開項目或隱私敏感記錄的智能體開發者來說,只歸檔無法達到「磁盤上也不留痕」的目的。dsh-session-delete 在會話行的右鍵菜單裏補上 刪除會話,經確認後做永久性清理,並同步摘掉運行時內存裏的會話條目,避免只剩列表裏的「幽靈會話」。
這是什麼¶
dsh-session-delete 是社區維護的 DSH 客戶端插件(維護者:MrKillerBad,倉庫 MrKillerBad/dsh-session-delete)。一句話定位:在側邊欄會話的上下文菜單中增加「永久刪除」動作。當前 package 版本爲 1.1.0,許可證 MIT。插件通過 Cordis patch 同時加載 Host 半(index.js)與瀏覽半(client.js),依賴原廠會話控制器、工作區與上下文菜單等模塊注入。
核心功能¶
菜單與交互¶
在側邊欄任意會話行上右鍵,選擇 刪除會話;在確認框中點 永久刪除。菜單項排在「歸檔會話」之後,帶分隔線,並使用危險色提示。刪除工作區本身仍使用原廠「刪除工作區」(右鍵工作區行),不在本插件範圍內。
一次刪除會清理的內容¶
| 目標 | 位置 |
|---|---|
| 會話日誌目錄 | <DSH home>/sessions/<project key>/<session id>/ |
| 投影緩存縮略圖 | <DSH home>/storages/session_projcache/sessions/<session id>.json |
| 工作區記錄裏的 id | 各 workspace.json 的 sessionIds |
| 歸檔 / 置頂列表 | global.archivedSessionIds、global.pinnedSessionIds |
| 運行時寄存 | Host 的 sessions store 與 agents store |
工作區目錄及其中的文件不會被刪除。「未分組」是 UI 渲染時的僞分組,沒有單獨可刪對象;要清空它,需在「未分組」下逐個刪除會話,本插件對這些會話同樣有效。
爲何必須動運行時 store¶
會話一旦被側邊欄打開過,dsh-api-session-controller 會 resume 進內存,sessionQuery.listSessions() 會把 ctx.sessions.list() 裏的活會話無條件並進列表。若只刪磁盤文件,會出現「磁盤上沒有、側邊欄還在」的幽靈會話,再刪會報「找不到該會話的存儲記錄」。因此刪除前須先調用 detachEntered,從兩個 store 摘掉條目,順序爲先 Agent 後 Session(與 dsh-agent-loop 的 teardown 一致)。
會拒絕刪除的情況¶
- 會話正在跑一輪對話(
agent.status === 'running'):寫作句柄仍往日誌追加,需等輪次結束再刪。 - 會話 id 對應目錄名不符合
session-<uuid>/<uuid>形狀:直接中止,不做路徑猜測。
「僅被側邊欄打開過一次、輪次之間寫作句柄已關閉」不算運行中,可以正常刪除。
安裝與啓用¶
README 給出的安裝示例是在當前 profile(desktop)中以本地目錄軟鏈方式安裝 bundle(路徑需換成你本機上的插件目錄):
plugin_manager install_bundle target = D:\B\DeepSeekWork\deepseek-all\dsh-session-delete
修改 Host 半 index.js 後須重啓 Host:通過 plugin_manager set_plugin,target 使用 loader entryId include:session-delete,先設 enabled:false 再 enabled:true。僅改 client.js 時刷新頁面即可。
社區目錄頁:skillhub.cn/plugins/MrKillerBad/dsh-session-delete。DSH 生態主張「一切皆插件」;該目錄爲獨立社區站點,與 DeepSeek / 幻方無官方從屬關係。安裝前請自行查看倉庫源碼與 MIT 許可證;插件以當前 DSH 進程權限讀寫本機路徑與調用 Host API。
典型用法¶
- 在 DSH 桌面殼側邊欄找到要清除的會話(含歸檔後仍佔存儲的會話,或落在「未分組」下的會話)。
- 右鍵該行 → 刪除會話 → 確認框點 永久刪除。
- 若會話正在對話中,先停止或等待當前輪結束,再重複上述步驟。
- 刪除成功後,客戶端會先
handleSessionRemoved摘掉該行,再refresh()與服務端對賬。
實現要點(供排查問題)¶
- Host 半經
webServer前綴路由/session-delete/api暴露刪除;會話目錄路徑來自sessionPersistence.stat()的location.path上溯兩級,而非按cwd猜測。 - 瀏覽半通過
contextMenus貢獻target: "session"、order: 700的菜單項,確認框掛在shell.overlay。 - 因原廠
connection.requestRejection()對dsh-app://app/界面不放行同源 POST,本插件用請求頭x-dsh-session-delete: 1作圍欄;該路由不返回 CORS 授權,跨站 preflight 會被拒絕。
結尾¶
dsh-session-delete 補齊的是 DSH 會話生命週期裏缺失的「真刪除」:菜單操作與原廠歸檔並列,背後同步清理磁盤、工作區索引與內存 store。適合需要主動管理本地會話殘留的智能體開發者。詳情與 issue 見 GitHub 倉庫,分類與介紹見 SkillHub 目錄頁。