@tencent-weixin/openclaw-weixin 2.3.1 → 2.4.2

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 (102) hide show
  1. package/dist/index.js +16 -0
  2. package/dist/index.js.map +1 -0
  3. package/dist/src/api/api.js +374 -0
  4. package/dist/src/api/api.js.map +1 -0
  5. package/dist/src/api/config-cache.js +64 -0
  6. package/dist/src/api/config-cache.js.map +1 -0
  7. package/dist/src/api/session-guard.js +49 -0
  8. package/dist/src/api/session-guard.js.map +1 -0
  9. package/dist/src/api/types.js +35 -0
  10. package/dist/src/api/types.js.map +1 -0
  11. package/dist/src/auth/accounts.js +326 -0
  12. package/dist/src/auth/accounts.js.map +1 -0
  13. package/dist/src/auth/login-qr.js +332 -0
  14. package/dist/src/auth/login-qr.js.map +1 -0
  15. package/dist/src/auth/pairing.js +104 -0
  16. package/dist/src/auth/pairing.js.map +1 -0
  17. package/dist/src/cdn/aes-ecb.js +19 -0
  18. package/dist/src/cdn/aes-ecb.js.map +1 -0
  19. package/dist/src/cdn/cdn-upload.js +73 -0
  20. package/dist/src/cdn/cdn-upload.js.map +1 -0
  21. package/dist/src/cdn/cdn-url.js +14 -0
  22. package/dist/src/cdn/cdn-url.js.map +1 -0
  23. package/dist/src/cdn/pic-decrypt.js +89 -0
  24. package/dist/src/cdn/pic-decrypt.js.map +1 -0
  25. package/dist/src/cdn/upload.js +106 -0
  26. package/dist/src/cdn/upload.js.map +1 -0
  27. package/dist/src/channel.js +460 -0
  28. package/dist/src/channel.js.map +1 -0
  29. package/dist/src/compat.js +67 -0
  30. package/dist/src/compat.js.map +1 -0
  31. package/dist/src/config/config-schema.js +19 -0
  32. package/dist/src/config/config-schema.js.map +1 -0
  33. package/dist/src/media/media-download.js +95 -0
  34. package/dist/src/media/media-download.js.map +1 -0
  35. package/dist/src/media/mime.js +73 -0
  36. package/dist/src/media/mime.js.map +1 -0
  37. package/dist/src/media/silk-transcode.js +64 -0
  38. package/dist/src/media/silk-transcode.js.map +1 -0
  39. package/dist/src/media/voice-outbound.js +177 -0
  40. package/dist/src/media/voice-outbound.js.map +1 -0
  41. package/dist/src/messaging/abort-fence.js +70 -0
  42. package/dist/src/messaging/abort-fence.js.map +1 -0
  43. package/dist/src/messaging/buttons.js +117 -0
  44. package/dist/src/messaging/buttons.js.map +1 -0
  45. package/dist/src/messaging/debug-mode.js +63 -0
  46. package/dist/src/messaging/debug-mode.js.map +1 -0
  47. package/dist/src/messaging/error-notice.js +24 -0
  48. package/dist/src/messaging/error-notice.js.map +1 -0
  49. package/dist/src/messaging/inbound.js +201 -0
  50. package/dist/src/messaging/inbound.js.map +1 -0
  51. package/dist/src/messaging/lane-key.js +66 -0
  52. package/dist/src/messaging/lane-key.js.map +1 -0
  53. package/dist/src/messaging/markdown-filter.js +368 -0
  54. package/dist/src/messaging/markdown-filter.js.map +1 -0
  55. package/dist/src/messaging/merged-record.js +149 -0
  56. package/dist/src/messaging/merged-record.js.map +1 -0
  57. package/dist/src/messaging/model-buttons.js +182 -0
  58. package/dist/src/messaging/model-buttons.js.map +1 -0
  59. package/dist/src/messaging/model-callback-handler.js +133 -0
  60. package/dist/src/messaging/model-callback-handler.js.map +1 -0
  61. package/dist/src/messaging/outbound-hooks.js +56 -0
  62. package/dist/src/messaging/outbound-hooks.js.map +1 -0
  63. package/dist/src/messaging/process-message.js +381 -0
  64. package/dist/src/messaging/process-message.js.map +1 -0
  65. package/dist/src/messaging/send-media.js +54 -0
  66. package/dist/src/messaging/send-media.js.map +1 -0
  67. package/dist/src/messaging/send.js +182 -0
  68. package/dist/src/messaging/send.js.map +1 -0
  69. package/dist/src/messaging/slash-commands.js +70 -0
  70. package/dist/src/messaging/slash-commands.js.map +1 -0
  71. package/dist/src/monitor/lane-scheduler.js +46 -0
  72. package/dist/src/monitor/lane-scheduler.js.map +1 -0
  73. package/dist/src/monitor/monitor.js +143 -0
  74. package/dist/src/monitor/monitor.js.map +1 -0
  75. package/dist/src/runtime.js +54 -0
  76. package/dist/src/runtime.js.map +1 -0
  77. package/dist/src/storage/state-dir.js +9 -0
  78. package/dist/src/storage/state-dir.js.map +1 -0
  79. package/dist/src/storage/sync-buf.js +64 -0
  80. package/dist/src/storage/sync-buf.js.map +1 -0
  81. package/dist/src/streaming/stream-pipeline.js +431 -0
  82. package/dist/src/streaming/stream-pipeline.js.map +1 -0
  83. package/dist/src/streaming/stream-session.js +260 -0
  84. package/dist/src/streaming/stream-session.js.map +1 -0
  85. package/dist/src/streaming/stream.js +239 -0
  86. package/dist/src/streaming/stream.js.map +1 -0
  87. package/dist/src/util/logger.js +120 -0
  88. package/dist/src/util/logger.js.map +1 -0
  89. package/dist/src/util/markdown-fences.js +54 -0
  90. package/dist/src/util/markdown-fences.js.map +1 -0
  91. package/dist/src/util/random.js +16 -0
  92. package/dist/src/util/random.js.map +1 -0
  93. package/dist/src/util/redact.js +54 -0
  94. package/dist/src/util/redact.js.map +1 -0
  95. package/index.ts +0 -5
  96. package/openclaw.plugin.json +11 -1
  97. package/package.json +9 -2
  98. package/src/api/api.ts +2 -3
  99. package/src/auth/accounts.ts +0 -1
  100. package/src/channel.ts +13 -1
  101. package/src/monitor/monitor.ts +11 -10
  102. package/src/runtime.ts +0 -70
@@ -0,0 +1,368 @@
1
+ /**
2
+ * Streaming markdown filter — character-level state machine that strips
3
+ * unsupported markdown syntax on-the-fly.
4
+ *
5
+ * Outputs as much filtered text as possible on each `feed()` call, only
6
+ * holding back the minimum characters needed for pattern disambiguation
7
+ * (e.g. a trailing `*` that might become `***`).
8
+ *
9
+ * Constructs passed through (not filtered):
10
+ * - Code fences (```)
11
+ * - Inline code (`)
12
+ * - Tables (|...|)
13
+ * - Horizontal rules (---, ***, ___)
14
+ * - Bold (**)
15
+ * - Italic/bold-italic wrapping non-CJK content
16
+ *
17
+ * Constructs filtered (markers stripped, content kept):
18
+ * - Italic/bold-italic wrapping CJK content
19
+ * - Headings H5/H6 (#####, ######)
20
+ * - Images (![alt](url)) — removed entirely
21
+ *
22
+ * States:
23
+ * - **sol** (start-of-line): checks for line-start patterns (```, >, #####, indent)
24
+ * - **body**: scans for inline patterns (![, ~~, ***) and outputs safe chars
25
+ * - **fence**: inside a fenced code block, passes through until closing ```
26
+ * - **inline**: accumulating content inside an inline marker pair
27
+ */
28
+ export class StreamingMarkdownFilter {
29
+ buf = "";
30
+ fence = false;
31
+ sol = true;
32
+ inl = null;
33
+ feed(delta) {
34
+ this.buf += delta;
35
+ return this.pump(false);
36
+ }
37
+ flush() {
38
+ return this.pump(true);
39
+ }
40
+ pump(eof) {
41
+ let out = "";
42
+ while (this.buf) {
43
+ const sLen = this.buf.length;
44
+ const sSol = this.sol;
45
+ const sFence = this.fence;
46
+ const sInl = this.inl;
47
+ if (this.fence)
48
+ out += this.pumpFence(eof);
49
+ else if (this.inl)
50
+ out += this.pumpInline(eof);
51
+ else if (this.sol)
52
+ out += this.pumpSOL(eof);
53
+ else
54
+ out += this.pumpBody(eof);
55
+ if (this.buf.length === sLen && this.sol === sSol &&
56
+ this.fence === sFence && this.inl === sInl)
57
+ break;
58
+ }
59
+ if (eof && this.inl) {
60
+ const markers = { image: "![", bold3: "***", italic: "*", ubold3: "___", uitalic: "_" };
61
+ out += (markers[this.inl.type] ?? "") + this.inl.acc;
62
+ this.inl = null;
63
+ }
64
+ return out;
65
+ }
66
+ /** Inside a code fence: pass content and markers through verbatim. */
67
+ pumpFence(eof) {
68
+ if (this.sol) {
69
+ if (this.buf.length < 3 && !eof)
70
+ return "";
71
+ if (this.buf.startsWith("```")) {
72
+ const nl = this.buf.indexOf("\n", 3);
73
+ if (nl !== -1) {
74
+ this.fence = false;
75
+ const line = this.buf.slice(0, nl + 1);
76
+ this.buf = this.buf.slice(nl + 1);
77
+ this.sol = true;
78
+ return line;
79
+ }
80
+ if (eof) {
81
+ this.fence = false;
82
+ const line = this.buf;
83
+ this.buf = "";
84
+ return line;
85
+ }
86
+ return "";
87
+ }
88
+ this.sol = false;
89
+ }
90
+ const nl = this.buf.indexOf("\n");
91
+ if (nl !== -1) {
92
+ const chunk = this.buf.slice(0, nl + 1);
93
+ this.buf = this.buf.slice(nl + 1);
94
+ this.sol = true;
95
+ return chunk;
96
+ }
97
+ const chunk = this.buf;
98
+ this.buf = "";
99
+ return chunk;
100
+ }
101
+ /** At start of line: detect and consume line-start patterns, then transition to body. */
102
+ pumpSOL(eof) {
103
+ const b = this.buf;
104
+ if (b[0] === "\n") {
105
+ this.buf = b.slice(1);
106
+ return "\n";
107
+ }
108
+ if (b[0] === "`") {
109
+ if (b.length < 3 && !eof)
110
+ return "";
111
+ if (b.startsWith("```")) {
112
+ const nl = b.indexOf("\n", 3);
113
+ if (nl !== -1) {
114
+ this.fence = true;
115
+ const line = b.slice(0, nl + 1);
116
+ this.buf = b.slice(nl + 1);
117
+ this.sol = true;
118
+ return line;
119
+ }
120
+ if (eof) {
121
+ this.buf = "";
122
+ return b;
123
+ }
124
+ return "";
125
+ }
126
+ this.sol = false;
127
+ return "";
128
+ }
129
+ if (b[0] === ">") {
130
+ this.sol = false;
131
+ return "";
132
+ }
133
+ if (b[0] === "#") {
134
+ let n = 0;
135
+ while (n < b.length && b[n] === "#")
136
+ n++;
137
+ if (n === b.length && !eof)
138
+ return "";
139
+ if (n >= 5 && n <= 6 && n < b.length && b[n] === " ") {
140
+ this.buf = b.slice(n + 1);
141
+ this.sol = false;
142
+ return "";
143
+ }
144
+ this.sol = false;
145
+ return "";
146
+ }
147
+ if (b[0] === " " || b[0] === "\t") {
148
+ if (b.search(/[^ \t]/) === -1 && !eof)
149
+ return "";
150
+ this.sol = false;
151
+ return "";
152
+ }
153
+ if (b[0] === "-" || b[0] === "*" || b[0] === "_") {
154
+ const ch = b[0];
155
+ let j = 0;
156
+ while (j < b.length && (b[j] === ch || b[j] === " "))
157
+ j++;
158
+ if (j === b.length && !eof)
159
+ return "";
160
+ if (j === b.length || b[j] === "\n") {
161
+ let count = 0;
162
+ for (let k = 0; k < j; k++)
163
+ if (b[k] === ch)
164
+ count++;
165
+ if (count >= 3) {
166
+ if (j < b.length) {
167
+ this.buf = b.slice(j + 1);
168
+ this.sol = true;
169
+ return b.slice(0, j + 1);
170
+ }
171
+ this.buf = "";
172
+ return b;
173
+ }
174
+ }
175
+ this.sol = false;
176
+ return "";
177
+ }
178
+ this.sol = false;
179
+ return "";
180
+ }
181
+ /** Scan line body for inline pattern triggers; output safe chars eagerly. */
182
+ pumpBody(eof) {
183
+ let out = "";
184
+ let i = 0;
185
+ while (i < this.buf.length) {
186
+ const c = this.buf[i];
187
+ if (c === "\n") {
188
+ out += this.buf.slice(0, i + 1);
189
+ this.buf = this.buf.slice(i + 1);
190
+ this.sol = true;
191
+ return out;
192
+ }
193
+ if (c === "!" && i + 1 < this.buf.length && this.buf[i + 1] === "[") {
194
+ out += this.buf.slice(0, i);
195
+ this.buf = this.buf.slice(i + 2);
196
+ this.inl = { type: "image", acc: "" };
197
+ return out;
198
+ }
199
+ if (c === "~") {
200
+ i++;
201
+ continue;
202
+ }
203
+ if (c === "*") {
204
+ if (i + 2 < this.buf.length && this.buf[i + 1] === "*" && this.buf[i + 2] === "*") {
205
+ out += this.buf.slice(0, i);
206
+ this.buf = this.buf.slice(i + 3);
207
+ this.inl = { type: "bold3", acc: "" };
208
+ return out;
209
+ }
210
+ if (i + 1 < this.buf.length && this.buf[i + 1] === "*") {
211
+ i += 2;
212
+ continue;
213
+ }
214
+ if (i + 1 < this.buf.length && this.buf[i + 1] !== " " && this.buf[i + 1] !== "\n") {
215
+ out += this.buf.slice(0, i);
216
+ this.buf = this.buf.slice(i + 1);
217
+ this.inl = { type: "italic", acc: "" };
218
+ return out;
219
+ }
220
+ i++;
221
+ continue;
222
+ }
223
+ if (c === "_") {
224
+ if (i + 2 < this.buf.length && this.buf[i + 1] === "_" && this.buf[i + 2] === "_") {
225
+ out += this.buf.slice(0, i);
226
+ this.buf = this.buf.slice(i + 3);
227
+ this.inl = { type: "ubold3", acc: "" };
228
+ return out;
229
+ }
230
+ if (i + 1 < this.buf.length && this.buf[i + 1] === "_") {
231
+ i += 2;
232
+ continue;
233
+ }
234
+ if (i + 1 < this.buf.length && this.buf[i + 1] !== " " && this.buf[i + 1] !== "\n") {
235
+ out += this.buf.slice(0, i);
236
+ this.buf = this.buf.slice(i + 1);
237
+ this.inl = { type: "uitalic", acc: "" };
238
+ return out;
239
+ }
240
+ i++;
241
+ continue;
242
+ }
243
+ i++;
244
+ }
245
+ let hold = 0;
246
+ if (!eof) {
247
+ if (this.buf.endsWith("**"))
248
+ hold = 2;
249
+ else if (this.buf.endsWith("__"))
250
+ hold = 2;
251
+ else if (this.buf.endsWith("*"))
252
+ hold = 1;
253
+ else if (this.buf.endsWith("_"))
254
+ hold = 1;
255
+ else if (this.buf.endsWith("!"))
256
+ hold = 1;
257
+ }
258
+ out += this.buf.slice(0, this.buf.length - hold);
259
+ this.buf = hold > 0 ? this.buf.slice(-hold) : "";
260
+ return out;
261
+ }
262
+ /** Accumulate inline content until closing marker is found. */
263
+ pumpInline(_eof) {
264
+ if (!this.inl)
265
+ return "";
266
+ this.inl.acc += this.buf;
267
+ this.buf = "";
268
+ switch (this.inl.type) {
269
+ case "bold3": {
270
+ const idx = this.inl.acc.indexOf("***");
271
+ if (idx !== -1) {
272
+ const content = this.inl.acc.slice(0, idx);
273
+ this.buf = this.inl.acc.slice(idx + 3);
274
+ this.inl = null;
275
+ if (StreamingMarkdownFilter.containsCJK(content))
276
+ return content;
277
+ return `***${content}***`;
278
+ }
279
+ return "";
280
+ }
281
+ case "ubold3": {
282
+ const idx = this.inl.acc.indexOf("___");
283
+ if (idx !== -1) {
284
+ const content = this.inl.acc.slice(0, idx);
285
+ this.buf = this.inl.acc.slice(idx + 3);
286
+ this.inl = null;
287
+ if (StreamingMarkdownFilter.containsCJK(content))
288
+ return content;
289
+ return `___${content}___`;
290
+ }
291
+ return "";
292
+ }
293
+ case "italic": {
294
+ for (let j = 0; j < this.inl.acc.length; j++) {
295
+ if (this.inl.acc[j] === "\n") {
296
+ const r = "*" + this.inl.acc.slice(0, j + 1);
297
+ this.buf = this.inl.acc.slice(j + 1);
298
+ this.inl = null;
299
+ this.sol = true;
300
+ return r;
301
+ }
302
+ if (this.inl.acc[j] === "*") {
303
+ if (j + 1 < this.inl.acc.length && this.inl.acc[j + 1] === "*") {
304
+ j++;
305
+ continue;
306
+ }
307
+ const content = this.inl.acc.slice(0, j);
308
+ this.buf = this.inl.acc.slice(j + 1);
309
+ this.inl = null;
310
+ if (StreamingMarkdownFilter.containsCJK(content))
311
+ return content;
312
+ return `*${content}*`;
313
+ }
314
+ }
315
+ return "";
316
+ }
317
+ case "uitalic": {
318
+ for (let j = 0; j < this.inl.acc.length; j++) {
319
+ if (this.inl.acc[j] === "\n") {
320
+ const r = "_" + this.inl.acc.slice(0, j + 1);
321
+ this.buf = this.inl.acc.slice(j + 1);
322
+ this.inl = null;
323
+ this.sol = true;
324
+ return r;
325
+ }
326
+ if (this.inl.acc[j] === "_") {
327
+ if (j + 1 < this.inl.acc.length && this.inl.acc[j + 1] === "_") {
328
+ j++;
329
+ continue;
330
+ }
331
+ const content = this.inl.acc.slice(0, j);
332
+ this.buf = this.inl.acc.slice(j + 1);
333
+ this.inl = null;
334
+ if (StreamingMarkdownFilter.containsCJK(content))
335
+ return content;
336
+ return `_${content}_`;
337
+ }
338
+ }
339
+ return "";
340
+ }
341
+ case "image": {
342
+ const cb = this.inl.acc.indexOf("]");
343
+ if (cb === -1)
344
+ return "";
345
+ if (cb + 1 >= this.inl.acc.length)
346
+ return "";
347
+ if (this.inl.acc[cb + 1] !== "(") {
348
+ const r = "![" + this.inl.acc.slice(0, cb + 1);
349
+ this.buf = this.inl.acc.slice(cb + 1);
350
+ this.inl = null;
351
+ return r;
352
+ }
353
+ const cp = this.inl.acc.indexOf(")", cb + 2);
354
+ if (cp !== -1) {
355
+ this.buf = this.inl.acc.slice(cp + 1);
356
+ this.inl = null;
357
+ return "";
358
+ }
359
+ return "";
360
+ }
361
+ }
362
+ return "";
363
+ }
364
+ static containsCJK(text) {
365
+ return /[\u2E80-\u9FFF\uAC00-\uD7AF\uF900-\uFAFF]/.test(text);
366
+ }
367
+ }
368
+ //# sourceMappingURL=markdown-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-filter.js","sourceRoot":"","sources":["../../../src/messaging/markdown-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ import { MessageItemType } from "../api/types.js";
2
+ import { downloadMediaFromItem } from "../media/media-download.js";
3
+ import { logger } from "../util/logger.js";
4
+ const MAX_DEPTH = 5;
5
+ function formatTimestamp(ms) {
6
+ if (!ms)
7
+ return "";
8
+ const d = new Date(ms);
9
+ const pad = (n) => String(n).padStart(2, "0");
10
+ const date = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
11
+ const time = `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
12
+ const tz = new Intl.DateTimeFormat("en", { timeZoneName: "short" })
13
+ .formatToParts(d)
14
+ .find((p) => p.type === "timeZoneName")?.value ?? "";
15
+ return `${date} ${time}${tz ? ` ${tz}` : ""}`;
16
+ }
17
+ function formatSubItemContent(item) {
18
+ switch (item.type) {
19
+ case MessageItemType.TEXT:
20
+ return item.text_item?.text ?? "";
21
+ case MessageItemType.VOICE:
22
+ if (item.voice_item?.text)
23
+ return item.voice_item.text;
24
+ return undefined;
25
+ case MessageItemType.UNSUPPORTED:
26
+ return item.unsupported_item?.text || "[不支持的消息类型]";
27
+ default:
28
+ return undefined;
29
+ }
30
+ }
31
+ async function formatMediaContent(item, deps) {
32
+ const downloaded = await downloadMediaFromItem(item, {
33
+ cdnBaseUrl: deps.cdnBaseUrl,
34
+ saveMedia: deps.saveMedia,
35
+ log: deps.log,
36
+ errLog: deps.errLog,
37
+ label: "merged-record",
38
+ });
39
+ const filePath = downloaded.decryptedPicPath ??
40
+ downloaded.decryptedVideoPath ??
41
+ downloaded.decryptedFilePath ??
42
+ downloaded.decryptedVoicePath;
43
+ let text;
44
+ let mediaType;
45
+ switch (item.type) {
46
+ case MessageItemType.IMAGE:
47
+ text = filePath ? `![图片](${filePath})` : "[图片]";
48
+ mediaType = "image/*";
49
+ break;
50
+ case MessageItemType.VIDEO:
51
+ text = filePath ? `[视频](${filePath})` : "[视频]";
52
+ mediaType = "video/mp4";
53
+ break;
54
+ case MessageItemType.FILE: {
55
+ const name = item.file_item?.file_name;
56
+ if (name && filePath)
57
+ text = `[${name}](${filePath})`;
58
+ else if (name)
59
+ text = `[文件: ${name}]`;
60
+ else if (filePath)
61
+ text = `[文件](${filePath})`;
62
+ else
63
+ text = "[文件]";
64
+ mediaType = downloaded.fileMediaType ?? "application/octet-stream";
65
+ break;
66
+ }
67
+ case MessageItemType.VOICE:
68
+ text = filePath ? `[语音](${filePath})` : "[语音]";
69
+ mediaType = downloaded.voiceMediaType ?? "audio/wav";
70
+ break;
71
+ default:
72
+ text = "[不支持的消息]";
73
+ break;
74
+ }
75
+ return { text, mediaPath: filePath, mediaType: filePath ? mediaType : undefined };
76
+ }
77
+ /**
78
+ * Format a MergedRecordItem into a readable text body with nested structure.
79
+ *
80
+ * Each nesting level is represented by `│ ` prefixes. Media sub-items are
81
+ * downloaded via CDN; the body contains text placeholders (e.g. `[图片]`)
82
+ * while actual file paths are returned in `mediaPaths` / `mediaTypes`
83
+ * for populating `ctx.MediaPaths` / `ctx.MediaTypes`.
84
+ */
85
+ export async function formatMergedRecordBody(record, deps, depth = 0) {
86
+ const title = record.title ?? "聊天记录";
87
+ const lines = [`[合并转发: ${title}]`];
88
+ const mediaPaths = [];
89
+ const mediaTypes = [];
90
+ if (depth >= MAX_DEPTH) {
91
+ lines.push("│ [嵌套层级过深,省略]");
92
+ return { body: lines.join("\n"), mediaPaths, mediaTypes };
93
+ }
94
+ for (const sub of record.sub_item_list ?? []) {
95
+ const nick = sub.from_nick_name ?? "未知";
96
+ const item = sub.item;
97
+ if (!item)
98
+ continue;
99
+ const ts = formatTimestamp(item.create_time_ms);
100
+ const header = ts ? `${nick} (${ts}):` : `${nick}:`;
101
+ if (item.type === MessageItemType.MERGED_RECORD && item.merged_record) {
102
+ lines.push(`│ ${header}`);
103
+ const nested = await formatMergedRecordBody(item.merged_record, deps, depth + 1);
104
+ for (const nestedLine of nested.body.split("\n")) {
105
+ lines.push(`│ ${nestedLine}`);
106
+ }
107
+ mediaPaths.push(...nested.mediaPaths);
108
+ mediaTypes.push(...nested.mediaTypes);
109
+ }
110
+ else {
111
+ const syncContent = formatSubItemContent(item);
112
+ if (syncContent !== undefined) {
113
+ lines.push(`│ ${header}`);
114
+ for (const contentLine of syncContent.split("\n")) {
115
+ lines.push(`│ ${contentLine}`);
116
+ }
117
+ }
118
+ else if (item.type === MessageItemType.IMAGE ||
119
+ item.type === MessageItemType.VIDEO ||
120
+ item.type === MessageItemType.FILE ||
121
+ item.type === MessageItemType.VOICE) {
122
+ try {
123
+ const media = await formatMediaContent(item, deps);
124
+ lines.push(`│ ${header}`);
125
+ lines.push(`│ ${media.text}`);
126
+ if (media.mediaPath && media.mediaType) {
127
+ mediaPaths.push(media.mediaPath);
128
+ mediaTypes.push(media.mediaType);
129
+ }
130
+ }
131
+ catch (err) {
132
+ logger.error(`merged-record: media format failed: ${String(err)}`);
133
+ lines.push(`│ ${header}`);
134
+ lines.push("│ [媒体加载失败]");
135
+ }
136
+ }
137
+ else {
138
+ lines.push(`│ ${header}`);
139
+ lines.push("│ [不支持的消息]");
140
+ }
141
+ }
142
+ lines.push("│");
143
+ }
144
+ if (lines.length > 1 && lines[lines.length - 1] === "│") {
145
+ lines.pop();
146
+ }
147
+ return { body: lines.join("\n"), mediaPaths, mediaTypes };
148
+ }
149
+ //# sourceMappingURL=merged-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merged-record.js","sourceRoot":"","sources":["../../../src/messaging/merged-record.ts"],"names":[],"mappings":"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"}