前言¶
用 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、幻方沒有官方從屬關係,僅作插件檢索用。