@yaoqi10012/wechat-kf 0.3.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.
- package/LICENSE +21 -0
- package/dist/accounts.d.ts +38 -0
- package/dist/accounts.js +247 -0
- package/dist/accounts.js.map +1 -0
- package/dist/api.d.ts +58 -0
- package/dist/api.js +200 -0
- package/dist/api.js.map +1 -0
- package/dist/bot.d.ts +37 -0
- package/dist/bot.js +672 -0
- package/dist/bot.js.map +1 -0
- package/dist/channel.d.ts +14 -0
- package/dist/channel.js +320 -0
- package/dist/channel.js.map +1 -0
- package/dist/config-schema.d.ts +56 -0
- package/dist/config-schema.js +39 -0
- package/dist/config-schema.js.map +1 -0
- package/dist/constants.d.ts +41 -0
- package/dist/constants.js +51 -0
- package/dist/constants.js.map +1 -0
- package/dist/crypto.d.ts +18 -0
- package/dist/crypto.js +81 -0
- package/dist/crypto.js.map +1 -0
- package/dist/fs-utils.d.ts +7 -0
- package/dist/fs-utils.js +13 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/monitor.d.ts +31 -0
- package/dist/monitor.js +80 -0
- package/dist/monitor.js.map +1 -0
- package/dist/outbound.d.ts +32 -0
- package/dist/outbound.js +411 -0
- package/dist/outbound.js.map +1 -0
- package/dist/reply-dispatcher.d.ts +36 -0
- package/dist/reply-dispatcher.js +216 -0
- package/dist/reply-dispatcher.js.map +1 -0
- package/dist/runtime.d.ts +12 -0
- package/dist/runtime.js +23 -0
- package/dist/runtime.js.map +1 -0
- package/dist/send-utils.d.ts +52 -0
- package/dist/send-utils.js +217 -0
- package/dist/send-utils.js.map +1 -0
- package/dist/token.d.ts +8 -0
- package/dist/token.js +61 -0
- package/dist/token.js.map +1 -0
- package/dist/types.d.ts +236 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/unicode-format.d.ts +26 -0
- package/dist/unicode-format.js +157 -0
- package/dist/unicode-format.js.map +1 -0
- package/dist/webhook.d.ts +22 -0
- package/dist/webhook.js +148 -0
- package/dist/webhook.js.map +1 -0
- package/dist/wechat-kf-directives.d.ts +157 -0
- package/dist/wechat-kf-directives.js +576 -0
- package/dist/wechat-kf-directives.js.map +1 -0
- package/openclaw.plugin.json +31 -0
- package/package.json +92 -0
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WeChat KF directive parser
|
|
3
|
+
*
|
|
4
|
+
* Parses [[wechat_*: ...]] directives embedded in agent text replies.
|
|
5
|
+
* The framework doesn't recognize these directives, so the text arrives
|
|
6
|
+
* intact for plugin-level interception.
|
|
7
|
+
*
|
|
8
|
+
* Supported directives:
|
|
9
|
+
* [[wechat_link: title | desc | url | thumbUrl]]
|
|
10
|
+
* [[wechat_location: name | address | lat | lng]]
|
|
11
|
+
* [[wechat_miniprogram: appid | title | pagepath | thumbUrl]]
|
|
12
|
+
* [[wechat_menu: header | Option1, Option2, Option3 | footer]]
|
|
13
|
+
* [[wechat_business_card: USERID]]
|
|
14
|
+
* [[wechat_ca_link: https://work.weixin.qq.com/ca/...]]
|
|
15
|
+
*/
|
|
16
|
+
const DIRECTIVE_END = "]]";
|
|
17
|
+
/**
|
|
18
|
+
* Scan text left-to-right and collect ranges that should be treated as
|
|
19
|
+
* "protected" — i.e. directive syntax inside them must be ignored.
|
|
20
|
+
*
|
|
21
|
+
* Three zone types (checked in priority order):
|
|
22
|
+
* 1. Fenced code blocks (``` or ~~~, with optional 0-3 leading spaces + lang tag)
|
|
23
|
+
* 2. Inline code spans (backtick sequences, matching equal-length closer)
|
|
24
|
+
* 3. Blockquote lines (line starting with optional whitespace + `>`)
|
|
25
|
+
*/
|
|
26
|
+
export function findProtectedRanges(text) {
|
|
27
|
+
const ranges = [];
|
|
28
|
+
let i = 0;
|
|
29
|
+
const len = text.length;
|
|
30
|
+
// Helper: are we at the start of a line (i === 0 or text[i-1] === '\n')?
|
|
31
|
+
const atLineStart = (pos) => pos === 0 || text[pos - 1] === "\n";
|
|
32
|
+
while (i < len) {
|
|
33
|
+
// ── 1. Fenced code block ──
|
|
34
|
+
// Must be at line start; 0-3 leading spaces allowed before ``` or ~~~
|
|
35
|
+
if (atLineStart(i)) {
|
|
36
|
+
let spaces = 0;
|
|
37
|
+
let si = i;
|
|
38
|
+
while (si < len && text[si] === " " && spaces < 4) {
|
|
39
|
+
spaces++;
|
|
40
|
+
si++;
|
|
41
|
+
}
|
|
42
|
+
if (spaces < 4 && si < len) {
|
|
43
|
+
const fenceChar = text[si];
|
|
44
|
+
if (fenceChar === "`" || fenceChar === "~") {
|
|
45
|
+
let fenceLen = 0;
|
|
46
|
+
const fenceStart = si;
|
|
47
|
+
while (si < len && text[si] === fenceChar) {
|
|
48
|
+
fenceLen++;
|
|
49
|
+
si++;
|
|
50
|
+
}
|
|
51
|
+
if (fenceLen >= 3) {
|
|
52
|
+
// Skip optional language tag — rest of the opening line
|
|
53
|
+
while (si < len && text[si] !== "\n")
|
|
54
|
+
si++;
|
|
55
|
+
if (si < len)
|
|
56
|
+
si++; // skip the \n
|
|
57
|
+
// Find closing fence: same char, >= same length, at line start with 0-3 spaces
|
|
58
|
+
const blockStart = i;
|
|
59
|
+
let closed = false;
|
|
60
|
+
while (si < len) {
|
|
61
|
+
if (atLineStart(si)) {
|
|
62
|
+
let cs = 0;
|
|
63
|
+
let ci = si;
|
|
64
|
+
while (ci < len && text[ci] === " " && cs < 4) {
|
|
65
|
+
cs++;
|
|
66
|
+
ci++;
|
|
67
|
+
}
|
|
68
|
+
if (cs < 4 && ci < len && text[ci] === fenceChar) {
|
|
69
|
+
let cl = 0;
|
|
70
|
+
while (ci < len && text[ci] === fenceChar) {
|
|
71
|
+
cl++;
|
|
72
|
+
ci++;
|
|
73
|
+
}
|
|
74
|
+
// Closing fence: >= opening length, rest of line is only whitespace
|
|
75
|
+
if (cl >= fenceLen) {
|
|
76
|
+
let trailing = true;
|
|
77
|
+
while (ci < len && text[ci] !== "\n") {
|
|
78
|
+
if (text[ci] !== " " && text[ci] !== "\t") {
|
|
79
|
+
trailing = false;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
ci++;
|
|
83
|
+
}
|
|
84
|
+
if (trailing) {
|
|
85
|
+
// Include the closing fence line
|
|
86
|
+
if (ci < len)
|
|
87
|
+
ci++; // include \n
|
|
88
|
+
ranges.push({ start: blockStart, end: ci });
|
|
89
|
+
i = ci;
|
|
90
|
+
closed = true;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Advance to next line
|
|
97
|
+
while (si < len && text[si] !== "\n")
|
|
98
|
+
si++;
|
|
99
|
+
if (si < len)
|
|
100
|
+
si++;
|
|
101
|
+
}
|
|
102
|
+
if (!closed) {
|
|
103
|
+
// Unclosed fenced block → protect to end
|
|
104
|
+
ranges.push({ start: blockStart, end: len });
|
|
105
|
+
i = len;
|
|
106
|
+
}
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
// Less than 3 fence chars — not a fenced block, fall through
|
|
110
|
+
i = fenceStart; // reset to the fence char position for further checks
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// ── 3. Blockquote line (checked at line start, after fenced block check) ──
|
|
114
|
+
// Leading spaces/tabs + `>`
|
|
115
|
+
let qi = i;
|
|
116
|
+
while (qi < len && (text[qi] === " " || text[qi] === "\t"))
|
|
117
|
+
qi++;
|
|
118
|
+
if (qi < len && text[qi] === ">") {
|
|
119
|
+
const lineStart = i;
|
|
120
|
+
// Protect entire line
|
|
121
|
+
let lineEnd = qi + 1;
|
|
122
|
+
while (lineEnd < len && text[lineEnd] !== "\n")
|
|
123
|
+
lineEnd++;
|
|
124
|
+
if (lineEnd < len)
|
|
125
|
+
lineEnd++; // include \n
|
|
126
|
+
ranges.push({ start: lineStart, end: lineEnd });
|
|
127
|
+
i = lineEnd;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// ── 2. Inline code span ──
|
|
132
|
+
if (text[i] === "`") {
|
|
133
|
+
// Count opening backticks
|
|
134
|
+
let openLen = 0;
|
|
135
|
+
const spanStart = i;
|
|
136
|
+
while (i < len && text[i] === "`") {
|
|
137
|
+
openLen++;
|
|
138
|
+
i++;
|
|
139
|
+
}
|
|
140
|
+
// Search for matching equal-length closing backtick sequence
|
|
141
|
+
let found = false;
|
|
142
|
+
while (i < len) {
|
|
143
|
+
if (text[i] === "`") {
|
|
144
|
+
let closeLen = 0;
|
|
145
|
+
while (i < len && text[i] === "`") {
|
|
146
|
+
closeLen++;
|
|
147
|
+
i++;
|
|
148
|
+
}
|
|
149
|
+
if (closeLen === openLen) {
|
|
150
|
+
ranges.push({ start: spanStart, end: i });
|
|
151
|
+
found = true;
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
// Not matching length — continue searching
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
i++;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (!found) {
|
|
161
|
+
// Unclosed inline code → not protected (CommonMark behavior)
|
|
162
|
+
i = spanStart + openLen;
|
|
163
|
+
}
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
i++;
|
|
167
|
+
}
|
|
168
|
+
return ranges;
|
|
169
|
+
}
|
|
170
|
+
function isProtected(position, ranges) {
|
|
171
|
+
for (const r of ranges) {
|
|
172
|
+
if (r.start > position)
|
|
173
|
+
return false; // early break — ranges are sorted
|
|
174
|
+
if (position >= r.start && position < r.end)
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
// ── Generic directive finder ──
|
|
180
|
+
function findDirective(text, prefix, protectedRanges) {
|
|
181
|
+
const lower = text.toLowerCase();
|
|
182
|
+
const ranges = protectedRanges ?? findProtectedRanges(text);
|
|
183
|
+
let searchFrom = 0;
|
|
184
|
+
while (searchFrom < lower.length) {
|
|
185
|
+
const startIdx = lower.indexOf(prefix, searchFrom);
|
|
186
|
+
if (startIdx === -1)
|
|
187
|
+
return null;
|
|
188
|
+
const contentStart = startIdx + prefix.length;
|
|
189
|
+
const endIdx = lower.indexOf(DIRECTIVE_END, contentStart);
|
|
190
|
+
if (endIdx === -1)
|
|
191
|
+
return null;
|
|
192
|
+
if (isProtected(startIdx, ranges)) {
|
|
193
|
+
searchFrom = endIdx + DIRECTIVE_END.length;
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
return { inner: text.slice(contentStart, endIdx), startIdx, endIdx };
|
|
197
|
+
}
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
function stripDirective(text, startIdx, endIdx) {
|
|
201
|
+
return (text.slice(0, startIdx) + text.slice(endIdx + DIRECTIVE_END.length)).replace(/\n{3,}/g, "\n\n").trim();
|
|
202
|
+
}
|
|
203
|
+
function isValidUrl(url) {
|
|
204
|
+
return url.startsWith("http://") || url.startsWith("https://");
|
|
205
|
+
}
|
|
206
|
+
// ── Link directive (unchanged API) ──
|
|
207
|
+
const LINK_PREFIX = "[[wechat_link:";
|
|
208
|
+
/**
|
|
209
|
+
* Quick check whether text contains a `[[wechat_link:...]]` directive
|
|
210
|
+
* outside of markdown code blocks, inline code, and blockquotes.
|
|
211
|
+
*/
|
|
212
|
+
export function hasWechatLinkDirective(text) {
|
|
213
|
+
return findDirective(text, LINK_PREFIX) !== null;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Extract the first `[[wechat_link:...]]` directive from text.
|
|
217
|
+
*
|
|
218
|
+
* Returns the remaining text (with directive stripped and trimmed)
|
|
219
|
+
* plus the parsed link fields. If parsing fails (e.g. invalid URL),
|
|
220
|
+
* returns the original text unchanged with no link.
|
|
221
|
+
*/
|
|
222
|
+
export function parseWechatLinkDirective(text, protectedRanges) {
|
|
223
|
+
const found = findDirective(text, LINK_PREFIX, protectedRanges);
|
|
224
|
+
if (!found)
|
|
225
|
+
return { text };
|
|
226
|
+
const parts = found.inner.split("|").map((s) => s.trim());
|
|
227
|
+
let link;
|
|
228
|
+
if (parts.length === 2) {
|
|
229
|
+
const [title, url] = parts;
|
|
230
|
+
if (isValidUrl(url)) {
|
|
231
|
+
link = { title, url };
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
else if (parts.length === 3) {
|
|
235
|
+
const [title, desc, url] = parts;
|
|
236
|
+
if (isValidUrl(url)) {
|
|
237
|
+
link = { title, desc, url };
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else if (parts.length >= 4) {
|
|
241
|
+
const [title, desc, url, thumbUrl] = parts;
|
|
242
|
+
if (isValidUrl(url)) {
|
|
243
|
+
link = { title, desc, url, thumbUrl: thumbUrl || undefined };
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (!link)
|
|
247
|
+
return { text };
|
|
248
|
+
return { text: stripDirective(text, found.startIdx, found.endIdx), link };
|
|
249
|
+
}
|
|
250
|
+
// ── Location directive ──
|
|
251
|
+
const LOCATION_PREFIX = "[[wechat_location:";
|
|
252
|
+
export function parseWechatLocationDirective(text, protectedRanges) {
|
|
253
|
+
const found = findDirective(text, LOCATION_PREFIX, protectedRanges);
|
|
254
|
+
if (!found)
|
|
255
|
+
return { text };
|
|
256
|
+
const parts = found.inner.split("|").map((s) => s.trim());
|
|
257
|
+
// 3 fields: name | lat | lng
|
|
258
|
+
// 4 fields: name | address | lat | lng
|
|
259
|
+
if (parts.length === 3) {
|
|
260
|
+
const [name, latStr, lngStr] = parts;
|
|
261
|
+
const latitude = Number(latStr);
|
|
262
|
+
const longitude = Number(lngStr);
|
|
263
|
+
if (name && !Number.isNaN(latitude) && !Number.isNaN(longitude)) {
|
|
264
|
+
return {
|
|
265
|
+
text: stripDirective(text, found.startIdx, found.endIdx),
|
|
266
|
+
location: { name, latitude, longitude },
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
else if (parts.length >= 4) {
|
|
271
|
+
const [name, address, latStr, lngStr] = parts;
|
|
272
|
+
const latitude = Number(latStr);
|
|
273
|
+
const longitude = Number(lngStr);
|
|
274
|
+
if (name && !Number.isNaN(latitude) && !Number.isNaN(longitude)) {
|
|
275
|
+
return {
|
|
276
|
+
text: stripDirective(text, found.startIdx, found.endIdx),
|
|
277
|
+
location: { name, address: address || undefined, latitude, longitude },
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return { text };
|
|
282
|
+
}
|
|
283
|
+
// ── Miniprogram directive ──
|
|
284
|
+
const MINIPROGRAM_PREFIX = "[[wechat_miniprogram:";
|
|
285
|
+
export function parseWechatMiniprogramDirective(text, protectedRanges) {
|
|
286
|
+
const found = findDirective(text, MINIPROGRAM_PREFIX, protectedRanges);
|
|
287
|
+
if (!found)
|
|
288
|
+
return { text };
|
|
289
|
+
const parts = found.inner.split("|").map((s) => s.trim());
|
|
290
|
+
// 3 fields: appid | title | pagepath
|
|
291
|
+
// 4 fields: appid | title | pagepath | thumbUrl
|
|
292
|
+
if (parts.length === 3) {
|
|
293
|
+
const [appid, title, pagepath] = parts;
|
|
294
|
+
if (appid && title && pagepath) {
|
|
295
|
+
return {
|
|
296
|
+
text: stripDirective(text, found.startIdx, found.endIdx),
|
|
297
|
+
miniprogram: { appid, title, pagepath },
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
else if (parts.length >= 4) {
|
|
302
|
+
const [appid, title, pagepath, thumbUrl] = parts;
|
|
303
|
+
if (appid && title && pagepath) {
|
|
304
|
+
return {
|
|
305
|
+
text: stripDirective(text, found.startIdx, found.endIdx),
|
|
306
|
+
miniprogram: { appid, title, pagepath, thumbUrl: thumbUrl || undefined },
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return { text };
|
|
311
|
+
}
|
|
312
|
+
// ── Menu directive ──
|
|
313
|
+
const MENU_PREFIX = "[[wechat_menu:";
|
|
314
|
+
/**
|
|
315
|
+
* Split a string on commas, but ignore commas inside parentheses.
|
|
316
|
+
* E.g. `"满意, view(https://example.com, 查看)"` → `["满意", "view(https://example.com, 查看)"]`
|
|
317
|
+
*/
|
|
318
|
+
function splitCommaOutsideParens(input) {
|
|
319
|
+
const parts = [];
|
|
320
|
+
let depth = 0;
|
|
321
|
+
let start = 0;
|
|
322
|
+
for (let i = 0; i < input.length; i++) {
|
|
323
|
+
const ch = input[i];
|
|
324
|
+
if (ch === "(")
|
|
325
|
+
depth++;
|
|
326
|
+
else if (ch === ")")
|
|
327
|
+
depth = Math.max(0, depth - 1);
|
|
328
|
+
else if (ch === "," && depth === 0) {
|
|
329
|
+
parts.push(input.slice(start, i));
|
|
330
|
+
start = i + 1;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
parts.push(input.slice(start));
|
|
334
|
+
return parts;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Parse a single menu item from directive syntax.
|
|
338
|
+
*
|
|
339
|
+
* Supported forms:
|
|
340
|
+
* `满意` → click (auto ID)
|
|
341
|
+
* `click(id, content)` → click with explicit ID
|
|
342
|
+
* `view(url, content)` → URL link
|
|
343
|
+
* `mini(appid, pagepath, content)` → mini program
|
|
344
|
+
* `text(content)` → plain text row
|
|
345
|
+
* `text(content, noline)` → plain text without newline
|
|
346
|
+
*/
|
|
347
|
+
function parseMenuItemDirective(raw) {
|
|
348
|
+
const trimmed = raw.trim();
|
|
349
|
+
if (!trimmed)
|
|
350
|
+
return null;
|
|
351
|
+
// Try typed syntax: type(args...)
|
|
352
|
+
const match = trimmed.match(/^(\w+)\((.+)\)$/s);
|
|
353
|
+
if (match) {
|
|
354
|
+
const typeName = match[1].toLowerCase();
|
|
355
|
+
const argsStr = match[2];
|
|
356
|
+
// Split args on commas (no nested parens expected inside)
|
|
357
|
+
const args = argsStr.split(",").map((s) => s.trim());
|
|
358
|
+
switch (typeName) {
|
|
359
|
+
case "click": {
|
|
360
|
+
// click(id, content)
|
|
361
|
+
if (args.length >= 2) {
|
|
362
|
+
return { type: "click", id: args[0], content: args.slice(1).join(", ") };
|
|
363
|
+
}
|
|
364
|
+
// click(content) — treated as click with no explicit id
|
|
365
|
+
if (args.length === 1 && args[0]) {
|
|
366
|
+
return { type: "click", content: args[0] };
|
|
367
|
+
}
|
|
368
|
+
return null;
|
|
369
|
+
}
|
|
370
|
+
case "view": {
|
|
371
|
+
// view(url, content)
|
|
372
|
+
if (args.length >= 2 && args[0]) {
|
|
373
|
+
return { type: "view", url: args[0], content: args.slice(1).join(", ") };
|
|
374
|
+
}
|
|
375
|
+
return null;
|
|
376
|
+
}
|
|
377
|
+
case "mini": {
|
|
378
|
+
// mini(appid, pagepath, content)
|
|
379
|
+
if (args.length >= 3 && args[0] && args[1]) {
|
|
380
|
+
return { type: "miniprogram", appid: args[0], pagepath: args[1], content: args.slice(2).join(", ") };
|
|
381
|
+
}
|
|
382
|
+
return null;
|
|
383
|
+
}
|
|
384
|
+
case "text": {
|
|
385
|
+
// text(content) or text(content, noline)
|
|
386
|
+
if (args.length >= 1 && args[0]) {
|
|
387
|
+
const noNewline = args.length >= 2 && args[args.length - 1].toLowerCase() === "noline";
|
|
388
|
+
const content = noNewline ? args.slice(0, -1).join(", ") : args.join(", ");
|
|
389
|
+
return { type: "text", content, ...(noNewline ? { noNewline: true } : {}) };
|
|
390
|
+
}
|
|
391
|
+
return null;
|
|
392
|
+
}
|
|
393
|
+
default:
|
|
394
|
+
// Unknown type — treat as plain click text (entire raw string)
|
|
395
|
+
return { type: "click", content: trimmed };
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
// Plain text → click item (auto ID assigned later)
|
|
399
|
+
return { type: "click", content: trimmed };
|
|
400
|
+
}
|
|
401
|
+
export function parseWechatMenuDirective(text, protectedRanges) {
|
|
402
|
+
const found = findDirective(text, MENU_PREFIX, protectedRanges);
|
|
403
|
+
if (!found)
|
|
404
|
+
return { text };
|
|
405
|
+
const parts = found.inner.split("|").map((s) => s.trim());
|
|
406
|
+
// 1 field: Option1, Option2 (items only — no header/footer)
|
|
407
|
+
// 2 fields: header | Option1, Option2
|
|
408
|
+
// 3 fields: header | Option1, Option2 | footer
|
|
409
|
+
let headContent;
|
|
410
|
+
let itemsStr;
|
|
411
|
+
let tailContent;
|
|
412
|
+
if (parts.length === 1) {
|
|
413
|
+
itemsStr = parts[0];
|
|
414
|
+
}
|
|
415
|
+
else if (parts.length === 2) {
|
|
416
|
+
headContent = parts[0] || undefined;
|
|
417
|
+
itemsStr = parts[1];
|
|
418
|
+
}
|
|
419
|
+
else if (parts.length >= 3) {
|
|
420
|
+
headContent = parts[0] || undefined;
|
|
421
|
+
itemsStr = parts[1];
|
|
422
|
+
tailContent = parts[2] || undefined;
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
return { text };
|
|
426
|
+
}
|
|
427
|
+
const rawItems = splitCommaOutsideParens(itemsStr);
|
|
428
|
+
const items = [];
|
|
429
|
+
for (const raw of rawItems) {
|
|
430
|
+
const parsed = parseMenuItemDirective(raw);
|
|
431
|
+
if (parsed)
|
|
432
|
+
items.push(parsed);
|
|
433
|
+
}
|
|
434
|
+
if (items.length === 0)
|
|
435
|
+
return { text };
|
|
436
|
+
return {
|
|
437
|
+
text: stripDirective(text, found.startIdx, found.endIdx),
|
|
438
|
+
menu: { headContent, items, tailContent },
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Convert a parsed WechatMenuDirective into the API `msgmenu` payload.
|
|
443
|
+
*
|
|
444
|
+
* Click items get auto-incrementing IDs (only among click items that lack
|
|
445
|
+
* an explicit `id`). Explicit IDs are preserved as-is.
|
|
446
|
+
*/
|
|
447
|
+
export function buildMsgMenuPayload(menu) {
|
|
448
|
+
let clickAutoId = 0;
|
|
449
|
+
const list = menu.items.map((item) => {
|
|
450
|
+
switch (item.type) {
|
|
451
|
+
case "click": {
|
|
452
|
+
clickAutoId++;
|
|
453
|
+
return { type: "click", click: { id: item.id ?? String(clickAutoId), content: item.content } };
|
|
454
|
+
}
|
|
455
|
+
case "view":
|
|
456
|
+
return { type: "view", view: { url: item.url, content: item.content } };
|
|
457
|
+
case "miniprogram":
|
|
458
|
+
return {
|
|
459
|
+
type: "miniprogram",
|
|
460
|
+
miniprogram: { appid: item.appid, pagepath: item.pagepath, content: item.content },
|
|
461
|
+
};
|
|
462
|
+
default:
|
|
463
|
+
return {
|
|
464
|
+
type: "text",
|
|
465
|
+
text: { content: item.content, ...(item.noNewline ? { no_newline: 1 } : {}) },
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
return {
|
|
470
|
+
head_content: menu.headContent,
|
|
471
|
+
list,
|
|
472
|
+
tail_content: menu.tailContent,
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
// ── Business card directive ──
|
|
476
|
+
const BUSINESS_CARD_PREFIX = "[[wechat_business_card:";
|
|
477
|
+
export function parseWechatBusinessCardDirective(text, protectedRanges) {
|
|
478
|
+
const found = findDirective(text, BUSINESS_CARD_PREFIX, protectedRanges);
|
|
479
|
+
if (!found)
|
|
480
|
+
return { text };
|
|
481
|
+
const userid = found.inner.trim();
|
|
482
|
+
if (!userid)
|
|
483
|
+
return { text };
|
|
484
|
+
return {
|
|
485
|
+
text: stripDirective(text, found.startIdx, found.endIdx),
|
|
486
|
+
businessCard: { userid },
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
// ── CA link directive ──
|
|
490
|
+
const CA_LINK_PREFIX = "[[wechat_ca_link:";
|
|
491
|
+
export function parseWechatCaLinkDirective(text, protectedRanges) {
|
|
492
|
+
const found = findDirective(text, CA_LINK_PREFIX, protectedRanges);
|
|
493
|
+
if (!found)
|
|
494
|
+
return { text };
|
|
495
|
+
const link_url = found.inner.trim();
|
|
496
|
+
if (!link_url || !isValidUrl(link_url))
|
|
497
|
+
return { text };
|
|
498
|
+
return {
|
|
499
|
+
text: stripDirective(text, found.startIdx, found.endIdx),
|
|
500
|
+
caLink: { link_url },
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
// ── Raw message directive ──
|
|
504
|
+
const RAW_PREFIX = "[[wechat_raw:";
|
|
505
|
+
export function parseWechatRawDirective(text, protectedRanges) {
|
|
506
|
+
const found = findDirective(text, RAW_PREFIX, protectedRanges);
|
|
507
|
+
if (!found)
|
|
508
|
+
return { text };
|
|
509
|
+
const jsonStr = found.inner.trim();
|
|
510
|
+
if (!jsonStr)
|
|
511
|
+
return { text };
|
|
512
|
+
try {
|
|
513
|
+
const parsed = JSON.parse(jsonStr);
|
|
514
|
+
const msgtype = parsed.msgtype;
|
|
515
|
+
if (typeof msgtype !== "string" || !msgtype)
|
|
516
|
+
return { text };
|
|
517
|
+
const { msgtype: _, ...payload } = parsed;
|
|
518
|
+
return {
|
|
519
|
+
text: stripDirective(text, found.startIdx, found.endIdx),
|
|
520
|
+
raw: { msgtype, payload },
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
catch {
|
|
524
|
+
return { text }; // invalid JSON → treat as plain text
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
// ── Unified parser ──
|
|
528
|
+
const ALL_PREFIXES = [
|
|
529
|
+
LINK_PREFIX,
|
|
530
|
+
LOCATION_PREFIX,
|
|
531
|
+
MINIPROGRAM_PREFIX,
|
|
532
|
+
MENU_PREFIX,
|
|
533
|
+
BUSINESS_CARD_PREFIX,
|
|
534
|
+
CA_LINK_PREFIX,
|
|
535
|
+
RAW_PREFIX,
|
|
536
|
+
];
|
|
537
|
+
/**
|
|
538
|
+
* Quick check whether text contains any `[[wechat_*:...]]` directive
|
|
539
|
+
* outside of markdown code blocks, inline code, and blockquotes.
|
|
540
|
+
*/
|
|
541
|
+
export function hasWechatDirective(text) {
|
|
542
|
+
const ranges = findProtectedRanges(text);
|
|
543
|
+
return ALL_PREFIXES.some((prefix) => findDirective(text, prefix, ranges) !== null);
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* Parse the first matching directive from text.
|
|
547
|
+
* Tries parsers in order: link → location → miniprogram → menu → business_card → ca_link → raw.
|
|
548
|
+
* Returns the first successful parse result.
|
|
549
|
+
* Directives inside markdown code blocks, inline code, or blockquotes are ignored.
|
|
550
|
+
*/
|
|
551
|
+
export function parseWechatDirective(text) {
|
|
552
|
+
const protectedRanges = findProtectedRanges(text);
|
|
553
|
+
const parsers = [
|
|
554
|
+
parseWechatLinkDirective,
|
|
555
|
+
parseWechatLocationDirective,
|
|
556
|
+
parseWechatMiniprogramDirective,
|
|
557
|
+
parseWechatMenuDirective,
|
|
558
|
+
parseWechatBusinessCardDirective,
|
|
559
|
+
parseWechatCaLinkDirective,
|
|
560
|
+
parseWechatRawDirective,
|
|
561
|
+
];
|
|
562
|
+
for (const parser of parsers) {
|
|
563
|
+
const result = parser(text, protectedRanges);
|
|
564
|
+
if (result.link ||
|
|
565
|
+
result.location ||
|
|
566
|
+
result.miniprogram ||
|
|
567
|
+
result.menu ||
|
|
568
|
+
result.businessCard ||
|
|
569
|
+
result.caLink ||
|
|
570
|
+
result.raw) {
|
|
571
|
+
return result;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
return { text };
|
|
575
|
+
}
|
|
576
|
+
//# sourceMappingURL=wechat-kf-directives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wechat-kf-directives.js","sourceRoot":"","sources":["../src/wechat-kf-directives.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "wechat-kf",
|
|
3
|
+
"name": "WeChat Customer Service",
|
|
4
|
+
"description": "OpenClaw channel plugin for WeChat Customer Service (企业微信客服) via WeCom KF API",
|
|
5
|
+
"version": "0.3.1",
|
|
6
|
+
"channels": ["wechat-kf"],
|
|
7
|
+
"configSchema": {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"enabled": { "type": "boolean" },
|
|
11
|
+
"corpId": { "type": "string", "description": "WeCom Corp ID (企业ID)" },
|
|
12
|
+
"appSecret": { "type": "string", "description": "Self-built app secret (应用密钥)" },
|
|
13
|
+
"token": { "type": "string", "description": "Webhook callback token" },
|
|
14
|
+
"encodingAESKey": { "type": "string", "description": "43-character base64 AES key", "minLength": 43, "maxLength": 43 },
|
|
15
|
+
"webhookPath": { "type": "string", "default": "/wechat-kf" },
|
|
16
|
+
"dmPolicy": { "type": "string", "enum": ["open", "pairing", "allowlist", "disabled"], "default": "open" },
|
|
17
|
+
"allowFrom": { "type": "array", "items": { "type": "string" } },
|
|
18
|
+
"debounceMs": { "type": "number", "description": "Inbound message debounce window in milliseconds (0 = disabled)", "minimum": 0, "maximum": 10000 }
|
|
19
|
+
},
|
|
20
|
+
"uiHints": {
|
|
21
|
+
"corpId": { "label": "Corp ID", "placeholder": "ww0123456789abcdef" },
|
|
22
|
+
"appSecret": { "label": "App Secret", "placeholder": "Your WeCom app secret", "sensitive": true },
|
|
23
|
+
"token": { "label": "Callback Token", "placeholder": "Webhook verification token", "sensitive": true },
|
|
24
|
+
"encodingAESKey": { "label": "Encoding AES Key", "placeholder": "43-character base64 key", "sensitive": true },
|
|
25
|
+
"webhookPath": { "label": "Webhook Path", "placeholder": "/wechat-kf" },
|
|
26
|
+
"dmPolicy": { "label": "DM Policy", "placeholder": "open" },
|
|
27
|
+
"allowFrom": { "label": "Allowlist", "placeholder": "List of allowed external user IDs" },
|
|
28
|
+
"debounceMs": { "label": "Debounce (ms)", "placeholder": "2000" }
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|