@yanhaidao/wecom 2.4.160 → 2.5.110

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 (313) hide show
  1. package/dist/index.js +68 -0
  2. package/dist/src/accounts.js +20 -0
  3. package/dist/src/agent/handler.js +895 -0
  4. package/dist/src/agent/index.js +5 -0
  5. package/dist/src/app/account-runtime.js +216 -0
  6. package/dist/src/app/bootstrap.js +19 -0
  7. package/dist/src/app/index.js +118 -0
  8. package/dist/src/capability/agent/delivery-service.js +63 -0
  9. package/dist/src/capability/agent/fallback-policy.js +6 -0
  10. package/dist/src/capability/agent/ingress-service.js +33 -0
  11. package/dist/src/capability/agent/upstream-delivery-service.js +71 -0
  12. package/dist/src/capability/bot/dispatch-config.js +45 -0
  13. package/dist/src/capability/bot/fallback-delivery.js +147 -0
  14. package/dist/src/capability/bot/local-path-delivery.js +178 -0
  15. package/dist/src/capability/bot/sandbox-media.js +138 -0
  16. package/dist/src/capability/bot/service.js +49 -0
  17. package/dist/src/capability/bot/stream-delivery.js +321 -0
  18. package/dist/src/capability/bot/stream-finalizer.js +81 -0
  19. package/dist/src/capability/bot/stream-orchestrator.js +318 -0
  20. package/dist/src/capability/bot/types.js +1 -0
  21. package/{src/capability/calendar/client.ts → dist/src/capability/calendar/client.js} +118 -241
  22. package/{src/capability/calendar/schema.ts → dist/src/capability/calendar/schema.js} +0 -38
  23. package/dist/src/capability/calendar/tool.js +365 -0
  24. package/dist/src/capability/calendar/types.js +12 -0
  25. package/{src/capability/doc/client.ts → dist/src/capability/doc/client.js} +370 -605
  26. package/{src/capability/doc/schema.ts → dist/src/capability/doc/schema.js} +345 -394
  27. package/dist/src/capability/doc/tool.js +1556 -0
  28. package/dist/src/capability/doc/types.js +113 -0
  29. package/dist/src/capability/mcp/index.js +3 -0
  30. package/dist/src/capability/mcp/schema.js +102 -0
  31. package/dist/src/capability/mcp/tool.js +146 -0
  32. package/dist/src/capability/mcp/transport.js +293 -0
  33. package/dist/src/channel.js +224 -0
  34. package/dist/src/config/accounts.js +236 -0
  35. package/dist/src/config/derived-paths.js +31 -0
  36. package/dist/src/config/index.js +7 -0
  37. package/dist/src/config/media.js +110 -0
  38. package/dist/src/config/network.js +32 -0
  39. package/dist/src/config/routing.js +20 -0
  40. package/dist/src/config/runtime-config.js +25 -0
  41. package/dist/src/config/schema.js +4 -0
  42. package/{src/config-schema.ts → dist/src/config-schema.js} +1 -1
  43. package/dist/src/context-store.js +219 -0
  44. package/{src/crypto/aes.ts → dist/src/crypto/aes.js} +11 -28
  45. package/dist/src/crypto/index.js +9 -0
  46. package/{src/crypto/signature.ts → dist/src/crypto/signature.js} +3 -18
  47. package/{src/crypto/xml.ts → dist/src/crypto/xml.js} +3 -11
  48. package/dist/src/crypto.js +145 -0
  49. package/dist/src/domain/models.js +1 -0
  50. package/dist/src/domain/policies.js +32 -0
  51. package/{src/dynamic-agent.ts → dist/src/dynamic-agent.js} +36 -73
  52. package/dist/src/gateway-monitor.js +139 -0
  53. package/dist/src/http.js +114 -0
  54. package/{src/media.ts → dist/src/media.js} +21 -40
  55. package/dist/src/monitor/limits.js +7 -0
  56. package/dist/src/monitor/state.js +28 -0
  57. package/dist/src/monitor.js +84 -0
  58. package/dist/src/observability/audit-log.js +30 -0
  59. package/dist/src/observability/legacy-operational-event-store.js +22 -0
  60. package/dist/src/observability/raw-envelope-log.js +24 -0
  61. package/dist/src/observability/status-registry.js +9 -0
  62. package/dist/src/observability/transport-session-view.js +14 -0
  63. package/dist/src/onboarding.js +546 -0
  64. package/dist/src/outbound.js +557 -0
  65. package/dist/src/runtime/dispatcher.js +57 -0
  66. package/{src/runtime/index.ts → dist/src/runtime/index.js} +0 -1
  67. package/dist/src/runtime/outbound-intent.js +1 -0
  68. package/dist/src/runtime/reply-orchestrator.js +38 -0
  69. package/dist/src/runtime/routing-bridge.js +26 -0
  70. package/dist/src/runtime/session-manager.js +112 -0
  71. package/dist/src/runtime/source-registry.js +174 -0
  72. package/dist/src/runtime.js +1 -0
  73. package/dist/src/shared/command-auth.js +57 -0
  74. package/{src/shared/index.ts → dist/src/shared/index.js} +0 -1
  75. package/dist/src/shared/media-asset.js +65 -0
  76. package/dist/src/shared/media-service.js +59 -0
  77. package/dist/src/shared/media-types.js +1 -0
  78. package/{src/shared/xml-parser.ts → dist/src/shared/xml-parser.js} +72 -63
  79. package/dist/src/store/active-reply-store.js +41 -0
  80. package/dist/src/store/interfaces.js +1 -0
  81. package/dist/src/store/memory-store.js +33 -0
  82. package/dist/src/store/stream-batch-store.js +319 -0
  83. package/{src/target.ts → dist/src/target.js} +15 -48
  84. package/dist/src/transport/agent-api/client.js +168 -0
  85. package/dist/src/transport/agent-api/core.js +337 -0
  86. package/dist/src/transport/agent-api/delivery.js +28 -0
  87. package/dist/src/transport/agent-api/media-upload.js +4 -0
  88. package/dist/src/transport/agent-api/reply.js +24 -0
  89. package/dist/src/transport/agent-api/upstream-delivery.js +30 -0
  90. package/dist/src/transport/agent-api/upstream-media-upload.js +46 -0
  91. package/dist/src/transport/agent-api/upstream-reply.js +26 -0
  92. package/dist/src/transport/agent-callback/http-handler.js +30 -0
  93. package/dist/src/transport/agent-callback/inbound.js +4 -0
  94. package/dist/src/transport/agent-callback/reply.js +8 -0
  95. package/dist/src/transport/agent-callback/request-handler.js +189 -0
  96. package/dist/src/transport/agent-callback/session.js +15 -0
  97. package/dist/src/transport/bot-webhook/active-reply.js +27 -0
  98. package/dist/src/transport/bot-webhook/http-handler.js +31 -0
  99. package/dist/src/transport/bot-webhook/inbound-normalizer.js +496 -0
  100. package/dist/src/transport/bot-webhook/inbound.js +4 -0
  101. package/dist/src/transport/bot-webhook/message-shape.js +98 -0
  102. package/dist/src/transport/bot-webhook/protocol.js +124 -0
  103. package/dist/src/transport/bot-webhook/reply.js +9 -0
  104. package/dist/src/transport/bot-webhook/request-handler.js +285 -0
  105. package/dist/src/transport/bot-webhook/session.js +15 -0
  106. package/dist/src/transport/bot-ws/inbound.js +147 -0
  107. package/dist/src/transport/bot-ws/media.js +236 -0
  108. package/dist/src/transport/bot-ws/reply.js +310 -0
  109. package/dist/src/transport/bot-ws/sdk-adapter.js +257 -0
  110. package/dist/src/transport/bot-ws/session.js +15 -0
  111. package/dist/src/transport/http/common.js +78 -0
  112. package/dist/src/transport/http/registry.js +71 -0
  113. package/dist/src/transport/http/request-handler.js +51 -0
  114. package/{src/transport/index.ts → dist/src/transport/index.js} +2 -10
  115. package/dist/src/types/account.js +1 -0
  116. package/dist/src/types/config.js +1 -0
  117. package/dist/src/types/constants.js +28 -0
  118. package/dist/src/types/events.js +1 -0
  119. package/dist/src/types/index.js +1 -0
  120. package/dist/src/types/legacy-stream.js +1 -0
  121. package/dist/src/types/message.js +5 -0
  122. package/dist/src/types/runtime-context.js +1 -0
  123. package/dist/src/types/runtime.js +1 -0
  124. package/dist/src/types.js +1 -0
  125. package/dist/src/upstream/index.js +111 -0
  126. package/dist/src/wecom_msg_adapter/markdown_adapter.js +280 -0
  127. package/openclaw.plugin.json +15 -0
  128. package/package.json +18 -1
  129. package/.github/workflows/release.yml +0 -143
  130. package/GOVERNANCE.md +0 -26
  131. package/SKILLS_CAL.md +0 -895
  132. package/SKILLS_DOC.md +0 -2288
  133. package/UPSTREAM_CONFIG.md +0 -170
  134. package/UPSTREAM_PLAN.md +0 -175
  135. package/assets/01.bot-add.png +0 -0
  136. package/assets/01.bot-setp2.png +0 -0
  137. package/assets/01.image.jpg +0 -0
  138. package/assets/02.agent.add.png +0 -0
  139. package/assets/02.agent.api-set.png +0 -0
  140. package/assets/02.image.jpg +0 -0
  141. package/assets/03.agent.page.png +0 -0
  142. package/assets/03.bot.page.png +0 -0
  143. package/assets/link-me.jpg +0 -0
  144. package/assets/register.png +0 -0
  145. package/changelog/v2.2.28.md +0 -70
  146. package/changelog/v2.3.10.md +0 -17
  147. package/changelog/v2.3.11.md +0 -19
  148. package/changelog/v2.3.12.md +0 -25
  149. package/changelog/v2.3.13.md +0 -19
  150. package/changelog/v2.3.14.md +0 -48
  151. package/changelog/v2.3.15.md +0 -15
  152. package/changelog/v2.3.16.md +0 -11
  153. package/changelog/v2.3.18.md +0 -22
  154. package/changelog/v2.3.19.md +0 -73
  155. package/changelog/v2.3.2.md +0 -28
  156. package/changelog/v2.3.26.md +0 -21
  157. package/changelog/v2.3.27.md +0 -33
  158. package/changelog/v2.3.4.md +0 -20
  159. package/changelog/v2.3.9.md +0 -22
  160. package/changelog/v2.4.12.md +0 -37
  161. package/changelog/v2.4.16.md +0 -19
  162. package/compat-single-account.md +0 -148
  163. package/index.test.ts +0 -38
  164. package/scripts/test-proxy.ts +0 -70
  165. package/src/accounts.ts +0 -34
  166. package/src/agent/api-client.upload.test.ts +0 -109
  167. package/src/agent/handler.event-filter.test.ts +0 -100
  168. package/src/agent/handler.ts +0 -1105
  169. package/src/agent/index.ts +0 -12
  170. package/src/app/account-runtime.ts +0 -276
  171. package/src/app/bootstrap.ts +0 -29
  172. package/src/app/index.ts +0 -192
  173. package/src/capability/agent/delivery-service.ts +0 -87
  174. package/src/capability/agent/fallback-policy.ts +0 -13
  175. package/src/capability/agent/ingress-service.ts +0 -38
  176. package/src/capability/agent/upstream-delivery-service.ts +0 -96
  177. package/src/capability/bot/dispatch-config.ts +0 -47
  178. package/src/capability/bot/fallback-delivery.ts +0 -178
  179. package/src/capability/bot/local-path-delivery.ts +0 -215
  180. package/src/capability/bot/sandbox-media.test.ts +0 -221
  181. package/src/capability/bot/sandbox-media.ts +0 -176
  182. package/src/capability/bot/service.ts +0 -56
  183. package/src/capability/bot/stream-delivery.ts +0 -379
  184. package/src/capability/bot/stream-finalizer.ts +0 -120
  185. package/src/capability/bot/stream-orchestrator.ts +0 -371
  186. package/src/capability/bot/types.ts +0 -8
  187. package/src/capability/calendar/SKILLS_CHECKLIST.md +0 -251
  188. package/src/capability/calendar/tool.ts +0 -417
  189. package/src/capability/calendar/types.ts +0 -309
  190. package/src/capability/doc/tool.ts +0 -1629
  191. package/src/capability/doc/types.ts +0 -792
  192. package/src/capability/mcp/index.ts +0 -10
  193. package/src/capability/mcp/schema.ts +0 -107
  194. package/src/capability/mcp/tool.ts +0 -174
  195. package/src/capability/mcp/transport.ts +0 -394
  196. package/src/channel.config.test.ts +0 -147
  197. package/src/channel.lifecycle.test.ts +0 -255
  198. package/src/channel.meta.test.ts +0 -26
  199. package/src/channel.ts +0 -256
  200. package/src/config/accounts.resolve.test.ts +0 -75
  201. package/src/config/accounts.ts +0 -296
  202. package/src/config/derived-paths.test.ts +0 -111
  203. package/src/config/derived-paths.ts +0 -41
  204. package/src/config/index.ts +0 -26
  205. package/src/config/media.test.ts +0 -113
  206. package/src/config/media.ts +0 -139
  207. package/src/config/network.ts +0 -53
  208. package/src/config/routing.test.ts +0 -88
  209. package/src/config/routing.ts +0 -26
  210. package/src/config/runtime-config.ts +0 -46
  211. package/src/config/schema.ts +0 -90
  212. package/src/context-store.ts +0 -297
  213. package/src/crypto/index.ts +0 -24
  214. package/src/crypto.test.ts +0 -32
  215. package/src/crypto.ts +0 -176
  216. package/src/domain/models.ts +0 -7
  217. package/src/domain/policies.ts +0 -36
  218. package/src/dynamic-agent.account-scope.test.ts +0 -17
  219. package/src/gateway-monitor.ts +0 -181
  220. package/src/http.ts +0 -145
  221. package/src/media.test.ts +0 -82
  222. package/src/monitor/limits.ts +0 -7
  223. package/src/monitor/state.queue.test.ts +0 -185
  224. package/src/monitor/state.ts +0 -34
  225. package/src/monitor.active.test.ts +0 -245
  226. package/src/monitor.inbound-filter.test.ts +0 -63
  227. package/src/monitor.integration.test.ts +0 -208
  228. package/src/monitor.ts +0 -121
  229. package/src/monitor.webhook.test.ts +0 -774
  230. package/src/observability/audit-log.ts +0 -48
  231. package/src/observability/legacy-operational-event-store.ts +0 -36
  232. package/src/observability/raw-envelope-log.ts +0 -28
  233. package/src/observability/status-registry.ts +0 -13
  234. package/src/observability/transport-session-view.ts +0 -14
  235. package/src/onboarding.test.ts +0 -336
  236. package/src/onboarding.ts +0 -704
  237. package/src/outbound.test.ts +0 -1271
  238. package/src/outbound.ts +0 -746
  239. package/src/runtime/dispatcher.ts +0 -71
  240. package/src/runtime/outbound-intent.ts +0 -4
  241. package/src/runtime/reply-orchestrator.test.ts +0 -71
  242. package/src/runtime/reply-orchestrator.ts +0 -67
  243. package/src/runtime/routing-bridge.test.ts +0 -115
  244. package/src/runtime/routing-bridge.ts +0 -44
  245. package/src/runtime/session-manager.test.ts +0 -174
  246. package/src/runtime/session-manager.ts +0 -139
  247. package/src/runtime/source-registry.ts +0 -249
  248. package/src/runtime.ts +0 -14
  249. package/src/shared/command-auth.ts +0 -87
  250. package/src/shared/media-asset.ts +0 -78
  251. package/src/shared/media-service.test.ts +0 -111
  252. package/src/shared/media-service.ts +0 -84
  253. package/src/shared/media-types.ts +0 -5
  254. package/src/shared/xml-parser.test.ts +0 -50
  255. package/src/store/active-reply-store.ts +0 -42
  256. package/src/store/interfaces.ts +0 -11
  257. package/src/store/memory-store.ts +0 -43
  258. package/src/store/stream-batch-store.ts +0 -350
  259. package/src/transport/agent-api/client.ts +0 -277
  260. package/src/transport/agent-api/core.ts +0 -463
  261. package/src/transport/agent-api/delivery.ts +0 -41
  262. package/src/transport/agent-api/media-upload.ts +0 -11
  263. package/src/transport/agent-api/reply.ts +0 -39
  264. package/src/transport/agent-api/upstream-delivery.ts +0 -45
  265. package/src/transport/agent-api/upstream-media-upload.ts +0 -70
  266. package/src/transport/agent-api/upstream-reply.ts +0 -43
  267. package/src/transport/agent-callback/http-handler.ts +0 -47
  268. package/src/transport/agent-callback/inbound.ts +0 -5
  269. package/src/transport/agent-callback/reply.ts +0 -13
  270. package/src/transport/agent-callback/request-handler.ts +0 -244
  271. package/src/transport/agent-callback/session.ts +0 -23
  272. package/src/transport/bot-webhook/active-reply.ts +0 -39
  273. package/src/transport/bot-webhook/http-handler.ts +0 -48
  274. package/src/transport/bot-webhook/inbound-normalizer.test.ts +0 -433
  275. package/src/transport/bot-webhook/inbound-normalizer.ts +0 -558
  276. package/src/transport/bot-webhook/inbound.ts +0 -5
  277. package/src/transport/bot-webhook/message-shape.ts +0 -92
  278. package/src/transport/bot-webhook/protocol.ts +0 -148
  279. package/src/transport/bot-webhook/reply.ts +0 -15
  280. package/src/transport/bot-webhook/request-handler.ts +0 -394
  281. package/src/transport/bot-webhook/session.ts +0 -23
  282. package/src/transport/bot-ws/inbound.test.ts +0 -290
  283. package/src/transport/bot-ws/inbound.ts +0 -163
  284. package/src/transport/bot-ws/media.test.ts +0 -44
  285. package/src/transport/bot-ws/media.ts +0 -321
  286. package/src/transport/bot-ws/reply.test.ts +0 -450
  287. package/src/transport/bot-ws/reply.ts +0 -365
  288. package/src/transport/bot-ws/sdk-adapter.test.ts +0 -187
  289. package/src/transport/bot-ws/sdk-adapter.ts +0 -314
  290. package/src/transport/bot-ws/session.ts +0 -28
  291. package/src/transport/http/common.ts +0 -109
  292. package/src/transport/http/registry.ts +0 -92
  293. package/src/transport/http/request-handler.ts +0 -84
  294. package/src/types/account.ts +0 -70
  295. package/src/types/config.ts +0 -114
  296. package/src/types/constants.ts +0 -31
  297. package/src/types/events.ts +0 -21
  298. package/src/types/global.d.ts +0 -9
  299. package/src/types/index.ts +0 -17
  300. package/src/types/legacy-stream.ts +0 -50
  301. package/src/types/message.ts +0 -189
  302. package/src/types/runtime-context.ts +0 -28
  303. package/src/types/runtime.ts +0 -165
  304. package/src/types.ts +0 -41
  305. package/src/upstream/index.ts +0 -150
  306. package/src/upstream.test.ts +0 -84
  307. package/src/wecom_msg_adapter/markdown_adapter.ts +0 -331
  308. package/tsconfig.json +0 -22
  309. package/vitest.config.ts +0 -26
  310. /package/{src/capability/agent/index.ts → dist/src/capability/agent/index.js} +0 -0
  311. /package/{src/capability/bot/index.ts → dist/src/capability/bot/index.js} +0 -0
  312. /package/{src/capability/calendar/index.ts → dist/src/capability/calendar/index.js} +0 -0
  313. /package/{src/capability/index.ts → dist/src/capability/index.js} +0 -0
@@ -1,170 +0,0 @@
1
- # WeCom 插件上下游企业配置指南
2
-
3
- ## 背景
4
-
5
- 企业微信的「上下游」功能允许企业与其经销商、供应商、合作伙伴便捷沟通、共享应用。
6
-
7
- ## 问题
8
-
9
- - 上下游企业的 CorpID 与主企业不同
10
- - 上下游企业只能使用 Agent 渠道(没有 Bot 渠道)
11
- - 需要使用下游企业的 access_token 来发送消息
12
-
13
- ## 解决方案
14
-
15
- 修改后的 WeCom 插件支持通过配置 `upstreamCorps` 来发送消息给上下游用户。
16
-
17
- ## 配置方法
18
-
19
- 在 `openclaw.json` 中,为需要支持上下游的账号添加 `upstreamCorps` 配置:
20
-
21
- ```json
22
- {
23
- "channels": {
24
- "wecom": {
25
- "accounts": {
26
- "<ACCOUNT_ID>": {
27
- "enabled": true,
28
- "name": "<ACCOUNT_NAME>",
29
- "agent": {
30
- "corpId": "<PRIMARY_CORP_ID>",
31
- "agentId": <PRIMARY_AGENT_ID>,
32
- "agentSecret": "<PRIMARY_AGENT_SECRET>",
33
- "token": "<PRIMARY_CALLBACK_TOKEN>",
34
- "encodingAESKey": "<PRIMARY_ENCODING_AES_KEY>",
35
- "welcomeText": "<WELCOME_TEXT>",
36
- "dm": {
37
- "policy": "open",
38
- "allowFrom": []
39
- },
40
- "upstreamCorps": {
41
- "<UPSTREAM_CORP_KEY>": {
42
- "corpId": "<UPSTREAM_CORP_ID>",
43
- "agentId": <UPSTREAM_AGENT_ID>
44
- }
45
- }
46
- },
47
- "bot": {
48
- "primaryTransport": "webhook",
49
- "streamPlaceholderContent": "正在思考...",
50
- "welcomeText": "<BOT_WELCOME_TEXT>",
51
- "dm": {
52
- "policy": "open",
53
- "allowFrom": []
54
- },
55
- "webhook": {
56
- "token": "<BOT_WEBHOOK_TOKEN>",
57
- "encodingAESKey": "<BOT_WEBHOOK_ENCODING_AES_KEY>"
58
- }
59
- }
60
- }
61
- }
62
- }
63
- }
64
- }
65
- ```
66
-
67
- 占位符说明:
68
-
69
- 1. `<ACCOUNT_ID>`: OpenClaw 中的 WeCom 账号 ID(如 `default`、`lab`)。
70
- 2. `<PRIMARY_CORP_ID>` / `<PRIMARY_AGENT_ID>`: 上游(主)企业应用信息。
71
- 3. `<UPSTREAM_CORP_ID>` / `<UPSTREAM_AGENT_ID>`: 下游企业应用信息(可由 95813 接口返回)。
72
- 4. `<UPSTREAM_CORP_KEY>`: `upstreamCorps` 的配置键,建议与 `<UPSTREAM_CORP_ID>` 保持一致。
73
-
74
- ## 配置说明
75
-
76
- ### upstreamCorps 字段
77
-
78
- - **key**: 下游企业标识(推荐直接使用下游 CorpID,例如 `<UPSTREAM_CORP_ID>`)
79
- - **value**: 该下游企业的 Agent 配置
80
- - `corpId`: 下游企业的 CorpID
81
- - `agentId`: 下游企业的 AgentID
82
-
83
- ## 获取下游企业配置信息
84
-
85
- 1. **CorpID**: 从企业微信管理后台获取,或从消息回调中的 `ToUserName` 字段获取
86
- 2. **AgentID**: 从企业微信管理后台 - 应用管理 中获取
87
- 3. **AgentSecret**: 仅主企业应用需要配置(用于获取主企业 access_token)
88
-
89
- ### 通过接口自动获取(推荐)
90
-
91
- 你也可以通过企业微信官方接口「获取应用共享信息」批量拉取上下游企业的 `corpid` 与 `agentid`:
92
-
93
- - 文档: https://developer.work.weixin.qq.com/document/path/95813
94
- - 接口: `POST https://qyapi.weixin.qq.com/cgi-bin/corpgroup/corp/list_app_share_info?access_token=ACCESS_TOKEN`
95
-
96
- 请求体示例(上下游场景):
97
-
98
- ```json
99
- {
100
- "agentid": <PRIMARY_AGENT_ID>,
101
- "business_type": 1,
102
- "limit": 100
103
- }
104
- ```
105
-
106
- 参数要点:
107
-
108
- 1. `access_token` 使用上游企业应用的 access_token。
109
- 2. `business_type` 传 `1` 表示上下游企业。
110
- 3. `agentid` 传上游企业当前应用的 AgentID。
111
- 4. 当企业较多时,用 `cursor` + `next_cursor` 分页拉取,直到 `ending=1`。
112
-
113
- 返回字段映射到配置:
114
-
115
- 1. `corp_list[].corpid` -> `upstreamCorps.<key>.corpId`
116
- 2. `corp_list[].agentid` -> `upstreamCorps.<key>.agentId`
117
-
118
- 示例返回(节选):
119
-
120
- ```json
121
- {
122
- "errcode": 0,
123
- "errmsg": "ok",
124
- "ending": 0,
125
- "next_cursor": "<NEXT_CURSOR>",
126
- "corp_list": [
127
- {
128
- "corpid": "<UPSTREAM_CORP_ID>",
129
- "corp_name": "<UPSTREAM_CORP_NAME>",
130
- "agentid": <UPSTREAM_AGENT_ID>
131
- }
132
- ]
133
- }
134
- ```
135
-
136
- 可直接转换成:
137
-
138
- ```json
139
- {
140
- "upstreamCorps": {
141
- "<UPSTREAM_CORP_KEY>": {
142
- "corpId": "<UPSTREAM_CORP_ID>",
143
- "agentId": <UPSTREAM_AGENT_ID>
144
- }
145
- }
146
- }
147
- ```
148
-
149
- 提示:如果某个下游企业未在 `corp_list` 中出现,通常是该企业还未确认应用共享或共享未生效。
150
-
151
- ## 工作原理
152
-
153
- 1. 当收到消息时,插件检测消息中的 `ToUserName`(CorpID)
154
- 2. 如果 `ToUserName` 与主 CorpID 不同,则识别为上下游用户
155
- 3. 回复时使用 `wecom-agent-upstream:{accountId}:{corpId}:{userId}` 格式的 target
156
- 4. Outbound 模块解析该 target,使用对应的上下游 Agent 配置发送消息
157
-
158
- ## 日志示例
159
-
160
- ```
161
- [wecom-agent] detected upstream user: from=<UPSTREAM_USER_ID> toCorpId=<UPSTREAM_CORP_ID>
162
- [wecom-outbound] Sending text to upstream target=wecom-agent-upstream:<ACCOUNT_ID>:<UPSTREAM_CORP_ID>:<UPSTREAM_USER_ID> corpId=<UPSTREAM_CORP_ID>
163
- [wecom-outbound] Successfully sent upstream Agent text to wecom-agent-upstream:<ACCOUNT_ID>:<UPSTREAM_CORP_ID>:<UPSTREAM_USER_ID>
164
- ```
165
-
166
- ## 注意事项
167
-
168
- 1. `upstreamCorps` 仅需配置下游 `corpId` 与 `agentId`,不需要下游 `agentSecret`
169
- 2. 上下游企业需要在企业微信管理后台配置「可调用接口的应用」
170
- 3. 上游企业需要将应用共享给下游企业
package/UPSTREAM_PLAN.md DELETED
@@ -1,175 +0,0 @@
1
- # WeCom 上下游企业支持修改计划
2
-
3
- ## 问题分析
4
-
5
- 根据企业微信文档和日志分析,问题出在**企业微信上下游的 Agent 消息发送机制**:
6
-
7
- 1. **上下游用户的 CorpID 不同**:
8
- - 主企业:`<PRIMARY_CORP_ID>`
9
- - 上下游企业:`<UPSTREAM_CORP_ID>`
10
-
11
- 2. **错误码 81013 的含义**:
12
- `user & party & tag all invalid` - 用户、部门、标签全部无效
13
-
14
- 3. **根本原因**:
15
- OpenClaw 使用主企业的 Agent (corpId=<PRIMARY_CORP_ID>, agentId=<PRIMARY_AGENT_ID>) 尝试给上下游用户发送消息,但企业微信的 Agent **只能向本企业可见成员发送消息**,上下游用户不在主企业 Agent 的可见范围内。
16
-
17
- ## 解决方案
18
-
19
- 根据企业微信文档 https://developer.work.weixin.qq.com/document/path/95816,正确的解决方案是:
20
-
21
- ### 核心逻辑
22
-
23
- 1. **检测上下游用户**:通过消息中的 `ToUserName`(CorpID)来判断
24
- 2. **获取下游企业的 access_token**:
25
- - 使用上游企业的 access_token 作为调用凭证
26
- - 调用 `corpgroup/corp/gettoken` 接口获取下游企业的 access_token
27
- 3. **使用下游企业的 access_token 发送消息**:
28
- - 使用下游企业的 `agentId`
29
- - 使用获取到的下游企业 access_token
30
-
31
- ### 获取下游企业 access_token 的接口
32
-
33
- ```
34
- POST https://qyapi.weixin.qq.com/cgi-bin/corpgroup/corp/gettoken?access_token=ACCESS_TOKEN
35
- {
36
- "corpid": "下游企业corpid",
37
- "business_type": 1, // 1 表示上下游企业
38
- "agentid": 下游企业应用ID
39
- }
40
- ```
41
-
42
- **注意**:
43
- - 需要使用上游企业的 access_token 作为调用凭证
44
- - `business_type` 必须设置为 `1` 表示上下游企业
45
- - 返回的 access_token 可用于调用下游企业通讯录的只读接口
46
-
47
- ### 修改模块
48
-
49
- #### 模块 1:配置扩展(types/config.ts)
50
-
51
- ```typescript
52
- export type WecomUpstreamCorpConfig = {
53
- corpId: string;
54
- agentId: number;
55
- };
56
-
57
- export type WecomAgentConfig = {
58
- // ... 其他配置
59
- /**
60
- * 上下游企业配置映射
61
- * key: 配置名称(可自定义)
62
- * value: 下游企业的 CorpID 和 AgentID
63
- */
64
- upstreamCorps?: Record<string, WecomUpstreamCorpConfig>;
65
- };
66
- ```
67
-
68
- #### 模块 2:上下游支持模块(upstream/index.ts)
69
-
70
- - `detectUpstreamUser()`: 检测是否是上下游用户
71
- - `createUpstreamAgentConfig()`: 创建上下游 Agent 配置
72
- - `resolveUpstreamCorpConfig()`: 从配置中解析上下游企业配置
73
- - `buildUpstreamAgentSessionTarget()`: 构建上下游用户的回复目标
74
- - `parseUpstreamAgentSessionTarget()`: 解析上下游用户的回复目标
75
-
76
- #### 模块 3:access_token 获取(transport/agent-api/core.ts)
77
-
78
- 添加 `getUpstreamAccessToken()` 函数:
79
- - 先获取上游企业的 access_token
80
- - 调用 `corpgroup/corp/gettoken` 接口获取下游企业的 access_token
81
-
82
- #### 模块 4:上下游消息发送(transport/agent-api/client.ts)
83
-
84
- 添加 `sendUpstreamAgentApiText()` 和 `sendUpstreamAgentApiMedia()` 函数:
85
- - 使用 `getUpstreamAgentApiAccessToken()` 获取下游企业的 access_token
86
- - 使用下游企业的 `agentId` 发送消息
87
-
88
- #### 模块 5:上下游 DeliveryService(capability/agent/upstream-delivery-service.ts)
89
-
90
- 新建 `WecomUpstreamAgentDeliveryService` 类:
91
- - 专门用于发送消息给上下游用户
92
- - 使用下游企业的 access_token 和 agentId
93
-
94
- #### 模块 6:消息发送路由(outbound.ts)
95
-
96
- - 检测 `wecom-agent-upstream:` 格式的目标
97
- - 使用 `WecomUpstreamAgentDeliveryService` 发送消息
98
-
99
- ## 配置示例
100
-
101
- ```yaml
102
- channels:
103
- wecom:
104
- accounts:
105
- <ACCOUNT_KEY>:
106
- agent:
107
- corpId: "<PRIMARY_CORP_ID>" # 主企业 CorpID
108
- agentId: <PRIMARY_AGENT_ID>
109
- agentSecret: "<PRIMARY_AGENT_SECRET>"
110
- token: "<CALLBACK_TOKEN>"
111
- encodingAESKey: "<CALLBACK_ENCODING_AES_KEY>"
112
- # 上下游企业配置
113
- upstreamCorps:
114
- <UPSTREAM_KEY>: # 自定义名称
115
- corpId: "<UPSTREAM_CORP_ID>" # 下游企业 CorpID
116
- agentId: <UPSTREAM_AGENT_ID> # 下游企业的 AgentID
117
- ```
118
-
119
- ## 关键实现细节
120
-
121
- ### 1. 获取下游企业 access_token
122
-
123
- ```typescript
124
- const primaryToken = await getAccessToken(primaryAgent);
125
- const url = `https://qyapi.weixin.qq.com/cgi-bin/corpgroup/corp/gettoken?access_token=${primaryToken}`;
126
- const res = await wecomFetch(url, {
127
- method: "POST",
128
- headers: { "Content-Type": "application/json" },
129
- body: JSON.stringify({
130
- corpid: "<UPSTREAM_CORP_ID>",
131
- business_type: 1, // 1 表示上下游企业
132
- agentid: <UPSTREAM_AGENT_ID>,
133
- }),
134
- });
135
- ```
136
-
137
- ### 2. 发送消息
138
-
139
- 使用获取到的下游企业 access_token 和下游企业的 agentId 发送消息:
140
-
141
- ```typescript
142
- const token = await getUpstreamAgentApiAccessToken({
143
- primaryAgent,
144
- upstreamCorpId,
145
- upstreamAgentId,
146
- });
147
- const url = `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${token}`;
148
- const body = {
149
- touser: "<UPSTREAM_USER_ID>",
150
- msgtype: "text",
151
- agentid: <UPSTREAM_AGENT_ID>,
152
- text: { content: text },
153
- };
154
- ```
155
-
156
- ### 3. 上下游用户检测
157
-
158
- 在消息接收时,通过比较 `ToUserName`(消息中的 CorpID)和配置的 `corpId` 来检测:
159
-
160
- ```typescript
161
- const isUpstreamUser = messageToUserName !== primaryCorpId;
162
- ```
163
-
164
- ## 测试步骤
165
-
166
- 1. 配置上下游企业的 `corpId` 和 `agentId`
167
- 2. 让上下游用户发送消息到应用
168
- 3. 验证是否能正确接收消息
169
- 4. 验证是否能正确回复消息
170
- 5. 检查日志中的 `corpId` 和 `agentId` 是否正确
171
-
172
- ## 参考资料
173
-
174
- - 企业微信上下游概述:https://developer.work.weixin.qq.com/document/path/97213
175
- - 获取下游企业 access_token:https://developer.work.weixin.qq.com/document/path/95816
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,70 +0,0 @@
1
- # 🚀 OpenClaw 企业微信 (WeCom) 插件 v2.2.28 - 多账号隔离与稳定性增强
2
-
3
- 本次 v2.2.28 版本是 **OpenClaw 企业微信 (WeCom) 插件** 的一次重大里程碑更新。我们深度优化了 **微信 / 企业微信** 办公场景下的多智能体隔离逻辑,并修复了生命周期、XML 数据保真等多个生产环境的核心痛点。
4
-
5
- 本次更新让 **OpenClaw** 在处理企业级复杂 **插件** 配置时更加得心应手,完美解决大模型接入 **WeCom** 的所有阻碍。
6
-
7
- ---
8
-
9
- ### 🌟 版本亮点 (Release Highlights)
10
-
11
- * 🎯 **多账号矩阵支持**:支持按 `accountId` 进行组内会话隔离。不同部门、不同业务的 **企业微信** 机器人可并行运行,互不干扰,彻底解决跨账号串会话问题。
12
- * 🔐 **数据保真解析**:针对 **WeCom** 的 XML 消息解析进行了重构。关闭了自动数值化,保留 `FromUserName` 前导 `0`,并完美解决 64 位 `MsgId` 精度风险。
13
- * 🔁 **Gateway 生命周期适配**:完美兼容最新版 **OpenClaw** Gateway 的生命周期管理,修复了在高频心跳监测下的重启循环问题,运行更稳健。
14
- * 🧹 **入站消息过滤**:优化了 **微信** 与 **企业微信** 的事件过滤逻辑,避免系统事件、缺失发送者等无效消息进入 AI 会话,防止“误回复”。
15
- * 🧱 **配置安全护栏**:新增 **企业微信** 账号冲突检测。自动拦截重复的 `bot.token` 或 `agentId` 配置,并提供友好的中文错误提示。
16
-
17
- ---
18
-
19
- ### 📝 详细更新日志 (Changelog)
20
-
21
- #### 【重磅更新】🎯 多账号/多智能体可用性增强
22
- - 支持按 `accountId` 做组内隔离(Bot + Agent + 路由绑定同组生效)。
23
- - 动态 Agent 与会话键增加 `accountId` 维度,避免跨账号串会话。
24
-
25
- #### 【稳定性】🔁 生命周期兼容修复
26
- - 适配新版 **OpenClaw** Gateway 生命周期,`startAccount` 改为长生命周期运行。
27
- - 修复了“几秒一次重启 + health-monitor 二次重启”的循环问题。
28
-
29
- #### 【准确性】🔐 XML 字段保真修复
30
- - **WeCom** Agent XML 解析关闭自动数值化,保留发送者原始 ID。
31
- - 避免 `MsgId` (64bit) 精度损失,确保回复目标不被误改。
32
-
33
- #### 【准确性】🧹 误回复修复
34
- - Bot/Agent 入站均增加事件过滤,避免处理 `event`、`sys` 及缺失发送者的消息。
35
- - 修复群聊缺失 `chatid` 时仍进入 AI 会话的问题,避免“一个消息触发多人误回复”。
36
-
37
- #### 【可控性】🧱 配置安全护栏
38
- - 新增多账号冲突检测,自动拦截重复 Token 或 Agent ID 的配置。
39
- - **账号管理修复**:`deleteAccount` 现在仅删除目标账号,不再误删整个 **插件** 的 `channels.wecom` 配置。
40
-
41
- #### 【质量保障】✅ 自动化回归
42
- - 新增账号解析、冲突检测、动态路由隔离、生命周期与入站过滤的多项自动化测试。
43
- - **文档优化**:README 快速开始文档更新,优先展示“多账号 + 多 Agent”矩阵配置。
44
-
45
- ---
46
-
47
- ### 💾 安装与升级 (Install & Update)
48
-
49
- 使用 **OpenClaw** CLI 即可一键升级 **插件**:
50
-
51
- ```bash
52
- openclaw plugins upgrade wecom
53
- ```
54
-
55
- 或手动更新配置:
56
- ```bash
57
- openclaw config set channels.wecom.enabled true
58
- ```
59
-
60
- ---
61
-
62
- ### 🔍 SEO 关键词 (Keywords)
63
- **openclaw** | **企业微信** | **微信** | **wecom** | **插件** | **AI 机器人** | **大模型网关** | **流式响应** | **多账号隔离** | **WeCom Plugin**
64
-
65
- ---
66
-
67
- ### 📮 联系我们
68
- 如果您在 **企业微信 / 微信** 接入过程中遇到任何问题,欢迎提交 Issue 或加入我们的交流群。
69
-
70
- > **提示**:建议 **OpenClaw** 主程序版本保持在 **2026.2.24+** 以获得最佳体验。
@@ -1,17 +0,0 @@
1
- # OpenClaw WeCom 插件 v2.3.10 变更简报
2
-
3
- > [!TIP]
4
- > **默认更易用、修复更直接的版本。**
5
-
6
- ## 2026-03-10(v2.3.10)
7
- - 【消息防丢修复】🐛 **[重要修复]** 针对由于模型 API 限速或超长思考(如 DeepSeek R1)导致的企微 WebSocket 5秒超时断连问题,引入了 4 秒前置保活机制(自动下发"⏳ 正在思考中..."),彻底阻断了因为模型响应慢而造成的“消息卡死不再回复”。
8
- - 【双重回复修复】🐛 **[重要修复]** 修复 `Bot WS` 长文本场景下可能被超时截断并触发兜底通道进行二次重复回复的边界异常。
9
- - 【向导自动路由】✨ **[体验升级]** 重构了企业微信的渠道交互配置向导。在单账号场景下将静默触发自动路由绑定,丝滑跳过 OpenClaw 全局冗长的 Agent 路由分配询问。
10
- - 【账号兜底修复】🧩 修复企业微信 onboarding 在首个账号非字面量 `default` 时,后续流程报 `WeCom account "default" not found` 的问题。
11
- - 【默认选项收敛】🚀 onboarding 的默认回车选项已变更为更普适的 `Bot` 模式、`WS` 接入和 `开放模式` 策略。
12
- - 【字段命名收敛】📝 Agent 新配置统一推荐使用 `agentSecret`,历史 `corpSecret` 保持兼容读取,保障平滑升级。
13
- - 【文档与提示精简】📘 README、向导交互文案与示例结构已全面统一为更符合直觉的精简说明。
14
-
15
- ## 验证结果
16
- - `bunx vitest run extensions/wecom/src/onboarding.test.ts extensions/wecom/src/channel.meta.test.ts`
17
- - `pnpm build`
@@ -1,19 +0,0 @@
1
- # OpenClaw WeCom 插件 v2.3.11 变更简报
2
-
3
- > [!TIP]
4
- > **稳定性与多账号说明版本**:`v2.3.11` 重点修复 Bot WS 长思考场景下的 `invalid req_id`,同步收敛 onboarding 账号默认值与多账号隔离文档说明。
5
-
6
- ## 2026-03-11(v2.3.11)
7
- - 【WS 保活升级】🚀 **[重要修复]** Bot WebSocket 从“4 秒后补发占位”升级为“收到用户消息立即下发占位符,并在长思考期间持续保活”,显著降低慢模型或长任务下的 `invalid req_id` 与回复丢失风险。
8
- - 【占位符配置生效】🌊 `bot.streamPlaceholderContent` 现在对 `Bot WS` 与 `Bot Webhook` 两条链路统一生效,配置一次即可保持体验一致。
9
- - 【错误兜底收敛】🛡 修复 `req_id` 已失效时仍尝试二次回错消息的问题,避免出现重复报错与未处理 Promise 拒绝。
10
- - 【账号选择兜底】🧩 onboarding 在“配置里还没有任何账号”时,也会显式提供 `default` 默认账号选项,减少首次接入时的困惑。
11
- - 【多账号文档补强】📘 README 新增说明:如果多个 `accountId` 复用同一个静态 Agent,建议配合 `session.dmScope = "per-account-channel-peer"`,避免不同账号的私聊上下文共用。
12
- - 【日志可读性】🔎 WeCom runtime 的 Bot WS 失败日志改为可读错误文本,排查时不再只看到 `[object Object]`。
13
-
14
- ## 验证结果
15
- - `pnpm exec vitest run extensions/wecom/src/transport/bot-ws/reply.test.ts extensions/wecom/src/onboarding.test.ts`
16
-
17
- ## 升级提示
18
- - 已有 `bot.streamPlaceholderContent` 配置无需调整,升级后 `Bot WS` 会自动使用它。
19
- - 如果你在同一个 OpenClaw 实例里挂了多个 WeCom 账号,并让它们指向同一个静态 Agent,建议补上 `session.dmScope = "per-account-channel-peer"` 以隔离私聊上下文。
@@ -1,25 +0,0 @@
1
- # OpenClaw WeCom 插件 v2.3.12 变更简报
2
-
3
- > [!TIP]
4
- > **WS 主动推送与过期更新兜底版本**:`v2.3.12` 重点修复企业微信 Bot WebSocket 在流式回复超过 6 分钟后返回 `846608 stream message update expired`,并同步调整主动消息路由为“WS 文本优先、Agent 文件兜底”。
5
-
6
- ## 2026-03-12(v2.3.12)
7
- - 【6 分钟过期修复】🛠 **[重要修复]** `Bot WS` 现在会把企业微信 `846608 stream message update expired (>6 minutes)` 识别为回复窗口已结束的终态错误,不再继续把该错误向上抛出导致进程退出。
8
- - 【主动推送路由收敛】🚀 **[重要修复]** 当账号实际运行在 `Bot WS` 模式时,定时消息、heartbeat 和其他主动文本发送现在优先走 `wsClient.sendMessage()`,不再默认绕去 Agent。
9
- - 【WS/Agent 职责切分】🧩 `Agent` 现在主要承担两类兜底:一是账号没有启用 `Bot WS` 时的主动消息发送;二是 Bot 两种模式都不支持的文件/媒体发送。
10
- - 【UserID 纯数字解析修复】🛠 **[重要修复]** 解决 Agent 模式下纯数字 UserID 被误判为部门 ID 导致的图片发送失败(81013 错误)。在 `wecom-agent:` 作用域下,纯数字目标现在优先解析为用户。
11
- - 【未处理拒绝隔离】🧯 `sdk-adapter` 为每个 WebSocket frame 的异步处理补上显式兜底捕获;即使后续再出现漏网异常,也会记录到 runtime issue,而不是变成 `unhandledRejection` 直接带崩 OpenClaw。
12
- - 【占位保活收敛】⏱ 当回复窗口已经过期时,WS 占位符保活会立即停止,避免过期后继续发送流式更新。
13
- - 【Ack 超时兜底】⏱ SDK 5 秒回执超时 (`Reply ack timeout`) 现在也被识别为终态错误,超时后立即停止占位保活并走 `onFail` 回调,不再产生 `unhandledRejection`。
14
- - 【回归测试补齐】✅ 新增针对 `846608` 过期更新和 `frame handler` reject 的回归测试,确保此类异常保持非致命。
15
- - 【Bot WS 图片/文件解密修复】🛠 **[重要修复]** `Bot WS` 模式下接收到的图片和文件现在会使用消息体中的独立 `aeskey` 进行 AES-256-CBC 解密,修复之前直接保存密文导致 `Failed to optimize image` 的问题。`media-service.ts` 新增 `downloadEncryptedMedia()` 方法,`normalizeFirstAttachment()` 自动检测 `aesKey` 并走解密路径。
16
-
17
- ## 验证结果
18
- - `pnpm exec vitest -c extensions/wecom/vitest.config.ts extensions/wecom/src/transport/bot-ws/reply.test.ts extensions/wecom/src/transport/bot-ws/sdk-adapter.test.ts`
19
- - `pnpm exec vitest -c extensions/wecom/vitest.config.ts extensions/wecom/src/outbound.test.ts extensions/wecom/src/transport/bot-ws/reply.test.ts extensions/wecom/src/transport/bot-ws/sdk-adapter.test.ts`
20
- - `pnpm exec tsc -p extensions/wecom/tsconfig.json --noEmit`
21
-
22
- ## 升级提示
23
- - 无需新增配置,升级到 `v2.3.12` 后自动生效。
24
- - 如果账号正在使用 `Bot WS`,主动文本消息会优先走 WS 长连接;只有文件/媒体或未启用 WS 的场景才会继续使用 Agent。
25
- - 如果模型或工具链路存在超长执行,超过企业微信 6 分钟回复窗口时,OpenClaw 现在会保持存活并记录运行时错误,不再因该异常退出。
@@ -1,19 +0,0 @@
1
- # OpenClaw WeCom 插件 v2.3.13 变更简报
2
-
3
- > [!TIP]
4
- > **Bot WS 引用上下文与流式展示修复版本**:`v2.3.13` 重点补齐企业微信 `Bot WS` 对引用消息的上下文注入,并修复长回答在客户端里显示为“断断续续碎片”的问题。
5
-
6
- ## 2026-03-13(v2.3.13)
7
- - 【引用上下文补齐】🛠 **[重要修复]** `Bot WS` 现在会复用与 `Bot Webhook` 一致的入站正文拼装逻辑。用户通过“引用 + 提问”触发机器人时,引用内容会一并进入 Agent 上下文,不再只保留当前这句提问。
8
- - 【WS 流式刷新修复】🌊 **[重要修复]** `Bot WS replyStream` 现在按“累计全文刷新”发送,而不是只发送最新增量片段,修复企业微信客户端中长回答显示断断续续、像被拆成多块的问题。
9
- - 【协议语义对齐】🧩 这次调整显式对齐企业微信 `stream.id` 的刷新语义:同一条流式消息的后续更新会覆盖为“当前完整内容”,从而保持最终展示稳定、可连续阅读。
10
- - 【回归测试补齐】✅ 新增 `bot-ws` 引用上下文与累计流式发送测试,避免后续重构再次把引用消息或流式展示打回退。
11
-
12
- ## 验证结果
13
- - `pnpm exec vitest run --config extensions/wecom/vitest.config.ts extensions/wecom/src/transport/bot-ws/inbound.test.ts extensions/wecom/src/transport/bot-ws/reply.test.ts extensions/wecom/src/transport/bot-ws/sdk-adapter.test.ts`
14
- - `pnpm exec tsc -p extensions/wecom/tsconfig.json --noEmit`
15
-
16
- ## 升级提示
17
- - 无需新增配置,升级到 `v2.3.13` 后自动生效。
18
- - 如果企业微信 `WS` 推送里的 `quote.text.content` 仍然是 `[该消息类型暂不能展示]`,说明上游没有下发真实引用原文;OpenClaw 会把该占位文本带入上下文,但无法恢复企业微信未提供的原始内容。
19
- - 如果你之前观察到长回复在企业微信里呈现为“分段断裂”或“后段覆盖前段”,升级后会改为同一条流式消息持续刷新完整内容。
@@ -1,48 +0,0 @@
1
- # OpenClaw WeCom 插件 v2.3.14 变更简报
2
-
3
- > [!TIP]
4
- > **企业微信“协作文档”原生整合与长连接稳定性修复版本**:`v2.3.14` 将机器人的能力从“陪聊”正式拓展到了“办公协同”。现在,你可以直接在微信群里让机器人去填报销单、建项目表;同时我们也彻底修复了多人并发聊天时机器人“正在思考”卡死刷屏的问题。
5
- >
6
- > 📣 **特别感谢** [@proyy](https://github.com/proyy) 提供的企业微信文档管理解决方案,使本版本的 Docs 能力得以落地。
7
-
8
- ## 重磅功能:把聊天直接变成企业文档(用后即得)
9
-
10
- 我们受够了问 AI 一个问题,答案最后只能被新消息顶没。这次更新,我们让机器人获得了操作“企业微信协作文档”的实体权限。
11
-
12
- ### 场景 1:开新项目,不用再求人建表格拉权限了
13
- - **以前**:你在群里说“准备一下下周的活动追踪表”,然后得切出去打开文档中心,新建表格,再一个个抄名字把大家拉进来。
14
- - **现在**:直接在群里 `@机器人 帮我建一个名为『春季新品发布会追踪』的表格,并把群里的人都加上可写权限`。机器人建好后会直接在群里甩出一个链接,所有人点开就能直接编辑,全程零切换。
15
-
16
- ### 场景 2:坐在地铁上,照样神操作填报销/跟进数据
17
- - **以前**:你刚下班,群里有人问“今天 C 组的面试谁通过了?”你只能回答“我等下回家用电脑打开「面试记录表」改一下状态”。全量改动很容易把别人的同行数据覆盖掉。
18
- - **现在**:你可以直接发语音或者敲字 `@机器人 把「第二周面试记录表」里的 B2 到 B5 单元格全部更新为“二面通过”`。机器人会像操作手术刀一样,只精准替换指定的数据块(`spreadsheet.edit_data`),丝毫不影响文档里的其他公式。
19
-
20
- ### 场景 3:直接让 AI 读懂全公司的数据报表
21
- - **以前**:你要先自己把表格下载成 Excel,再一段段复制数据发给大模型:“帮我算算这堆数据谁最高”。
22
- - **现在**:你直接丢给他一个企微文档链接:`@机器人 分析一下这张表里的第一季度数据,告诉我谁的单产最差?`。由于具备了原生读取能力(`get_sheet_range_data`),它会自己去拉取数据查表,给你输出结论。
23
-
24
- ## 💡 Docs 权限配置指引(只需一次)
25
-
26
- 为了让上述场景跑通,光配 `agentSecret` 是不够的。这是因为哪怕是公司自建的机器人,默认也没资格动你们内部的文档资产。你需要:
27
- 1. **去企微后台发“通行证”**:进入 [企业微信后台 -> 协作 -> 文档 -> 可调用接口的应用](https://work.weixin.qq.com/wework_admin/frame#apps/qykit/proxy/wedoc),把你的机器人应用放进白名单。
28
- 2. **在 OpenClaw 里激活能力**:打开 UI 界面 的 `Settings` -> `Agents` -> `Tools`,找到 `wecom`,把带有 `doc` 字眼的所有工具(创建文档、读取表格、改权限等)通通打勾。
29
-
30
-
31
- ## 核心修复:终结“正在思考...”刷屏噩梦
32
- 除了新功能,这次我们也彻底对长连接(WS)卡死问题做了一次大手术:
33
- - 🛑 **告别并发刷屏**:群里人多手杂的时候,以前机器人如果处理不过来,不仅不回话,还会满屏一直弹“正在思考...”。现在只要有一条真回复发出来,它会自动把同群里那些卡死、过期的“正在思考”全部瞬间清理干净。
34
- - 📡 **进群欢迎语报错 846605 终结**:修复了大家常反馈的“有人一进群,后台就疯狂报 invalid req_id”的陈年老 Bug。现在对进群、推卡片等非聊天事件,我们全面切换成了专属接口,彻底避免违规流式推送。
35
- - 🛡 **120 秒物理断网**:即使模型源站点挂了,我们现在也会在 120 秒内强制熔断提示,绝不让你面对一个无限转圈的加载框。
36
-
37
- ---
38
- ## 验证结果
39
- - `pnpm test -- src/transport/bot-ws`
40
- - 所有 WS 回复通道单测已全部通过,尤其是关于 `setInterval` 占位符存活期的验证得到了补全与修复。
41
-
42
- ## 升级指引
43
- ```bash
44
- openclaw plugins update wecom
45
- ```
46
- - 无需新增配置,执行上述命令即可一键升级到 `v2.3.14`。
47
- - 升级后,如果你拉几十个机器人进群并同时发言,曾经那种满屏飘“正在思考...”却无人回答的乱象将不复存在。
48
- - 如果之前查看后台日志总是看到 `stream message update expired (>6 minutes)` 甚至因为连带引发的 WS 断网重启,本次升级将大幅度平息日志告警红字,稳定长连接状态。
@@ -1,15 +0,0 @@
1
- # OpenClaw WeCom 插件 v2.3.15 变更简报
2
-
3
- > [!TIP]
4
- > **企业微信文档写入稳定性与消息目标路由修复版本**:`v2.3.15` 重点解决了企微文档 `init_content` 初始化内容写入不稳定、图片插入失败、批量更新索引错误,以及群聊回复时容易触发的 `81013` 目标解析错误。同时,这次也补回并完善了文档、在线表格、智能表格、收集表等能力,避免相关工具调用缺接口或直接失败。
5
-
6
- ## 2026-03-14(v2.3.15)
7
- - 【文档初始化内容修复】🛠 **[重要修复]** 创建企微文档时,`init_content` 现在会按官方 Wedoc 流程执行:图片先上传再插入,文本与图片段落会基于最新索引和版本号写入,减少标题正文错位、图片不显示、内容插到错误位置的问题。
8
- - 【批量更新稳定性修复】📄 **[重要修复]** 修复 `document.batch_update` 的索引计算与模式切换问题。混合执行 `insert_paragraph`、`insert_text`、`insert_image` 时,不再更容易触发 `ParagraphValidator`、`TextValidator`、`DrawingValidator` 一类报错。
9
- - 【文档客户端能力恢复】🔧 重新补齐此前精简时误删的企微文档客户端接口,恢复文档权限、在线表格、智能表格、收集表等相关方法,避免工具层调用缺方法、返回异常或直接不可用。
10
- - 【在线表格与收集表支持补齐】📊 完善企微在线表格和收集表的类型定义、参数校验与错误提示。现在会更早拦截超出 API 限制的请求,例如表格行列/单元格数量超限、收集表题目结构缺失、选项题参数不完整等问题。
11
- - 【群聊目标解析修复】💬 **[重要修复]** 修复企业微信群聊回复时 `To` 字段被错误硬编码为用户目标的问题。群聊、私聊、部门、标签目标现在会按正确前缀解析,减少发送时报 `81013 user & party & tag all invalid` 的情况。
12
-
13
- ## 升级提示
14
- - 执行 `openclaw plugins update wecom` 即可升级到 `v2.3.15`。
15
- - 如果你之前遇到“建文档成功但内容没写进去”“图片插不进去”“批量更新偶发报索引错误”或“群里回复机器人时报 81013”,本次升级后会明显改善。
@@ -1,11 +0,0 @@
1
- # OpenClaw WeCom 插件 v2.3.16 变更简报
2
-
3
- > [!TIP]
4
- > **企业微信 Bot-WS 混合消息附件解析修复版本**:`v2.3.16` 重点解决了在 WebSocket 模式下,企业微信机器人接收到的混合消息(如同时包含图片和文字)由于解析遗漏导致附件丢失、AI 只能看到带签名的临时链接文本而无法查看真正图片内容的问题。
5
-
6
- ## 2026-03-16(v2.3.16)
7
- - 【混合消息媒体解析修复】🛠 **[重要修复]** 补齐了 Bot WebSocket 传输通道(`bot-ws`)下对 `mixed` 结构消息的附件提取逻辑。现在,当用户在企微发出一条包含图片/文件与文字的混合消息时,底层框架会自动遍历并提取各个媒体节点的 URL 和 AES Key,确保核心处理管线能进行正常下载与安全解密。
8
-
9
- ## 升级提示
10
- - 执行 `openclaw plugins update wecom` 即可升级到 `v2.3.16`。
11
- - 如果你之前在企微发出“带图的一段话”时,曾遇到 AI 回复说“这是一个腾讯 COS 的临时签名链接”,本次升级后,此问题将被修复,AI 将可以直接分析图片内容本身。
@@ -1,22 +0,0 @@
1
- # OpenClaw WeCom 插件 v2.3.18 变更简报
2
-
3
- > [!TIP]
4
- > **企业微信面向中小企业的新能力开放版本**:`v2.3.18` 重点完善了 `wecom` 插件在 Bot WebSocket 场景下的能力层。现在,面向 5 人及以下小企业,OpenClaw 已支持以用户个人身份在企业微信内使用文档读写、日程读写、会议读写、待办读写、通讯录查询等能力。同时,本次也补齐了 Bot WS 媒体发送、建立了 Bot 与 Agent 双平面路由,并修复了企业微信里容易卡在“正在思考...”不结束的问题。
5
-
6
- ## 2026-03-18(v2.3.18)
7
- - 【中小企业能力开放】🚀 **[重大更新]** 面向 5 人及以下小企业,OpenClaw 在企业微信内正式开放以用户个人身份使用的协作能力入口。现在,大模型可以在具备相应授权的前提下,调用企业微信文档读写、日程读写、会议读写、待办读写以及通讯录查询等能力,把原本分散在多个协作入口中的企业操作集中到同一条智能对话链路中。
8
- - 【新增 Bot WS MCP 工具层】新增 `wecom_mcp` 工具,将企业微信 Bot WS 能力以挂载式能力层接入 `wecom` 插件。现在 Bot 侧可以按业务类别动态获取 MCP 配置,并把企业微信开放的能力暴露给大模型调用。
9
- - 【建立 Bot / Agent 双平面路由】新增基于会话来源的能力分流。Bot WS 会话优先使用 `wecom_mcp`;Agent 回调会话继续保留原生 `wecom_doc`、`wecom_calendar` 工具链,避免不同能力面互相干扰。
10
- - 【多账号能力隔离加强】MCP 相关缓存和状态改为按 `accountId + category` 隔离。在多账号矩阵下,同一类能力不会再共用同一份 Bot 侧配置,减少串账号、串上下文、串连接状态的问题。
11
- - 【补齐 Bot WS 命令与媒体链】扩展 Bot WS 运行时接口,除了主动文本发送外,现在还支持命令桥接、连接状态探测和媒体发送。Bot WebSocket 会话下的图片、文件回复不再必须依赖 Agent API 补送。
12
- - 【新增媒体发送提示注入】在企业微信 Bot WS 会话里定向注入 `MEDIA:` 使用提示,帮助模型更稳定地触发图片和文件回复,同时避免把这类提示扩散到非 WeCom 或 Agent 会话。
13
- - 【修复回复流不收口问题】**[重要修复]** 处理 Bot WS 回复时,带媒体的中间块不再错误中断文本发送。现在文本会先正常下发,媒体在结束阶段继续处理;如果上游没有显式 final,系统也会自动补一个收口帧,避免企业微信里长期停留在“正在思考...”。
14
- - 【欢迎语路径提速】`enter_chat` 欢迎事件在配置静态欢迎语时改为直发,不再额外启动完整推理流程。首次进入会话时的响应更直接,链路也更短。
15
- - 【运行时日志增强】新增更细的派发与投递日志,包括 `dispatch-start`、`dispatch-done`、`dispatch-fail`、`deliver-start`、`deliver-done`。现在排查问题时可以更快区分是模型处理慢、回复已被企微确认、MCP 类别未开通,还是本地媒体路径被限制拦截。
16
- - 【能力边界提示更明确】当企业微信后台只开放部分能力时,插件会更明确地把限制反馈给用户和日志。例如只开通文档类能力时,待办、会议、日程类请求会直接提示当前账号尚未开放对应能力,而不是表现成模糊失败。
17
-
18
- ## 升级提示
19
- - 执行 `openclaw plugins update wecom` 即可升级到 `v2.3.18`。
20
- - 本次版本是企业微信能力面的重要开放版本,尤其适合希望在企业微信内直接完成文档、日程、会议、待办与通讯录协作的小型团队。
21
- - 如果你之前在企业微信 Bot WS 会话里只看到反复“正在思考...”、最终不出结果,本次升级后应已修复。
22
- - 如果你希望在企业微信里直接使用会议、待办、日程等 Bot 侧能力,请同时确认企业微信后台已经为当前 Bot 开通相应业务类别;插件侧已经具备调用链,但实际可用范围仍以企业微信侧授权为准。