dsh-notification:agent 完成一輪、報錯或等待批准時,主動通知你

前言

用 DSH 跑長任務是常態:發起一個任務,切去幹別的,回來才發現 agent 五分鐘前就跑完了——或者更糟,它一直卡在一個等待你批准的提示上,什麼都沒幹。問題不在於 agent 慢,而在於你沒有被及時叫回來。

dsh-notification 解決的就是這件事。它監聽 harness 自身的生命週期事件,在需要你注意的那一刻發出提醒。下面介紹它的功能、安裝與配置。

這是什麼

dsh-notification 是一個 DeepSeek Harness(DSH)插件,由 nishit130 維護,當前版本 0.1.1,MIT 許可證。一句話定位:當 agent 完成一輪、報錯或等待你的批准時,通過桌面、瀏覽器或 webhook 通知你,無需盯着標籤頁。

DSH 的理念是「一切皆插件」,通知這類外圍能力正適合以插件形式掛載,而不需要改動 harness 本身。

它監聽哪三類事件

1、Agent finished:agent/statusrunning 變爲 idle,且該輪時長 ≥ minTurnDurationMs 時觸發。默認開啓。
2、Agent error:監聽 agent/error,某一步或某一輪出錯時觸發。默認開啓。
3、Approval needed:監聽 approval/request 瀑布。插件只觀察(observe-only),始終以 next() 委託,不會替你做批准或拒絕的決定。默認開啓。

minTurnDurationMs 的作用是過濾:幾秒就結束的快速輪次不值得打擾,只有達到閾值的一輪才通知。

三個通知渠道,分別在哪裏觸發

先說清楚每個渠道在哪臺機器上觸發,這決定你該開哪個:

  • 桌面通知(desktop):零依賴。macOS 用 osascript,Linux 用 notify-send,Windows 用 PowerShell toast。在運行 dsh server 的機器上觸發,適合 dsh web 跑在自己機器上的情況。
  • 瀏覽器通知(browser):使用標準 Notification API,在查看 Web UI 的機器上觸發。默認僅在標籤頁隱藏時彈出——標籤頁可見說明你正在看。把 browserOnlyWhenHidden 設爲 false 可改變這一行爲。
  • Webhook(webhookUrl):向配置的 URL POST JSON,text 字段兼容 Slack,因此 Slack、Discord 或通用 incoming-webhook URL 開箱即用。適合發到手機、Slack 頻道或無人值守場景。

三個渠道可以獨立開關,比如 desktop: falsebrowser: false

一個需要注意的組合:單機運行且標籤頁隱藏時,同一事件可能同時彈桌面和瀏覽器通知。嫌重複的話,關掉其中一個渠道即可。

安裝

dsh plugin --profile web add dsh-notification
# or straight from git:
dsh plugin --profile web add github:nishit130/dsh-notification

兩條命令任選其一。插件是純 ESM JavaScript,沒有構建步驟,因此從 git 安裝也不需要在 allowBuilds 里加條目。

配置

在 profile 的 cordis.patch.yml 中覆蓋插件配置(或在 Settings UI 裏改):

- insert:
    - id: notify
      name: dsh-notification
      config:
        minTurnDurationMs: 10000        # 只通知 ≥ 10 秒的輪次
        webhookUrl: 'https://hooks.slack.com/services/XXX/YYY/ZZZ'
        notifyOnApproval: true
        desktop: true
        title: 'DSH'

這段配置做的事:把單輪通知的時長閾值調到 10 秒,接一個 Slack webhook,保留桌面通知,並把通知標題改成 DSH

全部配置項及默認值:

配置項 類型 默認值 含義
notifyOnIdle boolean true 一輪結束時通知
notifyOnError boolean true agent/error 時通知
notifyOnApproval boolean true 工具調用等待批准時通知
minTurnDurationMs number 5000 低於該時長的輪次不通知
desktop boolean true 在 server 宿主機發原生桌面通知
browser boolean true 在 Web UI 彈瀏覽器通知
browserOnlyWhenHidden boolean true 標籤頁可見時抑制瀏覽器通知
webhookUrl string '' 可選的 POST 目標(Slack 兼容 payload)
title string 'DeepSeek Harness' 桌面通知標題

Webhook 的 payload 長這樣:

{
  "text": "Agent finished — done in 2m 14s",
  "summary": "Agent finished",
  "body": "done in 2m 14s",
  "level": "info",
  "ts": "2026-08-21T12:34:56.000Z"
}

text 是 Slack 兼容字段,summarybody 便於自定義消費方拆分展示,levelts 提供級別與時間戳。

設計上的三個決策

經過上面的步驟,插件已經能正常工作。它的實現有幾處設計值得了解:

1、經 ctx 註冊的一切都是 effect。卸載或熱重載時監聽器自動移除,沒有手動清理路徑(Cordis revertible effects)。
2、approval/request 是瀑布。插件只觀察,監聽器始終調用 next()——不調用就會搶佔決策權、吞掉真正的回答方。
3、永不打斷 agent 循環。桌面通知以 detached fire-and-forget 方式 spawn,webhook 失敗被吞掉,通知器絕不向 agent 回合拋錯。

本地開發

想改代碼的話,先複製 dev.patch.example.ymldev.patch.yml(已被 gitignore),把它指向你 checkout 的絕對路徑,再在 harness 源碼 checkout 中運行:

pnpm dsh web --patch ./path/to/dsh-notification/dev.patch.yml

index.js 的修改可以熱重載,無需重啓。測試用 npm test 跑。

適用場景與注意事項

按部署方式選渠道:

  • harness 跑在自己機器上:開桌面通知即可。
  • harness 跑在遠程服務器、Web UI 在本地看:開瀏覽器通知。
  • 無人值守或長任務:配 webhook,把消息送進 Slack、Discord 或任何能收 POST 的服務。

兩點提醒:

1、插件以當前 dsh 進程的權限運行,安裝前建議先讀一遍源碼和許可證(本項目爲 MIT)。從 package.json 的 files 字段看,插件只包含 index.jsclient.jscordis.patch.yml 三個文件,檢查成本不高。
2、瀏覽器通知需要 Web UI 在你首次點擊或按鍵時請求權限,裝好後先和頁面交互一次。

結尾

dsh-notification 解決的問題很具體:agent 跑長任務時,你不必再定時回來刷新標籤頁。三類事件、三個渠道、一個時長閾值,配置面不大,默認值基本開箱可用。

  • 插件目錄頁:https://www.skillhub.cn/plugins/nishit130/dsh-notification
  • GitHub:https://github.com/nishit130/dsh-notification

收錄該插件的 skillhub.cn 是社區維護的插件目錄,與 DeepSeek 官方無從屬關係。

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

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

小夜