前言¶
在 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 中有逐步說明,要點包括:
- 正在運行的會話(
agent.status === 'running')會拒絕刪除,需先停掉對話。 - 仍在內存裏(某標籤頁打開過)的會話:先
archiveSession({ stopActivity: true }),再搬走磁盤數據。 - 冷會話會探測
session.lock的flock;若被其他進程佔用則拒絕。 - 會話目錄
rename到回收站$DSH_HOME/.session-recycler-trash/<ISO時間戳>-<會話ID>/,並寫入 sidecar.dsh-session-recycler.json(標題、cwd、刪除時間)。 - 從
workspaceRegistry的工作區記賬與 pin 集合中 detach/unpin;投影緩存會隨條目進入回收站內的.projcache/。 - 廣播
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)。
典型用法¶
- 安裝並重啓
dsh-web後,刷新 DSH Web 頁面。 - 在側邊欄底部打開「刪除會話」。
- 在 會話 tab 勾選要清理的條目(注意運行中、被佔用、空白等標記),執行刪除。
- 誤刪時在 回收站 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。