qgx1992/dsh-notify:DSH 通知显示层插件

前言

DeepSeek Harness (DSH) 的通知机制由桌面壳处理。若桌面壳未响应或处于开发环境,通知可能无法在页面内可见。dsh-notify 插件提供了 web 侧的通知显示层,通过订阅桌面壳的 __dshExo 桥接事件来渲染全局 toast 栈,并支持点击程序化激活会话。

安装

使用以下命令安装插件:

dsh plugin --profile web add github:qgx1992/dsh-notify

安装后需要重启 web 进程才能生效:

dsh web 重启

页面刷新即可加载 /plugins/dsh-notify/client.js。

核心功能

本插件提供以下能力:

  1. 全局右上角 toast 栈:在页面右上角显示通知列表,同屏上限 5 条,超出时淘汰最旧的通知。
  2. 订阅桌面壳桥事件:默认订阅 window.__dshExo 桥事件,包括对话完成、服务事件、更新就绪等。
  3. 程序化激活会话:点击 toast 时,通过 ctx.sessions.open(id) 调用官方 runtime API 激活会话,替代对 DOM 的 hack 操作。
  4. 无壳降级模式:当检测不到桌面壳(如直接用浏览器打开 web 页面)时,自动降级订阅 sessions store,自绘轮次完成 toast。
  5. 分级显示:根据通知类型(信息/成功/错误/警告)显示不同的样式和左侧竖色条。
  6. 自动关闭策略:根据类型自动关闭,信息 8s、成功 6s、错误与更新 15s、警告 12s。
  7. 自建容器:使用自建的 fixed 容器渲染,不搬动 DSH slot 节点,避免渲染卡死。
  8. 国际化:支持 zh 和 en 语言。

架构与工作流

插件运行在两种互斥的数据源模式:

壳桥模式(默认)

桌面壳通过 __dshExo 桥接器向页面投递通知事件。插件检测到桥存在后进行握手,订阅 onEvent 回调,渲染 toast 栈。点击 toast 后调用 ctx.sessions.open(id) 激活会话。

无壳降级模式

当页面直接运行在浏览器中,没有 window.__dshExo 时,插件订阅 ctx.sessions.list,检测会话状态变化(如从 running 到 idle),自绘完成 toast。

桥契约

插件仅消费 window.__dshExo 的最小白名单 API,不依赖任意 IPC:

interface DshExoBridge {
  /** 订阅壳推送的通知事件,返回取消函数 */
  onEvent(cb: (ev: NotificationEvent) => void): () => void
  /** 页面 → 壳:点击 / 已读回执 */
  send(channel: 'notify:click' | 'notify:seen', payload: { id: string; sessionId?: string }): void
  /** 页面 → 壳:握手 */
  ready(): void
  /** 壳版本探针 */
  appInfo(): { version: string }
}

事件类型包括:session-done(对话完成)、service-ready(服务就绪)、service-error(服务异常)、service-restarting(服务重启)、update-ready(更新就绪)。

行为细节

  • 点击激活:点击 toast 会调用 ctx.sessions.open(id)。插件会校验会话 ID 是否在列表中,若 unknown id 会报错;若会话处于 pending 状态,每 500ms 重试至多 4 次。
  • 已读回执:事件渲染即触发 notify:seen 回传给壳侧。
  • 样式与主题:toast 样式使用 DSH 主题变量,自动适配亮/暗色模式。
  • 异常处理:所有异常均通过 try/catch 静默降级,不向壳或页面抛出。

注意事项

  • 本地分发:该插件默认不发布 npm 也不上传 GitHub,仅通过 dsh plugin --profile web add link:<本地路径> 安装。
  • 供应链策略:新发布 <24 小时内可能因 pnpm 供应链策略报错,需将版本加入 minimumReleaseAgeExclude 白名单。
  • 本地开发:本地开发时,由于项目路径可能含空格或中文,需使用无空格的 Junction 指向真实目录,否则 link: 命令会失效。
  • 源码修改:开发时修改 lib/client.js 后需运行语法检查,然后刷新页面即可生效。
羽毛球分组比赛记分
小程序二维码

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

小夜