dsh-session-delete:爲 DSH 會話側欄補上真正的刪除

前言

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)。

典型用法

  1. 安裝 bundle 並啓動(或重啓)Harness,確保 Host 插件已加載。
  2. 在側欄找到要清理的 Session;若本會話中曾打開過它,先完全退出 Harness 再啓動,且 不要 先點開該 Session。
  3. 點擊該行「…」→ 刪除會話 → 在 overlay 確認。
  4. 若返回 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 即可。

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

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

小夜