dsh-session-delete:在 Web GUI 中永久刪除會話

前言

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,順序大致如下:

  1. 若 agent.status === 'running'(會話正在跑回合)→ 返回 409,不做任何改動;
  2. 調用 workspaceRegistry.archiveSession(id, { stopActivity: true }),寫入歸檔集合,作爲 agent/pre-step 閘門,避免殘留客戶端或子智能體再喚醒;
  3. 對 live 會話:sessions.detachEntered(entry) → 觸發 session/disposed、api-session/removed,側欄行立即消失;
  4. 用持久化後端的 locate(header) 反算會話目錄(不自行重寫 project-key 編碼),校驗路徑必須是 <sessionsRoot>/<projectDir>/<sessionDir> 兩層、lstat 爲普通目錄、realpath 仍在 root 內,符號鏈接直接拒絕;
  5. 對該目錄執行 rm -rf;cold 會話(僅磁盤存在)無 detach 時,手動 ctx.emit('api-session/removed', id);
  6. 若刪的是當前打開的會話,客戶端會 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 即可;插件不修改核心文件。

典型用法

  1. 安裝並重啓 dsh web,刷新 Web GUI。
  2. 在側欄目標會話行打開「⋯」,點 刪除會話,在彈窗中確認。
  3. 確認會話不在列表中,且對應 .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。

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

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

小夜