bernard-agent 0.8.1 → 0.9.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/README.md +80 -44
- package/dist/agent.d.ts +14 -3
- package/dist/agent.js +228 -38
- package/dist/agent.js.map +1 -1
- package/dist/builtin-specialists/correction-agent.json +32 -0
- package/dist/builtin-specialists/file-wrapper.json +43 -0
- package/dist/builtin-specialists/shell-wrapper.json +50 -0
- package/dist/builtin-specialists/specialist-creator.json +32 -0
- package/dist/builtin-specialists/web-wrapper.json +38 -0
- package/dist/candidate-bootstrap.d.ts +18 -0
- package/dist/candidate-bootstrap.js +61 -0
- package/dist/candidate-bootstrap.js.map +1 -0
- package/dist/config.d.ts +126 -10
- package/dist/config.js +222 -45
- package/dist/config.js.map +1 -1
- package/dist/context.js +23 -6
- package/dist/context.js.map +1 -1
- package/dist/correction-candidates.d.ts +54 -0
- package/dist/correction-candidates.js +138 -0
- package/dist/correction-candidates.js.map +1 -0
- package/dist/correction.d.ts +67 -0
- package/dist/correction.js +138 -0
- package/dist/correction.js.map +1 -0
- package/dist/critic.js +2 -1
- package/dist/critic.js.map +1 -1
- package/dist/cron/notes-store.d.ts +41 -0
- package/dist/cron/notes-store.js +134 -0
- package/dist/cron/notes-store.js.map +1 -0
- package/dist/cron/runner.js +25 -3
- package/dist/cron/runner.js.map +1 -1
- package/dist/cron/scoped-notes-tools.d.ts +24 -0
- package/dist/cron/scoped-notes-tools.js +50 -0
- package/dist/cron/scoped-notes-tools.js.map +1 -0
- package/dist/custom-providers.d.ts +80 -0
- package/dist/custom-providers.js +238 -0
- package/dist/custom-providers.js.map +1 -0
- package/dist/fs-utils.d.ts +2 -0
- package/dist/fs-utils.js +44 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/history.js +3 -1
- package/dist/history.js.map +1 -1
- package/dist/image.d.ts +59 -0
- package/dist/image.js +228 -0
- package/dist/image.js.map +1 -0
- package/dist/index.js +72 -4
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +1 -1
- package/dist/mcp.js.map +1 -1
- package/dist/memory.d.ts +13 -0
- package/dist/memory.js +45 -4
- package/dist/memory.js.map +1 -1
- package/dist/menu.d.ts +97 -0
- package/dist/menu.js +338 -0
- package/dist/menu.js.map +1 -0
- package/dist/os-info.d.ts +22 -0
- package/dist/os-info.js +111 -0
- package/dist/os-info.js.map +1 -0
- package/dist/output.d.ts +35 -1
- package/dist/output.js +256 -45
- package/dist/output.js.map +1 -1
- package/dist/pac.d.ts +14 -2
- package/dist/pac.js +5 -5
- package/dist/pac.js.map +1 -1
- package/dist/paths.d.ts +5 -0
- package/dist/paths.js +6 -1
- package/dist/paths.js.map +1 -1
- package/dist/plan-store.d.ts +47 -0
- package/dist/plan-store.js +94 -0
- package/dist/plan-store.js.map +1 -0
- package/dist/prompt-rewriter.d.ts +29 -0
- package/dist/prompt-rewriter.js +155 -0
- package/dist/prompt-rewriter.js.map +1 -0
- package/dist/providers/index.d.ts +56 -4
- package/dist/providers/index.js +86 -5
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/profiles.d.ts +37 -0
- package/dist/providers/profiles.js +110 -0
- package/dist/providers/profiles.js.map +1 -0
- package/dist/providers/types.d.ts +11 -2
- package/dist/providers/types.js +3 -0
- package/dist/providers/types.js.map +1 -1
- package/dist/rag-query.js +15 -1
- package/dist/rag-query.js.map +1 -1
- package/dist/react.d.ts +38 -0
- package/dist/react.js +116 -0
- package/dist/react.js.map +1 -0
- package/dist/reasoning-log.d.ts +30 -0
- package/dist/reasoning-log.js +102 -0
- package/dist/reasoning-log.js.map +1 -0
- package/dist/reference-resolver.d.ts +47 -0
- package/dist/reference-resolver.js +316 -0
- package/dist/reference-resolver.js.map +1 -0
- package/dist/reference-tool-lookup.d.ts +37 -0
- package/dist/reference-tool-lookup.js +318 -0
- package/dist/reference-tool-lookup.js.map +1 -0
- package/dist/repl.js +1038 -371
- package/dist/repl.js.map +1 -1
- package/dist/setup.js +2 -1
- package/dist/setup.js.map +1 -1
- package/dist/specialist-detector.js +2 -1
- package/dist/specialist-detector.js.map +1 -1
- package/dist/specialists.d.ts +74 -3
- package/dist/specialists.js +152 -20
- package/dist/specialists.js.map +1 -1
- package/dist/structured-output.d.ts +58 -0
- package/dist/structured-output.js +138 -0
- package/dist/structured-output.js.map +1 -0
- package/dist/theme.d.ts +2 -0
- package/dist/theme.js +18 -12
- package/dist/theme.js.map +1 -1
- package/dist/tool-call-repair.d.ts +29 -0
- package/dist/tool-call-repair.js +99 -0
- package/dist/tool-call-repair.js.map +1 -0
- package/dist/tool-profiles.d.ts +70 -0
- package/dist/tool-profiles.js +385 -0
- package/dist/tool-profiles.js.map +1 -0
- package/dist/tools/activity-summary.d.ts +15 -0
- package/dist/tools/activity-summary.js +44 -0
- package/dist/tools/activity-summary.js.map +1 -0
- package/dist/tools/ask-user.d.ts +49 -0
- package/dist/tools/ask-user.js +52 -0
- package/dist/tools/ask-user.js.map +1 -0
- package/dist/tools/augment.d.ts +17 -0
- package/dist/tools/augment.js +102 -0
- package/dist/tools/augment.js.map +1 -0
- package/dist/tools/cron-logs.js +7 -0
- package/dist/tools/cron-logs.js.map +1 -1
- package/dist/tools/cron-notes.d.ts +52 -0
- package/dist/tools/cron-notes.js +105 -0
- package/dist/tools/cron-notes.js.map +1 -0
- package/dist/tools/datetime.d.ts +7 -0
- package/dist/tools/datetime.js +29 -3
- package/dist/tools/datetime.js.map +1 -1
- package/dist/tools/evaluate.d.ts +20 -0
- package/dist/tools/evaluate.js +29 -0
- package/dist/tools/evaluate.js.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/mcp.d.ts +3 -3
- package/dist/tools/plan.d.ts +81 -0
- package/dist/tools/plan.js +108 -0
- package/dist/tools/plan.js.map +1 -0
- package/dist/tools/result-cap.d.ts +24 -0
- package/dist/tools/result-cap.js +44 -0
- package/dist/tools/result-cap.js.map +1 -0
- package/dist/tools/routine.d.ts +3 -3
- package/dist/tools/shell.d.ts +14 -1
- package/dist/tools/shell.js +86 -4
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/specialist-run.d.ts +5 -3
- package/dist/tools/specialist-run.js +115 -24
- package/dist/tools/specialist-run.js.map +1 -1
- package/dist/tools/specialist.d.ts +83 -3
- package/dist/tools/specialist.js +83 -3
- package/dist/tools/specialist.js.map +1 -1
- package/dist/tools/subagent.js +32 -14
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/task.d.ts +5 -5
- package/dist/tools/task.js +9 -42
- package/dist/tools/task.js.map +1 -1
- package/dist/tools/think.d.ts +18 -0
- package/dist/tools/think.js +25 -0
- package/dist/tools/think.js.map +1 -0
- package/dist/tools/tool-wrapper-run.d.ts +121 -0
- package/dist/tools/tool-wrapper-run.js +382 -0
- package/dist/tools/tool-wrapper-run.js.map +1 -0
- package/dist/tools/types.d.ts +28 -2
- package/dist/tools/web-search.d.ts +31 -0
- package/dist/tools/web-search.js +172 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/wrap-with-specialist.d.ts +55 -0
- package/dist/tools/wrap-with-specialist.js +137 -0
- package/dist/tools/wrap-with-specialist.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isAllowedLookupTool = isAllowedLookupTool;
|
|
4
|
+
exports.selectLookupTool = selectLookupTool;
|
|
5
|
+
exports.executeLookupTool = executeLookupTool;
|
|
6
|
+
exports.interpretLookupResult = interpretLookupResult;
|
|
7
|
+
exports.runReferenceLookup = runReferenceLookup;
|
|
8
|
+
const ai_1 = require("ai");
|
|
9
|
+
const index_js_1 = require("./providers/index.js");
|
|
10
|
+
const logger_js_1 = require("./logger.js");
|
|
11
|
+
/**
|
|
12
|
+
* Pre-fallback module that runs only when the resolver returns
|
|
13
|
+
* `status: 'unknown'`. Tries one read-only lookup tool to resolve a named
|
|
14
|
+
* reference (e.g. "my brother" via a Google Contacts MCP) before the REPL
|
|
15
|
+
* falls back to prompting the user for free-form text. Fails open at every
|
|
16
|
+
* stage so any error degrades to today's user-prompt path.
|
|
17
|
+
*/
|
|
18
|
+
function extractJsonObject(text) {
|
|
19
|
+
const match = text.match(/\{[\s\S]*\}/);
|
|
20
|
+
if (!match)
|
|
21
|
+
return null;
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(match[0]);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const LOOKUP_TIMEOUT_MS = 5000;
|
|
30
|
+
const SELECT_MAX_TOKENS = 256;
|
|
31
|
+
const INTERPRET_MAX_TOKENS = 256;
|
|
32
|
+
const TOOL_RESULT_PREVIEW_CHARS = 4000;
|
|
33
|
+
const MAX_TOOLS_IN_PROMPT = 8;
|
|
34
|
+
/**
|
|
35
|
+
* Suffix-based read-only allowlist. MCP tools whose name ends in any of these
|
|
36
|
+
* verbs are treated as safe lookup candidates. Excludes write verbs like
|
|
37
|
+
* `create`, `update`, `delete`, `send`, `post`.
|
|
38
|
+
*/
|
|
39
|
+
const READONLY_SUFFIX_RE = /(?:^|_)(search|list|find|get|query|read|lookup)$/i;
|
|
40
|
+
/**
|
|
41
|
+
* Built-in (non-MCP) tools that are always allowed for resolver lookups.
|
|
42
|
+
* Limited to read-only network tools — no shell, no file write, no memory.
|
|
43
|
+
*/
|
|
44
|
+
const ALWAYS_ALLOWED_BUILTINS = new Set(['web_search', 'web_read']);
|
|
45
|
+
/**
|
|
46
|
+
* Returns true when the named tool is safe for the resolver lookup pass.
|
|
47
|
+
*
|
|
48
|
+
* An MCP tool is identified by `__` in its name (the `@ai-sdk/mcp` convention).
|
|
49
|
+
* MCP tools must additionally match {@link READONLY_SUFFIX_RE}. Built-in tools
|
|
50
|
+
* are restricted to {@link ALWAYS_ALLOWED_BUILTINS} unless explicitly extended
|
|
51
|
+
* via `extraAllowed` (sourced from `BERNARD_LOOKUP_TOOLS`).
|
|
52
|
+
*/
|
|
53
|
+
function isAllowedLookupTool(name, extraAllowed = []) {
|
|
54
|
+
if (extraAllowed.includes(name))
|
|
55
|
+
return true;
|
|
56
|
+
if (ALWAYS_ALLOWED_BUILTINS.has(name))
|
|
57
|
+
return true;
|
|
58
|
+
if (name.includes('__')) {
|
|
59
|
+
return READONLY_SUFFIX_RE.test(name);
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
function describeTool(name, tool) {
|
|
64
|
+
const description = typeof tool?.description === 'string' ? tool.description : '';
|
|
65
|
+
// MCP tools converted via `jsonSchema(...)` from @ai-sdk/ui-utils expose the
|
|
66
|
+
// raw schema as `_jsonSchema`. Bare-schema tools may use `jsonSchema`.
|
|
67
|
+
let schema;
|
|
68
|
+
const params = tool?.parameters;
|
|
69
|
+
if (params && typeof params === 'object') {
|
|
70
|
+
if ('_jsonSchema' in params) {
|
|
71
|
+
schema = params._jsonSchema;
|
|
72
|
+
}
|
|
73
|
+
else if ('jsonSchema' in params) {
|
|
74
|
+
schema = params.jsonSchema;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { name, description, schema };
|
|
78
|
+
}
|
|
79
|
+
function collectAllowedTools(tools, extraAllowed) {
|
|
80
|
+
const out = [];
|
|
81
|
+
for (const [name, tool] of Object.entries(tools)) {
|
|
82
|
+
if (!tool || typeof tool.execute !== 'function')
|
|
83
|
+
continue;
|
|
84
|
+
if (!isAllowedLookupTool(name, extraAllowed))
|
|
85
|
+
continue;
|
|
86
|
+
out.push(describeTool(name, tool));
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
const SELECT_SYSTEM_PROMPT = `You pick at most one read-only lookup tool to resolve a named reference (e.g. "my brother", "my dentist") against the user's external systems.
|
|
91
|
+
|
|
92
|
+
Output strict JSON and nothing else. One of:
|
|
93
|
+
{"status":"none"}
|
|
94
|
+
{"status":"call","toolName":"...","args":{...}}
|
|
95
|
+
|
|
96
|
+
Rules:
|
|
97
|
+
- Pick ONE tool. If no listed tool is plausibly capable of resolving the reference, return {"status":"none"}.
|
|
98
|
+
- Args MUST match the tool's input schema. Common arg keys are "query", "q", "name", "search". Use whatever the schema specifies.
|
|
99
|
+
- The query you pass should be a short search string derived from the reference (e.g. "brother" for "my brother"). Do not invent specific names.
|
|
100
|
+
- Do NOT pick a tool just to be helpful — if uncertain, "none". A failed lookup costs us a round-trip; "none" is cheap.`;
|
|
101
|
+
function buildSelectUserMessage(reference, candidates) {
|
|
102
|
+
const lines = [`## Reference to resolve\n"${reference}"`];
|
|
103
|
+
lines.push('## Available read-only lookup tools');
|
|
104
|
+
const limited = candidates.slice(0, MAX_TOOLS_IN_PROMPT);
|
|
105
|
+
for (const t of limited) {
|
|
106
|
+
const desc = t.description ? ` — ${t.description}` : '';
|
|
107
|
+
lines.push(`- ${t.name}${desc}`);
|
|
108
|
+
if (t.schema) {
|
|
109
|
+
try {
|
|
110
|
+
lines.push(` schema: ${JSON.stringify(t.schema).slice(0, 600)}`);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
/* ignore */
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (candidates.length > limited.length) {
|
|
118
|
+
lines.push(`- … ${candidates.length - limited.length} more omitted for brevity`);
|
|
119
|
+
}
|
|
120
|
+
return lines.join('\n');
|
|
121
|
+
}
|
|
122
|
+
function parseSelectResponse(text) {
|
|
123
|
+
const parsed = extractJsonObject(text);
|
|
124
|
+
if (!parsed || parsed.status === 'none')
|
|
125
|
+
return null;
|
|
126
|
+
if (parsed.status === 'call' && typeof parsed.toolName === 'string') {
|
|
127
|
+
return { toolName: parsed.toolName, args: parsed.args ?? {} };
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
async function selectLookupTool(reference, candidates, config, abortSignal) {
|
|
132
|
+
if (candidates.length === 0)
|
|
133
|
+
return null;
|
|
134
|
+
try {
|
|
135
|
+
const result = await (0, ai_1.generateText)({
|
|
136
|
+
model: (0, index_js_1.getModelForConfig)(config, config.provider, config.model),
|
|
137
|
+
providerOptions: (0, index_js_1.getProviderOptionsForConfig)(config, config.provider),
|
|
138
|
+
system: SELECT_SYSTEM_PROMPT,
|
|
139
|
+
messages: [{ role: 'user', content: buildSelectUserMessage(reference, candidates) }],
|
|
140
|
+
maxSteps: 1,
|
|
141
|
+
maxTokens: SELECT_MAX_TOKENS,
|
|
142
|
+
temperature: 0,
|
|
143
|
+
abortSignal,
|
|
144
|
+
});
|
|
145
|
+
if (!result.text)
|
|
146
|
+
return null;
|
|
147
|
+
const parsed = parseSelectResponse(result.text);
|
|
148
|
+
if (!parsed) {
|
|
149
|
+
(0, logger_js_1.debugLog)('reference-tool-lookup:select-parse-failed', result.text.slice(0, 200));
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
// The LLM may hallucinate a tool name not in the candidate list.
|
|
153
|
+
if (!candidates.some((c) => c.name === parsed.toolName)) {
|
|
154
|
+
(0, logger_js_1.debugLog)('reference-tool-lookup:select-unknown-tool', parsed.toolName);
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
return parsed;
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
(0, logger_js_1.debugLog)('reference-tool-lookup:select-error', err instanceof Error ? err.message : String(err));
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Composes the caller's abort signal with a 5 s timeout. The signal is best-
|
|
165
|
+
// effort: many MCP tools ignore `abortSignal`, so the real enforcement is the
|
|
166
|
+
// `Promise.race` in `executeLookupTool`. `AbortSignal.any` requires Node ≥20.3.
|
|
167
|
+
function withTimeout(signal) {
|
|
168
|
+
const timeoutSignal = AbortSignal.timeout(LOOKUP_TIMEOUT_MS);
|
|
169
|
+
if (!signal)
|
|
170
|
+
return timeoutSignal;
|
|
171
|
+
return AbortSignal.any([signal, timeoutSignal]);
|
|
172
|
+
}
|
|
173
|
+
async function executeLookupTool(toolName, args, tools, abortSignal) {
|
|
174
|
+
const tool = tools[toolName];
|
|
175
|
+
if (!tool || typeof tool.execute !== 'function')
|
|
176
|
+
return null;
|
|
177
|
+
// Hard timeout via Promise.race — if the tool ignores `abortSignal` (many
|
|
178
|
+
// MCP tools do), this still returns null after LOOKUP_TIMEOUT_MS so a hung
|
|
179
|
+
// tool can't stall the REPL.
|
|
180
|
+
let timer;
|
|
181
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
182
|
+
timer = setTimeout(() => {
|
|
183
|
+
(0, logger_js_1.debugLog)('reference-tool-lookup:execute-timeout', toolName);
|
|
184
|
+
resolve(null);
|
|
185
|
+
}, LOOKUP_TIMEOUT_MS);
|
|
186
|
+
});
|
|
187
|
+
try {
|
|
188
|
+
const execPromise = (async () => {
|
|
189
|
+
try {
|
|
190
|
+
return await tool.execute(args, {
|
|
191
|
+
toolCallId: `resolver-lookup-${Date.now()}`,
|
|
192
|
+
abortSignal: withTimeout(abortSignal),
|
|
193
|
+
messages: [],
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
(0, logger_js_1.debugLog)('reference-tool-lookup:execute-error', err instanceof Error ? err.message : String(err));
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
})();
|
|
201
|
+
const result = await Promise.race([execPromise, timeoutPromise]);
|
|
202
|
+
if (result === undefined || result === null)
|
|
203
|
+
return null;
|
|
204
|
+
if (typeof result === 'string')
|
|
205
|
+
return result.slice(0, TOOL_RESULT_PREVIEW_CHARS);
|
|
206
|
+
try {
|
|
207
|
+
return JSON.stringify(result).slice(0, TOOL_RESULT_PREVIEW_CHARS);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return String(result).slice(0, TOOL_RESULT_PREVIEW_CHARS);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
if (timer)
|
|
215
|
+
clearTimeout(timer);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const INTERPRET_SYSTEM_PROMPT = `You interpret a tool's JSON result against a user-named reference and decide whether the tool found a unique match.
|
|
219
|
+
|
|
220
|
+
Output strict JSON and nothing else. One of:
|
|
221
|
+
{"status":"none"}
|
|
222
|
+
{"status":"found","resolvedTo":"..."}
|
|
223
|
+
{"status":"ambiguous"}
|
|
224
|
+
|
|
225
|
+
Rules:
|
|
226
|
+
- "found" only when ONE specific entity in the result clearly matches the reference. \`resolvedTo\` is a short human-readable string (~120 chars) drawn from the result that identifies that entity (e.g. "Tom Smith <tom@example.com>"). Do not invent fields the result does not contain.
|
|
227
|
+
- "ambiguous" when 2+ entities plausibly match and we cannot pick.
|
|
228
|
+
- "none" when the result is empty, an error, or contains no plausible match for the reference.
|
|
229
|
+
- Be conservative. When in doubt, prefer "none" or "ambiguous" over a wrong "found".`;
|
|
230
|
+
function parseInterpretResponse(text) {
|
|
231
|
+
const parsed = extractJsonObject(text);
|
|
232
|
+
if (!parsed)
|
|
233
|
+
return null;
|
|
234
|
+
if (parsed.status === 'none')
|
|
235
|
+
return { status: 'none' };
|
|
236
|
+
if (parsed.status === 'ambiguous')
|
|
237
|
+
return { status: 'ambiguous' };
|
|
238
|
+
if (parsed.status === 'found' &&
|
|
239
|
+
typeof parsed.resolvedTo === 'string' &&
|
|
240
|
+
parsed.resolvedTo.trim().length > 0) {
|
|
241
|
+
return { status: 'found', resolvedTo: parsed.resolvedTo.trim(), toolName: '' };
|
|
242
|
+
}
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
async function interpretLookupResult(reference, toolName, toolResult, config, abortSignal) {
|
|
246
|
+
try {
|
|
247
|
+
const result = await (0, ai_1.generateText)({
|
|
248
|
+
model: (0, index_js_1.getModelForConfig)(config, config.provider, config.model),
|
|
249
|
+
providerOptions: (0, index_js_1.getProviderOptionsForConfig)(config, config.provider),
|
|
250
|
+
system: INTERPRET_SYSTEM_PROMPT,
|
|
251
|
+
messages: [
|
|
252
|
+
{
|
|
253
|
+
role: 'user',
|
|
254
|
+
content: `## Reference\n"${reference}"\n\n## Tool used\n${toolName}\n\n## Tool result\n${toolResult}`,
|
|
255
|
+
},
|
|
256
|
+
],
|
|
257
|
+
maxSteps: 1,
|
|
258
|
+
maxTokens: INTERPRET_MAX_TOKENS,
|
|
259
|
+
temperature: 0,
|
|
260
|
+
abortSignal,
|
|
261
|
+
});
|
|
262
|
+
if (!result.text)
|
|
263
|
+
return { status: 'none' };
|
|
264
|
+
const parsed = parseInterpretResponse(result.text);
|
|
265
|
+
if (!parsed) {
|
|
266
|
+
(0, logger_js_1.debugLog)('reference-tool-lookup:interpret-parse-failed', result.text.slice(0, 200));
|
|
267
|
+
return { status: 'none' };
|
|
268
|
+
}
|
|
269
|
+
if (parsed.status === 'found') {
|
|
270
|
+
return { status: 'found', resolvedTo: parsed.resolvedTo, toolName };
|
|
271
|
+
}
|
|
272
|
+
return parsed;
|
|
273
|
+
}
|
|
274
|
+
catch (err) {
|
|
275
|
+
(0, logger_js_1.debugLog)('reference-tool-lookup:interpret-error', err instanceof Error ? err.message : String(err));
|
|
276
|
+
return { status: 'none' };
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
function isEmptyToolResult(toolResult) {
|
|
280
|
+
const trimmed = toolResult.trim();
|
|
281
|
+
return (trimmed === '' || trimmed === '[]' || trimmed === '{}' || trimmed === 'null' || trimmed === '""');
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Runs select → execute → interpret. Fail-open: any error yields
|
|
285
|
+
* `{ status: 'none' }` so the caller falls through to the user-prompt path.
|
|
286
|
+
*/
|
|
287
|
+
async function runReferenceLookup(reference, tools, config, abortSignal) {
|
|
288
|
+
if (!config.referenceLookup) {
|
|
289
|
+
return { status: 'none' };
|
|
290
|
+
}
|
|
291
|
+
const candidates = collectAllowedTools(tools, config.referenceLookupTools);
|
|
292
|
+
(0, logger_js_1.debugLog)('reference-tool-lookup:candidates', {
|
|
293
|
+
reference,
|
|
294
|
+
count: candidates.length,
|
|
295
|
+
names: candidates.map((c) => c.name),
|
|
296
|
+
});
|
|
297
|
+
if (candidates.length === 0)
|
|
298
|
+
return { status: 'none' };
|
|
299
|
+
const selected = await selectLookupTool(reference, candidates, config, abortSignal);
|
|
300
|
+
if (!selected)
|
|
301
|
+
return { status: 'none' };
|
|
302
|
+
(0, logger_js_1.debugLog)('reference-tool-lookup:selected', selected);
|
|
303
|
+
const toolResult = await executeLookupTool(selected.toolName, selected.args, tools, abortSignal);
|
|
304
|
+
if (toolResult === null)
|
|
305
|
+
return { status: 'none' };
|
|
306
|
+
(0, logger_js_1.debugLog)('reference-tool-lookup:executed', {
|
|
307
|
+
toolName: selected.toolName,
|
|
308
|
+
resultChars: toolResult.length,
|
|
309
|
+
});
|
|
310
|
+
if (isEmptyToolResult(toolResult)) {
|
|
311
|
+
(0, logger_js_1.debugLog)('reference-tool-lookup:empty-result-shortcircuit', selected.toolName);
|
|
312
|
+
return { status: 'none' };
|
|
313
|
+
}
|
|
314
|
+
const interpreted = await interpretLookupResult(reference, selected.toolName, toolResult, config, abortSignal);
|
|
315
|
+
(0, logger_js_1.debugLog)('reference-tool-lookup:interpreted', interpreted);
|
|
316
|
+
return interpreted;
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=reference-tool-lookup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-tool-lookup.js","sourceRoot":"","sources":["../src/reference-tool-lookup.ts"],"names":[],"mappings":";;AAuDA,kDAOC;AAqFD,4CAqCC;AAWD,8CA6CC;AA8BD,sDAwCC;AAaD,gDA0CC;AA7WD,2BAAkC;AAClC,mDAAsF;AACtF,2CAAuC;AAGvC;;;;;;GAMG;AAEH,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAOD,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,mDAAmD,CAAC;AAE/E;;;GAGG;AACH,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;AAEpE;;;;;;;GAOG;AACH,SAAgB,mBAAmB,CAAC,IAAY,EAAE,eAAyB,EAAE;IAC3E,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAQD,SAAS,YAAY,CAAC,IAAY,EAAE,IAAS;IAC3C,MAAM,WAAW,GAAG,OAAO,IAAI,EAAE,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,6EAA6E;IAC7E,uEAAuE;IACvE,IAAI,MAAe,CAAC;IACpB,MAAM,MAAM,GAAG,IAAI,EAAE,UAAU,CAAC;IAChC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACzC,IAAI,aAAa,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,GAAI,MAAmC,CAAC,WAAW,CAAC;QAC5D,CAAC;aAAM,IAAI,YAAY,IAAI,MAAM,EAAE,CAAC;YAClC,MAAM,GAAI,MAAkC,CAAC,UAAU,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA0B,EAAE,YAAsB;IAC7E,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU;YAAE,SAAS;QAC1D,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,YAAY,CAAC;YAAE,SAAS;QACvD,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,oBAAoB,GAAG;;;;;;;;;;wHAU2F,CAAC;AAEzH,SAAS,sBAAsB,CAAC,SAAiB,EAAE,UAA4B;IAC7E,MAAM,KAAK,GAAa,CAAC,6BAA6B,SAAS,GAAG,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,2BAA2B,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAOD,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAI7B,CAAC;IACT,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,UAA4B,EAC5B,MAAqB,EACrB,WAAyB;IAEzB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAY,EAAC;YAChC,KAAK,EAAE,IAAA,4BAAiB,EAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC;YAC/D,eAAe,EAAE,IAAA,sCAA2B,EAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC;YACrE,MAAM,EAAE,oBAAoB;YAC5B,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC;YACpF,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,iBAAiB;YAC5B,WAAW,EAAE,CAAC;YACd,WAAW;SACZ,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAA,oBAAQ,EAAC,2CAA2C,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACjF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,iEAAiE;QACjE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxD,IAAA,oBAAQ,EAAC,2CAA2C,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAA,oBAAQ,EACN,oCAAoC,EACpC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,8EAA8E;AAC9E,gFAAgF;AAChF,SAAS,WAAW,CAAC,MAAoB;IACvC,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM;QAAE,OAAO,aAAa,CAAC;IAClC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;AAClD,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,IAAa,EACb,KAA0B,EAC1B,WAAyB;IAEzB,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7D,0EAA0E;IAC1E,2EAA2E;IAC3E,6BAA6B;IAC7B,IAAI,KAAgD,CAAC;IACrD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACnD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,IAAA,oBAAQ,EAAC,uCAAuC,EAAE,QAAQ,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;YAC9B,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;oBAC9B,UAAU,EAAE,mBAAmB,IAAI,CAAC,GAAG,EAAE,EAAE;oBAC3C,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC;oBACrC,QAAQ,EAAE,EAAE;iBACb,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAA,oBAAQ,EACN,qCAAqC,EACrC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;gBACF,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;QACjE,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACzD,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAClF,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,MAAM,uBAAuB,GAAG;;;;;;;;;;;qFAWqD,CAAC;AAEtF,SAAS,sBAAsB,CAAC,IAAY;IAC1C,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAqD,CAAC;IAC3F,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACxD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAClE,IACE,MAAM,CAAC,MAAM,KAAK,OAAO;QACzB,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;QACrC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EACnC,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACjF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,qBAAqB,CACzC,SAAiB,EACjB,QAAgB,EAChB,UAAkB,EAClB,MAAqB,EACrB,WAAyB;IAEzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAY,EAAC;YAChC,KAAK,EAAE,IAAA,4BAAiB,EAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC;YAC/D,eAAe,EAAE,IAAA,sCAA2B,EAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC;YACrE,MAAM,EAAE,uBAAuB;YAC/B,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,kBAAkB,SAAS,sBAAsB,QAAQ,uBAAuB,UAAU,EAAE;iBACtG;aACF;YACD,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,oBAAoB;YAC/B,WAAW,EAAE,CAAC;YACd,WAAW;SACZ,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAA,oBAAQ,EAAC,8CAA8C,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACpF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC;QACtE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAA,oBAAQ,EACN,uCAAuC,EACvC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,UAAkB;IAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAClC,OAAO,CACL,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,IAAI,CACjG,CAAC;AACJ,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,kBAAkB,CACtC,SAAiB,EACjB,KAA0B,EAC1B,MAAqB,EACrB,WAAyB;IAEzB,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IACD,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC3E,IAAA,oBAAQ,EAAC,kCAAkC,EAAE;QAC3C,SAAS;QACT,KAAK,EAAE,UAAU,CAAC,MAAM;QACxB,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;KACrC,CAAC,CAAC;IACH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACpF,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACzC,IAAA,oBAAQ,EAAC,gCAAgC,EAAE,QAAQ,CAAC,CAAC;IAErD,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IACjG,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACnD,IAAA,oBAAQ,EAAC,gCAAgC,EAAE;QACzC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,WAAW,EAAE,UAAU,CAAC,MAAM;KAC/B,CAAC,CAAC;IAEH,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,IAAA,oBAAQ,EAAC,iDAAiD,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAC7C,SAAS,EACT,QAAQ,CAAC,QAAQ,EACjB,UAAU,EACV,MAAM,EACN,WAAW,CACZ,CAAC;IACF,IAAA,oBAAQ,EAAC,mCAAmC,EAAE,WAAW,CAAC,CAAC;IAC3D,OAAO,WAAW,CAAC;AACrB,CAAC"}
|