dsh-session-delete:在 DSH Web 界面删除会话

前言

DeepSeek Harness(DSH)会把每次对话持久化为磁盘上的会话日志,侧边栏可以列出、打开和归档会话。归档相当于「软删除」,日志仍在;若你只想彻底清掉某次试验、过期子代理树或占空间的日志,本体并没有「删除」这一环:SessionPersistence 只提供 create/open/flush/stat/list,WorkspaceRegistry 只有 archive/unarchive,两侧都没有 delete。

社区插件 dsh-session-delete(维护者 TonyZiYuan)在 Web 客户端 侧边栏会话菜单里补上「删除会话」,并在 Host 侧按 DSH 的目录规则移除日志、清理注册表,默认级联删除整棵子会话子树。下面介绍它的定位、能力与安装用法。

这是什么

dsh-session-delete 是 DSH 的 web profile 客户端插件(platform: "web"),在浏览器半身注入菜单与确认对话框,在 Host 半身提供删除服务与 HTTP 路由。会话日志本质上是 <DSH_HOME>/sessions/ 下的目录;本插件在不改 DSH 本体的前提下,增加可审计、带确认与备份引导的删除操作。

核心功能

Web 界面

  1. 侧边栏任意会话行「…」菜单中,在「归档会话」之后新增 「删除会话」。
  2. 可删除任意会话,包括正在运行或当前打开的会话;删除前会先派发 workspace/session-stop,停止该会话上的运行中工作。
  3. 删除父会话时 默认连带删除整棵子会话子树(子会话在侧边栏不可见,无法单独删除)。
  4. 确认对话框展示:会话标题、创建时间、日志大小、子会话数量;有后代时会说明将同时删除 N 个子会话及其后代。
  5. 对话框内提供 「下载此会话的 ZIP 归档」 链接,便于删除前备份。
  6. 必须勾选确认框才能执行删除;删除后侧边栏行立即消失,无需刷新页面。

Host 侧行为概要

删除按固定顺序执行,任一步失败则中止后续步骤(部分步骤失败仅记日志,不阻断,详见 README「删除一个会话时会发生什么」):

  1. 停止运行中工作 → 2. sessionPersistence.flush() → 3. 由 header 的 cwd 确定性定位目录(不扫描 sessions 根)→ 4. 用 traceSession() 枚举后代 → 5. 整树预检(路径、白名单)→ 6. 递归 fs.rm → 7. 清理 workspaceRegistry 或回退改写 workspace.json → 8. 发布 api-session/removed → 9. 记入内存墓碑供浏览器「幽灵收割」。

刷新页面后,已删会话可能因 Host 内存中仍保留 live 会话对象而短暂「复活」;插件通过 GET /sessions 的 tombstones 与客户端收割器在亚秒级再次清除。Host 重启后墓碑与幽灵语义一并消失。

HTTP 接口

方法 路径 作用
GET /api/session-delete/sessions 可删会话清单 + tombstones
POST /api/session-delete/delete 删除,body { "sessionId", "cascade?" },cascade 默认 true

写请求要求来源为回环地址;两条路由均使用 ctx.connection.requestRejection() 信任栅栏。

明确不做的事

  • 不删除 attachments 共享存储。
  • 不提供批量删除、回收站或软删除。
  • 不修改 node_modules 里的 @deepseek-ai/* 本体。

安装与启用

插件需装到 web profile(其他 profile 将命令中的 web 替换即可)。README 在 DSH 0.2.0-rc.2(Web GUI) 实测可用,并依赖若干内部契约;升级 DSH 后若对存在会话报 session/absent 或 UI 组件缺失,需对照新版源码更新插件内路径函数或组件用法。Node 版本要求:^22.19.0 || >=24.0.0(与 DSH 本体一致)。

从 Git 仓库安装(推荐)

dsh plugin --profile web add git+https://github.com/TonyZiYuan/dsh-session-delete.git

dsh plugin add 会转发给 pnpm,装完后自动把 bundle 追加到 profile 的 dsh.profile.bundles。

若安装时报某依赖的构建脚本被拦截,在 ~/.dsh/profiles/web/pnpm-workspace.yaml 中增加:

packages:
  - .

allowBuilds:
  dsh-session-delete: true

然后重跑安装命令。

更新与卸载:

dsh plugin --profile web update dsh-session-delete
dsh plugin --profile web remove dsh-session-delete

装完之后

必须重启 dsh web,浏览器半身与 bundle 仅在启动时加载。

确认挂载:

dsh --profile web --dump-config

输出中应能看到 dsh-session-delete 条目。

典型用法

  1. 启动或重启 dsh web,在侧边栏打开目标会话所在工作区。
  2. 在该会话行点击「…」,选择 「删除会话」。
  3. 在对话框中查看标题、时间、日志大小与子会话提示;需要时先点击 ZIP 归档链接备份。
  4. 勾选确认框,确认删除。
  5. 若删除后刷新仍短暂出现「幽灵」行,插件会自动收割;也可对该行再次点「删除会话」,对话框会显示日志已不在磁盘的状态。

仅需删除单个会话、不级联后代时,可通过 HTTP 调用 POST /api/session-delete/delete 并传 "cascade": false(默认 true,避免留下不可达的子会话孤儿日志)。

适用场景与注意

适合谁: 长期在 Web GUI 使用 DSH、需要彻底移除会话磁盘占用、或清理子代理产生的隐藏子会话树的开发者。

版本与兼容: 插件直接复刻 JSONL 后端的 encodeSegment / projectKey 等路径逻辑,未在上游未验证版本上假定兼容。失败方向偏安全(例如误报 session/absent 而非误删)。

安全与权限: 删除不可逆;插件在 当前 DSH Host 进程权限 下读写会话目录与注册表。安装前应阅读仓库源码与 MIT 许可证,确认行为符合你的环境与合规要求。删除 API 对写操作额外限制回环来源,降低局域网内其他机器仅凭 Web 令牌删历史的风险。

排障速查:

现象 常见原因
菜单无「删除会话」 未安装或未重启 dsh web
unexpected-contents 会话目录含非白名单文件;级联时整树中止
session/in-use 文件被占用,关闭会话或进程后重试
session/absent 目录已不存在;仍会尝试清理注册表

SkillHub 等社区目录由生态独立维护,与 DeepSeek / 幻方无官方从属关系;插件同样遵循 DSH「一切皆插件」的扩展方式,而非内置能力。

结尾

DSH 默认只归档不删盘;dsh-session-delete 在 Web 侧补上带确认、备份引导与级联子树的删除能力,并处理注册表与刷新后的幽灵会话。若你需要在 GUI 里永久清掉会话日志,可按 README 安装到 web profile 并重启 dsh web。

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

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

小夜