鯨吟(dsh-notify-whale):DSH 會話與待辦通知加固版

前言

用 DeepSeek Harness(DSH)跑長任務時,人往往不在電腦前。上游社區通知插件 dsh-task-notify 能覆蓋「任務結束推手機」的基本需求,但在 Node 22/24 上 HTTP 通道會靜默失敗,且審批、提問等人機交互卡點不會觸發推送。下面介紹維護者 Lon-dawn 發佈的加固 fork 鯨吟(npm 包名 dsh-notify-whale),分類爲聯網工具,在真實 DSH 上修掉已知必現問題並補等待類通知與設置面。

這是什麼

鯨吟是 DSH 的 Cordis 通知插件:會話結束時推送到本機或手機;卡在審批或等你回答時也會推。純 ESM(.mjs)、無構建步驟。

推送通道與平臺

端 方式
macOS 系統通知中心(osascript,零依賴)
Windows Toast(PowerShell + WinRT,含 PNG 圖標)
手機 Bark(iOS)、ntfy(Android/iOS)、Server醬、任意 Webhook

相對上游:修了哪些、加了哪些

5 個必現 bug(README 根因表)

  1. ntfy 中文標題報錯 Cannot convert argument to a ByteString:標題曾放進 X-Title,Node fetch/undici 要求 header 爲 Latin-1。→ 改用 ntfy 官方 JSON POST(body 含 topic,message,title,icon)。
  2. 所有 HTTP 通道發不出去:send() 未傳 method: "POST",httpPost 變成帶 body 的 GET,undici 拒絕。→ 顯式 POST。
  3. 正文永遠取不到會話標題:插件讀 agent.session.events,而 DSH Session 無 events 屬性;應使用 snapshotEvents()。→ 改 API 並改進兜底(剝 session- 前綴、優先 header.cwd 項目名)。
  4. 出錯或手動停止仍顯示「任務完成」:AgentStatus 僅 idle / running,結束原因需讀最後一條 turn/end 的 reason(時序:turn/end 早於 agent/status: idle)。
  5. 部分活躍會話的「完成」通知被丟棄:誤用 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
羽毛球分组比赛记分
小程序二维码

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

小夜