dsh-ai-worker:DSH Web 界面右下角的会话状态像素挂件

前言

在 DeepSeek Harness(DSH)里跑智能体会话时,界面侧栏和消息流能反映进度,但缺少一个始终可见、且与「当前主会话」绑定的轻量反馈。若只靠扫日志或等通知,很难一眼区分「在推理」「在跑工具」「在等你点确认」还是已经收工。

下面介绍的 dsh-ai-worker(仓库 jiang-yang/dsh-ai-worker)是维护者 jiang-yang 发布的纯客户端 DSH 插件:在 Web 界面右下角挂一个像素风「AI 打工人」悬浮挂件,动作随当前会话状态切换,并在任务完成时撒花、统计「今日完成」件数。它不替代 DSH 自带 UI,也不发起额外网络请求。

这是什么

  • 定位:挂在 DSH Web shell 的 shell.overlay 插槽上的悬浮小部件,不是独立网页,也不是 iframe。
  • 维护与许可:GitHub 仓库 jiang-yang/dsh-ai-worker,package.json 标明版本 0.2.1、许可证 MIT。
  • 运行环境:engines.dsh 为 >=0.1.0-rc.6 <0.2.0-0 || >=0.2.0-rc.0 <0.3.0-0,engines.node 为 >=20。插件以当前 DSH 进程及其浏览器端加载方式运行;安装前建议通读源码并确认许可证与权限边界。

社区插件目录页:https://www.skillhub.cn/plugins/jiang-yang/dsh-ai-worker(SkillHub 为社区目录站点,与 DeepSeek / 幻方无官方从属关系)。

核心功能

视觉与实现方式

  • 图形全部由 DOM + CSS 关键帧 绘制:无外部图片、无 CDN、无网络请求、无额外 npm 依赖(除 DSH 宿主提供的 UI peer)。
  • 颜色读取 DSH 主题变量 --dsw-*,随浅色 / 深色主题自动适配。
  • 可拖动、可折叠成小头像、可关闭;关闭 / 折叠 / 位置 / 今日完成数写入浏览器 localStorage,刷新或重启 DSH 后仍保留(换浏览器或清缓存会重置)。

五种显示状态(由会话数据推导,非随机动画)

显示 触发条件
等待确认 useSessionStatus 中当前会话的 pendingInteraction 非空
敲代码中 当前会话 running,且行内 updatedAt(或本轮开始时间)在 2 秒内
思考中 当前会话 running,但已安静超过 2 秒(常见于推理阶段)
完成任务 会话从 running 变为非 running 的那次跳变(计数 +1,撒花约 7 秒)
摸鱼中 空闲且超过 45 秒无动静
待命中 未选中任何会话

「当前会话」优先取 useSessions 快照里 byId 中 retainedBy.mainView > 0 的行(与 DSH 侧边栏找主会话一致);无该字段时退回 current,再退回「列表里只有一个会话」。

数据来源为两个 slot 标准属性:

  • useSessions:会话列表快照 { ids, byId, phase, projectionsBySession };
  • useSessionStatus:实时状态表 Map<sessionId, { running, pendingInteraction, completionUnread }>,由宿主经 api-session/status 推送,是会话进行中变化的主要状态源。

交互

  1. 拖动:按住标题栏拖动;聚焦标题栏后可用方向键(Shift 加大步长)。
  2. 撒花:任务完成自动播放;点击挂件本体或聚焦后按 Enter / 空格可再放一次(纯动画,不计入「今日完成」)。
  3. 折叠:标题栏 — 或 Esc → 右下角小头像(角标为今日完成数);点小头像展开。
  4. 关闭:点 ✕,下次打开 DSH 默认不再出现。
  5. 重新打开:清除 localStorage 键 dsh.aiWorker.closed.v1 后刷新,或在浏览器控制台执行:
localStorage.removeItem('dsh.aiWorker.closed.v1')

安装与启用

插件按 DSH 规范打包:自带 cordis.patch.yml,通过 package.json 的 dsh.bundle.patch 在安装进 profile 时自动登记 id: ai-worker,无需手工改 profile 的 cordis.patch.yml。README 说明从 0.2.0 起不再使用「复制目录 + 手工登记」的老办法,以免重复 id 导致 DSH 拒绝加载。

在已克隆或解压的插件目录内执行(命令来自仓库 README,勿凭插件名拼接 github:owner/repo):

cd plugins/dsh-ai-worker
bash install.sh    # 默认装进 web profile(认 DSH_PROFILE / DSH_BIN)

桌面版 DSH 可指定 profile:

DSH_PROFILE=desktop bash install.sh

卸载:

bash uninstall.sh

install.sh 本质是对官方 CLI 的包装,例如:

dsh plugin --profile desktop add "$(pwd)"

装包后 DSH 扫描 dsh.client 声明,将 lib/client.js 下发浏览器;apply(ctx) 把挂件注册进 shell.overlay。

若自行改源码,需先构建再刷新页面:

node build.mjs     # 重新生成 lib/client.js
node verify.mjs    # 离线自检(无需浏览器)

典型用法

  1. 按上一节在目标 profile 执行 bash install.sh,重启或刷新 DSH Web 界面。
  2. 打开或选中一个主会话,观察右下角挂件随 running / pendingInteraction 等在「思考中」「敲代码中」「等待确认」等之间切换。
  3. 等会话从运行中结束,应看到完成任务动画与「今日完成 N 件」递增;跨天计数自动归零。
  4. 需要收纳界面时折叠为小头像;长期不用可关闭,并按上文清除 dsh.aiWorker.closed.v1 恢复。

开发或验收时可运行 node verify.mjs,在无浏览器环境下模拟加载并跑通各状态(README 中截图即同一份 lib/client.js 在无头 Chrome 中的渲染结果)。

适用场景与注意

适合谁

  • 经常在 DSH Web 里长时间盯会话、希望用固定角落反馈区分「在等确认」与「在安静推理」的开发者。
  • 希望零额外网络与图片依赖、仅增强 shell overlay 的用户。

边界与限制

  • 仅 DSH Web 界面;终端 TUI 没有 shell.overlay 插槽,插件不会出现。
  • 「思考中 / 敲代码中」依赖会话行活跃度启发式(2 秒阈值),不是模型内部状态的精确映射。
  • 0.2.1 起改用宿主提供的 useSessionStatus;更早版本若依赖不存在的 API,挂件可能一直停在「待命中」。
  • 折叠、关闭、位置、计数均在本机浏览器 localStorage,与 DSH 服务端配置无关。

安装插件等同于让 DSH 加载其声明的客户端 bundle;请在信任维护者与 MIT 许可的前提下自行审阅 源码(核心逻辑在 src/client/ai-worker.js)。

结尾

dsh-ai-worker 把「当前主会话在干什么」收成右下角像素小人的几种动作,并用 localStorage 记住你的布局与今日完成数,适合作为 DSH Web 上的轻量状态 companion。目录与源码:

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

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

Xiaoye