dsh-notify-bridge
DeepSeek Harness(DSH)通知与 Discord 转发插件:自带独立通知引擎(桌面通知 / 提示音 / 标题标记 / 审批快捷按钮),并把审批、定时任务、待办摘要、/goal 开始提示转发到 Discord Bot,每条已执行提醒自动附本次任务 Token 用量。
完全独立实现,不依赖 dsh-notify-me;两者可共存,互不影响。
功能 · 安装 · 配置 · Discord 准备 · 控制面板 · 健康页 · 代理排查 · Token 口径 · 开发
功能
| 能力 | 说明 |
|---|---|
| 🔔 独立通知引擎 | 审批/提问/计划复核、回复完成自动弹窗:桌面通知 + WebAudio 提示音 + 标签页标题 ●/✓ 标记;审批弹窗带「同意 / 拒绝」按钮 |
| 🛡️ 审批桥 | 页面有实时客户端时走 DSH 原生卡片;页面关闭时发 Discord 卡片,点击真实结算为 allowed-once / rejected;超时 unavailable、中断 cancelled |
| ⏰ 定时任务提醒 | 转发 DSH 原生 schedule 的单条和批量提醒(提醒本身不附 Token,任务尚未执行) |
| ✅ 任务完成 | turn/end 推送完成摘要并附本次任务 Token;定时任务执行完成后同样附 Token |
| 📋 待办摘要 | 每天固定时间读取 dsh-memory-evolve 的待办文件,只发未完成项,空列表不发 |
| 🚀 /goal 开始提示 | 检测 goal/change 的 create,发「任务开始执行」 |
| 🧮 Token 用量 | 每条已执行提醒末尾追加「本次任务 / 会话累计 / 本日」,数据来自 assistant/message.usage 并用 DSH tokenUsage 投影校正 |
| 🎛️ DSH 设置页 | 设置 → 通知设置 双 Tab:通知提醒(本插件的原生通知设置)、Discord(Token/频道/代理/转发开关等) |
| 🎮 Discord 控制面板 | Bot 就绪后发一条按钮面板(状态 / Tokens / 任务 / 记忆包),不用斜杠命令 |
| 📦 记忆包 | 把 ~/.dsh/memories 打包成 ZIP 发到频道(SUMMARY.md + manifest.json + 原始 Markdown) |
| 🔗 多通道 | Discord webhook、Bark、Gotify、飞书、ServerChan、WxPusher、自定义 webhook(HMAC 签名) |
| 🩺 健康页 | /__dsh-notify-bridge/:Bot/代理/审批/待办/最近日志/自测按钮 |
通知引擎(独立实现)
设置 → 通知设置 → 通知提醒 由插件自带引擎驱动,无需安装其他通知插件:
- 触发源:DSH uiSession 的待处理交互(审批 / 提问 / 计划复核)与 sessionStatus.completionUnread 完成标记;订阅会话列表快照做去重与标题解析。
- 提醒方式:右上角页内 toast(审批类带「同意/拒绝」,直接调用 DSH 的 answer('allowed-once' | 'rejected'))、系统通知(Windows 通知中心)、WebAudio 双音提示(无需音频素材)。
- 标题标记:待处理 ●、完成未读 ✓,读掉自动恢复。
- 离席判定:窗口失焦 / 页面隐藏 / idleMinutes 无输入算离开;background 策略只在离开时提醒,smart 跳过当前会话,always 总是提醒。
- 子代理静音:默认忽略子代理会话的完成提醒。
- 配置存储:localStorage[dshNotifyBridge.config],与 dsh-notify-me 的配置完全隔离。
安装
要求:DSH Desktop 0.2.2-rc.1(桌面/Web 均可),Node ≥ 20;Discord Bot Token、频道 ID、你的用户 ID。
方式一:直接从 GitHub 安装(推荐)
在 desktop profile 的 package.json 中加依赖和 bundle:
{
"dependencies": {
"dsh-notify-bridge": "git+https://github.com/harienlook/dsh-notify-bridge.git"
},
"dsh": {
"profile": {
"bundles": ["...", "dsh-notify-bridge"]
}
}
}
然后在 profile 目录执行 pnpm install,重启 DSH Desktop(含托盘退出)。
方式二:本地工作区 link(开发用)
"dsh-notify-bridge": "link:<你的工作区>/dsh-notify-bridge"
方式三:从 Releases 的 tgz 安装
到 Releases 页面下载 dsh-notify-bridge-0.1.0.tgz:
cd ~/.dsh/profiles/desktop
pnpm add ~/Downloads/dsh-notify-bridge-0.1.0.tgz
安装后必须把 dsh-notify-bridge 加入 dsh.profile.bundles,并完整重启 DSH。
配置
重启后打开 DSH 设置 → 通知设置。
通知提醒 Tab(即时生效)
| 字段 | 说明 |
|---|---|
| 启用提醒 | 总开关 |
| 提示音 / 音量 | WebAudio 双音提示,独立音量 |
| 审批快捷按钮 | toast 上显示「同意 / 拒绝」 |
| 回复完成 | background 离开页面才提醒;smart 当前会话不提醒;always 总是提醒 |
| 页面在前台也提醒需要操作 | 默认只在离开时提醒待处理 |
| 当前会话的等待不提醒 | 请求就在眼前时不弹 |
| 子代理会话不提醒 | 子代理完成默认静音 |
| 通知语言 | auto / 简体中文 / English |
| 离开判定(分钟) | 多久无输入算离开,0 只按焦点 |
| 自动关闭通知 | present 页面可见时几秒后关闭;always / never |
| 点击通知切换会话 | 点击系统通知后聚焦并切到对应会话 |
| 测试按钮 | 立即弹测试「需要操作」/「回复完成」通知 |
Discord Tab(保存后重启生效)
| 字段 | 说明 |
|---|---|
| Bot Token | 粘贴后写入 ~/.dsh/notify-bridge/discord.json,不回显;留空表示不修改 |
| 频道 ID | 通知、控制面板、审批卡片发到这里 |
| 你的用户 ID | 只有你能点审批按钮、使用查询 |
| 服务器 ID(可选) | 按钮面板不需要;保留用于清理旧命令 |
| 代理 | 系统代理用户填 http://127.0.0.1:7897;直连留空;不支持 socks5 |
| 审批模式 | auto:页面在线走原生,关闭走 Discord;always:总是 Discord |
| 转发开关 | 回复完成 / 审批 / goal / 定时任务 / 待办摘要 |
| 待办时间 | 24 小时制 HH:MM |
| Token 时区 | 本日统计和待办日期 |
保存后配置写入 ~/.dsh/notify-bridge/config.json,页面会提示重启 DSH Desktop 生效。
设置页 API 只允许 loopback 访问;Token 单独存 discord.json,不返回前端、不进日志。
Discord 准备
- Developer Portal → New Application → Bot → Reset Token,复制 Token。
- OAuth2 → URL Generator:scope=bot,permissions=52224(View Channels + Send Messages + Embed Links + Attach Files),邀请到服务器。
- 复制频道 ID(右键频道 → Copy Channel ID,需开启 Developer Mode)。
- 复制你的用户 ID(右键头像 → Copy User ID)。
- 在 设置 → 通知设置 → Discord 粘贴 Token / 频道 ID / 用户 ID。
插件不会把 Token 回显到设置页、日志、状态或健康页。
代理与网络(重要)
discord.proxy 默认空字符串,意思是直连。插件不会自动读取 Windows「系统代理」、Clash 配置、PAC 或 HTTP_PROXY/HTTPS_PROXY,也不会扫描本机端口。
| 你的网络 | 推荐配置 |
|---|---|
| 能直连 Discord(海外/公司网络) | proxy 留空 |
| Clash/Surge 开了 TUN / 增强模式 / 虚拟网卡 | proxy 留空通常可用(TCP 被透明接管) |
| 只开了 Windows「系统代理」或本地 HTTP 端口 | proxy 填 http://127.0.0.1:7897(换成你的端口) |
| 完全无法直连、也没有代理 | 需要先准备一个可用的 HTTP 代理 |
- 只支持 HTTP/HTTPS 代理;socks5:// 不支持,Clash 请填「混合端口」或「HTTP 端口」。
- 非法代理不会静默改直连:Bot 不启动,健康页和日志报 proxy 错误。
- 环境变量 DSH_NOTIFY_BRIDGE_PROXY 可作为兜底(显式配置优先)。
- 判断标准不是「代理软件开着」,而是「到 Discord 的 TCP 能不能通」。
Discord 控制面板
Bot 就绪后自动发送/更新一条面板消息:
📋 DSH 控制面板
[状态] [Tokens] [任务] [记忆包]
- 状态:Bot、代理、会话、待审批、Tokens、待办数量。
- Tokens:本任务 / 本会话 / 本日,最近 5 个会话。
- 任务:当前任务摘要(目标、最近回复、Tokens)。
- 记忆包:把记忆 ZIP 发到当前频道(普通消息,请只发私有频道)。
默认不注册任何斜杠命令,也不需要输入 /status;registerCommands: false 时启动会清理旧命令。按钮和面板只受 ownerUserId 限制;allowedChannelIds 为空时允许 Bot 所在的所有频道,建议显式配置。
健康页与自测
http://127.0.0.1:<DSH Web 端口>/__dsh-notify-bridge/
http://127.0.0.1:<DSH Web 端口>/__dsh-notify-bridge/health
http://127.0.0.1:<DSH Web 端口>/__dsh-notify-bridge/logs?limit=50
健康 JSON 里的 clientDebug 是设置页客户端心跳:为空表示 client bundle 没有执行;stage = registered 表示设置页已注册。设置页不出现时先看这个字段。
代理排查
健康页的 Proxy 卡片会显示来源和错误:
- off:直连。Bot 连不上时,填 http://127.0.0.1:端口。
- config · http://...:来自 discord.proxy。
- env · http://...:来自 DSH_NOTIFY_BRIDGE_PROXY。
- error: ...:按错误修正;socks5:// 改成 http://,PAC 改成显式 HTTP 端口。
代理只作用于 Discord REST/Gateway,不影响 DSH 本体、模型请求或其他插件。
Token 口径
- 单步:assistant/message.usage 的 inputTokens(DSH 已是 uncached)、outputTokens、cacheReadTokens、cacheWriteTokens。
- 同一 turn:step 以最后一次样本替换,避免流式重复。
- 任务:从最近一条普通用户消息(或 /goal create)开始累计,直到下一条普通用户消息。
- 会话:优先用 DSH sessionProjections.snapshot(session, [tokenUsage]) 校正,含插件启动前的历史。
- 本日:插件按 tokens.timeZone 聚合,写入 ~/.dsh/notify-bridge/state.json。
- 未执行的定时任务、待办摘要、/goal 开始提示不附 Token。
稳定性与安全
- 审批 prepend: true,只结算一次;超时/中断/发送失败都 fail-closed。
- Bot 支持 Gateway resume、心跳 ACK、断线指数退避、429 retry_after。
- 状态文件原子写(tmp + rename + 0600),去重 TTL 7 天、上限 512 条。
- Token/secret 不落日志/健康页;config.json、discord.json 按 0600 写。
- 健康路由和设置 API 只允许 loopback;设置 POST 需要 x-dsh-notify-bridge: config 头。
- 设置页保存后不会热重载 Bot:重启 DSH Desktop 生效,避免半配置状态。
已知边界
- Discord 侧需要能访问 discord.com(本机通常需要代理,见上)。
- /goal 开始提示依赖 DSH goal/change 事件;其他插件替换 goal 命令时可能收不到。
- 「记忆包」按钮把 ZIP 发到当前频道(普通消息),公开频道不要点。
- 系统通知本身只做提醒与聚焦;带「同意/拒绝」的快捷按钮在页内 toast 上。
开发
npm install
npm test # 8 组测试:approval / discord / todo / proxy / settings / client / smoke / boot
npm pack --dry-run
目录结构:
- lib/index.js:host 插件入口(事件订阅、审批桥、待办、转发、Token 统计)。
- lib/client.js:设置页 + 独立通知引擎(不依赖其他插件)。
- lib/discord/:Bot Gateway/REST 客户端。
- lib/settings.js / lib/health.js:设置与健康页路由。
- test/:Node 原生测试(无第三方框架)。
License
MIT
No comments yet. Be the first to write one.