前言¶
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 的说明。
侧栏与菜单¶
- 会话行「⋯」菜单里多一项 删除会话…(order 500,排在归档之后)。
- 点击后弹出确认框,展示标题与 session id。
- 确认后会话日志整体移入回收站,不是就地删除。
- 侧栏底部有 回收站 入口,带数量角标。
回收站¶
回收站内可对每条记录 恢复 或 彻底删除;彻底删除需输入 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 一步。
典型用法¶
- 在侧栏找到要清理的会话,打开「⋯」→ 删除会话…,核对标题与 id 后确认。
- 需要找回时,点侧栏底部 回收站,对对应条目执行 恢复。
- 确定不再需要时,在回收站对该条目 彻底删除,按提示输入
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