dsh-session-hud:用桌宠角标汇总 DSH 会话状态

前言

DeepSeek Harness(DSH)里常会同时开着多个会话:有的在跑任务,有的在后台跑完但你还没点开,还有的停在授权、计划审查或提问上等你点选。侧栏能逐行看状态,但当你把注意力放在当前对话区时,很容易漏掉「别处还在跑」或「有会话在等你」。

下面介绍社区客户端插件 dsh-session-hud(维护者 ShiMarin233):在界面右下角放一只可拖拽的桌宠,用三个实时数字概括主会话层面的「在跑 / 完成未读 / 等你选」,点数字即可跳转;同类多个会话时连续点击同一行会依次轮换目标。

这是什么

dsh-session-hud 是面向 DSH Web 客户端的纯前端插件:零 npm 运行时依赖,无宿主侧逻辑,客户端逻辑打包在自包含的 lib/client.js 中(宠物动画以内联 base64 形式打进 bundle)。package.json 中声明通过 cordis.patch.yml 注入客户端,并依赖官方包 @deepseek-ai/dsh-client-ui-session 提供的会话状态面。

分类为客户端;在 Skillhub 社区目录 可检索到该插件(页面标注可安装,展示版本 v0.1.0)。源码与说明见 GitHub 仓库,许可证 MIT。

核心功能

右下角桌宠与三行计数

单击桌宠展开气泡,三行数字彼此独立,多状态并存时不会互相「盖住」:

  1. 进行中:当前有多少主会话处于运行态(含其直接子代理仍在跑的情况)。
  2. 完成未读:后台跑完、你尚未通过主视图打开过的主会话数量。
  3. 待你选择:需要你交互的会话数量;pendingInteraction.kind 与活动面板口径一致,分为 approval(待确认授权)、plan-review(待审查计划)、question(待回答问题)。气泡可附带按 kind 的明细,例如「1 确认 · 1 提问」。

单击任意一行会调用 uiWorkspace.openSession(id) 跳到对应会话。同一类下若有多个会话,连续单击同一行会在该组内轮换;界面会提示类似「2/3,再点下一个」。

角标只显示一位汇总数字(超过 9 显示 9+);宠物动画按状态在空闲、忙碌、等待、庆祝等情绪间切换,拖拽时有单独反馈动画。

数据从哪来(事件驱动、无轮询)

数字全部来自 DSH 原生客户端服务,订阅变更后更新,不做定时轮询:

计数 主要来源 判定要点
进行中 uiSession.sessionStatus + sessions.list.projectionsBySession 主会话 running === true,或其直接子代理中仍有 running(与官方侧栏 runningSubagentCount 同口径)
完成未读 uiSession.sessionStatus 仅主会话 completionUnread === true;子代理跑完不计入
待你选择 uiSession.sessionStatus 主会话自身有 pendingInteraction,或其直接子代理持有 pending(v0.6.0 起;与侧栏展示有意分叉,见下文)

sessionStatus.getSnapshot() 返回 Map<sessionId, { running, pendingInteraction, completionUnread }>,是 DSH 0.2.0 起的统一会话状态面。列表标题与排序用 sessions.list,归档过滤用 workspaces.list。

统计范围:只计侧栏意义上的主会话行,排除 origin === "subagent"、blank 以及已归档会话,与官方侧栏及活动面板一致。只聚合直接子级:孙辈子代理计入其父会话行,不会额外算到祖父会话上。

与侧栏的一处刻意差异:侧栏行上的 pending 只看该会话自身;桌宠在「待你选择」里还会把直接子代理的 pending 算进来。原因是子代理卡在提问或审批时,侧栏往往只显示「子智能体运行中」,看不出在等你操作。子代理跑完仍不算「完成未读」,与官方 UI 一致。

若 projectionsBySession 缺失或结构异常,进行中与子代理相关逻辑会安全退化为 0,不抛异常打断渲染。宿主过旧、没有 sessionStatus 时,会退化到仅读会话摘要的 running,此时「待你选择」可能为 0。

扩展接口(可选)

其它脚本或插件可向气泡追加内容:

window.__dshSessionHud.registerBubbleSource({
  id: 'schedule',
  order: 100,
  getLines: (state) => [
    { icon: '', text: '14:00 组会', sub: '会议室 A' }
  ]
})

常用调试与 API:window.__dshSessionHud.open(sessionId)、refresh()、show(true/false);打开调试日志:

localStorage.setItem('dsh-session-hud:debug', '1')

桌宠位置保存在 localStorage 键 dsh-session-hud:prefs。

安装与启用

Skillhub 目录页将本插件标为可安装(展示 v0.1.0)。仓库 README 未单独给出 CLI 安装命令,安装时请以目录页指引为准,或在 DSH 客户端内走第三方插件安装流程:

  1. 打开左侧 插件,选择 添加插件(或箭头菜单中的安装第三方插件入口)。
  2. 按你环境支持的方式添加包名为 dsh-session-hud 的插件(例如目录提供的规格、或已下载到本地的插件目录)。
  3. 安装后 立即启用;若提示重启 DSH,完全退出后重新启动,以便加载客户端 bundle。

插件以当前 DSH 进程与已登录用户的客户端权限运行;安装前建议阅读 GitHub 源码 与 MIT 许可证,以及 NOTICE.md 中的第三方素材声明(宠物动画来自 dsh-pet,同样 MIT)。

典型用法

日常无需配置项:启用后桌宠默认在右下角。

  1. 扫一眼角标或展开气泡,确认「在跑 / 没看 / 等你选」各有多少。
  2. 需要处理时,单击对应数字行进入会话;多个同类会话时用连续单击轮换。
  3. 若你写了日程或其它气泡扩展,通过 registerBubbleSource 注册后,内容会出现在三行数字下方。

从手机或 Tailscale 访问 DSH 时,动画资源随客户端 bundle 内联下发,不依赖本机 127.0.0.1 回环静态路由,与 README 中说明的设计一致。

适用场景与注意

适合谁:同时维护多个 DSH 会话、依赖子代理并行、又希望在不盯着侧栏时仍能发现「后台跑完」或「子代理在等你点选」的开发者。

体积与性能:内联动图后客户端 bundle 约 4.8MB(README 给出的构建结果量级);逻辑侧零 npm 依赖。

边界:

  • sessionStatus 是进程本地投影;浏览器重连后,极端情况下数字可能短暂偏小,待宿主重放 pending 后恢复。
  • 气泡三行与侧栏单行状态文案并非一一对应:例如 pending 与「已完成」在侧栏会互斥展示时,桌宠可能两行同时非零,属于多展示维度而非统计错误。
  • 自行改逻辑需编辑 src/widget.js 后执行 node tools/build.mjs 生成 lib/client.js;不要直接改生成产物。

结尾

dsh-session-hud 把 DSH 原生 sessionStatus 与列表投影收成右下角三个可点击的数字,并补上子代理 pending 的可见性,适合作为多会话工作时的轻量 HUD。社区目录:Skillhub - dsh-session-hud;源码与详细状态矩阵:GitHub - ShiMarin233/dsh-session-hud。

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

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

Xiaoye