dsh-archived-purge:把歸檔會話連同本地文件一次清掉

前言

DSH 自帶的「歸檔」只是把會話從側邊欄隱藏:會話日誌目錄、session_projcache 裏的投影緩存行、工作區記賬和歸檔標記都還留在磁盤上,而且沒有批量刪除入口。想回收空間,只能逐個會話找路徑手動刪。

下面介紹的插件 dsh-archived-purge(維護者 5D-artist,分類 admin-security,許可證 MIT,當前版本 1.1.0)在「設置 → 歸檔清理」裏補上一頁:按工作區分組列出全部歸檔會話,支持全選和逐條勾選,確認後一次刪掉所選會話及其本地存儲。它只做刪除,不改變歸檔行爲本身。

安裝

官方安裝命令如下,直接執行即可:

dsh plugin --profile desktop add github:5D-artist/dsh-archived-purge

Desktop 也可以在「設置 → 插件 → 添加插件」裏填倉庫地址:

https://github.com/5D-artist/dsh-archived-purge

裝好後刷新頁面(Host 端通常已熱加載,瀏覽器端 bundle 需要重新加載)。

使用步驟

按 README 的流程,刪除前不需要手工準備任何文件:

  1. 打開「設置 → 歸檔清理」,頁面按工作區分組,顯示標題、最後活動時間、佔用體積。
  2. 點頂部「全選」或逐行勾選,實時看到已選條數與總體積。
  3. 點「刪除所選」,在彈窗裏選擇是否一併深度清理,確認。

刪除不可撤銷。列表不會自動清理任何東西,只有確認後的選中項纔會被刪。

刪除範圍

項目 是否刪除 說明
會話日誌目錄 ✅ <DSH_HOME>/sessions/--<cwd>--/<session-id>/
投影緩存行 ✅ <DSH_HOME>/storages/session_projcache/sessions/<session-id>.json
工作區記賬 ✅ 公開 API Workspace.detachSession
全局歸檔集合 ✅ workspaceRegistry.unarchiveSession
subagent 子會話日誌 ✅ 僅 origin: 'subagent' 的後代
附件 attachments/v1/objects/ ⚙️ 可選 只在沒有剩餘日誌引用時刪除
請求圖縮放緩存 ⚙️ 可選 cache/attachments/request-images/,可重建
該批會話寫出的工作區文件 ⚙️ 手動勾選 只認 write / edit / present 的路徑
fork 出來的普通會話 ❌ 只按 subagent 血緣級聯

深度清理與孤兒附件

深度清理是 1.1.0 新增的可選步驟。刪除對話框裏可以勾選「無人引用的附件」和「請求圖縮放緩存」,並逐項勾選該批會話寫出的工作區文件。附件存儲是內容尋址且不可變的,插件按「先讀後刪」實現:先讀完所有剩餘日誌收集 sha256 摘要,再刪對象;刪單個會話後它獨佔的對象自然成爲孤兒。三條規則是讀不全就不刪、10 分鐘內的新對象保留、絕不碰日誌之外的索引文件。

工作區文件同理:只列日誌裏 write / edit / present 的顯式目標,必須位於會話 cwd 內,且排除 DSH_HOME、插件自身目錄、.git / node_modules,服務端重新掃描覈對,默認不勾選。

另有一個獨立入口「清理孤兒附件」:不刪會話也能執行,先 dry-run 報數字,再確認執行。

安全護欄與失敗反饋

  • 運行中拒絕:用 Host 的 workspace/session-activity 瀑布判定,而不是「在內存裏就算運行中」。歸檔只是隱藏會話,最近用過的歸檔會話仍駐留在 ctx.sessions 裏。
  • 整批前置檢查:任一目標(含 subagent 後代)仍在運行就整批不刪,並說明是哪一類工作(對話 / 任務 / 子代理 / 定時任務)。
  • 駐留會話的記賬延後回收:文件可以立刻刪,但內存中的會話不能立刻從工作區記賬裏摘掉,否則會掉進側邊欄「未分組」;記賬與歸檔標記保留到下次啓動,由 finalizePending() 收尾,頁面只提示「另有 N 個已刪除會話的記賬將在下次啓動時自動回收」。
  • 入口與路徑校驗:sessionId 必須匹配 ^[A-Za-z0-9][A-Za-z0-9_-]{0,199}$,POST 校驗同源,待刪路徑必須落在 sessions/ 或投影緩存根內。
  • 不重寫註冊表:歸檔集合與工作區記賬都通過公開 service 方法修改。
  • 失敗可讀:被拒絕或失敗時逐條列出會話與原因,不再只彈一句 HTTP 400。

刪除接口的狀態碼約定:400 只用於非法 JSON,403 只用於跨源,405 / 415 用於方法與 Content-Type;「沒刪成」屬於業務結果,用 200 + ok: false + message 表達。

Host 路由

方法 路徑 說明
GET /plugins/archived-purge/state 歸檔列表(標題、工作區、體積、最後活動、active / activity / resident)
POST /plugins/archived-purge/delete 刪除選中會話,可選深度清理
POST /plugins/archived-purge/scan 只讀預演:釋放多少附件、緩存多大、產出物清單
POST /plugins/archived-purge/gc 孤兒附件清掃,dryRun: false 才真刪
POST /plugins/archived-purge/client-error 客戶端掛載失敗上報

兼容性與已知限制

實測環境:DSH 0.2.1-rc.5(Desktop,Windows)。需要 Host 服務 webServer、workspaceRegistry、sessions、sessionPersistence;存儲佈局對應 0.2.x 的 v4 會話日誌、workspace.json schema v2、session_projcache 單記錄文件、attachments/v1/objects。僅 Web 客戶端(dsh.client.platform = web)。

已知限制:

  • 只能刪除歸檔集合中的會話,活動會話需先歸檔。
  • 附件 GC 是全量掃描,會話越多、日誌越大耗時越長。
  • 10 分鐘寬限期內的附件對象不會被回收。
  • 駐留會話的記賬在下一次啓動時回收(DSH 沒有讓第三方插件把會話逐出 ctx.sessions 的公開接口)。
  • 工作區產出物只認 write / edit / present 的顯式路徑,pwsh / ffmpeg 等命令產出的文件不在清單裏。
  • 歸檔時間不是持久字段,列表用最後活動時間排序。

適用場景與注意

適合長期積累會話、磁盤被歸檔日誌佔滿、需要批量回收的開發者。插件會真實刪除本地文件,運行時以當前 DSH 進程的權限執行,安裝前應檢查源碼與許可證(MIT),並確認目標 DSH 版本滿足 engines.dsh(>=0.2.1-rc.0)。

源碼與維護說明在 https://github.com/5D-artist/dsh-archived-purge;社區目錄頁在 https://www.skillhub.cn/plugins/5D-artist/dsh-archived-purge。該目錄是獨立站點,與 DeepSeek / 幻方無官方從屬關係。

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

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

小夜