dsh-approval-notify:DSH 待审批工具调用时的桌面提醒

前言

在 DeepSeek Harness(DSH)里跑智能体时,工具调用往往需要你在界面里点批准或拒绝。若开了实验性的 Auto review,审查不通过时同样会弹出「请你决定」的审批请求。窗口在后台、你在看别的应用时,很容易错过这类请求,任务就卡在等待状态。

社区插件 dsh-approval-notify(维护者 sakuraboy9128-cmd,SkillHub 分类:客户端)在 DSH 等待你对某次工具调用做审批时弹出桌面通知;在 Windows 上还可点击通知把 DSH 窗口带到前台。下面介绍它的定位、能力与安装配置方式。事实以 GitHub 仓库 README 为准。

这是什么

dsh-approval-notify 是一个 DSH bundle:挂到已有 profile 上,监听 @deepseek-ai/dsh-user-approval 提供的 approval/request 事件。当 DSH 需要你批准或拒绝一次工具调用时,在系统侧给出本地化标题与正文(来自请求字段 toolName、displayReason、reason),而不是在 DSH 窗口里再叠一层 UI。

需要事先说明:通知只是提醒,不能代替你在 DSH 界面里的决定;点通知不会自动批准任何操作。

核心功能

审批事件覆盖范围

插件向 approval 服务的 approval/request 瀑布流注册一个 listener。README 写明它覆盖 approval 服务抛出的各类 ask,包括 @deepseek-ai/dsh-experimental-auto-review 在 ask 审批策略下产生的请求——典型场景是 Auto review 拒绝某次调用后,DSH 转问你,而你没有盯着窗口。

通知内容与去重

  • 标题与正文由请求自身字段渲染;没有工具名时标为 unknown,不做猜测。
  • 在可配置的 dedupeWindowMs 窗口内,相同工具名 + 相同 reason 的重复请求会被抑制,避免同一条 ask 弹两次;不同请求仍会分别通知。

各平台呈现方式

平台 行为(据 README)
Windows 10/11 通过长期运行的 PowerShell helper:优先 WinRT toast,不可用时改用屏幕角落的置顶卡片(card)
macOS 需有 osascript,普通通知,无点击聚焦 DSH
Linux 需有 notify-send,普通通知,无点击聚焦 DSH

Windows 上点击通知会恢复并聚焦 DSH 窗口;若 DSH 未运行,则启动配置的可执行文件(单实例锁会拉起已有窗口)。registerProtocol 为 true 时注册 dsh-approval-notify:// 协议,便于 toast 点击路径聚焦;卡片 presenter 不依赖该协议,点击直接交给 helper 进程。

与审批链路的隔离

实现上不在 approval 瀑布流里 await 自身 I/O,也不向外抛错:通知失败不应把审批结果变成 fail-closed 的 unavailable,也不会拖慢其他 answerer。

环境与依赖

  • DSH 需挂载 approval 服务(@deepseek-ai/dsh-user-approval);官方 Desktop / Web profile 默认具备。
  • Node.js >= 20(见 package.json 的 engines)。
  • 无 npm 依赖,bundle 仅使用 Node 内置模块。
  • 支持操作系统:win32、darwin、linux(见 package.json)。

安装与启用

安装时使用本地绝对路径添加 bundle,不要用凭仓库名拼出来的 github:owner/repo 形式(除非你的环境文档另有说明)。官方 README 给出的命令如下:

dsh plugin --profile <profile> add /absolute/path/to/dsh-approval-notify

将 <profile> 换成你要接收审批提醒的 profile;README 举例:desktop 是自带 Auto review 的 profile。若 loader 提示需重启,则重启 DSH。CLI 会安装包并把 bundle 声明的 patch 写入 profile,使 approval-notify 行进入配置。

安装后建议先验证通知链路是否正常:

node bin/cli.mjs test        # 弹出一条测试通知
node bin/cli.mjs doctor      # 打印通知路径上各 resolved 输入
node bin/cli.mjs logs        # 跟踪插件与 helper 日志

(以上命令在插件目录下执行;也可通过包内 bin 名 dsh-approval-notify 调用,见 package.json。)

配置说明

在 profile patch 里,approval-notify 行的 config 支持下列字段(默认值见 README;非法值会回退默认并在插件日志里 warning):

字段 默认值 含义
enabled true false 时 bundle 仍激活但不发通知
mode auto auto = 先 toast 再 card;还可 toast、popup、balloon、none
clickAction focus-dsh focus-dsh 聚焦或启动 DSH;none 不处理点击
locale auto auto 跟随宿主;或 zh、en
title '' 自定义标题;空则用本地化默认
includeReason true 正文是否包含请求的 reason
maxBodyChars 220 标题与正文截断长度
dedupeWindowMs 4000 相同 tool+reason 在此毫秒内去重;0 关闭
appId '' WinRT toast 的 AppUserModelID
dshExePath '' 无 DSH 窗口时启动的可执行文件;空则自动探测
windowTitleSuffix DeepSeek Harness 用于匹配要聚焦的窗口标题后缀
registerProtocol true 是否注册 dsh-approval-notify:// 处理器
popupTimeoutMs 12000 卡片停留时长;悬停暂停倒计时
helperIdleMs 900000 helper 空闲多久后退出
sound true 是否播放提示音
dshExeCandidates [] 额外尝试的 DSH 可执行路径

示例 patch 片段:

- id: approval-notify
  name: 'dsh-approval-notify'
  config:
    mode: popup
    locale: zh
    dedupeWindowMs: 10000

若不再需要协议处理器,README 提供:

node bin/cli.mjs unregister-protocol

典型用法与排查

  1. 在 desktop(或你实际使用的)profile 上按上文命令安装并重启(若需要)。
  2. 运行 node bin/cli.mjs test 确认本机能否出通知。
  3. 触发一次需要人工审批的工具调用(或 Auto review 的 ask),观察是否弹出且日志中有 notified 类记录(Windows 上可 node bin/cli.mjs logs)。

常见问题(摘自 README 故障表):

  • 完全没有通知:审批策略为 never、bundle 被 enabled: false、或 mode: none;查 dsh-approval-notify logs。
  • 总是卡片、从不 toast:宿主无 package identity 时 WinRT 可能返回 0x80073D54;可设 mode: popup 跳过 toast 尝试。
  • 点击不能聚焦:主要验证路径在 Windows;macOS/Linux 本身不提供 click-to-focus。

README 在 Windows 11(build 26100)、DSH Desktop profile、Node 24 上验证了 listener、热加载、toast、卡片回退、点击聚焦等;macOS/Linux presenter 标注为未在该环境实测。

适用场景与注意

适合谁:经常在 DSH 里跑带审批或 Auto review ask 策略的工作流,且容易把 DSH 窗口留在后台的开发者。

权限与安全:插件随当前 DSH 进程权限运行;安装前请自行查看 GitHub 源码 与 MIT 许可证(package.json)。社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系,DSH 生态强调「一切皆插件」,选用第三方 bundle 需自行评估。

结尾

dsh-approval-notify 把「DSH 在等你批工具」这件事推到桌面通知层,Windows 上还可一键回到 DSH 窗口,减少后台卡住却无人知晓的情况。当前 package 版本为 0.1.0。

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

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

小夜