dsh-archive-manager:在 DSH Web GUI 裏查看、恢復與永久刪除歸檔會話

前言

如果你日常用 DeepSeek Harness(DSH)的 Web GUI,可能遇到過這樣的情況:會話歸檔之後,側邊欄裏就再也找不到了。底層確實維護着一個全局的 archivedSessionIds 集合,但官方 UI 沒有提供任何入口去查看歸檔會話、取消歸檔,更不用說永久刪除一個會話。簡單地從列表裏把歸檔會話隱藏掉,只會讓它們在 GUI 層面徹底不可恢復;而刪除一個會話又要按順序清理多個相互獨立的存儲——轉錄目錄、工作區賬目、歸檔標記、投影緩存——順序錯了就會留下殘留。

dsh-archive-manager 就是爲填補這塊空缺而寫的。下面介紹它的功能、安裝方式和典型用法。

這是什麼

dsh-archive-manager(npm 包名 @gamegeek-saikel/dsh-archive-manager,當前版本 0.1.1)是 Saikel-Orado-Liu 維護的一個面向 DSH Web GUI 的歸檔會話管理插件,MIT 許可證,目標平臺爲 web。它提供四件事:

  1. 一個 “Show archived” 視圖開關,控制歸檔會話是否顯示;
  2. 歸檔會話的樣式與保護:紅色標題、着色背景、”Archived” 徽章,點擊受保護不可打開;
  3. 取消歸檔,讓會話回到原工作區位置;
  4. 會話的永久刪除,清理所有相關存儲。

整個插件以單個 npm 包交付,官方包文件零修改。這一點後面展開講。

核心功能

視圖開關。 “Show archived” 選項與分組、排序放在同一個持久化存儲 dsh.workspace.view.v5 裏,重啓瀏覽器後選擇仍然保留。分組列表、平鋪列表和搜索共用同一條可見性推導路徑,所以歸檔會話在所有界面上的顯示與隱藏是一致的。

歸檔樣式與保護。 歸檔行以紅色標題、着色背景和 “Archived” 徽章展示。點擊歸檔會話不會打開它,而是彈出 toast 提示,消息發送也被阻止。歸檔行的行菜單隻包含 [Unarchive, Delete session] 兩項。

取消歸檔。 歸檔操作從來不會移動會話在工作區賬目中的位置,所以 unarchiveSession 只是把它從全局 archivedSessionIds 集合裏移除,會話就會恢復到原工作區位置。這個操作是冪等的。

永久刪除。 deleteSession 在註冊表的操作隊列裏串行執行,順序是固定的:flush → detach(session/disposed)→ 等待投影緩存的 write-behind 落盤(whenIdle)→ 刪除轉錄目錄 → 清除歸檔標記 → 移除工作區賬目 → 刪除投影緩存行 → 盡力而爲的子代理級聯與溢出清理。每個會失敗的步驟都是冪等可重試的,重試可以修復半刪除狀態。子代理級聯只作用於 origin 爲 subagent 的子會話,fork 分支不會被級聯刪除。

接入方式。 宿主側通過 WorkspaceRegistry 和 SessionProjectionCache 的子類增加 unarchiveSession / deleteSession 與 delete(id) / whenIdle(),以 Typert Remote 端點 workspaceRegistry/unarchiveSession 和 workspaceRegistry/deleteSession 暴露,不影響舊版 /api/workspace.* 網關。客戶端是一個 fork 的 dsh-client-ui-workspace 瀏覽器 bundle,負責視圖開關、歸檔行樣式、受保護的打開行爲、行菜單、確認對話框和 toast,界面支持簡體中文與英文。

交付形態。 這三個實現作爲內部子模塊(workspace、projcache、client)打進一個 npm 包,通過根目錄的 cordis.patch.yml 禁用官方的 workspace、session-projection-cache、ui-workspace 行,插入對應的 workspace-archive-manager、session-projection-cache-archive-manager、ui-workspace-archive-manager 行。官方包文件不做任何修改。

測試方面,項目有 22 個測試用例,覆蓋 4 個 node:test 套件:host、client bundle、client remote 和 installed copies。

安裝與啓用

先確認 Node 版本滿足 ^22.19.0 || >=24.0.0,然後用 DSH CLI 安裝:

npx @deepseek-ai/dsh plugin --profile web add @gamegeek-saikel/dsh-archive-manager

如果已經全局安裝了 DSH CLI,可以用 dsh 代替 npx @deepseek-ai/dsh。

安裝時 DSH CLI 會應用包內的 cordis.patch.yml,也就是上面提到的:禁用官方三行,插入 archive-manager 三行。安裝完成後啓動 DSH Web:

npx @deepseek-ai/dsh web

如需回滾或卸載:

npx @deepseek-ai/dsh plugin --profile web remove @gamegeek-saikel/dsh-archive-manager

典型用法

安裝並重啓 DSH Web 後,可以在界面上逐項驗證:

1、打開視圖選項菜單,找到與分組、排序並列的 “Show archived” 項(以分隔符隔開)。切換它可以顯示或隱藏歸檔會話,分組列表、平鋪列表和搜索結果都生效。

2、歸檔行顯示爲紅色標題加着色背景,帶 “Archived” 徽章。點擊它不會打開會話,而是彈出 toast:”This session is archived. Unarchive it to continue the conversation.”,消息發送保持被阻止。

3、歸檔行的行菜單隻有 [Unarchive, Delete session]。選擇 Unarchive 後,會話恢復正常樣式、可以打開,並回到它原來的工作區位置。

4、普通會話的行菜單新增一個 danger 樣式的 “Delete session” 項。刪除走兩步確認對話框,提示文本爲 “This permanently deletes session … This cannot be undone.”。確認後會話被永久移除;如果刪除過程中某一步失敗,對話框保持打開,可以重試。

5、刪除當前正在打開的會話時,輸入框置灰、會話行消失,UI 不會崩潰。

刪除完成後可以覈對磁盤狀態:~/.dsh\sessions\…\session-<id>\ 目錄不存在,~/.dsh\storages\workspace.json 中 global.archivedSessionIds 和各工作區的 sessionIds 不再包含該 id,~/.dsh\storages\session_projcache.json 的 tables.sessions 中也不再包含該 id。

適用場景與注意

這個插件適合的場景很明確:你在 DSH Web 裏歸檔過會話,又希望在 GUI 裏能再看到它們、必要時恢復,或者乾脆徹底刪除以清理磁盤殘留。刪除流程對順序和冪等的處理比較嚴格,重試即可修復半刪除狀態,這是它區別於“直接改文件”方案的地方。

使用前有幾點需要注意:

1、刪除是永久操作,不可撤銷。確認對話框的兩步設計就是爲此,但操作前仍建議想清楚。

2、插件以當前 dsh 進程的權限運行,能接觸會話存儲與相關配置。安裝前請到 GitHub 倉庫檢查源碼與許可證(本項目爲 MIT),確認接受再安裝。

3、Node 版本需滿足 ^22.19.0 || >=24.0.0。

4、子代理級聯刪除只覆蓋 origin 爲 subagent 的子會話,fork 出來的分支不會被級聯刪除,這一點在評估刪除影響時可以放心。

結尾

dsh-archive-manager 做的事情不復雜,但做得很守規矩:不改官方包文件、用一條串行化的刪除流程處理多個存儲、每個失敗步驟冪等可重試。對需要在 DSH Web GUI 裏管理歸檔會話的用戶來說,它補上了官方 UI 缺失的那幾塊拼圖。

插件收錄於社區插件目錄(獨立站點,與 DeepSeek / 幻方無官方從屬關係):https://www.skillhub.cn/plugins/Saikel-Orado-Liu/dsh-archive-manager ,源碼與問題反饋見 GitHub:https://github.com/Saikel-Orado-Liu/dsh-archive-manager 。

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

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

小夜