DeepSeek Harness 侧栏真删会话插件

前言

DeepSeek Harness(dsh)自带的工作区删除入口藏在工作区分组标题的悬停菜单里,会话则只有「归档」没有删除;框架层面也没有会话删除的公开 API。这导致侧栏上堆积大量已关闭的会话记录,本地日志与投影缓存也持续占用磁盘空间。dsh-sidebar-delete 在侧栏补上了「真删」能力:删除会话时会连带清理本地日志目录、投影缓存,并从工作区登记中移除引用;子会话会级联删除;同时提供常显的会话与工作区管理面板。

这是什么

xqh-jason/dsh-sidebar-delete 是一个客户端插件,为 DeepSeek Harness Web 侧栏增加会话删除与管理工作区的能力。零运行时依赖,通过 Host 路由与四个槽位注册扩展框架。当前版本 0.1.7,MIT 许可证。

核心功能

删除会话

会话行悬停出现垃圾桶图标;会话行「…」菜单中也有「删除会话」选项。确认后删除本地会话日志目录(<DSH_HOME>/sessions/<项目目录>/<sessionId>/)与投影缓存(<DSH_HOME>/storages/session_projcache/sessions/<sessionId>.json),并从侧栏即时移除该行(不刷新页面)。删除操作不可恢复。

子会话(fork 与 subagent)会级联删除。若会话有「开着的回合」(正在运行中的请求),或其子会话有开着的回合,删除请求会被拒绝,不做任何改动。

工作区与未分组会话管理面板

侧栏底部(设置旁)常显「管理工作区与会话」入口。面板按工作区列出会话,按目录列出未分组会话,每行右侧可单独删除;未分组的目录旁可「注册为工作区」。

工作区删除沿用官方语义:只注销工作区登记,文件夹与会话全部保留,其会话落到「未分组」。

面板只列出磁盘上仍有日志的会话:删除后立即从面板消失;若有宿主内存中残留的幽灵会话,面板底部会提示「重启 dsh 后宿主会释放它们」。

每行可辨识信息

  • 标题取真正持久化的会话标题(无标题显示「未命名会话」,不再回退成目录名)。
  • 副行显示短 id + 本地时间。
  • 徽标区分「当前打开 / 运行中 / 子代理 / 空会话」。
  • 子代理与 fork 子会话嵌在父会话下面,父行标出「含 N 条子会话」。

定时清理未分组会话(默认关闭)

默认关闭,需在插件配置中启用。每天(默认 12:25)自动删除不在任何工作区目录下的会话;有开着的回合的会话会被跳过。

配置示例:

{
  "enabled": true,
  "time": "12:25",
  "workspaceScope": "tree"
}
  • enabled:只有严格为 true 时生效。
  • time:本机时区的 HH:MM,默认 12:25。非法值(如 24:00、12:60)会使整条配置无效,保持关闭。
  • workspaceScope:tree(默认)把 cwd 在工作区路径之下(含等于)的会话算已分组;exact 只认路径本身。

安装与启用

已发布在 npm,包名为 dsh-sidebar-delete。在 Harness Desktop / Web 中:设置 → 插件,安装此包。插件管理器会从 npm 拉取并写入 profile 的 dsh.profile.bundles。

命令行安装(CLI 管理的 profile):

dsh plugin --profile <profile> add dsh-sidebar-delete

安装后需重启 dsh:Host 半只在启动时加载,改它必须重启;只改浏览器半刷新页面即可。

从本地目录安装(开发用):

dsh plugin --profile <profile> add /绝对路径

兼容性

在 dsh 0.2.1-rc.2(@deepseek-ai/dsh-client-ui-workspace@0.2.1-rc.2)上开发与实测,需要 Node ≥ 22.19。

插件依赖两件框架没有公开承诺的东西:会话日志的磁盘布局、以及 api-session/removed 事件。dsh 升级后可能失效;失效时只影响删除本身,不影响侧栏其它功能。

安全边界

Host 半发布两条路由:

  • POST /dsh-sidebar-delete/session:删除会话
  • POST /dsh-sidebar-delete/sessions:只读探测哪些会话仍有日志(最多 512 个 id,不删文件、不广播)

两条路由共用准入顺序:

  1. 仅 POST + application/json,body 上限 64 KiB。
  2. 若宿主提供 connection.requestRejection 且部署接受非 loopback authority,由宿主门禁裁决。
  3. 否则退回插件自己的围栏:Host 必须是 loopback,Origin 存在时须与 Host 同源。

已知弱点:在 loopback-only 的 Desktop 部署上,这条路由不校验宿主登录。因此在该部署上任何本机进程都能调用它——对单用户机器不构成提权,但多用户机器上是真实弱点。

插件不往 document.body 写 DOM、不读别的插件的 DOM、不 require 任何 Harness Client 包。

已知限制

  • 归档集合在启动时不会自动剪掉已不存在的 id(工作区成员会)。插件在删除时会清掉两者;若会话是在别的进程或外部被删的,登记仍在——对那个 id 再发一次删除请求即可(幂等)。
  • 侧栏里有标题的幽灵会话在页面重载后仍可能回到侧栏:宿主的 session/list 会并入内存中尚未释放的 live 会话,而框架没有公开的释放 API。重启 dsh 后宿主释放会话,侧栏才会干净。
  • 会话目录删除后,它所在的项目目录(--<cwd>--)会留下空壳,与框架自身行为一致。
  • 没有批量删除,一次一条;也没有给模型提供 tool。

卸载

在插件管理器中移除 dsh-sidebar-delete(或从 profile 的 dsh.profile.bundles 移除)后重启。包目录可以留着。

开发与发布

Node 版本要求 >=22.19.0。验证脚本:

npm run verify

目录结构:

  • index.js:Host 半
  • client.js:浏览器半(Module Loader 包,无构建)
  • src/:纯逻辑,可单测
  • test/:测试文件
  • locale/:国际化文件
  • icon.svg:图标

适用场景与注意

适合需要清理已关闭会话、管理大量工作区与未分组会话的 dsh 用户。插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。已删除的会话日志不会回来,这是本功能的语义。

总结

dsh-sidebar-delete 在侧栏补上了「真删」能力,让清理会话日志、管理工作区变得可见且可控。零运行时依赖,安装简单,配置灵活。

  • 目录页:https://www.skillhub.cn/plugins/xqh-jason/dsh-sidebar-delete
  • GitHub:https://github.com/xqh-jason/dsh-sidebar-delete
  • npm:https://www.npmjs.com/package/dsh-sidebar-delete
羽毛球分组比赛记分
小程序二维码

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

小夜