dsh-session-delete:在 DSH 中永久刪除 Session

前言

DeepSeek Harness(DSH)裏,Session 的持久化能力主要負責創建、打開、統計和列出日誌;歸檔只是把 Session 從列表裏藏起來,並不會刪掉磁盤上的日誌目錄。試驗性會話、誤建的 Session、或需要徹底清掉本地痕跡時,只靠歸檔往往不夠。

社區插件 dsh-session-delete(維護者 liufeicc,分類 admin-security)在側邊欄 Session 的「…」菜單裏增加一行 Delete session,經確認對話框後,由 Host 側操作刪除該 Session 的 durable log,並同步清理派生狀態。下面介紹它的能力邊界、行爲細節和接入方式。

這是什麼

dsh-session-delete 是一個本地 DSH bundle:在每條 Session 的側邊欄菜單中增加永久刪除入口,配套確認對話框,以及通過 Typert Gateway 暴露給瀏覽器的 Host 操作 sessionDelete/delete。

核心功能

側邊欄與確認流程

插件註冊 sidebar.workspaces.session.menu.item(id: session-delete,order: 500,緊跟內置的 archive 行)。點擊後彈出 shell.overlay 確認框,展示 Session 名稱;該操作不可撤銷。

Host 刪除與狀態清理

用戶確認後,Host 會:

  1. 從磁盤刪除 Session 的 durable log 目錄:$DSH_HOME/sessions/<project>/<session-id>/
  2. 清理仍會把它列出來的派生狀態:session_projcache、pin 成員關係、以及所屬 workspace 的 sessionIds 記賬

側邊欄行會盡快消失:workspace 記賬變更經現有 Workspace 流到達,Client Session 列表會收到移除通知(handleSessionRemoved 並做一次 baseline refresh)。

Client 服務 sessionDeleteUi

除菜單行外,插件通過 ctx.provide 提供 Client 服務 sessionDeleteUi,供其他 Client 插件複用同一套確認與刪除流程,而不必各自實現對話框。當前 README 記載的首個調用方是 dsh-split-workspaces(分屏工作區裏每條 Session 行上的刪除按鈕)。

對外方法爲:

request({ sessionId, displayTitle, onDeleted })
  • 沒有可用 sessionId 時返回 false
  • 刪除成功(或 Session 已不存在)後調用 onDeleted(sessionId);分屏場景下用於釋放曾 pin 到該 Session 的面板

與「Live」Agent 相關的拒絕與歸檔

Harness 沒有內置的 Session 刪除原語;本插件自行刪除產物,唯一不安全的場景是 正在產出工作的 Session。

行爲要點(與 README 一致):

  • 僅 真正 running 的 Session 會被拒絕;對話框可提供 Stop and delete:按用戶停止的方式取消工作,待 Agent 靜默後再刪除,避免進行中的 drain 把剛刪的文件又寫回來
  • 曾有 live Agent、但當前並非 running 的 Session:刪除前會先 durable 歸檔(文檔中的 wake block;agent/pre-step 門會讀 durable archive 集合),避免排隊 wake、goal 輪次或 schedule tick 往已移除的 log 裏追加並「復活」Session;該歸檔 id 有意保留爲 tombstone。無 live Agent 的 Session 則改爲 unarchive 後刪除
  • 已不存在的 Session 視爲 missing;對話框按已完成處理並清理陳舊行
  • 經 sessionDeleteUi 進來的調用方,在 Client Session 列表已被告知移除 之後 才收到回調;若 onDeleted 拋錯只記日誌,不報告刪除失敗(此時 log 已不存在)

Host 結果中的 guarded: true 表示該 Session 曾有 live Agent,刪除過程受歸檔保護;missing 表示未找到 log。

其他限制與生態交互

  • 刪除你正在查看的 Session 時,對話視圖仍可能指向已不存在的 log;歸檔門會阻止仍駐留的 Agent 繼續工作,刷新後行會消失。若仍要保留當前視圖,建議先切走
  • Session 引用的附件是內容尋址、多 Session 共享的,刪除 Session 不會動附件
  • 搜索索引插件 dsh-session-query-sqlite 會在自己的 reconciliation 中丟掉已消失的 log
  • 手寫 bundle 不能直接 import @deepseek-ai/*;Host 側手寫 Typert marker 與 typertRemote 綁定,Client 側手寫與 ctx.remote.$mount 匹配的 InvocationDescriptor(Gateway 要求輸入 codec 爲 strict,且 Client Typert 註冊表要求 strict codec 帶 create() schema factory)

安裝與啓用

資料中的 Development 說明:在 profile 的 package.json 裏用 link: 指向本插件目錄,由 profile 鏈接該 bundle。README 未給出 SkillHub 或 dsh plugin add 形式的固定安裝命令;從 GitHub 倉庫 獲取源碼後,按你現有 profile 的本地插件鏈接方式啓用即可。

package.json 中 dsh.bundle.patch 指向 cordis.patch.yml,用於向 Host 注入單行;Client 配置爲 platform: web、immediately: true,並注入 sidebar、workspace、session-controller 等客戶端模塊。

啓用後可在 Plugin Manager 中查看插件展示信息(locale/en.json、locale/zh.json 與 icon.svg)。

Host 側 index.js 由 Loader 只導入一次,且 hmr.config.root 爲空時 修改 Host 代碼需重啓 Harness 進程 才生效;Client 側 client.js 從磁盤提供,改完後 瀏覽器刷新 即可。

典型用法

側邊欄永久刪除

  1. 在 workspace 側邊欄打開目標 Session 的「…」菜單
  2. 選擇 Delete session(緊挨歸檔項)
  3. 在確認框中核對 Session 名稱後確認
  4. 若 Session 正在運行,按提示選擇停止並刪除,或先自行停止再刪

其他插件調用 sessionDeleteUi

在已依賴本插件的 Client 插件中,通過 ctx.get 取得 sessionDeleteUi,調用 request 並傳入 sessionId、displayTitle 與成功後的 onDeleted。空 sessionId 會被拒絕(返回 false)。

適用場景與注意

適合誰: 需要在本地 DSH 環境做 Session 生命週期治理的開發者或管理員——清理試驗 Session、去掉誤建記錄、在分屏或多入口 UI 裏統一刪除體驗(配合 dsh-split-workspaces 等)。

安全與權限: 刪除操作以當前 dsh Host 進程的身份與文件系統權限 執行,會直接移除 $DSH_HOME/sessions/... 下目錄。安裝或 link 前請閱讀 源碼 與 MIT 許可證,確認符合你的合規要求。

生態說明: DSH 倡導「一切皆插件」;SkillHub 爲社區目錄,與 DeepSeek / 幻方無官方從屬關係,本文不構成官方產品說明。

結尾

dsh-session-delete 補上了 DSH 默認能力裏缺少的一步:在確認之後永久移除 Session log,並處理 live Agent、歸檔 tombstone 與 workspace 記賬等邊界。需要菜單刪除、可複用對話框或 Host 端 sessionDelete/delete 時,可從目錄頁或 GitHub 獲取 bundle,按 profile link: 方式接入。

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

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

小夜