前言¶
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 的流程,刪除前不需要手工準備任何文件:
- 打開「設置 → 歸檔清理」,頁面按工作區分組,顯示標題、最後活動時間、佔用體積。
- 點頂部「全選」或逐行勾選,實時看到已選條數與總體積。
- 點「刪除所選」,在彈窗裏選擇是否一併深度清理,確認。
刪除不可撤銷。列表不會自動清理任何東西,只有確認後的選中項纔會被刪。
刪除範圍¶
| 項目 | 是否刪除 | 說明 |
|---|---|---|
| 會話日誌目錄 | ✅ | <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 / 幻方無官方從屬關係。