dsh-plugin-session-delete:在 Web GUI 中永久删除 DSH 对话

前言

DeepSeek Harness(DSH)侧栏里的「归档会话」只会把对话从列表里藏起来,会话日志仍留在 ~/.dsh/sessions/ 下。官方在 @deepseek-ai/dsh-session-persistence-jsonl 的已知限制里说明:持久化层没有删除 API,日志会一直累积,除非外部工具主动清理。若你本地试过多项目、多子会话,或需要合规地清掉某次对话的落盘内容,仅靠归档解决不了「磁盘上是否还存在」的问题。下面介绍社区插件 dsh-plugin-session-delete(维护者 Yelj20001223,分类:客户端),它在 Web GUI 会话行菜单里提供真正的删除能力。

这是什么

dsh-plugin-session-delete 给 DSH Web GUI 侧栏每个会话行的「…」菜单增加「删除对话…」入口,在宿主侧删除对应会话目录及投影缓存记录,而不是只做 UI 层面的隐藏。插件版本 0.1.0,依赖 DSH >=0.2.0-rc.1、Node >=18,许可证 MIT。目录页:SkillHub 插件页;源码:GitHub 仓库。

与原生归档的差异

能力 原生「归档」 本插件
侧栏是否还显示 隐藏 删除后通过 api-session/removed 同步移除行
磁盘上的会话目录 保留 删除 <root>/--<project>--/<id>/(含各代际日志)
可撤销 可取消归档 不可撤销,无回收站

核心功能

  1. 菜单入口:「删除对话…」排在官方「归档会话」之后。
  2. 多选与确认:弹框列出全部会话(含已归档、子会话),可多选;须手动输入 DELETE 才能确认。
  3. 落盘删除:宿主删除该会话目录,并清理投影缓存中对应记录。
  4. 运行中拦截:当前进程内有活动 Agent、正在产出回合的会话返回 blocked;仅打开且空闲的会话允许删除。
  5. 删当前会话后切走:若删除的是当前打开的对话,主面板回到空白新会话页。
  6. 列表热更新:删除后发出 api-session/removed,已连接页面无需刷新即可更新侧栏。

宿主侧 HTTP 接口(经 Host / Origin 校验后可用):

GET  /session-delete/candidates   → { ok, sessions: [{ sessionId, title, cwd, origin, createdAt, sizeBytes, archived, running }] }
POST /session-delete/delete       → { ok, deleted[], blocked[{ sessionId, reason }], failed[{ sessionId, message }] }
       body: { "sessionIds": ["<id>", …] }   (1..500)

安装与启用

从 DSH 仓库根目录(<harness>)执行;desktop profile 由桌面端管理,请用桌面端命令行。安装命令须使用 link:,不要用 file:——file: 会复制一份实体目录,改代码后需重新 add;link: 在 Windows 上为目录联接,改完可立即生效(配合 HMR 甚至不必重启)。

dsh plugin --profile desktop add link:<仓库路径>/session-delete

卸载:

dsh plugin --profile desktop remove dsh-plugin-session-delete

插件以当前 DSH 进程权限运行;安装前请自行阅读仓库源码与 MIT 许可证,确认删除行为符合你的环境策略。

典型用法

  1. 在侧栏目标会话行打开「…」菜单,选择「删除对话…」。
  2. 在弹框中勾选要删的会话(可含已归档项或带 subagent 标记的子会话)。
  3. 阅读后果说明,输入 DELETE 并确认。
  4. 若某会话正在本进程内跑 Agent,会出现在 blocked 结果中且不会被删;其余成功项会从磁盘移除,侧栏同步更新。

批量删除时,sessionIds 一次最多 500 个,由 GUI 调用宿主 POST /session-delete/delete 完成。

安全设计(宿主侧)

宿主不信任客户端传来的路径,只根据持久化后端的 stat() 与会话日志 header 中的 cwd、id 重新推导目录,且 id 须严格落在 root 之内。找不到对应日志 id 时返回失败,不会误报「已删除」。删除前对仍有写入者的会话再次拦截;路由对 Host、Origin 不符的请求返回 403,降低本机端口被跨站滥用的风险。

适用场景与注意

适合:需要清理磁盘上的历史对话、归档仍占空间的会话,或希望子会话目录单独移除(删父会话不会连带删子会话)的 DSH 桌面 Web GUI 用户。

务必知晓的限制(来自 README 已知限制):

  • 删除不可撤销;实现为对会话目录 rm(..., { recursive: true, force: true })。
  • 不级联清理 ~/.dsh/attachments/ 与工作区记录;会话删除后附件可能仍留在磁盘但不再被引用。
  • 「运行中」判定是本进程视角;另一 DSH 进程正在写的会话,本进程可能判为可删(后端有单写者锁,属操作者明确要删的情形)。
  • 社区插件目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系;星标与生态位以各站点展示为准(当前 GitHub 星标为 0)。

本地验证可运行仓库内测试(不修改你真实 ~/.dsh/sessions/ 中的数据,host.spec.mjs 只读复制样本到临时目录):

node tests/host.spec.mjs
node tests/client.spec.mjs

结尾

DSH 生态强调「一切皆插件」;dsh-plugin-session-delete 补上了会话持久化层缺少的「外部删除者」这一环,把 Web GUI 里的操作落到真实目录删除,并配合运行中拒绝与确认门槛降低误删风险。需要安装说明与 API 细节时,以 GitHub README 为准;在目录站浏览条目见 SkillHub。

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

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

Xiaoye