dsh-session-cleaner:归档会话永久删除与无效会话清理

前言

DeepSeek Harness(DSH)侧栏里可以归档会话,但平台本身没有「删除会话」这一动作。归档后的日志、投影缓存和标记仍会留在 ~/.dsh,磁盘占用会持续增长。有时还会出现侧栏里点不动、打不开的「幽灵行」,或父会话已删、子智能体(subagent)会话变成无法单独管理的孤儿记录。

dsh-session-cleaner(npm 包名 dsh-session-maintenance)是社区维护者 C-S-N-Y 发布的 DSH 插件,归类为「记忆」相关能力。它在侧栏增加「永久删除会话」与「清理无效会话」入口,在宿主端做校验后真正删掉已归档会话的痕迹,并扫描清理幽灵标记与孤儿会话。插件为零依赖、零构建,含宿主 Remote 端点与中英客户端 UI。

下面按定位、功能、安装、用法与安全约束说明,事实均来自 GitHub README。

这是什么

一句话:只删已归档会话的破坏性清理工具,并附带只读扫描与可选批量清理。

项 说明
仓库 C-S-N-Y/dsh-session-cleaner
目录页 skillhub.cn 插件页
版本(package.json) 0.2.0
许可证 MIT
运行要求 Node ≥ 20;需已安装 DSH 桌面版且 dsh CLI 可用

删除使用 rmSync,不进回收站、不可恢复。README 明确建议先用 npm run make-fixture 生成的假会话试手,不要用真实对话练删。

核心功能

永久删除已归档会话

对一条已归档会话,一次清理:日志目录、投影缓存、归档标记、工作区成员槽。侧栏「…」菜单会多 永久删除会话…;确认弹窗会展示完整 session id、工作目录、创建时间、占用体积、是否属于工作区等,便于核对后再删。删除成功后侧栏行会当场消失;若 UI 通知失败,按 F5 刷新即可(不需要重启 DSH)。

清理无效会话

侧栏底部 清理无效会话 打开面板。扫描本身是只读的,列出三类问题后再执行对应动作:

类别 含义 清理方式
幽灵会话 归档集合仍挂着 id,但已无法正常删除 摘标记、删残留文件、通知页面摘行
侧栏幽灵行 磁盘痕迹已无,宿主内存里仍有一行 停活并摘行
孤儿会话 父会话已删的 subagent 会话 需显式勾选才会删文件(不可逆)

面板提供 诊断,可查看宿主侧的内存会话数、归档集合、以及「内存有、磁盘无」等情况。

「停止并删除」

DSH 中开过的会话,其 Agent 常会一直挂在宿主内存里,这不代表仍在干活;平台未提供 remove/detach 类 API。若会话仍被活着的 Agent 持有,普通删除会被拒绝(拒绝码 session/attached)。插件在「停止并删除」路径下会:用 workspaceRegistry.archiveSession(id, { stopActivity: true }) 停活,轮询直到运行工作与活跃后代清空(默认上限 4 秒,可用环境变量 DSH_SM_RELEASE_TIMEOUT_MS 调整),再 ctx.sessions.flush(session) 落盘,然后才删文件。停不下来则返回 session/stop-timeout,不会硬删。

安装与启用

前提:DSH 桌面版、dsh CLI、本机有 git 与 Node ≥ 20。

README 给出两种装法。作者机器上实测过的是「克隆 + 本地 link」;GitHub 规格安装若报错可退回前者。

方式 A:克隆后以 link 安装(README 示例为 PowerShell)

git clone https://github.com/C-S-N-Y/dsh-session-cleaner.git "$env:USERPROFILE\.dsh\plugins\dsh-session-cleaner"
dsh plugin --profile desktop add link:"$env:USERPROFILE\.dsh\plugins\dsh-session-cleaner"

安装后建议确认 profile 的 package.json 依赖、node_modules 链接,以及 cordis.patch.yml 里 session-maintenance 条目且 disabled: false(不要在 patch 里重复 insert)。最后重启一次 DSH——宿主插件仅在进程启动时加载。

方式 B:GitHub 规格(pnpm git 路径)

dsh plugin --profile desktop add github:C-S-N-Y/dsh-session-cleaner

README 注明此路径未在作者环境实测。

卸载

dsh plugin --profile desktop remove dsh-session-maintenance

然后重启 DSH。

典型用法

删除一条会话

  1. 侧栏「…」→ 归档该会话;
  2. 侧栏「…」→ 永久删除会话…;
  3. 在弹窗中核对 id、路径、体积等信息后确认;
  4. 若提示仍被 Agent 持有,使用 停止并删除。

清理无效会话

  1. 侧栏底部打开 清理无效会话;
  2. 可先点 诊断 看宿主快照;
  3. 按列表处理幽灵、侧栏幽灵行;孤儿会话需勾选后再删;
  4. 执行清理。

开发/排错时可克隆仓库后在插件目录运行(不依赖 DSH 进程):

npm test
npm run make-fixture -- --cwd <临时目录>
node test/session-trace.mjs <sessionId>

安全设计与拒绝规则

删除前逐条校验,不满足则结构化拒绝(非静默失败):

规则 说明 拒绝码
I1 仍被活着的 Agent 持有 session/attached
I2 仍有正在运行的工作 session/running-work
I3 有活着的子智能体后代 session/descendants-active
I5 未归档 session/not-archived

磁盘内核(lib/core.js)另有 S1–S4:sessionId 格式校验、路径必须在 <DSH_HOME>/sessions 下且 realpath 防逃逸、目录名与 sessionId 一致且存在日志文件、不确定则不删并写入 warnings。删除顺序为先摘归档标记与工作区槽,再删文件;删文件失败则回滚标记。

宿主 Remote 命名空间 sessionMaintenance 主要端点:probe(只读预检)、delete(破坏性,可选 force:true)、scanJunk(只读)、cleanupJunk(孤儿需显式传入)、diagnose(只读)。

适用场景与注意

适合谁:长期用 DSH、归档很多会话希望释放磁盘;遇到侧栏幽灵行或 subagent 孤儿占空间;需要在「归档」之外多一层确认后再永久删除。

务必知晓:

  • 插件以当前 dsh 进程权限 读写 DSH_HOME(默认 ~/.dsh),不碰其外路径;安装前应自行查看源码与 MIT 许可证。
  • 不做附件清理、定时提醒、跨 profile 的 GC;subagent 会话在侧栏不单独成行,只能通过「清理无效会话」管理。
  • DSH 生态理念是「一切皆插件」;skillhub.cn 等为社区目录,与 DeepSeek / 幻方无官方从属关系。

菜单项不出现时可查:profile node_modules 是否链接正确、cordis.patch.yml 是否启用、是否重启过 DSH;客户端半崩溃时菜单会静默消失,需看 DSH 日志是否有 slot entry crashed。

结尾

dsh-session-cleaner 补上了 DSH 缺失的「永久删除已归档会话」能力,并把幽灵标记、侧栏残留行和孤儿 subagent 会话的扫描与清理做成可诊断、可勾选、带拒绝码的安全流程。若你已在用 DSH 桌面版,可从目录页或 GitHub 获取插件,按 README 安装并重启后再对假会话试删。

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

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

Xiaoye