dsh-session-recycler:在 DSH Web UI 裏真正刪除會話並回收

前言

在 DeepSeek Harness(DSH)裏用 Web UI 管會話時,官方列表通常只能「歸檔」:條目從界面消失,磁盤上的會話目錄和日誌仍在。試過後端、項目目錄裏會堆很多「點了新會話但沒聊幾句」的空白記錄,或想徹底清掉某次對話時,歸檔並不能滿足需求。

下面介紹社區插件 dsh-session-recycler(維護者 iamwuzhanglin),它在 Web UI 側提供「刪除會話」入口,並把刪除的數據放進帶恢復/徹底刪除能力的回收站。插件歸類爲 DSH 生態裏的「記憶」相關能力;可在 SkillHub 目錄頁 查看條目,源碼與說明見 GitHub 倉庫。

這是什麼

dsh-session-recycler 當前 npm 包版本爲 0.2.2(MIT 許可),描述爲:在 DeepSeek Harness 中實現「真正的會話刪除」——從 Web UI 刪除指定會話記錄,並通過回收站支持恢復或永久清除。

插件由 Host 半(lib/index.js,6 個 JSON 路由)和 Browser 半(lib/client.js,側邊欄底部「刪除會話」彈窗)組成。DSH 生態一貫是「一切皆插件」;SkillHub 等社區目錄是獨立站點,與 DeepSeek / 幻方無官方從屬關係,安裝前建議自行閱讀源碼與許可證。

核心功能

Host 側 API

宿主註冊以下路由(路徑前綴均爲 /x-dsh-session-recycler/):

方法 路徑 作用
GET list 會話清單(標題、時間、大小、cwd、空白/運行中/被佔用標記)
POST delete 刪除選中會話
GET trash 回收站清單
POST trash/restore 從回收站恢復
POST trash/purge 徹底刪除(不可逆)
GET ping 自檢

Web UI

Browser 半在側邊欄底部提供「刪除會話」入口。彈窗內兩個 tab:會話 / 回收站。工具欄僅有一個「全選」開關:全部選中時文案變爲「取消全選」,不再單獨提供重複的「清空」按鈕。

刪除與會話狀態

刪除流程在 README 中有逐步說明,要點包括:

  1. 正在運行的會話(agent.status === 'running')會拒絕刪除,需先停掉對話。
  2. 仍在內存裏(某標籤頁打開過)的會話:先 archiveSession({ stopActivity: true }),再搬走磁盤數據。
  3. 冷會話會探測 session.lock 的 flock;若被其他進程佔用則拒絕。
  4. 會話目錄 rename 到回收站 $DSH_HOME/.session-recycler-trash/<ISO時間戳>-<會話ID>/,並寫入 sidecar .dsh-session-recycler.json(標題、cwd、刪除時間)。
  5. 從 workspaceRegistry 的工作區記賬與 pin 集合中 detach/unpin;投影緩存會隨條目進入回收站內的 .projcache/。
  6. 廣播 api-session/removed,已連接頁面即時移除列表行。

live 會話刪除後,宿主內存裏可能仍保留一條不可見的 ghost 行,直到 systemctl restart dsh-web。插件通過保留歸檔標記隱藏列表並阻斷 agent/pre-step;刪除接口返回裏 liveGhost: true 表示遇到該情況。磁盤與回收站側數據仍按上述流程處理。

回收站

回收站目錄爲 $DSH_HOME/.session-recycler-trash/(可在 cordis.patch.yml 裏用 trashDir 配置,默認 .session-recycler-trash,相對 $DSH_HOME)。每次刪除對應一個子目錄,內含會話日誌(如 session.v4.jsonl.zstd)、session.lock 與 .dsh-session-recycler.json。

回收站 tab 支持勾選後「恢復」或「徹底刪除」(rm -rf)。恢復時會 unarchiveSession、還原投影緩存、重新 attachSession 並廣播 api-session/added;一般不需要重啓 dsh。也可在終端 ls 該目錄並手工 mv 回去。

彈窗列表中的狀態含義(來自 README):

  • 空白:點了「新會話」但未發消息;刪掉無實質損失。
  • 被佔用:其他進程持有 session.lock;插件只對冷會話檢查。
  • 運行中:正在跑一輪對話,唯一會阻止勾選刪除的狀態。

安裝與啓用

推薦從 npm 安裝到 web profile;bundle 層變更後需重啓 dsh-web,並刷新瀏覽器(client bundle 的 rev 會變):

# 從 npm(推薦)
dsh plugin --profile web add dsh-session-recycler

# 或直接從 GitHub 源碼
dsh plugin --profile web add github:iamwuzhanglin/dsh-session-recycler

systemctl restart dsh-web      # bundle 層變更不走 HMR

也可在 dsh-market 插件市場搜索 dsh-session-recycler 一鍵安裝。

可選配置(cordis.patch.yml 片段):

- id: dsh-session-recycler
  name: dsh-session-recycler
  config:
    trashDir: .session-recycler-trash   # 相對 $DSH_HOME

運行環境要求 Node >= 20(見 package.json 的 engines)。

典型用法

  1. 安裝並重啓 dsh-web 後,刷新 DSH Web 頁面。
  2. 在側邊欄底部打開「刪除會話」。
  3. 在 會話 tab 勾選要清理的條目(注意運行中、被佔用、空白等標記),執行刪除。
  4. 誤刪時在 回收站 tab 勾選並「恢復」;確認不再需要時選「徹底刪除」。

安全邊界上,插件對會話 ID 做白名單與 realpath 前綴校驗,僅在 $DSH_HOME/sessions/<project>/<session-id> 形態下操作,刪除採用先 rename 進回收站再清索引的兩階段方式。

適用場景與注意

適合:長期在 DSH Web UI 裏開發智能體、需要清理空白會話或徹底移除某次對話記錄、又希望誤刪可恢復的用戶。

務必知曉的限制(README「已知限制」):

  • 運行中的會話必須先停再刪。
  • live 會話刪不掉內存副本,需重啓 dsh-web 才能去掉 ghost 行(功能上已由歸檔封死可見性與運行)。
  • 插件自己的 deleted.json 賬本隻影響彈窗列表,主 Web UI 會話列表不讀它。
  • 不刪除 attachments/ 裏被引用的附件字節。
  • 插件以當前 dsh 進程權限運行;安裝前應檢查源碼與 MIT 許可證,再決定是否用於生產環境。

倉庫提供測試命令,可在本地驗證宿主、路由與 client 行爲:

node test/host.test.mjs
node test/routes.test.mjs
node test/client.test.mjs

結尾

dsh-session-recycler 補上了 DSH 官方 UI「只歸檔、不刪除」的缺口:刪除走回收站與索引清理,恢復可走 UI 或文件系統。進一步瞭解可訪問 SkillHub 插件頁 與 GitHub:iamwuzhanglin/dsh-session-recycler。

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

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

小夜