dsh-trash: Bulk delete sessions in DSH sidebar

前言

DeepSeek Harness(DSH)默认支持把会话归档(Archive):侧栏里仍能看到该行,磁盘上的日志也会一直保留。对临时调试、一次性探索或已过期的会话,归档并不能真正腾出工作区计数,也不会清掉持久化目录。若只靠手动删目录或改登记文件,还容易漏掉 workspace 分组、归档集与 pin 集里的 session id。

下面介绍的 dsh-trash(维护者 BarryAlllen,社区目录见 SkillHub 条目)把「删除会话」做成与 Rename、Pin、Archive 并列的一级操作:侧栏菜单一行即可完成;智能体也可通过同名工具批量删除。插件归类为客户端,与 DSH 自带的 Web/Desktop 配置配合使用。

这是什么

dsh-trash 是一个 DSH bundle 插件(npm 包名 @local/dsh-session-trash,版本 1.0.0)。它在不改变 DSH 核心的前提下,补全「彻底删除会话」路径:侧栏即时移除行、递归删除该会话的 log 目录,并同步清理 workspace 记账以及全局 archive / pin 集合中的 id。

许可证为 MIT(见 GitHub 仓库 README 徽章说明)。

核心功能

依据仓库 README,当前核实的能力包括:

  • 侧栏会话菜单:在会话行 ⋯(或右键)菜单末尾、分隔线之后出现 Delete session;危险样式、独立图标、确认对话框与 toast 反馈,由内置 Context Menu 渲染。
  • 无残留删除:行立即消失(无需整页刷新);对应 log 目录删除;会话不再计入 Workspace、archive、pin bookkeeping。
  • 智能体工具 session_delete:传入多个 sessionIds,可一次处理多条会话;返回按会话粒度的成功/失败结果。
  • 实现特点:Host 侧为纯 ESM,浏览器侧为 window.__ModuleLoader__ 工厂;README 标明零依赖、零构建步骤;不注入 system prompt,除工具 schema 外无额外 prompt 成本。

环境与依赖

项 要求
DSH 0.2.2-rc.1(README 标注为 verified);需已内置的 connection、webServer 服务(任意 Web/Desktop profile)
Node.js 随 DSH 捆绑,无需单独安装
持久化后端 @deepseek-ai/dsh-session-persistence-jsonl(发行版默认),用于定位 log 目录
可选 workspaceRegistry:用于分组清理;缺失时其余功能仍可用

平台徽章写明支持 macOS、Linux、Windows。

安装与启用

官方 README 的安装路径是:先把仓库放到本机,再通过 plugin_manager 把目录安装进你实际使用的 profile。install_bundle 会把目录链入 profile、注册 bundle patch 并热应用;对该 profile 下所有会话生效,重启后仍保留。链接目录意味着后续在目录里 git pull 后,需 DSH 重启(或 Client 侧刷新页面)才会载入更新。

若菜单未出现,README 建议先刷新页面一次(Client 模块在启动时提供)。

也可用 DSH 界面:Plugins → Install,指向同一克隆目录,效果与 install_bundle 相同。

安装命令须与资料原文一致,如下。

git clone https://github.com/BarryAlllen/dsh-trash.git
plugin_manager
  action: install_bundle
  target: /absolute/path/to/dsh-trash

将 target 换成你机器上 dsh-trash 目录的绝对路径。

卸载时 README 给出:

plugin_manager
  action: remove_bundle
  target: @local/dsh-session-trash

已删除的会话不会恢复;其他插件不受影响。

安全提示:插件在当前 DSH 进程的权限下执行删除与 API 注册。安装前请自行阅读 index.js 等源码,并确认 MIT 许可证是否符合你的合规要求。社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系,不宜当作官方应用商店条目理解。

典型用法

侧栏删除

  1. 将指针悬停在会话行上,打开 ⋯,或右键该行。
  2. 在菜单底部选择 Delete session(分隔线下方)。
  3. 在确认框中核对会话名称后确认。

智能体调用 session_delete

请求体示例(README):

{ "sessionIds": ["session-c9456202-3d3d-4cf9-9aa8-a1fd883a0fbc"] }

批量时结果为逐条报告,便于定位失败项:

{
  "results": [
    {
      "sessionId": "session-c9456202-3d3d-4cf9-9aa8-a1fd883a0fbc",
      "ok": true,
      "title": "杂活",
      "dir": "/Users/you/.dsh/sessions/--Users-you-workspace-tmp--/session-c9456202-3d3d-4cf9-9aa8-a1fd883a0fbc",
      "resident": false
    },
    {
      "sessionId": "session-does-not-exist",
      "ok": false,
      "error": "session \"session-does-not-exist\" does not exist"
    }
  ]
}

不确定要删哪些会话时,README 建议在删除前先用 session_search / session_list 核对。

删除时实际发生什么

对通过检查的会话,README 按顺序说明:

  1. Workspace 记账:从所属 Workspace 的 sessionIds 中移除该 id。
  2. Archive 与 pin 集合:从 registry 全局集合中移除该 id。
  3. 持久化 log:递归删除 <session-root>/<project-key>/<encoded-id>/(含各代 session.*.jsonl.zstd、session.lock 等)。
  4. Client 通知:发出 api-session/removed,由现有 Client 走 list remove 突变,侧栏行消失。

步骤 1–2 为派生面;若失败会记日志且不阻断步骤 3 的目录删除。

限制与安全

  • 不可恢复:无回收站、无撤销、无自动备份。
  • 运行中的会话拒绝删除:需先停止会话再删。
  • 当前运行中仍打开过的会话:可从磁盘删除,但在本次 DSH 运行周期内可能仍驻留内存;toast 会提示,重启前不会在磁盘上再出现。
  • 主要删除对象是 log 目录;附件、spill、投影与搜索索引等派生或共享数据,README 说明会话消失后可能仍留残留但不可达,插件不会主动清理这些共享资源。
  • 路径安全:目录路径由持久化后端布局重算,若结果逃逸 session root 则拒绝。

配置与排错

配置:README 明确无 config schema、无凭据、无设置项。

常见症状(摘自 README 排错表):

现象 处理
没有 Delete session 菜单项 刷新页面;仍无则确认 Plugins 中 bundle 已启用
toast 出现 HTTP 404 Host 半未激活或传输层缺少 /api 通道
提示 session is running 先停止会话
行消失但 id 仍在 workspace.json 分组清理可能仅警告跳过;可凭日志提 issue
已删会话仍在列表 本 run 内内存驻留;重启 DSH

工作机制(简要)

组件 方式
菜单项 ctx.contextMenus.register({ target: 'session' }) 及 contextMenu 图标槽
Client → Host POST /api/session-trash/delete,经 ctx.connection.fetch.register
Agent → Host session_delete 工具,输出经 JSON Schema 校验
共享逻辑 index.js 单一实现,两路调用返回相同 per-session 结构
根目录 从 ctx.sessionPersistence.root 读取,回退 profile 配置

结尾

若你需要在 DSH 里把「删会话」当成与归档对称的一级能力——侧栏一点清掉 log,并让 workspace / archive / pin 登记一致——dsh-trash 提供了现成的客户端插件与 session_delete 工具路径。使用前务必理解不可逆删除与运行中会话限制。

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

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

Xiaoye