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/status 從 running 變爲 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 層,加上 canJoinAllSpaces 和 fullScreenAuxiliary,面板浮在所有應用窗口、所有 Space、全屏應用之上,帶「去處理 / 查看會話」按鈕。

決策型彈窗釘住

審批和提問屬於需要你做決策的事件,對應彈窗會釘住不放,直到你在網頁端回答或拒絕後才自動關閉。任務結束和出錯的彈窗則在 10 秒後自動消失,不會堆積。

手機同步提醒

電腦同時運行 dsh-remote bridge、手機 App 已連接時,插件可以把任務完成、需要你回答兩類 PC 彈窗推送到手機(v0.4 引入)。v0.5 補上了開關:總開關 bridgePush 加按類型開關 bridgePushKinds.done、bridgePushKinds.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、幻方沒有官方從屬關係,僅作插件檢索用。

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

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

小夜