dsh-im-union 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/LICENSE +28 -0
  3. package/README.en.md +34 -0
  4. package/README.md +33 -2
  5. package/SECURITY.md +20 -0
  6. package/THIRD_PARTY_NOTICES.md +37 -0
  7. package/client.js +649 -0
  8. package/cordis.patch.yml +4 -0
  9. package/dsh.plugin.json +17 -0
  10. package/lib/admin/api.d.ts +55 -0
  11. package/lib/admin/api.js +176 -0
  12. package/lib/channels/dingtalk.d.ts +186 -0
  13. package/lib/channels/dingtalk.js +1017 -0
  14. package/lib/channels/discord.d.ts +170 -0
  15. package/lib/channels/discord.js +553 -0
  16. package/lib/channels/feishu.d.ts +287 -0
  17. package/lib/channels/feishu.js +659 -0
  18. package/lib/channels/imessage.d.ts +158 -0
  19. package/lib/channels/imessage.js +547 -0
  20. package/lib/channels/matrix.d.ts +262 -0
  21. package/lib/channels/matrix.js +888 -0
  22. package/lib/channels/meta.d.ts +29 -0
  23. package/lib/channels/meta.js +123 -0
  24. package/lib/channels/qq.d.ts +214 -0
  25. package/lib/channels/qq.js +706 -0
  26. package/lib/channels/registry.d.ts +12 -0
  27. package/lib/channels/registry.js +34 -0
  28. package/lib/channels/slack.d.ts +232 -0
  29. package/lib/channels/slack.js +896 -0
  30. package/lib/channels/telegram.d.ts +138 -0
  31. package/lib/channels/telegram.js +455 -0
  32. package/lib/channels/types.d.ts +116 -0
  33. package/lib/channels/types.js +1 -0
  34. package/lib/channels/wecom-app.d.ts +138 -0
  35. package/lib/channels/wecom-app.js +600 -0
  36. package/lib/channels/wecom.d.ts +121 -0
  37. package/lib/channels/wecom.js +446 -0
  38. package/lib/channels/weixin-qr.d.ts +25 -0
  39. package/lib/channels/weixin-qr.js +88 -0
  40. package/lib/channels/weixin.d.ts +95 -0
  41. package/lib/channels/weixin.js +514 -0
  42. package/lib/channels/whatsapp.d.ts +198 -0
  43. package/lib/channels/whatsapp.js +471 -0
  44. package/lib/client.js +649 -0
  45. package/lib/credentials/vault.d.ts +16 -0
  46. package/lib/credentials/vault.js +114 -0
  47. package/lib/engine/account-manager.d.ts +72 -0
  48. package/lib/engine/account-manager.js +256 -0
  49. package/lib/engine/commands.d.ts +58 -0
  50. package/lib/engine/commands.js +282 -0
  51. package/lib/engine/connector.d.ts +232 -0
  52. package/lib/engine/connector.js +767 -0
  53. package/lib/engine/delivery-log.d.ts +62 -0
  54. package/lib/engine/delivery-log.js +166 -0
  55. package/lib/engine/files.d.ts +42 -0
  56. package/lib/engine/files.js +50 -0
  57. package/lib/engine/fragments.d.ts +55 -0
  58. package/lib/engine/fragments.js +89 -0
  59. package/lib/engine/gateway.d.ts +117 -0
  60. package/lib/engine/gateway.js +711 -0
  61. package/lib/engine/interactions.d.ts +65 -0
  62. package/lib/engine/interactions.js +254 -0
  63. package/lib/engine/media.d.ts +50 -0
  64. package/lib/engine/media.js +77 -0
  65. package/lib/engine/proactive.d.ts +146 -0
  66. package/lib/engine/proactive.js +335 -0
  67. package/lib/engine/quote.d.ts +51 -0
  68. package/lib/engine/quote.js +82 -0
  69. package/lib/engine/router.d.ts +38 -0
  70. package/lib/engine/router.js +56 -0
  71. package/lib/engine/voice.d.ts +162 -0
  72. package/lib/engine/voice.js +553 -0
  73. package/lib/engine/zip.d.ts +14 -0
  74. package/lib/engine/zip.js +131 -0
  75. package/lib/host-compat/deliverables-compat.d.ts +49 -0
  76. package/lib/host-compat/deliverables-compat.js +96 -0
  77. package/lib/host-compat/fs-api.d.ts +2 -0
  78. package/lib/host-compat/fs-api.js +34 -0
  79. package/lib/host-compat/interaction.d.ts +62 -0
  80. package/lib/host-compat/interaction.js +58 -0
  81. package/lib/host-compat/services.d.ts +47 -0
  82. package/lib/host-compat/services.js +70 -0
  83. package/lib/host-compat/session-api.d.ts +90 -0
  84. package/lib/host-compat/session-api.js +309 -0
  85. package/lib/host-compat/session-source.d.ts +26 -0
  86. package/lib/host-compat/session-source.js +53 -0
  87. package/lib/host-compat/settings-compat.d.ts +31 -0
  88. package/lib/host-compat/settings-compat.js +153 -0
  89. package/lib/host-compat/uploads-compat.d.ts +44 -0
  90. package/lib/host-compat/uploads-compat.js +66 -0
  91. package/lib/index.d.ts +10 -0
  92. package/lib/index.js +381 -0
  93. package/lib/types.d.ts +63 -0
  94. package/lib/types.js +6 -0
  95. package/locale/de.json +1 -0
  96. package/locale/en.json +1 -0
  97. package/locale/es.json +1 -0
  98. package/locale/fr.json +1 -0
  99. package/locale/it.json +1 -0
  100. package/locale/ja.json +1 -0
  101. package/locale/ko.json +1 -0
  102. package/locale/ru.json +1 -0
  103. package/locale/zh.json +1 -0
  104. package/package.json +113 -4
  105. package/src/admin/api.ts +228 -0
  106. package/src/channels/dingtalk.ts +1126 -0
  107. package/src/channels/discord.ts +673 -0
  108. package/src/channels/feishu.ts +813 -0
  109. package/src/channels/imessage.ts +646 -0
  110. package/src/channels/matrix.ts +1045 -0
  111. package/src/channels/meta.ts +145 -0
  112. package/src/channels/qq.ts +853 -0
  113. package/src/channels/registry.ts +53 -0
  114. package/src/channels/slack.ts +1024 -0
  115. package/src/channels/telegram.ts +551 -0
  116. package/src/channels/types.ts +121 -0
  117. package/src/channels/wecom-app.ts +665 -0
  118. package/src/channels/wecom.ts +527 -0
  119. package/src/channels/weixin-qr.ts +95 -0
  120. package/src/channels/weixin.ts +545 -0
  121. package/src/channels/whatsapp.ts +598 -0
  122. package/src/credentials/vault.ts +133 -0
  123. package/src/engine/account-manager.ts +301 -0
  124. package/src/engine/commands.ts +316 -0
  125. package/src/engine/connector.ts +901 -0
  126. package/src/engine/delivery-log.ts +201 -0
  127. package/src/engine/files.ts +74 -0
  128. package/src/engine/fragments.ts +113 -0
  129. package/src/engine/gateway.ts +752 -0
  130. package/src/engine/interactions.ts +311 -0
  131. package/src/engine/media.ts +106 -0
  132. package/src/engine/proactive.ts +457 -0
  133. package/src/engine/quote.ts +84 -0
  134. package/src/engine/router.ts +78 -0
  135. package/src/engine/voice.ts +673 -0
  136. package/src/engine/zip.ts +154 -0
  137. package/src/host-compat/deliverables-compat.ts +141 -0
  138. package/src/host-compat/fs-api.ts +35 -0
  139. package/src/host-compat/interaction.ts +132 -0
  140. package/src/host-compat/services.ts +117 -0
  141. package/src/host-compat/session-api.ts +384 -0
  142. package/src/host-compat/session-source.ts +72 -0
  143. package/src/host-compat/settings-compat.ts +179 -0
  144. package/src/host-compat/uploads-compat.ts +126 -0
  145. package/src/index.ts +389 -0
  146. package/src/types.ts +73 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,44 @@
1
+ # Changelog
2
+
3
+ 本项目版本号遵循语义化版本;发布面与宿主兼容矩阵见 `scripts/hosts.mjs`(README 管理块同源)。
4
+
5
+ ## 0.1.0(首个功能版,dist-tag=latest)
6
+
7
+ M1–M3 代码侧全量:14 渠道协议层 + 跨版本窄腰 + 会话引擎 + 管理面。
8
+
9
+ ### Added
10
+
11
+ - 渠道(P0):微信 iLink(官方 ClawBot 协议 + 扫码绑定 UI)、飞书(WS 长连 + 流式卡片/逐步消息双档 + 语音档可选)、Telegram(长轮询 + 编辑流式)、Discord(Gateway v10 + 表格转竖排)、企微智能机器人(长连 + 思考中/工具进度原生显示)
12
+ - 渠道(P1):钉钉 stream + AI Card;QQ 官方 API v2(被动窗口);Slack Socket Mode 零 SDK + thread 模型
13
+ - 渠道(P2):WhatsApp(Baileys,QR 配对 + auth 目录持久化);Matrix(CS API,E2EE 两档诚实档位);iMessage(仅 macOS,非 darwin 硬拒载);企微自建应用(回调验签 + 加解密,webhook 白名单路由)
14
+ - 能力:命令面板 24 命令(含 /fork /rename /delivery /export /speak /mute /goal);审批与交互提问 IM 闭环(waterfall 返回即接管,fail-closed D5);图片/文件输入(宿主元数据判视觉 E4);产物文件回传;投递日志与断线补发(≤3 次,uncertain 绝不重发 D7);超时迟到结果收割;主动投递目标库 + 双向同步;碎片续写(.. / !!);引用上下文增强;会话标题渠道徽章
15
+ - AI Office Connector:查实宿主无公开 connector 协议面 → 离线 Job 队列诚实档(https 强制/租约/审批/并发上限)
16
+
17
+ ### Fixed
18
+
19
+ - Cordis ctx 代理未 inject 属性访问即抛(可选链拦不住)→ 窄腰全 try/catch 守卫
20
+ - 静音判定吞掉 /mute 自身导致的永久静默死锁;/model 与投递链 selections 键不一致导致的视觉判定永命中 unknown
21
+
22
+ ### Changed
23
+
24
+ - publishConfig.tag:next → latest;THIRD_PARTY_NOTICES 运行时依赖清单与实现对齐(纠未采纳的 SDK 列表)
25
+
26
+ ## 0.0.1(首发占位,tag=next)
27
+
28
+ 预发布占位版本,非推荐安装线;语义为「协议层与跨版本骨架完成、真机验收进行中」。
29
+
30
+ ### Added
31
+
32
+ - 跨版本窄腰(host-compat):services 能力探测冻结 / settings-compat 三态代际分派(gen1/gen2/gen3)/ session-api(宿主 @Remote request-object 主形 + 位置参回退)/ interaction(waterfall 返回即接管)/ fs-api
33
+ - 会话引擎:每聊天串行队列、follow-before-prompt 投递状态机(assistant/message 按 step 聚合 → 流式快照)、turn/end 六因映射、看门狗兜底
34
+ - 命令面板 15 命令(/help /status /new /stop /steer /models /model /reasoning /presets /preset /workspace(s) /session(s) /menu),能力缺位=降级文案不抛
35
+ - P0 五渠道协议层(净室重实现):微信 iLink(官方 ClawBot 协议:长轮询/context_token/AES-128-ECB CDN 全链/typing/扫码绑定)、Telegram(Bot API 长轮询+编辑流式+Markdown 回退链)、Discord(Gateway v10+Thread 模型+表格转竖排)、飞书(官方 SDK 长连接+逐步消息)、企业微信智能机器人(长连接 aibot 协议+stream 编辑流式)
36
+ - 审批与交互提问 IM 闭环(once-settle 状态机、发起者限定、fail-closed、5 分钟取消)
37
+ - 图片输入公共层(宿主 capability 元数据判视觉、三重预算、渠道图片下载)
38
+ - 多账号管理:AccountManager(原子文件态、secret 单向入库、暂停/恢复/白名单/诊断)+ 管理 API(requestRejection/Host/Origin/Cookie 三查、零凭据回包)+ client 半账号 CRUD 面板(九语)
39
+ - 门禁四件套:typecheck / 单测 164 项 / dist 冒烟 / hosts:check 单源下发;peer 全枚举 0.1.2-rc.1..0.2.1-rc.1(11 tag)
40
+
41
+ ### Known (intentionally pre-release)
42
+
43
+ - 各渠道真机 round-trip 验收进行中(T1.10)
44
+ - 飞书流式卡片档/QR 创建机器人、企微原生进度显示、微信设置页扫码 UI 流为后续迭代
package/LICENSE ADDED
@@ -0,0 +1,28 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 dsh-im-union contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ ---
24
+
25
+ This project is a clean-room reimplementation of capabilities popularized by
26
+ xmanrui/dsh-im (MIT) and MichengAI/dsh-im-connect (Apache-2.0). No source code
27
+ was copied from either project; see THIRD_PARTY_NOTICES.md for attribution of
28
+ protocol knowledge and external SDK dependencies.
package/README.en.md ADDED
@@ -0,0 +1,34 @@
1
+ # dsh-im-union
2
+
3
+ A union IM bridge for DeepSeek Harness — a clean-room reimplementation merging the capability sets of xmanrui/dsh-im and MichengAI/dsh-im-connect, with no source copied from either.
4
+
5
+ <!-- host-compat:begin — generated by scripts/sync-hosts.mjs from scripts/hosts.mjs; DO NOT EDIT -->
6
+ - **Supported DSH hosts:** `0.1.2-rc.1` `0.1.5-rc.1` `0.1.5-rc.2` `0.1.5-rc.3` `0.1.7-rc.1` `0.1.7-rc.2` `0.2.0-rc.1` `0.2.0-rc.2` `0.2.1-alpha.2` `0.2.1-alpha.3` `0.2.1-rc.1` (11 rc/alpha releases across lines 0.1.2 / 0.1.5 / 0.1.7 / 0.2.0 / 0.2.1)
7
+ <!-- host-compat:end -->
8
+
9
+ ## Status
10
+
11
+ **0.1.0 feature release**: all 14 P0/P1/P2 channel protocol layers, the cross-version narrow waist, session engine, approval/question IM loop and multi-account management are delivered (574 unit tests; host-farm smoke green on 0.1.2 / 0.1.5 / 0.1.7 / 0.2.1 lines). Outstanding real-device acceptance items are registered in CHANGELOG.
12
+
13
+ Highlights:
14
+
15
+ - **Channels**: WeChat (official iLink QR bind), Feishu/Lark (long-connection, streaming cards, optional voice tier), Telegram, Discord, WeCom intelligent bot, DingTalk (stream + AI Card), QQ official bot, Slack (Socket Mode, zero SDK), WhatsApp (Baileys QR pairing), Matrix, iMessage (macOS only), WeCom self-built app (signed callback webhook), and more; unconfigured channels load nothing (lazy imports).
16
+ - **In-chat loop**: 24 commands (`/help /status /new /stop /steer /model(s) /reasoning /preset(s) /session(s) /workspace(s) /fork /rename /queue /mute /unbind /goal /delivery /export /speak /menu`); tool approvals and agent questions answered in the originating chat (deny-by-default, 5-minute expiry, initiator only).
17
+ - **Cross-version**: settings surface auto-adapts gen1/gen2/gen3; capability probing only, never version branches.
18
+
19
+ ## Install
20
+
21
+ ```sh
22
+ dsh plugin --profile web add dsh-im-union@latest --registry=https://registry.npmjs.org/
23
+ ```
24
+
25
+ Then add accounts in the "IM union bridge" panel: most channels use credential binding (secrets are one-way into the vault and never echoed back); WeChat/WhatsApp use QR pairing; the WeCom self-built app channel requires pointing your callback URL (`/api/dsh-im-union/wecom-app/callback`) in its console. See `SECURITY.md` for the non-negotiable privacy red lines and `THIRD_PARTY_NOTICES.md` for the clean-room provenance.
26
+
27
+ ## Development
28
+
29
+ ```sh
30
+ npm install
31
+ npm run typecheck
32
+ npm test
33
+ node scripts/sync-hosts.mjs --write
34
+ ```
package/README.md CHANGED
@@ -1,3 +1,34 @@
1
- # Temporary Holding Version
1
+ # dsh-im-union
2
+
3
+ DeepSeek Harness 的 IM 联合桥——净室重写,能力合集来自社区两仓(xmanrui/dsh-im 与 MichengAI/dsh-im-connect),不复制其源码。
4
+
5
+ <!-- host-compat:begin — generated by scripts/sync-hosts.mjs from scripts/hosts.mjs; DO NOT EDIT -->
6
+ - **支持的 DSH 宿主:** `0.1.2-rc.1` `0.1.5-rc.1` `0.1.5-rc.2` `0.1.5-rc.3` `0.1.7-rc.1` `0.1.7-rc.2` `0.2.0-rc.1` `0.2.0-rc.2` `0.2.1-alpha.2` `0.2.1-alpha.3` `0.2.1-rc.1`(覆盖 0.1.2 / 0.1.5 / 0.1.7 / 0.2.0 / 0.2.1 共 11 个 rc/alpha)
7
+ <!-- host-compat:end -->
2
8
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
9
+ ## 状态
10
+
11
+ **0.1.0 功能版**:P0/P1/P2 十四渠道协议层、跨版本窄腰、会话引擎、审批/提问 IM 闭环、多账号管理面均已交付(单测 574 项;宿主农场 0.1.2/0.1.5/0.1.7/0.2.1 四线冒烟全绿)。真机验收项逐项登记在 CHANGELOG;能力分期见开发仓计划台账。
12
+
13
+ 能力总览:
14
+
15
+ - **渠道**:微信(官方 iLink 扫码)、飞书(长连/流式卡片/语音档可选)、Telegram、Discord、企微智能机器人(长连)、钉钉(stream+AI Card)、QQ 官方机器人、Slack(Socket Mode)、WhatsApp(Baileys 扫码)、Matrix、iMessage(仅 macOS)、企微自建应用(回调)等;未配置渠道零依赖零加载(懒 import)。
16
+ - **IM 内闭环**:24 命令面板(/help /status /new /stop /steer /model(s) /reasoning /preset(s) /session(s) /workspace(s) /fork /rename /queue /mute /unbind /goal /delivery /export /speak /menu);工具审批与交互提问原聊天回答(默认拒绝、5 分钟超时、发起者限定)。
17
+ - **跨版本**:设置面 gen1/gen2/gen3 三态自适配;能力探测优先,禁版本号分支。
18
+
19
+ ## 安装
20
+
21
+ ```sh
22
+ dsh plugin --profile web add dsh-im-union@latest --registry=https://registry.npmjs.org/
23
+ ```
24
+
25
+ 装好后在宿主侧栏/设置页的「IM 联合桥」面板添加账号:大部分渠道走凭据绑定(Bot Token/App 凭据,secret 字段只单向入库不回显);微信/WhatsApp 走扫码绑定;企微自建应用需将本插件管理面回调 URL(`/api/dsh-im-union/wecom-app/callback`)配入后台接收服务器。隐私与凭据红线见 `SECURITY.md`;第三方依赖声明见 `THIRD_PARTY_NOTICES.md`(净室重实现,不复制任何上游源码)。
26
+
27
+ ## 开发
28
+
29
+ ```sh
30
+ npm install
31
+ npm run typecheck
32
+ npm test
33
+ node scripts/sync-hosts.mjs --write # 宿主版本声明单源下发
34
+ ```
package/SECURITY.md ADDED
@@ -0,0 +1,20 @@
1
+ # Security policy (dsh-im-union)
2
+
3
+ 不可让渡红线(实现与评审均以此为准):
4
+
5
+ 1. **凭据存储**:宿主 `ctx.credentials` 为主存储;仅当宿主无该服务时回退到
6
+ profile 目录下的文件 vault(原子写 tmp+rename、POSIX 0600 / Windows 继承 ACL)。
7
+ vault 文件损坏时抛错,**绝不覆盖唯一副本**。secret 单向提交给宿主,任何
8
+ RPC/HTTP 响应与状态接口不回传 token、secret、原始用户标识或内部异常细节。
9
+ 2. **管理 API**:`/api/dsh-im-union` 每个请求先过宿主 `connection.requestRejection`
10
+ (Host/trustedHosts + Origin + 登录 Cookie 三查);`connection` 服务缺失时返回
11
+ 503,**不降级为匿名可用**。写请求要求 `Content-Type: application/json` +
12
+ 客户端标识头,body 上限 1 MiB;响应携带 `Cache-Control: no-store`。
13
+ 3. **工具审批**:审批只在任务发起的原聊天闭环处理;群聊仅接受任务发起者回复;
14
+ 永不回退网页端处理;审批消息发送失败按拒绝处理;5 分钟无回复取消动作;
15
+ 任何路径不自动恢复 allowAllUsers / 开放响应模式。
16
+ 4. **入站准入**:先验 userId;私聊白名单为空即拒;群聊仅响应显式 @ 本机器人。
17
+ 5. **投递语义**:平台接受 ≠ 已送达(Receipt);发送结果不确定时不自动重发,
18
+ 宁可漏发不双发。
19
+
20
+ 漏洞报告:仓库 GitHub Security Advisory。
@@ -0,0 +1,37 @@
1
+ # Third-party notices
2
+
3
+ dsh-im-union is a clean-room reimplementation. No source code is copied from the
4
+ projects below; capability inventory and public protocol knowledge informed
5
+ this design, and the listed upstream SDKs are consumed as external npm
6
+ dependencies only.
7
+
8
+ ## Prior art (capability references, code NOT derived from)
9
+
10
+ - xmanrui/dsh-im — MIT License. Itself derives some protocol adapters from
11
+ Tencent/openclaw-weixin (MIT), DingTalk-Real-AI/dingtalk-openclaw-connector,
12
+ and @wecom/wecom-openclaw-cli (ISC); we re-implement against the same public
13
+ platform APIs without porting any of that code.
14
+ - MichengAI/dsh-im-connect — Apache License 2.0 (includes the §3 patent grant
15
+ with retaliation termination; no code ported).
16
+
17
+ ## Runtime npm dependencies (consumed as-is, licenses per their packages)
18
+
19
+ - @larksuiteoapi/node-sdk (MIT) — Feishu/Lark bot long-connection SDK (its WS
20
+ handshake/signature surface is a private protocol, so the official SDK is used
21
+ instead of a clean-room reimplementation; lazily imported)
22
+ - @whiskeysockets/baileys (MPL-2.0) — WhatsApp Web multi-device protocol library
23
+ (lazily imported; only the WhatsApp channel touches it)
24
+ - qrcode (MIT) — QR PNG data-URL rendering for the WeChat iLink / WhatsApp
25
+ scan-to-bind flows (lazily imported)
26
+
27
+ Everything else (Telegram, Discord, Slack, QQ, DingTalk, WeCom bot long-connection,
28
+ WeCom self-built app callback crypto, WeChat iLink transport, Matrix CS API) is
29
+ implemented directly against public protocol documents with ZERO runtime
30
+ dependencies (Node >= 22 global fetch/WebSocket + node:crypto/node:zlib only).
31
+ Earlier drafts of this file listed dingtalk-stream, @wecom/aibot-node-sdk and
32
+ @tencent-connect/qqbot-connector; those SDKs were never adopted — the respective
33
+ channels are zero-dependency clean-room implementations (corrected at 0.1.0).
34
+
35
+ Optional external tools: ffmpeg (system binary, spawned only when the Feishu
36
+ voice tier is explicitly enabled; never bundled, never assumed present — the
37
+ feature degrades honestly when missing).