dsh-session-reaper:为 DSH 侧栏补上可回退的会话删除

前言

DeepSeek Harness(DSH)的 Web 侧栏可以归档会话,但官方在 ui-workspace 的已知限制里写明:会话可以归档,不能删除;持久化层也没有删除 API。归档只是把会话从列表里藏起来,日志仍留在 ~/.dsh/sessions 下占盘。试验分支、重复对话、误建会话多了,只能手动删目录,还要自己处理工作区记账,容易和下次启动时的会话枚举打架。

社区插件 dsh-session-reaper(维护者 GGBound-1229,分类:记忆)补上这段缺口:在侧栏给会话加上「删除」,删掉的日志先进入回收站,可恢复或经二次确认后彻底删除。

这是什么

dsh-session-reaper 是面向 DSH 桌面 profile 的 Cordis 插件,版本 0.1.1,许可证 MIT,要求 Node.js >= 20。它不向模型注册任何工具,只在本机已认证客户端下通过 HTTP 端点操作文件与会话状态。

一句话:在 DSH 默认「不能删会话」的前提下,提供侧栏删除入口和本地回收站,删除可回退。

核心功能

下面行为均来自插件 README 的说明。

侧栏与菜单

  1. 会话行「⋯」菜单里多一项 删除会话…(order 500,排在归档之后)。
  2. 点击后弹出确认框,展示标题与 session id。
  3. 确认后会话日志整体移入回收站,不是就地删除。
  4. 侧栏底部有 回收站 入口,带数量角标。

回收站

回收站内可对每条记录 恢复 或 彻底删除;彻底删除需输入 DELETE 二次确认。

插件不做批量删除,不做自动过期清理——回收站体积只在你手动清理时变小。

删除执行顺序(实现要点)

删除时会依次:停止会话活动、flush 持久化、校验路径落在 sessionsRoot 内、将会话目录 rename 到回收站、解绑工作区、再归档会话 id。顺序是为了避免下次 WorkspaceRegistry.bootstrap() 从磁盘把已删会话重新扫回来;删除后一并归档是为了立刻从侧栏隐藏,避免短暂出现在「未分组」里。

存储位置

  • 会话日志:~/.dsh/sessions/--<normalized-cwd>--/session-<uuid>/
  • 回收站:~/.dsh/session-reaper/
  • entries/<ISO时间戳>__<sessionId>/:移过来的会话目录
  • index.json:标题、原路径、大小、删除时间等索引

手工恢复应使用 index.json 里的 originalDir,不要只搬目录。

HTTP 端点

均挂在 /dsh-session-reaper 下,经 connection.requestRejection 信任围栏:

方法 路径 作用
GET /list 列出回收站
POST /delete {sessionId} 移入回收站
POST /restore {entryId} 从回收站恢复
POST /purge {entryId} 彻底删除

安装与启用

安装分两步:用 pnpm(或 npm)把包装进 profile 的 node_modules,再把包名写进 dsh.profile.bundles。只加依赖不加 bundles,DSH 不会加载;只加 bundles 不加依赖,启动会找不到包。

第 1 步:确认可用的 pnpm

node --version
pnpm --version      # 或 npm --version

系统有 Node 20+ 和 pnpm(或 npm)即可直接用。若没有,需使用 DSH 安装目录下的自带 node/pnpm(路径因机器而异,README 以 Windows PowerShell 示例说明如何验证)。

第 2 步:在 desktop profile 安装

# Linux / macOS
cd ~/.dsh/profiles/desktop
# Windows
cd $env:USERPROFILE\.dsh\profiles\desktop

任选其一(命令来自 README 原文):

pnpm add github:GGBound-1229/dsh-session-reaper
npm install github:GGBound-1229/dsh-session-reaper

若系统没有 pnpm/npm,需用 DSH 自带 node 调用其 pnpm.cjs 执行同样的 add github:GGBound-1229/dsh-session-reaper(见 GitHub README 中的 PowerShell 示例)。

pnpm add 依赖本机已安装 git;报权限错误时需确认 ~/.dsh 可写或以合适权限重开终端。

第 3 步:写入 bundles

编辑 ~/.dsh/profiles/desktop/package.json,在 dsh.profile.bundles 数组末尾增加:

"bundles": [
  "@deepseek-ai/dsh-base",
  "@deepseek-ai/dsh-web-app",
  "dsh-session-reaper"
]

第 4 步:重启 DSH

完全退出再打开。重启后会话「⋯」菜单中应出现 删除会话…。若 node_modules 已有包但菜单无变化,多半是漏了 bundles 一步。

典型用法

  1. 在侧栏找到要清理的会话,打开「⋯」→ 删除会话…,核对标题与 id 后确认。
  2. 需要找回时,点侧栏底部 回收站,对对应条目执行 恢复。
  3. 确定不再需要时,在回收站对该条目 彻底删除,按提示输入 DELETE。

经过上面的步骤,磁盘上的会话目录会先进入 ~/.dsh/session-reaper/,而不是直接递归删掉;只有回收站里的彻底删除才会做递归删除。

适用场景与注意

适合谁:长期在 DSH 里开很多会话、希望像文件管理一样「删掉但还能从回收站捞回来」的开发者;需要控制 ~/.dsh/sessions 体积、又不愿手改目录和工作区 JSON 的用户。

安全与权限:插件以当前 DSH 进程权限读写本机会话目录与回收站;不给模型工具,仅本机已认证客户端可调用端点。安装前建议阅读 GitHub 仓库 源码与 MIT 许可证,确认路径校验与 sessionId 格式约束符合你的预期。

关闭方式:在 profile 的 cordis.patch.yml 里对 dsh-session-reaper 设置 config.enabled: false,或从 dsh.profile.bundles 中移除 dsh-session-reaper。

生态说明:DSH 社区插件目录托管在独立站点(如 SkillHub 目录页),与 DeepSeek / 幻方无官方从属关系;安装方式以仓库 README 为准,并非统一的 dsh plugin add 命令。

结尾

DSH 默认只归档、不删除会话;dsh-session-reaper 在侧栏补上可确认的删除,并把日志移入本地回收站,支持恢复与手动彻底清理。若你需要可回退的会话清理,可按 README 在 desktop profile 安装并写入 bundles 后重启验证。

  • 目录页:https://www.skillhub.cn/plugins/GGBound-1229/dsh-session-reaper
  • GitHub:https://github.com/GGBound-1229/dsh-session-reaper
羽毛球分组比赛记分
小程序二维码

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

Xiaoye