dsh-session-manager
给 DeepSeek Harness(DSH)的 Web GUI 加一个批量管理会话工具,纯增量、完全不动官方界面:
- 侧栏底部出现「批量管理会话」按钮,点开一个批量面板:列出所有会话、勾选、全选、一键删除选中;每行也有独立的「删除」按钮(单删)
- 删除是物理删除并送进系统回收站(
Microsoft.VisualBasic+SendToRecycleBin),不是不可恢复的rm;正在运行的会话会被置灰、不可删除
不替换官方侧栏:DSH 自带的搜索、视图切换、分组/未分组、排序、拖拽、官方三点菜单全部原样保留,插件只通过 DSH 官方的加性插槽(additive slots)额外加了入口。卸载后官方界面恢复。
> ## ⚠️【重要】当前已知问题(使用前必读) > > 删除后批量管理面板立即消失,但官方侧栏可能仍然显示已删除的会话(尤其是打开过的会话),需要重启 DSH Web 才能清空侧栏。 > > 这是 DSH 内核的限制(没有公开的会话释放/删除 API,插件无法强制移除内存中的会话),不是本插件的 bug;删除本身是完整、安全的(日志已进回收站)。详见文末「⚠️ 当前已知问题(重要,务必阅读)」。
功能
- 批量管理面板:侧栏底部「批量管理会话」按钮 → 面板列出全部会话(含未分组),支持:
- 每个会话一行 + 勾选框 - 每行独立「删除」按钮(单删,确认后进回收站) - 全选 / 清空 - 已选计数 - 「删除选中」(进回收站) - 运行中的会话置灰,不可勾选、不可删除(提示"进行中(不可删除)") - 删除后立即消失:面板里即时移除(关闭再打开也不复现);官方侧栏的隐藏受 DSH 内核限制,可能残留到重启(见顶部警告与文末「当前已知问题」)
- 删除通过 DSH Host 的
sessionPersistence.locate精确定位会话目录,再移入系统回收站;路径带护栏,不会误删 Work 区外的东西 - 自动生效:装好后每次打开 DSH Web 就有,无需手动激活或审批
> v0.2.x 起改为纯增量,不再遮蔽官方侧栏。 > v0.2.4:删除统一收进批量面板(每行单删 + 多选批量),移除了会话顶栏垃圾桶——原单删只能作用于当前打开的(几乎总是运行中的)会话,没有实用价值。 > v0.2.8:删除成功的会话立即从批量面板消失(本地过滤 + 列表刷新),关闭面板再打开也不会复现。 > v0.2.9:删除成功后 Host 把会话 id 加入官方归档集合(workspaceRegistry.archiveSession),尝试让官方侧栏立即隐藏;已在 DSH 0.1.0-rc.7 实测,仍未生效,内存常驻会话残留到重启(见「当前已知问题」)。
怎么安装(手动安装)
你需要先有
- 电脑上已经能用的 DSH(终端里
dsh命令能跑)
两步装好
第 1 步:到本仓库的 Release 页面下载 dsh-session-manager-0.2.10.tgz,然后在终端执行:
dsh plugin --profile web add ./dsh-session-manager-0.2.10.tgz第 2 步:重启 DSH Web 服务(先停止当前的 dsh web,再重新启动)。
打开侧栏即可使用。安装后,在 设置 → 插件 → 插件列表 中会显示为 session-manager。
从 GitHub 直接安装(不下载文件)
dsh plugin --profile web add github:SuperPaiGu/dsh-session-manager装完同样需要重启 DSH Web 服务。
卸载
dsh plugin --profile web remove dsh-session-manager卸载并重启后,官方界面一切照旧(本就不受影响)。
注意事项
- 删除后立即消失:批量面板里立刻移除(关闭再打开也不复现)。官方侧栏的隐藏受 DSH 内核限制,实测 rc.7 下内存常驻会话仍残留,需重启清空(见顶部警告与「当前已知问题」)。
- 删除是回收站删除:会话目录被移进系统回收站,可以从回收站恢复。它不是立即永久删除。
- 正在运行的会话不可删:运行中的会话置灰,勾选框与删除按钮均不可用(Host 端也会保护跳过)。
- 未持久化的会话:新建但还没有日志落盘的会话无法删除(Host 报 missing),这类空会话重启后会自然消失。
- 纯增量:本插件不遮蔽、不替换任何官方区域,只通过
sidebar.footer.action官方加性插槽叠加功能(批量面板作为按钮组件的子组件渲染);侧栏隐藏复用官方workspaceRegistry.archiveSession归档集合,不新增任何界面。
⚠️ 当前已知问题(重要,务必阅读)
现象:删除会话后,批量管理面板里立即消失,但官方侧栏里仍然显示该会话(点开仍能看到标题,但日志文件其实已经进了回收站)。重启 DSH Web 后侧栏恢复干净。此现象在 DSH 0.1.0-rc.7 上已实测复现。
为什么会这样:DSH 官方侧栏的会话列表由内存中的会话(已打开过、agent 常驻) + 磁盘上的冷会话两部分组成:
- 磁盘冷会话:删除后文件即消失,列表刷新(
ctx.sessions.refresh())后立即从侧栏消失。✅ - 内存常驻会话:DSH 内核没有任何公开 API 允许插件强制释放(dispose)一个内存会话——
AgentHandle.dispose()是创建者专属能力(Web 后端恢复会话后即丢弃该能力),也没有任何"删除/关闭会话"的官方 RPC。因此这类会话会一直留在侧栏列表里,直到 DSH 进程重启后按磁盘重新扫描(文件已删,自然不再出现)。
插件已做的努力(v0.2.9):删除成功后调用官方 workspaceRegistry.archiveSession(id),把 id 加入注册表归档集合——这是官方分组视图过滤行的唯一机制。理论上侧栏应立即隐藏该行且刷新后不回来;实测(含 DSH 0.1.0-rc.7)归档隐藏未能生效——归档调用成功与否无法从外部确认,但侧栏残留依旧存在,原因可能是归档帧未推送或客户端分组视图未随之重算。
当前结论:删除在数据层面是完整、安全的(文件已进回收站,重启后侧栏必然干净);残留只是界面列表的显示问题,不影响数据正确性。在 DSH 提供公开的会话释放 API 之前,这是无法根治的 DSH 内核限制。
后续计划:等 DSH 内核提供公开的会话释放/删除 API(或本机 DSH 升级后归档帧行为改变),即可让官方侧栏也即时移除该行,无需改动本插件界面。
怎么安装(Agent 安装)
> 由 AI Agent 在用户机器上执行的确定性指令,按顺序执行,每步有验收条件。
0. 环境检测
dsh --version # 命令不存在则提示用户先安装 DSH1. 安装插件(首选 GitHub,无需下载文件)
dsh plugin --profile web add github:SuperPaiGu/dsh-session-manager验收:退出码 0,输出含 + dsh-session-manager。
(如需固定版本:从 Release 下载 dsh-session-manager-0.2.10.tgz,用 dsh plugin --profile web add ./dsh-session-manager-0.2.10.tgz。)
2. 重启 DSH Web 服务
停止当前 dsh web,再以用户原有方式重新启动。
验收:启动日志无报错;设置 → 插件 → 插件列表 中 session-manager 行为 active。
3. 验收清单
- [ ] 第 1 步退出码 0
- [ ]
dsh --profile web --dump-config含session-manager层 - [ ] 重启后侧栏底部出现「批量管理会话」按钮
目录结构
dsh-session-manager/ 组合包根
├── package.json dsh.bundle + dsh.client 声明
├── cordis.patch.yml 插件层(id session-manager → dsh-session-manager)
├── index.js Host 插件:/session-manager/delete 端点 + 回收站删除
├── client.js Web 客户端 bundle:纯增量(侧栏底部批量按钮 + 批量面板)
└── README.mdLicense
MIT