dsh-session-admin:已歸檔會話的批量取消歸檔與安全刪除

前言

DeepSeek Harness(DSH)對工作區會話提供歸檔與取消歸檔,但沒有公開的「永久刪除會話」接口。長期使用後,$DSH_HOME/sessions 下會積累大量已歸檔會話及其日誌、投影緩存和附件對象;若只靠手動取消歸檔,仍無法從磁盤上徹底清理。社區插件 dsh-session-admin(維護者 z1lyA,分類 admin-security)在 Web 界面增加「已歸檔」管理頁,列出全部已歸檔會話,支持批量取消歸檔(走官方 workspaces.unarchiveSession)和帶邊界規則的批量刪除,並在可選步驟中掃描附件引用,只刪除無剩餘引用的內容尋址對象。

這是什麼

dsh-session-admin 是 DSH 的 Host + Web Client 插件:Host 側提供 HTTP 路由與啓動時待刪除隊列清掃;Client 側在左側欄「全局面板」區(與 Plugins、Schedules 同一列,位於工作區列表上方)增加 已歸檔 入口,點擊後在中央區打開管理頁。插件補上 DSH 原生缺失的刪除能力,並把「會話仍在 Host 內存裏」等情況做成顯式規則,避免在活 Agent 句柄下刪日誌導致無頭日誌或緩存回寫。

入口未放在原生工作區標題欄或 sidebar.workspaces:前者是封閉 JSX、無插件擴展點,後者爲已被佔用的 single 槽。本插件使用受支持的 sidebar.panellist + main keyed 頁面。

核心功能

管理頁對已歸檔會話展示標題、工作區、最後活躍時間、磁盤佔用,並支持全選、半選、單選。

批量取消歸檔 調用 DSH 官方 workspaces.unarchiveSession。若在待刪除隊列中的會話被取消歸檔(本頁、原生側欄或另一標籤頁),Host 監聽 workspace 域變更後會清除對應隊列條目;重新歸檔不會恢復之前的刪除意圖。

批量刪除 採用混合策略:

  • 會話不在 Host 內存裏:確認後立即執行完整刪除流程。
  • 會話仍在 Host 內存裏(歸檔後 Agent 句柄仍駐留,DSH 無公開「關閉會話」接口):確認後僅登記爲 待刪除,不立刻動文件;下次啓動 DSH、Agent 存儲爲空時自動執行刪除。行內顯示「待刪除」,可隨時取消(工具欄批量或行內);隊列保存在 $DSH_HOME/session-admin/pending-deletions.json(原子寫、最多 500 條,單實例前提)。

實際刪除時(含 origin: subagent 派生子會話)會校驗會話仍屬歸檔集合且當前無 live agent/子代理,然後依次:刪除 $DSH_HOME/sessions/<cwd 編碼>/<sessionId 編碼>/ 整目錄;刪除投影緩存 $DSH_HOME/storages/session_projcache/sessions/<sessionId>.json;刪除綁定定時任務;best-effort 從工作區 detach、取消置頂、移除歸檔墓碑。可選步驟(默認開啓,可在配置與對話框中控制):掃描事件與 $DSH_HOME/llm-deepseek/files-v3.json 上傳索引,僅刪除無任何剩餘引用的 attachments/v1 下對象;掃描不完整時 一個附件都不刪 並在結果中報告原因。

安全規則(摘自 README):只接受 workspaceRegistry.archivedSessionIds 中的 id;session id 格式與路徑包含性校驗;每批最多 100 個 id、串行執行、同一時間只跑一個刪除任務;HTTP 路由僅對本機迴環 Host 開放,併疊加同源 / Sec-Fetch-Site 與 ctx.connection.requestRejection。

插件 不 註冊 agent 工具:DSH 的 agent 工具按 preset 組合,web bundle 層註冊的工具不會進入會話工具作用域;永久刪除僅由用戶在頁面上操作。

安裝與啓用

從 GitHub 安裝(資料註明需要 Full access):

dsh plugin --profile desktop add github:z1lyA/dsh-session-admin

本地目錄安裝(開發調試示例,路徑按你的環境替換):

plugin_manager({ action: "install_bundle", target: "H:\\CodeProject\\dsh-session-admin" })

安裝後刷新一次 Web 頁面(Client 插件清單在啓動時收集);Host 代碼變更需重啓 DSH。

卸載(不會恢復已刪除的會話):

plugin_manager({ action: "remove_bundle", target: "dsh-session-admin" })

典型用法

  1. 安裝並刷新 Web 頁面(必要時重啓 DSH)。
  2. 在左側欄全局面板區點擊 已歸檔,查看列表中的標題、工作區、最後活躍時間與磁盤佔用。
  3. 勾選需要處理的會話:工具欄執行 取消歸檔,或 刪除(確認對話框中可勾選是否同時清理未引用附件,默認與配置項 cleanupAttachmentsDefault 一致)。
  4. 若行顯示 待刪除,表示已排隊至下次啓動;可在啓動前用工具欄或行內 取消待刪除。
  5. 刪除或取消歸檔成功後插件會調用 ctx.sessions.refresh();若側欄仍殘留已刪會話行,刷新頁面(Ctrl+R)或重啓 DSH,勿對已不存在的 id 再次歸檔/刪除。

可選配置在 cordis.patch.yml 的 session-admin 行:

鍵 默認 含義
cleanupAttachmentsDefault true 刪除對話框裏「同時清理未引用附件」默認勾選
dshHome $DSH_HOME 或 ~/.dsh DSH 主目錄
sessionsRoot $DSH_HOME/sessions 會話日誌根
storagesRoot $DSH_HOME/storages JSON 存儲根
attachmentsRoot $DSH_HOME/attachments/v1 附件根

適用場景與注意

適合需要定期清理已歸檔會話、釋放磁盤,且希望刪除過程遵守「僅歸檔 id、live 會話排隊、附件引用掃描」規則的用戶。插件以當前 DSH 進程權限讀寫 $DSH_HOME;安裝前應閱讀 GitHub 倉庫 源碼與 MIT 許可證,自行評估是否滿足環境要求。

已知限制(摘要):多開 DSH 實例時 JSON 存儲域可能「最後寫入者獲勝」,建議單實例操作刪完重啓覈對;重啓前禁用/卸載插件則待刪除隊列不會執行,重新啓用後下一次啓動繼續處理;上傳索引 TTL 未過期附件會被視爲仍被引用;未發送草稿中的附件引用對 Host 不可見,存在極小概率誤刪共享內容哈希對應對象(內容尋址去重)。刪除不可逆,卸載插件不會恢復已刪會話。

DSH 生態強調「一切皆插件」;社區目錄站點與 DeepSeek / 幻方無官方從屬關係,本插件來自社區維護者 z1lyA。

結尾

dsh-session-admin 把「已歸檔會話清單 + 批量取消歸檔 + 安全永久刪除(含待刪除隊列與可選附件清理)」收進一個 Web 管理頁,並明確不寫 agent 工具,刪除意圖留在用戶側。目錄頁:https://www.skillhub.cn/plugins/z1lyA/dsh-session-admin;源碼與完整說明:https://github.com/z1lyA/dsh-session-admin。

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

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

小夜