@yanhaidao/wecom 2.4.120 → 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 (323) hide show
  1. package/README.md +4 -5
  2. package/dist/index.js +68 -0
  3. package/dist/src/accounts.js +20 -0
  4. package/dist/src/agent/handler.js +895 -0
  5. package/dist/src/agent/index.js +5 -0
  6. package/dist/src/app/account-runtime.js +216 -0
  7. package/dist/src/app/bootstrap.js +19 -0
  8. package/dist/src/app/index.js +118 -0
  9. package/dist/src/capability/agent/delivery-service.js +63 -0
  10. package/dist/src/capability/agent/fallback-policy.js +6 -0
  11. package/dist/src/capability/agent/ingress-service.js +33 -0
  12. package/dist/src/capability/agent/upstream-delivery-service.js +71 -0
  13. package/dist/src/capability/bot/dispatch-config.js +45 -0
  14. package/dist/src/capability/bot/fallback-delivery.js +147 -0
  15. package/dist/src/capability/bot/local-path-delivery.js +178 -0
  16. package/dist/src/capability/bot/sandbox-media.js +138 -0
  17. package/dist/src/capability/bot/service.js +49 -0
  18. package/dist/src/capability/bot/stream-delivery.js +321 -0
  19. package/dist/src/capability/bot/stream-finalizer.js +81 -0
  20. package/dist/src/capability/bot/stream-orchestrator.js +318 -0
  21. package/dist/src/capability/bot/types.js +1 -0
  22. package/{src/capability/calendar/client.ts → dist/src/capability/calendar/client.js} +118 -241
  23. package/{src/capability/calendar/schema.ts → dist/src/capability/calendar/schema.js} +0 -38
  24. package/dist/src/capability/calendar/tool.js +365 -0
  25. package/dist/src/capability/calendar/types.js +12 -0
  26. package/{src/capability/doc/client.ts → dist/src/capability/doc/client.js} +370 -605
  27. package/{src/capability/doc/schema.ts → dist/src/capability/doc/schema.js} +345 -394
  28. package/dist/src/capability/doc/tool.js +1556 -0
  29. package/dist/src/capability/doc/types.js +113 -0
  30. package/dist/src/capability/mcp/index.js +3 -0
  31. package/dist/src/capability/mcp/schema.js +102 -0
  32. package/dist/src/capability/mcp/tool.js +146 -0
  33. package/dist/src/capability/mcp/transport.js +293 -0
  34. package/dist/src/channel.js +224 -0
  35. package/dist/src/config/accounts.js +236 -0
  36. package/dist/src/config/derived-paths.js +31 -0
  37. package/dist/src/config/index.js +7 -0
  38. package/dist/src/config/media.js +110 -0
  39. package/dist/src/config/network.js +32 -0
  40. package/dist/src/config/routing.js +20 -0
  41. package/dist/src/config/runtime-config.js +25 -0
  42. package/dist/src/config/schema.js +4 -0
  43. package/{src/config-schema.ts → dist/src/config-schema.js} +1 -1
  44. package/dist/src/context-store.js +219 -0
  45. package/{src/crypto/aes.ts → dist/src/crypto/aes.js} +11 -28
  46. package/dist/src/crypto/index.js +9 -0
  47. package/{src/crypto/signature.ts → dist/src/crypto/signature.js} +3 -18
  48. package/{src/crypto/xml.ts → dist/src/crypto/xml.js} +3 -11
  49. package/dist/src/crypto.js +145 -0
  50. package/dist/src/domain/models.js +1 -0
  51. package/dist/src/domain/policies.js +32 -0
  52. package/{src/dynamic-agent.ts → dist/src/dynamic-agent.js} +36 -73
  53. package/dist/src/gateway-monitor.js +139 -0
  54. package/dist/src/http.js +114 -0
  55. package/{src/media.ts → dist/src/media.js} +21 -40
  56. package/dist/src/monitor/limits.js +7 -0
  57. package/dist/src/monitor/state.js +28 -0
  58. package/dist/src/monitor.js +84 -0
  59. package/dist/src/observability/audit-log.js +30 -0
  60. package/dist/src/observability/legacy-operational-event-store.js +22 -0
  61. package/dist/src/observability/raw-envelope-log.js +24 -0
  62. package/dist/src/observability/status-registry.js +9 -0
  63. package/dist/src/observability/transport-session-view.js +14 -0
  64. package/dist/src/onboarding.js +546 -0
  65. package/dist/src/outbound.js +557 -0
  66. package/dist/src/runtime/dispatcher.js +57 -0
  67. package/{src/runtime/index.ts → dist/src/runtime/index.js} +0 -1
  68. package/dist/src/runtime/outbound-intent.js +1 -0
  69. package/dist/src/runtime/reply-orchestrator.js +38 -0
  70. package/dist/src/runtime/routing-bridge.js +26 -0
  71. package/dist/src/runtime/session-manager.js +112 -0
  72. package/dist/src/runtime/source-registry.js +174 -0
  73. package/dist/src/runtime.js +1 -0
  74. package/dist/src/shared/command-auth.js +57 -0
  75. package/{src/shared/index.ts → dist/src/shared/index.js} +0 -1
  76. package/dist/src/shared/media-asset.js +65 -0
  77. package/dist/src/shared/media-service.js +59 -0
  78. package/dist/src/shared/media-types.js +1 -0
  79. package/{src/shared/xml-parser.ts → dist/src/shared/xml-parser.js} +72 -63
  80. package/dist/src/store/active-reply-store.js +41 -0
  81. package/dist/src/store/interfaces.js +1 -0
  82. package/dist/src/store/memory-store.js +33 -0
  83. package/dist/src/store/stream-batch-store.js +319 -0
  84. package/{src/target.ts → dist/src/target.js} +15 -48
  85. package/dist/src/transport/agent-api/client.js +168 -0
  86. package/dist/src/transport/agent-api/core.js +337 -0
  87. package/dist/src/transport/agent-api/delivery.js +28 -0
  88. package/dist/src/transport/agent-api/media-upload.js +4 -0
  89. package/dist/src/transport/agent-api/reply.js +24 -0
  90. package/dist/src/transport/agent-api/upstream-delivery.js +30 -0
  91. package/dist/src/transport/agent-api/upstream-media-upload.js +46 -0
  92. package/dist/src/transport/agent-api/upstream-reply.js +26 -0
  93. package/dist/src/transport/agent-callback/http-handler.js +30 -0
  94. package/dist/src/transport/agent-callback/inbound.js +4 -0
  95. package/dist/src/transport/agent-callback/reply.js +8 -0
  96. package/dist/src/transport/agent-callback/request-handler.js +189 -0
  97. package/dist/src/transport/agent-callback/session.js +15 -0
  98. package/dist/src/transport/bot-webhook/active-reply.js +27 -0
  99. package/dist/src/transport/bot-webhook/http-handler.js +31 -0
  100. package/dist/src/transport/bot-webhook/inbound-normalizer.js +496 -0
  101. package/dist/src/transport/bot-webhook/inbound.js +4 -0
  102. package/dist/src/transport/bot-webhook/message-shape.js +98 -0
  103. package/dist/src/transport/bot-webhook/protocol.js +124 -0
  104. package/dist/src/transport/bot-webhook/reply.js +9 -0
  105. package/dist/src/transport/bot-webhook/request-handler.js +285 -0
  106. package/dist/src/transport/bot-webhook/session.js +15 -0
  107. package/dist/src/transport/bot-ws/inbound.js +147 -0
  108. package/dist/src/transport/bot-ws/media.js +236 -0
  109. package/dist/src/transport/bot-ws/reply.js +310 -0
  110. package/dist/src/transport/bot-ws/sdk-adapter.js +257 -0
  111. package/dist/src/transport/bot-ws/session.js +15 -0
  112. package/dist/src/transport/http/common.js +78 -0
  113. package/dist/src/transport/http/registry.js +71 -0
  114. package/dist/src/transport/http/request-handler.js +51 -0
  115. package/{src/transport/index.ts → dist/src/transport/index.js} +2 -10
  116. package/dist/src/types/account.js +1 -0
  117. package/dist/src/types/config.js +1 -0
  118. package/dist/src/types/constants.js +28 -0
  119. package/dist/src/types/events.js +1 -0
  120. package/dist/src/types/index.js +1 -0
  121. package/dist/src/types/legacy-stream.js +1 -0
  122. package/dist/src/types/message.js +5 -0
  123. package/dist/src/types/runtime-context.js +1 -0
  124. package/dist/src/types/runtime.js +1 -0
  125. package/dist/src/types.js +1 -0
  126. package/dist/src/upstream/index.js +111 -0
  127. package/dist/src/wecom_msg_adapter/markdown_adapter.js +280 -0
  128. package/openclaw.plugin.json +15 -0
  129. package/package.json +18 -1
  130. package/.github/workflows/release.yml +0 -143
  131. package/GOVERNANCE.md +0 -26
  132. package/MENU_EVENT_CONF.md +0 -500
  133. package/MENU_EVENT_PLAN.md +0 -440
  134. package/SKILLS_CAL.md +0 -895
  135. package/SKILLS_DOC.md +0 -2288
  136. package/UPSTREAM_CONFIG.md +0 -170
  137. package/UPSTREAM_PLAN.md +0 -175
  138. package/assets/01.bot-add.png +0 -0
  139. package/assets/01.bot-setp2.png +0 -0
  140. package/assets/01.image.jpg +0 -0
  141. package/assets/02.agent.add.png +0 -0
  142. package/assets/02.agent.api-set.png +0 -0
  143. package/assets/02.image.jpg +0 -0
  144. package/assets/03.agent.page.png +0 -0
  145. package/assets/03.bot.page.png +0 -0
  146. package/assets/link-me.jpg +0 -0
  147. package/assets/register.png +0 -0
  148. package/changelog/v2.2.28.md +0 -70
  149. package/changelog/v2.3.10.md +0 -17
  150. package/changelog/v2.3.11.md +0 -19
  151. package/changelog/v2.3.12.md +0 -25
  152. package/changelog/v2.3.13.md +0 -19
  153. package/changelog/v2.3.14.md +0 -48
  154. package/changelog/v2.3.15.md +0 -15
  155. package/changelog/v2.3.16.md +0 -11
  156. package/changelog/v2.3.18.md +0 -22
  157. package/changelog/v2.3.19.md +0 -73
  158. package/changelog/v2.3.2.md +0 -28
  159. package/changelog/v2.3.26.md +0 -21
  160. package/changelog/v2.3.27.md +0 -33
  161. package/changelog/v2.3.4.md +0 -20
  162. package/changelog/v2.3.9.md +0 -22
  163. package/changelog/v2.4.12.md +0 -37
  164. package/compat-single-account.md +0 -148
  165. package/index.test.ts +0 -38
  166. package/scripts/test-proxy.ts +0 -70
  167. package/scripts/wecom/README.md +0 -123
  168. package/scripts/wecom/menu-click-help.js +0 -59
  169. package/scripts/wecom/menu-click-help.py +0 -55
  170. package/src/accounts.ts +0 -34
  171. package/src/agent/api-client.upload.test.ts +0 -109
  172. package/src/agent/event-router.test.ts +0 -421
  173. package/src/agent/event-router.ts +0 -272
  174. package/src/agent/handler.event-filter.test.ts +0 -135
  175. package/src/agent/handler.ts +0 -1250
  176. package/src/agent/index.ts +0 -12
  177. package/src/agent/script-runner.ts +0 -186
  178. package/src/agent/test-fixtures/invalid-json-script.mjs +0 -1
  179. package/src/agent/test-fixtures/reply-event-script.mjs +0 -29
  180. package/src/agent/test-fixtures/reply-event-script.py +0 -17
  181. package/src/app/account-runtime.ts +0 -276
  182. package/src/app/bootstrap.ts +0 -29
  183. package/src/app/index.ts +0 -192
  184. package/src/capability/agent/delivery-service.ts +0 -87
  185. package/src/capability/agent/fallback-policy.ts +0 -13
  186. package/src/capability/agent/ingress-service.ts +0 -38
  187. package/src/capability/agent/upstream-delivery-service.ts +0 -96
  188. package/src/capability/bot/dispatch-config.ts +0 -47
  189. package/src/capability/bot/fallback-delivery.ts +0 -178
  190. package/src/capability/bot/local-path-delivery.ts +0 -215
  191. package/src/capability/bot/sandbox-media.test.ts +0 -221
  192. package/src/capability/bot/sandbox-media.ts +0 -176
  193. package/src/capability/bot/service.ts +0 -56
  194. package/src/capability/bot/stream-delivery.ts +0 -379
  195. package/src/capability/bot/stream-finalizer.ts +0 -120
  196. package/src/capability/bot/stream-orchestrator.ts +0 -371
  197. package/src/capability/bot/types.ts +0 -8
  198. package/src/capability/calendar/SKILLS_CHECKLIST.md +0 -251
  199. package/src/capability/calendar/tool.ts +0 -417
  200. package/src/capability/calendar/types.ts +0 -309
  201. package/src/capability/doc/tool.ts +0 -1629
  202. package/src/capability/doc/types.ts +0 -792
  203. package/src/capability/mcp/index.ts +0 -10
  204. package/src/capability/mcp/schema.ts +0 -107
  205. package/src/capability/mcp/tool.ts +0 -174
  206. package/src/capability/mcp/transport.ts +0 -394
  207. package/src/channel.config.test.ts +0 -180
  208. package/src/channel.lifecycle.test.ts +0 -255
  209. package/src/channel.meta.test.ts +0 -26
  210. package/src/channel.ts +0 -256
  211. package/src/config/accounts.resolve.test.ts +0 -75
  212. package/src/config/accounts.ts +0 -312
  213. package/src/config/derived-paths.test.ts +0 -111
  214. package/src/config/derived-paths.ts +0 -41
  215. package/src/config/index.ts +0 -22
  216. package/src/config/media.test.ts +0 -113
  217. package/src/config/media.ts +0 -139
  218. package/src/config/network.ts +0 -20
  219. package/src/config/routing.test.ts +0 -88
  220. package/src/config/routing.ts +0 -26
  221. package/src/config/runtime-config.ts +0 -46
  222. package/src/config/schema.ts +0 -144
  223. package/src/context-store.ts +0 -297
  224. package/src/crypto/index.ts +0 -24
  225. package/src/crypto.test.ts +0 -32
  226. package/src/crypto.ts +0 -176
  227. package/src/domain/models.ts +0 -7
  228. package/src/domain/policies.ts +0 -36
  229. package/src/dynamic-agent.account-scope.test.ts +0 -17
  230. package/src/gateway-monitor.ts +0 -181
  231. package/src/http.ts +0 -137
  232. package/src/media.test.ts +0 -82
  233. package/src/monitor/limits.ts +0 -7
  234. package/src/monitor/state.queue.test.ts +0 -185
  235. package/src/monitor/state.ts +0 -34
  236. package/src/monitor.active.test.ts +0 -245
  237. package/src/monitor.inbound-filter.test.ts +0 -63
  238. package/src/monitor.integration.test.ts +0 -208
  239. package/src/monitor.ts +0 -121
  240. package/src/monitor.webhook.test.ts +0 -774
  241. package/src/observability/audit-log.ts +0 -48
  242. package/src/observability/legacy-operational-event-store.ts +0 -36
  243. package/src/observability/raw-envelope-log.ts +0 -28
  244. package/src/observability/status-registry.ts +0 -13
  245. package/src/observability/transport-session-view.ts +0 -14
  246. package/src/onboarding.test.ts +0 -336
  247. package/src/onboarding.ts +0 -704
  248. package/src/outbound.test.ts +0 -1271
  249. package/src/outbound.ts +0 -746
  250. package/src/runtime/dispatcher.ts +0 -71
  251. package/src/runtime/outbound-intent.ts +0 -4
  252. package/src/runtime/reply-orchestrator.test.ts +0 -71
  253. package/src/runtime/reply-orchestrator.ts +0 -67
  254. package/src/runtime/routing-bridge.test.ts +0 -115
  255. package/src/runtime/routing-bridge.ts +0 -44
  256. package/src/runtime/session-manager.test.ts +0 -174
  257. package/src/runtime/session-manager.ts +0 -139
  258. package/src/runtime/source-registry.ts +0 -249
  259. package/src/runtime.ts +0 -14
  260. package/src/shared/command-auth.ts +0 -87
  261. package/src/shared/media-asset.ts +0 -78
  262. package/src/shared/media-service.test.ts +0 -111
  263. package/src/shared/media-service.ts +0 -84
  264. package/src/shared/media-types.ts +0 -5
  265. package/src/shared/xml-parser.test.ts +0 -50
  266. package/src/store/active-reply-store.ts +0 -42
  267. package/src/store/interfaces.ts +0 -11
  268. package/src/store/memory-store.ts +0 -43
  269. package/src/store/stream-batch-store.ts +0 -350
  270. package/src/transport/agent-api/client.ts +0 -277
  271. package/src/transport/agent-api/core.ts +0 -463
  272. package/src/transport/agent-api/delivery.ts +0 -41
  273. package/src/transport/agent-api/media-upload.ts +0 -11
  274. package/src/transport/agent-api/reply.ts +0 -39
  275. package/src/transport/agent-api/upstream-delivery.ts +0 -45
  276. package/src/transport/agent-api/upstream-media-upload.ts +0 -70
  277. package/src/transport/agent-api/upstream-reply.ts +0 -43
  278. package/src/transport/agent-callback/http-handler.ts +0 -47
  279. package/src/transport/agent-callback/inbound.ts +0 -5
  280. package/src/transport/agent-callback/reply.ts +0 -13
  281. package/src/transport/agent-callback/request-handler.ts +0 -244
  282. package/src/transport/agent-callback/session.ts +0 -23
  283. package/src/transport/bot-webhook/active-reply.ts +0 -39
  284. package/src/transport/bot-webhook/http-handler.ts +0 -48
  285. package/src/transport/bot-webhook/inbound-normalizer.ts +0 -371
  286. package/src/transport/bot-webhook/inbound.ts +0 -5
  287. package/src/transport/bot-webhook/message-shape.ts +0 -89
  288. package/src/transport/bot-webhook/protocol.ts +0 -148
  289. package/src/transport/bot-webhook/reply.ts +0 -15
  290. package/src/transport/bot-webhook/request-handler.ts +0 -394
  291. package/src/transport/bot-webhook/session.ts +0 -23
  292. package/src/transport/bot-ws/inbound.test.ts +0 -96
  293. package/src/transport/bot-ws/inbound.ts +0 -116
  294. package/src/transport/bot-ws/media.test.ts +0 -44
  295. package/src/transport/bot-ws/media.ts +0 -321
  296. package/src/transport/bot-ws/reply.test.ts +0 -450
  297. package/src/transport/bot-ws/reply.ts +0 -365
  298. package/src/transport/bot-ws/sdk-adapter.test.ts +0 -187
  299. package/src/transport/bot-ws/sdk-adapter.ts +0 -314
  300. package/src/transport/bot-ws/session.ts +0 -28
  301. package/src/transport/http/common.ts +0 -109
  302. package/src/transport/http/registry.ts +0 -92
  303. package/src/transport/http/request-handler.ts +0 -84
  304. package/src/types/account.ts +0 -72
  305. package/src/types/config.ts +0 -166
  306. package/src/types/constants.ts +0 -31
  307. package/src/types/events.ts +0 -21
  308. package/src/types/global.d.ts +0 -9
  309. package/src/types/index.ts +0 -17
  310. package/src/types/legacy-stream.ts +0 -50
  311. package/src/types/message.ts +0 -187
  312. package/src/types/runtime-context.ts +0 -28
  313. package/src/types/runtime.ts +0 -165
  314. package/src/types.ts +0 -41
  315. package/src/upstream/index.ts +0 -150
  316. package/src/upstream.test.ts +0 -84
  317. package/src/wecom_msg_adapter/markdown_adapter.ts +0 -331
  318. package/tsconfig.json +0 -22
  319. package/vitest.config.ts +0 -26
  320. /package/{src/capability/agent/index.ts → dist/src/capability/agent/index.js} +0 -0
  321. /package/{src/capability/bot/index.ts → dist/src/capability/bot/index.js} +0 -0
  322. /package/{src/capability/calendar/index.ts → dist/src/capability/calendar/index.js} +0 -0
  323. /package/{src/capability/index.ts → dist/src/capability/index.js} +0 -0
@@ -0,0 +1,318 @@
1
+ import { pathToFileURL } from "node:url";
2
+ import { resolveWecomMediaMaxBytes, shouldRejectWecomDefaultRoute } from "../../config/index.js";
3
+ import { ensureDynamicAgentListed, generateAgentId, shouldUseDynamicAgent } from "../../dynamic-agent.js";
4
+ import { getWecomRuntime } from "../../runtime.js";
5
+ import { buildWecomUnauthorizedCommandPrompt, resolveWecomCommandAuthorization } from "../../shared/command-auth.js";
6
+ import { looksLikeSendLocalFileIntent, processBotInboundMessage } from "../../transport/bot-webhook/inbound-normalizer.js";
7
+ import { resolveWecomSenderUserId } from "../../transport/bot-webhook/message-shape.js";
8
+ import { buildWecomBotDispatchConfig } from "./dispatch-config.js";
9
+ import { sendBotFallbackPromptNow } from "./fallback-delivery.js";
10
+ import { finalizeBotStream } from "./stream-finalizer.js";
11
+ import { handleDirectLocalPathIntent } from "./local-path-delivery.js";
12
+ import { stageWecomInboundMediaForSession } from "./sandbox-media.js";
13
+ import { createBotReplyDispatcher } from "./stream-delivery.js";
14
+ export function createBotStreamOrchestrator(params) {
15
+ const { streamStore, recordBotOperationalEvent } = params;
16
+ const logVerbose = (target, message) => {
17
+ const should = target.core.logging?.shouldLogVerbose?.() ??
18
+ (() => {
19
+ try {
20
+ return getWecomRuntime().logging.shouldLogVerbose();
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ })();
26
+ if (!should)
27
+ return;
28
+ target.runtime.log?.(`[wecom] ${message}`);
29
+ };
30
+ const logInfo = (target, message) => {
31
+ target.runtime.log?.(`[wecom] ${message}`);
32
+ };
33
+ const truncateUtf8Bytes = (text, maxBytes) => {
34
+ const buf = Buffer.from(text, "utf8");
35
+ if (buf.length <= maxBytes)
36
+ return text;
37
+ return buf.subarray(buf.length - maxBytes).toString("utf8");
38
+ };
39
+ const computeTaskKey = (target, msg) => {
40
+ const msgid = msg.msgid ? String(msg.msgid) : "";
41
+ if (!msgid)
42
+ return undefined;
43
+ const aibotid = String(msg.aibotid ?? "unknown").trim() || "unknown";
44
+ return `bot:${target.account.accountId}:${aibotid}:${msgid}`;
45
+ };
46
+ async function flushPending(pending) {
47
+ const { streamId, target, msg, contents, msgids, conversationKey, batchKey } = pending;
48
+ const mergedContents = contents.filter((c) => c.trim()).join("\n").trim();
49
+ let core = null;
50
+ try {
51
+ core = getWecomRuntime();
52
+ }
53
+ catch (err) {
54
+ logVerbose(target, `flush pending: runtime not ready: ${String(err)}`);
55
+ streamStore.markFinished(streamId);
56
+ logInfo(target, `queue: runtime not ready,结束批次并推进 streamId=${streamId}`);
57
+ streamStore.onStreamFinished(streamId);
58
+ return;
59
+ }
60
+ if (!core)
61
+ return;
62
+ streamStore.markStarted(streamId);
63
+ const enrichedTarget = { ...target, core };
64
+ logInfo(target, `flush pending: start batch streamId=${streamId} batchKey=${batchKey} conversationKey=${conversationKey} mergedCount=${contents.length}`);
65
+ logVerbose(target, `防抖结束: 开始处理聚合消息 数量=${contents.length} streamId=${streamId}`);
66
+ startAgentForStream({
67
+ target: enrichedTarget,
68
+ accountId: target.account.accountId,
69
+ msg,
70
+ streamId,
71
+ mergedContents: contents.length > 1 ? mergedContents : undefined,
72
+ mergedMsgids: msgids.length > 1 ? msgids : undefined,
73
+ }).catch((err) => {
74
+ streamStore.updateStream(streamId, (state) => {
75
+ state.error = err instanceof Error ? err.message : String(err);
76
+ state.content = state.content || `Error: ${state.error}`;
77
+ state.finished = true;
78
+ });
79
+ target.runtime.error?.(`[${target.account.accountId}] wecom agent failed (处理失败): ${String(err)}`);
80
+ streamStore.onStreamFinished(streamId);
81
+ });
82
+ }
83
+ async function startAgentForStream(params) {
84
+ const { target, msg, streamId } = params;
85
+ const core = target.core;
86
+ const config = target.config;
87
+ const account = target.account;
88
+ const userId = resolveWecomSenderUserId(msg) || "unknown";
89
+ const chatType = msg.chattype === "group" ? "group" : "direct";
90
+ const chatId = msg.chattype === "group" ? (msg.chatid?.trim() || "unknown") : userId;
91
+ const taskKey = computeTaskKey(target, msg);
92
+ const aibotid = String(msg.aibotid ?? "").trim() || undefined;
93
+ streamStore.updateStream(streamId, (s) => {
94
+ s.userId = userId;
95
+ s.chatType = chatType;
96
+ s.chatId = chatId;
97
+ s.taskKey = taskKey;
98
+ s.aibotid = aibotid;
99
+ });
100
+ let { body: rawBody, media } = await processBotInboundMessage({
101
+ target,
102
+ msg,
103
+ recordOperationalIssue: (event) => recordBotOperationalEvent(target, event),
104
+ });
105
+ if (params.mergedContents) {
106
+ rawBody = Array.isArray(params.mergedContents) ? params.mergedContents.join("\n") : params.mergedContents;
107
+ }
108
+ const handledLocalPath = await handleDirectLocalPathIntent({
109
+ streamStore,
110
+ target,
111
+ streamId,
112
+ rawBody,
113
+ userId,
114
+ chatType,
115
+ logVerbose,
116
+ looksLikeSendLocalFileIntent,
117
+ });
118
+ if (handledLocalPath)
119
+ return;
120
+ let mediaPath;
121
+ let mediaType;
122
+ const mediaFilename = media?.filename;
123
+ if (media) {
124
+ try {
125
+ const maxBytes = resolveWecomMediaMaxBytes(target.config, target.account.accountId);
126
+ const saved = await core.channel.media.saveMediaBuffer(media.buffer, media.contentType, "inbound", maxBytes, media.filename);
127
+ mediaPath = saved.path;
128
+ mediaType = saved.contentType;
129
+ logVerbose(target, `saved inbound media to ${mediaPath} (${mediaType})`);
130
+ }
131
+ catch (err) {
132
+ target.runtime.error?.(`Failed to save inbound media: ${String(err)}`);
133
+ }
134
+ }
135
+ const route = core.channel.routing.resolveAgentRoute({
136
+ cfg: config,
137
+ channel: "wecom",
138
+ accountId: account.accountId,
139
+ peer: { kind: chatType === "group" ? "group" : "direct", id: chatId },
140
+ });
141
+ const useDynamicAgent = shouldUseDynamicAgent({
142
+ chatType: chatType === "group" ? "group" : "dm",
143
+ senderId: userId,
144
+ config,
145
+ });
146
+ if (shouldRejectWecomDefaultRoute({ cfg: config, matchedBy: route.matchedBy, useDynamicAgent })) {
147
+ const prompt = `当前账号(${account.accountId})未绑定 OpenClaw Agent,已拒绝回退到默认主智能体。` +
148
+ `请在 bindings 中添加:{"agentId":"你的Agent","match":{"channel":"wecom","accountId":"${account.accountId}"}}`;
149
+ target.runtime.error?.(`[wecom] routing guard: blocked default fallback accountId=${account.accountId} matchedBy=${route.matchedBy} streamId=${streamId}`);
150
+ streamStore.updateStream(streamId, (s) => {
151
+ s.finished = true;
152
+ s.content = prompt;
153
+ });
154
+ try {
155
+ await sendBotFallbackPromptNow({ streamId, text: prompt });
156
+ }
157
+ catch (err) {
158
+ target.runtime.error?.(`routing guard prompt push failed streamId=${streamId}: ${String(err)}`);
159
+ }
160
+ streamStore.onStreamFinished(streamId);
161
+ return;
162
+ }
163
+ if (useDynamicAgent) {
164
+ const targetAgentId = generateAgentId(chatType === "group" ? "group" : "dm", chatId, account.accountId);
165
+ route.agentId = targetAgentId;
166
+ route.sessionKey = `agent:${targetAgentId}:wecom:${account.accountId}:${chatType === "group" ? "group" : "dm"}:${chatId}`;
167
+ ensureDynamicAgentListed(targetAgentId, core).catch(() => { });
168
+ logVerbose(target, `dynamic agent routing: ${targetAgentId}, sessionKey=${route.sessionKey}`);
169
+ }
170
+ if (mediaPath) {
171
+ try {
172
+ const stagedSessionPath = await stageWecomInboundMediaForSession({
173
+ cfg: target.config,
174
+ accountId: target.account.accountId,
175
+ agentId: route.agentId,
176
+ sessionKey: route.sessionKey,
177
+ mediaPath,
178
+ filename: mediaFilename,
179
+ });
180
+ mediaPath = stagedSessionPath;
181
+ logVerbose(target, `session media staged to ${mediaPath}`);
182
+ }
183
+ catch (err) {
184
+ target.runtime.error?.(`Failed to stage inbound media for session workspace: ${String(err)}`);
185
+ }
186
+ }
187
+ logVerbose(target, `starting agent processing (streamId=${streamId}, agentId=${route.agentId}, peerKind=${chatType}, peerId=${chatId})`);
188
+ logVerbose(target, `启动 Agent 处理: streamId=${streamId} 路由=${route.agentId} 类型=${chatType} ID=${chatId}`);
189
+ const fromLabel = chatType === "group" ? `group:${chatId}` : `user:${userId}`;
190
+ const storePath = core.channel.session.resolveStorePath(config.session?.store, { agentId: route.agentId });
191
+ const envelopeOptions = core.channel.reply.resolveEnvelopeFormatOptions(config);
192
+ const previousTimestamp = core.channel.session.readSessionUpdatedAt({
193
+ storePath,
194
+ sessionKey: route.sessionKey,
195
+ });
196
+ const body = core.channel.reply.formatAgentEnvelope({
197
+ channel: "WeCom",
198
+ from: fromLabel,
199
+ previousTimestamp,
200
+ envelope: envelopeOptions,
201
+ body: rawBody,
202
+ });
203
+ const authz = await resolveWecomCommandAuthorization({
204
+ core,
205
+ cfg: config,
206
+ accountConfig: account.config,
207
+ rawBody,
208
+ senderUserId: userId,
209
+ });
210
+ const commandAuthorized = authz.commandAuthorized;
211
+ logVerbose(target, `authz: dmPolicy=${authz.dmPolicy} shouldCompute=${authz.shouldComputeAuth} sender=${userId.toLowerCase()} senderAllowed=${authz.senderAllowed} authorizerConfigured=${authz.authorizerConfigured} commandAuthorized=${String(authz.commandAuthorized)}`);
212
+ if (authz.shouldComputeAuth && authz.commandAuthorized !== true) {
213
+ const prompt = buildWecomUnauthorizedCommandPrompt({ senderUserId: userId, dmPolicy: authz.dmPolicy, scope: "bot" });
214
+ streamStore.updateStream(streamId, (s) => {
215
+ s.finished = true;
216
+ s.content = prompt;
217
+ });
218
+ try {
219
+ await sendBotFallbackPromptNow({ streamId, text: prompt });
220
+ logInfo(target, `authz: 未授权命令已提示用户 streamId=${streamId}`);
221
+ }
222
+ catch (err) {
223
+ target.runtime.error?.(`authz: 未授权命令提示推送失败 streamId=${streamId}: ${String(err)}`);
224
+ }
225
+ streamStore.onStreamFinished(streamId);
226
+ return;
227
+ }
228
+ const attachments = mediaPath
229
+ ? [
230
+ {
231
+ name: media?.filename || "file",
232
+ mimeType: mediaType,
233
+ url: pathToFileURL(mediaPath).href,
234
+ },
235
+ ]
236
+ : undefined;
237
+ const ctxPayload = core.channel.reply.finalizeInboundContext({
238
+ Body: body,
239
+ RawBody: rawBody,
240
+ CommandBody: rawBody,
241
+ Attachments: attachments,
242
+ From: chatType === "group" ? `wecom:group:${chatId}` : `wecom:user:${userId}`,
243
+ To: chatType === "group" ? `wecom:group:${chatId}` : `wecom:user:${chatId}`,
244
+ SessionKey: route.sessionKey,
245
+ AccountId: route.accountId,
246
+ ChatType: chatType,
247
+ ConversationLabel: fromLabel,
248
+ SenderName: userId,
249
+ SenderId: userId,
250
+ Provider: "wecom",
251
+ Surface: "wecom",
252
+ MessageSid: msg.msgid,
253
+ CommandAuthorized: commandAuthorized,
254
+ OriginatingChannel: "wecom",
255
+ OriginatingTo: chatType === "group" ? `wecom:group:${chatId}` : `wecom:user:${chatId}`,
256
+ MediaPath: mediaPath,
257
+ MediaType: mediaType,
258
+ MediaUrl: mediaPath,
259
+ });
260
+ await core.channel.session.recordInboundSession({
261
+ storePath,
262
+ sessionKey: ctxPayload.SessionKey ?? route.sessionKey,
263
+ ctx: ctxPayload,
264
+ onRecordError: (err) => {
265
+ target.runtime.error?.(`wecom: failed updating session meta: ${String(err)}`);
266
+ },
267
+ });
268
+ const tableMode = core.channel.text.resolveMarkdownTableMode({
269
+ cfg: config,
270
+ channel: "wecom",
271
+ accountId: account.accountId,
272
+ });
273
+ const cfgForDispatch = buildWecomBotDispatchConfig(config);
274
+ logVerbose(target, "tool-policy: WeCom Bot 会话已禁用 message 工具(tools.deny += message;并同步到 tools.sandbox.tools.deny,防止绕过 Bot 交付)");
275
+ await core.channel.reply.dispatchReplyWithBufferedBlockDispatcher({
276
+ ctx: ctxPayload,
277
+ cfg: cfgForDispatch,
278
+ replyOptions: { disableBlockStreaming: false },
279
+ dispatcherOptions: createBotReplyDispatcher({
280
+ streamStore,
281
+ target,
282
+ accountId: account.accountId,
283
+ config,
284
+ msg,
285
+ streamId,
286
+ rawBody,
287
+ chatType,
288
+ userId,
289
+ core,
290
+ tableMode,
291
+ logVerbose,
292
+ truncateUtf8Bytes,
293
+ recordBotOperationalEvent,
294
+ }),
295
+ });
296
+ const rawBodyNormalized = rawBody.trim();
297
+ const isResetCommand = /^\/(new|reset)(?:\s|$)/i.test(rawBodyNormalized);
298
+ const resetCommandKind = isResetCommand ? (rawBodyNormalized.match(/^\/(new|reset)/i)?.[1]?.toLowerCase() ?? "new") : null;
299
+ await finalizeBotStream({
300
+ streamStore,
301
+ target,
302
+ streamId,
303
+ chatType,
304
+ core,
305
+ config,
306
+ accountId: account.accountId,
307
+ isResetCommand,
308
+ resetCommandKind,
309
+ logInfo,
310
+ logVerbose,
311
+ recordBotOperationalEvent,
312
+ });
313
+ }
314
+ return {
315
+ flushPending,
316
+ startAgentForStream,
317
+ };
318
+ }
@@ -0,0 +1 @@
1
+ export {};