ylib-wecom-openclaw-plugin 2026.4.29

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 (180) hide show
  1. package/README.md +596 -0
  2. package/dist/index.d.ts +10 -0
  3. package/dist/index.js +99 -0
  4. package/dist/src/accounts.d.ts +57 -0
  5. package/dist/src/accounts.js +247 -0
  6. package/dist/src/agent/api-client.d.ts +95 -0
  7. package/dist/src/agent/api-client.js +425 -0
  8. package/dist/src/agent/handler.d.ts +64 -0
  9. package/dist/src/agent/handler.js +731 -0
  10. package/dist/src/agent/index.d.ts +5 -0
  11. package/dist/src/agent/index.js +21 -0
  12. package/dist/src/agent/webhook.d.ts +25 -0
  13. package/dist/src/agent/webhook.js +294 -0
  14. package/dist/src/agent/xml.d.ts +21 -0
  15. package/dist/src/agent/xml.js +43 -0
  16. package/dist/src/channel.d.ts +5 -0
  17. package/dist/src/channel.js +815 -0
  18. package/dist/src/chat-queue.d.ts +31 -0
  19. package/dist/src/chat-queue.js +53 -0
  20. package/dist/src/config-schema.d.ts +587 -0
  21. package/dist/src/config-schema.js +146 -0
  22. package/dist/src/const.d.ts +128 -0
  23. package/dist/src/const.js +168 -0
  24. package/dist/src/dm-policy.d.ts +29 -0
  25. package/dist/src/dm-policy.js +146 -0
  26. package/dist/src/dynamic-agent.d.ts +37 -0
  27. package/dist/src/dynamic-agent.js +67 -0
  28. package/dist/src/dynamic-routing.d.ts +65 -0
  29. package/dist/src/dynamic-routing.js +62 -0
  30. package/dist/src/endpoint-dispatch.d.ts +54 -0
  31. package/dist/src/endpoint-dispatch.js +967 -0
  32. package/dist/src/endpoint-event-adapter.d.ts +15 -0
  33. package/dist/src/endpoint-event-adapter.js +427 -0
  34. package/dist/src/group-policy.d.ts +30 -0
  35. package/dist/src/group-policy.js +126 -0
  36. package/dist/src/http.d.ts +27 -0
  37. package/dist/src/http.js +168 -0
  38. package/dist/src/im-runtime-telemetry.d.ts +25 -0
  39. package/dist/src/im-runtime-telemetry.js +68 -0
  40. package/dist/src/interface.d.ts +192 -0
  41. package/dist/src/interface.js +5 -0
  42. package/dist/src/markdown-chunk.d.ts +1 -0
  43. package/dist/src/markdown-chunk.js +396 -0
  44. package/dist/src/mcp/index.d.ts +6 -0
  45. package/dist/src/mcp/index.js +28 -0
  46. package/dist/src/mcp/interceptors/biz-error.d.ts +11 -0
  47. package/dist/src/mcp/interceptors/biz-error.js +73 -0
  48. package/dist/src/mcp/interceptors/doc-auth-error.d.ts +10 -0
  49. package/dist/src/mcp/interceptors/doc-auth-error.js +235 -0
  50. package/dist/src/mcp/interceptors/index.d.ts +35 -0
  51. package/dist/src/mcp/interceptors/index.js +143 -0
  52. package/dist/src/mcp/interceptors/msg-media.d.ts +11 -0
  53. package/dist/src/mcp/interceptors/msg-media.js +201 -0
  54. package/dist/src/mcp/interceptors/smartpage-create.d.ts +30 -0
  55. package/dist/src/mcp/interceptors/smartpage-create.js +252 -0
  56. package/dist/src/mcp/interceptors/smartpage-export.d.ts +17 -0
  57. package/dist/src/mcp/interceptors/smartpage-export.js +135 -0
  58. package/dist/src/mcp/interceptors/smartsheet-upload.d.ts +22 -0
  59. package/dist/src/mcp/interceptors/smartsheet-upload.js +388 -0
  60. package/dist/src/mcp/interceptors/types.d.ts +64 -0
  61. package/dist/src/mcp/interceptors/types.js +8 -0
  62. package/dist/src/mcp/schema.d.ts +11 -0
  63. package/dist/src/mcp/schema.js +115 -0
  64. package/dist/src/mcp/tool.d.ts +63 -0
  65. package/dist/src/mcp/tool.js +318 -0
  66. package/dist/src/mcp/transport.d.ts +94 -0
  67. package/dist/src/mcp/transport.js +702 -0
  68. package/dist/src/media-handler.d.ts +55 -0
  69. package/dist/src/media-handler.js +306 -0
  70. package/dist/src/media-uploader.d.ts +142 -0
  71. package/dist/src/media-uploader.js +446 -0
  72. package/dist/src/message-parser.d.ts +104 -0
  73. package/dist/src/message-parser.js +232 -0
  74. package/dist/src/message-sender.d.ts +54 -0
  75. package/dist/src/message-sender.js +210 -0
  76. package/dist/src/monitor.d.ts +69 -0
  77. package/dist/src/monitor.js +1846 -0
  78. package/dist/src/onboarding.d.ts +8 -0
  79. package/dist/src/onboarding.js +248 -0
  80. package/dist/src/openclaw-compat.d.ts +148 -0
  81. package/dist/src/openclaw-compat.js +839 -0
  82. package/dist/src/proactive-markdown-send.d.ts +14 -0
  83. package/dist/src/proactive-markdown-send.js +205 -0
  84. package/dist/src/reqid-store.d.ts +23 -0
  85. package/dist/src/reqid-store.js +136 -0
  86. package/dist/src/runtime.d.ts +2 -0
  87. package/dist/src/runtime.js +7 -0
  88. package/dist/src/shared/command-auth.d.ts +23 -0
  89. package/dist/src/shared/command-auth.js +112 -0
  90. package/dist/src/shared/xml-parser.d.ts +46 -0
  91. package/dist/src/shared/xml-parser.js +228 -0
  92. package/dist/src/state-dir-resolve.d.ts +2 -0
  93. package/dist/src/state-dir-resolve.js +33 -0
  94. package/dist/src/state-manager.d.ts +115 -0
  95. package/dist/src/state-manager.js +413 -0
  96. package/dist/src/target.d.ts +35 -0
  97. package/dist/src/target.js +71 -0
  98. package/dist/src/template-card-manager.d.ts +55 -0
  99. package/dist/src/template-card-manager.js +316 -0
  100. package/dist/src/template-card-parser.d.ts +37 -0
  101. package/dist/src/template-card-parser.js +672 -0
  102. package/dist/src/timeout.d.ts +20 -0
  103. package/dist/src/timeout.js +57 -0
  104. package/dist/src/types/account.d.ts +29 -0
  105. package/dist/src/types/account.js +5 -0
  106. package/dist/src/types/config.d.ts +98 -0
  107. package/dist/src/types/config.js +8 -0
  108. package/dist/src/types/constants.d.ts +42 -0
  109. package/dist/src/types/constants.js +45 -0
  110. package/dist/src/types/index.d.ts +7 -0
  111. package/dist/src/types/index.js +17 -0
  112. package/dist/src/types/message.d.ts +238 -0
  113. package/dist/src/types/message.js +6 -0
  114. package/dist/src/utils.d.ts +148 -0
  115. package/dist/src/utils.js +92 -0
  116. package/dist/src/version.d.ts +2 -0
  117. package/dist/src/version.js +28 -0
  118. package/dist/src/webhook/command-auth.d.ts +47 -0
  119. package/dist/src/webhook/command-auth.js +137 -0
  120. package/dist/src/webhook/gateway.d.ts +36 -0
  121. package/dist/src/webhook/gateway.js +297 -0
  122. package/dist/src/webhook/handler.d.ts +19 -0
  123. package/dist/src/webhook/handler.js +481 -0
  124. package/dist/src/webhook/helpers.d.ts +157 -0
  125. package/dist/src/webhook/helpers.js +936 -0
  126. package/dist/src/webhook/http.d.ts +27 -0
  127. package/dist/src/webhook/http.js +168 -0
  128. package/dist/src/webhook/index.d.ts +11 -0
  129. package/dist/src/webhook/index.js +43 -0
  130. package/dist/src/webhook/media.d.ts +30 -0
  131. package/dist/src/webhook/media.js +152 -0
  132. package/dist/src/webhook/monitor.d.ts +59 -0
  133. package/dist/src/webhook/monitor.js +1672 -0
  134. package/dist/src/webhook/state.d.ts +220 -0
  135. package/dist/src/webhook/state.js +568 -0
  136. package/dist/src/webhook/target.d.ts +41 -0
  137. package/dist/src/webhook/target.js +165 -0
  138. package/dist/src/webhook/types.d.ts +348 -0
  139. package/dist/src/webhook/types.js +36 -0
  140. package/dist/src/webhook/video-frame.d.ts +13 -0
  141. package/dist/src/webhook/video-frame.js +108 -0
  142. package/openclaw.plugin.json +19 -0
  143. package/package.json +96 -0
  144. package/schema.json +534 -0
  145. package/scripts/generate-schema.mjs +33 -0
  146. package/skills/wecom-contact/SKILL.md +162 -0
  147. package/skills/wecom-doc/SKILL.md +162 -0
  148. package/skills/wecom-doc/references/create-doc.md +56 -0
  149. package/skills/wecom-doc/references/edit-doc-content.md +68 -0
  150. package/skills/wecom-doc/references/get-doc-content.md +88 -0
  151. package/skills/wecom-doc/references/smartpage-create.md +125 -0
  152. package/skills/wecom-doc/references/smartpage-export.md +160 -0
  153. package/skills/wecom-meeting/SKILL.md +441 -0
  154. package/skills/wecom-meeting/references/example-full.md +30 -0
  155. package/skills/wecom-meeting/references/example-reminder.md +46 -0
  156. package/skills/wecom-meeting/references/example-security.md +22 -0
  157. package/skills/wecom-meeting/references/response-get-meeting-info.md +148 -0
  158. package/skills/wecom-msg/SKILL.md +157 -0
  159. package/skills/wecom-msg/references/api-get-messages.md +93 -0
  160. package/skills/wecom-msg/references/api-get-msg-chat-list.md +58 -0
  161. package/skills/wecom-msg/references/api-get-msg-media.md +44 -0
  162. package/skills/wecom-msg/references/api-send-message.md +39 -0
  163. package/skills/wecom-preflight/SKILL.md +141 -0
  164. package/skills/wecom-schedule/SKILL.md +161 -0
  165. package/skills/wecom-schedule/references/api-check-availability.md +56 -0
  166. package/skills/wecom-schedule/references/api-create-schedule.md +38 -0
  167. package/skills/wecom-schedule/references/api-get-schedule-detail.md +81 -0
  168. package/skills/wecom-schedule/references/api-update-schedule.md +32 -0
  169. package/skills/wecom-schedule/references/ref-reminders.md +24 -0
  170. package/skills/wecom-send-media/SKILL.md +68 -0
  171. package/skills/wecom-send-template-card/SKILL.md +157 -0
  172. package/skills/wecom-send-template-card/references/api-template-card-types.md +358 -0
  173. package/skills/wecom-smartsheet/SKILL.md +164 -0
  174. package/skills/wecom-smartsheet/references/smartsheet-cell-value-formats.md +163 -0
  175. package/skills/wecom-smartsheet/references/smartsheet-field-types.md +44 -0
  176. package/skills/wecom-smartsheet/references/smartsheet-get-records.md +96 -0
  177. package/skills/wecom-smartsheet/references/webhook-examples.md +185 -0
  178. package/skills/wecom-smartsheet/references/webhook-fallback.md +184 -0
  179. package/skills/wecom-todo/SKILL.md +392 -0
  180. package/skills/wecom-todo/examples/workflows.md +163 -0
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ /**
3
+ * Webhook Gateway 生命周期管理
4
+ *
5
+ * 从 @mocrane/wecom gateway-monitor.ts 部分迁移(仅 Webhook 部分)。
6
+ * 负责:初始化状态、注册 Target、启停管理。
7
+ *
8
+ * 关键设计:
9
+ * - MonitorState 是全局单例(monitorState),所有账号共享同一个 StreamStore 和 ActiveReplyStore
10
+ * - Target 注册/注销不影响 monitorState 生命周期,只控制 pruneTimer 的启停
11
+ * - 每个账号注册多条路径(兼容历史路径 + 推荐路径 + 多账号路径)
12
+ * - 按 accountId 管理各自的 unregister,stop 时只注销该账号的 Target
13
+ */
14
+ var __assign = (this && this.__assign) || function () {
15
+ __assign = Object.assign || function(t) {
16
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
17
+ s = arguments[i];
18
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
19
+ t[p] = s[p];
20
+ }
21
+ return t;
22
+ };
23
+ return __assign.apply(this, arguments);
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __generator = (this && this.__generator) || function (thisArg, body) {
35
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
36
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
37
+ function verb(n) { return function (v) { return step([n, v]); }; }
38
+ function step(op) {
39
+ if (f) throw new TypeError("Generator is already executing.");
40
+ while (_) try {
41
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
42
+ if (y = 0, t) op = [op[0] & 2, t.value];
43
+ switch (op[0]) {
44
+ case 0: case 1: t = op; break;
45
+ case 4: _.label++; return { value: op[1], done: false };
46
+ case 5: _.label++; y = op[1]; op = [0]; continue;
47
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
48
+ default:
49
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
50
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
52
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
53
+ if (t[2]) _.ops.pop();
54
+ _.trys.pop(); continue;
55
+ }
56
+ op = body.call(thisArg, _);
57
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
58
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
+ }
60
+ };
61
+ exports.__esModule = true;
62
+ exports.stopWebhookGateway = exports.startWebhookGateway = exports.getMonitorState = void 0;
63
+ var types_js_1 = require("./types.js");
64
+ var state_js_1 = require("./state.js");
65
+ var target_js_1 = require("./target.js");
66
+ var monitor_js_1 = require("./monitor.js");
67
+ var accounts_js_1 = require("../accounts.js");
68
+ var openclaw_compat_js_1 = require("../openclaw-compat.js");
69
+ var runtime_js_1 = require("../runtime.js");
70
+ // ============================================================================
71
+ // 全局状态
72
+ // ============================================================================
73
+ /** 按 accountId 管理各账号的 Target 注销函数 */
74
+ var accountUnregisters = new Map();
75
+ /** FlushHandler 是否已设置(只需设置一次,因为 monitorState 是单例) */
76
+ var flushHandlerInstalled = false;
77
+ // ============================================================================
78
+ // 路径解析
79
+ // ============================================================================
80
+ /**
81
+ * 去除重复路径
82
+ */
83
+ function uniquePaths(paths) {
84
+ return Array.from(new Set(paths.map(function (p) { return p.trim(); }).filter(Boolean)));
85
+ }
86
+ /**
87
+ * 解析 Bot Target 注册路径
88
+ *
89
+ * 多账号场景(matrixMode)下:注册带 accountId 后缀的路径 + 兼容老路径
90
+ * 单账号场景下:只注册基础路径
91
+ *
92
+ * 参考 lh 版 resolveBotRegistrationPaths
93
+ */
94
+ function resolveBotRegistrationPaths(params) {
95
+ if (params.matrixMode) {
96
+ return uniquePaths([
97
+ types_js_1.WEBHOOK_PATHS.BOT_PLUGIN + "/" + params.accountId,
98
+ types_js_1.WEBHOOK_PATHS.BOT_ALT + "/" + params.accountId,
99
+ // 兼容老路径:不带 accountId 后缀,签名验证会自动匹配到正确账号
100
+ types_js_1.WEBHOOK_PATHS.BOT_PLUGIN,
101
+ types_js_1.WEBHOOK_PATHS.BOT,
102
+ types_js_1.WEBHOOK_PATHS.BOT_ALT,
103
+ ]);
104
+ }
105
+ // 单账号模式:同时注册 /default 路径以支持显式指定
106
+ return uniquePaths([
107
+ types_js_1.WEBHOOK_PATHS.BOT_PLUGIN,
108
+ types_js_1.WEBHOOK_PATHS.BOT,
109
+ types_js_1.WEBHOOK_PATHS.BOT_ALT,
110
+ types_js_1.WEBHOOK_PATHS.BOT_PLUGIN + "/" + openclaw_compat_js_1.DEFAULT_ACCOUNT_ID,
111
+ types_js_1.WEBHOOK_PATHS.BOT_ALT + "/" + openclaw_compat_js_1.DEFAULT_ACCOUNT_ID,
112
+ ]);
113
+ }
114
+ // ============================================================================
115
+ // 公共 API
116
+ // ============================================================================
117
+ /**
118
+ * 获取当前的 MonitorState 实例(全局单例)
119
+ *
120
+ * 供 monitor.ts 等内部模块调用以访问 StreamStore 和 ActiveReplyStore。
121
+ */
122
+ function getMonitorState() {
123
+ return state_js_1.monitorState;
124
+ }
125
+ exports.getMonitorState = getMonitorState;
126
+ /**
127
+ * 启动 Webhook Gateway
128
+ *
129
+ * 1. 验证 Webhook 配置
130
+ * 2. 确保 pruneTimer 启动
131
+ * 3. 设置 FlushHandler(仅首次)
132
+ * 4. 解析并注册多条 Webhook 路径
133
+ */
134
+ function startWebhookGateway(ctx) {
135
+ var _a, _b, _c, _d;
136
+ var account = ctx.account, config = ctx.config, runtime = ctx.runtime;
137
+ var log = (_a = ctx.log) !== null && _a !== void 0 ? _a : {
138
+ info: function (msg) { return runtime.log(msg); },
139
+ error: function (msg) { return runtime.error(msg); }
140
+ };
141
+ // 1. 验证必要配置(receiveId 非必填,可为空)
142
+ if (!account.token || !account.encodingAESKey) {
143
+ var missing = [];
144
+ if (!account.token)
145
+ missing.push("token");
146
+ if (!account.encodingAESKey)
147
+ missing.push("encodingAESKey");
148
+ var errorMsg = "[webhook] Webhook \u914D\u7F6E\u4E0D\u5B8C\u6574\uFF0C\u7F3A\u5C11: " + missing.join(", ");
149
+ log.error(errorMsg);
150
+ (_b = ctx.setStatus) === null || _b === void 0 ? void 0 : _b.call(ctx, {
151
+ accountId: ctx.accountId,
152
+ running: false,
153
+ configured: false,
154
+ lastError: errorMsg
155
+ });
156
+ return;
157
+ }
158
+ log.info("[webhook] \u542F\u52A8 Webhook Gateway (accountId=" + ctx.accountId + ")");
159
+ // 2. 确保 pruneTimer 启动(幂等:如果已在运行,不会重复启动)
160
+ state_js_1.monitorState.startPruning(types_js_1.PRUNE_INTERVAL_MS);
161
+ // 3. 设置 FlushHandler(仅首次,因为 monitorState 是全局单例)
162
+ if (!flushHandlerInstalled) {
163
+ state_js_1.monitorState.streamStore.setFlushHandler(function (pending) { return void flushPending(pending); });
164
+ flushHandlerInstalled = true;
165
+ }
166
+ // 4. 构造 Target 上下文
167
+ var runtimeEnv = {
168
+ log: function (msg) { return runtime.log(msg); },
169
+ error: function (msg) { return runtime.error(msg); }
170
+ };
171
+ // 判断是否为多账号模式
172
+ var matrixMode = accounts_js_1.hasMultiAccounts(ctx.config);
173
+ var target = {
174
+ account: account,
175
+ config: config,
176
+ runtime: runtimeEnv,
177
+ core: ((_c = ctx.channelRuntime) !== null && _c !== void 0 ? _c : runtime),
178
+ path: types_js_1.WEBHOOK_PATHS.BOT_PLUGIN + "/" + ctx.accountId,
179
+ statusSink: ctx.setStatus
180
+ ? function (patch) { var _a; return (_a = ctx.setStatus) === null || _a === void 0 ? void 0 : _a.call(ctx, __assign({ accountId: ctx.accountId }, patch)); }
181
+ : undefined
182
+ };
183
+ // 5. 解析注册路径
184
+ var paths = resolveBotRegistrationPaths({
185
+ accountId: ctx.accountId,
186
+ matrixMode: matrixMode
187
+ });
188
+ // 6. 注册 Target(返回注销函数)
189
+ // 如果该账号之前已注册(例如 reload),先注销
190
+ var existingUnregister = accountUnregisters.get(ctx.accountId);
191
+ if (existingUnregister) {
192
+ existingUnregister();
193
+ }
194
+ var unregister = target_js_1.registerWecomWebhookTarget(target, paths);
195
+ accountUnregisters.set(ctx.accountId, unregister);
196
+ log.info("[webhook] Webhook Target \u5DF2\u6CE8\u518C (accountId=" + ctx.accountId + ", paths=[" + paths.join(", ") + "])");
197
+ // 7. 更新状态
198
+ (_d = ctx.setStatus) === null || _d === void 0 ? void 0 : _d.call(ctx, {
199
+ accountId: ctx.accountId,
200
+ running: true,
201
+ configured: true,
202
+ webhookPath: paths[0],
203
+ lastStartAt: Date.now()
204
+ });
205
+ }
206
+ exports.startWebhookGateway = startWebhookGateway;
207
+ /**
208
+ * 停止 Webhook Gateway
209
+ *
210
+ * 1. 注销该账号的 Target(不影响其他账号)
211
+ * 2. 如果没有任何活跃 Target,停止清理定时器
212
+ */
213
+ function stopWebhookGateway(ctx) {
214
+ var _a, _b;
215
+ var log = (_a = ctx.log) !== null && _a !== void 0 ? _a : {
216
+ info: function (msg) { return ctx.runtime.log(msg); },
217
+ error: function (msg) { return ctx.runtime.error(msg); }
218
+ };
219
+ log.info("[webhook] \u505C\u6B62 Webhook Gateway (accountId=" + ctx.accountId + ")");
220
+ // 1. 注销该账号的 Target
221
+ var unregister = accountUnregisters.get(ctx.accountId);
222
+ if (unregister) {
223
+ unregister();
224
+ accountUnregisters["delete"](ctx.accountId);
225
+ }
226
+ // 2. 如果没有任何活跃 Target,停止 pruneTimer
227
+ if (!target_js_1.hasActiveTargets()) {
228
+ state_js_1.monitorState.stopPruning();
229
+ }
230
+ // 3. 更新状态
231
+ (_b = ctx.setStatus) === null || _b === void 0 ? void 0 : _b.call(ctx, {
232
+ accountId: ctx.accountId,
233
+ running: false,
234
+ lastStopAt: Date.now()
235
+ });
236
+ }
237
+ exports.stopWebhookGateway = stopWebhookGateway;
238
+ // ============================================================================
239
+ // flushPending 中间层(对齐原版 monitor.ts:1151-1192)
240
+ // ============================================================================
241
+ /**
242
+ * **flushPending (刷新待处理消息 / 核心 Agent 触发点)**
243
+ *
244
+ * 当防抖计时器结束时被调用。
245
+ * 核心逻辑:
246
+ * 1. 聚合所有 pending 的消息内容(用于上下文)。
247
+ * 2. 获取 PluginRuntime。
248
+ * 3. 标记 Stream 为 Started。
249
+ * 4. 调用 `startAgentForStream` 启动 Agent 流程。
250
+ * 5. 处理异常并更新 Stream 状态为 Error。
251
+ */
252
+ function flushPending(pending) {
253
+ var _a, _b, _c, _d, _e, _f;
254
+ return __awaiter(this, void 0, void 0, function () {
255
+ var streamId, target, msg, contents, msgids, conversationKey, batchKey, streamStore, mergedContents, core, enrichedTarget;
256
+ return __generator(this, function (_g) {
257
+ streamId = pending.streamId, target = pending.target, msg = pending.msg, contents = pending.contents, msgids = pending.msgids, conversationKey = pending.conversationKey, batchKey = pending.batchKey;
258
+ streamStore = state_js_1.monitorState.streamStore;
259
+ mergedContents = contents.filter(function (c) { return c.trim(); }).join("\n").trim();
260
+ core = null;
261
+ try {
262
+ core = runtime_js_1.getWeComRuntime();
263
+ }
264
+ catch (err) {
265
+ (_b = (_a = target.runtime).log) === null || _b === void 0 ? void 0 : _b.call(_a, "[webhook] flush pending: runtime not ready: " + String(err));
266
+ streamStore.markFinished(streamId);
267
+ (_d = (_c = target.runtime).log) === null || _d === void 0 ? void 0 : _d.call(_c, "[webhook] queue: runtime not ready\uFF0C\u7ED3\u675F\u6279\u6B21\u5E76\u63A8\u8FDB streamId=" + streamId);
268
+ streamStore.onStreamFinished(streamId);
269
+ return [2 /*return*/];
270
+ }
271
+ if (core) {
272
+ streamStore.markStarted(streamId);
273
+ enrichedTarget = __assign(__assign({}, target), { core: core });
274
+ (_f = (_e = target.runtime).log) === null || _f === void 0 ? void 0 : _f.call(_e, "[webhook] flush pending: start batch streamId=" + streamId + " batchKey=" + batchKey + " conversationKey=" + conversationKey + " mergedCount=" + contents.length);
275
+ // Pass the first msg (with its media structure), and mergedContents for multi-message context
276
+ monitor_js_1.startAgentForStream({
277
+ target: enrichedTarget,
278
+ accountId: target.account.accountId,
279
+ msg: msg,
280
+ streamId: streamId,
281
+ mergedContents: contents.length > 1 ? mergedContents : undefined,
282
+ mergedMsgids: msgids.length > 1 ? msgids : undefined
283
+ })["catch"](function (err) {
284
+ var _a, _b;
285
+ streamStore.updateStream(streamId, function (state) {
286
+ state.error = err instanceof Error ? err.message : String(err);
287
+ state.content = state.content || "Error: " + state.error;
288
+ state.finished = true;
289
+ });
290
+ (_b = (_a = target.runtime).error) === null || _b === void 0 ? void 0 : _b.call(_a, "[webhook] Agent \u5904\u7406\u5931\u8D25 (streamId=" + streamId + "): " + String(err));
291
+ streamStore.onStreamFinished(streamId);
292
+ });
293
+ }
294
+ return [2 /*return*/];
295
+ });
296
+ });
297
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Webhook HTTP 请求处理
3
+ *
4
+ * 从 @mocrane/wecom monitor.ts handleWecomWebhookRequest 部分迁移 + 重构。
5
+ * 负责:
6
+ * 1. GET/POST 请求分流
7
+ * 2. 签名验证(调用 crypto 模块)
8
+ * 3. 消息解密
9
+ * 4. 按消息类型分发到 monitor 层
10
+ */
11
+ /// <reference types="node" />
12
+ import type { IncomingMessage, ServerResponse } from "node:http";
13
+ /**
14
+ * Webhook HTTP 请求总入口
15
+ *
16
+ * 处理企微 Bot Webhook 的 GET(URL 验证)和 POST(消息回调)请求。
17
+ * 返回 true 表示已处理,false 表示不匹配(交给其他 handler)。
18
+ */
19
+ export declare function handleWecomWebhookRequest(req: IncomingMessage, res: ServerResponse): Promise<boolean>;