前言¶
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。
典型用法¶
删除一条会话¶
- 侧栏「…」→ 归档该会话;
- 侧栏「…」→ 永久删除会话…;
- 在弹窗中核对 id、路径、体积等信息后确认;
- 若提示仍被 Agent 持有,使用 停止并删除。
清理无效会话¶
- 侧栏底部打开 清理无效会话;
- 可先点 诊断 看宿主快照;
- 按列表处理幽灵、侧栏幽灵行;孤儿会话需勾选后再删;
- 执行清理。
开发/排错时可克隆仓库后在插件目录运行(不依赖 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 安装并重启后再对假会话试删。