前言¶
DeepSeek Harness(DSH)官方設計裏,會話可以歸檔,但沒有「從本機徹底刪除」的一等原語:SessionPersistence 沒有 delete,歸檔只是把會話藏進設置裏的「已歸檔會話」列表。磁盤上的會話日誌、投影緩存、工作臺記賬、spill 暫存和附件引用仍會留在 DSH_HOME 下。輸入框 @ 提及候選來自 live 內存 store、磁盤 sessionPersistence.list() 等並集,已歸檔但進程仍駐留的會話會繼續出現在 @ 裏,和「我以爲已經歸檔了」的直覺不一致。
下面介紹社區插件 dsh-archived-cleanup(維護者 wxy123-ctrl,分類 admin-security,MIT 許可證)。它在設置面板「已歸檔會話」頁下方增加 「歸檔會話清理」 頁,對歸檔集內的會話做批量勾選與二次確認,在文件系統與官方存儲域層按固定順序刪乾淨,並在每次刪除後自動做一次全局孤兒清掃。插件不寫持久狀態、不註冊設置命名空間;官方若將來內置會話刪除,用 plugin_manager remove_bundle 或 Plugins 頁移除即可剝離。
這是什麼¶
dsh-archived-cleanup 是 DSH 獨立 bundle 插件(當前 package 版本 0.6.2,Node >=18)。一句話定位:在合規邊界內(僅接受註冊表歸檔集內的 session id),徹底移除選中會話在本機的落盤與索引痕跡,並冪等清理懸空數據。
目錄頁:SkillHub - wxy123-ctrl/dsh-archived-cleanup
源碼與完整說明:GitHub - wxy123-ctrl/dsh-archived-cleanup
SkillHub 爲社區插件目錄,與 DeepSeek / 幻方無官方從屬關係;本插件標註爲非官方。
核心功能¶
設置頁 UI¶
宿主 index.js 負責刪除管線;瀏覽器 client.js 經 settings.section 插在官方已歸檔頁(order 25)與後續插件頁之間(order 26)。列表與官方「已歸檔會話」同源(歸檔集 ∩ 已加載 summaries),並對 live 子樹、緩存/工作臺殘留等做 status 預標註。
工具欄只有一個動作按鈕,兩種形態:
- 有勾選:徹底刪除…(紅色),二次確認後執行刪除;
- 空選集:清掃孤兒數據…(中性描邊),無歸檔會話時也可單獨執行。
自 0.3.0 起,刪除完成後總是再跑一遍全局孤兒清掃,不再需要第二個按鈕。自 0.4.0 起,「仍在使用」且無法即時卸載的拒刪會話在頁面橫幅與結果摘要中單列。自 0.5.0 起,空閒的 live 歸檔會話可在不重啓 DSH 的情況下刪除:刪除前按官方 teardown 同類步驟卸載本進程內存態(運行中回合的子樹仍須先停止)。
本地會刪什麼¶
README 中按 0.1.7-alpha.2 實測整理了落盤位置;0.2.0 起的刪除行爲如下(節選):
| 數據 | 典型位置 | 處理方式 |
|---|---|---|
| 會話日誌 | ~/.dsh/sessions/<項目>/<encodeSegment(id)>/session.vN.jsonl[.zstd] |
fs.rm 整目錄(含子代理子樹) |
| 空項目目錄 | ~/.dsh/sessions/<項目編碼目錄>/ |
日誌刪完後目錄爲空則 rmdir |
| 投影緩存 | ~/.dsh/storages/session_projcache/sessions/<id>.json |
官方 session_projcache 域 table('sessions').delete(id) |
| 註冊表歸檔集 | ~/.dsh/storages/workspace.json → global.archivedSessionIds |
官方冪等 unarchiveSession |
| 工作臺記賬 | 同上 → tables.workspaces[*].sessionIds |
對各工作臺官方冪等 detachSession(id) |
| spill 暫存 | %TEMP%\dsh-spill-*\session-<sha256(id) 前 12 位>\ |
按宿主同名公式刪除 |
| 附件對象 | ~/.dsh/attachments/v1/{objects,file-objects,files}/ |
引用感知 GC,僅刪獨佔對象 |
| 附件請求變體緩存 | ~/.dsh/cache/attachments/request-images/ |
有附件被刪則整體清空 |
本地無法刪除、文檔如實聲明的項包括:走官方 API 時的遠端會話日誌增量(dsh-session-log-deepseek)、telemetry 遠端投遞、manager.log 中的生命週期行、WebView2 Local Storage 裏的 UI 狀態快照等。
刪除後的孤兒清掃¶
孤兒清掃是冪等的:只處理已無日誌的投影緩存與工作臺記錄、死歸檔條目、別處空項目目錄等懸空數據。POST /plugins/dsh-archived-cleanup/sweep 仍可作爲腳本二次校驗入口;UI 在刪除流程裏已內聯執行。
安全邊界(摘要)¶
- 僅接受當前讀到的歸檔集內的 id,不是任意路徑刪除入口;
- 子樹整體判定:父會話及其
parentSession傳遞閉包內,若有成員agents.get(id).status === 'running',整棵子樹拒刪(status: 'busy'); - live 且空閒:在宿主內部可達點齊全且未設置
deleteLiveSessions: false時運行時卸載後刪除;否則退回「重啓 DSH 後可刪」(status: 'live'); - 附件 寧可漏刪不可誤刪:掃描失敗或讀不出日誌時保留候選附件。
未歸檔的冷會話不能在本頁直接刪,須先在官方「已歸檔會話」頁歸檔後再來清理。
HTTP 調用通道(腳本 / 高級維護)¶
靜態 bundle 無 host.call,插件借用宿主 webServer 同源 POST(信任圍欄與官方 /api 同類):
POST /plugins/dsh-archived-cleanup/status
Content-Type: application/json
{"ids": ["<session-id>", "..."]}
POST /plugins/dsh-archived-cleanup/delete
Content-Type: application/json
{"ids": ["<session-id>"]}
ids 可爲空數組,表示僅執行孤兒清掃。響應在刪除結果之外附帶 sweep 字段。
自 0.6.0 起有一次性維護入口(破壞性,不進 UI,須顯式確認串):
POST /plugins/dsh-archived-cleanup/purge-all
Content-Type: application/json
{"confirm": "purge-all-except-live", "keepIds": []}
行爲:除 live 會話子樹(及可選 keepIds)外,先官方 archiveSession 再整批走 delete 管線;候選來自磁盤、工作臺記賬、projcache 與歸檔集的並集。
安裝與啓用¶
插件通過官方 bundle 機制掛載:package.json 聲明 dsh.bundle.patch 指向 cordis.patch.yml,無需手工 junction 或編輯 profile 裏的全局 cordis.patch.yml。啓停後 web 模板 patchReload: live,瀏覽器半邊可隨 HMR 熱更新。
先將 wxy123-ctrl/dsh-archived-cleanup 源碼放到本機某一目錄,再執行(路徑換成你的絕對路徑):
plugin_manager install_bundle target=<本倉庫絕對路徑>
也可在 DSH Web 側 Plugins 頁安裝並啓用。卸載:
plugin_manager remove_bundle target=dsh-archived-cleanup
驗收時可檢查配置是否注入插件行:
dsh web --dump-config | findstr archived-cleanup
可選配置(默認一般不用)在 profile 的 cordis.patch.yml 裏按插件 id 覆蓋,例如關閉 live 即時刪除或附件 GC:
- id: archived-cleanup
name: dsh-archived-cleanup
config:
purgeAttachments: false
deleteLiveSessions: false
完整字段見 README(sessionsRoot、attachmentsRoot、spillRoots 等用於非默認佈局)。
典型用法¶
在設置頁清理歸檔會話¶
- 打開 DSH 設置,進入 歸檔會話清理(在「已歸檔會話」下方)。
- 勾選要永久刪除的已歸檔會話;若行上標註「正在運行」,須先停止再刪。
- 點擊 徹底刪除…,在宿主原生 Modal 中確認(非瀏覽器
alert)。 - 查看結果摘要:各類刪除計數、warnings,以及內聯孤兒清掃行;仍在使用且拒刪的 live 會話在 0.4.0 起會單獨列出。
刪除成功後,官方已歸檔頁、側欄與本頁對應行應一起消失;@ 列表對已成功刪除的 id 會即時收斂(0.5.0 起 live 空閒會話無需重啓)。
只清掃孤兒數據¶
不勾選任何會話(或歸檔集爲空),點擊 清掃孤兒數據… 並確認。用於清理歷史遺留的無日誌 projcache、懸空工作臺記賬、死歸檔條目、空項目目錄等;狀態正常時二次執行計數應全爲 0。
本地自測(維護者提供)¶
在插件目錄執行:
node selftest.mjs
README 說明該腳本覆蓋 encodeSegment、子樹閉包、live 三分區、附件 GC、purge-all 確認門等 46 項檢查(含臨時目錄端到端)。
適用場景與注意¶
適合誰
- 需要在本機清掉已歸檔會話的日誌、緩存、spill 與獨佔附件,降低磁盤佔用與隱私殘留;
- 歸檔很多實驗會話後,希望
@列表與側欄不再被「已歸檔但仍 live」的 id 干擾(在 0.5.0 能力可用時); - 願意在理解邊界的前提下,用
purge-all做一次性歷史清場(須自行承擔數據不可恢復風險)。
務必注意
- 插件以當前 DSH 進程權限讀寫
DSH_HOME與臨時目錄;安裝前請閱讀源碼與 MIT 許可證,確認信任維護者 wxy123-ctrl。 - 刪除不可通過官方 UI 撤銷;共享附件會被保留,獨佔附件會被 GC。
- 插件不能代替你清理遠端 API 日誌或 telemetry;Windows 下若持久化寫句柄未成功
close(),日誌目錄可能因文件鎖刪除失敗,結果中會體現爲單根錯誤,可重跑冪等收斂。 - SkillHub 目錄頁可提供「發送給 DeepSeek Harness 安裝」的自然語言提示;具體仍以 README 的
plugin_manager install_bundle與 Plugins 頁爲準。
結尾¶
DSH 生態強調「一切皆插件」:dsh-archived-cleanup 在官方「只歸檔不刪除」的產品決策下,補了一條可審計、有邊界的本機清理路徑——設置頁可視化操作,必要時用同源 HTTP 或 purge-all 做維護。若你只需要偶爾刪幾個冷歸檔會話,用勾選 + 確認即可;刪除後自帶的孤兒清掃減少手工掃盤。
- 目錄頁:https://www.skillhub.cn/plugins/wxy123-ctrl/dsh-archived-cleanup
- GitHub:https://github.com/wxy123-ctrl/dsh-archived-cleanup