前言¶
DeepSeek Harness(DSH)的 Web 側欄裏,會話行菜單默認只有 pin、rename、fork、archive 四項。歸檔會把會話從列表裏藏起來並阻止再喚醒,但磁盤上的 session.v4.jsonl.zstd 以及整個會話目錄通常仍在。若你本地試過很多會話、或需要按合規要求清掉某次對話的落盤數據,僅靠歸檔不夠。社區插件 dsh-session-delete(維護者 bie-666)在菜單裏增加紅色的「刪除會話」,經確認後走 host 路由 POST /api/session-delete,先做歸檔閘門再刪目錄,客戶端實現按 dsh 0.2.1-rc.5 的 Web 客戶端插件規範編寫。
這是什麼¶
dsh-session-delete 是 DSH 的客戶端類插件(同時包含 host 側 API 與 Web 前端 bundle)。一句話:給 DSH Web GUI 會話行補上永久刪除能力,核心是「先歸檔、再卸會話、再從磁盤 rm -rf 會話目錄」。插件版本 0.1.0,許可證 MIT,源碼與說明見 GitHub 倉庫,目錄頁:skillhub.cn/plugins/bie-666/dsh-session-delete。DSH 生態強調「一切皆插件」;社區目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。
核心功能¶
界面與請求路徑¶
用戶在側欄某會話行點擊「⋯」→ 選擇 刪除會話 → 彈窗確認 → 瀏覽器發起 POST /api/session-delete。
Host 側刪除流程¶
實現位於 lib/index.js,順序大致如下:
- 若
agent.status === 'running'(會話正在跑回合)→ 返回 409,不做任何改動; - 調用
workspaceRegistry.archiveSession(id, { stopActivity: true }),寫入歸檔集合,作爲agent/pre-step閘門,避免殘留客戶端或子智能體再喚醒; - 對 live 會話:
sessions.detachEntered(entry)→ 觸發session/disposed、api-session/removed,側欄行立即消失; - 用持久化後端的
locate(header)反算會話目錄(不自行重寫 project-key 編碼),校驗路徑必須是<sessionsRoot>/<projectDir>/<sessionDir>兩層、lstat爲普通目錄、realpath仍在 root 內,符號鏈接直接拒絕; - 對該目錄執行
rm -rf;cold 會話(僅磁盤存在)無 detach 時,手動ctx.emit('api-session/removed', id); - 若刪的是當前打開的會話,客戶端會
uiWorkspace.startSession()離開該會話。
成功時響應示例(字段以實際爲準):
{"ok":true,"sessionId":"session-…","archived":true,"wasLive":false,
"detached":false,"removedFromDisk":true,"directory":"/…/.dsh/sessions/--…--/session-…"}
常見錯誤碼包括:request/invalid-json、session/invalid-id、session/not-found、session/running、session/path-unsafe、session/remove-failed、session/list-failed、request/method-not-allowed。
GET /api/session-delete 返回 {"ok":true,"version":"0.1.0","route":"…"},用於判斷插件是否已加載。注意:/api 前綴對未認證請求一律 401,用 curl 探測時需理解「401 表示路由已註冊、404 表示插件未加載」。
與核心版 archive 的對比¶
| 能力 | 核心 archive | 本插件 |
|---|---|---|
| 側欄隱藏 / 阻止喚醒 | 是 | 是(先歸檔) |
| 刪除磁盤會話目錄 | 否 | 是 |
安裝與啓用¶
官方 README 給出的步驟如下(不要用名稱臆造 dsh plugin add github:…):
git clone https://github.com/bie-666/dsh-session-delete.git ~/.dsh/plugins/dsh-session-delete
dsh plugin --profile web add link:$HOME/.dsh/plugins/dsh-session-delete
dsh plugin add link: 會把插件掛進 web profile 的 package.json;插件自帶的 cordis.patch.yml 會向組合樹插入 - id: session-delete。新的 loader 行只在 dsh web 啓動時讀取,裝完後必須重啓 DSH:
pkill -f "dsh web"; dsh web
重啓後刷新頁面,dsh-client-modules 纔會把 lib/client.js 納入 boot roster(菜單與彈窗在該 bundle 內)。驗證:
curl -s http://127.0.0.1:3080/api/session-delete
# 401 = 路由已註冊但請求沒帶瀏覽器 cookie(正常);404 = 插件沒加載
若不用 dsh plugin add,可手動 symlink 並在 ~/.dsh/profiles/web/cordis.patch.yml 末尾追加 insert 塊(詳見倉庫 README)。
卸載:刪除 node_modules 裏的鏈接並去掉 cordis.patch.yml 中 id: session-delete 段,重啓 DSH 即可;插件不修改核心文件。
典型用法¶
- 安裝並重啓
dsh web,刷新 Web GUI。 - 在側欄目標會話行打開「⋯」,點 刪除會話,在彈窗中確認。
- 確認會話不在列表中,且對應
.dsh/sessions/…下目錄已不存在(可通過 API 響應裏的directory字段對照)。
不依賴 DSH 宿主時,可在本地跑離線自檢:
node ~/.dsh/plugins/dsh-session-delete/test/offline-checks.mjs
覆蓋路由註冊、live/cold 刪除分支、各類 HTTP 守衛、路徑安全與客戶端 slot/菜單渲染等。
適用場景與注意¶
適合:需要在 Web 界面一次性清掉會話及其落盤目錄的 DSH 用戶;開發與插件作者可參考其 archive + detach + sessionPersistence.locate() 的路徑安全刪除寫法,以及 rc.5 客戶端 bundle 的插槽與模塊表約束(倉庫 README 與 docs/troubleshooting-rc5.md 有整頁 boot 失敗排查記錄)。
務必注意:
- 刪除不可恢復,確認彈窗後再操作。
- 插件以當前
dsh進程的用戶與權限運行,rm -rf作用於校驗通過的會話目錄;安裝前應閱讀源碼與 MIT 許可證,自行評估是否滿足你的環境策略。 - 客戶端插件在 rc.5 上若插槽名寫錯或
require未放行的宿主包,會導致整頁Failed to load plugins;改 bundle 後需重啓dsh web(僅刷新頁面不夠)。
結尾¶
dsh-session-delete 把「歸檔」從隱藏會話擴展爲可審計的磁盤清理:host 側 409/路徑守衛 + 歸檔閘門,Web 側一條菜單即可完成操作。進一步瞭解請訪問 目錄頁 與 GitHub:bie-666/dsh-session-delete。