前言¶
用 DeepSeek Harness(DSH)跑長任務時,人往往不在電腦前。上游社區通知插件 dsh-task-notify 能覆蓋「任務結束推手機」的基本需求,但在 Node 22/24 上 HTTP 通道會靜默失敗,且審批、提問等人機交互卡點不會觸發推送。下面介紹維護者 Lon-dawn 發佈的加固 fork 鯨吟(npm 包名 dsh-notify-whale),分類爲聯網工具,在真實 DSH 上修掉已知必現問題並補等待類通知與設置面。
這是什麼¶
鯨吟是 DSH 的 Cordis 通知插件:會話結束時推送到本機或手機;卡在審批或等你回答時也會推。純 ESM(.mjs)、無構建步驟。
- 上游:
DeepseekHarnessPlugins/Notification(包名dsh-task-notify,MIT)。本 fork 保留原作者版權聲明,按 MIT 發佈。 - 維護者:Lon-dawn;倉庫 github.com/Lon-dawn/dsh-notify-whale;社區目錄 skillhub.cn/plugins/Lon-dawn/dsh-notify-whale。
- 當前 package 版本:0.5.0;Node 要求:
^22.19.0 || >=24。 - 代碼改動、測試與文檔由 AI 編程代理在 DSH 上完成,人類負責決策與發佈;README 寫明選擇本 fork 的價值在於「真跑過」而非功能堆疊。
推送通道與平臺¶
| 端 | 方式 |
|---|---|
| macOS | 系統通知中心(osascript,零依賴) |
| Windows | Toast(PowerShell + WinRT,含 PNG 圖標) |
| 手機 | Bark(iOS)、ntfy(Android/iOS)、Server醬、任意 Webhook |
相對上游:修了哪些、加了哪些¶
5 個必現 bug(README 根因表)¶
- ntfy 中文標題報錯
Cannot convert argument to a ByteString:標題曾放進X-Title,Node fetch/undici 要求 header 爲 Latin-1。→ 改用 ntfy 官方 JSON POST(body 含topic,message,title,icon)。 - 所有 HTTP 通道發不出去:
send()未傳method: "POST",httpPost變成帶 body 的 GET,undici 拒絕。→ 顯式 POST。 - 正文永遠取不到會話標題:插件讀
agent.session.events,而 DSHSession無events屬性;應使用snapshotEvents()。→ 改 API 並改進兜底(剝session-前綴、優先header.cwd項目名)。 - 出錯或手動停止仍顯示「任務完成」:
AgentStatus僅idle/running,結束原因需讀最後一條turn/end的 reason(時序:turn/end早於agent/status: idle)。 - 部分活躍會話的「完成」通知被丟棄:誤用
session.header.parentSession判子代理;刪除該判據,保留origin === 'subagent'與delegationDepth > 0。
另:Windows 上 paths.test.mjs 路徑斷言已隨平臺分隔符修正。上游測試在本 fork 爲 154 / 154 通過(README);npm test 說明爲 153 項單元測試。
新增能力(摘要)¶
- 等待人工介入時通知:監聽
session/event(不用 waterfall 的approval/request,避免 Web 橋接器先認領導致 bundles 末位插件輪不到)。approval/asked→「待批准」;工具ask_user_question→「待回答」。 - 事件級 Bark 鈴聲:全局
sound+ 按事件sounds覆蓋。 - DSH 0.1.7+ 原生設置頁:側邊欄一級菜單「通知」,寫入 profile 的
cordis.patch.yml,保存即生效、無需重啓(0.1.7 起不再有$DSH_HOME/settings.yaml)。 - Bark 推送分組
group:默認本機主機名(≤8 字符),多機共自建 Bark 時可區分來源。 - 9 種事件標題可在設置頁覆蓋;留空沿用內置文案。
通知對照(標題 / event / Bark 鈴聲等)見倉庫 README「通知對照表」;正文格式爲 <會話標題或項目名> · <事由> · HH:mm。
安裝與啓用¶
官方安裝命令(web profile):
dsh plugin --profile web add dsh-notify-whale
裝完後重啓 DSH。之後改配置在設置頁進行,立即生效、不必再重啓。
從本地目錄安裝:
dsh plugin --profile web add /path/to/dsh-notify-whale
pnpm 以 link: 接入時需在插件目錄單獨執行 npm install --omit=dev(否則可能缺 js-yaml 或 @deepseek-ai/schemastery)。若 pnpm 被 minimumReleaseAge 攔截,可在命令末尾加 --config.minimum-release-age=0。
配置要點¶
推薦:DSH 0.1.7+ 在側邊欄「通知」設置頁修改。
也可直接寫 profile 的 cordis.patch.yml(插件 id 仍爲 task-notify,name 爲 dsh-notify-whale)。示例片段:
- id: task-notify
name: dsh-notify-whale
config:
enabled: true
notifyOn: [idle, error, blocked]
agents: root
coalesceWindowMs: 2000
desktop:
enabled: off
sound: true
ntfy:
enabled: true
server: https://ntfy.sh
topic: "你的隨機主題名"
bark:
enabled: true
server: https://api.day.app
deviceKey: "你的BarkKey"
group: ""
sound: "fanfare"
優先級:cordis patch 顯式配置 > 環境變量 DSH_TASK_NOTIFY_* > 內置默認。公共 ntfy 上 topic 即密碼,勿用可猜名字。
典型用法:自測與驗證¶
向全部啓用通道發樣例通知:
node self-test.mjs
只測單個通道:
node self-test.mjs --channel ntfy
交互式改配置並當場測試:
npm run menu
倉庫內還可運行 npm test、npm run test:client;ntfy 收包可在服務端用 README 給出的 curl 輪詢 JSON 確認。
適用場景與注意¶
適合:長時間用 DSH 跑 Agent、需要手機/桌面在「完成 / 出錯 / 停止 / 待審批 / 待回答」時提醒的開發者。
務必知曉:
- 插件在當前 DSH 進程權限下運行;安裝前應閱讀源碼與 MIT LICENSE,自行評估 Webhook、Bark Key、ntfy topic 等憑據安全。
- DSH 社區目錄(如 SkillHub)爲獨立生態站點,與 DeepSeek / 幻方無官方從屬關係;插件非「官方應用商店」預裝項。
- 設置頁需 DSH 0.1.7+;更早版本可正常通知,但需手寫 patch。
- 自建 ntfy 若
deny-all,手機 App 須配訪問憑據;Bark 自定義鈴聲僅 iOS;self-test.mjs爲獨立進程讀磁盤配置,成功不代表運行中宿主已熱加載同一配置(README「已知邊界」)。
結尾¶
鯨吟在 upstream dsh-task-notify 骨架上,針對 Node 22/24 與 DSH 實際 API 做了可復現修復,並把「等人操作」納入通知鏈路,便於離開電腦時仍掌握會話狀態。進一步瞭解實現與事件契約見倉庫 SPEC.md。
- 目錄頁:https://www.skillhub.cn/plugins/Lon-dawn/dsh-notify-whale
- GitHub:https://github.com/Lon-dawn/dsh-notify-whale