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