dsh-qq-approval-notify: QQ Notifications for DSH Approvals and Inquiries

前言

DeepSeek Harness(DSH)在沙箱提权、命令执行、写文件等场景会弹出审批;ask_user_question 或计划审核也会在界面等你作答。人若不在电脑前,很容易错过弹窗。社区插件 dsh-qq-approval-notify(维护者 EviMing,分类:工作流)在本机监听这些事件,优先经 NapCat 给指定 QQ 发私信;NapCat 不可用或发送失败时,再尝试 Windows 通知;仍失败则写日志并放弃,不影响 DSH 本身的审批与提问流程。

这是什么

一句话:Host 侧 DSH 插件,把「需要你处理的审批」和「需要你回答的界面提问」转成 QQ 私信或 Windows 桌面提醒,只做提醒,不参与批准或代答。

插件只装在 Host,不需要 Client 代码;实现上仅使用 Node 内置模块,无额外 npm 依赖。当前 package 版本为 1.1.0,许可证 MIT。

核心功能

监听的场景

插件观察两类 waterfall 事件(只观察、始终 next(),fire-and-forget):

  1. approval/request:沙箱提权、bash/shell/exec、run_code、读写删文件、联网、插件安装与 MCP 等工具调用等审批。
  2. user-questions/request:ask_user_question 及计划审核等界面提问。

审批策略为 never 时不会产生审批请求,插件也就不会发通知;需要在 ask 或会触发审批的模式下才有意义。

消息格式

审批类消息形如:

【申请{XX}权限】申请原因

XX 按审批类型映射为人话标签(例如沙箱提权为「沙箱」,shell 为「执行命令」,write/edit 为「修改文件」,web_fetch 为「联网」等)。原因优先使用 DSH 的 displayReason.zh,与审批弹窗一致。dsh-ops 的 ops_bash 提权走独立通道,显示为「执行命令」;经 dsh-sandbox 的提权显示为「沙箱」。

提问类消息形如:

【需要你回答】<标题>:<问题>(单选:选项 A / 选项 B)

多题时首行带 【需要你回答】,后续以 - 开头;选项会标「单选 / 可多选」;detail 截断后放在 〔…〕 中。

通知链路

  1. 生成消息文本。
  2. 发现 NapCat:配置 endpoints → 进程端口探测 → 默认端口;对每个候选调用 OneBot get_login_info,仅当 user_id 等于配置的 selfQQ 才使用,避免连错实例。
  3. 用 send_private_msg 发给 ownerQQ。
  4. 失败则 Windows Toast(WinRT),再失败试托盘气泡。
  5. 均失败则放弃本次通知。

相同申请文本在 dedupeMs(默认 20000 ms)内只通知一次,减轻重试风暴;设为 0 关闭去重。

实现上为何要用 prepend

Web 端转发器对 approval/request 与 user-questions/request 注册了不 prepend 的监听器,会把事件转给浏览器并结束链,后注册的观察者不会被调用。本插件用 ctx.on(..., handler, { prepend: true }) 排在链首,仍立刻 return next(),不影响正常审批与提问。

安装与启用

官方 README 推荐在 Windows 上用 tarball 安装(未开开发者模式时,pnpm 对本地目录建符号链接可能被拒):

cd D:\DSH_WorkArea\qq-approval-notify
npm pack --pack-destination dist

然后由 DSH 的 plugin_manager 安装生成的 dist\local-qq-approval-notify-<版本>.tgz。改源码后重新 pack 并重装即可;配置文件在包外,重装不会丢失。

装好后若运行中的 DSH 无变化,需重启 DSH:Node 会缓存已加载的 ESM,重装或开关插件不会替换进程内旧代码。

安装前应自行查看 GitHub 仓库 源码与 MIT 许可证;插件以当前 dsh 进程权限运行。

配置

默认读取:

%DSH_HOME%\qq-approval-notify.json

DSH_HOME 未设置时为 C:\Users\<你>\.dsh。也可用环境变量 DSH_QQ_APPROVAL_CONFIG 或插件行配置里的 configFile 指定路径。

示例(字段含义以 README 为准):

{
  "ownerQQ": "2368199809",
  "selfQQ": "3641194452",
  "napcat": {
    "endpoints": ["http://127.0.0.1:3000"],
    "ports": [3000, 3001],
    "token": "你的 NapCat token",
    "timeoutMs": 1200,
    "discoveryCacheMs": 60000
  },
  "windowsNotification": {
    "enabled": true,
    "timeoutMs": 12000
  },
  "dedupeMs": 20000,
  "debug": false
}
  • ownerQQ:收件人(主人)QQ 号。
  • selfQQ:DSH 侧登录的 QQ 号,用于校验 NapCat 登录身份。
  • napcat.token:OneBot access token,以 Authorization: Bearer ... 发送。
  • 缺少 ownerQQ 或 selfQQ 时,插件不猜测收件人与 NapCat,仅尝试 Windows 通知。

典型用法与自检

本地跑测试(消息格式、配置解析、假 OneBot、真实 NapCat 只读探测、Windows 通知自检):

cd D:\DSH_WorkArea\qq-approval-notify
node test/check.mjs

可选:向真实 QQ 发一条自检消息:

$env:DSH_QQ_LIVE_SEND = '1'; node test/check.mjs

使用上:DSH 正常工作时,一旦有审批或提问事件,插件按上述链路通知;在 QQ 里回复不会自动批准,也不会替你答题,仍需回到 DSH 界面处理。

适用场景与注意

适合在本机已部署 NapCat(OneBot HTTP)、且希望离开桌面仍能收到 DSH「待处理」提醒的 Windows 用户。Toast 依赖当前用户桌面会话;无交互会话时会退回托盘气泡。

DSH 社区目录 SkillHub 插件页 与 GitHub 为独立信息源,与 DeepSeek / 幻方无官方从属关系;生态上 DSH 强调「一切皆插件」,本插件属于其中的工作流类扩展。

结尾

dsh-qq-approval-notify 把审批与界面提问变成可触达的 QQ 私信或 Windows 通知,并明确失败回退与去重策略,适合需要「离开电脑也不漏提醒」的 Host 部署。详情与 issue 见 GitHub,目录入口见 SkillHub。

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

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

Xiaoye