@pawastation/wechat-kf 0.1.2 → 0.2.0

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 +231 -78
  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/index.ts +22 -12
  51. package/openclaw.plugin.json +1 -3
  52. package/package.json +3 -2
  53. package/dist/src/chunk-utils.d.ts +0 -18
  54. package/dist/src/chunk-utils.js +0 -58
  55. package/dist/src/chunk-utils.js.map +0 -1
@@ -5,12 +5,15 @@
5
5
  * This module implements the OpenClaw `ChannelPlugin.outbound` interface and
6
6
  * is called by the framework when the agent produces a final reply.
7
7
  *
8
- * Text chunking is handled by the framework itself via the declared `chunker`
9
- * function (P0-01), so `sendText` always receives a single pre-chunked piece.
8
+ * Text is first converted from markdown to Unicode formatting (formatText),
9
+ * then chunked via the runtime's `chunkTextWithMode` helper (respecting user
10
+ * `chunkMode` config). Framework auto-chunking is disabled (`chunker: null`)
11
+ * because it would chunk *before* formatting, causing post-format expansion
12
+ * (Unicode math-bold chars are 2 `.length` units each) to exceed the limit.
10
13
  *
11
- * For media, the file is read from disk (or downloaded from HTTP URL),
12
- * classified, uploaded to WeChat, and sent using the shared
13
- * `uploadAndSendMedia` helper from `send-utils.ts`.
14
+ * For media, the framework's `loadWebMedia` handles all URL formats
15
+ * (HTTP, file://, local paths, MEDIA: prefix, ~), then the buffer is
16
+ * uploaded to WeChat and sent using `uploadAndSendMedia` from `send-utils.ts`.
14
17
  *
15
18
  * WeChat KF session limits:
16
19
  * The API enforces a 48-hour / 5-message limit per session window.
@@ -25,14 +28,22 @@
25
28
  *
26
29
  * accountId = openKfId (dynamically discovered)
27
30
  */
28
- import { readFile } from "node:fs/promises";
29
- import { extname } from "node:path";
30
31
  import { resolveAccount } from "./accounts.js";
31
- import { sendLinkMessage, sendTextMessage, uploadMedia } from "./api.js";
32
- import { chunkText } from "./chunk-utils.js";
33
- import { WECHAT_MSG_LIMIT_ERRCODE, WECHAT_TEXT_CHUNK_LIMIT } from "./constants.js";
34
- import { detectMediaType, downloadMediaFromUrl, formatText, uploadAndSendMedia } from "./send-utils.js";
35
- import { parseWechatLinkDirective } from "./wechat-kf-directives.js";
32
+ import { sendBusinessCardMessage, sendCaLinkMessage, sendLinkMessage, sendLocationMessage, sendMiniprogramMessage, sendMsgMenuMessage, sendRawMessage, sendTextMessage, } from "./api.js";
33
+ import { CHANNEL_ID, logTag, WECHAT_MSG_LIMIT_ERRCODE, WECHAT_TEXT_CHUNK_LIMIT } from "./constants.js";
34
+ import { getSharedContext } from "./monitor.js";
35
+ import { getRuntime } from "./runtime.js";
36
+ import { formatText, mediaKindToWechatType, resolveThumbMediaId, uploadAndSendMedia } from "./send-utils.js";
37
+ import { buildMsgMenuPayload, parseWechatDirective } from "./wechat-kf-directives.js";
38
+ /** Resolve chunk limit and mode from the runtime, then split text accordingly. */
39
+ function chunkViaRuntime(text, cfg, accountId) {
40
+ const core = getRuntime();
41
+ const limit = core.channel.text.resolveTextChunkLimit(cfg, CHANNEL_ID, accountId, {
42
+ fallbackLimit: WECHAT_TEXT_CHUNK_LIMIT,
43
+ });
44
+ const mode = core.channel.text.resolveChunkMode(cfg, CHANNEL_ID);
45
+ return core.channel.text.chunkTextWithMode(text, limit, mode);
46
+ }
36
47
  /**
37
48
  * Check whether an error indicates the WeChat 48h/5-message session limit.
38
49
  * When detected, logs a warning and returns true so the caller can handle
@@ -44,37 +55,45 @@ function isSessionLimitError(err) {
44
55
  }
45
56
  return false;
46
57
  }
58
+ function warnSessionLimit(err, externalUserId, openKfId) {
59
+ if (isSessionLimitError(err)) {
60
+ getSharedContext()?.botCtx.log?.warn(`${logTag()} session limit exceeded (48h/5-msg) for user=${externalUserId} kf=${openKfId}. ` +
61
+ `The customer must send a new message before more replies can be delivered.`);
62
+ }
63
+ }
47
64
  export const wechatKfOutbound = {
48
65
  deliveryMode: "direct",
49
- chunker: (text, limit) => chunkText(text, limit),
50
- chunkerMode: "text",
66
+ chunker: null, // disabled — sendText formats first, then chunks internally
51
67
  textChunkLimit: WECHAT_TEXT_CHUNK_LIMIT,
52
68
  sendText: async ({ cfg, to, text, accountId }) => {
53
- const account = resolveAccount(cfg, accountId);
54
- const openKfId = account.openKfId ?? accountId;
69
+ const account = resolveAccount(cfg, accountId ?? "");
70
+ const effectiveAccountId = accountId ?? "";
71
+ const openKfId = account.openKfId ?? effectiveAccountId;
55
72
  if (!account.corpId || !account.appSecret || !openKfId) {
56
- throw new Error("[wechat-kf] missing corpId/appSecret/openKfId");
73
+ throw new Error(`${logTag()} missing corpId/appSecret/openKfId`);
57
74
  }
58
75
  const externalUserId = String(to).replace(/^user:/, "");
59
- // ── Intercept [[wechat_link:...]] directives BEFORE formatText ──
60
- // Parse on raw text so title/desc/url stay clean (formatText would
76
+ // ── Intercept [[wechat_*:...]] directives BEFORE formatText ──
77
+ // Parse on raw text so fields stay clean (formatText would
61
78
  // convert markdown inside the directive to unicode characters).
62
- const directive = parseWechatLinkDirective(text);
79
+ const directive = parseWechatDirective(text);
63
80
  if (directive.link) {
64
81
  try {
65
82
  let thumbMediaId;
66
83
  if (directive.link.thumbUrl) {
67
- const downloaded = await downloadMediaFromUrl(directive.link.thumbUrl);
68
- const uploaded = await uploadMedia(account.corpId, account.appSecret, "image", downloaded.buffer, downloaded.filename);
69
- thumbMediaId = uploaded.media_id;
84
+ thumbMediaId = await resolveThumbMediaId(directive.link.thumbUrl, account.corpId, account.appSecret);
70
85
  }
71
86
  // WeChat requires thumb_media_id for link cards — fall back to plain text if missing
72
87
  if (!thumbMediaId) {
73
88
  const fallbackText = directive.text
74
89
  ? `${formatText(directive.text)}\n${directive.link.title}: ${directive.link.url}`
75
90
  : `${directive.link.title}: ${directive.link.url}`;
76
- const result = await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, fallbackText);
77
- return { channel: "wechat-kf", messageId: result.msgid, chatId: to };
91
+ const fallbackChunks = chunkViaRuntime(fallbackText, cfg, effectiveAccountId);
92
+ let lastResult;
93
+ for (const chunk of fallbackChunks) {
94
+ lastResult = await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, chunk);
95
+ }
96
+ return { channel: CHANNEL_ID, messageId: lastResult?.msgid ?? "", chatId: to };
78
97
  }
79
98
  const linkResult = await sendLinkMessage(account.corpId, account.appSecret, externalUserId, openKfId, {
80
99
  title: directive.link.title,
@@ -84,76 +103,171 @@ export const wechatKfOutbound = {
84
103
  });
85
104
  // Send remaining text if non-empty (apply formatText to surrounding text only)
86
105
  if (directive.text) {
87
- await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, formatText(directive.text));
106
+ const remainFormatted = formatText(directive.text);
107
+ const remainChunks = chunkViaRuntime(remainFormatted, cfg, effectiveAccountId);
108
+ for (const chunk of remainChunks) {
109
+ await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, chunk);
110
+ }
88
111
  }
89
- return { channel: "wechat-kf", messageId: linkResult.msgid, chatId: to };
112
+ return { channel: CHANNEL_ID, messageId: linkResult.msgid, chatId: to };
90
113
  }
91
114
  catch (err) {
92
- if (isSessionLimitError(err)) {
93
- console.error(`[wechat-kf] session limit exceeded (48h/5-msg) for user=${externalUserId} kf=${openKfId}. ` +
94
- `The customer must send a new message before more replies can be delivered.`);
115
+ warnSessionLimit(err, externalUserId, openKfId);
116
+ throw err;
117
+ }
118
+ }
119
+ if (directive.location) {
120
+ try {
121
+ const locResult = await sendLocationMessage(account.corpId, account.appSecret, externalUserId, openKfId, directive.location);
122
+ if (directive.text) {
123
+ const remainChunks = chunkViaRuntime(formatText(directive.text), cfg, effectiveAccountId);
124
+ for (const chunk of remainChunks) {
125
+ await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, chunk);
126
+ }
95
127
  }
128
+ return { channel: CHANNEL_ID, messageId: locResult.msgid, chatId: to };
129
+ }
130
+ catch (err) {
131
+ warnSessionLimit(err, externalUserId, openKfId);
96
132
  throw err;
97
133
  }
98
134
  }
99
- const formatted = formatText(text);
100
- try {
101
- const result = await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, formatted);
102
- return { channel: "wechat-kf", messageId: result.msgid, chatId: to };
135
+ if (directive.miniprogram) {
136
+ try {
137
+ let thumbMediaId;
138
+ if (directive.miniprogram.thumbUrl) {
139
+ thumbMediaId = await resolveThumbMediaId(directive.miniprogram.thumbUrl, account.corpId, account.appSecret);
140
+ }
141
+ if (!thumbMediaId) {
142
+ // Miniprogram card requires thumb — fall back to text
143
+ const fallback = directive.text
144
+ ? `${formatText(directive.text)}\n[小程序] ${directive.miniprogram.title}`
145
+ : `[小程序] ${directive.miniprogram.title}`;
146
+ const chunks = chunkViaRuntime(fallback, cfg, effectiveAccountId);
147
+ let lastResult;
148
+ for (const chunk of chunks) {
149
+ lastResult = await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, chunk);
150
+ }
151
+ return { channel: CHANNEL_ID, messageId: lastResult?.msgid ?? "", chatId: to };
152
+ }
153
+ const mpResult = await sendMiniprogramMessage(account.corpId, account.appSecret, externalUserId, openKfId, {
154
+ appid: directive.miniprogram.appid,
155
+ title: directive.miniprogram.title,
156
+ pagepath: directive.miniprogram.pagepath,
157
+ thumb_media_id: thumbMediaId,
158
+ });
159
+ if (directive.text) {
160
+ const remainChunks = chunkViaRuntime(formatText(directive.text), cfg, effectiveAccountId);
161
+ for (const chunk of remainChunks) {
162
+ await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, chunk);
163
+ }
164
+ }
165
+ return { channel: CHANNEL_ID, messageId: mpResult.msgid, chatId: to };
166
+ }
167
+ catch (err) {
168
+ warnSessionLimit(err, externalUserId, openKfId);
169
+ throw err;
170
+ }
103
171
  }
104
- catch (err) {
105
- if (isSessionLimitError(err)) {
106
- console.error(`[wechat-kf] session limit exceeded (48h/5-msg) for user=${externalUserId} kf=${openKfId}. ` +
107
- `The customer must send a new message before more replies can be delivered.`);
172
+ if (directive.menu) {
173
+ try {
174
+ const menuPayload = buildMsgMenuPayload(directive.menu);
175
+ const menuResult = await sendMsgMenuMessage(account.corpId, account.appSecret, externalUserId, openKfId, menuPayload);
176
+ if (directive.text) {
177
+ const remainChunks = chunkViaRuntime(formatText(directive.text), cfg, effectiveAccountId);
178
+ for (const chunk of remainChunks) {
179
+ await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, chunk);
180
+ }
181
+ }
182
+ return { channel: CHANNEL_ID, messageId: menuResult.msgid, chatId: to };
183
+ }
184
+ catch (err) {
185
+ warnSessionLimit(err, externalUserId, openKfId);
186
+ throw err;
108
187
  }
109
- throw err;
110
188
  }
111
- },
112
- sendMedia: async ({ cfg, to, text, mediaUrl, accountId }) => {
113
- const account = resolveAccount(cfg, accountId);
114
- const openKfId = account.openKfId ?? accountId;
115
- if (!account.corpId || !account.appSecret || !openKfId) {
116
- throw new Error("[wechat-kf] missing corpId/appSecret/openKfId");
189
+ if (directive.businessCard) {
190
+ try {
191
+ const cardResult = await sendBusinessCardMessage(account.corpId, account.appSecret, externalUserId, openKfId, directive.businessCard);
192
+ if (directive.text) {
193
+ const remainChunks = chunkViaRuntime(formatText(directive.text), cfg, effectiveAccountId);
194
+ for (const chunk of remainChunks) {
195
+ await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, chunk);
196
+ }
197
+ }
198
+ return { channel: CHANNEL_ID, messageId: cardResult.msgid, chatId: to };
199
+ }
200
+ catch (err) {
201
+ warnSessionLimit(err, externalUserId, openKfId);
202
+ throw err;
203
+ }
117
204
  }
118
- const externalUserId = String(to).replace(/^user:/, "");
119
- // ── HTTP/HTTPS URL: download then upload ──
120
- if (mediaUrl?.startsWith("http")) {
121
- const downloaded = await downloadMediaFromUrl(mediaUrl);
122
- const ext = downloaded.ext.toLowerCase();
123
- const mediaType = detectMediaType(ext);
205
+ if (directive.caLink) {
124
206
  try {
125
- const result = await uploadAndSendMedia(account.corpId, account.appSecret, externalUserId, openKfId, downloaded.buffer, downloaded.filename, mediaType);
126
- if (text?.trim()) {
127
- await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, formatText(text));
207
+ const caResult = await sendCaLinkMessage(account.corpId, account.appSecret, externalUserId, openKfId, directive.caLink);
208
+ if (directive.text) {
209
+ const remainChunks = chunkViaRuntime(formatText(directive.text), cfg, effectiveAccountId);
210
+ for (const chunk of remainChunks) {
211
+ await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, chunk);
212
+ }
128
213
  }
129
- return { channel: "wechat-kf", messageId: result.msgid, chatId: to };
214
+ return { channel: CHANNEL_ID, messageId: caResult.msgid, chatId: to };
130
215
  }
131
216
  catch (err) {
132
- if (isSessionLimitError(err)) {
133
- console.error(`[wechat-kf] session limit exceeded (48h/5-msg) for user=${externalUserId} kf=${openKfId}. ` +
134
- `The customer must send a new message before more replies can be delivered.`);
217
+ warnSessionLimit(err, externalUserId, openKfId);
218
+ throw err;
219
+ }
220
+ }
221
+ if (directive.raw) {
222
+ try {
223
+ const rawResult = await sendRawMessage(account.corpId, account.appSecret, externalUserId, openKfId, directive.raw.msgtype, directive.raw.payload);
224
+ if (directive.text) {
225
+ const remainChunks = chunkViaRuntime(formatText(directive.text), cfg, effectiveAccountId);
226
+ for (const chunk of remainChunks) {
227
+ await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, chunk);
228
+ }
135
229
  }
230
+ return { channel: CHANNEL_ID, messageId: rawResult.msgid, chatId: to };
231
+ }
232
+ catch (err) {
233
+ warnSessionLimit(err, externalUserId, openKfId);
136
234
  throw err;
137
235
  }
138
236
  }
139
- // ── Local file path: read then upload ──
237
+ const formatted = formatText(text);
238
+ const chunks = chunkViaRuntime(formatted, cfg, effectiveAccountId);
239
+ try {
240
+ let lastResult;
241
+ for (const chunk of chunks) {
242
+ lastResult = await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, chunk);
243
+ }
244
+ return { channel: CHANNEL_ID, messageId: lastResult?.msgid ?? "", chatId: to };
245
+ }
246
+ catch (err) {
247
+ warnSessionLimit(err, externalUserId, openKfId);
248
+ throw err;
249
+ }
250
+ },
251
+ sendMedia: async ({ cfg, to, text, mediaUrl, accountId }) => {
252
+ const account = resolveAccount(cfg, accountId ?? "");
253
+ const openKfId = account.openKfId ?? accountId ?? "";
254
+ if (!account.corpId || !account.appSecret || !openKfId) {
255
+ throw new Error(`${logTag()} missing corpId/appSecret/openKfId`);
256
+ }
257
+ const externalUserId = String(to).replace(/^user:/, "");
140
258
  if (mediaUrl) {
141
- const buffer = await readFile(mediaUrl);
142
- const ext = extname(mediaUrl).toLowerCase();
143
- const mediaType = detectMediaType(ext);
144
- const filename = mediaUrl.split("/").pop() || "file";
259
+ const core = getRuntime();
260
+ const loaded = await core.media.loadWebMedia(mediaUrl, { optimizeImages: false });
261
+ const mediaType = mediaKindToWechatType(loaded.kind);
145
262
  try {
146
- const result = await uploadAndSendMedia(account.corpId, account.appSecret, externalUserId, openKfId, buffer, filename, mediaType);
263
+ const result = await uploadAndSendMedia(account.corpId, account.appSecret, externalUserId, openKfId, loaded.buffer, loaded.fileName ?? "file", mediaType);
147
264
  if (text?.trim()) {
148
265
  await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, formatText(text));
149
266
  }
150
- return { channel: "wechat-kf", messageId: result.msgid, chatId: to };
267
+ return { channel: CHANNEL_ID, messageId: result.msgid, chatId: to };
151
268
  }
152
269
  catch (err) {
153
- if (isSessionLimitError(err)) {
154
- console.error(`[wechat-kf] session limit exceeded (48h/5-msg) for user=${externalUserId} kf=${openKfId}. ` +
155
- `The customer must send a new message before more replies can be delivered.`);
156
- }
270
+ warnSessionLimit(err, externalUserId, openKfId);
157
271
  throw err;
158
272
  }
159
273
  }
@@ -161,35 +275,30 @@ export const wechatKfOutbound = {
161
275
  const content = text?.trim() ? `${text}\n${mediaUrl || ""}` : mediaUrl || text || "";
162
276
  try {
163
277
  const result = await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, content);
164
- return { channel: "wechat-kf", messageId: result.msgid, chatId: to };
278
+ return { channel: CHANNEL_ID, messageId: result.msgid, chatId: to };
165
279
  }
166
280
  catch (err) {
167
- if (isSessionLimitError(err)) {
168
- console.error(`[wechat-kf] session limit exceeded (48h/5-msg) for user=${externalUserId} kf=${openKfId}. ` +
169
- `The customer must send a new message before more replies can be delivered.`);
170
- }
281
+ warnSessionLimit(err, externalUserId, openKfId);
171
282
  throw err;
172
283
  }
173
284
  },
174
285
  sendPayload: async ({ cfg, to, text, accountId, payload }) => {
175
- const account = resolveAccount(cfg, accountId);
176
- const openKfId = account.openKfId ?? accountId;
286
+ const account = resolveAccount(cfg, accountId ?? "");
287
+ const openKfId = account.openKfId ?? accountId ?? "";
177
288
  if (!account.corpId || !account.appSecret || !openKfId) {
178
- throw new Error("[wechat-kf] missing corpId/appSecret/openKfId");
289
+ throw new Error(`${logTag()} missing corpId/appSecret/openKfId`);
179
290
  }
180
291
  const externalUserId = String(to).replace(/^user:/, "");
181
292
  const wechatKf = payload.channelData?.wechatKf;
182
293
  const link = wechatKf?.link;
183
294
  if (link) {
184
295
  let thumbMediaId = link.thumb_media_id;
185
- // Download and upload thumbnail if only URL is provided
296
+ // Resolve thumbnail if only thumbUrl/path/media_id is provided
186
297
  if (!thumbMediaId && link.thumbUrl) {
187
- const downloaded = await downloadMediaFromUrl(link.thumbUrl);
188
- const uploaded = await uploadMedia(account.corpId, account.appSecret, "image", downloaded.buffer, downloaded.filename);
189
- thumbMediaId = uploaded.media_id;
298
+ thumbMediaId = await resolveThumbMediaId(link.thumbUrl, account.corpId, account.appSecret);
190
299
  }
191
300
  if (!thumbMediaId) {
192
- throw new Error("[wechat-kf] sendPayload link requires thumb_media_id or thumbUrl");
301
+ throw new Error(`${logTag()} sendPayload link requires thumb_media_id or thumbUrl`);
193
302
  }
194
303
  try {
195
304
  const result = await sendLinkMessage(account.corpId, account.appSecret, externalUserId, openKfId, {
@@ -203,13 +312,92 @@ export const wechatKfOutbound = {
203
312
  const textContent = (text ?? payload.text);
204
313
  await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, formatText(textContent));
205
314
  }
206
- return { channel: "wechat-kf", messageId: result.msgid, chatId: to };
315
+ return { channel: CHANNEL_ID, messageId: result.msgid, chatId: to };
316
+ }
317
+ catch (err) {
318
+ warnSessionLimit(err, externalUserId, openKfId);
319
+ throw err;
320
+ }
321
+ }
322
+ const location = wechatKf?.location;
323
+ if (location) {
324
+ try {
325
+ const result = await sendLocationMessage(account.corpId, account.appSecret, externalUserId, openKfId, location);
326
+ if ((text ?? payload.text)?.trim()) {
327
+ await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, formatText((text ?? payload.text)));
328
+ }
329
+ return { channel: CHANNEL_ID, messageId: result.msgid, chatId: to };
330
+ }
331
+ catch (err) {
332
+ warnSessionLimit(err, externalUserId, openKfId);
333
+ throw err;
334
+ }
335
+ }
336
+ const miniprogram = wechatKf?.miniprogram;
337
+ if (miniprogram) {
338
+ let thumbMediaId = miniprogram.thumb_media_id;
339
+ if (!thumbMediaId && miniprogram.thumbUrl) {
340
+ thumbMediaId = await resolveThumbMediaId(miniprogram.thumbUrl, account.corpId, account.appSecret);
341
+ }
342
+ if (!thumbMediaId) {
343
+ throw new Error(`${logTag()} sendPayload miniprogram requires thumb_media_id or thumbUrl`);
344
+ }
345
+ try {
346
+ const result = await sendMiniprogramMessage(account.corpId, account.appSecret, externalUserId, openKfId, {
347
+ appid: miniprogram.appid,
348
+ title: miniprogram.title,
349
+ pagepath: miniprogram.pagepath,
350
+ thumb_media_id: thumbMediaId,
351
+ });
352
+ if ((text ?? payload.text)?.trim()) {
353
+ await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, formatText((text ?? payload.text)));
354
+ }
355
+ return { channel: CHANNEL_ID, messageId: result.msgid, chatId: to };
356
+ }
357
+ catch (err) {
358
+ warnSessionLimit(err, externalUserId, openKfId);
359
+ throw err;
360
+ }
361
+ }
362
+ const msgmenu = wechatKf?.msgmenu;
363
+ if (msgmenu) {
364
+ try {
365
+ const result = await sendMsgMenuMessage(account.corpId, account.appSecret, externalUserId, openKfId, msgmenu);
366
+ if ((text ?? payload.text)?.trim()) {
367
+ await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, formatText((text ?? payload.text)));
368
+ }
369
+ return { channel: CHANNEL_ID, messageId: result.msgid, chatId: to };
370
+ }
371
+ catch (err) {
372
+ warnSessionLimit(err, externalUserId, openKfId);
373
+ throw err;
374
+ }
375
+ }
376
+ const businessCard = wechatKf?.businessCard;
377
+ if (businessCard) {
378
+ try {
379
+ const result = await sendBusinessCardMessage(account.corpId, account.appSecret, externalUserId, openKfId, businessCard);
380
+ if ((text ?? payload.text)?.trim()) {
381
+ await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, formatText((text ?? payload.text)));
382
+ }
383
+ return { channel: CHANNEL_ID, messageId: result.msgid, chatId: to };
207
384
  }
208
385
  catch (err) {
209
- if (isSessionLimitError(err)) {
210
- console.error(`[wechat-kf] session limit exceeded (48h/5-msg) for user=${externalUserId} kf=${openKfId}. ` +
211
- `The customer must send a new message before more replies can be delivered.`);
386
+ warnSessionLimit(err, externalUserId, openKfId);
387
+ throw err;
388
+ }
389
+ }
390
+ const caLink = wechatKf?.caLink;
391
+ if (caLink) {
392
+ try {
393
+ const result = await sendCaLinkMessage(account.corpId, account.appSecret, externalUserId, openKfId, caLink);
394
+ if ((text ?? payload.text)?.trim()) {
395
+ await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, formatText((text ?? payload.text)));
212
396
  }
397
+ return { channel: CHANNEL_ID, messageId: result.msgid, chatId: to };
398
+ }
399
+ catch (err) {
400
+ warnSessionLimit(err, externalUserId, openKfId);
213
401
  throw err;
214
402
  }
215
403
  }
@@ -218,17 +406,14 @@ export const wechatKfOutbound = {
218
406
  if (textContent.trim()) {
219
407
  try {
220
408
  const result = await sendTextMessage(account.corpId, account.appSecret, externalUserId, openKfId, formatText(textContent));
221
- return { channel: "wechat-kf", messageId: result.msgid, chatId: to };
409
+ return { channel: CHANNEL_ID, messageId: result.msgid, chatId: to };
222
410
  }
223
411
  catch (err) {
224
- if (isSessionLimitError(err)) {
225
- console.error(`[wechat-kf] session limit exceeded (48h/5-msg) for user=${externalUserId} kf=${openKfId}. ` +
226
- `The customer must send a new message before more replies can be delivered.`);
227
- }
412
+ warnSessionLimit(err, externalUserId, openKfId);
228
413
  throw err;
229
414
  }
230
415
  }
231
- return { channel: "wechat-kf", messageId: "", chatId: to };
416
+ return { channel: CHANNEL_ID, messageId: "", chatId: to };
232
417
  },
233
418
  };
234
419
  //# sourceMappingURL=outbound.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../src/outbound.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../src/outbound.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@
18
18
  *
19
19
  * accountId = openKfId (dynamically discovered)
20
20
  */
21
- import type { OpenClawConfig } from "./types.js";
21
+ import type { OpenClawConfig, PluginRuntime } from "openclaw/plugin-sdk";
22
22
  /** Minimal runtime shape used only for error logging in the reply dispatcher. */
23
23
  type RuntimeErrorLogger = {
24
24
  error?: (...args: unknown[]) => void;
@@ -32,9 +32,5 @@ export type CreateReplyDispatcherParams = {
32
32
  openKfId: string;
33
33
  accountId: string;
34
34
  };
35
- export declare function createReplyDispatcher(params: CreateReplyDispatcherParams): {
36
- dispatcher: unknown;
37
- replyOptions: unknown;
38
- markDispatchIdle: (() => void) | undefined;
39
- };
35
+ export declare function createReplyDispatcher(params: CreateReplyDispatcherParams): ReturnType<PluginRuntime["channel"]["reply"]["createReplyDispatcherWithTyping"]>;
40
36
  export {};