dsh-notify
baka-world
DeepSeek Harness desktop notification plugin (notify-send / D-Bus)
PROJECT TOPICS
PROJECT README
A DeepSeek Harness (dsh) plugin that pushes WeChat Work (企业微信) group-robot notifications to your phone — automatically.
dsh-WeCom-notify 是 DeepSeek Harness(dsh)的一个插件:
通过企业微信官方群机器人 webhook,在 dsh 的关键节点自动把通知推到你的手机。
✅ dsh 任务完成 / ⛔ dsh 任务阻塞);wechat_notify 工具,供 agent 主动发进度;全程无需 agent 记得调用工具——事件由 dsh 内部状态机触发,无法被 prompt injection 伪造。
qyapi.weixin.qq.com),免费个人注册即可用,无第三方中转;dsh 设置 → 企业微信通知 图形化配置,多个 key 增删、@ 成员、节流参数一目了然,保存即热生效(无需重启),并持久化到 <DSH_HOME>/wecom-notify/config.json(0600 权限);session/event(每轮总结)与 goal/changed(完成/阻塞)自动推送,不依赖 LLM 自觉;fetch 异步发送(不是 execFileSync 同步阻塞事件循环);mentionUserid 在通知时 @ 指定成员;本项目是 wssfk12138/dsh-wechat-notify 的优化重写版,灵感与基础均来自该项目。
dsh-wechat-notify(v0.1.0,ClawBot 通道版)的贡献:
cordis.patch.yml 挂载 + 注册 wechat_notify 工具」的完整接入范式,本项目沿用同一生态位;wechat_notify(message) 的接口设计、可读的「已发送 / 失败原因」返回值约定、未配置时的友好提示,均继承自原项目;wechat_login / wechat_login_confirm 证明了「在 dsh 内完成微信连接」的可行性。本项目的改进(相对于 v0.1.0):
| 维度 | dsh-wechat-notify (v0.1.0) | dsh-WeCom-notify (本项目) |
|---|---|---|
| 通道 | ClawBot 逆向接口(第三方中转,有封号风险) | 企业微信官方 webhook(零封号风险) |
| 配置 | 环境变量 / 手写 yaml | 设置面板图形化配置,即装即用 |
| 目标数 | 单个群 | 多个群同时通知 |
| 触发 | 依赖 LLM 记得调用工具 | 事件驱动自动推送(goal/session 状态机) |
| 发送 | execFileSync 同步阻塞 |
异步 fetch,队列/节流/去重/指数退避重试 |
| 文本 | UTF-8 文件传递 | UTF-8 码点截断 + markdown 转义 |
一句话:原项目证明了「dsh 应该能主动找到你」,本项目把这条链路换成了官方、自动、可靠、开箱即用的企业微信通道。
@deepseek-ai/cordis 与 @deepseek-ai/dsh-tools,由 dsh 自身解析);npm install && npm run build(一次产出 host lib/index.js + 设置面板 lib/client.js);把插件链接进 profile 依赖并以包名装配(loader 才能读到 package.json 的 dsh.client 声明,
设置面板才会被浏览器加载)。macOS/Linux:
# 1. junction 链接到 profile node_modules
ln -s /绝对/路径/dsh-WeCom-notify ~/.dsh/profiles/web/node_modules/dsh-wecom-notify
# 2. package.json 声明(dependencies + bundles)
# dependencies: { "dsh-wecom-notify": "link:/绝对/路径/dsh-WeCom-notify" }
# dsh.profile.bundles: [...原有, "dsh-wecom-notify"]
Windows 用 mklink /J。然后重启 dsh web。
在 ~/.dsh/profiles/web/cordis.patch.yml 中(或 dsh web --patch <文件>):
- insert:
- id: wechat-notify
name: 'file:///绝对/路径/dsh-WeCom-notify/lib/index.js'
config: {} # 无需任何配置!
⚠️ 方式 B 的 file:// 入口不带设置面板(client 需包名装配);功能(多 key / 事件通知 / API)完整。
重启 dsh web,日志出现 [wechat-notify] plugin loaded;
打开 dsh 设置 → 企业微信通知:
也可以
npm run install-dsh一键构建并写入 patch(默认写到~/.dsh/profiles/web/,方式 B)。
config > 环境变量 > 默认值)dsh 设置 → 企业微信通知 面板保存后写入 <DSH_HOME>/wecom-notify/config.json(DSH_HOME 缺省 ~/.dsh,0600 权限)。
文件存在时以文件为准(面板里清空 = 显式清空);如需回到静态配置,删除该文件即可。
| 字段 | 说明 |
|---|---|
webhookKeys |
群机器人 webhook 的 key 数组(可多个,同时通知所有群) |
webhookUrl |
附加的完整 webhook 地址(旧版兼容,额外目标) |
mentionUserid |
通知时 @ 的企业微信 userid(可选) |
minIntervalMs |
节流间隔(默认 10000) |
dedupeWindowMs |
去重窗口(默认 30000) |
triggerOnAgentIdle |
agent 空闲时也通知(默认关,防噪音) |
turnSummaryEnabled |
每轮对话完成推送总结(默认开) |
maxBytes |
单条消息最大字节数(上限 4096,默认 3800) |
config(静态声明,可选)- insert:
- id: wechat-notify
name: 'file:///绝对/路径/dsh-WeCom-notify/lib/index.js'
config:
webhookKeys: # 多个 key,同时通知
- '你的第一个群机器人 webhook key'
- '你的第二个群机器人 webhook key'
# webhookKey: '旧版单 key(并入 webhookKeys)'
# webhookUrl: '完整 webhook 地址(附加目标)'
# mentionUserid: '通知时 @ 的企业微信 userid'
# minIntervalMs: 15000
| 环境变量 | 说明 |
|---|---|
WECHAT_WEBHOOK_KEYS |
多个 key,逗号/分号/换行分隔(key1,key2) |
WECHAT_WEBHOOK_KEY |
单个 key(旧版,并入 keys) |
WECHAT_WEBHOOK_URL |
完整 webhook 地址(附加目标) |
WECHAT_MENTION_USERID |
通知时 @ 的企业微信 userid |
NOTIFY_MIN_INTERVAL_MS |
节流间隔 |
NOTIFY_DEDUPE_WINDOW_MS |
去重窗口 |
NOTIFY_TRIGGER_AGENT_IDLE |
agent 空闲时也通知(1/true 开启) |
NOTIFY_TURN_SUMMARY |
每轮总结推送(0/false 关闭) |
NOTIFY_MAX_BYTES |
单条消息最大字节数(上限 4096) |
未配置 key 时插件正常加载,通知降级为日志提示,不报错。
# 单元测试(51 个用例)+ 类型检查
npm test
npm run typecheck
# 冒烟:真实发一条到群里(多 key 逗号分隔)
WECHAT_WEBHOOK_KEY=<你的key> node scripts/smoke.ts
WECHAT_WEBHOOK_KEYS='key1,key2' node scripts/smoke.ts
端到端:打开 dsh 设置 → 企业微信通知 → 填 key → 发送测试消息 → 保存; 再给 dsh 一个带 goal 的任务,goal 完成时自动收到「✅ dsh 任务完成」。
fetch 发送到每个已配置的群(各群独立限频、独立重试);wechat_notify 走同一条链路;/wecom-notify/api)读写配置,保存即热生效并持久化。src/ # TypeScript 源码
├── index.ts # 插件入口:事件订阅 + 工具 + webServer 配置 API(/wecom-notify/api)
├── config.ts # 配置:多 key / 持久化文件层 / 优先级合并(面板文件 > config > env)
├── notifier.ts # 调度:队列 / 节流 / 去重 / 多目标发送 / 配置热更新
├── client.ts # 企业微信 webhook 客户端(单目标 + 多目标并发汇总)
├── templates.ts # markdown 渲染 / 转义 / UTF-8 截断
├── extract.ts # session/event 提取(每轮总结)
└── client/
└── index.ts # 设置面板(settings.section:key 编辑 / 保存 / 测试)
lib/index.js # esbuild 编译产物(dsh 实际加载的 host 入口)
lib/client.js # tsdown 编译产物(浏览器端设置面板,ModuleLoader 加载)
test/ # node:test 单元测试(51 用例)
scripts/ # build(构建)、install-dsh(一键安装)、smoke(冒烟)
npm install 报 404(@deepseek-ai/dsh-compact)?
tsdown 的传递依赖引用了尚未发布的 rc 包,npm install 可能失败。构建脚本会自动回退到
DSH checkout 里的 tsdown(DSH_CHECKOUT=<dsh源码目录> npm run build),产物不受影响。
为什么设置面板在 patch 挂载(file://)下不显示?
浏览器端的 client 模块由 dsh 的 modules 服务扫描「声明了 dsh.client 的包」发现;
file:// 直接入口不是包,请用 bundle 装配(方式 A)。
改了 key 但没生效?
设置面板保存的文件(<DSH_HOME>/wecom-notify/config.json)优先级最高;如你改的是
cordis.yml/环境变量但文件已存在,删除该文件即可回到静态配置。
维护 / 二次开发见 docs/development-notes.md—— 设置面板组件契约(settings.section)、client bundle 构建、包名装配、配置热更新与踩坑记录。
欢迎提 Issue 和 PR。dsh 目前是 developer preview,接口可能调整,提交前请以最新的 dsh 插件文档为准。
MIT © GuZhengSVT,致谢 wssfk12138/dsh-wechat-notify。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。