前言¶
DSH 的側邊欄自帶歸檔,但沒有真正刪除會話的入口:想丟掉一個誤開的會話,只能讓它躺在歸檔裏繼續佔磁盤。刪掉一個工作區更乾脆,磁盤上的會話不受影響,只是 cwd 再也匹配不到任何已註冊工作區,側邊欄連列它的地方都沒有。工作區一多,側邊欄也是一長條平鋪,沒有分組。
dsh-session-hygiene 就是補這三處缺口的插件。它由 liudapeng0311 維護,分類 admin-security,社區目錄上 Star 爲 0,功能不代表成熟度未經廣泛驗證,源碼可以直接讀。
這是什麼¶
一句話定位:給 DSH 的會話生命週期補上三件事——可恢復的刪除、孤兒會話清理、工作區分類。作者在 README 裏強調,插件全程是增量式的:不替換或隱藏任何內置行,也不改寫這些組件以外的 DOM,卸載後側邊欄回到 shell 原始渲染狀態。
三個觸發點分別落在:
- 會話行的
...菜單:新增 Delete session (to trash)。 - Settings → Session cleanup:掃描孤兒會話,支持歸檔、移入回收站、恢復、永久刪除。
- Settings → Workspace categories:新建分類,側邊欄顯示分組標題,支持拖拽分配與摺疊。
核心功能¶
刪除會話進回收站,而不是直接 unlink¶
在側邊欄把鼠標放到某個會話上,打開 ... 菜單,選擇 Delete session (to trash)。會話行立即從列表消失,但數據只是被移動。
底層步驟按順序是:先停掉正在運行的任務並隱藏該行,再把會話 id 從所有工作區解綁並取消 pin,然後把 <home>/sessions/<group>/<id>/ 整個目錄改名移進回收站,同時記錄一條 preview,並通過 api-session/removed 讓已打開的頁面無刷新地丟掉這一行。投影緩存(projection cache)會保留,所以恢復回來的會話還能顯示原來的標題和開場提示。
如果移動報 “the session data is still in use”,說明還有另一個視圖佔着這個目錄,切到別的會話再試。移動失敗時歸檔會回滾,會話照原樣顯示。
清理被刪掉工作區留下的孤兒會話¶
打開 Settings → Session cleanup,頁面打開時就掃描,Rescan 可以重新掃。
Orphaned sessions 的定義是:header.cwd 匹配不到任何已註冊工作區的已存儲會話。每一行顯示標題、開場 preview、原屬工作區、目錄名和大小。處理方式有三種:
- 逐行 Move to trash。
- 批量 Archive N:放進 shell 的歸檔裏,跳過 subagent 會話(通常由父會話持有)。
- 批量 Move all to trash:包含 subagent,會要求二次確認。
另有一類 Detached 會話:cwd 匹配的工作區存在,但那個工作區沒有把這個會話列進去,所以側邊欄把它歸到了 Ungrouped。它們顯示在標籤頁上方的一條 strip 裏,提供 Attach all,比刪進回收站更省事也更安全——會話本身是健康的。
回收站:恢復或永久刪除¶
Trash 標籤頁列出被移入的內容:
- Restore 把目錄改名回記錄中的路徑,並重新掛到擁有該
cwd的工作區。如果原路徑已經被佔用,會返回409拒絕,得先挪走或刪掉佔用物;如果原工作區已不存在,會話以未分組狀態回來,因爲沒有任何工作區認領它的cwd。 - Delete permanently 會 unlink 目錄並丟掉投影緩存條目。這是唯一不可逆的操作,界面會指明具體刪除什麼,且需要再點一次確認。
工作區分類¶
打開 Settings → Workspace categories:
- Add category,可直接內聯重命名,用 ↑/↓ 調順序,Delete 刪除分類後,其下工作區自動回到未分類。
- 通過下拉框給工作區分配分類,或者在側邊欄把工作區行拖到某個分類標題上。
- Save and regroup 寫入分配結果,並重排工作區註冊表,使每個分類的行連續排列,未分類工作區排在最後。內置的拖拽排序仍然有效,插件只在保存時重排。
- Clear assignments 把所有工作區打回未分類,但不刪除分類本身。
- 點擊標題可以摺疊/展開分類,摺疊狀態會被記住。Show category headers in the sidebar 開關可以只隱藏分組條而不取消分配。
一個分類只有在行連成一塊時纔會顯示標題;被拆開時它寧可不顯示標題,也不在歸屬別的分類的行上面放標題。分組條是插件自己掛上去的節點,插件移除後側邊欄完全復原。
安裝與啓用¶
插件發佈在 npm registry 上,可以在 DSH 的 Plugins 頁面安裝,也可以通過 agent:
plugin_manager install_bundle dsh-session-hygiene
如果要裝本地 checkout,傳它的絕對路徑:
plugin_manager install_bundle <path to this checkout>
插件的 host 端 JavaScript 不熱重載,裝完需要重啓一次 host。卸載在 DSH 的 Plugins 頁面移除 bundle 即可,側邊欄的分類條會立即消失。
一個實務提醒:卸載前請先把回收站清空或恢復。插件移除後 <home>/storages/session-hygiene/ 目錄仍然留在磁盤上,但回收站裏的會話已經沒有任何 UI 能恢復,只能照着各自的 entry.json 手工把目錄改名回去。
典型用法¶
下面按 README 的路徑走一遍最常見的清理流程。
1. 刪掉誤開的會話,之後又後悔¶
側邊欄找到會話 → ... 菜單 → Delete session (to trash) → 打開 Settings → Session cleanup → Trash 標籤頁 → 選中那行 → Restore。
2. 清理刪掉工作區後殘留的大量孤兒會話¶
先 Settings → Session cleanup 看 Orphaned sessions 列表,確認不是誤判(見下面的已知限制),再選擇批量 Archive N;確認不會再用,再選 Move all to trash,按提示二次確認。subagent 會話請保留在歸檔之外,它們是父會話的一部分。
3. 把工作區按項目歸類¶
Settings → Workspace categories → Add category → 用工作區行的下拉框或側邊欄拖拽做分配 → Save and regroup。之後側邊欄會出現帶標題的分組條,點標題摺疊。
數據落在哪裏¶
插件只寫 <home>/storages/session-hygiene/ 這一處:
<home>/storages/session-hygiene/
categories.json
trash/<sessionId>__<stamp>/
entry.json
session.v4.jsonl.zstd ...
entry.json 記錄 sessionId、cwd、from(原目錄)、title、preview、createdAt、sizeBytes、deletedAt。這是插件唯一自己創建的文件,也是恢復能力的來源。想手工清空回收站,刪掉這個目錄樹即可。投影緩存是派生產物,進回收站時刻意保留,永久刪除時才一併清除。
適用場景與注意¶
適合這類人:在 DSH 裏把工作區當項目用、會話數量已經上百,刪工作區時想順帶處理掉它留下的會話,並且希望刪除動作有後悔藥。
需要注意幾點:
- 插件以當前 dsh 進程的權限運行,安裝前先讀一遍源碼和許可證再啓用。本插件許可證爲 MIT,倉庫地址見文末。
- 已知限制:孤兒判定拿
header.cwd和工作區註冊表記錄的目錄對比,磁盤上把目錄改名過的會話會被誤判成孤兒;刪除工作區時仍然不會提前警告它有多少會話,插件只在事後把它們列在 Settings 裏,因爲要攔內置刪除流程就得接管sidebar.workspaces這個 shell 所有的singleslot;subagent 會話會單獨標記、不進 Archive N,但會進批量回收站;分類標題依賴行連續,單行分類中間插入行會按上方標題猜,未必準確;host 端 JS 不熱重載,安裝或更新後都要重啓。 - 此插件是社區目錄(獨立站點)上的第三方包,與 DeepSeek / 幻方沒有官方從屬關係。
結尾¶
dsh-session-hygiene 做的事很收斂:把刪除變成可恢復的移動,把刪掉工作區留下的孤兒暴露出來,再給側邊欄加上分組。三件事都是加法,不改變內置行爲。你如果正在被會話堆積和離散工作區困擾,值得試一輪;如果只是想先看看實現,entry.json 的字段設計和 README 裏的槽位表都寫得比較清楚。
- 目錄頁:https://www.skillhub.cn/plugins/liudapeng0311/dsh-session-hygiene
- GitHub:https://github.com/liudapeng0311/dsh-session-hygiene