前言¶
在 DSH 裏跑智能體,對話記錄會一條條積累。DSH 目前的 Session 持久化沒有提供刪除方法,想清理只能手工處理 JSONL 目錄;而直接移動一個可能還有 Agent 在寫的日誌並不安全——運行中的進程不應該在它不知情的情況下失去自己的日誌文件。
dsh-essential 解決的就是這個問題:把刪除的「意圖」和「執行」分開。運行中的進程只記錄刪除請求並立即隱藏對應 Session;真正的日誌移動推遲到下一次冷啓動、在構建索引之前完成,並且全程可恢復。下面介紹它的功能、安裝和用法。
這是什麼¶
dsh-essential 是一個 DeepSeek Harness 插件,包名 @deepseek-ai/dsh-essential,版本 0.0.1,MIT 許可證,GitHub 倉庫位於 omdsh-dev/dsh-essential。一句話定位:爲 DeepSeek Harness 提供可恢復的對話刪除能力——在每個 Session 行菜單注入 Delete conversation 操作,並註冊 /delete-conversation 人機命令。
它面向 Web profile。裝好後,刪除不再需要碰文件:界面上點菜單、頁內卡片確認,或者命令行裏一條斜槓命令,歸檔和恢復由插件按固定流程處理。
核心功能¶
Session 行菜單注入¶
打開任意 Session 行的 … 菜單,會多出一個 Delete conversation 操作。點擊後不再彈原生瀏覽器對話框,而是打開頁內確認卡片 Delete this conversation?,提供 Cancel / Delete conversation 兩個動作。
實現上,插件通過一個穩定的 document 級控制器,以 React portal 把操作掛進菜單 DOM,因此 Host 菜單自動關閉時確認卡片不會跟着消失。沒有活躍 Agent 的歷史 Session 也支持刪除;身份不明的行保持不動,以免誤刪。
/delete-conversation 命令¶
插件註冊人機命令 /delete-conversation。命令層直接處理,不發送給模型:零請求 token,無模型調用。CONFIRM 字面量是強制要求。
立即隱藏,重啓歸檔¶
顯式確認後,插件立即通過 Workspace 的持久歸檔投影隱藏該 Session,且不移動、不刪除任何活躍日誌。下次 DSH 冷啓動時,在構建索引之前把該 Session 的 JSONL 目錄原子移動到:
<stateDir>/trash/<session-lifecycle-key>/
這樣設計的原因:HMR 期間目標 Session 仍存活則保留請求,只有冷啓動才能移動日誌;運行進程從不移動目標日誌,以保留 Agent 所有權與持久化協調。
安全設計¶
- 刪除請求綁定
sessionId、createdAt、cwd,防止複用 id 誤刪更新的生命週期。 - 移動前複查持久化清單、後端位置與完整檢查身份。
- 刪除實現爲重命名 Session 目錄,從不 unlink 日誌;重命名後若崩潰,可通過確定性回收站目標恢復。
- 校驗或移動失敗時保留請求,源目錄不動。
安裝與啓用¶
先做安裝,再做重啓。官方安裝命令如下,把插件加進 Web profile(/path/to/DSH 與 /path/to/dsh-essential 替換爲實際路徑):
node /path/to/DSH/apps/cli/lib/bin.js plugin --profile web add /path/to/dsh-essential
安裝後重啓 DSH。這個包是自包含 DSH bundle(帶 cordis.patch.yml),不修補、不重建 DeepSeek Harness 源碼樹;安裝後 Web Workspace 會等待刪除恢復完成,再索引持久化 Session。運行環境要求 Node.js ^22.19.0 || >=24.0.0。
如果不走安裝命令,也可以在 cordis.yml 裏直接組合:
- id: essential-conversation-delete
name: '@deepseek-ai/dsh-essential'
config:
stateDir: /absolute/path/to/conversation-trash
stateDir 必填、必須爲絕對路徑,且位於 Session 工件目錄之外。commandName 可選,默認 delete-conversation(不帶 /),用於給命令起別名;無論怎麼配,菜單始終使用穩定的 /delete-conversation。
典型用法¶
菜單刪除¶
1、打開 Session 行的 … 菜單,選擇 Delete conversation。
2、在頁內卡片 Delete this conversation? 裏確認或取消,取消不發送任何請求。
刪除進行中時,卡片保持打開、兩個按鈕禁用、主按鈕變爲 Deleting… 並顯示進度;失敗以及「已排隊但尚未隱藏」的部分結果都會在卡片內呈現。
命令刪除¶
刪除當前對話:
/delete-conversation CONFIRM
按 Session id 刪除其他對話:
/delete-conversation <session-id> CONFIRM
命令成功後重啓 DSH,下次啓動把日誌移動到 <stateDir>/trash/<session-lifecycle-key>/。
恢復對話¶
經過上面的步驟刪除的對話都可以恢復:
1、停止 DSH;
2、移除回收站目錄裏的 deletion.json;
3、把目錄移回其中記錄的 originalDirectory。
適用場景與注意¶
適合誰:在 Web 界面管理較多對話、需要清理歷史 Session,又不願手工操作 JSONL 目錄、也不希望數據被永久擦除的 DSH 用戶和團隊。
使用前有幾條限制要知道:
- 僅支持每 Session JSONL 的持久化;SQLite 沒有獨立工件位置,插件會顯式拒絕。
- 日誌移動在重啓後生效:行會立即隱藏,但運行進程從不移動目標日誌。
- 非永久擦除:日誌保留在恢復回收站,直到管理員應用保留策略。
- 無 sidecar 級聯:消息反饋等獨立存儲可能殘留孤兒行,因爲 DSH 沒有跨域的 Session 刪除事務。
- DOM 兼容邊界:在 Harness 提供公開 Session 菜單槽位之前,菜單操作依賴語義 Session 行/菜單 DOM 與獨立的 React-owner 查找;未來 Host 變更兩者時插件失敗關閉,斜槓命令仍可用。
另外提醒:插件以當前 dsh 進程的權限運行,安裝任何第三方插件前都應先檢查其源碼與許可證(本項目爲 MIT)。
想參與開發的話,倉庫固定使用 pnpm@11.7.0,驗證流程是:
pnpm install
pnpm run verify:self-contained
pnpm run typecheck
pnpm test
pnpm run build
pnpm run prepare
結尾¶
dsh-essential 的價值在於:在 DSH 沒有公開刪除能力的前提下,給出一條意圖與執行分離、重啓門控、全程可恢復的刪除路徑——菜單和命令各留一個入口,誤刪也有回收站兜底。
插件目錄頁:https://www.skillhub.cn/plugins/omdsh-dev/dsh-essential
GitHub 倉庫:https://github.com/omdsh-dev/dsh-essential
需要說明的是,skillhub.cn 是獨立的社區插件目錄,與 DeepSeek、幻方沒有官方從屬關係。