前言¶
DeepSeek Harness(DSH)側欄裏,原生對會話主要是「歸檔」:日誌仍落在 ~/.dsh/sessions/,沒有真正意義上的刪除入口。長時間開發或試驗後,側欄和磁盤上的會話會越堆越多,想清掉某條又不敢硬刪日誌時比較彆扭。
dsh-session-delete 是社區維護的客戶端 bundle,在 Web GUI 上補「刪除會話」能力,並把刪除做成先移入回收站、默認保留 3 天、可恢復或立即清除的流程。下面介紹它做什麼、怎麼裝、怎麼用,以及和原生歸檔的差別。
這是什麼¶
- 插件名稱:
dsh-session-delete(GitHub:Zyl20030506/dsh-session-delete) - 維護者:Zyl20030506(package 作者字段爲 zyl54)
- 分類:客戶端(
dsh.client,platform: web) - 許可證:MIT
- 版本(package.json):1.0.0
一句話:給 DSH 加一個會話回收站——紅色菜單項把會話移入回收站,側欄底部可打開回收站恢復或清空;到期由清掃任務永久刪除。
核心功能¶
界面行爲(README 中的對照表)如下。
| 位置 | 行爲 |
|---|---|
| 會話「…」菜單 → 刪除會話 | 確認後移入回收站;日誌移出持久化根,側欄立即不再顯示 |
| 側欄底部 → 回收站 | 列出待處理會話:標題、刪除時間、剩餘天數 |
| 回收站 → 恢復 | 日誌搬回原路徑並取消歸檔,回到原工作區原位置(原置頂會恢復置頂) |
| 回收站 → 立即清除 | 二次確認後永久刪除該條 |
| 回收站 → 清空回收站 | 二次確認後清空全部 |
| 到期清掃 | 插件啓動時、每 30 分鐘、每次打開回收站前各掃一次 |
要點:
- 刪除 ≠ 硬刪:先進入
<DSH_HOME>/session-trash/v1/<sessionId>/,不在sessions/持久化根下,因此會從會話列表、側欄、搜索索引裏消失,而不是僅靠標記隱藏。 - 隱藏手段:刪除流程裏會調用 DSH 的歸檔機制隱藏行;恢復時用回收站的「恢復」,不要用原生「取消歸檔」(那隻把行放回來,日誌仍在回收站裏)。
- 文案:界面支持中文 / English / 日本語,跟隨 DSH 語言設置。
與原生「歸檔會話」對比:
| 操作 | 歸檔標記 | 日誌位置 | 到期自動刪 |
|---|---|---|---|
| 原生「歸檔會話」 | 設置 | 原地不動 | 不會 |
| 本插件「刪除會話」 | 設置(作爲隱藏手段) | 移入回收站 | 會(默認可配置) |
安裝與啓用¶
插件是普通 DSH bundle(package.json 聲明 dsh.bundle.patch 與 dsh.client)。從 GitHub 安裝 Web profile:
dsh plugin --profile web add github:Zyl20030506/dsh-session-delete
裝完後重啓 DSH(客戶端插件代碼會緩存在頁面裏)。卸載:
dsh plugin --profile web remove dsh-session-delete
本地改代碼時,可用安裝器從目錄 link(README 示例爲 plugin_manager 的 install_bundle,target 爲本目錄絕對路徑);改完刷新頁面即生效。包名 dsh-session-delete 若改名,須同步 package.json 的 name、client.js 裏 _ModuleLoader__.load({ id }) 的 id,以及 cordis.patch.yml 裏的 name。
安全說明:插件以後端路由和文件操作方式在 DSH 進程權限下運行。安裝前建議查看 GitHub 倉庫 源碼與 MIT 許可證,確認符合你的環境策略。
配置¶
保留期與清掃間隔可在 profile 的 bundle 配置裏調整:
- id: session-delete
name: 'dsh-session-delete'
config:
retentionDays: 7 # 默認 3
sweepMinutes: 60 # 默認 30
若不想自動過期刪除,可把 retentionDays 調大(例如 3650),僅用手動「立即清除」。
典型用法¶
- 在側欄打開某會話的「…」菜單,點底部紅色「刪除會話」,確認後該會話從側欄消失。
- 點側欄底部(設置按鈕旁)的回收站入口,查看角標上的待清理數量。
- 在回收站裏對單條會話選擇「恢復」,或「立即清除」;也可「清空回收站」一次處理全部。
- 不操作則默認保留 3 天(或你配置的
retentionDays),由清掃任務到期刪除。
Host 側對外兩條路由(受 DSH 瀏覽器鑑權保護):
POST /api/plugin.session-delete { sessionId, title } → 移入回收站
POST /api/plugin.session-trash { action, sessionId?, payload? } → list | restore | purge | empty
回收站目錄結構(概念上):
<DSH_HOME>/session-trash/v1/<sessionId>/
meta.json # 標題、刪除時間、到期時間、原始路徑、工作區與位置信息、是否置頂等
data/session.v4.jsonl.zstd # 從 sessions 目錄整體搬來的日誌
工作原理與安全邊界(簡敘)¶
刪除前會查詢 workspace/session-activity:有正在運行的回合、子任務、後臺任務或定時提醒時會拒絕,並告知類型。還會拒絕刪除當前主視圖正在顯示的會話(避免視圖繼續往已移走的日誌裏寫)。文件 rename 若遇佔用(EPERM/EBUSY/EACCES)會提示並回滾。步驟失敗時儘量搬回文件、取消歸檔,保持原狀態。
不會刪除:用戶附件(~/.dsh/attachments)、臨時 spill(%TEMP%\dsh-spill-*)、會話在工作區產出的文件等。
已知 UI 現象:「顯示已歸檔」篩選裏有時仍能看到已進回收站的會話(Agent 仍駐留時會被列出);點開會提示無法打開,徹底清除或 Agent 釋放後消失。
DSH 升級可能導致部分內部 API 漂移;插件在能力缺失時會拒絕刪除並提示 incompatible,回收站彈窗頂部也會列出缺少的能力。排查可在 DevTools 控制台搜 session-delete。
適用場景¶
- 日常用 DSH Web GUI,需要清理試驗會話或錯誤創建的會話,又希望有幾天的反悔期。
- 希望和「只歸檔、日誌不動」區分開:要明確把日誌移出
sessions/並支持定時清掃。 - 在 Windows 上 README 稱已完整驗證;POSIX 依賴回收站與
sessions/同在DSH_HOME下的同卷rename。
不適合指望它清理附件、工作區產出或 spill 臨時文件的場景;那些需用 DSH 或其它工具單獨處理。
開發與測試¶
Host 邏輯測試無額外依賴,需 Node ≥ 22:
npm test # 等價於 node test/trash.test.mjs
README 說明測試用臨時目錄與僞造 Cordis 服務,覆蓋入站、列表、恢復、清除、清掃、活動會話拒絕等 18 個用例。
結尾¶
dsh-session-delete 用回收站把「刪會話」做成可逆操作:菜單刪除、側欄回收站、可配置保留期,並在有活動任務或文件佔用時保守拒絕。社區目錄與 DeepSeek / 幻方無官方從屬關係,安裝方式以倉庫 README 爲準。