@pawastation/wechat-kf 0.1.2 → 0.2.1

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 (55) hide show
  1. package/README.md +34 -28
  2. package/README.zh-CN.md +34 -28
  3. package/dist/index.d.ts +5 -15
  4. package/dist/index.js +5 -5
  5. package/dist/index.js.map +1 -1
  6. package/dist/src/accounts.d.ts +2 -1
  7. package/dist/src/accounts.js +61 -19
  8. package/dist/src/accounts.js.map +1 -1
  9. package/dist/src/api.d.ts +31 -2
  10. package/dist/src/api.js +41 -13
  11. package/dist/src/api.js.map +1 -1
  12. package/dist/src/bot.d.ts +10 -8
  13. package/dist/src/bot.js +232 -79
  14. package/dist/src/bot.js.map +1 -1
  15. package/dist/src/channel.d.ts +7 -106
  16. package/dist/src/channel.js +208 -71
  17. package/dist/src/channel.js.map +1 -1
  18. package/dist/src/config-schema.d.ts +0 -6
  19. package/dist/src/config-schema.js +2 -7
  20. package/dist/src/config-schema.js.map +1 -1
  21. package/dist/src/constants.d.ts +20 -0
  22. package/dist/src/constants.js +29 -0
  23. package/dist/src/constants.js.map +1 -1
  24. package/dist/src/crypto.js +7 -6
  25. package/dist/src/crypto.js.map +1 -1
  26. package/dist/src/monitor.d.ts +27 -14
  27. package/dist/src/monitor.js +67 -120
  28. package/dist/src/monitor.js.map +1 -1
  29. package/dist/src/outbound.d.ts +10 -44
  30. package/dist/src/outbound.js +277 -92
  31. package/dist/src/outbound.js.map +1 -1
  32. package/dist/src/reply-dispatcher.d.ts +2 -6
  33. package/dist/src/reply-dispatcher.js +131 -32
  34. package/dist/src/reply-dispatcher.js.map +1 -1
  35. package/dist/src/runtime.d.ts +1 -119
  36. package/dist/src/runtime.js +2 -1
  37. package/dist/src/runtime.js.map +1 -1
  38. package/dist/src/send-utils.d.ts +13 -0
  39. package/dist/src/send-utils.js +56 -4
  40. package/dist/src/send-utils.js.map +1 -1
  41. package/dist/src/token.js +7 -3
  42. package/dist/src/token.js.map +1 -1
  43. package/dist/src/types.d.ts +68 -6
  44. package/dist/src/webhook.d.ts +16 -16
  45. package/dist/src/webhook.js +92 -75
  46. package/dist/src/webhook.js.map +1 -1
  47. package/dist/src/wechat-kf-directives.d.ts +132 -9
  48. package/dist/src/wechat-kf-directives.js +535 -24
  49. package/dist/src/wechat-kf-directives.js.map +1 -1
  50. package/openclaw.plugin.json +1 -3
  51. package/package.json +4 -4
  52. package/dist/src/chunk-utils.d.ts +0 -18
  53. package/dist/src/chunk-utils.js +0 -58
  54. package/dist/src/chunk-utils.js.map +0 -1
  55. package/index.ts +0 -32
package/dist/src/bot.js CHANGED
@@ -10,10 +10,13 @@
10
10
  import { mkdir, readFile } from "node:fs/promises";
11
11
  import { join } from "node:path";
12
12
  import { getChannelConfig, registerKfId, resolveAccount } from "./accounts.js";
13
- import { downloadMedia, syncMessages } from "./api.js";
13
+ import { downloadMedia, sendTextMessage, syncMessages } from "./api.js";
14
+ import { CHANNEL_ID, cursorFileName, formatError, logTag, MAX_MESSAGE_AGE_S } from "./constants.js";
14
15
  import { atomicWriteFile } from "./fs-utils.js";
16
+ import { setPairingKfId } from "./monitor.js";
15
17
  import { createReplyDispatcher } from "./reply-dispatcher.js";
16
18
  import { getRuntime } from "./runtime.js";
19
+ import { contentTypeToExt, detectImageMime } from "./send-utils.js";
17
20
  // ── Per-kfId async mutex ──
18
21
  // Ensures that concurrent calls to handleWebhookEvent for the same openKfId
19
22
  // (e.g. from webhook + polling simultaneously) are serialized.
@@ -44,6 +47,7 @@ export const _testing = {
44
47
  isDuplicate,
45
48
  DEDUP_MAX_SIZE,
46
49
  handleEvent,
50
+ drainToLatestCursor,
47
51
  resetState() {
48
52
  kfLocks.clear();
49
53
  processedMsgIds.clear();
@@ -52,7 +56,7 @@ export const _testing = {
52
56
  // ── Cursor persistence (per kfid) ──
53
57
  async function loadCursor(stateDir, kfId) {
54
58
  try {
55
- return (await readFile(join(stateDir, `wechat-kf-cursor-${kfId}.txt`), "utf8")).trim();
59
+ return (await readFile(join(stateDir, cursorFileName(kfId)), "utf8")).trim();
56
60
  }
57
61
  catch {
58
62
  return "";
@@ -64,7 +68,7 @@ async function saveCursor(stateDir, kfId, cursor) {
64
68
  await mkdir(stateDir, { recursive: true });
65
69
  dirCreated = true;
66
70
  }
67
- await atomicWriteFile(join(stateDir, `wechat-kf-cursor-${kfId}.txt`), cursor);
71
+ await atomicWriteFile(join(stateDir, cursorFileName(kfId)), cursor);
68
72
  }
69
73
  // ── Message text extraction ──
70
74
  // Descriptions of non-text messages injected into the AI agent's context.
@@ -72,8 +76,11 @@ async function saveCursor(stateDir, kfId, cursor) {
72
76
  // replies in Chinese. These are NOT displayed to end-users directly.
73
77
  function extractText(msg) {
74
78
  switch (msg.msgtype) {
75
- case "text":
76
- return msg.text?.content ?? "";
79
+ case "text": {
80
+ const textContent = msg.text?.content ?? "";
81
+ const menuId = msg.text?.menu_id;
82
+ return menuId ? `${textContent} [menu_id: ${menuId}]` : textContent;
83
+ }
77
84
  case "image":
78
85
  return "[用户发送了一张图片]";
79
86
  case "voice":
@@ -83,11 +90,18 @@ function extractText(msg) {
83
90
  case "file":
84
91
  return "[用户发送了一个文件]";
85
92
  case "location": {
86
- const locDetail = [msg.location?.name, msg.location?.address].filter(Boolean).join(" ");
87
- return locDetail ? `[位置: ${locDetail}]` : "[位置]";
93
+ const loc = msg.location;
94
+ const parts = [loc?.name, loc?.address].filter(Boolean).join(" ");
95
+ const coords = loc?.latitude != null && loc?.longitude != null ? ` (${loc.latitude}, ${loc.longitude})` : "";
96
+ return parts ? `[位置: ${parts}${coords}]` : coords ? `[位置:${coords}]` : "[位置]";
97
+ }
98
+ case "link": {
99
+ const lk = msg.link;
100
+ const linkParts = [lk?.title, lk?.desc].filter(Boolean).join(" - ");
101
+ const url = lk?.url ?? "";
102
+ const pic = lk?.pic_url ? ` pic_url: ${lk.pic_url}` : "";
103
+ return `[链接: ${linkParts} ${url}${pic}]`;
88
104
  }
89
- case "link":
90
- return `[链接: ${msg.link?.title ?? ""} ${msg.link?.url ?? ""}]`;
91
105
  case "merged_msg": {
92
106
  const merged = msg.merged_msg;
93
107
  if (!merged)
@@ -96,6 +110,9 @@ function extractText(msg) {
96
110
  const items = Array.isArray(merged.item) ? merged.item : [];
97
111
  const lines = items.map((item) => {
98
112
  const sender = item.sender_name ?? "未知";
113
+ const timeStr = item.send_time
114
+ ? ` (${new Date(item.send_time * 1000).toLocaleString("zh-CN", { hour12: false })})`
115
+ : "";
99
116
  let content = "";
100
117
  try {
101
118
  const parsed = JSON.parse(item.msg_content ?? "{}");
@@ -113,12 +130,12 @@ function extractText(msg) {
113
130
  else if (parsed.link)
114
131
  content = `[链接: ${parsed.link?.title ?? ""}]`;
115
132
  else
116
- content = `[${parsed.msgtype ?? "未知类型"}]`;
133
+ content = `[${item.msgtype ?? parsed.msgtype ?? "未知类型"}]`;
117
134
  }
118
135
  catch {
119
136
  content = item.msg_content ?? "";
120
137
  }
121
- return `${sender}: ${content}`;
138
+ return `${sender}${timeStr}: ${content}`;
122
139
  });
123
140
  return `[转发的聊天记录: ${title}]\n${lines.join("\n")}`;
124
141
  }
@@ -130,41 +147,133 @@ function extractText(msg) {
130
147
  }
131
148
  case "miniprogram": {
132
149
  const mp = msg.miniprogram;
133
- return `[小程序] ${mp?.title ?? ""} (appid: ${mp?.appid ?? ""})`;
150
+ const mpParts = [`[小程序] ${mp?.title ?? ""} (appid: ${mp?.appid ?? ""})`];
151
+ if (mp?.pagepath)
152
+ mpParts.push(`pagepath: ${mp.pagepath}`);
153
+ if (mp?.thumb_media_id)
154
+ mpParts.push(`thumb_media_id: ${mp.thumb_media_id}`);
155
+ return mpParts.join(", ");
134
156
  }
135
157
  case "msgmenu": {
136
158
  const menu = msg.msgmenu;
137
159
  const head = menu?.head_content ?? "";
138
- const items = Array.isArray(menu?.list) ? menu.list.map((item) => item.content ?? item.id).join(", ") : "";
139
- return head ? `${head} [选项: ${items}]` : `[菜单消息: ${items}]`;
160
+ const menuItems = Array.isArray(menu?.list) ? menu.list.map((item) => item.content ?? item.id).join(", ") : "";
161
+ return head ? `${head} [选项: ${menuItems}]` : `[菜单消息: ${menuItems}]`;
140
162
  }
141
163
  case "business_card":
142
164
  return `[名片] userid: ${msg.business_card?.userid ?? ""}`;
165
+ case "channels_shop_product": {
166
+ const p = msg.channels_shop_product;
167
+ const productParts = ["[视频号商品]"];
168
+ if (p?.title)
169
+ productParts.push(p.title);
170
+ if (p?.sales_price)
171
+ productParts.push(`价格: ${p.sales_price}`);
172
+ if (p?.shop_nickname)
173
+ productParts.push(`店铺: ${p.shop_nickname}`);
174
+ if (p?.product_id)
175
+ productParts.push(`商品ID: ${p.product_id}`);
176
+ if (p?.head_image)
177
+ productParts.push(`图片: ${p.head_image}`);
178
+ if (p?.shop_head_image)
179
+ productParts.push(`店铺头像: ${p.shop_head_image}`);
180
+ return productParts.join(" | ");
181
+ }
182
+ case "channels_shop_order": {
183
+ const o = msg.channels_shop_order;
184
+ const orderParts = ["[视频号订单]"];
185
+ if (o?.product_titles)
186
+ orderParts.push(o.product_titles);
187
+ if (o?.price_wording)
188
+ orderParts.push(`金额: ${o.price_wording}`);
189
+ if (o?.state)
190
+ orderParts.push(`状态: ${o.state}`);
191
+ if (o?.shop_nickname)
192
+ orderParts.push(`店铺: ${o.shop_nickname}`);
193
+ if (o?.order_id)
194
+ orderParts.push(`订单ID: ${o.order_id}`);
195
+ if (o?.image_url)
196
+ orderParts.push(`图片: ${o.image_url}`);
197
+ return orderParts.join(" | ");
198
+ }
199
+ case "note":
200
+ return "[用户发送了一条笔记]";
143
201
  case "event":
144
202
  return null;
145
- default:
146
- return `[未支持的消息类型: ${msg.msgtype}]`;
203
+ default: {
204
+ const rawJson = JSON.stringify(msg, null, 2);
205
+ return `[未支持的消息类型: ${msg.msgtype}]\n\n原始JSON:\n${rawJson}`;
206
+ }
147
207
  }
148
208
  }
149
209
  // ── Event handling ──
210
+ /** Map known msg_send_fail fail_type codes to human-readable descriptions. */
211
+ function failTypeLabel(failType) {
212
+ switch (failType) {
213
+ case 0:
214
+ return "unknown";
215
+ case 10:
216
+ return "user rejected";
217
+ case 13:
218
+ return "content security (phishing/scam pattern detected)";
219
+ default:
220
+ return "unrecognized";
221
+ }
222
+ }
150
223
  async function handleEvent(ctx, _account, msg) {
151
224
  const event = msg.event;
152
225
  const { log } = ctx;
153
226
  const kfId = msg.open_kfid;
154
227
  switch (event?.event_type) {
155
228
  case "enter_session":
156
- log?.info(`[wechat-kf:${kfId}] user ${msg.external_userid} entered session` +
229
+ log?.info(`${logTag(kfId)} user ${msg.external_userid} entered session` +
157
230
  (event.welcome_code ? `, welcome_code=${event.welcome_code}` : "") +
158
231
  (event.scene ? `, scene=${event.scene}` : ""));
159
232
  break;
160
233
  case "msg_send_fail":
161
- log?.error(`[wechat-kf:${kfId}] message send failed: msgid=${event.fail_msgid}, type=${event.fail_type}`);
234
+ log?.error(`${logTag(kfId)} message send failed: msgid=${event.fail_msgid}, type=${event.fail_type} (${failTypeLabel(event.fail_type)})`);
235
+ if (event.fail_type === 13) {
236
+ log?.warn?.(`${logTag(kfId)} content security block: avoid numbered lists (1. 2. 3.) when discussing passwords, API keys, or credentials. Use bullet points or conversational prose instead.`);
237
+ }
162
238
  break;
163
239
  case "servicer_status_change":
164
- log?.info(`[wechat-kf:${kfId}] servicer status changed: ${event.servicer_userid} -> ${event.status}`);
240
+ log?.info(`${logTag(kfId)} servicer status changed: ${event.servicer_userid} -> ${event.status}`);
165
241
  break;
166
242
  default:
167
- log?.info(`[wechat-kf:${kfId}] unhandled event: ${event?.event_type}`);
243
+ log?.info(`${logTag(kfId)} unhandled event: ${event?.event_type}`);
244
+ }
245
+ }
246
+ // ── Cold Start Catch-up (Layer 1) ──
247
+ // When there is no cursor (file missing, empty, corrupt), drain all pending
248
+ // messages without dispatching them. This prevents historical message
249
+ // bombardment after cursor loss.
250
+ async function drainToLatestCursor(corpId, appSecret, openKfId, syncToken, stateDir, log) {
251
+ let cursor = "";
252
+ let hasMore = true;
253
+ let totalDrained = 0;
254
+ while (hasMore) {
255
+ const syncReq = { limit: 1000, open_kfid: openKfId };
256
+ if (cursor)
257
+ syncReq.cursor = cursor;
258
+ else if (syncToken)
259
+ syncReq.token = syncToken;
260
+ let resp;
261
+ try {
262
+ resp = await syncMessages(corpId, appSecret, syncReq);
263
+ }
264
+ catch (err) {
265
+ log?.error(`${logTag(openKfId)} drain failed: ${formatError(err)}`);
266
+ return;
267
+ }
268
+ totalDrained += resp.msg_list?.length ?? 0;
269
+ if (resp.next_cursor) {
270
+ cursor = resp.next_cursor;
271
+ await saveCursor(stateDir, openKfId, cursor);
272
+ }
273
+ hasMore = resp.has_more === 1;
274
+ }
275
+ if (totalDrained > 0) {
276
+ log?.info(`${logTag(openKfId)} cold start catch-up: skipped ${totalDrained} messages, cursor saved`);
168
277
  }
169
278
  }
170
279
  // ── Core message handler (per kfid) ──
@@ -193,64 +302,71 @@ async function _handleWebhookEventInner(ctx, openKfId, syncToken) {
193
302
  const account = resolveAccount(cfg, openKfId); // kfid as accountId
194
303
  const { corpId, appSecret } = account;
195
304
  if (!corpId || !appSecret) {
196
- log?.error("[wechat-kf] missing corpId/appSecret");
305
+ log?.error(`${logTag()} missing corpId/appSecret`);
197
306
  return;
198
307
  }
199
308
  // Register this kfid as discovered
200
309
  await registerKfId(openKfId);
201
310
  let cursor = await loadCursor(stateDir, openKfId);
311
+ // Layer 1: Cold Start Catch-up — no cursor means drain without dispatching
312
+ if (!cursor) {
313
+ log?.info(`${logTag(openKfId)} no cursor, draining to current position`);
314
+ await drainToLatestCursor(corpId, appSecret, openKfId, syncToken, stateDir, log);
315
+ return;
316
+ }
317
+ // Normal incremental pull — cursor is always present at this point
202
318
  let hasMore = true;
203
319
  while (hasMore) {
204
320
  const syncReq = {
205
321
  limit: 1000,
206
322
  open_kfid: openKfId, // Only pull messages for this kf account
323
+ cursor,
207
324
  };
208
- if (cursor) {
209
- // Have a persisted cursor — use it for incremental fetch (token is ignored)
210
- syncReq.cursor = cursor;
211
- }
212
- else if (syncToken) {
213
- // No cursor but webhook provided a token — use it for the first fetch
214
- syncReq.token = syncToken;
215
- }
216
- else {
217
- // Neither cursor nor token — will fetch the initial batch (up to 3 days history)
218
- log?.info(`[wechat-kf:${openKfId}] no cursor or token, fetching initial batch`);
219
- }
220
325
  let resp;
221
326
  try {
222
327
  resp = await syncMessages(corpId, appSecret, syncReq);
223
328
  }
224
329
  catch (err) {
225
- log?.error(`[wechat-kf:${openKfId}] sync_msg failed: ${err instanceof Error ? err.message : err}`);
330
+ log?.error(`${logTag(openKfId)} sync_msg failed: ${formatError(err)}`);
226
331
  return;
227
332
  }
228
333
  for (const msg of resp.msg_list ?? []) {
334
+ log?.debug?.(`${logTag(openKfId)} raw_msg ${msg.msgid} type=${msg.msgtype}: ${JSON.stringify(msg)}`);
229
335
  // Handle event messages (any origin) before normal message processing
230
336
  if (msg.msgtype === "event") {
231
337
  await handleEvent(ctx, account, msg);
232
338
  continue;
233
339
  }
234
- if (msg.origin !== 3)
235
- continue; // Only customer messages
340
+ if (msg.origin !== 3) {
341
+ log?.debug?.(`${logTag(openKfId)} skipping non-customer msg ${msg.msgid} (origin=${msg.origin})`);
342
+ continue;
343
+ }
344
+ // Layer 2: skip stale messages to prevent bombardment from corrupt cursors
345
+ const messageAgeS = Math.floor(Date.now() / 1000) - msg.send_time;
346
+ if (messageAgeS > MAX_MESSAGE_AGE_S) {
347
+ log?.debug?.(`${logTag(openKfId)} skipping stale msg ${msg.msgid} (age=${messageAgeS}s)`);
348
+ continue;
349
+ }
236
350
  // Dedup: skip messages we have already processed
237
351
  if (isDuplicate(msg.msgid)) {
238
- log?.info(`[wechat-kf:${openKfId}] skipping duplicate msg ${msg.msgid}`);
352
+ log?.debug?.(`${logTag(openKfId)} skipping duplicate msg ${msg.msgid}`);
239
353
  continue;
240
354
  }
241
355
  const text = extractText(msg);
242
- if (text === null || text === "")
356
+ if (text === null || text === "") {
357
+ log?.debug?.(`${logTag(openKfId)} skipping empty text for msg ${msg.msgid} (type=${msg.msgtype})`);
243
358
  continue;
359
+ }
244
360
  try {
245
361
  await dispatchMessage(ctx, account, msg, text);
246
362
  }
247
363
  catch (err) {
248
- log?.error(`[wechat-kf:${openKfId}] dispatch error for msg ${msg.msgid}: ${err instanceof Error ? err.stack || err.message : err}`);
364
+ log?.error(`${logTag(openKfId)} dispatch error for msg ${msg.msgid}: ${formatError(err)}`);
249
365
  }
250
366
  }
251
367
  // P1-02: Save cursor AFTER all messages in the batch are processed
252
368
  // (at-least-once delivery). If the process crashes mid-batch, the
253
- // cursor has not advanced and the batch will be re-fetched on restart.
369
+ // cursor has not advanced and the batch will be re-pulled on restart.
254
370
  // P1-01 msgid dedup ensures replayed messages are not dispatched twice.
255
371
  if (resp.next_cursor) {
256
372
  cursor = resp.next_cursor;
@@ -267,63 +383,100 @@ async function dispatchMessage(ctx, account, msg, text) {
267
383
  const dmPolicy = channelConfig.dmPolicy ?? "open";
268
384
  const externalUserId = msg.external_userid;
269
385
  if (dmPolicy === "disabled") {
270
- log?.info?.(`[wechat-kf] drop DM (dmPolicy: disabled)`);
386
+ log?.info(`${logTag()} drop DM (dmPolicy: disabled)`);
271
387
  return;
272
388
  }
273
- if (dmPolicy === "allowlist") {
274
- const allowFrom = channelConfig.allowFrom ?? [];
275
- if (!allowFrom.includes(externalUserId)) {
276
- log?.info?.(`[wechat-kf] blocked sender ${externalUserId} (dmPolicy: allowlist)`);
389
+ const core = getRuntime();
390
+ if (dmPolicy !== "open") {
391
+ const configAllowFrom = channelConfig.allowFrom ?? [];
392
+ const storeAllowFrom = await core.channel.pairing.readAllowFromStore(CHANNEL_ID).catch(() => []);
393
+ const effectiveAllowFrom = [...configAllowFrom, ...storeAllowFrom];
394
+ const allowed = effectiveAllowFrom.includes(externalUserId);
395
+ if (!allowed) {
396
+ if (dmPolicy === "pairing") {
397
+ setPairingKfId(externalUserId, msg.open_kfid);
398
+ const { code, created } = await core.channel.pairing.upsertPairingRequest({
399
+ channel: CHANNEL_ID,
400
+ id: externalUserId,
401
+ meta: { openKfId: msg.open_kfid },
402
+ });
403
+ if (created && account.corpId && account.appSecret) {
404
+ log?.info(`${logTag()} pairing request sender=${externalUserId}`);
405
+ try {
406
+ await sendTextMessage(account.corpId, account.appSecret, externalUserId, msg.open_kfid, core.channel.pairing.buildPairingReply({
407
+ channel: CHANNEL_ID,
408
+ idLine: `Your WeChat KF external_userid: ${externalUserId}`,
409
+ code,
410
+ }));
411
+ }
412
+ catch (err) {
413
+ log?.error(`${logTag()} pairing reply failed for ${externalUserId}: ${formatError(err)}`);
414
+ }
415
+ }
416
+ }
417
+ else {
418
+ log?.info(`${logTag()} blocked sender ${externalUserId} (dmPolicy: ${dmPolicy})`);
419
+ }
277
420
  return;
278
421
  }
279
422
  }
280
- // "open" and "pairing" modes: allow message through
281
- // Note: full pairing flow requires runtime API support, deferred to P2
282
- const core = getRuntime();
283
423
  const kfId = msg.open_kfid;
284
- const from = `wechat-kf:${msg.external_userid}`;
424
+ const from = `${CHANNEL_ID}:${msg.external_userid}`;
285
425
  const to = `user:${msg.external_userid}`;
286
426
  // Download media
287
427
  const mediaPaths = [];
288
428
  const mediaTypes = [];
289
- async function saveMedia(mediaId, mimeType, filename) {
290
- try {
291
- const buffer = await downloadMedia(account.corpId, account.appSecret, mediaId);
292
- const saved = await core.channel.media.saveMediaBuffer(buffer, mimeType, "inbound", undefined, filename);
293
- mediaPaths.push(saved.path);
294
- mediaTypes.push(mimeType);
295
- log?.info(`[wechat-kf:${kfId}] saved media: ${saved.path} (${mimeType})`);
296
- }
297
- catch (err) {
298
- log?.error(`[wechat-kf:${kfId}] failed to save media ${mediaId}: ${err instanceof Error ? err.message : err}`);
299
- }
300
- }
301
429
  if (account.corpId && account.appSecret) {
302
430
  const mediaId = msg.image?.media_id || msg.voice?.media_id || msg.video?.media_id || msg.file?.media_id;
303
431
  if (mediaId) {
304
- const mimeMap = {
305
- image: ["image/jpeg", `wechat_image_${msg.msgid}.jpg`],
306
- voice: ["audio/amr", `wechat_voice_${msg.msgid}.amr`],
307
- video: ["video/mp4", `wechat_video_${msg.msgid}.mp4`],
308
- file: ["application/octet-stream", `wechat_file_${msg.msgid}`],
309
- };
310
- const [mime, filename] = mimeMap[msg.msgtype] ?? ["application/octet-stream", `wechat_media_${msg.msgid}`];
311
- await saveMedia(mediaId, mime, filename);
432
+ try {
433
+ const { buffer, contentType } = await downloadMedia(account.corpId, account.appSecret, mediaId);
434
+ let mime;
435
+ let filename;
436
+ if (msg.msgtype === "image") {
437
+ // Detect actual image format: magic bytes first, content-type fallback
438
+ const detected = detectImageMime(buffer);
439
+ if (detected) {
440
+ mime = detected;
441
+ }
442
+ else {
443
+ const ct = contentType.split(";")[0].trim();
444
+ mime = ct.startsWith("image/") ? ct : "image/jpeg";
445
+ }
446
+ const ext = contentTypeToExt(mime) || ".jpg";
447
+ filename = `wechat_image_${msg.msgid}${ext}`;
448
+ }
449
+ else {
450
+ const staticMap = {
451
+ voice: ["audio/amr", `wechat_voice_${msg.msgid}.amr`],
452
+ video: ["video/mp4", `wechat_video_${msg.msgid}.mp4`],
453
+ file: ["application/octet-stream", `wechat_file_${msg.msgid}`],
454
+ };
455
+ [mime, filename] = staticMap[msg.msgtype] ?? ["application/octet-stream", `wechat_media_${msg.msgid}`];
456
+ }
457
+ const saved = await core.channel.media.saveMediaBuffer(buffer, mime, "inbound", undefined, filename);
458
+ mediaPaths.push(saved.path);
459
+ mediaTypes.push(mime);
460
+ log?.info(`${logTag(kfId)} saved media: ${saved.path} (${mime})`);
461
+ }
462
+ catch (err) {
463
+ log?.error(`${logTag(kfId)} failed to save media ${mediaId}: ${formatError(err)}`);
464
+ }
312
465
  }
313
466
  }
314
- // Route using kfid as accountId — each kfid gets its own session
315
- // peer id includes kfid so different kf accounts get isolated sessions
467
+ // Route using kfid as accountId — multi-account isolation is handled by the framework
468
+ // via dmScope config (e.g. "per-account-channel-peer"), not by embedding kfId in peer.id
316
469
  const route = core.channel.routing.resolveAgentRoute({
317
470
  cfg,
318
- channel: "wechat-kf",
471
+ channel: CHANNEL_ID,
319
472
  accountId: kfId,
320
- peer: { kind: "direct", id: `${kfId}:${msg.external_userid}` },
473
+ peer: { kind: "direct", id: msg.external_userid },
321
474
  });
322
475
  // System event
323
476
  const preview = text.replace(/\s+/g, " ").slice(0, 160);
324
477
  core.system.enqueueSystemEvent(`WeChat-KF[${kfId}] DM from ${msg.external_userid}: ${preview}`, {
325
478
  sessionKey: route.sessionKey,
326
- contextKey: `wechat-kf:message:${msg.msgid}`,
479
+ contextKey: `${CHANNEL_ID}:message:${msg.msgid}`,
327
480
  });
328
481
  // Format envelope
329
482
  const envelopeOptions = core.channel.reply.resolveEnvelopeFormatOptions(cfg);
@@ -346,13 +499,13 @@ async function dispatchMessage(ctx, account, msg, text) {
346
499
  ChatType: "direct",
347
500
  SenderName: msg.external_userid,
348
501
  SenderId: msg.external_userid,
349
- Provider: "wechat-kf",
350
- Surface: "wechat-kf",
502
+ Provider: CHANNEL_ID,
503
+ Surface: CHANNEL_ID,
351
504
  MessageSid: msg.msgid,
352
505
  Timestamp: msg.send_time * 1000,
353
506
  WasMentioned: false,
354
507
  CommandAuthorized: true,
355
- OriginatingChannel: "wechat-kf",
508
+ OriginatingChannel: CHANNEL_ID,
356
509
  OriginatingTo: to,
357
510
  MediaPaths: mediaPaths.length > 0 ? mediaPaths : undefined,
358
511
  MediaTypes: mediaTypes.length > 0 ? mediaTypes : undefined,
@@ -366,7 +519,7 @@ async function dispatchMessage(ctx, account, msg, text) {
366
519
  openKfId: kfId,
367
520
  accountId: kfId,
368
521
  });
369
- log?.info(`[wechat-kf:${kfId}] dispatching to agent (session=${route.sessionKey})`);
522
+ log?.info(`${logTag(kfId)} dispatching to agent (session=${route.sessionKey})`);
370
523
  const { queuedFinal, counts } = await core.channel.reply.dispatchReplyFromConfig({
371
524
  ctx: inboundCtx,
372
525
  cfg,
@@ -374,6 +527,6 @@ async function dispatchMessage(ctx, account, msg, text) {
374
527
  replyOptions,
375
528
  });
376
529
  markDispatchIdle?.();
377
- log?.info(`[wechat-kf:${kfId}] dispatch complete (queuedFinal=${queuedFinal}, replies=${counts?.final})`);
530
+ log?.info(`${logTag(kfId)} dispatch complete (queuedFinal=${queuedFinal}, replies=${counts?.final})`);
378
531
  }
379
532
  //# sourceMappingURL=bot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/bot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/bot.ts"],"names":[],"mappings":"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"}