dsh-session-delete:從側邊欄永久刪除 DSH 會話

前言

在 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 一致)。

會拒絕刪除的情況

  1. 會話正在跑一輪對話(agent.status === 'running'):寫作句柄仍往日誌追加,需等輪次結束再刪。
  2. 會話 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。

典型用法

  1. 在 DSH 桌面殼側邊欄找到要清除的會話(含歸檔後仍佔存儲的會話,或落在「未分組」下的會話)。
  2. 右鍵該行 → 刪除會話 → 確認框點 永久刪除。
  3. 若會話正在對話中,先停止或等待當前輪結束,再重複上述步驟。
  4. 刪除成功後,客戶端會先 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 目錄頁。

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

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

小夜