dsh-notifier:DSH 的跨窗口任务提醒插件

前言

用 DSH 跑长任务时,注意力通常不在那一个窗口上。你切去编辑器写代码、切去浏览器查资料,任务可能已经结束,也可能卡在权限审批或 agent 的提问上——等你切回来,才发现早就该处理了。

Codex 和 Claude Code 的用户对这个问题有熟悉的解法:Hook 通知,事件发生时在系统层面弹提醒,切到任何窗口都能看到。dsh-notifier 做的就是把这套体验搬进 DSH。DSH 的理念是「一切皆插件」,提醒这件事正好适合由插件来补。

这是什么

dsh-notifier 是一个 DSH 任务提醒插件,由 nanami-0713 维护,开源在 GitHub(仓库 nanami-0713/dsh-notifier),npm 包名为 @hsinsekai-nanami/dsh-notifier——两个名字不一致,搜索时需要留意。当前版本 0.5.0,MIT 许可证。

它监听四类事件,走「事件 → Hook → 系统提醒」的链路,与 Claude Code 的 Notification Hook 同构:

  • 任务结束:agent/statusrunning 变为 idle
  • 权限审批:approval/requested
  • 用户提问:ask_user_question
  • 任务出错:agent/error

提醒分三层:DSH 网页内的 toast、系统通知中心横幅、跨窗口悬浮面板。决策类事件(审批、提问)通过钉住的弹窗等你处理,其余事件提醒后自动消失。

核心功能

三层提醒渠道

网页内 toast:DSH 网页右下角的深色通知卡片,带提示音,用 React portal 挂在 document.body 上,保证浮在页面其他元素之上。

系统通知中心横幅:macOS 走 osascript,Linux 走 notify-send,Windows 走系统气泡,可在设置中关闭。

跨窗口悬浮面板(默认开启):macOS 上使用内置 Swift notifier,基于 NSPanel.floating 层,加上 canJoinAllSpacesfullScreenAuxiliary,面板浮在所有应用窗口、所有 Space、全屏应用之上,带「去处理 / 查看会话」按钮。

决策型弹窗钉住

审批和提问属于需要你做决策的事件,对应弹窗会钉住不放,直到你在网页端回答或拒绝后才自动关闭。任务结束和出错的弹窗则在 10 秒后自动消失,不会堆积。

手机同步提醒

电脑同时运行 dsh-remote bridge、手机 App 已连接时,插件可以把任务完成、需要你回答两类 PC 弹窗推送到手机(v0.4 引入)。v0.5 补上了开关:总开关 bridgePush 加按类型开关 bridgePushKinds.donebridgePushKinds.question,手机 App 侧也有独立的接收开关,两端互不干扰。

这条链路有明确边界:只转发 done(任务完成)与 question(需要你回答)两类,审批和错误暂不转发;bridge 走局域网,没有公网系统级推送通道,手机 App 未打开或进程被杀时无法送达。

设置页可视化配置

v0.3 起,DSH 左下角「设置 → 提醒通知」提供可视化配置:内置 4 套预设(default / top-light / focus / native-only),可调 toast 位置、主题、宽度、圆角、停留时长、提示音、同屏数量与系统级开关。修改实时生效,并保存到 ~/.dsh/plugins/dsh-notifier/config.json

配置也支持同源 API 读写:

GET/PUT /api/dsh-notifier/config

安装与启用

三种方式任选其一,装完执行 dsh web 启动或重启后生效。

方式一:npm 安装(推荐)

dsh plugin --profile web add @hsinsekai-nanami/dsh-notifier@0.5.0
dsh web   # 启动或重启后生效

方式二:GitHub Release 安装

先到仓库 Releases 页下载 hsinsekai-nanami-dsh-notifier-<版本>.tgz,然后直接装 tgz,无需解压:

dsh plugin --profile web add ./hsinsekai-nanami-dsh-notifier-<版本>.tgz

方式三:源码构建安装

git clone https://github.com/nanami-0713/dsh-notifier.git
cd dsh-notifier
npm install
npm run build:all
dsh plugin --profile web add .

典型用法

装好后先做一遍验证,再做日常使用。

确认提醒出现

打开 DSH 网页,左下角进入「设置 → 提醒通知」,切换预设或修改字段,改动实时生效。之后跑一次任务,观察 toast 与系统提醒是否按预期出现。

跑一遍 E2E 验收

仓库自带事件级 E2E 脚本:

node scripts/e2e-done.mjs       # 任务结束
node scripts/e2e-approval.mjs   # 权限审批:面板钉住,处理完自动关闭
node scripts/e2e-question.mjs   # 用户提问
node scripts/ui-test.mjs        # Headless Chrome 全链路截图

经过上面的步骤,任务结束、审批、提问三类事件的提醒链路和网页 UI 都能确认到位。

验证悬浮面板在最上层(macOS)

macOS 上可以用 CoreGraphics 窗口枚举确认面板确实浮在屏幕上,kCGWindowLayer == 3.floating 层:

swiftc scripts/winlist.swift -o /tmp/winlist && /tmp/winlist

关闭系统级弹窗

如果只想要网页内的 toast 和通知中心横幅,可以在设置里关闭系统级弹窗,或把插件配置中的 floating 设为 false

平台差异与限制

网页内 toast 不依赖平台能力;跨窗口系统弹窗按平台选择不同实现:

  • macOS:内置 Swift notifier 悬浮卡片。首次使用需要 Xcode Command Line Tools(swiftc),首次触发时自动编译并缓存到 ~/.dsh/plugins/dsh-notifier/DSHNotifier;没有 swiftc 时自动回退到 osascript display dialog / notification
  • Windows:使用系统自带的 PowerShell 加 WScript.Shell.Popup,无额外依赖;弹窗为系统对话框样式,不可自定义。
  • Linux:需要安装 zenity;没有 zenity 时退化为 notify-send 横幅;弹窗同样为系统对话框样式。

需要说明:README 自述 Windows 与 Linux 的跨窗口弹窗未在真机验证,macOS 是经过真机验收的平台。在其他平台使用遇到问题,可向仓库提 issue。

适用场景与注意事项

dsh-notifier 适合这些场景:长时间挂任务、会在多个窗口或桌面间切换的人;离开工位后想用手机跟进任务进度、需要配合 dsh-remote 的人;不满足于只盯着 DSH 网页等结果的人。

安装和使用前注意三点:

1、插件以当前 dsh 进程权限运行,安装前建议先检查插件源码与许可证(本项目为 MIT)。
2、npm 包名 @hsinsekai-nanami/dsh-notifier 与 GitHub 仓库名 nanami-0713/dsh-notifier 不一致,别当成两个项目。
3、macOS 的跨窗口悬浮面板是主体验证过的实现,Windows / Linux 的对应弹窗未经真机验证,生产环境使用前先自行测试。

小结

回顾一下:dsh-notifier 监听任务结束、审批、提问、出错四类事件,用网页 toast、系统通知中心横幅、跨窗口悬浮面板三层渠道提醒你;决策型弹窗钉住直到你处理,任务结束 10 秒自动消失;配合 dsh-remote 还能推送到手机;配置全部可视化,实时生效。

  • 插件目录页:https://www.skillhub.cn/plugins/nanami-0713/dsh-notifier
  • GitHub 仓库:https://github.com/nanami-0713/dsh-notifier

其中目录页是社区维护的独立站点,与 DeepSeek、幻方没有官方从属关系,仅作插件检索用。

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

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

Xiaoye