前言¶
DeepSeek Harness(DSH)裏,會話可以歸檔,但產品層面不提供「刪除會話」。dsh-client-ui-workspace 寫明「沒有 Session 刪除」——會話只能歸檔、不能刪除;dsh-session-persistence-jsonl 在存儲層同樣說明「不刪除會話文件」,日誌在 root 下累積,直到外部移除,且 seam 沒有刪除 API。歸檔只是在 $DSH_HOME/storages/workspace.json 的 archivedSessionIds 裏記錄 id,磁盤上的會話日誌、投影緩存和附件都還在。
若你本地試會話、分叉或子智能體跑多了,$DSH_HOME/sessions 會持續變大,僅靠歸檔無法清掉數據。社區插件 dsh-session-delete(維護者 LilJoeIJOYU,分類:客戶端)把文檔裏說的「唯一可行的外部移除」做成 Session 側欄「…」菜單裏的一行操作,經確認後刪除存儲日誌、投影緩存,並默認級聯子 agent 會話相關文件。
這是什麼¶
dsh-session-delete 是 DSH 的 bundle 插件:Host 側提供 sessionJanitor/deleteSession 遠程調用,集中實現刪除規則;Client 側在會話行菜單增加 destructive 風格的「刪除會話」項,並在 shell.overlay 裏彈出確認框。刪除成功後從歸檔、置頂集合裏去掉 id,併發出 api-session/removed,已連接的 Client 會立刻去掉側欄行。
倉庫:https://github.com/LilJoeIJOYU/dsh-session-delete
目錄頁:https://www.skillhub.cn/plugins/LilJoeIJOYU/dsh-session-delete
核心功能¶
側欄與交互¶
- 在 Session「…」菜單增加一行(擴展點
sidebar.workspaces.session.menu.item,order: 500,排在內置的重命名 / 分叉 / 置頂 / 歸檔等項之後,上方有分組細線,使用 host 的危險行配色)。 - 點擊後走確認對話框;菜單收起後仍由 overlay 承載確認邏輯。
- 菜單隻負責調用 Host Remote,不重複實現刪除策略。
刪除會移除什麼¶
對目標 Session,以及默認其下所有 subagent Session,插件會嘗試刪除:
| 路徑 | 含義 |
|---|---|
$DSH_HOME/sessions/<project-key>/<session-id>/ |
存儲日誌(如 session.v4.jsonl.zstd) |
$DSH_HOME/sessions/<project-key>/<session-id>.jsonl[.zstd] |
舊版扁平佈局 sibling |
$DSH_HOME/sessions/<session-id>.jsonl[.zstd] |
舊版扁平 root 佈局 |
$DSH_HOME/storages/session_projcache/sessions/<session-id>.json |
投影 checkpoint |
隨後從 archive、pin 集合中移除該 id,並廣播 removed 事件。
刻意不刪的內容:
$DSH_HOME/attachments與$DSH_HOME/cache/attachments下按內容尋址的附件(多 Session 共享 hash,刪一個可能傷及其他會話)。- Session 搜索索引(每次讀會與
sessionPersistence.list()對齊,日誌沒了會自動掉出索引)。 workspaces[].sessionIds註冊表項(無 removal API;側欄由 Session 摘要驅動,無效 id 不會顯示行)。
失敗與拒絕(reason)¶
deleteSession 返回結果對象,不拋異常;常見 reason:
reason |
含義 |
|---|---|
invalid-id |
不是合法 Session id |
active |
當前 Harness 進程裏仍有 Agent 佔用該會話日誌(見下文) |
unknown |
磁盤上找不到該 id 的存儲 |
partial |
部分路徑刪除失敗(鎖或權限);failed 列出殘留路徑 |
partial 時側欄仍會退役該行,對話框會展示未刪乾淨的路徑。
爲何「已打開過的會話」刪不掉¶
只要本進程裏 Agent 仍綁定該 Session(例如打開或查看歷史時 controller 會 resume Agent),日誌 writer 仍活躍,刪文件會被後續 append 寫回或導致 flush 報錯。因此拒絕條件看 Agent 是否 live,不是看是否歸檔或是否當前選中。實踐上:本次運行從未打開過的 Session 可立即刪;打開過的需 重啓 Harness 後、再次打開該 Session 之前 執行刪除。歸檔不會卸載 Agent,切換到別的 Session 也不會。
安裝與啓用¶
在當前 profile 以 bundle 安裝;不要手改 profile 的 package.json,也不要在 profile 目錄裏自行跑 pnpm。可讓 Agent 調用 plugin_manager,或自行執行:
plugin_manager action=install_bundle target=https://github.com/LilJoeIJOYU/dsh-session-delete
若使用本地 checkout,把 target 換成該目錄的絕對路徑:
plugin_manager action=install_bundle target=<absolute path to this checkout>
Host 側模塊(index.js、purge.js、remote.js、typert.host.js 等)在進程內已 import 後無法熱替換;改 Host 代碼需 下次啓動 Harness 才生效。Client 半在安裝 bundle 後可無需重啓加載。
插件以當前 DSH 進程權限操作 $DSH_HOME 下的文件;安裝前建議閱讀倉庫源碼與 MIT 許可證(package 版本 0.1.0,Node >=22)。
典型用法¶
- 安裝 bundle 並啓動(或重啓)Harness,確保 Host 插件已加載。
- 在側欄找到要清理的 Session;若本會話中曾打開過它,先完全退出 Harness 再啓動,且 不要 先點開該 Session。
- 點擊該行「…」→ 刪除會話 → 在 overlay 確認。
- 若返回
partial,按對話框提示檢查failed路徑(權限、文件鎖等)。
倉庫內自測(使用臨時 Harness home,不碰真實數據):
node --test "test/*.test.mjs"
適用場景與注意¶
適合: 需要真正釋放磁盤、而不只是歸檔 id 的開發者;清理試跑會話、大量分叉或 subagent 樹;與 DSH「日誌只增、seam 無刪 API」模型對齊的本地維護。
注意:
- 刪除不可通過 DSH 內置能力恢復;確認框是最後一道閘。
- 當前 Client 仍「開着」的 Session 無法刪除;Harness 沒有單獨 dispose 一個 Session Agent 的 API。
- 級聯 subagent 依賴父日誌裏的
ctx.subagents.listDescendants;父日誌損壞時可能留下孤兒 Session 目錄。 - SkillHub 等社區目錄獨立於 DeepSeek / 幻方,並非官方應用商店;插件來源與行爲以 GitHub README 與源碼爲準。
結尾¶
dsh-session-delete 補的是 DSH 刻意留空的能力:在側欄用一次確認,把會話日誌、投影緩存和(默認)子 agent 日誌從磁盤清掉,並讓 UI 同步退役。歸檔仍適合「藏起來」;要「刪掉」,用這個客戶端 bundle 即可。