dsh-web-notify:給 DSH Web GUI 加上審批與異常提醒

前言

用 DSH Web GUI 跑長任務時,人通常不會一直盯着頁面:切去別的標籤頁寫代碼、看文檔,讓任務在後臺推進。問題出在會話需要人介入的時刻——待審批、計劃審批、模型提問到達時,頁面本身是靜默的,任務就停在原地,直到有人切回去才發現。

dsh-web-notify 解決的就是這個注意力斷層。它是掛在 web profile 上的客戶端插件:待處理交互到達時,通過提示音、標籤頁標題與 Favicon 徽標、OS 通知、PWA 任務欄徽標、通知中心 Dock 多通道提醒;會話完成、任務失敗、掉線重連、模型/工具運行異常(429 配額等)也有對應提醒。DeepSeek Harness 的理念是「一切皆插件」,dsh-web-notify 就是這種形態下的一個典型實現。下面按功能、安裝、配置、調試的順序介紹。

這是什麼

先交代基本信息。dsh-web-notify 由 renpengfei1027 維護,MIT 許可證,當前版本 0.1.5。純插件形態:host 半(lib/index.js)+ client 半(lib/client.js,loader 格式),通過 profile patch 掛載進 dsh web。依賴方面,運行時依賴 @deepseek-ai/schemastery ^3.18.1,peer 依賴 @deepseek-ai/cordis@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-settingsreact

待審批 / 計劃審批 / 提問到達

這是插件的主場景。任意會話出現 pendingInteraction 即觸發,共六個通道:

1、提示音:WebAudio 合成的 E5-G5-B5 三連音;
2、標籤頁標題徽標:用 MutationObserver 對抗 shell 的標題寫入,保證徽標不被沖掉;
3、標籤頁 Favicon:32×32 徽章;
4、OS 通知:按會話 tag 去重,點擊跳轉對應會話並聚焦窗口,approval 類型用 requireInteraction 持久顯示;
5、PWA 任務欄徽標:通過 navigator.setAppBadge 在任務欄/應用圖標上顯示數字;
6、通知中心 Dock:右下角 FAB 即時計數,展開面板列出全部待處理項。

兩個設計細節值得單獨說明。

一是當前會話降級:頁面可見且新審批屬於當前打開的會話時,提示音與 OS 通知靜默,只保留視覺通道——眼睛就在這個會話上,聲音反而多餘;其餘情況全通道照常。

二是去重:同一 (會話, kind) 在冷卻期內不重複報警,冷卻時長由 cooldownMs 控制,默認 5s。

完成、失敗與運行異常提醒

除審批外,插件還覆蓋四類事件:

1、會話/子代理完成:完成 toast 卡片 + 輕單音 + 可選 OS 通知;頁面隱藏時看不到 toast,改用標籤頁標題脈衝 + PWA 角標 + 提示音 + OS 通知。
2、任務失敗:job 狀態爲 failed / killed,或 completed 但 detail 非空且非 exit code: 0 時,彈 error 變體 toast + 提示音 + 可選 OS 通知;按 job 註冊號只報一次。
3、模型/工具運行異常:捕獲 llm/retry(429 配額/限流)、turn/enderror / max-tokens / interruptedtool/resulterror / isError,彈 error 變體 toast(錯誤原文截 240 字符)+ 提示音 + 可選 OS 通知。
4、掉線/重連:斷線持續超過 connectionAlertAfterMs(默認 10s)時報 warning toast + 提示音,恢復時報輕 toast + 完成單音;快速閃斷不報。

子代理的覆蓋與邊界

檢測管道覆蓋全部會話行,含子代理。邊界需要說清楚:按當前 DSH 的委派語義,被委派的子代理不會產生待審批/提問,因此不會有子代理的待處理條目出現;但子代理的完成、失敗、異常提醒照常生效,不會漏。

安裝與啓用

前提條件

  • Node.js >= 22;
  • pnpm:dsh plugin 內部用 pnpm 裝依賴,先執行 npm install -g pnpm
  • dsh CLI:未全局安裝時,所有 dsh 命令加前綴 npx @deepseek-ai/dsh,例如 npx @deepseek-ai/dsh plugin --profile web add dsh-web-notify

兩種安裝方式

npm 一鍵掛載:

dsh plugin --profile web add dsh-web-notify

DeepSeek Harness 當前處於開發預覽快速迭代期,README 推薦以 link: 開發調試模式掛載本地倉庫:

git clone https://github.com/renpengfei1027/dsh-web-notify.git
cd dsh-web-notify
npm install
npm run build
dsh plugin --profile web add link:$(pwd)
# Windows PowerShell: dsh plugin --profile web add link:$PWD.Path

安裝完成後重啓 dsh web,設置頁「插件配置」下會出現「通知」卡片。

放行設置命名空間

DSH 官方把 settings 白名單(WEB_SETTINGS_NAMESPACES)硬編碼在包裏,暫不開放插件注入,所以需要運行倉庫自帶的 patch 腳本,把 notifications 注入白名單:

node scripts/patch-apiproxy.mjs

腳本冪等,重跑安全;dsh 升級後需重跑一次。

沙箱環境注意事項

1、TRAE、Cursor 等 AI 編碼工具的沙箱通常阻止寫入 ~/.dsh/,而 dsh plugindsh web 都要寫 profile 文件,這兩類命令必須在 AI 工具外部的普通終端執行;
2、切勿手動 npm install~/.dsh/profiles/web/node_modules/:這會繞過 dsh plugin 的依賴鏈接邏輯,導致 settings 服務不可達、命名空間註冊靜默失敗。安裝一律走 dsh plugin --profile web add

配置與常用調法

經過上面的步驟,插件已經掛進 web profile 並隨 dsh web 重啓生效。設置卡片位於 DSH Web 設置頁「插件配置」→「通知」,120ms debounce 熱重配,改完即生效,不需要重啓。OS 通知權限在首次觸發後的下一個用戶手勢時請求 Notification 權限。

幾個常用的調法:

  • 只要審批提醒,其餘關掉:completion=falseconnection=falsejobFailure=falseagentError=false
  • 夜間免打擾:quiet.enabled=truequiet.start=22:00quiet.end=09:00,免打擾只靜音,視覺通道照常;
  • 嫌系統通知彈窗吵:notify=false,保留 badge=truedock=true

調試與診斷

插件提供 on-device diagnostics。在 DSH Web 頁面打開 DevTools 控制檯,觀察 window.__NOTIFICATIONS__

__NOTIFICATIONS__.applied
__NOTIFICATIONS__.cardRegistered
__NOTIFICATIONS__.feedCounters
__NOTIFICATIONS__.hostStatuses
__NOTIFICATIONS__.jobSamples

其中 appliedcardRegistered 反映插件與設置卡片的掛載狀態,feedCounters 是各類事件的計數。不想真等一次審批來驗證效果,可以調 demo() / demoSound() 一鍵測試 UI 與音頻。

適用場景與注意事項

適合的人:把 DSH 會話掛後臺跑、需要及時響應審批與提問的人;多會話並行、希望在一個面板裏統一看待辦的人;裝了 PWA、想在任務欄直接看到待辦數的人。

注意事項:

1、插件以當前 dsh 進程的權限運行,安裝前建議先讀一遍源碼與許可證(MIT)再決定;
2、DSH 處於開發預覽快速迭代期,dsh 升級後記得重跑 node scripts/patch-apiproxy.mjs
3、安裝與重啓命令在普通終端執行,不要在 AI 工具沙箱裏跑。

結尾

回顧一下:dsh-web-notify 把 DSH Web GUI 的「等人回來看」變成「主動來叫人」——審批、提問、完成、失敗、掉線、429 都在該出現的位置提醒,通道、音量、免打擾都能按需開關,配置熱重配、診斷內置,裝起來成本不高。

  • 社區插件目錄頁:https://www.skillhub.cn/plugins/renpengfei1027/dsh-web-notify
  • GitHub 倉庫:https://github.com/renpengfei1027/dsh-web-notify
羽毛球分组比赛记分
小程序二维码

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

小夜