dsh-session-delete-cascade:为 DeepSeek Harness 补上侧栏删除会话

前言

DeepSeek Harness(DSH)在会话管理上默认只提供归档:会话可以从侧栏隐藏,但不会在磁盘上被移除,对话日志会持续累积。对长期在同一项目下跑智能体、子代理的开发者来说,清理试验会话或整条子代理血缘时,缺少「真删除」会带来磁盘占用和检索噪音。

dsh-session-delete-cascade 是社区维护的客户端插件,通过官方插件机制接入,不修改 DSH 源码;需要时可卸载。下面介绍它的能力、安装方式、删除范围与安全行为。

这是什么

  • 名称:dsh-session-delete-cascade(npm 包名与 GitHub 仓库名一致)
  • 维护者:Changqin1024
  • 分类:客户端(Host + 浏览器 Client,经 Connection HTTP 路由通信)
  • 许可:MIT
  • 定位:在侧栏会话的 ⋯ 菜单中增加「删除会话」,确认后按子代理血缘递归删除,并清理日志、投影缓存、搜索索引与工作区记账。

官方 DSH 不提供删除;本插件把删除能力作为独立 bundle 补回。

核心功能

侧栏与确认流程

  • 会话行 ⋯ 菜单新增「删除会话」,排在「归档会话」之后(验证清单中说明为最后一项)。
  • 删除前弹出确认框,说明将删除的内容,并列出将被连带删除的子会话(按标题预览)。

递归删除与保留边界

  • 子代理(origin: 'subagent')会递归删除,包括子代理的子代理。
  • fork 不算子会话:带 parentSession 但没有 subagent 来源的 fork 会话会保留,规则与 DSH 自带归档门禁一致。
  • 删某一子会话时只删其自己的子树,父会话与兄弟会话不动。

彻底清理的数据

针对目标会话及其子代理血缘,确认后会移除:

内容 位置 / 存储 处理方式
对话历史 ~/.dsh/sessions/<项目>/<会话ID>/(append-only JSONL) 逐个删除目录
投影缓存 session_projcache 逐行删除
搜索索引 会话搜索 SQLite 索引 日志删除后自动对账清除
工作区记账 各工作区 sessionIds、全局归档集、置顶集 逐项移除

不删除:按会话 ID 无法直接寻址的缓存,例如附件请求图缓存(~/.dsh/cache/attachments/request-images/)。README 说明清它需要读日志取内容哈希,代价不成比例;会话删除后界面不会再引用,可按需重新生成。

安全护栏

血缘内任意会话仍有任务在跑(进行中回合、运行中的子代理、后台任务、定时提醒等)时,以 session/delete-active 拒绝删除,并在详情中列出每个有问题会话的 ID 与活动类型;拒绝时不会删除任何数据。

安装与启用

包已发布到 npm:https://www.npmjs.com/package/dsh-session-delete-cascade。

package.json 中 engines.dsh 为 >=0.2.1-rc.2;README 写明插件使用的 ctx.connection.fetch.register 在 DSH 0.2.0-rc.2 上验证通过。安装前请对照你本机 DSH 版本。

桌面端(DeepSeek Harness App)

设置 → 插件 → 添加插件,输入包名:

dsh-session-delete-cascade

也可粘贴仓库地址 https://github.com/Changqin1024/dsh-session-delete-cascade。

安装后完全退出并重开 App,侧栏会话 ⋯ 菜单中会出现「删除会话」。

桌面端 profile 不能用 CLI 安装;DSH 对 desktop profile 有排他保护,会出现 error: profile "desktop" is managed exclusively by the Electron application。桌面端请走「设置 → 插件」。

Web / CLI profile

dsh plugin --profile <profile> add dsh-session-delete-cascade

例如:

dsh plugin --profile web add dsh-session-delete-cascade

安装后重启该 profile。

从 GitHub 安装(锁定到具体 commit):

dsh plugin --profile <profile> add github:Changqin1024/dsh-session-delete-cascade

卸载

  • 桌面端:设置 → 插件,找到本插件后卸载。
  • CLI:dsh plugin --profile <profile> remove dsh-session-delete-cascade。

典型用法

  1. 在侧栏悬停任一有内容的会话行,打开 ⋯ 菜单,选择「删除会话」。
  2. 若该会话下有子代理,在确认弹窗中查看将一并删除的子会话列表与数量说明。
  3. 确认后:血缘内会话从侧栏消失,对应 ~/.dsh/sessions/<项目>/<会话ID>/ 目录应被移除;同一父会话下 fork 出来的会话仍应保留。
  4. 在侧栏搜索仅存在于已删会话中的文字,应无结果。

删除失败且提示活动会话时,先结束或等待相关会话上的任务,再重试。

执行顺序(实现层面)

Host 端 POST /api/session-delete.delete 按固定顺序执行,避免中间状态撕裂:

  1. 收集血缘 — 从持久化 header 读取,而非运行时 Subagent catalog。
  2. 拒绝检查 — 血缘内任一活跃则整次操作失败,不删任何内容。
  3. 释放 Agent — 深度优先(先子后父),避免迟到的结算打到已不存在的父级。
  4. 清投影缓存行 → 删日志目录 → 从工作区记账移除。

第 3~6 步为容错实现(失败记日志、不抛错),降低派生存储异常导致侧栏仍显示会话的风险。

插件结构简述:lib/index.js 为 Host;lib/client.js 为浏览器端菜单与弹窗(控件内联,无 Harness 包依赖);cordis.patch.yml 插入 Host 插件行。

适用场景与注意

适合:需要在 DSH 中永久移除试验会话、整条子代理树,并释放 ~/.dsh/sessions 下磁盘占用的用户。

务必注意:

  • 删除不可恢复;确认弹窗中的子会话列表是操作前的最后核对。
  • 整条血缘「全或无」:任一后代在跑则整条删不了,避免半删产生孤儿会话。
  • 血缘遍历基于已落盘会话;纯内存、尚未 materialize 且不在 session.list() 中的子会话理论上不会被遍历(README 称实际使用中子会话会先落盘)。
  • 插件以当前 DSH 进程权限运行;安装前请自行查看 GitHub 仓库 源码与 MIT 许可证。
  • 客户端 UI 为内联实现;若 DSH 日后调整侧栏控件规范,插件可能需要跟进。

DSH 生态强调「一切皆插件」;社区目录 SkillHub 插件页 为独立站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-session-delete-cascade 在不动官方代码的前提下,把「删除会话」补回侧栏,并按子代理血缘做级联清理与安全门禁。需要时可从 npm 或 GitHub 安装,用完可卸载。

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

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

Xiaoye