dsh-archived-cleanup:批量徹底刪除已歸檔會話的本地痕跡

前言

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 預標註。

工具欄只有一個動作按鈕,兩種形態:

  1. 有勾選:徹底刪除…(紅色),二次確認後執行刪除;
  2. 空選集:清掃孤兒數據…(中性描邊),無歸檔會話時也可單獨執行。

自 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 在刪除流程裏已內聯執行。

安全邊界(摘要)

  1. 僅接受當前讀到的歸檔集內的 id,不是任意路徑刪除入口;
  2. 子樹整體判定:父會話及其 parentSession 傳遞閉包內,若有成員 agents.get(id).status === 'running',整棵子樹拒刪(status: 'busy');
  3. live 且空閒:在宿主內部可達點齊全且未設置 deleteLiveSessions: false 時運行時卸載後刪除;否則退回「重啓 DSH 後可刪」(status: 'live');
  4. 附件 寧可漏刪不可誤刪:掃描失敗或讀不出日誌時保留候選附件。

未歸檔的冷會話不能在本頁直接刪,須先在官方「已歸檔會話」頁歸檔後再來清理。

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 等用於非默認佈局)。

典型用法

在設置頁清理歸檔會話

  1. 打開 DSH 設置,進入 歸檔會話清理(在「已歸檔會話」下方)。
  2. 勾選要永久刪除的已歸檔會話;若行上標註「正在運行」,須先停止再刪。
  3. 點擊 徹底刪除…,在宿主原生 Modal 中確認(非瀏覽器 alert)。
  4. 查看結果摘要:各類刪除計數、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 做一次性歷史清場(須自行承擔數據不可恢復風險)。

務必注意

  1. 插件以當前 DSH 進程權限讀寫 DSH_HOME 與臨時目錄;安裝前請閱讀源碼與 MIT 許可證,確認信任維護者 wxy123-ctrl。
  2. 刪除不可通過官方 UI 撤銷;共享附件會被保留,獨佔附件會被 GC。
  3. 插件不能代替你清理遠端 API 日誌或 telemetry;Windows 下若持久化寫句柄未成功 close(),日誌目錄可能因文件鎖刪除失敗,結果中會體現爲單根錯誤,可重跑冪等收斂。
  4. 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
羽毛球分组比赛记分
小程序二维码

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

小夜