ylib-wecom-openclaw-plugin 2026.4.29
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/README.md +596 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +99 -0
- package/dist/src/accounts.d.ts +57 -0
- package/dist/src/accounts.js +247 -0
- package/dist/src/agent/api-client.d.ts +95 -0
- package/dist/src/agent/api-client.js +425 -0
- package/dist/src/agent/handler.d.ts +64 -0
- package/dist/src/agent/handler.js +731 -0
- package/dist/src/agent/index.d.ts +5 -0
- package/dist/src/agent/index.js +21 -0
- package/dist/src/agent/webhook.d.ts +25 -0
- package/dist/src/agent/webhook.js +294 -0
- package/dist/src/agent/xml.d.ts +21 -0
- package/dist/src/agent/xml.js +43 -0
- package/dist/src/channel.d.ts +5 -0
- package/dist/src/channel.js +815 -0
- package/dist/src/chat-queue.d.ts +31 -0
- package/dist/src/chat-queue.js +53 -0
- package/dist/src/config-schema.d.ts +587 -0
- package/dist/src/config-schema.js +146 -0
- package/dist/src/const.d.ts +128 -0
- package/dist/src/const.js +168 -0
- package/dist/src/dm-policy.d.ts +29 -0
- package/dist/src/dm-policy.js +146 -0
- package/dist/src/dynamic-agent.d.ts +37 -0
- package/dist/src/dynamic-agent.js +67 -0
- package/dist/src/dynamic-routing.d.ts +65 -0
- package/dist/src/dynamic-routing.js +62 -0
- package/dist/src/endpoint-dispatch.d.ts +54 -0
- package/dist/src/endpoint-dispatch.js +967 -0
- package/dist/src/endpoint-event-adapter.d.ts +15 -0
- package/dist/src/endpoint-event-adapter.js +427 -0
- package/dist/src/group-policy.d.ts +30 -0
- package/dist/src/group-policy.js +126 -0
- package/dist/src/http.d.ts +27 -0
- package/dist/src/http.js +168 -0
- package/dist/src/im-runtime-telemetry.d.ts +25 -0
- package/dist/src/im-runtime-telemetry.js +68 -0
- package/dist/src/interface.d.ts +192 -0
- package/dist/src/interface.js +5 -0
- package/dist/src/markdown-chunk.d.ts +1 -0
- package/dist/src/markdown-chunk.js +396 -0
- package/dist/src/mcp/index.d.ts +6 -0
- package/dist/src/mcp/index.js +28 -0
- package/dist/src/mcp/interceptors/biz-error.d.ts +11 -0
- package/dist/src/mcp/interceptors/biz-error.js +73 -0
- package/dist/src/mcp/interceptors/doc-auth-error.d.ts +10 -0
- package/dist/src/mcp/interceptors/doc-auth-error.js +235 -0
- package/dist/src/mcp/interceptors/index.d.ts +35 -0
- package/dist/src/mcp/interceptors/index.js +143 -0
- package/dist/src/mcp/interceptors/msg-media.d.ts +11 -0
- package/dist/src/mcp/interceptors/msg-media.js +201 -0
- package/dist/src/mcp/interceptors/smartpage-create.d.ts +30 -0
- package/dist/src/mcp/interceptors/smartpage-create.js +252 -0
- package/dist/src/mcp/interceptors/smartpage-export.d.ts +17 -0
- package/dist/src/mcp/interceptors/smartpage-export.js +135 -0
- package/dist/src/mcp/interceptors/smartsheet-upload.d.ts +22 -0
- package/dist/src/mcp/interceptors/smartsheet-upload.js +388 -0
- package/dist/src/mcp/interceptors/types.d.ts +64 -0
- package/dist/src/mcp/interceptors/types.js +8 -0
- package/dist/src/mcp/schema.d.ts +11 -0
- package/dist/src/mcp/schema.js +115 -0
- package/dist/src/mcp/tool.d.ts +63 -0
- package/dist/src/mcp/tool.js +318 -0
- package/dist/src/mcp/transport.d.ts +94 -0
- package/dist/src/mcp/transport.js +702 -0
- package/dist/src/media-handler.d.ts +55 -0
- package/dist/src/media-handler.js +306 -0
- package/dist/src/media-uploader.d.ts +142 -0
- package/dist/src/media-uploader.js +446 -0
- package/dist/src/message-parser.d.ts +104 -0
- package/dist/src/message-parser.js +232 -0
- package/dist/src/message-sender.d.ts +54 -0
- package/dist/src/message-sender.js +210 -0
- package/dist/src/monitor.d.ts +69 -0
- package/dist/src/monitor.js +1846 -0
- package/dist/src/onboarding.d.ts +8 -0
- package/dist/src/onboarding.js +248 -0
- package/dist/src/openclaw-compat.d.ts +148 -0
- package/dist/src/openclaw-compat.js +839 -0
- package/dist/src/proactive-markdown-send.d.ts +14 -0
- package/dist/src/proactive-markdown-send.js +205 -0
- package/dist/src/reqid-store.d.ts +23 -0
- package/dist/src/reqid-store.js +136 -0
- package/dist/src/runtime.d.ts +2 -0
- package/dist/src/runtime.js +7 -0
- package/dist/src/shared/command-auth.d.ts +23 -0
- package/dist/src/shared/command-auth.js +112 -0
- package/dist/src/shared/xml-parser.d.ts +46 -0
- package/dist/src/shared/xml-parser.js +228 -0
- package/dist/src/state-dir-resolve.d.ts +2 -0
- package/dist/src/state-dir-resolve.js +33 -0
- package/dist/src/state-manager.d.ts +115 -0
- package/dist/src/state-manager.js +413 -0
- package/dist/src/target.d.ts +35 -0
- package/dist/src/target.js +71 -0
- package/dist/src/template-card-manager.d.ts +55 -0
- package/dist/src/template-card-manager.js +316 -0
- package/dist/src/template-card-parser.d.ts +37 -0
- package/dist/src/template-card-parser.js +672 -0
- package/dist/src/timeout.d.ts +20 -0
- package/dist/src/timeout.js +57 -0
- package/dist/src/types/account.d.ts +29 -0
- package/dist/src/types/account.js +5 -0
- package/dist/src/types/config.d.ts +98 -0
- package/dist/src/types/config.js +8 -0
- package/dist/src/types/constants.d.ts +42 -0
- package/dist/src/types/constants.js +45 -0
- package/dist/src/types/index.d.ts +7 -0
- package/dist/src/types/index.js +17 -0
- package/dist/src/types/message.d.ts +238 -0
- package/dist/src/types/message.js +6 -0
- package/dist/src/utils.d.ts +148 -0
- package/dist/src/utils.js +92 -0
- package/dist/src/version.d.ts +2 -0
- package/dist/src/version.js +28 -0
- package/dist/src/webhook/command-auth.d.ts +47 -0
- package/dist/src/webhook/command-auth.js +137 -0
- package/dist/src/webhook/gateway.d.ts +36 -0
- package/dist/src/webhook/gateway.js +297 -0
- package/dist/src/webhook/handler.d.ts +19 -0
- package/dist/src/webhook/handler.js +481 -0
- package/dist/src/webhook/helpers.d.ts +157 -0
- package/dist/src/webhook/helpers.js +936 -0
- package/dist/src/webhook/http.d.ts +27 -0
- package/dist/src/webhook/http.js +168 -0
- package/dist/src/webhook/index.d.ts +11 -0
- package/dist/src/webhook/index.js +43 -0
- package/dist/src/webhook/media.d.ts +30 -0
- package/dist/src/webhook/media.js +152 -0
- package/dist/src/webhook/monitor.d.ts +59 -0
- package/dist/src/webhook/monitor.js +1672 -0
- package/dist/src/webhook/state.d.ts +220 -0
- package/dist/src/webhook/state.js +568 -0
- package/dist/src/webhook/target.d.ts +41 -0
- package/dist/src/webhook/target.js +165 -0
- package/dist/src/webhook/types.d.ts +348 -0
- package/dist/src/webhook/types.js +36 -0
- package/dist/src/webhook/video-frame.d.ts +13 -0
- package/dist/src/webhook/video-frame.js +108 -0
- package/openclaw.plugin.json +19 -0
- package/package.json +96 -0
- package/schema.json +534 -0
- package/scripts/generate-schema.mjs +33 -0
- package/skills/wecom-contact/SKILL.md +162 -0
- package/skills/wecom-doc/SKILL.md +162 -0
- package/skills/wecom-doc/references/create-doc.md +56 -0
- package/skills/wecom-doc/references/edit-doc-content.md +68 -0
- package/skills/wecom-doc/references/get-doc-content.md +88 -0
- package/skills/wecom-doc/references/smartpage-create.md +125 -0
- package/skills/wecom-doc/references/smartpage-export.md +160 -0
- package/skills/wecom-meeting/SKILL.md +441 -0
- package/skills/wecom-meeting/references/example-full.md +30 -0
- package/skills/wecom-meeting/references/example-reminder.md +46 -0
- package/skills/wecom-meeting/references/example-security.md +22 -0
- package/skills/wecom-meeting/references/response-get-meeting-info.md +148 -0
- package/skills/wecom-msg/SKILL.md +157 -0
- package/skills/wecom-msg/references/api-get-messages.md +93 -0
- package/skills/wecom-msg/references/api-get-msg-chat-list.md +58 -0
- package/skills/wecom-msg/references/api-get-msg-media.md +44 -0
- package/skills/wecom-msg/references/api-send-message.md +39 -0
- package/skills/wecom-preflight/SKILL.md +141 -0
- package/skills/wecom-schedule/SKILL.md +161 -0
- package/skills/wecom-schedule/references/api-check-availability.md +56 -0
- package/skills/wecom-schedule/references/api-create-schedule.md +38 -0
- package/skills/wecom-schedule/references/api-get-schedule-detail.md +81 -0
- package/skills/wecom-schedule/references/api-update-schedule.md +32 -0
- package/skills/wecom-schedule/references/ref-reminders.md +24 -0
- package/skills/wecom-send-media/SKILL.md +68 -0
- package/skills/wecom-send-template-card/SKILL.md +157 -0
- package/skills/wecom-send-template-card/references/api-template-card-types.md +358 -0
- package/skills/wecom-smartsheet/SKILL.md +164 -0
- package/skills/wecom-smartsheet/references/smartsheet-cell-value-formats.md +163 -0
- package/skills/wecom-smartsheet/references/smartsheet-field-types.md +44 -0
- package/skills/wecom-smartsheet/references/smartsheet-get-records.md +96 -0
- package/skills/wecom-smartsheet/references/webhook-examples.md +185 -0
- package/skills/wecom-smartsheet/references/webhook-fallback.md +184 -0
- package/skills/wecom-todo/SKILL.md +392 -0
- package/skills/wecom-todo/examples/workflows.md +163 -0
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __spreadArrays = (this && this.__spreadArrays) || function () {
|
|
3
|
+
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
|
|
4
|
+
for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
|
5
|
+
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
|
6
|
+
r[k] = a[j];
|
|
7
|
+
return r;
|
|
8
|
+
};
|
|
9
|
+
exports.__esModule = true;
|
|
10
|
+
exports.splitMarkdownIntoSafeChunks = void 0;
|
|
11
|
+
var marked_1 = require("marked");
|
|
12
|
+
var WEIXIN_TEXT_CHUNK_HARD_LIMIT_BYTES = 7 * 1024;
|
|
13
|
+
var WEIXIN_TEXT_CHUNK_SOFT_LIMIT_BYTES = 6656;
|
|
14
|
+
var WEIXIN_TEXT_CHUNK_BACKTRACK_BYTES = 768;
|
|
15
|
+
var DEFAULT_SOFT_RATIO = WEIXIN_TEXT_CHUNK_SOFT_LIMIT_BYTES / WEIXIN_TEXT_CHUNK_HARD_LIMIT_BYTES;
|
|
16
|
+
var DEFAULT_BACKTRACK_BYTES = WEIXIN_TEXT_CHUNK_BACKTRACK_BYTES;
|
|
17
|
+
var PROTECTED_MARKDOWN_TOKEN_TYPES = new Set(["code", "codespan", "link", "image"]);
|
|
18
|
+
function utf8ByteLength(text) {
|
|
19
|
+
return Buffer.byteLength(text, "utf8");
|
|
20
|
+
}
|
|
21
|
+
function isUtf16Boundary(text, index) {
|
|
22
|
+
if (index <= 0 || index >= text.length)
|
|
23
|
+
return true;
|
|
24
|
+
var prev = text.charCodeAt(index - 1);
|
|
25
|
+
var curr = text.charCodeAt(index);
|
|
26
|
+
return !(prev >= 0xd800 && prev <= 0xdbff && curr >= 0xdc00 && curr <= 0xdfff);
|
|
27
|
+
}
|
|
28
|
+
function nextCodepointIndex(text, index) {
|
|
29
|
+
if (index >= text.length)
|
|
30
|
+
return text.length;
|
|
31
|
+
var code = text.charCodeAt(index);
|
|
32
|
+
if (code >= 0xd800 && code <= 0xdbff && index + 1 < text.length) {
|
|
33
|
+
var next = text.charCodeAt(index + 1);
|
|
34
|
+
if (next >= 0xdc00 && next <= 0xdfff)
|
|
35
|
+
return index + 2;
|
|
36
|
+
}
|
|
37
|
+
return index + 1;
|
|
38
|
+
}
|
|
39
|
+
function endIndexByMaxBytes(text, start, maxBytes) {
|
|
40
|
+
var i = start;
|
|
41
|
+
var used = 0;
|
|
42
|
+
while (i < text.length) {
|
|
43
|
+
var next = nextCodepointIndex(text, i);
|
|
44
|
+
var bytes = utf8ByteLength(text.slice(i, next));
|
|
45
|
+
if (used + bytes > maxBytes)
|
|
46
|
+
break;
|
|
47
|
+
used += bytes;
|
|
48
|
+
i = next;
|
|
49
|
+
}
|
|
50
|
+
return i;
|
|
51
|
+
}
|
|
52
|
+
function mergeProtectedRanges(ranges) {
|
|
53
|
+
if (ranges.length <= 1)
|
|
54
|
+
return ranges;
|
|
55
|
+
ranges.sort(function (a, b) { return a.start - b.start || a.end - b.end; });
|
|
56
|
+
var merged = [ranges[0]];
|
|
57
|
+
for (var i = 1; i < ranges.length; i++) {
|
|
58
|
+
var cur = ranges[i];
|
|
59
|
+
var last = merged[merged.length - 1];
|
|
60
|
+
if (cur.start <= last.end) {
|
|
61
|
+
last.end = Math.max(last.end, cur.end);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
merged.push(cur);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return merged;
|
|
68
|
+
}
|
|
69
|
+
function collectProtectedRangesByRegex(text) {
|
|
70
|
+
var patterns = [
|
|
71
|
+
/```[\s\S]*?```/g,
|
|
72
|
+
/`[^`\n]+`/g,
|
|
73
|
+
/!?\[[^\]\n]*\]\((?:\\.|[^)\n])+\)/g,
|
|
74
|
+
/<https?:\/\/[^>\s]+>/g,
|
|
75
|
+
];
|
|
76
|
+
var ranges = [];
|
|
77
|
+
for (var _i = 0, patterns_1 = patterns; _i < patterns_1.length; _i++) {
|
|
78
|
+
var pattern = patterns_1[_i];
|
|
79
|
+
var match = void 0;
|
|
80
|
+
while ((match = pattern.exec(text)) !== null) {
|
|
81
|
+
var start = match.index;
|
|
82
|
+
var end = start + match[0].length;
|
|
83
|
+
if (end > start)
|
|
84
|
+
ranges.push({ start: start, end: end });
|
|
85
|
+
if (match[0].length === 0)
|
|
86
|
+
pattern.lastIndex += 1;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return mergeProtectedRanges(ranges);
|
|
90
|
+
}
|
|
91
|
+
function findRawInBounds(params) {
|
|
92
|
+
var text = params.text, raw = params.raw, cursor = params.cursor, boundsStart = params.boundsStart, boundsEnd = params.boundsEnd;
|
|
93
|
+
if (!raw)
|
|
94
|
+
return -1;
|
|
95
|
+
var minCursor = Math.max(boundsStart, cursor);
|
|
96
|
+
var idx = text.indexOf(raw, minCursor);
|
|
97
|
+
if (idx >= boundsStart && idx + raw.length <= boundsEnd)
|
|
98
|
+
return idx;
|
|
99
|
+
var fallbackIdx = text.indexOf(raw, boundsStart);
|
|
100
|
+
if (fallbackIdx >= boundsStart && fallbackIdx + raw.length <= boundsEnd)
|
|
101
|
+
return fallbackIdx;
|
|
102
|
+
return -1;
|
|
103
|
+
}
|
|
104
|
+
function collectTokenChildren(token) {
|
|
105
|
+
var children = [];
|
|
106
|
+
var generic = token;
|
|
107
|
+
if (Array.isArray(generic.tokens))
|
|
108
|
+
children.push.apply(children, generic.tokens);
|
|
109
|
+
if (Array.isArray(generic.items)) {
|
|
110
|
+
for (var _i = 0, _a = generic.items; _i < _a.length; _i++) {
|
|
111
|
+
var item = _a[_i];
|
|
112
|
+
if (typeof item.raw === "string") {
|
|
113
|
+
children.push(item);
|
|
114
|
+
}
|
|
115
|
+
else if (Array.isArray(item.tokens)) {
|
|
116
|
+
children.push.apply(children, item.tokens);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (Array.isArray(generic.header)) {
|
|
121
|
+
for (var _b = 0, _c = generic.header; _b < _c.length; _b++) {
|
|
122
|
+
var cell = _c[_b];
|
|
123
|
+
if (Array.isArray(cell.tokens))
|
|
124
|
+
children.push.apply(children, cell.tokens);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (Array.isArray(generic.rows)) {
|
|
128
|
+
for (var _d = 0, _e = generic.rows; _d < _e.length; _d++) {
|
|
129
|
+
var row = _e[_d];
|
|
130
|
+
for (var _f = 0, row_1 = row; _f < row_1.length; _f++) {
|
|
131
|
+
var cell = row_1[_f];
|
|
132
|
+
if (Array.isArray(cell.tokens))
|
|
133
|
+
children.push.apply(children, cell.tokens);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return children;
|
|
138
|
+
}
|
|
139
|
+
function mapTokensToRanges(params) {
|
|
140
|
+
var text = params.text, tokens = params.tokens, boundsStart = params.boundsStart, boundsEnd = params.boundsEnd, out = params.out;
|
|
141
|
+
var cursor = params.cursor;
|
|
142
|
+
for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {
|
|
143
|
+
var token = tokens_1[_i];
|
|
144
|
+
var raw = token.raw;
|
|
145
|
+
if (typeof raw !== "string" || !raw)
|
|
146
|
+
continue;
|
|
147
|
+
var start = findRawInBounds({ text: text, raw: raw, cursor: cursor, boundsStart: boundsStart, boundsEnd: boundsEnd });
|
|
148
|
+
if (start < 0)
|
|
149
|
+
continue;
|
|
150
|
+
var end = start + raw.length;
|
|
151
|
+
if (PROTECTED_MARKDOWN_TOKEN_TYPES.has(token.type)) {
|
|
152
|
+
out.push({ start: start, end: end });
|
|
153
|
+
}
|
|
154
|
+
var children = collectTokenChildren(token);
|
|
155
|
+
if (children.length > 0) {
|
|
156
|
+
mapTokensToRanges({
|
|
157
|
+
text: text,
|
|
158
|
+
tokens: __spreadArrays(children),
|
|
159
|
+
cursor: start,
|
|
160
|
+
boundsStart: start,
|
|
161
|
+
boundsEnd: end,
|
|
162
|
+
out: out
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
cursor = end;
|
|
166
|
+
}
|
|
167
|
+
return cursor;
|
|
168
|
+
}
|
|
169
|
+
function collectProtectedRanges(text) {
|
|
170
|
+
try {
|
|
171
|
+
var tokens = marked_1.Lexer.lex(text, { gfm: true, breaks: false });
|
|
172
|
+
var ranges = [];
|
|
173
|
+
mapTokensToRanges({
|
|
174
|
+
text: text,
|
|
175
|
+
tokens: __spreadArrays(tokens),
|
|
176
|
+
cursor: 0,
|
|
177
|
+
boundsStart: 0,
|
|
178
|
+
boundsEnd: text.length,
|
|
179
|
+
out: ranges
|
|
180
|
+
});
|
|
181
|
+
return mergeProtectedRanges(ranges);
|
|
182
|
+
}
|
|
183
|
+
catch (_a) {
|
|
184
|
+
return collectProtectedRangesByRegex(text);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function isInsideProtectedRange(index, ranges) {
|
|
188
|
+
for (var _i = 0, ranges_1 = ranges; _i < ranges_1.length; _i++) {
|
|
189
|
+
var r = ranges_1[_i];
|
|
190
|
+
if (index <= r.start)
|
|
191
|
+
return false;
|
|
192
|
+
if (index < r.end)
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
function isStrongBoundary(text, index) {
|
|
198
|
+
if (index <= 0 || index > text.length)
|
|
199
|
+
return false;
|
|
200
|
+
var prev = text[index - 1];
|
|
201
|
+
var prev2 = index >= 2 ? text[index - 2] : "";
|
|
202
|
+
if (prev === "\n" && prev2 === "\n")
|
|
203
|
+
return true;
|
|
204
|
+
if (prev === "\n")
|
|
205
|
+
return true;
|
|
206
|
+
if (/[。!?!?;;,,::]/.test(prev))
|
|
207
|
+
return true;
|
|
208
|
+
if (/\s/.test(prev) && /[。!?!?;;,,]/.test(prev2))
|
|
209
|
+
return true;
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
function isWeakBoundary(text, index) {
|
|
213
|
+
if (index <= 0 || index > text.length)
|
|
214
|
+
return false;
|
|
215
|
+
var prev = text[index - 1];
|
|
216
|
+
return /[。!?!?;;,,::\n]/.test(prev);
|
|
217
|
+
}
|
|
218
|
+
function splitTextIntoChunksHeuristic(text, hardLimitBytes) {
|
|
219
|
+
if (!text)
|
|
220
|
+
return [""];
|
|
221
|
+
if (utf8ByteLength(text) <= hardLimitBytes)
|
|
222
|
+
return [text];
|
|
223
|
+
var softLimitBytes = Math.max(1, Math.floor(hardLimitBytes * DEFAULT_SOFT_RATIO));
|
|
224
|
+
var backtrackBytes = Math.min(DEFAULT_BACKTRACK_BYTES, Math.max(64, softLimitBytes - 1));
|
|
225
|
+
var ranges = collectProtectedRanges(text);
|
|
226
|
+
var chunks = [];
|
|
227
|
+
var start = 0;
|
|
228
|
+
while (start < text.length) {
|
|
229
|
+
var rest = text.slice(start);
|
|
230
|
+
if (utf8ByteLength(rest) <= hardLimitBytes) {
|
|
231
|
+
chunks.push(rest);
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
var softEnd = endIndexByMaxBytes(text, start, softLimitBytes);
|
|
235
|
+
var hardEnd = endIndexByMaxBytes(text, start, hardLimitBytes);
|
|
236
|
+
var lowerStart = endIndexByMaxBytes(text, start, Math.max(1, softLimitBytes - backtrackBytes));
|
|
237
|
+
var cut = -1;
|
|
238
|
+
for (var i = softEnd; i >= lowerStart; i--) {
|
|
239
|
+
if (!isUtf16Boundary(text, i))
|
|
240
|
+
continue;
|
|
241
|
+
if (isInsideProtectedRange(i, ranges))
|
|
242
|
+
continue;
|
|
243
|
+
if (isStrongBoundary(text, i)) {
|
|
244
|
+
cut = i;
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (cut < 0) {
|
|
249
|
+
for (var i = softEnd; i >= lowerStart; i--) {
|
|
250
|
+
if (!isUtf16Boundary(text, i))
|
|
251
|
+
continue;
|
|
252
|
+
if (isInsideProtectedRange(i, ranges))
|
|
253
|
+
continue;
|
|
254
|
+
if (isWeakBoundary(text, i)) {
|
|
255
|
+
cut = i;
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (cut < 0) {
|
|
261
|
+
cut = hardEnd;
|
|
262
|
+
while (cut > start && (!isUtf16Boundary(text, cut) || isInsideProtectedRange(cut, ranges))) {
|
|
263
|
+
cut--;
|
|
264
|
+
}
|
|
265
|
+
if (cut <= start)
|
|
266
|
+
cut = hardEnd;
|
|
267
|
+
}
|
|
268
|
+
var segment = text.slice(start, cut);
|
|
269
|
+
if (!segment) {
|
|
270
|
+
var fallback = text.slice(start, hardEnd);
|
|
271
|
+
chunks.push(fallback);
|
|
272
|
+
start = hardEnd;
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
chunks.push(segment);
|
|
276
|
+
start = cut;
|
|
277
|
+
}
|
|
278
|
+
return chunks;
|
|
279
|
+
}
|
|
280
|
+
function collectTopLevelBlocks(text) {
|
|
281
|
+
var tokens = marked_1.Lexer.lex(text, { gfm: true, breaks: false });
|
|
282
|
+
var blocks = [];
|
|
283
|
+
var cursor = 0;
|
|
284
|
+
for (var _i = 0, tokens_2 = tokens; _i < tokens_2.length; _i++) {
|
|
285
|
+
var token = tokens_2[_i];
|
|
286
|
+
var raw = token.raw;
|
|
287
|
+
if (typeof raw !== "string" || !raw)
|
|
288
|
+
continue;
|
|
289
|
+
var start = findRawInBounds({
|
|
290
|
+
text: text,
|
|
291
|
+
raw: raw,
|
|
292
|
+
cursor: cursor,
|
|
293
|
+
boundsStart: 0,
|
|
294
|
+
boundsEnd: text.length
|
|
295
|
+
});
|
|
296
|
+
if (start < 0)
|
|
297
|
+
continue;
|
|
298
|
+
var end = start + raw.length;
|
|
299
|
+
if (start > cursor) {
|
|
300
|
+
blocks.push({ start: cursor, end: start, raw: text.slice(cursor, start) });
|
|
301
|
+
}
|
|
302
|
+
blocks.push({ start: start, end: end, raw: raw });
|
|
303
|
+
cursor = end;
|
|
304
|
+
}
|
|
305
|
+
if (cursor < text.length) {
|
|
306
|
+
blocks.push({ start: cursor, end: text.length, raw: text.slice(cursor) });
|
|
307
|
+
}
|
|
308
|
+
return blocks;
|
|
309
|
+
}
|
|
310
|
+
function isChunkSafe(chunk) {
|
|
311
|
+
if (!chunk)
|
|
312
|
+
return true;
|
|
313
|
+
try {
|
|
314
|
+
marked_1.Lexer.lex(chunk, { gfm: true, breaks: false });
|
|
315
|
+
}
|
|
316
|
+
catch (_a) {
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
if (/-\s*[✅❌]?\s*$/.test(chunk))
|
|
320
|
+
return false;
|
|
321
|
+
if (/(^|\n)\s*[-*+]\s*$/.test(chunk))
|
|
322
|
+
return false;
|
|
323
|
+
if (/(^|\n)\s*\d+\.\s*$/.test(chunk))
|
|
324
|
+
return false;
|
|
325
|
+
if (/(^|\n)\s*>\s*$/.test(chunk))
|
|
326
|
+
return false;
|
|
327
|
+
if (/(^|\n)\s*#+\s*$/.test(chunk))
|
|
328
|
+
return false;
|
|
329
|
+
return true;
|
|
330
|
+
}
|
|
331
|
+
function splitMarkdownIntoSafeChunks(text, hardLimitBytes) {
|
|
332
|
+
if (!text)
|
|
333
|
+
return [""];
|
|
334
|
+
if (hardLimitBytes <= 0)
|
|
335
|
+
return [text];
|
|
336
|
+
if (utf8ByteLength(text) <= hardLimitBytes)
|
|
337
|
+
return [text];
|
|
338
|
+
var blocks = collectTopLevelBlocks(text);
|
|
339
|
+
if (!blocks.length)
|
|
340
|
+
return splitTextIntoChunksHeuristic(text, hardLimitBytes);
|
|
341
|
+
var softLimitBytes = Math.max(1, Math.floor(hardLimitBytes * DEFAULT_SOFT_RATIO));
|
|
342
|
+
var chunks = [];
|
|
343
|
+
var current = "";
|
|
344
|
+
var flushCurrent = function () {
|
|
345
|
+
if (!current)
|
|
346
|
+
return;
|
|
347
|
+
chunks.push(current);
|
|
348
|
+
current = "";
|
|
349
|
+
};
|
|
350
|
+
for (var _i = 0, blocks_1 = blocks; _i < blocks_1.length; _i++) {
|
|
351
|
+
var block = blocks_1[_i];
|
|
352
|
+
var blockText = block.raw;
|
|
353
|
+
if (!blockText)
|
|
354
|
+
continue;
|
|
355
|
+
var blockBytes = utf8ByteLength(blockText);
|
|
356
|
+
if (blockBytes > hardLimitBytes) {
|
|
357
|
+
flushCurrent();
|
|
358
|
+
var subs = splitTextIntoChunksHeuristic(blockText, hardLimitBytes);
|
|
359
|
+
for (var _a = 0, subs_1 = subs; _a < subs_1.length; _a++) {
|
|
360
|
+
var s = subs_1[_a];
|
|
361
|
+
chunks.push(s);
|
|
362
|
+
}
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
if (!current) {
|
|
366
|
+
current = blockText;
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
var combined = "" + current + blockText;
|
|
370
|
+
var combinedBytes = utf8ByteLength(combined);
|
|
371
|
+
if (combinedBytes <= softLimitBytes) {
|
|
372
|
+
current = combined;
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
if (combinedBytes <= hardLimitBytes && isChunkSafe(combined)) {
|
|
376
|
+
current = combined;
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
flushCurrent();
|
|
380
|
+
current = blockText;
|
|
381
|
+
}
|
|
382
|
+
flushCurrent();
|
|
383
|
+
if (!chunks.length)
|
|
384
|
+
return splitTextIntoChunksHeuristic(text, hardLimitBytes);
|
|
385
|
+
if (chunks.some(function (c) { return utf8ByteLength(c) > hardLimitBytes; })) {
|
|
386
|
+
return splitTextIntoChunksHeuristic(text, hardLimitBytes);
|
|
387
|
+
}
|
|
388
|
+
if (chunks.some(function (c) { return !isChunkSafe(c); })) {
|
|
389
|
+
return splitTextIntoChunksHeuristic(text, hardLimitBytes);
|
|
390
|
+
}
|
|
391
|
+
if (chunks.join("") !== text) {
|
|
392
|
+
return splitTextIntoChunksHeuristic(text, hardLimitBytes);
|
|
393
|
+
}
|
|
394
|
+
return chunks;
|
|
395
|
+
}
|
|
396
|
+
exports.splitMarkdownIntoSafeChunks = splitMarkdownIntoSafeChunks;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP 模块统一导出
|
|
3
|
+
*/
|
|
4
|
+
export { createWeComMcpTool } from "./tool.js";
|
|
5
|
+
export { sendJsonRpc, clearCategoryCache, clearAccountCache, resolveCurrentAccountId, McpRpcError, McpHttpError, type, McpToolInfo } from "./transport.js";
|
|
6
|
+
export { cleanSchemaForGemini } from "./schema.js";
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP 模块统一导出
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
8
|
+
}) : (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
o[k2] = m[k];
|
|
11
|
+
}));
|
|
12
|
+
exports.__esModule = true;
|
|
13
|
+
var tool_js_1 = require("./tool.js");
|
|
14
|
+
__createBinding(exports, tool_js_1, "createWeComMcpTool");
|
|
15
|
+
var transport_js_1 = require("./transport.js");
|
|
16
|
+
__createBinding(exports, transport_js_1, "sendJsonRpc");
|
|
17
|
+
__createBinding(exports, transport_js_1, "clearCategoryCache");
|
|
18
|
+
__createBinding(exports, transport_js_1, "clearAccountCache");
|
|
19
|
+
__createBinding(exports, transport_js_1, "resolveCurrentAccountId");
|
|
20
|
+
__createBinding(exports, transport_js_1, "McpRpcError");
|
|
21
|
+
__createBinding(exports, transport_js_1, "McpHttpError");
|
|
22
|
+
__createBinding(exports, transport_js_1, "type");
|
|
23
|
+
var schema_js_1 = require("./schema.js");
|
|
24
|
+
__createBinding(exports, schema_js_1, "cleanSchemaForGemini");
|
|
25
|
+
// 注意:parseSessionKeyChat 已废弃不再导出。
|
|
26
|
+
// OpenClaw core 构建 sessionKey 时会把 chatId 小写化,
|
|
27
|
+
// 企业微信接口(如 aibot_send_biz_msg)是大小写敏感的,反解结果不可用。
|
|
28
|
+
// chatId 请通过 state-manager 的 getSessionChatInfo(sessionKey) 获取。
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 业务错误码检查拦截器
|
|
3
|
+
*
|
|
4
|
+
* 检查 tools/call 返回结果中是否包含需要清理缓存的业务错误码。
|
|
5
|
+
* MCP Server 可能在正常的 JSON-RPC 响应中返回业务层错误,
|
|
6
|
+
* 这些错误被包裹在 result.content[].text 中,需要解析后判断。
|
|
7
|
+
*
|
|
8
|
+
* 此拦截器对所有 call 调用生效。
|
|
9
|
+
*/
|
|
10
|
+
import type { CallInterceptor } from "./types.js";
|
|
11
|
+
export declare const bizErrorInterceptor: CallInterceptor;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 业务错误码检查拦截器
|
|
4
|
+
*
|
|
5
|
+
* 检查 tools/call 返回结果中是否包含需要清理缓存的业务错误码。
|
|
6
|
+
* MCP Server 可能在正常的 JSON-RPC 响应中返回业务层错误,
|
|
7
|
+
* 这些错误被包裹在 result.content[].text 中,需要解析后判断。
|
|
8
|
+
*
|
|
9
|
+
* 此拦截器对所有 call 调用生效。
|
|
10
|
+
*/
|
|
11
|
+
exports.__esModule = true;
|
|
12
|
+
exports.bizErrorInterceptor = void 0;
|
|
13
|
+
var transport_js_1 = require("../transport.js");
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// 常量
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* 需要触发缓存清理的业务错误码集合
|
|
19
|
+
*
|
|
20
|
+
* 这些错误码出现在 MCP 工具调用返回的 content 文本中(业务层面),
|
|
21
|
+
* 与 JSON-RPC 层面的错误码不同,需要在此处额外检测。
|
|
22
|
+
*
|
|
23
|
+
* - 850001/ 851014: 机器人授权过期/ 重置,需清理缓存以便下次重新拉取配置
|
|
24
|
+
*/
|
|
25
|
+
var BIZ_CACHE_CLEAR_ERROR_CODES = new Set([850001, 851014]);
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// 拦截器实现
|
|
28
|
+
// ============================================================================
|
|
29
|
+
exports.bizErrorInterceptor = {
|
|
30
|
+
name: "biz-error",
|
|
31
|
+
/** 对所有 call 调用生效 */
|
|
32
|
+
match: function () { return true; },
|
|
33
|
+
/** 检查返回结果中的业务错误码,必要时清理缓存 */
|
|
34
|
+
afterCall: function (ctx, result) {
|
|
35
|
+
checkBizErrorAndClearCache(result, ctx);
|
|
36
|
+
// 不修改 result,透传给下一个拦截器
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
// ============================================================================
|
|
41
|
+
// 内部实现
|
|
42
|
+
// ============================================================================
|
|
43
|
+
/**
|
|
44
|
+
* 检查 tools/call 的返回结果中是否包含需要清理缓存的业务错误码
|
|
45
|
+
*/
|
|
46
|
+
function checkBizErrorAndClearCache(result, ctx) {
|
|
47
|
+
if (!result || typeof result !== "object")
|
|
48
|
+
return;
|
|
49
|
+
var content = result.content;
|
|
50
|
+
if (!Array.isArray(content))
|
|
51
|
+
return;
|
|
52
|
+
for (var _i = 0, content_1 = content; _i < content_1.length; _i++) {
|
|
53
|
+
var item = content_1[_i];
|
|
54
|
+
if (item.type !== "text" || !item.text)
|
|
55
|
+
continue;
|
|
56
|
+
try {
|
|
57
|
+
var parsed = JSON.parse(item.text);
|
|
58
|
+
if (typeof parsed.errcode === "number" && BIZ_CACHE_CLEAR_ERROR_CODES.has(parsed.errcode)) {
|
|
59
|
+
var accountId = ctx.accountId;
|
|
60
|
+
if (!accountId) {
|
|
61
|
+
console.warn("[mcp] \u68C0\u6D4B\u5230\u4E1A\u52A1\u9519\u8BEF\u7801 " + parsed.errcode + " (category=\"" + ctx.category + "\")\uFF0C\u4F46 ctx.accountId \u4E3A\u7A7A\uFF0C\u8DF3\u8FC7\u7F13\u5B58\u6E05\u7406");
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
console.log("[mcp] \u68C0\u6D4B\u5230\u4E1A\u52A1\u9519\u8BEF\u7801 " + parsed.errcode + " (accountId=\"" + accountId + "\", category=\"" + ctx.category + "\")\uFF0C\u6E05\u7406\u7F13\u5B58");
|
|
65
|
+
transport_js_1.clearCategoryCache(accountId, ctx.category);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (_a) {
|
|
70
|
+
// text 不是 JSON 格式,跳过
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文档授权错误拦截器
|
|
3
|
+
*
|
|
4
|
+
* 当 category=doc 的 MCP 调用返回 errcode=851013/851014/851008(文档授权错误)时:
|
|
5
|
+
* 1. 通过 aibot_send_biz_msg 命令向用户发送授权引导卡片
|
|
6
|
+
* 2. 拦截 help_message 内容,不将其传递给 LLM
|
|
7
|
+
* 3. 返回简化响应,告知 LLM 授权卡片已发送、无需再做处理
|
|
8
|
+
*/
|
|
9
|
+
import type { CallInterceptor } from "./types.js";
|
|
10
|
+
export declare const docAuthErrorInterceptor: CallInterceptor;
|