dsh-session-cleaner

DSH PLUGIN工具与能力

仓库 C-S-N-Y/dsh-session-cleaner

工具与能力 L5 · 运行验证通过 安全审查:低风险 可信度:金 可安装插件
安装这个插件

DSH 会话清理插件,永久删除已归档会话,并扫描清理点不动的幽灵行与失联的孤儿会话,删除前逐条校验并给出拒绝依据。

一句话选型结论

按资料字段整理

dsh-session-cleaner 是工具与能力类的 DSH 可安装插件,验证等级 L5 · 运行验证通过,安全审查为低风险,列出 5 项功能,有可直接复制的安装命令。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类工具与能力 收录类型可安装插件 验证等级L5 · 运行验证通过 安全审查低风险
验证等级 L5 L5 · 运行验证通过
GitHub 星标 0 复刻 0 · 未关闭 issue 0
最近更新 2026-10-01 创建于 2026-10-01
README 13.2 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add github:C-S-N-Y/dsh-session-cleaner
  1. 1
    确认版本与运行环境

    兼容的 DSH 版本为 0.2.0-rc.2;版本不匹配时安装会报错。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本0.2.0-rc.2版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名未发布到 npm可用 npm view 查看包信息

能做什么

5 项功能
字段来自项目仓库与公开索引,中文说明由本站标注

dsh-session-cleaner:DeepSeek Harness 里真正删掉会话痕迹的 DSH plugin

  • 永久删除已归档会话
  • 清理幽灵行与残留标记
  • 扫描并删除孤儿会话
  • 删除前逐条安全校验
  • 侧栏菜单与诊断面板

适用场景

存储

上游标签

deepseek-harnessdshdsh-plugin

验证等级与安全审查

L5 · 运行验证通过
自动化流程结论,不是人工审核
验证等级L5 · 运行验证通过在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度活跃按仓库活跃度与最近更新时间给出
可信度金综合仓库活跃度与验证结果

上面的结论来自上游最近一次自动化验证(2026-10-08): 同一套检查会在插件发新版后重跑,页面显示的是最新一次的逐项结果。

逐项检查结果

L1 · 已找到 ✓ 通过
  • L1.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L2 · 结构化 ✓ 通过
  • L2.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L3 · 安装规范 ✓ 通过
  • L3.1_INSTALL_COMMAND_PARSED 安装命令已解析 方式:安装规范解析
  • L3.2_DSH_VERSION_DECLARED DSH 版本已声明 方式:DSH 版本声明
L4 · 安装已测 ✓ 通过
  • L4.1_INSTALL_EXECUTED_CONFINED 受限沙盒内执行安装 方式:沙盒安装执行
  • L4.2_INSTALL_SUCCESS 沙盒安装成功 方式:沙盒安装执行
  • L4.3_ARTIFACT_CONFIRMED 安装产物已确认 方式:沙盒安装执行
L5 · 运行已测 ✓ 通过
  • L5.1_INSTALL_PASSED_SANDBOXED 沙盒安装通过 方式:沙盒安装执行
  • L5.2_WEB_BOOT_READY Web 启动就绪 方式:Web 启动
  • L5.3_HTTP_SERVED HTTP 服务响应 方式:HTTP 请求
  • L5.4_PLUGIN_INVENTORY_ACTIVE 插件清单中已激活 方式:插件清单查询

风险详情

  • 审查结论 通过
  • 结论说明 vet 静态分析未发现可疑行为,判定为干净(clean)。
  • 风险计数 严重 0 / 高 0 / 中 0
  • 风险详情 未发现严重或警告级问题。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 验证等级 L5:安装和运行都在沙盒里跑通过,装完能直接用的概率高。
  • 静态安全审查为低风险,没有发现明显可疑行为。
  • 有可直接复制的安装命令,不用自己翻文档找入口。
  • 标注了兼容的 DSH 版本(0.2.0-rc.2),按版本装不容易报错。
  • 列出了 5 项功能,能直接看出它解决什么问题。

先想清楚的地方

  • 没有声明 Node.js 版本要求,版本不匹配可能装不上。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在工具与能力场景里给 DSH 补能力的人。
  • 想装完就能用、不想自己排依赖的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-session-cleaner当前 L5 · 运行验证通过 低风险 0 0.2.0-rc.2 有
huashu-design 未做沙盒验证 未标注 3.0 万 未标注 有
loopx 未做沙盒验证 未标注 6,233 未标注 无
agy-staff 未做沙盒验证 未标注 870 未标注 有
dsh-startup-screen 未做沙盒验证 未标注 633 未标注 有
minara-skills L4 · 沙盒安装通过 中风险 360 未标注 有

仓库档案

工具与能力
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方C-S-N-Y仓库 dsh-session-cleaner · 默认分支 main
分类工具与能力tools
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言JavaScript仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue0 / 0 / 0收录时的数值,非实时
创建 / 更新2026-10-01 · 2026-10-01最后推送 2026-10-01
本站收录2026-10-02首次进入本站目录的时间

README 全文

13.2 KB
作者原文,中文版优先;只做安全转义,不改内容

dsh-session-cleaner

> 给 DeepSeek Harness (DSH) 用的会话清理插件:永久删除已归档会话、扫描并清理幽灵行 / 孤儿会话。
> 宿主半(Remote 端点)+ 客户端半(侧栏菜单 / 弹窗 / i18n 中英),零依赖、零构建。

> ⚠️ 这是破坏性工具:删除是真的删除(rmSync,不进回收站、不可恢复、不可再被搜索到)。
> 请先拿 npm run make-fixture 造出来的假会话试手,别拿真实对话练。
> 插件强制「只有已归档的会话才能删」——把"归档"当作删除前的二次缓冲。


1. 它解决什么问题

DSH 本身没有"删除会话"这个动作(只有归档)。于是这些会话会一直躺在 ~/.dsh 里:

症状 本插件做什么
归档了一堆不想要的会话,磁盘越占越多 永久删除:日志目录 + 投影缓存 + 归档标记 + 工作区成员槽,一次清干净
侧栏留着一行点不动、打不开的"幽灵会话"(文件早没了、归档集合里还挂着 id) 清理无效会话:扫描后一键摘掉残留标记(可先点「诊断」看宿主眼里的真相)
父会话删了,子智能体(subagent)会话变成永不成行、也无法管理的孤儿,文件一直占着 扫描出孤儿会话并显式勾选后删除

侧栏「…」菜单里多一项 永久删除会话…,侧栏底部多一项 清理无效会话。

2. 安装

前提:装了 DSH 桌面版;dsh CLI 可用;有 git 和 Node ≥ 20。

# 1) 克隆到你喜欢的位置(示例:DSH 插件目录)
git clone https://github.com/C-S-N-Y/dsh-session-cleaner.git "$env:USERPROFILE\.dsh\plugins\dsh-session-cleaner"

# 2) 以本地链接形式装进你的 profile(profile 名按你自己的来,桌面版通常是 desktop)
dsh plugin --profile desktop add link:"$env:USERPROFILE\.dsh\plugins\dsh-session-cleaner"

然后再确认两处(插件管理器一般会自己写好):

# a) profile 的依赖里出现它,且 node_modules 里是指向源码目录的链接
Get-Content "$env:USERPROFILE\.dsh\profiles\desktop\package.json" -Raw
Get-ChildItem "$env:USERPROFILE\.dsh\profiles\desktop\node_modules" | Select-Object Name,LinkType,Target

# b) profile 的 cordis.patch.yml 里**只有**这一条(不要在这里再写 insert!)
#    - id: session-maintenance
#      disabled: false
Get-Content "$env:USERPROFILE\.dsh\profiles\desktop\cordis.patch.yml" -Raw

最后重启一次 DSH(宿主插件只在进程启动时加载)。

> 也可以直接用 GitHub 规格安装(走 pnpm 的 git 路径,插件管理器会先用 git ls-remote 探一次仓库):
> dsh plugin --profile desktop add github:C-S-N-Y/dsh-session-cleaner
> 这条路没有在作者机器上实测过;如果它报错,用上面的 clone + link: 即可。

卸载:dsh plugin --profile desktop remove dsh-session-maintenance,然后重启。

3. 用法

3.1 删除一条会话

  1. 先把这条会话归档(侧栏「…」→ 归档);
  2. 侧栏「…」→ 永久删除会话…;
  3. 弹窗会把你要删的到底是什么摊开:完整会话 id、工作目录、创建时间、占用体积、是否属于某个工作区;
  4. 确认 → 删掉。侧栏那一行当场消失,不需要刷新页面、更不需要重启。

如果这条会话还被一个活着的 Agent 持有(DSH 的常态:开过的会话,它的 Agent 就一直挂在宿主内存里),
弹窗会给出 停止并删除 —— 详见 §5。

3.2 清理无效会话

侧栏底部 清理无效会话 → 面板会列出三类(扫描本身是只读的):

类别 是什么 清理动作
幽灵会话 归档集合里还挂着、但已经无法正常删除 摘标记 + 删残留文件 + 通知页面摘行
侧栏幽灵行 痕迹早删了,却还留在宿主内存里的会话 停活 + 摘行(本来就已经打不开、不可恢复)
孤儿会话 父会话已删的 subagent 会话 需要你显式勾选才会删文件(不可逆)

面板里还有 诊断 按钮:把宿主眼里的真相(内存会话数 / 归档集合 / 内存有磁盘无)摊开。

4. 安全设计(不是"尽量小心",是写死的不变量)

删除前逐条校验,任何一条不满足就结构化拒绝(不是静默失败):

规则 拒绝码
I1 会话仍被活着的 Agent 持有 session/attached
I2 会话上仍有正在运行的工作 session/running-work
I3 有活着的子智能体后代 session/descendants-active
I4 痕迹不存在 → 幂等返回 deleted:false,而不是报错 —
I5 只删已归档会话 session/not-archived

磁盘内核(lib/core.js)另有四条防误删不变量,与宿主逻辑解耦、可独立测试:

  • S1 sessionId 必须匹配 ^session-[A-Za-z0-9-]{8,}$ —— 绝不拼路径后直接删;
  • S2 目标目录必须落在 /sessions 之下(realpath 校验,防符号链接逃逸);
  • S3 目录名必须恰好等于 sessionId,且目录内必须真的存在会话日志文件;
  • S4 任何不确定 → 不删,并把原因写进 warnings。

删除顺序也是写死的:先摘归档标记与工作区成员槽 → 再删文件(失败则回滚标记,避免"列表里没有、磁盘还在")。

5. 「停止并删除」为什么必须存在

DSH 里有个反直觉的事实:会话对象的生命周期跟着创建它的 fiber 走。

  • ctx.sessions 只有 create / prepare / enter / announce / flush / get / list / fork;
  • ctx.agents 只有 get / list / roots / register / enter / announce / create / resume;
  • 两边都没有 remove / detach / dispose(id) —— 插件无权、也无力把已注册的会话/Agent 摘掉。

所以"开过一次的会话,它的 Agent 会一直挂在宿主内存里",而它不代表还在干活。
本插件的处理是(_tryRelease()):

  1. 停活 —— workspaceRegistry.archiveSession(id, { stopActivity: true }),这是平台自己的原语
    (侧栏"停止并归档"走的是同一条路)。它先落持久归档集合,而归档闸门正是各 provider 的
    agent/pre-step 读的东西 —— 被停掉的工作即使被唤醒也会立刻被挡住;
  2. 等静止 —— 轮询"正在运行的工作 / 活着的后代"直到清空(上限 4 秒,可用环境变量
    DSH_SM_RELEASE_TIMEOUT_MS 调);
  3. 落盘屏障 —— ctx.sessions.flush(session):先把缓冲的事件写干净,再删文件,
    这样删完之后不会再有"迟到的写入"把日志重建出来;
  4. 之后才放行。有常驻 Agent 时还会在 250ms 后复查一次:真被写回来就再删一次,并在结果里
    如实标 resurrected: true。

停不下来(比如工作真的取消不掉)就老实抛 session/stop-timeout 并回传"还剩几项工作",绝不硬删。

6. 已知边界

  • 不做附件清理、定时提醒、跨 profile 的 GC —— 只处理"会话本身的痕迹"。
  • 侧栏里的 subagent 会话永不单独成行(平台行为),所以这类会话只能通过「清理无效会话」管理。
  • 界面里的那一行消失依赖一个宿主转发事件(api-session/removed,见 lib/index.js 注释)。
    万一通知失败,结果里会带 needsRestart:[ids],UI 会如实说"按 F5 刷新页面即可" —— 不需要重启 DSH。
  • 本插件不碰 ~/.dsh 以外的任何文件;DSH_HOME 是运行时解析的,测试全靠这一点把删除范围限制在临时目录里。

7. 宿主端点契约

客户端通过 typert Remote 调这四个方法(都在 sessionMaintenance 命名空间下):

端点 作用 破坏性
probe({sessionId}) 只读预检:痕迹清单、体积、标题、阻塞原因、能否停活 无
delete({sessionId, force?}) 执行删除;force:true = 「停止并删除」 不可逆
scanJunk() 扫描幽灵 / 侧栏幽灵行 / 孤儿(纯只读) 无
cleanupJunk({ghosts?, dangling?, orphans?}) 批量清理;orphans 默认 false(要显式开) 部分不可逆
diagnose() 宿主侧诊断快照(内存会话、归档集合、内存有磁盘无) 无

8. 开发

cd <克隆下来的目录>

npm test                      # 48 项:40 集成(客户端渲染 + 宿主服务)+ 8 内核;零依赖、不需要 DSH 进程
npm run test:core             # 只跑磁盘内核 S1–S4
node test/session-trace.mjs           # 只读侦察一条会话的磁盘痕迹
npm run make-fixture -- --cwd C:\tmp\dsh-spike   # 造一条可安全删除的假会话

# 读平台**真源码**(DSH 的宿主代码全在 app.asar 里;只读,不写安装目录)
$env:DSH_ASAR = '\resources\app.asar'
npm run platform-src -- "^dsh/node_modules/@deepseek-ai/[^/]+/package\.json$"
npm run platform-src -- "x^" --cat "dsh/node_modules/@deepseek-ai/cordis/src/events.ts" .tmp\events.ts
dsh-session-cleaner/
├─ package.json          # dsh.bundle.patch / dsh.client.platform=web / exports["."|"./client"]
├─ cordis.patch.yml      # bundle 补丁层:insert 本插件那一行 Loader 行
├─ lib/
│  ├─ index.js           # 宿主半(零 import):服务 + typert 端点 + I1–I5
│  ├─ core.js            # 磁盘删除内核(S1–S4,可独立测试)
│  └─ client.v17.js      # 客户端半:手写 Module Loader 包,无 JSX / 无构建
└─ test/                 # 零依赖测试与工具(含只读的 asar 巡检器)

> ⚠️ 改客户端半必须换文件名(client.v17.js → client.v18.js)并同步 package.json 的
> exports["./client"] 与文件里的 BUILD 指纹:/plugins 的响应是
> cache-control: immutable,而 revision 只看 mtime/ctime/size —— 不改名时浏览器会用旧代码,
> 刷新和重启都救不回来。改名后必须重启一次 DSH(宿主把 bundle 路径缓存在内存里)。
> 文件名里的 v17 就是这么来的:开发期每次改内容都换一次名,不是版本号。

9. 常见问题

Q:点了删除没反应 / 提示"仍被一个活着的 Agent 持有"?
A:用 停止并删除。DSH 不会回收空闲 Agent,这是常态,不是错误。

Q:删完了那一行还在,只有重启才消失?
A:那是修复前的行为。现在删除成功后会立刻发 api-session/removed 通知页面摘行;万一通知失败,
按一次 F5 即可(宿主那份列表是以磁盘为准的,文件删了它就查不到了)。

Q:菜单项不出现?
A:按顺序查:① profile 的 node_modules 里有没有它;② profile 的 cordis.patch.yml 里那条
disabled: false 在不在;③ 重启过 DSH 没有。客户端半崩溃会被插槽的 error boundary
静默退役(菜单项直接消失),所以也要看 DSH 的日志里有没有 slot entry crashed。

Q:能恢复吗?
A:不能。删除走的是 rmSync,不进回收站、也无法再被搜索到。这也是「只能删已归档会话」这条
硬约束存在的原因。

10. 贡献

Issue / PR 都欢迎。约定:

  • 中文注释为正文语言;每条结论请附可复查的证据位置(文件 + 行号),不要写"我记得";
  • 改删除相关行为必须同时在 test/ 里加用例,并且只用假会话(npm run make-fixture);
  • 破坏性操作一律"先说明、再执行",不接受静默失败。

License

MIT © 2026 C-S-N-Y


English summary

dsh-session-cleaner is a plugin for DeepSeek Harness (DSH) that permanently deletes
archived sessions and cleans up leftover "ghost" / orphan session records.

  • Permanently delete a session: host log dir + projection cache + archive marker + workspace slot.
    Only archived sessions can be deleted (archive = the confirmation buffer).
  • Clean up junk: scan (read-only) for ghost archive markers, rows whose files are already gone,
    and orphaned subagent sessions; then clean them with explicit opt-in for destructive parts.
  • Stop and delete: DSH never reclaims an idle Agent and exposes no remove/detach API, so the
    plugin stops activity with the platform's own primitive (archiveSession({stopActivity:true})),
    waits for the session to go quiet, flushes its log, and only then deletes.
  • Safety: five invariants (I1–I5) plus a disk kernel with four anti-mistake guarantees (S1–S4,
    path-escape and directory-name checks). Deletion is irreversible — test with npm run make-fixture.
  • Zero dependencies, no build step; 48 dependency-free tests (npm test).

Install with DSH's CLI:

git clone https://github.com/C-S-N-Y/dsh-session-cleaner.git
dsh plugin --profile desktop add link:
# then restart DSH

常见问题

8 问
答案由本站依据条目字段整理,不引用上游原文
dsh-session-cleaner 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add github:C-S-N-Y/dsh-session-cleaner` 即可。

dsh-session-cleaner 的验证等级是什么意思?

L5 · 运行验证通过。在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来

dsh-session-cleaner 安全吗?

低风险。vet 静态分析未发现可疑行为,判定为干净(clean)。

dsh-session-cleaner 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-session-cleaner 支持哪些 DSH 版本?

上游记录的兼容版本包括 0.2.0-rc.2。

dsh-session-cleaner 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

dsh-session-cleaner 有哪些功能?

永久删除已归档会话、清理幽灵行与残留标记、扫描并删除孤儿会话、删除前逐条安全校验、侧栏菜单与诊断面板。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

同名或近似条目

8 条
不同作者的仓库分开列,请确认你要装的是哪一个
工具与能力
按星标排序,可作替代方案

huashu-design

huashu-design

在 DeepSeek Harness 里说一句话,就能拿回可交付的设计:网页、App 原型、可编辑 PPTX、动画与信息图,自带 84 种风

未标注验证等级 3.0 万 星

loopx

loopx

LoopX 是面向长周期 Agent 的本地优先控制平面,作为 DSH plugin 为 DeepSeek Harness 提供持久目标、证

未标注验证等级 6,233 星

agy-staff

agy-staff

把 Google Antigravity CLI 作为快速 Gemini 员工接入 DSH,提供子代理侧边栏、编排模式与多种角色技能。

未标注验证等级 870 星

dsh-startup-screen

dsh-startup-screen

DeepSeek Harness 的启动界面与启动动画插件。

未标注验证等级 633 星

dsh-blender-plugin

dsh-blender-plugin

让 AI 模型通过直连 TCP 通道实时驱动 Blender 的 DSH plugin:15 个工具覆盖视口取帧、任意角度渲染、内循环搜索、

未标注验证等级 211 星

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 2026-10-08。