dsh-session-purge:歸檔會話真刪與附件 blob 回收

前言

在 DSH(DeepSeek Harness)里長期使用後,歸檔列表裏往往會堆積大量歷史會話。官方歸檔通常只把會話移出工作區視圖,轉錄目錄、投影緩存和磁盤上的附件引用未必一併清掉;若手動刪目錄,又容易漏掉 workspace.json 裏的歸屬記錄,或與仍在運行的會話、共享附件發生衝突。

下面介紹的 dsh-session-purge 是社區插件(維護者 w1w218,分類 admin-security),在 DSH 設置裏增加「會話清理」頁,通過官方 registry API 做記賬,再刪除歸檔會話並可選回收不再被任何會話引用的附件 blob。針對的是 DSH 0.2.2-rc.1 的公開 Service 契約;不替換官方 workspace 行、不讀取宿主私有成員。

這是什麼

一句話:DSH Web 插件,入口爲設置面板 → 左側導航「會話清理」(見倉庫 assets/session-purge.png)。

  • 倉庫:https://github.com/w1w218/dsh-session-purge
  • 社區目錄:https://www.skillhub.cn/plugins/w1w218/dsh-session-purge
  • 許可證:MIT(package.json 版本 0.1.0)

核心功能

列表與刪除流水線

插件能列出歸檔集合裏的會話,展示標題、ID、轉錄大小、附件引用數、是否運行中、是否有 subagent 子會話。勾選目標後一次性執行:

  1. 從所有工作區成員表移除(Workspace.detachSession,持久化)。
  2. 從歸檔集合移除(workspaceRegistry.unarchiveSession,持久化)。
  3. 刪除會話轉錄目錄(整目錄,含舊代際日誌)。
  4. 刪除 storages/session_projcache/sessions/<id>.json 投影緩存。

刪除前自動備份 storages/workspace.json;備份失敗則整批不執行。成功後通過 api-session/removed 通知已連接頁面,側邊欄對應行可即時消失。

可選回收(默認全開)

  • 連帶刪除選中會話的 subagent 子會話(遞歸)。
  • 回收獨佔附件:僅被待刪會話引用、且無倖存會話引用的對象。
  • 回收孤兒附件:磁盤存在但已無任何會話引用(含歷史遺留)。
  • 清空 cache/attachments/request-images 派生圖緩存(會按需重建)。

引用掃描讀取磁盤上全部會話轉錄(含未歸檔、子會話、多代際日誌),用 sha256:<64hex> 匹配附件 id;只有不在「倖存引用」並集裏的對象纔會被回收。

安全與邊界

  • 不退出 DSH,歸檔/歸屬變更走官方 registry API;只處理歸檔會話(id 必須在歸檔集合中,級聯子會話除外)。
  • 運行中會話拒絕刪除(ctx.agents.get(id)?.status === 'running');idle 的已加載會話會先 sessions.flush() 再刪。
  • fail-closed:任一倖存會話日誌無法解碼則整次中止,不刪文件。
  • 待刪路徑須嚴格位於 sessions/、attachments/v1/、session_projcache/sessions/、cache/ 等預期根下;HTTP 接口複用 connection.admit() 的 Host/Origin 與 cookie 認證,僅 POST + JSON。
  • 不清理 dsh-spill-* 臨時目錄;DSH home 取 $DSH_HOME,否則 ~/.dsh。

附件引用基於日誌文本匹配,偏保守(工具參數裏的 sha256:... 也算引用)。標題取自最後一條 session/title 事件,無標題則顯示會話 ID。

安裝與啓用

需要已安裝 DSH(Desktop 或 Web profile 均可)。安裝後需重啓一次 DSH,設置裏纔會出現「會話清理」。

資料中的安裝方式爲本地 bundle(非憑名稱拼接的遠程 add 命令):

git clone https://github.com/w1w218/dsh-session-purge.git
cd dsh-session-purge
dsh plugin --profile <profile> add .

將 <profile> 換成你的 profile 名(Desktop 默認 desktop,Web 默認 web)。也可在 DSH 插件管理器中選擇「安裝本地 bundle」,指向克隆後的目錄。

卸載:

dsh plugin --profile <profile> remove dsh-session-purge

package.json 標明客戶端注入 @deepseek-ai/dsh-client-ui-settings,platform: web,immediately: true。

典型用法

  1. 重啓 DSH 後打開設置,在左側進入「會話清理」。
  2. 在列表中查看歸檔會話的引用與運行狀態,勾選需要徹底移除的項。
  3. 按需保留或關閉可選回收項(獨佔/孤兒附件、subagent、request-images 緩存等,默認全開)。
  4. 確認執行;若備份失敗或存在運行中會話、非歸檔 id,操作會被拒絕或中止。
  5. 其他已打開頁面依靠 api-session/removed 更新;設置頁列表在刪除後會重新掃描。

維護者在倉庫提供自測:

node test/self-test.mjs

覆蓋掃描、獨佔與孤兒識別、備份、運行中拒絕、損壞倖存日誌中止等場景。也可用 npm test(腳本同命令)。

適用場景與注意

適合誰:需要定期壓縮 DSH 磁盤佔用、且願意只清理已歸檔會話的管理員或長期單機/Web 部署的開發者。

權限與信任:插件以當前 DSH 進程權限讀寫 home 目錄下的 storages、sessions、attachments 等;安裝前應閱讀源碼與 MIT 許可,確認與自有備份策略一致。社區目錄站點(如 SkillHub)與 DeepSeek / 幻方無官方從屬關係,屬於「一切皆插件」生態中的第三方條目。

與「只歸檔」的區別:本插件做的是 registry 記賬 + 文件刪除 + 可選 blob 回收,不是替代官方歸檔按鈕;共享仍被其他會話引用的附件會被保留。

結尾

dsh-session-purge 把「歸檔」從視圖層推進到可審計的真刪流程:先備份 workspace、再走官方 API、再刪轉錄與緩存,並在保守引用掃描下回收獨佔與孤兒附件。若你要在 DSH 裏做會話維度的空間治理,可從社區目錄或 GitHub 獲取倉庫,按上述 profile 安裝並重啓後使用設置中的「會話清理」頁。

  • 目錄頁:https://www.skillhub.cn/plugins/w1w218/dsh-session-purge
  • GitHub:https://github.com/w1w218/dsh-session-purge
羽毛球分组比赛记分
小程序二维码

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

小夜