dsh-notify-relay:DSH 外联通知规则中枢

前言

在 DSH 里跑智能体任务,常见需求是把「任务失败、待审批、工具报错」推到手机或 IM。社区里已有不少「收到事件就转发」的插件,但多数只负责投递,不回答更棘手的问题:同一条失败是否该再发、凌晨两点是否该吵醒你、二十条告警能否合成一条、通道短暂不可用时是否丢消息。

下面介绍维护者 Archaofan 的 dsh-notify-relay(GitHub:Archaofan/dsh-notify-relay,SkillHub 分类:联网工具)。它的定位是 外联通知的规则中枢:生命周期事件先经去重、免打扰、摘要合批等策略,再路由到 Bark、Server酱、Telegram、企业微信、飞书、钉钉、ntfy 或通用 webhook;投递失败会退避重试,队列在进程重启后仍可恢复。插件零运行时依赖,无需构建步骤。

这是什么

dsh-notify-relay 是 DeepSeek Harness 的 Web 侧插件:监听 DSH 生命周期事件(任务完成/失败/中止/阻塞、请求失败、审批询问/决定、工具失败等),在「是否发送、何时发送、发往哪些通道」上集中决策,再调用各通道的薄适配层发出消息。

维护者:Archaofan。
社区目录页:https://www.skillhub.cn/plugins/Archaofan/dsh-notify-relay
源码与文档:https://github.com/Archaofan/dsh-notify-relay

与「单纯转发」的插件相比,README 强调产品价值在规则层:dedup、quiet hours、digest、mute、按通道过滤、密钥脱敏,以及审批类事件在免打扰/摘要下不被 hold(避免任务拖到早上才继续)。

核心功能

规则层

能力 作用
Dedup(去重) 对 (kind, session, title, body) 指纹,在 1–1440 分钟窗口内抑制重复推送
Quiet hours(免打扰) 支持跨午夜区间(如 22:00 → 08:00);重复通知可丢弃或进入 digest
Digest(摘要合批) 被 hold 的通知按 N 分钟合并为一条,也可手动 flush
Mute 通过 /notify mute <minutes> 临时屏蔽一切(含新指纹)
Approval pierce 审批请求不受 quiet hours / digest hold
Retry 失败投递进入持久 outbox,退避 30s → 1m → 2m → … → 30min;重启不丢
Routing 每个通道可设事件过滤器(如 Telegram 只收失败)
Redaction 密钥在 API 响应中以 •••••••• 掩码展示,不出现在投递日志

package.json 描述中还提到:严重度映射到各通道原生字段(如 Bark level/call、ntfy Priority、钉钉 isAtAll)、单通道熔断、抖动退避、外联自检告警。具体行为以仓库当前版本文档为准。

界面与可观测性

  • 设置页:Settings → Outbound relay — 总开关、八种事件开关、去重窗口、免打扰(起止/模式)、摘要间隔、投递语言、待重试队列、通道编辑器。
  • 通道编辑器:增删改通道;名称、类型、endpoint、密钥、事件过滤;Test 会向该通道发一条真实投递。
  • 侧栏底部:状态 pill(开/关、最近投递结果);点击可打开近期投递日志。
  • 投递日志:包含规则层 决定不发送 的记录及原因(dedup / muted / quiet-hold / digest / no channel),便于排查「到底发没发」。

UI 语言跟随 DSH;推送到手机/IM 的文案语言由配置项 language(zh / en)单独控制。

支持的通道

Kind 配置要点
bark Bark 服务器 URL;iOS 推送,group 为 dsh-notify-relay
serverchan SendKey(Server酱)
telegram bot token + chat id;任务完成类可 silent
wecom 企业微信机器人 webhook key,markdown
feishu 飞书 webhook token,交互卡片
dingtalk access token,可选 sign secret;markdown;critical 可 @所有人
ntfy topic(可选自定义 server),JSON publish
webhook 任意 URL,通用 JSON POST;可选自定义 header 携带密钥

每通道事件过滤默认 *(全部)。未知 channel kind 在校验阶段丢弃,避免新版本配置拖垮启动;已知 kind 内未识别的 secret 字段会保留,避免误删凭证。

Slash 命令(不经过模型)

  • /notify status
  • /notify test [channel]
  • /notify mute <minutes> / /notify unmute
  • /notify flush / /notify retry

安装与启用

README 写明已在 DSH 0.1.6-alpha.2 与 0.1.7-rc.2 上验证;package.json 中 engines.dsh 为 >=0.1.6-alpha.1 <0.1.7 || >=0.1.7-alpha.1 <0.2.0-0。安装时请使用资料中的命令,不要自行拼接仓库名。

生产 profile 从 GitHub 安装:

dsh plugin --profile web add github:Archaofan/dsh-notify-relay --ignore-scripts

或从本地 tarball(README 示例文件名为 dsh-notify-relay-0.3.3.tgz):

dsh plugin --profile web add file:./dsh-notify-relay-0.3.3.tgz --ignore-scripts

--ignore-scripts 建议保留:插件无 install script、无运行时依赖,跳过脚本更快也更安全。

安装后重启 DSH(或重载 Web 应用),打开 Settings → Outbound relay 完成配置。

若第二次安装报 ERR_PNPM_MISSING_TARBALL_INTEGRITY

这是 pnpm 在 lockfile 缺少 tarball integrity 时的已知问题,第一次安装通常成功;在同一 profile 再装第二个插件时可能触发。README 给出的修复是在对应 profile 目录下删除 node_modules 与 pnpm-lock.yaml 后重装(仅删 lockfile 不够)。路径形如 <DSH_HOME>/profiles/<profile>/。

典型配置

最快路径是官方设置页。也可直接编辑 <DSH_HOME>/storages/notify-relay/config.json;加载时会校验,非法值回退默认而非崩溃。

示例骨架(字段以 README 为准):

{
  "enabled": true,
  "language": "en",
  "events": {
    "task.done": false,
    "task.failed": true,
    "task.aborted": true,
    "task.blocked": true,
    "request.failed": true,
    "approval.asked": true,
    "approval.decided": false,
    "tool.failed": true
  },
  "dedup": { "windowMinutes": 10 },
  "quiet": { "enabled": false, "start": "22:00", "end": "08:00", "mode": "digest" },
  "digest": { "enabled": false, "intervalMinutes": 30 },
  "deepLink": "",
  "channels": [
    {
      "id": "phone",
      "name": "My phone",
      "kind": "bark",
      "url": "https://api.day.app/YOUR_KEY",
      "secrets": {},
      "events": ["*"]
    }
  ]
}

quiet.mode 为 digest(hold 后合并发送)或 drop。通道编辑器里密钥为掩码展示;未修改密钥时保存不会清空已有 token。

典型工作流:

  1. 安装插件并打开 Outbound relay,打开总开关。
  2. 按需要勾选事件(例如失败、审批、工具失败开,任务完成关)。
  3. 在通道编辑器添加 Bark/Telegram 等,设置 endpoint 与密钥,用 Test 验证。
  4. 按需开启去重窗口、免打扰与摘要;审批类事件会自动穿透 hold。
  5. 运行任务或执行 /notify test;在投递日志中确认「已发送」或「被规则抑制」及原因。

适用场景与注意

适合谁

  • 长时间 unattended 跑 DSH 任务,需要手机/IM 告警但不想被重复失败刷屏。
  • 多通道分流:例如 Bark 收全部、Telegram 只收失败与审批。
  • 需要在日志里区分「没配通道」与「被 dedup/免打扰拦住」的开发者。

使用前请注意

  • DSH 生态是「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。
  • 插件以 当前 DSH 进程权限 运行,会向配置的外网 endpoint 发送任务标题、正文等;安装前请阅读源码与 MIT 许可证,自行评估密钥与数据出境风险。
  • 外联通道凭证保存在本地配置中;虽 API 与日志有脱敏,仍应限制 DSH 主机与备份文件的访问权限。

结尾

dsh-notify-relay 把「要不要发、怎么发、发到哪里」从各通道插件里抽成一层规则中枢,并补全投递日志与失败重试,适合作为 DSH 外联通知的默认入口。进一步细节见仓库 README 与中文说明 README.zh.md。

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

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

小夜