前言¶
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。
典型用法¶
- 在侧栏悬停任一有内容的会话行,打开
⋯菜单,选择「删除会话」。 - 若该会话下有子代理,在确认弹窗中查看将一并删除的子会话列表与数量说明。
- 确认后:血缘内会话从侧栏消失,对应
~/.dsh/sessions/<项目>/<会话ID>/目录应被移除;同一父会话下 fork 出来的会话仍应保留。 - 在侧栏搜索仅存在于已删会话中的文字,应无结果。
删除失败且提示活动会话时,先结束或等待相关会话上的任务,再重试。
执行顺序(实现层面)¶
Host 端 POST /api/session-delete.delete 按固定顺序执行,避免中间状态撕裂:
- 收集血缘 — 从持久化 header 读取,而非运行时 Subagent catalog。
- 拒绝检查 — 血缘内任一活跃则整次操作失败,不删任何内容。
- 释放 Agent — 深度优先(先子后父),避免迟到的结算打到已不存在的父级。
- 清投影缓存行 → 删日志目录 → 从工作区记账移除。
第 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 安装,用完可卸载。