dsh-session-delete:爲 DSH Web 會話增加可恢復的回收站

前言

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),僅用手動「立即清除」。

典型用法

  1. 在側欄打開某會話的「…」菜單,點底部紅色「刪除會話」,確認後該會話從側欄消失。
  2. 點側欄底部(設置按鈕旁)的回收站入口,查看角標上的待清理數量。
  3. 在回收站裏對單條會話選擇「恢復」,或「立即清除」;也可「清空回收站」一次處理全部。
  4. 不操作則默認保留 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 爲準。

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

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

小夜