webaiapi 0.0.0-stage → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +184 -2
- package/bin/webapi.mjs +45 -0
- package/dist/browser/auth-capture.d.ts +110 -0
- package/dist/browser/auth-capture.d.ts.map +1 -0
- package/dist/browser/auth-capture.js +487 -0
- package/dist/browser/auth-capture.js.map +1 -0
- package/dist/browser/credentials.d.ts +102 -0
- package/dist/browser/credentials.d.ts.map +1 -0
- package/dist/browser/credentials.js +209 -0
- package/dist/browser/credentials.js.map +1 -0
- package/dist/browser/js-eval.d.ts +44 -0
- package/dist/browser/js-eval.d.ts.map +1 -0
- package/dist/browser/js-eval.js +20 -0
- package/dist/browser/js-eval.js.map +1 -0
- package/dist/browser/login-flow.d.ts +171 -0
- package/dist/browser/login-flow.d.ts.map +1 -0
- package/dist/browser/login-flow.js +606 -0
- package/dist/browser/login-flow.js.map +1 -0
- package/dist/browser/manager.d.ts +144 -0
- package/dist/browser/manager.d.ts.map +1 -0
- package/dist/browser/manager.js +586 -0
- package/dist/browser/manager.js.map +1 -0
- package/dist/browser/platforms.d.ts +96 -0
- package/dist/browser/platforms.d.ts.map +1 -0
- package/dist/browser/platforms.js +288 -0
- package/dist/browser/platforms.js.map +1 -0
- package/dist/browser/sse-capture.d.ts +23 -0
- package/dist/browser/sse-capture.d.ts.map +1 -0
- package/dist/browser/sse-capture.js +199 -0
- package/dist/browser/sse-capture.js.map +1 -0
- package/dist/browser/stealth.d.ts +12 -0
- package/dist/browser/stealth.d.ts.map +1 -0
- package/dist/browser/stealth.js +12 -0
- package/dist/browser/stealth.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +441 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +90 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +246 -0
- package/dist/config.js.map +1 -0
- package/dist/controllers/history-db.d.ts +56 -0
- package/dist/controllers/history-db.d.ts.map +1 -0
- package/dist/controllers/history-db.js +260 -0
- package/dist/controllers/history-db.js.map +1 -0
- package/dist/controllers/request-pool.d.ts +78 -0
- package/dist/controllers/request-pool.d.ts.map +1 -0
- package/dist/controllers/request-pool.js +222 -0
- package/dist/controllers/request-pool.js.map +1 -0
- package/dist/controllers/router.d.ts +172 -0
- package/dist/controllers/router.d.ts.map +1 -0
- package/dist/controllers/router.js +569 -0
- package/dist/controllers/router.js.map +1 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/log/api-logger.d.ts +55 -0
- package/dist/log/api-logger.d.ts.map +1 -0
- package/dist/log/api-logger.js +264 -0
- package/dist/log/api-logger.js.map +1 -0
- package/dist/log/debug-logger.d.ts +49 -0
- package/dist/log/debug-logger.d.ts.map +1 -0
- package/dist/log/debug-logger.js +285 -0
- package/dist/log/debug-logger.js.map +1 -0
- package/dist/log/logger.d.ts +16 -0
- package/dist/log/logger.d.ts.map +1 -0
- package/dist/log/logger.js +35 -0
- package/dist/log/logger.js.map +1 -0
- package/dist/postinstall.d.ts +3 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +90 -0
- package/dist/postinstall.js.map +1 -0
- package/dist/providers/base.d.ts +83 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +51 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/chatglm-dom-extract.d.ts +24 -0
- package/dist/providers/chatglm-dom-extract.d.ts.map +1 -0
- package/dist/providers/chatglm-dom-extract.js +175 -0
- package/dist/providers/chatglm-dom-extract.js.map +1 -0
- package/dist/providers/chatglm-dom.d.ts +110 -0
- package/dist/providers/chatglm-dom.d.ts.map +1 -0
- package/dist/providers/chatglm-dom.js +384 -0
- package/dist/providers/chatglm-dom.js.map +1 -0
- package/dist/providers/chatglm-sse.d.ts +119 -0
- package/dist/providers/chatglm-sse.d.ts.map +1 -0
- package/dist/providers/chatglm-sse.js +241 -0
- package/dist/providers/chatglm-sse.js.map +1 -0
- package/dist/providers/chatglm.d.ts +288 -0
- package/dist/providers/chatglm.d.ts.map +1 -0
- package/dist/providers/chatglm.js +1631 -0
- package/dist/providers/chatglm.js.map +1 -0
- package/dist/routes/chat.d.ts +117 -0
- package/dist/routes/chat.d.ts.map +1 -0
- package/dist/routes/chat.js +1346 -0
- package/dist/routes/chat.js.map +1 -0
- package/dist/routes/compress.d.ts +142 -0
- package/dist/routes/compress.d.ts.map +1 -0
- package/dist/routes/compress.js +551 -0
- package/dist/routes/compress.js.map +1 -0
- package/dist/routes/failover.d.ts +34 -0
- package/dist/routes/failover.d.ts.map +1 -0
- package/dist/routes/failover.js +221 -0
- package/dist/routes/failover.js.map +1 -0
- package/dist/routes/helpers.d.ts +174 -0
- package/dist/routes/helpers.d.ts.map +1 -0
- package/dist/routes/helpers.js +525 -0
- package/dist/routes/helpers.js.map +1 -0
- package/dist/routes/meta.d.ts +31 -0
- package/dist/routes/meta.d.ts.map +1 -0
- package/dist/routes/meta.js +184 -0
- package/dist/routes/meta.js.map +1 -0
- package/dist/routes/sse.d.ts +82 -0
- package/dist/routes/sse.d.ts.map +1 -0
- package/dist/routes/sse.js +77 -0
- package/dist/routes/sse.js.map +1 -0
- package/dist/server/app.d.ts +24 -0
- package/dist/server/app.d.ts.map +1 -0
- package/dist/server/app.js +292 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/middleware/api-key.d.ts +61 -0
- package/dist/server/middleware/api-key.d.ts.map +1 -0
- package/dist/server/middleware/api-key.js +95 -0
- package/dist/server/middleware/api-key.js.map +1 -0
- package/dist/server/middleware/rate-limit.d.ts +67 -0
- package/dist/server/middleware/rate-limit.d.ts.map +1 -0
- package/dist/server/middleware/rate-limit.js +134 -0
- package/dist/server/middleware/rate-limit.js.map +1 -0
- package/dist/server/middleware/timeout.d.ts +34 -0
- package/dist/server/middleware/timeout.d.ts.map +1 -0
- package/dist/server/middleware/timeout.js +64 -0
- package/dist/server/middleware/timeout.js.map +1 -0
- package/dist/server/types.d.ts +20 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/tools/build.d.ts +14 -0
- package/dist/tools/build.d.ts.map +1 -0
- package/dist/tools/build.js +105 -0
- package/dist/tools/build.js.map +1 -0
- package/dist/tools/clean.d.ts +32 -0
- package/dist/tools/clean.d.ts.map +1 -0
- package/dist/tools/clean.js +65 -0
- package/dist/tools/clean.js.map +1 -0
- package/dist/tools/convert.d.ts +50 -0
- package/dist/tools/convert.d.ts.map +1 -0
- package/dist/tools/convert.js +289 -0
- package/dist/tools/convert.js.map +1 -0
- package/dist/tools/names.d.ts +138 -0
- package/dist/tools/names.d.ts.map +1 -0
- package/dist/tools/names.js +578 -0
- package/dist/tools/names.js.map +1 -0
- package/dist/tools/parse.d.ts +31 -0
- package/dist/tools/parse.d.ts.map +1 -0
- package/dist/tools/parse.js +273 -0
- package/dist/tools/parse.js.map +1 -0
- package/dist/tools/placeholder.d.ts +21 -0
- package/dist/tools/placeholder.d.ts.map +1 -0
- package/dist/tools/placeholder.js +135 -0
- package/dist/tools/placeholder.js.map +1 -0
- package/dist/tools/prompts.d.ts +42 -0
- package/dist/tools/prompts.d.ts.map +1 -0
- package/dist/tools/prompts.js +69 -0
- package/dist/tools/prompts.js.map +1 -0
- package/dist/tools/protocol.d.ts +58 -0
- package/dist/tools/protocol.d.ts.map +1 -0
- package/dist/tools/protocol.js +287 -0
- package/dist/tools/protocol.js.map +1 -0
- package/dist/tools/repair.d.ts +83 -0
- package/dist/tools/repair.d.ts.map +1 -0
- package/dist/tools/repair.js +510 -0
- package/dist/tools/repair.js.map +1 -0
- package/dist/tools/workspace.d.ts +40 -0
- package/dist/tools/workspace.d.ts.map +1 -0
- package/dist/tools/workspace.js +224 -0
- package/dist/tools/workspace.js.map +1 -0
- package/dist/types/message.d.ts +87 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +85 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/openai.d.ts +100 -0
- package/dist/types/openai.d.ts.map +1 -0
- package/dist/types/openai.js +66 -0
- package/dist/types/openai.js.map +1 -0
- package/dist/utils/errors.d.ts +82 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +115 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/mutex.d.ts +31 -0
- package/dist/utils/mutex.d.ts.map +1 -0
- package/dist/utils/mutex.js +61 -0
- package/dist/utils/mutex.js.map +1 -0
- package/dist/utils/prompt.d.ts +150 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +514 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/text.d.ts +30 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +70 -0
- package/dist/utils/text.js.map +1 -0
- package/package.json +67 -4
- package/postinstall.mjs +34 -0
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON 修复与 DOM 损坏抢救 —— `legacy-python/src/utils/tool_calls.py` 的一部分。
|
|
3
|
+
*
|
|
4
|
+
* 这是整个工具协议层最「脏」也最值钱的一块:AI 输出的 JSON 经常坏,
|
|
5
|
+
* 而 ChatGLM 把 `<tool_call>` 当 HTML 元素消费后会把里面 JSON 毁得更彻底。
|
|
6
|
+
*
|
|
7
|
+
* ⚠️ 移植注意:Python 的 `re` 与 JS 的 `RegExp` 有差异,本文件里凡是
|
|
8
|
+
* 原先用 `\w` 的地方都改成了 {@link PY_W_CHARS}(Unicode 语义的字母/数字/下划线),
|
|
9
|
+
* 并统一带 `u` 标志,否则中文内容会被错误切分。
|
|
10
|
+
*/
|
|
11
|
+
import { logger } from '../log/logger.js';
|
|
12
|
+
import { cleanDomHtml } from './clean.js';
|
|
13
|
+
// 注意:本文件的正则全部带 `u` 标志(`\p{...}` 需要),并且凡是 Python 用 `\w` 的地方
|
|
14
|
+
// 都改用 PY_W_CHARS —— JS 的 `\w` 只有 ASCII,会导致中文内容被错误切分。
|
|
15
|
+
/**
|
|
16
|
+
* Python `re` 的 `\w` 等价「内容」(Unicode 字母 / 数字 / 下划线);JS 的 `\w` 只有 ASCII。
|
|
17
|
+
*
|
|
18
|
+
* ⚠️ 这是**类内容**不是类本身 —— 要嵌进别的字符类时用它:
|
|
19
|
+
* `` `[/${PY_W_CHARS}.\\-]+` ``。单独使用时用 {@link PY_W}。
|
|
20
|
+
*/
|
|
21
|
+
export const PY_W_CHARS = String.raw `\p{L}\p{N}_`;
|
|
22
|
+
/** 等价于 Python `\w` 的完整字符类,可直接放进正则。 */
|
|
23
|
+
export const PY_W = `[${PY_W_CHARS}]`;
|
|
24
|
+
/** 合法的 JSON 字符串转义字符(反斜杠后只能跟这些)。 */
|
|
25
|
+
const VALID_JSON_ESCAPES = new Set(['"', '\\', 'b', 'f', 'n', 'r', 't', 'u', '/']);
|
|
26
|
+
/**
|
|
27
|
+
* DOM 损坏指示器:key 前后出现转义引号、值前出现「预览」前缀。
|
|
28
|
+
* 这些模式在正常 JSON 里不会出现,可作为可靠信号。
|
|
29
|
+
*/
|
|
30
|
+
export const DOM_CORRUPTION_INDICATOR = new RegExp(
|
|
31
|
+
// ⚠️ 一律写成 `[${PY_W_CHARS}]+`:直接写 `${PY_W_CHARS}+` 时量词只作用于最后一个原子(`_`)
|
|
32
|
+
String.raw `\{\s*"\\+"|` + // {"\" —— 转义引号紧跟 {
|
|
33
|
+
String.raw `\\+"[${PY_W_CHARS}]+\\+"|` + // \"name\" —— key 被转义引号包围
|
|
34
|
+
String.raw `\b[${PY_W_CHARS}]+\\+"[${PY_W_CHARS}]+"`, // Re\"Read —— 值前出现预览前缀
|
|
35
|
+
'u');
|
|
36
|
+
/**
|
|
37
|
+
* DOM 预览损坏指示器(无反斜杠版):`"pat"path":`、`"nam"name":`。
|
|
38
|
+
* 正常 JSON 的 key 只有一对引号,出现两对即损坏。
|
|
39
|
+
*/
|
|
40
|
+
export const DOM_PREVIEW_KEY_INDICATOR = /"[A-Za-z_]{1,20}"[A-Za-z_]{1,20}"\s*:/;
|
|
41
|
+
/** 破碎标签迹象 —— 用于决定是否启用 Pattern 6/7 兜底。 */
|
|
42
|
+
export const BROKEN_TAG_INDICATOR = /t?ool_call|<\/?t+ool_call/i;
|
|
43
|
+
/** 智能引号集合(DOM 渲染产物)。 */
|
|
44
|
+
const SMART_QUOTES = '\u201c\u201d\u2018\u2019';
|
|
45
|
+
/** 判断文本是否含智能引号。 */
|
|
46
|
+
export function hasSmartQuotes(text) {
|
|
47
|
+
return [...SMART_QUOTES].some((ch) => text.includes(ch));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 尝试把字符串解析为 JSON(宽容处理代码围栏、非法转义、尾部逗号)。
|
|
51
|
+
*
|
|
52
|
+
* 解析失败时的兜底顺序与原实现一致:
|
|
53
|
+
* 1. 去掉代码围栏后直接 parse
|
|
54
|
+
* 2. 修复非法转义后 parse
|
|
55
|
+
* 3. 若含 DOM 损坏特征 → 返回 undefined(交给 Pattern 7 抢救,不要用正则兜底)
|
|
56
|
+
* 4. 否则用正则提取参数(SearchReplace 缺字段时视为损坏,也返回 undefined)
|
|
57
|
+
*/
|
|
58
|
+
export function tryParseJson(raw) {
|
|
59
|
+
let cleaned = raw.trim();
|
|
60
|
+
if (cleaned.startsWith('```')) {
|
|
61
|
+
cleaned = cleaned
|
|
62
|
+
.split('\n')
|
|
63
|
+
.filter((line) => !line.trim().startsWith('```'))
|
|
64
|
+
.join('\n')
|
|
65
|
+
.trim();
|
|
66
|
+
}
|
|
67
|
+
const direct = safeJsonParse(cleaned);
|
|
68
|
+
if (direct)
|
|
69
|
+
return direct;
|
|
70
|
+
const repaired = safeJsonParse(repairJson(cleaned));
|
|
71
|
+
if (repaired)
|
|
72
|
+
return repaired;
|
|
73
|
+
logger.warn({ head: cleaned.slice(0, 300) }, '[tool_calls] JSON 解析失败');
|
|
74
|
+
// 有 DOM 损坏特征时不要用正则兜底(会提取到错误的短预览值)
|
|
75
|
+
if (DOM_PREVIEW_KEY_INDICATOR.test(cleaned) ||
|
|
76
|
+
DOM_CORRUPTION_INDICATOR.test(cleaned) ||
|
|
77
|
+
hasSmartQuotes(cleaned)) {
|
|
78
|
+
logger.info('[tool_calls] 检测到 DOM 损坏特征,跳过正则兜底,等待 Pattern 7 修复');
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
const extracted = extractToolCallByRegex(cleaned);
|
|
82
|
+
if (extracted) {
|
|
83
|
+
// SearchReplace 缺 old_str/new_str 说明值被 DOM 损坏了 → 交给 Pattern 7
|
|
84
|
+
if (extracted['name'] === 'SearchReplace') {
|
|
85
|
+
const args = (extracted['arguments'] ?? {});
|
|
86
|
+
if (!args['old_str'] || !args['new_str']) {
|
|
87
|
+
logger.info('[tool_calls] 正则兜底提取的 SearchReplace 不完整(缺少 old_str 或 new_str),跳过,等待 Pattern 7 修复');
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
logger.info({ name: extracted['name'] }, '[tool_calls] 正则兜底提取成功');
|
|
92
|
+
return extracted;
|
|
93
|
+
}
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
function safeJsonParse(text) {
|
|
97
|
+
try {
|
|
98
|
+
const value = JSON.parse(text);
|
|
99
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
100
|
+
? value
|
|
101
|
+
: undefined;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 修复 AI 输出的常见 JSON 问题(等价于 `_repair_json`)。
|
|
109
|
+
*
|
|
110
|
+
* - 字符串值内的真实换行 → `\n` / `\r` / `\t`
|
|
111
|
+
* - **非法转义序列**(如 `\d` `\w` `\s` 等正则字符)→ 双反斜杠转义
|
|
112
|
+
* - 尾部逗号 → 删除
|
|
113
|
+
* - 被截断在 `\` 处 → 补一个反斜杠
|
|
114
|
+
*/
|
|
115
|
+
export function repairJson(text) {
|
|
116
|
+
const result = [];
|
|
117
|
+
let inString = false;
|
|
118
|
+
let escapeNext = false;
|
|
119
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
120
|
+
const ch = text[i];
|
|
121
|
+
if (escapeNext) {
|
|
122
|
+
result.push('\\');
|
|
123
|
+
if (!VALID_JSON_ESCAPES.has(ch.toLowerCase())) {
|
|
124
|
+
// 非法转义 → 再加一个反斜杠来转义反斜杠本身
|
|
125
|
+
result.push('\\');
|
|
126
|
+
}
|
|
127
|
+
result.push(ch);
|
|
128
|
+
escapeNext = false;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (ch === '\\') {
|
|
132
|
+
escapeNext = true;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (ch === '"') {
|
|
136
|
+
inString = !inString;
|
|
137
|
+
result.push(ch);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (inString) {
|
|
141
|
+
if (ch === '\n')
|
|
142
|
+
result.push('\\n');
|
|
143
|
+
else if (ch === '\r')
|
|
144
|
+
result.push('\\r');
|
|
145
|
+
else if (ch === '\t')
|
|
146
|
+
result.push('\\t');
|
|
147
|
+
else
|
|
148
|
+
result.push(ch);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
result.push(ch);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
let repaired = result.join('');
|
|
155
|
+
if (escapeNext)
|
|
156
|
+
repaired += '\\';
|
|
157
|
+
// 尾部逗号
|
|
158
|
+
repaired = repaired.replace(/,\s*([}\]])/g, '$1');
|
|
159
|
+
return repaired;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* JSON 解析完全失败时的最后兜底:用正则从损坏文本里抠出参数。
|
|
163
|
+
*
|
|
164
|
+
* 提取到的值若含智能引号(DOM 损坏标志)则返回 undefined,
|
|
165
|
+
* 交给 `repairDomCorruptedJson` 做完整修复。
|
|
166
|
+
*/
|
|
167
|
+
export function extractToolCallByRegex(text) {
|
|
168
|
+
const nameMatch = /"name"\s*:\s*"([^"]+)"/.exec(text);
|
|
169
|
+
if (!nameMatch)
|
|
170
|
+
return undefined;
|
|
171
|
+
let name = nameMatch[1];
|
|
172
|
+
// 工具名损坏(含智能引号 / 冒号+key)时尝试抠出真实名
|
|
173
|
+
if (hasSmartQuotes(name) || name.includes(': ')) {
|
|
174
|
+
const realName = /:\s*[\u201c"]([A-Za-z_][A-Za-z0-9_]*)[\u201d"]/.exec(name);
|
|
175
|
+
if (realName) {
|
|
176
|
+
name = realName[1];
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/** 提取字段值,处理转义引号与未转义的真实换行。 */
|
|
183
|
+
const extractField = (fieldNames) => {
|
|
184
|
+
for (const fname of fieldNames) {
|
|
185
|
+
const pattern = new RegExp(`"${escapeRegExp(fname)}"\\s*:\\s*"((?:[^"\\\\]|\\\\.)*)"`, 'su');
|
|
186
|
+
const m = pattern.exec(text);
|
|
187
|
+
if (m) {
|
|
188
|
+
const rawVal = m[1];
|
|
189
|
+
return rawVal
|
|
190
|
+
.replace(/\\n/g, '\n')
|
|
191
|
+
.replace(/\\r/g, '\r')
|
|
192
|
+
.replace(/\\t/g, '\t')
|
|
193
|
+
.replace(/\\"/g, '"')
|
|
194
|
+
.replace(/\\\//g, '/')
|
|
195
|
+
.replace(/\\\\/g, '\\');
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return undefined;
|
|
199
|
+
};
|
|
200
|
+
const args = {};
|
|
201
|
+
const filePath = extractField(['file_path', 'path', 'filepath']);
|
|
202
|
+
if (filePath)
|
|
203
|
+
args['file_path'] = filePath;
|
|
204
|
+
const lowerName = name.toLowerCase();
|
|
205
|
+
if (['searchreplace', 'str_replace', 'edit_file'].includes(lowerName)) {
|
|
206
|
+
const oldStr = extractField(['old_str', 'old_string', 'old']);
|
|
207
|
+
const newStr = extractField(['new_str', 'new_string', 'new']);
|
|
208
|
+
if (oldStr)
|
|
209
|
+
args['old_str'] = oldStr;
|
|
210
|
+
if (newStr)
|
|
211
|
+
args['new_str'] = newStr;
|
|
212
|
+
}
|
|
213
|
+
else if (['write_file', 'create_file', 'writefile'].includes(lowerName)) {
|
|
214
|
+
const content = extractField(['content', 'code', 'text']);
|
|
215
|
+
if (content)
|
|
216
|
+
args['content'] = content;
|
|
217
|
+
}
|
|
218
|
+
if (Object.keys(args).length === 0)
|
|
219
|
+
return undefined;
|
|
220
|
+
// 值含智能引号 → 视为损坏,交给 Pattern 7
|
|
221
|
+
for (const v of Object.values(args)) {
|
|
222
|
+
if (typeof v === 'string' && hasSmartQuotes(v)) {
|
|
223
|
+
logger.info('[tool_calls] 正则提取的值包含智能引号(DOM 损坏),返回 undefined 让 Pattern 7 处理');
|
|
224
|
+
return undefined;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return { name, arguments: args };
|
|
228
|
+
}
|
|
229
|
+
/** 转义正则字面量(等价于 Python `re.escape`,覆盖所有元字符)。 */
|
|
230
|
+
export function escapeRegExp(text) {
|
|
231
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
232
|
+
}
|
|
233
|
+
/** 提取复杂多行字段时用作值边界的已知 key 列表。 */
|
|
234
|
+
const KNOWN_KEYS_FOR_BOUNDARY = [
|
|
235
|
+
'name', 'arguments',
|
|
236
|
+
'path', 'file_path', 'filePath', 'filepath',
|
|
237
|
+
'old_str', 'new_str', 'old_string', 'new_string',
|
|
238
|
+
'oldText', 'newText', 'old_text', 'new_text',
|
|
239
|
+
'search', 'replace', 'find', 'replacement',
|
|
240
|
+
'content', 'command', 'pattern', 'query', 'url',
|
|
241
|
+
'description', 'explanation', 'information_request',
|
|
242
|
+
'output_mode', 'glob', 'type', 'multiline',
|
|
243
|
+
'offset', 'limit', '-n', '-i', '-C', '-B', '-A',
|
|
244
|
+
'head_limit',
|
|
245
|
+
'cwd', 'target_terminal', 'command_type',
|
|
246
|
+
'blocking', 'requires_approval',
|
|
247
|
+
'questions', 'options', 'header',
|
|
248
|
+
'merge', 'summary', 'todos',
|
|
249
|
+
'preview_url', 'command_id',
|
|
250
|
+
'objective', 'token_budget', 'status',
|
|
251
|
+
'server_name', 'tool_name', 'args',
|
|
252
|
+
'target_directories', 'ignore',
|
|
253
|
+
'skill', 'subagent_type', 'response_language',
|
|
254
|
+
];
|
|
255
|
+
/**
|
|
256
|
+
* 从 DOM 损坏的 JSON 中提取复杂多行字段值(等价于 `_extract_complex_field_from_corrupted`)。
|
|
257
|
+
*
|
|
258
|
+
* 三种损坏模式:
|
|
259
|
+
* - A:key 重复(预览值 + 完整值)
|
|
260
|
+
* - B:值提前闭合(值里的引号未转义)→ 靠「下一个已知 key」定位边界
|
|
261
|
+
* - C:无损坏,普通 `"field": "value"`
|
|
262
|
+
*/
|
|
263
|
+
export function extractComplexFieldFromCorrupted(text, field) {
|
|
264
|
+
const normalized = text.replace(/\u201c/g, '"').replace(/\u201d/g, '"');
|
|
265
|
+
const esc = escapeRegExp(field);
|
|
266
|
+
// 模式 A: "field": "preview"field": "full_value"
|
|
267
|
+
const patternA = new RegExp(`"${esc}"\\s*:\\s*".*?"${esc}"\\s*:\\s*"((?:[^"\\\\]|\\\\.)*)"`, 'su');
|
|
268
|
+
const ma = patternA.exec(normalized);
|
|
269
|
+
if (ma)
|
|
270
|
+
return cleanDomHtml(ma[1]);
|
|
271
|
+
// 模式 B: 值提前闭合 → 提取到「下一个已知 key」或闭合大括号之前
|
|
272
|
+
const startMatch = new RegExp(`"${esc}"\\s*:\\s*"`, 'u').exec(normalized);
|
|
273
|
+
if (startMatch) {
|
|
274
|
+
const rest = normalized.slice(startMatch.index + startMatch[0].length);
|
|
275
|
+
let nextKeyPos = rest.length;
|
|
276
|
+
for (const key of KNOWN_KEYS_FOR_BOUNDARY) {
|
|
277
|
+
if (key === field)
|
|
278
|
+
continue;
|
|
279
|
+
const bm = new RegExp(`",\\s*"${escapeRegExp(key)}"\\s*:`, 'u').exec(rest);
|
|
280
|
+
if (bm && bm.index < nextKeyPos)
|
|
281
|
+
nextKeyPos = bm.index;
|
|
282
|
+
}
|
|
283
|
+
const closeBrace = /"\s*\}/u.exec(rest);
|
|
284
|
+
if (closeBrace && closeBrace.index < nextKeyPos)
|
|
285
|
+
nextKeyPos = closeBrace.index;
|
|
286
|
+
const value = rest.slice(0, nextKeyPos);
|
|
287
|
+
if (value)
|
|
288
|
+
return cleanDomHtml(value);
|
|
289
|
+
}
|
|
290
|
+
// 模式 C: 无损坏
|
|
291
|
+
const patternC = new RegExp(`"${esc}"\\s*:\\s*"((?:[^"\\\\]|\\\\.)*)"`, 'su');
|
|
292
|
+
const mc = patternC.exec(normalized);
|
|
293
|
+
if (mc)
|
|
294
|
+
return cleanDomHtml(mc[1]);
|
|
295
|
+
return undefined;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* 从 DOM 损坏的 JSON 中提取文件路径值(等价于 `_extract_path_from_corrupted`)。
|
|
299
|
+
*
|
|
300
|
+
* 路径值会出现多个「预览前缀」,**最长的那一个**才是完整路径。
|
|
301
|
+
*/
|
|
302
|
+
export function extractPathFromCorrupted(text) {
|
|
303
|
+
const paths = [
|
|
304
|
+
...text.matchAll(/\/[A-Za-z0-9/._\-~]+/g),
|
|
305
|
+
].map((m) => m[0]);
|
|
306
|
+
paths.push(...[...text.matchAll(/[A-Za-z]:[/\\][A-Za-z0-9/._\-~\\]+/g)].map((m) => m[0]));
|
|
307
|
+
if (paths.length === 0)
|
|
308
|
+
return undefined;
|
|
309
|
+
const unique = [...new Set(paths)];
|
|
310
|
+
return unique.reduce((longest, p) => (p.length > longest.length ? p : longest), '');
|
|
311
|
+
}
|
|
312
|
+
/** DOM 损坏修复时识别的已知工具名。 */
|
|
313
|
+
const KNOWN_TOOL_NAMES = new Set([
|
|
314
|
+
'Read', 'Write', 'Edit', 'SearchReplace', 'Grep', 'Glob',
|
|
315
|
+
'RunCommand', 'TodoWrite', 'WebSearch', 'WebFetch',
|
|
316
|
+
'List', 'DeleteFile', 'Bash', 'LS',
|
|
317
|
+
'write_file', 'edit_file',
|
|
318
|
+
'EditFile', 'WriteFile', 'create_file',
|
|
319
|
+
'Task', 'Skill', 'SearchCodebase',
|
|
320
|
+
'CheckCommandStatus', 'StopCommand', 'GetDiagnostics',
|
|
321
|
+
'AskUserQuestion', 'NotifyUser', 'OpenPreview',
|
|
322
|
+
'get_goal', 'create_goal', 'update_goal', 'run_mcp',
|
|
323
|
+
]);
|
|
324
|
+
/** DOM 损坏修复时识别的已知参数 key。 */
|
|
325
|
+
const KNOWN_ARG_KEYS = new Set([
|
|
326
|
+
'path', 'file_path', 'filePath', 'command', 'old_str', 'new_str',
|
|
327
|
+
'old_string', 'new_string', 'content', 'url', 'query', 'pattern',
|
|
328
|
+
'file_paths', 'todos', 'description', 'name', 'arguments',
|
|
329
|
+
'oldText', 'newText', 'old_text', 'new_text',
|
|
330
|
+
'search', 'replace', 'find', 'replacement',
|
|
331
|
+
'start_line', 'end_line', 'output_mode',
|
|
332
|
+
'explanation', 'questions', 'preview_url', 'command_id',
|
|
333
|
+
'objective', 'status', 'token_budget',
|
|
334
|
+
'server_name', 'tool_name', 'args',
|
|
335
|
+
'subagent_type', 'response_language',
|
|
336
|
+
'information_request', 'target_directories',
|
|
337
|
+
'ignore', 'offset', 'limit', 'merge', 'summary',
|
|
338
|
+
'glob', 'type', 'head_limit', 'multiline',
|
|
339
|
+
'cwd', 'target_terminal', 'command_type', 'blocking',
|
|
340
|
+
'wait_ms_before_async', 'requires_approval',
|
|
341
|
+
'output_character_count', 'skip_character_count',
|
|
342
|
+
'output_priority', 'filter', 'num', 'lr',
|
|
343
|
+
'-B', '-A', '-C', '-n', '-i',
|
|
344
|
+
]);
|
|
345
|
+
const PATH_FIELDS = ['path', 'file_path', 'filePath'];
|
|
346
|
+
const OLD_STR_KEYS = ['old_str', 'old_string', 'oldText', 'old_text', 'search', 'find'];
|
|
347
|
+
const NEW_STR_KEYS = ['new_str', 'new_string', 'newText', 'new_text', 'replace', 'replacement'];
|
|
348
|
+
/** 需要从原始损坏文本里重新提取完整值(而非用 token 短前缀)的字段。 */
|
|
349
|
+
const COMPLEX_FIELDS = [
|
|
350
|
+
'old_str', 'new_str', 'old_string', 'new_string', 'content', 'command',
|
|
351
|
+
'oldText', 'newText', 'old_text', 'new_text',
|
|
352
|
+
'search', 'replace', 'find', 'replacement',
|
|
353
|
+
'explanation', 'description', 'query', 'information_request',
|
|
354
|
+
];
|
|
355
|
+
const SIMPLE_FIELDS = ['path', 'file_path', 'filePath', 'pattern', 'query', 'url', 'description'];
|
|
356
|
+
/** 别名 → 标准字段名。 */
|
|
357
|
+
function canonicalField(field) {
|
|
358
|
+
if (['old_string', 'oldText', 'old_text', 'search', 'find'].includes(field))
|
|
359
|
+
return 'old_str';
|
|
360
|
+
if (['new_string', 'newText', 'new_text', 'replace', 'replacement'].includes(field)) {
|
|
361
|
+
return 'new_str';
|
|
362
|
+
}
|
|
363
|
+
return field;
|
|
364
|
+
}
|
|
365
|
+
/** 手动反转义(`JSON.parse` 失败时的兜底)。 */
|
|
366
|
+
function manualUnescape(value) {
|
|
367
|
+
return value
|
|
368
|
+
.replace(/\\\\n/g, '\n')
|
|
369
|
+
.replace(/\\\\r/g, '\r')
|
|
370
|
+
.replace(/\\\\t/g, '\t')
|
|
371
|
+
.replace(/\\\\"/g, '"')
|
|
372
|
+
.replace(/\\\\\//g, '/')
|
|
373
|
+
.replace(/\\\\\\\\/g, '\\')
|
|
374
|
+
.replace(/\\n/g, '\n')
|
|
375
|
+
.replace(/\\r/g, '\r')
|
|
376
|
+
.replace(/\\t/g, '\t')
|
|
377
|
+
.replace(/\\"/g, '"')
|
|
378
|
+
.replace(/\\\//g, '/')
|
|
379
|
+
.replace(/\\\\/g, '\\');
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* 修复被 DOM 渲染破坏的 tool_call JSON(等价于 `_repair_dom_corrupted_json`)。
|
|
383
|
+
*
|
|
384
|
+
* 策略:**不逐字符修复**(`\"` → `"` 会产生 `""` 破坏引号配对),
|
|
385
|
+
* 而是从损坏文本里按 token 提取已知 key/value,再重建 JSON。
|
|
386
|
+
*
|
|
387
|
+
* 修复顺序(每一步都有踩坑原因):
|
|
388
|
+
* 1. 先归一化智能引号
|
|
389
|
+
* 2. **再清理 HTML 标签** —— 必须在引号归一化/取 token 之前,
|
|
390
|
+
* 否则 span 的属性引号会打乱后续处理(曾导致 Pattern 7 修复失败、长度不变)
|
|
391
|
+
* 3. token 提取 → 找工具名 / 参数对
|
|
392
|
+
* 4. 路径字段用「最长 `/-前缀字符串`」修正(token 只能拿到 `/ho` 这种短前缀)
|
|
393
|
+
* 5. 工具名缺失时按参数推断
|
|
394
|
+
* 6. 复杂字段用正则重新提取完整值,并移除 token 阶段的短垃圾值
|
|
395
|
+
*/
|
|
396
|
+
export function repairDomCorruptedJson(text) {
|
|
397
|
+
if (!text || !text.includes('{'))
|
|
398
|
+
return text;
|
|
399
|
+
let working = text.replace(/\u201c/g, '"').replace(/\u201d/g, '"');
|
|
400
|
+
working = working.replace(/\u2018/g, "'").replace(/\u2019/g, "'");
|
|
401
|
+
working = cleanDomHtml(working);
|
|
402
|
+
const start = working.indexOf('{');
|
|
403
|
+
const end = working.lastIndexOf('}');
|
|
404
|
+
if (start < 0 || end <= start)
|
|
405
|
+
return text;
|
|
406
|
+
const segment = working.slice(start, end + 1);
|
|
407
|
+
// 把所有引号(含转义)换成空格,便于按 token 切分
|
|
408
|
+
const cleaned = segment.replace(/\\"|"/g, ' ');
|
|
409
|
+
const tokens = [
|
|
410
|
+
...cleaned.matchAll(/[A-Za-z_][A-Za-z0-9_]*|\/[A-Za-z0-9/._\-]*/g),
|
|
411
|
+
].map((m) => m[0]);
|
|
412
|
+
if (tokens.length === 0)
|
|
413
|
+
return text;
|
|
414
|
+
let nameValue;
|
|
415
|
+
for (const tok of tokens) {
|
|
416
|
+
if (KNOWN_TOOL_NAMES.has(tok)) {
|
|
417
|
+
nameValue = tok;
|
|
418
|
+
break;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
const args = {};
|
|
422
|
+
let j = 0;
|
|
423
|
+
while (j < tokens.length) {
|
|
424
|
+
const tok = tokens[j];
|
|
425
|
+
if (KNOWN_ARG_KEYS.has(tok) &&
|
|
426
|
+
tok !== 'name' &&
|
|
427
|
+
tok !== 'arguments' &&
|
|
428
|
+
j + 1 < tokens.length) {
|
|
429
|
+
const val = tokens[j + 1];
|
|
430
|
+
if (!KNOWN_ARG_KEYS.has(val) && !KNOWN_TOOL_NAMES.has(val)) {
|
|
431
|
+
args[tok] = val;
|
|
432
|
+
j += 2;
|
|
433
|
+
continue;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
j += 1;
|
|
437
|
+
}
|
|
438
|
+
// 路径字段:用最长的 /-前缀字符串覆盖 token 短前缀
|
|
439
|
+
const pathValue = extractPathFromCorrupted(segment);
|
|
440
|
+
if (pathValue) {
|
|
441
|
+
const existingKey = PATH_FIELDS.find((k) => k in args);
|
|
442
|
+
args[existingKey ?? 'file_path'] = pathValue;
|
|
443
|
+
}
|
|
444
|
+
// 工具名推断
|
|
445
|
+
if (!nameValue) {
|
|
446
|
+
const hasOld = OLD_STR_KEYS.some((k) => k in args);
|
|
447
|
+
const hasNew = NEW_STR_KEYS.some((k) => k in args);
|
|
448
|
+
const hasPath = PATH_FIELDS.some((k) => k in args);
|
|
449
|
+
if (hasOld && hasNew)
|
|
450
|
+
nameValue = 'SearchReplace';
|
|
451
|
+
else if ('content' in args && hasPath)
|
|
452
|
+
nameValue = 'write_file';
|
|
453
|
+
else if ('command' in args)
|
|
454
|
+
nameValue = 'RunCommand';
|
|
455
|
+
else if (hasPath)
|
|
456
|
+
nameValue = 'Read';
|
|
457
|
+
else
|
|
458
|
+
return text; // 无法推断 → 放弃修复
|
|
459
|
+
}
|
|
460
|
+
const extracted = new Set();
|
|
461
|
+
// 复杂多行字段:正则重取,覆盖 token 的短垃圾值
|
|
462
|
+
for (const field of COMPLEX_FIELDS) {
|
|
463
|
+
const norm = canonicalField(field);
|
|
464
|
+
if (extracted.has(norm))
|
|
465
|
+
continue;
|
|
466
|
+
const value = extractComplexFieldFromCorrupted(segment, field);
|
|
467
|
+
if (value) {
|
|
468
|
+
let unescaped = value;
|
|
469
|
+
try {
|
|
470
|
+
const undoubled = value.replace(/\\\\/g, '\\');
|
|
471
|
+
unescaped = JSON.parse(`"${undoubled}"`);
|
|
472
|
+
}
|
|
473
|
+
catch {
|
|
474
|
+
unescaped = manualUnescape(value);
|
|
475
|
+
}
|
|
476
|
+
args[norm] = unescaped;
|
|
477
|
+
extracted.add(norm);
|
|
478
|
+
}
|
|
479
|
+
else if (norm in args && args[norm].length < 50) {
|
|
480
|
+
delete args[norm];
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
// 简单字段:同样用正则重取(token 处理不了 "." 或 "**/*.html" 这类值)
|
|
484
|
+
for (const field of SIMPLE_FIELDS) {
|
|
485
|
+
if (extracted.has(field))
|
|
486
|
+
continue;
|
|
487
|
+
const existing = args[field] ?? '';
|
|
488
|
+
if (existing.length > 1 &&
|
|
489
|
+
(existing.startsWith('/') || /^[A-Za-z]:[/\\]/.test(existing))) {
|
|
490
|
+
continue; // 已由路径提取正确设置
|
|
491
|
+
}
|
|
492
|
+
const value = extractComplexFieldFromCorrupted(segment, field);
|
|
493
|
+
if (value) {
|
|
494
|
+
args[field] = value;
|
|
495
|
+
extracted.add(field);
|
|
496
|
+
}
|
|
497
|
+
else if (field in args && existing.length < 50) {
|
|
498
|
+
delete args[field];
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
// 清理所有值里的 DOM HTML
|
|
502
|
+
for (const [key, val] of Object.entries(args)) {
|
|
503
|
+
const cleanedVal = cleanDomHtml(val);
|
|
504
|
+
if (cleanedVal !== val)
|
|
505
|
+
args[key] = cleanedVal;
|
|
506
|
+
}
|
|
507
|
+
const repairedJson = JSON.stringify({ name: nameValue, arguments: args });
|
|
508
|
+
return working.slice(0, start) + repairedJson + working.slice(end + 1);
|
|
509
|
+
}
|
|
510
|
+
//# sourceMappingURL=repair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/tools/repair.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ChatMessage, MessageDict } from '../types/message.js';
|
|
2
|
+
/** AI 不确定路径时常用的编造前缀(必须排除)。 */
|
|
3
|
+
export declare const FABRICATED_PATH_PREFIXES: ReadonlyArray<string>;
|
|
4
|
+
/**
|
|
5
|
+
* 匹配显式声明的工作目录。
|
|
6
|
+
*
|
|
7
|
+
* 锚点需覆盖各 IDE 注入 `<user_info>` 的格式差异:
|
|
8
|
+
* - Trae / Cursor: `Working directory:` / `Primary working directory:`
|
|
9
|
+
* - CodeBuddy: `Workspace Folder:`
|
|
10
|
+
* - 通用: `Project root:` / `Project path:` / `工作目录:`
|
|
11
|
+
*/
|
|
12
|
+
export declare const WORKSPACE_PATH_PATTERNS: RegExp;
|
|
13
|
+
/** 匹配形如 `- /path/to/dir` 的行。 */
|
|
14
|
+
export declare const PATH_LINE_PATTERN: RegExp;
|
|
15
|
+
/**
|
|
16
|
+
* API 项目自身目录(用于排除 —— 用户项目不可能在这个目录下)。
|
|
17
|
+
*
|
|
18
|
+
* 从模块位置往上两级:`src/tools/` → 仓库根,`dist/tools/` → 仓库根,两者一致。
|
|
19
|
+
*/
|
|
20
|
+
export declare const SELF_PROJECT_DIR: string;
|
|
21
|
+
export interface ExtractWorkspaceOptions {
|
|
22
|
+
/** 「是否是目录」判定;默认读文件系统。 */
|
|
23
|
+
isDir?: (path: string) => boolean;
|
|
24
|
+
/** 要排除的项目自身目录;默认 {@link SELF_PROJECT_DIR}。 */
|
|
25
|
+
selfDir?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 从消息里提取工作目录 / 项目根路径;找不到返回空字符串。
|
|
29
|
+
*
|
|
30
|
+
* 优先级:user 显式声明(3) > system 显式声明(2) > system 路径推断(1)。
|
|
31
|
+
*/
|
|
32
|
+
export declare function extractWorkspacePath(messages: ReadonlyArray<ChatMessage | MessageDict>, options?: ExtractWorkspaceOptions): string;
|
|
33
|
+
/**
|
|
34
|
+
* 从消息历史里提取出现过的真实文件路径。
|
|
35
|
+
*
|
|
36
|
+
* ⚠️ **只从 tool 结果里提取**,不从 AI 的 `tool_calls` 里提取 ——
|
|
37
|
+
* 后者可能是模型编造的。
|
|
38
|
+
*/
|
|
39
|
+
export declare function extractFilePathsFromMessages(messages: ReadonlyArray<ChatMessage | MessageDict>): string[];
|
|
40
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/tools/workspace.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIpE,8BAA8B;AAC9B,eAAO,MAAM,wBAAwB,EAAE,aAAa,CAAC,MAAM,CAO1D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,QAQnC,CAAC;AAKF,gCAAgC;AAChC,eAAO,MAAM,iBAAiB,QAG7B,CAAC;AAwBF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAG9B,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,yBAAyB;IACzB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAUD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,aAAa,CAAC,WAAW,GAAG,WAAW,CAAC,EAClD,OAAO,GAAE,uBAA4B,GACpC,MAAM,CA2HR;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,aAAa,CAAC,WAAW,GAAG,WAAW,CAAC,GACjD,MAAM,EAAE,CAgCV"}
|