@xgjktech/xg_cwork_im 1.11.6 → 1.11.7

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 (84) hide show
  1. package/README.md +17 -6
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +12 -7
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/agent-context-types.d.ts +33 -0
  6. package/dist/src/agent-context-types.d.ts.map +1 -0
  7. package/dist/src/agent-context-types.js +26 -0
  8. package/dist/src/agent-context-types.js.map +1 -0
  9. package/dist/src/apply-sync-mapping.d.ts +17 -0
  10. package/dist/src/apply-sync-mapping.d.ts.map +1 -0
  11. package/dist/src/apply-sync-mapping.js +86 -0
  12. package/dist/src/apply-sync-mapping.js.map +1 -0
  13. package/dist/src/auth.d.ts +2 -2
  14. package/dist/src/auth.d.ts.map +1 -1
  15. package/dist/src/auth.js +18 -12
  16. package/dist/src/auth.js.map +1 -1
  17. package/dist/src/build-project-prompt.d.ts +28 -0
  18. package/dist/src/build-project-prompt.d.ts.map +1 -0
  19. package/dist/src/build-project-prompt.js +86 -0
  20. package/dist/src/build-project-prompt.js.map +1 -0
  21. package/dist/src/channel-config.d.ts +256 -0
  22. package/dist/src/channel-config.d.ts.map +1 -0
  23. package/dist/src/channel-config.js +194 -0
  24. package/dist/src/channel-config.js.map +1 -0
  25. package/dist/src/channel-log.d.ts +17 -0
  26. package/dist/src/channel-log.d.ts.map +1 -0
  27. package/dist/src/channel-log.js +45 -0
  28. package/dist/src/channel-log.js.map +1 -0
  29. package/dist/src/channel.d.ts +4 -7
  30. package/dist/src/channel.d.ts.map +1 -1
  31. package/dist/src/channel.js +81 -603
  32. package/dist/src/channel.js.map +1 -1
  33. package/dist/src/connection.d.ts +45 -9
  34. package/dist/src/connection.d.ts.map +1 -1
  35. package/dist/src/connection.js +117 -5
  36. package/dist/src/connection.js.map +1 -1
  37. package/dist/src/dispatch-mentioned-reply.d.ts +25 -0
  38. package/dist/src/dispatch-mentioned-reply.d.ts.map +1 -0
  39. package/dist/src/dispatch-mentioned-reply.js +346 -0
  40. package/dist/src/dispatch-mentioned-reply.js.map +1 -0
  41. package/dist/src/gateway-session-queue.d.ts +26 -0
  42. package/dist/src/gateway-session-queue.d.ts.map +1 -0
  43. package/dist/src/gateway-session-queue.js +82 -0
  44. package/dist/src/gateway-session-queue.js.map +1 -0
  45. package/dist/src/group-history-tool.d.ts +11 -3
  46. package/dist/src/group-history-tool.d.ts.map +1 -1
  47. package/dist/src/group-history-tool.js +14 -10
  48. package/dist/src/group-history-tool.js.map +1 -1
  49. package/dist/src/inbound-display.d.ts +25 -0
  50. package/dist/src/inbound-display.d.ts.map +1 -0
  51. package/dist/src/inbound-display.js +100 -0
  52. package/dist/src/inbound-display.js.map +1 -0
  53. package/dist/src/project-path-normalize.d.ts +16 -0
  54. package/dist/src/project-path-normalize.d.ts.map +1 -0
  55. package/dist/src/project-path-normalize.js +75 -0
  56. package/dist/src/project-path-normalize.js.map +1 -0
  57. package/dist/src/resolve-inbound-group-prompt.d.ts +18 -0
  58. package/dist/src/resolve-inbound-group-prompt.d.ts.map +1 -0
  59. package/dist/src/resolve-inbound-group-prompt.js +38 -0
  60. package/dist/src/resolve-inbound-group-prompt.js.map +1 -0
  61. package/dist/src/resource-file.d.ts +17 -8
  62. package/dist/src/resource-file.d.ts.map +1 -1
  63. package/dist/src/resource-file.js +60 -21
  64. package/dist/src/resource-file.js.map +1 -1
  65. package/dist/src/send-group-message-tool.d.ts +3 -2
  66. package/dist/src/send-group-message-tool.d.ts.map +1 -1
  67. package/dist/src/send-group-message-tool.js +5 -4
  68. package/dist/src/send-group-message-tool.js.map +1 -1
  69. package/dist/src/send-service.d.ts +5 -1
  70. package/dist/src/send-service.d.ts.map +1 -1
  71. package/dist/src/send-service.js +6 -2
  72. package/dist/src/send-service.js.map +1 -1
  73. package/dist/src/sync-mapping-types.d.ts +170 -0
  74. package/dist/src/sync-mapping-types.d.ts.map +1 -0
  75. package/dist/src/sync-mapping-types.js +41 -0
  76. package/dist/src/sync-mapping-types.js.map +1 -0
  77. package/dist/src/sync-service-client.d.ts +27 -0
  78. package/dist/src/sync-service-client.d.ts.map +1 -0
  79. package/dist/src/sync-service-client.js +72 -0
  80. package/dist/src/sync-service-client.js.map +1 -0
  81. package/dist/src/types.d.ts +22 -0
  82. package/dist/src/types.d.ts.map +1 -1
  83. package/dist/src/types.js.map +1 -1
  84. package/package.json +1 -1
@@ -0,0 +1,346 @@
1
+ /**
2
+ * @ 触发的单轮回复:WebSocket START、OpenClaw dispatchReplyWithBufferedBlockDispatcher、HTTP deliver、END。
3
+ */
4
+ import { buildTargetReplyMeta } from "./inbound-display.js";
5
+ import { sendReplyDeliverBlock, sendTextMessage } from "./send-service.js";
6
+ /** WS `displayText` 过长封顶(避免网关/客户端溢出) */
7
+ const WS_DISPLAY_TEXT_MAX = 200;
8
+ /** 进度 `summary` 封顶(与网关约定一致) */
9
+ const WS_PROGRESS_SUMMARY_MAX = 200;
10
+ const TOOL_LABEL_ZH = {
11
+ exec: "命令执行",
12
+ read: "读取文件",
13
+ read_file: "读取文件",
14
+ write: "写入文件",
15
+ grep: "内容搜索",
16
+ glob_file_search: "文件搜索",
17
+ memory_search: "记忆检索",
18
+ sessions_list: "会话列表",
19
+ sessions_history: "会话历史",
20
+ xg_cwork_im_get_group_chat_history: "群聊历史",
21
+ };
22
+ function friendlyToolLabel(raw) {
23
+ const k = raw.trim();
24
+ if (!k)
25
+ return "工具";
26
+ return TOOL_LABEL_ZH[k] ?? k;
27
+ }
28
+ function clipWsDisplayText(text, max = WS_DISPLAY_TEXT_MAX) {
29
+ const t = text.trim();
30
+ if (!t)
31
+ return "";
32
+ if (t.length <= max)
33
+ return t;
34
+ return `${t.slice(0, Math.max(0, max - 1))}…`;
35
+ }
36
+ function clipWsProgressSummary(text, max = WS_PROGRESS_SUMMARY_MAX) {
37
+ const t = text.trim().replace(/\r\n/g, "\n").replace(/\n+/g, " ");
38
+ if (!t)
39
+ return "";
40
+ if (t.length <= max)
41
+ return t;
42
+ return `${t.slice(0, Math.max(0, max - 1))}…`;
43
+ }
44
+ function firstStringField(args, keys) {
45
+ for (const k of keys) {
46
+ const v = args[k];
47
+ if (typeof v === "string" && v.trim().length > 0)
48
+ return v.trim();
49
+ }
50
+ return undefined;
51
+ }
52
+ function buildToolStartSummary(toolRaw, args) {
53
+ if (!args || typeof args !== "object")
54
+ return undefined;
55
+ if (toolRaw === "exec") {
56
+ const cmd = typeof args.command === "string" ? args.command.replace(/\s+/g, " ").trim() : "";
57
+ const wdRaw = typeof args.workdir === "string" ? args.workdir.trim() : "";
58
+ const wd = wdRaw ? wdRaw.replace(/\\/g, "/") : "";
59
+ if (!cmd && !wd)
60
+ return undefined;
61
+ const head = cmd ? `run ${cmd}` : "run";
62
+ const line = wd ? `${head} (in ${wd})` : head;
63
+ return clipWsProgressSummary(line);
64
+ }
65
+ if (toolRaw === "read" || toolRaw === "read_file") {
66
+ const path = firstStringField(args, ["target_file", "path", "file_path"]);
67
+ if (path)
68
+ return clipWsProgressSummary(path.replace(/\\/g, "/"));
69
+ }
70
+ if (toolRaw.includes("get_group_chat_history")) {
71
+ const gid = firstStringField(args, ["groupId", "group_id"]);
72
+ const lim = typeof args.limit === "number" ? args.limit : undefined;
73
+ const bits = [];
74
+ if (gid)
75
+ bits.push(`group=${gid}`);
76
+ if (lim != null)
77
+ bits.push(`limit=${lim}`);
78
+ if (bits.length > 0)
79
+ return clipWsProgressSummary(bits.join(", "));
80
+ }
81
+ const hint = firstStringField(args, ["query", "prompt", "url", "command"]) ??
82
+ (typeof args.tool === "string" ? args.tool : undefined);
83
+ if (hint && toolRaw !== "exec")
84
+ return clipWsProgressSummary(hint.replace(/\\/g, "/"));
85
+ return undefined;
86
+ }
87
+ function toolResultOutputSummary(payload) {
88
+ const body = (payload.markdown ?? payload.text ?? "").trim();
89
+ if (!body)
90
+ return undefined;
91
+ return clipWsProgressSummary(body);
92
+ }
93
+ /** 流式 START → dispatch → 必发 END;首包超时走 HTTP 覆盖占位 */
94
+ export async function dispatchMentionedReply(args) {
95
+ const { rt, cfg, config, log, logPrefix, route, inboundCtx, params, currentIdentity, streamClient, agentWorkspaceDir } = args;
96
+ log.info(`${logPrefix} [dispatch] Dispatching to OpenClaw AI, sessionKey=${route.sessionKey}`);
97
+ let isFirstReply = true;
98
+ const dispatchStart = Date.now();
99
+ const { msgId: ackPlaceholderMsgId } = await streamClient.start({
100
+ groupId: params.groupId,
101
+ replyToMsgId: params.msgId,
102
+ });
103
+ const ackRawStr = ackPlaceholderMsgId == null ? "" : typeof ackPlaceholderMsgId === "string" ? ackPlaceholderMsgId : String(ackPlaceholderMsgId);
104
+ const streamMsgId = ackRawStr.trim();
105
+ log.info(`${logPrefix} [stream] START acknowledged placeholder rawLen=${ackRawStr.length} trimmedLen=${streamMsgId.length} ` +
106
+ `summary=${streamMsgId.length === 0 ? "(empty)" : streamMsgId.length <= 28 ? streamMsgId : `${streamMsgId.slice(0, 14)}…${streamMsgId.slice(-8)}(len=${streamMsgId.length})`}`);
107
+ if (!streamMsgId) {
108
+ log.warn(`${logPrefix} [stream] WARNING: START ack msgId empty after trim — HTTP cannot merge streaming placeholder; IM likely shows「AI未响应」plus a separate reply bubble`);
109
+ }
110
+ const replyAnchorId = params.msgId.trim();
111
+ const progressGroupId = params.groupId;
112
+ const toolNameStack = [];
113
+ const notifyStreamProgress = async (event, displayText, summary) => {
114
+ const msg = clipWsDisplayText(displayText);
115
+ const sum = summary?.trim() ? clipWsProgressSummary(summary) : undefined;
116
+ if (!progressGroupId.trim() || !replyAnchorId || !msg)
117
+ return;
118
+ try {
119
+ await streamClient.streamProgress({
120
+ groupId: progressGroupId,
121
+ replyToMsgId: replyAnchorId,
122
+ event,
123
+ displayText: msg,
124
+ ...(sum ? { summary: sum } : {}),
125
+ });
126
+ }
127
+ catch (e) {
128
+ log.warn(`${logPrefix} [stream] ${event} notify failed: ${String(e)}`);
129
+ }
130
+ };
131
+ let hasFirstReply = false;
132
+ const firstReplyTimeoutMs = config.firstReplyTimeoutMs ?? 30 * 60_000;
133
+ const timeoutLabel = `${logPrefix} [stream] First reply timeout after ${firstReplyTimeoutMs}ms, updating thinking message as error`;
134
+ const firstReplyTimeout = setTimeout(async () => {
135
+ if (hasFirstReply)
136
+ return;
137
+ log.warn(timeoutLabel);
138
+ try {
139
+ const reply = buildTargetReplyMeta(params);
140
+ const timeoutText = "当前请求处理超时,请稍后重试。";
141
+ await sendTextMessage(config, currentIdentity.token, params.groupId, timeoutText, [reply.targetUserId], log, streamMsgId, reply);
142
+ hasFirstReply = true;
143
+ log.info(`${logPrefix} [send] Timeout reply sent via HTTP: groupId=${params.groupId} msgId=${streamMsgId} text="${timeoutText}"`);
144
+ }
145
+ catch (err) {
146
+ log.error(`${logPrefix} [timeout] Failed to send timeout reply: ${String(err)}`);
147
+ }
148
+ }, firstReplyTimeoutMs);
149
+ let deliverInvokeCount = 0;
150
+ let deliverCallCount = 0;
151
+ let deliverSkippedCount = 0;
152
+ let dispatchError = undefined;
153
+ let lastDeliverError = undefined;
154
+ try {
155
+ await rt.channel.reply.dispatchReplyWithBufferedBlockDispatcher({
156
+ ctx: inboundCtx,
157
+ cfg,
158
+ replyOptions: {
159
+ sourceReplyDeliveryMode: "automatic",
160
+ suppressDefaultToolProgressMessages: true,
161
+ onToolStart: async (p) => {
162
+ const name = typeof p.name === "string" && p.name.trim().length > 0 ? p.name.trim() : "tool";
163
+ const rawPhase = typeof p.phase === "string" ? p.phase.toLowerCase() : "";
164
+ if (rawPhase === "update" || rawPhase === "delta" || rawPhase === "progress") {
165
+ return;
166
+ }
167
+ if (rawPhase === "end" || rawPhase === "fail" || rawPhase === "error") {
168
+ return;
169
+ }
170
+ if (!rawPhase || rawPhase === "start") {
171
+ toolNameStack.push(name);
172
+ }
173
+ const label = friendlyToolLabel(name);
174
+ const startSum = buildToolStartSummary(name, p.args);
175
+ await notifyStreamProgress("TOOL_PHASE", `正在调用「${label}」工具…`, startSum);
176
+ },
177
+ onToolResult: async (payload) => {
178
+ const toolName = toolNameStack.length > 0 ? toolNameStack.pop() : "tool";
179
+ const label = friendlyToolLabel(toolName);
180
+ const outSum = toolResultOutputSummary(payload);
181
+ if (payload.isError) {
182
+ await notifyStreamProgress("TOOL_PHASE", `「${label}」工具调用失败`, outSum);
183
+ }
184
+ else {
185
+ await notifyStreamProgress("TOOL_PHASE", `「${label}」工具已完成`, outSum);
186
+ }
187
+ },
188
+ onPlanUpdate: async (p) => {
189
+ const title = typeof p.title === "string" ? p.title.trim() : "";
190
+ if (title.length > 0) {
191
+ await notifyStreamProgress("PLAN_UPDATE", clipWsDisplayText(`正在更新计划:${title}`, 160), typeof p.explanation === "string" && p.explanation.trim()
192
+ ? clipWsProgressSummary(p.explanation.trim())
193
+ : undefined);
194
+ }
195
+ else if (typeof p.explanation === "string" && p.explanation.trim().length > 0) {
196
+ await notifyStreamProgress("PLAN_UPDATE", clipWsDisplayText(`计划更新:${p.explanation.trim()}`, 160));
197
+ }
198
+ else {
199
+ await notifyStreamProgress("PLAN_UPDATE", "正在更新执行计划…");
200
+ }
201
+ },
202
+ onCompactionStart: async () => {
203
+ await notifyStreamProgress("RUN_EVENT", "正在整理上下文…");
204
+ },
205
+ onCompactionEnd: async () => {
206
+ await notifyStreamProgress("RUN_EVENT", "上下文整理完成");
207
+ },
208
+ onApprovalEvent: async (p) => {
209
+ const raw = typeof p.title === "string" && p.title.trim().length > 0
210
+ ? p.title.trim()
211
+ : typeof p.message === "string" && p.message.trim().length > 0
212
+ ? p.message.trim()
213
+ : "审批状态更新";
214
+ await notifyStreamProgress("RUN_EVENT", clipWsDisplayText(raw, 160));
215
+ },
216
+ onCommandOutput: async (p) => {
217
+ const ph = typeof p.phase === "string" ? p.phase.toLowerCase() : "";
218
+ if (ph === "delta" || ph === "stream" || ph === "progress")
219
+ return;
220
+ const st = typeof p.status === "string" ? p.status.toLowerCase() : "";
221
+ const terminalPhase = ["completed", "complete", "done", "end", "failed", "fail", "error"].includes(ph);
222
+ const terminalStatus = ["completed", "failed", "error", "done"].includes(st);
223
+ const hasExit = p.exitCode != null;
224
+ if (!terminalPhase && !terminalStatus && !hasExit)
225
+ return;
226
+ const outRaw = typeof p.output === "string" ? p.output.trim() : "";
227
+ const outSum = outRaw ? clipWsProgressSummary(outRaw) : undefined;
228
+ if (ph === "failed" || ph === "fail" || ph === "error" || st === "failed" || st === "error") {
229
+ await notifyStreamProgress("RUN_EVENT", "命令执行失败", outSum);
230
+ return;
231
+ }
232
+ if (hasExit && p.exitCode !== 0) {
233
+ await notifyStreamProgress("RUN_EVENT", `命令已结束(退出码 ${p.exitCode})`, outSum);
234
+ return;
235
+ }
236
+ await notifyStreamProgress("RUN_EVENT", "命令已执行完毕", outSum);
237
+ },
238
+ onPatchSummary: async (_p) => {
239
+ await notifyStreamProgress("RUN_EVENT", "已记录文件变更摘要");
240
+ },
241
+ },
242
+ dispatcherOptions: {
243
+ responsePrefix: "",
244
+ onSkip: (payload, meta) => {
245
+ deliverSkippedCount++;
246
+ log.info(`${logPrefix} [deliver] Payload skipped by normalizer kind=${meta.kind} reason=${meta.reason}`);
247
+ },
248
+ onError: (err, meta) => {
249
+ lastDeliverError = err;
250
+ log.error(`${logPrefix} [deliver] Dispatcher caught unhandled error kind=${meta.kind}: ${String(err)}`);
251
+ },
252
+ deliver: async (payload) => {
253
+ try {
254
+ deliverInvokeCount++;
255
+ const textPart = (payload.markdown || payload.text || "").trim();
256
+ const hasMedia = Boolean(payload.mediaUrl?.trim()) ||
257
+ Boolean(payload.mediaUrls?.some((u) => typeof u === "string" && u.trim()));
258
+ const textPreview = textPart.length > 120 ? `${textPart.slice(0, 120)}…(len=${textPart.length})` : textPart;
259
+ log.info(`${logPrefix} [deliver] invoke #${deliverInvokeCount} isThinking=${payload.isThinking ?? false} ` +
260
+ `textLen=${textPart.length} hasMedia=${hasMedia} mediaUrl=${Boolean(payload.mediaUrl?.trim())} ` +
261
+ `preview=${JSON.stringify(textPreview || "(empty)")}`);
262
+ if (!textPart && !(hasMedia && !payload.isThinking)) {
263
+ log.info(`${logPrefix} [deliver] Payload has no sendable content, skipping` +
264
+ ` (isThinking=${payload.isThinking ?? false} hasMedia=${hasMedia})`);
265
+ return;
266
+ }
267
+ deliverCallCount++;
268
+ if (isFirstReply) {
269
+ const ttfr = Date.now() - dispatchStart;
270
+ log.info(`${logPrefix} [deliver] First response block received from AI (TTFB: ${ttfr}ms)`);
271
+ isFirstReply = false;
272
+ }
273
+ const reply = buildTargetReplyMeta(params);
274
+ const atIds = [reply.targetUserId];
275
+ if (!hasFirstReply) {
276
+ clearTimeout(firstReplyTimeout);
277
+ log.info(`${logPrefix} [deliver] First HTTP will merge streaming placeholder msgId=${streamMsgId.length > 0 ? `yes(len=${streamMsgId.length})` : "NO(empty)"}`);
278
+ await sendReplyDeliverBlock(config, currentIdentity.token, params.groupId, payload, atIds, log, streamMsgId, reply, agentWorkspaceDir);
279
+ hasFirstReply = true;
280
+ const preview = textPart.length > 80 ? `${textPart.slice(0, 80)}...` : textPart || "[media]";
281
+ log.info(`${logPrefix} [send] First reply sent via HTTP: groupId=${params.groupId} msgId=${streamMsgId} preview="${preview}"`);
282
+ return;
283
+ }
284
+ await sendReplyDeliverBlock(config, currentIdentity.token, params.groupId, payload, atIds, log, undefined, reply, agentWorkspaceDir);
285
+ const preview = textPart.length > 80 ? `${textPart.slice(0, 80)}...` : textPart || "[media]";
286
+ log.info(`${logPrefix} [send] Additional reply sent via HTTP: groupId=${params.groupId} preview="${preview}"`);
287
+ }
288
+ catch (err) {
289
+ log.error(`${logPrefix} [deliver] Reply deliver failed: ${String(err)}`);
290
+ throw err;
291
+ }
292
+ },
293
+ },
294
+ });
295
+ log.info(`${logPrefix} [dispatch] Dispatch completed for sessionKey=${route.sessionKey}` +
296
+ ` (invoke=${deliverInvokeCount} delivered=${deliverCallCount} skipped=${deliverSkippedCount})`);
297
+ if (deliverInvokeCount === 0) {
298
+ log.warn(`${logPrefix} [dispatch] OpenClaw never invoked channel deliver() for this turn — ` +
299
+ `this plugin will not POST /im/message/send; IM「收到消息」若存在,多半来自占位/END 或其它通道,而非本插件 HTTP 合并`);
300
+ }
301
+ else if (deliverCallCount === 0) {
302
+ log.warn(`${logPrefix} [dispatch] deliver() invoked ${deliverInvokeCount} time(s) but none had sendable text/media — ` +
303
+ `check model output (thinking-only / empty blocks) or OpenClaw normalizer`);
304
+ }
305
+ }
306
+ catch (dispatchErr) {
307
+ dispatchError = dispatchErr;
308
+ log.error(`${logPrefix} [dispatch] Dispatch failed (invoke=${deliverInvokeCount} delivered=${deliverCallCount} skipped=${deliverSkippedCount}): ${String(dispatchErr)}`);
309
+ }
310
+ finally {
311
+ clearTimeout(firstReplyTimeout);
312
+ if (!hasFirstReply) {
313
+ const reportableError = dispatchError ?? lastDeliverError;
314
+ if (reportableError !== undefined) {
315
+ const errSource = dispatchError !== undefined ? "dispatch" : "deliver";
316
+ log.warn(`${logPrefix} [dispatch] ${errSource} error with no prior reply` +
317
+ ` (invoke=${deliverInvokeCount} delivered=${deliverCallCount} skipped=${deliverSkippedCount}), sending error notice`);
318
+ const replyMeta = buildTargetReplyMeta(params);
319
+ try {
320
+ await sendTextMessage(config, currentIdentity.token, params.groupId, `当前请求处理时出现异常,请稍后重试。\n错误信息:${String(reportableError)}`, [replyMeta.targetUserId], log, streamMsgId, replyMeta);
321
+ hasFirstReply = true;
322
+ }
323
+ catch (fallbackErr) {
324
+ log.error(`${logPrefix} [dispatch] Failed to send error notice (${errSource} error): ${String(fallbackErr)}`);
325
+ }
326
+ }
327
+ else {
328
+ log.warn(`${logPrefix} [dispatch] No reply was sent to user` +
329
+ ` (invoke=${deliverInvokeCount} delivered=${deliverCallCount} skipped=${deliverSkippedCount}), ending with reason=no_reply` +
330
+ (deliverInvokeCount === 0 ? " — plugin did not run POST /im/message/send this turn" : ""));
331
+ }
332
+ }
333
+ const endReason = hasFirstReply ? "stop" : "no_reply";
334
+ try {
335
+ await streamClient.end(streamMsgId, endReason, {
336
+ groupId: params.groupId,
337
+ replyToMsgId: params.msgId,
338
+ });
339
+ log.info(`${logPrefix} [stream] END sent: msgId=${streamMsgId} reason=${endReason}`);
340
+ }
341
+ catch (endErr) {
342
+ log.error(`${logPrefix} [stream] END failed (msgId=${streamMsgId}): ${String(endErr)}`);
343
+ }
344
+ }
345
+ }
346
+ //# sourceMappingURL=dispatch-mentioned-reply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-mentioned-reply.js","sourceRoot":"","sources":["../../src/dispatch-mentioned-reply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 网关内:按 sessionKey 串行派发 + FIFO 排队 + /stop 清队列与租约。
3
+ */
4
+ import type { OpenClawConfig } from "openclaw/plugin-sdk";
5
+ import type { Logger } from "./channel-log.js";
6
+ import type { ImStreamClient } from "./connection.js";
7
+ import type { BotIdentity, WsMessageParams, XgImConfig } from "./types.js";
8
+ export interface PendingDispatch {
9
+ route: {
10
+ sessionKey: string;
11
+ };
12
+ inboundCtx: unknown;
13
+ params: WsMessageParams;
14
+ currentIdentity: BotIdentity;
15
+ agentWorkspaceDir?: string;
16
+ /** /stop:立即交给 OpenClaw;并作废当前会话占用、清空排队 */
17
+ skipSessionQueue?: boolean;
18
+ }
19
+ export declare function createRunWithSessionQueue(options: {
20
+ config: XgImConfig;
21
+ log: Logger;
22
+ logPrefix: string;
23
+ rt: any;
24
+ cfg: OpenClawConfig;
25
+ }): (sessionKey: string, pending: PendingDispatch, streamClient: ImStreamClient) => Promise<void>;
26
+ //# sourceMappingURL=gateway-session-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-session-queue.d.ts","sourceRoot":"","sources":["../../src/gateway-session-queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,eAAe,EAAE,WAAW,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IAC/C,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,GAAG,CAAC;IACR,GAAG,EAAE,cAAc,CAAC;CACvB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAyGhG"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * 网关内:按 sessionKey 串行派发 + FIFO 排队 + /stop 清队列与租约。
3
+ */
4
+ import { dispatchMentionedReply } from "./dispatch-mentioned-reply.js";
5
+ import { sendTextMessage } from "./send-service.js";
6
+ export function createRunWithSessionQueue(options) {
7
+ const { config, log, logPrefix, rt, cfg } = options;
8
+ const sessionBusyLease = new Map();
9
+ const sessionQueues = new Map();
10
+ const maxPendingMsgs = config.maxPendingMessages ?? 5;
11
+ const runWithSessionQueue = async (sessionKey, pending, streamClient) => {
12
+ if (!pending.skipSessionQueue && sessionBusyLease.has(sessionKey)) {
13
+ const queue = sessionQueues.get(sessionKey) ?? [];
14
+ if (maxPendingMsgs === 0 || queue.length >= maxPendingMsgs) {
15
+ const reason = maxPendingMsgs === 0
16
+ ? "当前不支持任务排队,请等待处理完成后再发送。"
17
+ : `当前任务队列已满(最多 ${maxPendingMsgs} 条),请等待处理完成后再重新发送。`;
18
+ log.warn(`${logPrefix} [queue] Session ${sessionKey} busy & queue full/disabled (max=${maxPendingMsgs}), dropping`);
19
+ sendTextMessage(config, pending.currentIdentity.token, pending.params.groupId, reason, [pending.params.userInfo?.id ?? ""], log).catch((notifyErr) => {
20
+ log.error(`${logPrefix} [queue] Failed to send queue-full notice: ${String(notifyErr)}`);
21
+ });
22
+ return;
23
+ }
24
+ const queuePos = queue.length + 1;
25
+ queue.push(pending);
26
+ sessionQueues.set(sessionKey, queue);
27
+ log.info(`${logPrefix} [queue] Session ${sessionKey} busy, queued message (pos=${queuePos})`);
28
+ sendTextMessage(config, pending.currentIdentity.token, pending.params.groupId, `收到,当前正在处理其他任务,您的消息已排队(队列第 ${queuePos} 位),处理完成后将自动回复。`, [pending.params.userInfo?.id ?? ""], log).catch((notifyErr) => {
29
+ log.warn(`${logPrefix} [queue] Failed to send queue notification: ${String(notifyErr)}`);
30
+ });
31
+ return;
32
+ }
33
+ if (pending.skipSessionQueue) {
34
+ const hadLease = sessionBusyLease.has(sessionKey);
35
+ if (hadLease) {
36
+ sessionBusyLease.delete(sessionKey);
37
+ const dropped = sessionQueues.get(sessionKey)?.length ?? 0;
38
+ sessionQueues.delete(sessionKey);
39
+ log.info(`${logPrefix} [queue] /stop: invalidated busy lease, cleared fifo (droppedQueued=${dropped})`);
40
+ }
41
+ }
42
+ let myLease;
43
+ if (!pending.skipSessionQueue) {
44
+ myLease = Symbol("xg_cwork_im-session-busy");
45
+ sessionBusyLease.set(sessionKey, myLease);
46
+ }
47
+ try {
48
+ await dispatchMentionedReply({
49
+ rt,
50
+ cfg,
51
+ config,
52
+ log,
53
+ logPrefix,
54
+ route: pending.route,
55
+ inboundCtx: pending.inboundCtx,
56
+ params: pending.params,
57
+ currentIdentity: pending.currentIdentity,
58
+ streamClient,
59
+ agentWorkspaceDir: pending.agentWorkspaceDir,
60
+ });
61
+ }
62
+ finally {
63
+ if (!pending.skipSessionQueue && myLease !== undefined) {
64
+ if (sessionBusyLease.get(sessionKey) === myLease) {
65
+ sessionBusyLease.delete(sessionKey);
66
+ const queue = sessionQueues.get(sessionKey);
67
+ if (queue && queue.length > 0) {
68
+ const next = queue.shift();
69
+ if (queue.length === 0)
70
+ sessionQueues.delete(sessionKey);
71
+ log.info(`${logPrefix} [queue] Dispatching next queued message for session ${sessionKey} (remaining=${queue.length})`);
72
+ runWithSessionQueue(sessionKey, next, streamClient).catch((err) => {
73
+ log.error(`${logPrefix} [queue] Error processing queued dispatch: ${String(err)}`);
74
+ });
75
+ }
76
+ }
77
+ }
78
+ }
79
+ };
80
+ return runWithSessionQueue;
81
+ }
82
+ //# sourceMappingURL=gateway-session-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-session-queue.js","sourceRoot":"","sources":["../../src/gateway-session-queue.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,13 @@
6
6
  */
7
7
  import type { AnyAgentTool } from "openclaw/plugin-sdk";
8
8
  import type { XgImConfig } from "./types.js";
9
+ /** 由 OpenClaw 在每回合注入的信任上下文节选(工厂模式下传入 execute 闭包) */
10
+ export type XgImToolSessionHints = {
11
+ /** 对应 channels.xg_cwork_im.accounts 的 key */
12
+ channelAccountId?: string;
13
+ /** 当前 IM 发消息用户 userId */
14
+ requesterSenderId?: string;
15
+ };
9
16
  /** 从 OpenClaw 配置中提取 xg_cwork_im 顶层配置(保留 accounts 以便多账户路由) */
10
17
  export declare function extractXgCworkImConfig(cfg: unknown): XgImConfig | null;
11
18
  /**
@@ -16,8 +23,9 @@ export declare function extractXgCworkImConfig(cfg: unknown): XgImConfig | null;
16
23
  */
17
24
  export declare function resolveAccountConfig(base: XgImConfig, accountId?: string | null): XgImConfig;
18
25
  /**
19
- * 构建群聊历史工具对象(使用注册时已知的 config,绕开 factory 工厂模式的命名限制)。
20
- * index.ts 在 register() 里调用,并将构建好的工具对象静态地传给 api.registerTool(tool)
26
+ * 构建群聊历史工具对象。
27
+ * 应通过 `api.registerTool((ctx) => buildGroupHistoryTool(...))` 工厂注册,以便每回合合并
28
+ * `runtimeConfig` 与 `agentAccountId` / `requesterSenderId`(静态 `(_ctx) => tool` 会丢弃上述上下文)。
21
29
  */
22
- export declare function buildGroupHistoryTool(config: XgImConfig): AnyAgentTool;
30
+ export declare function buildGroupHistoryTool(config: XgImConfig, hints?: XgImToolSessionHints): AnyAgentTool;
23
31
  //# sourceMappingURL=group-history-tool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"group-history-tool.d.ts","sourceRoot":"","sources":["../../src/group-history-tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,KAAK,EAAgC,UAAU,EAAE,MAAM,YAAY,CAAC;AA+B3E,6DAA6D;AAC7D,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAItE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,CAgB5F;AAuCD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CAwFtE"}
1
+ {"version":3,"file":"group-history-tool.d.ts","sourceRoot":"","sources":["../../src/group-history-tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,OAAO,KAAK,EAAgC,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3E,oDAAoD;AACpD,MAAM,MAAM,oBAAoB,GAAG;IAC/B,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAgCF,6DAA6D;AAC7D,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAItE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,CAgB5F;AAuCD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,oBAAoB,GAAG,YAAY,CA4FpG"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import axios from "axios";
8
8
  import { Type } from "@sinclair/typebox";
9
+ import { normalizeRobotKey } from "./channel-config.js";
9
10
  import { toolJsonResult } from "./tool-json-result.js";
10
11
  import { getToken } from "./auth.js";
11
12
  // ─── 工具参数 Schema ─────────────────────────────────────────────────────────
@@ -14,10 +15,10 @@ const GroupHistoryParams = Type.Object({
14
15
  description: "群聊 ID,即当前消息来自的群组唯一标识符",
15
16
  }),
16
17
  userId: Type.Optional(Type.String({
17
- description: "(可选)以哪个用户身份拉取历史消息的 userId,普通对话场景建议传当前发消息用户 ID;若为空则按后台默认身份查询",
18
+ description: "(可选)以哪个用户身份拉取历史消息的 userId;若省略则使用当前会话的发送者 ID(由网关从入站上下文注入)。",
18
19
  })),
19
20
  accountId: Type.Optional(Type.String({
20
- description: "(可选)要使用的 xg_cwork_im 账户 ID(即 accounts 的 key,例如 main/orchestrator)。",
21
+ description: "(可选)要使用的 xg_cwork_im 账户 ID(即 accounts 的 key);若省略则使用当前 IM 通道绑定的账户(由网关注入)。",
21
22
  })),
22
23
  limit: Type.Optional(Type.Number({
23
24
  description: "需要获取的消息条数(5~30),默认 10",
@@ -32,7 +33,7 @@ export function extractXgCworkImConfig(cfg) {
32
33
  const raw = cfg?.channels?.xg_cwork_im;
33
34
  if (!raw?.baseUrl)
34
35
  return null;
35
- return raw;
36
+ return normalizeRobotKey(raw);
36
37
  }
37
38
  /**
38
39
  * 根据 accountId 解析具体账号配置。
@@ -50,11 +51,11 @@ export function resolveAccountConfig(base, accountId) {
50
51
  if (accountId && accountId !== "default") {
51
52
  const hit = map[accountId];
52
53
  if (hit)
53
- return { ...base, ...(defaults ?? {}), ...hit };
54
+ return normalizeRobotKey({ ...base, ...(defaults ?? {}), ...hit });
54
55
  }
55
56
  const firstKey = Object.keys(map).find((k) => k !== "default");
56
57
  const first = firstKey ? map[firstKey] : undefined;
57
- return first ? { ...base, ...(defaults ?? {}), ...first } : base;
58
+ return normalizeRobotKey(first ? { ...base, ...(defaults ?? {}), ...first } : base);
58
59
  }
59
60
  /** 调用 IM 接口拉取群聊最近 N 条消息 */
60
61
  async function fetchGroupHistory(config, token, groupId, limit, userId) {
@@ -79,10 +80,11 @@ async function fetchGroupHistory(config, token, groupId, limit, userId) {
79
80
  }
80
81
  // ─── 工具构建函数(直接传 config,而非 factory 模式)──────────────────────────
81
82
  /**
82
- * 构建群聊历史工具对象(使用注册时已知的 config,绕开 factory 工厂模式的命名限制)。
83
- * index.ts 在 register() 里调用,并将构建好的工具对象静态地传给 api.registerTool(tool)
83
+ * 构建群聊历史工具对象。
84
+ * 应通过 `api.registerTool((ctx) => buildGroupHistoryTool(...))` 工厂注册,以便每回合合并
85
+ * `runtimeConfig` 与 `agentAccountId` / `requesterSenderId`(静态 `(_ctx) => tool` 会丢弃上述上下文)。
84
86
  */
85
- export function buildGroupHistoryTool(config) {
87
+ export function buildGroupHistoryTool(config, hints) {
86
88
  return {
87
89
  name: "xg_cwork_im_get_group_chat_history",
88
90
  label: "【xg_cwork_im】获取群聊历史记录",
@@ -102,8 +104,10 @@ export function buildGroupHistoryTool(config) {
102
104
  parameters: GroupHistoryParams,
103
105
  async execute(_toolCallId, params) {
104
106
  const limit = params.limit ?? 10;
105
- const { groupId, accountId, userId } = params;
106
- console.log(`[cwork_im][tool] xg_cwork_im_get_group_chat_history called: groupId=${groupId} limit=${limit}`);
107
+ const { groupId } = params;
108
+ const accountId = params.accountId ?? hints?.channelAccountId;
109
+ const userId = params.userId ?? hints?.requesterSenderId;
110
+ console.log(`[cwork_im][tool] xg_cwork_im_get_group_chat_history called: groupId=${groupId} limit=${limit} accountId=${accountId ?? "(session)"} userId=${userId ?? "(default)"}`);
107
111
  let identity;
108
112
  try {
109
113
  const accountConfig = resolveAccountConfig(config, accountId);
@@ -1 +1 @@
1
- {"version":3,"file":"group-history-tool.js","sourceRoot":"","sources":["../../src/group-history-tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,4EAA4E;AAE5E,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC;IACnC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;QACjB,WAAW,EAAE,uBAAuB;KACvC,CAAC;IACF,MAAM,EAAE,IAAI,CAAC,QAAQ,CACjB,IAAI,CAAC,MAAM,CAAC;QACR,WAAW,EAAE,6DAA6D;KAC7E,CAAC,CACL;IACD,SAAS,EAAE,IAAI,CAAC,QAAQ,CACpB,IAAI,CAAC,MAAM,CAAC;QACR,WAAW,EACP,oEAAoE;KAC3E,CAAC,CACL;IACD,KAAK,EAAE,IAAI,CAAC,QAAQ,CAChB,IAAI,CAAC,MAAM,CAAC;QACR,WAAW,EAAE,uBAAuB;QACpC,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;KACd,CAAC,CACL;CACJ,CAAC,CAAC;AAEH,4EAA4E;AAE5E,6DAA6D;AAC7D,MAAM,UAAU,sBAAsB,CAAC,GAAY;IAC/C,MAAM,GAAG,GAAI,GAA+C,EAAE,QAAQ,EAAE,WAAqC,CAAC;IAC9G,IAAI,CAAC,GAAG,EAAE,OAAO;QAAE,OAAO,IAAI,CAAC;IAC/B,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAgB,EAAE,SAAyB;IAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,QAAkD,CAAC;IAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9D,IAAI,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3B,IAAI,GAAG;YAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC;IAC7D,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC;AAED,2BAA2B;AAC3B,KAAK,UAAU,iBAAiB,CAC5B,MAAkB,EAClB,KAAa,EACb,OAAe,EACf,KAAa,EACb,MAAe;IAEf,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,mCAAmC,CAAC;IAEjE,MAAM,MAAM,GAA4B;QACpC,OAAO;QACP,QAAQ,EAAE,KAAK;KAClB,CAAC;IACF,IAAI,MAAM,EAAE,CAAC;QACT,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAC3B,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAIxB,GAAG,EAAE;QACJ,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE;QAClC,OAAO,EAAE,KAAK;KACjB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClF,OAAO,EAAE,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,iEAAiE;AAEjE;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAkB;IACpD,OAAO;QACH,IAAI,EAAE,oCAAoC;QAC1C,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE;YACT,mDAAmD;YACnD,EAAE;YACF,+BAA+B;YAC/B,wDAAwD;YACxD,iDAAiD;YACjD,mBAAmB;YACnB,EAAE;YACF,kCAAkC;YAClC,iGAAiG;YACjG,EAAE;YACF,uCAAuC;SAC1C,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,UAAU,EAAE,kBAAkB;QAC9B,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,MAAyC;YACxE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YACjC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;YAE9C,OAAO,CAAC,GAAG,CAAC,uEAAuE,OAAO,UAAU,KAAK,EAAE,CAAC,CAAC;YAE7G,IAAI,QAAqB,CAAC;YAC1B,IAAI,CAAC;gBACD,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC9D,QAAQ,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,8CAA8C,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACjF,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACpB,OAAO,cAAc,CAAC;oBAClB,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,kCAAkC,MAAM,CAAC,GAAG,CAAC,EAAE;oBACtD,QAAQ,EAAE,EAAE;iBACf,CAAC,CAAC;YACP,CAAC;YAED,IAAI,QAA2B,CAAC;YAChC,IAAI,CAAC;gBACD,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC9D,QAAQ,GAAG,MAAM,iBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC1F,OAAO,CAAC,GAAG,CACP,4BAA4B,QAAQ,CAAC,MAAM,wBAAwB,OAAO,oBAAoB,SAAS,IAAI,GAAG,WAAW,MAAM,IAAI,KAAK,EAAE,CAC7I,CAAC;YACN,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACpB,OAAO,cAAc,CAAC;oBAClB,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,kCAAkC,MAAM,CAAC,GAAG,CAAC,EAAE;oBACtD,QAAQ,EAAE,EAAE;iBACf,CAAC,CAAC;YACP,CAAC;YAED,oBAAoB;YACpB,MAAM,SAAS,GAAG,QAAQ;iBACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBACV,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC;gBAC7B,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,CAAC;YACxC,CAAC,CAAC;iBACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACP,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;gBACtC,MAAM,UAAU,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,IAAI,QAAQ,IAAI,MAAM,CAAC;gBAC1D,MAAM,KAAK,GAAG,QAAQ,KAAK,QAAQ,CAAC,MAAM,CAAC;gBAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;gBAC7C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;gBACzE,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;gBACvB,MAAM,IAAI,GACN,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM;oBACjC,CAAC,CAAC;wBACE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE;wBACd,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,KAAK;6BAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;6BAC9C,IAAI,CAAC,GAAG,CAAC,GAAG;qBACpB;yBACI,MAAM,CAAC,OAAO,CAAC;yBACf,IAAI,CAAC,GAAG,CAAC;oBACd,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC1B,OAAO,IAAI,IAAI,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC;YAC1C,CAAC,CAAC,CAAC;YAEP,OAAO,cAAc,CAAC;gBAClB,EAAE,EAAE,IAAI;gBACR,OAAO;gBACP,KAAK,EAAE,SAAS,CAAC,MAAM;gBACvB,QAAQ,EAAE,SAAS;aACtB,CAAC,CAAC;QACP,CAAC;KACJ,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"group-history-tool.js","sourceRoot":"","sources":["../../src/group-history-tool.ts"],"names":[],"mappings":"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"}