@x-code-cli/core 0.2.1 → 0.2.3
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/dist/agent/api-errors.js +1 -1
- package/dist/agent/api-errors.js.map +1 -1
- package/dist/agent/compression.d.ts +25 -0
- package/dist/agent/compression.d.ts.map +1 -0
- package/dist/agent/compression.js +105 -0
- package/dist/agent/compression.js.map +1 -0
- package/dist/agent/diff.js.map +1 -1
- package/dist/agent/file-ingest.d.ts +14 -0
- package/dist/agent/file-ingest.d.ts.map +1 -1
- package/dist/agent/file-ingest.js +125 -34
- package/dist/agent/file-ingest.js.map +1 -1
- package/dist/agent/light-compact.d.ts.map +1 -1
- package/dist/agent/light-compact.js +0 -19
- package/dist/agent/light-compact.js.map +1 -1
- package/dist/agent/loop-guard.d.ts.map +1 -1
- package/dist/agent/loop-guard.js.map +1 -1
- package/dist/agent/loop-state.d.ts.map +1 -1
- package/dist/agent/loop-state.js +8 -1
- package/dist/agent/loop-state.js.map +1 -1
- package/dist/agent/loop.d.ts +2 -3
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +53 -93
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/memory-extractor.d.ts +22 -0
- package/dist/agent/memory-extractor.d.ts.map +1 -0
- package/dist/agent/memory-extractor.js +253 -0
- package/dist/agent/memory-extractor.js.map +1 -0
- package/dist/agent/messages.d.ts +9 -0
- package/dist/agent/messages.d.ts.map +1 -1
- package/dist/agent/messages.js +15 -0
- package/dist/agent/messages.js.map +1 -1
- package/dist/agent/plan-storage.d.ts.map +1 -1
- package/dist/agent/plan-storage.js +1 -1
- package/dist/agent/plan-storage.js.map +1 -1
- package/dist/agent/plan-tools.d.ts +8 -0
- package/dist/agent/plan-tools.d.ts.map +1 -0
- package/dist/agent/plan-tools.js +150 -0
- package/dist/agent/plan-tools.js.map +1 -0
- package/dist/agent/provider-compat.d.ts.map +1 -1
- package/dist/agent/provider-compat.js.map +1 -1
- package/dist/agent/sub-agents/built-in.d.ts.map +1 -1
- package/dist/agent/sub-agents/built-in.js +41 -15
- package/dist/agent/sub-agents/built-in.js.map +1 -1
- package/dist/agent/sub-agents/loader.d.ts.map +1 -1
- package/dist/agent/sub-agents/loader.js.map +1 -1
- package/dist/agent/sub-agents/runner.d.ts.map +1 -1
- package/dist/agent/sub-agents/runner.js +12 -8
- package/dist/agent/sub-agents/runner.js.map +1 -1
- package/dist/agent/system-prompt.d.ts.map +1 -1
- package/dist/agent/system-prompt.js +0 -31
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/agent/tool-execution.d.ts +34 -2
- package/dist/agent/tool-execution.d.ts.map +1 -1
- package/dist/agent/tool-execution.js +363 -360
- package/dist/agent/tool-execution.js.map +1 -1
- package/dist/agent/tool-result-sanitize.d.ts +21 -7
- package/dist/agent/tool-result-sanitize.d.ts.map +1 -1
- package/dist/agent/tool-result-sanitize.js +56 -30
- package/dist/agent/tool-result-sanitize.js.map +1 -1
- package/dist/agent/vision-fallback.d.ts.map +1 -1
- package/dist/agent/vision-fallback.js +3 -14
- package/dist/agent/vision-fallback.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/knowledge/loader.d.ts.map +1 -1
- package/dist/knowledge/loader.js +50 -23
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/permissions/index.d.ts +9 -4
- package/dist/permissions/index.d.ts.map +1 -1
- package/dist/permissions/index.js +41 -7
- package/dist/permissions/index.js.map +1 -1
- package/dist/permissions/session-store.d.ts +34 -20
- package/dist/permissions/session-store.d.ts.map +1 -1
- package/dist/permissions/session-store.js +94 -34
- package/dist/permissions/session-store.js.map +1 -1
- package/dist/providers/cache-control.d.ts.map +1 -1
- package/dist/providers/cache-control.js +0 -29
- package/dist/providers/cache-control.js.map +1 -1
- package/dist/providers/thinking.d.ts.map +1 -1
- package/dist/providers/thinking.js +2 -6
- package/dist/providers/thinking.js.map +1 -1
- package/dist/tools/ask-user.d.ts.map +1 -1
- package/dist/tools/ask-user.js +17 -7
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +8 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/glob.d.ts.map +1 -1
- package/dist/tools/glob.js +9 -2
- package/dist/tools/glob.js.map +1 -1
- package/dist/tools/grep.d.ts +1 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +29 -6
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/index.d.ts +2 -10
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +10 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-dir.d.ts.map +1 -1
- package/dist/tools/list-dir.js.map +1 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +78 -36
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/shell-provider.d.ts +1 -0
- package/dist/tools/shell-provider.d.ts.map +1 -1
- package/dist/tools/shell-provider.js +7 -0
- package/dist/tools/shell-provider.js.map +1 -1
- package/dist/tools/shell-utils.d.ts.map +1 -1
- package/dist/tools/shell-utils.js +45 -2
- package/dist/tools/shell-utils.js.map +1 -1
- package/dist/tools/shell.d.ts.map +1 -1
- package/dist/tools/shell.js +15 -1
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/task.d.ts.map +1 -1
- package/dist/tools/task.js +4 -4
- package/dist/tools/task.js.map +1 -1
- package/dist/tools/todo-write.d.ts.map +1 -1
- package/dist/tools/todo-write.js.map +1 -1
- package/dist/tools/web-fetch.d.ts +2 -0
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +92 -27
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/write-file.d.ts.map +1 -1
- package/dist/tools/write-file.js +7 -1
- package/dist/tools/write-file.js.map +1 -1
- package/dist/types/index.d.ts +17 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/lru-cache.d.ts +17 -0
- package/dist/utils/lru-cache.d.ts.map +1 -0
- package/dist/utils/lru-cache.js +40 -0
- package/dist/utils/lru-cache.js.map +1 -0
- package/dist/utils/media-type.d.ts +5 -0
- package/dist/utils/media-type.d.ts.map +1 -0
- package/dist/utils/media-type.js +19 -0
- package/dist/utils/media-type.js.map +1 -0
- package/dist/utils/message-helpers.d.ts +6 -0
- package/dist/utils/message-helpers.d.ts.map +1 -0
- package/dist/utils/message-helpers.js +14 -0
- package/dist/utils/message-helpers.js.map +1 -0
- package/package.json +1 -1
- package/dist/tools/save-knowledge.d.ts +0 -8
- package/dist/tools/save-knowledge.d.ts.map +0 -1
- package/dist/tools/save-knowledge.js +0 -61
- package/dist/tools/save-knowledge.js.map +0 -1
package/dist/tools/web-fetch.js
CHANGED
|
@@ -4,6 +4,7 @@ import * as cheerio from 'cheerio';
|
|
|
4
4
|
import TurndownService from 'turndown';
|
|
5
5
|
import { tool } from 'ai';
|
|
6
6
|
import { z } from 'zod';
|
|
7
|
+
import { LruCache } from '../utils/lru-cache.js';
|
|
7
8
|
import { formatToolError } from '../utils/tool-errors.js';
|
|
8
9
|
import { reportProgress } from './progress.js';
|
|
9
10
|
const FETCH_TIMEOUT_MS = 15_000;
|
|
@@ -13,9 +14,10 @@ const FETCH_TIMEOUT_MS = 15_000;
|
|
|
13
14
|
// This is a per-call cap; the model can always fetch again with a narrower prompt.
|
|
14
15
|
const MAX_CONTENT_CHARS = 100_000;
|
|
15
16
|
// Raw HTML ceiling before turndown. 10 MB is comfortable for any real doc page;
|
|
16
|
-
// enforced
|
|
17
|
-
//
|
|
17
|
+
// enforced both by content-length header AND by streaming body read (see
|
|
18
|
+
// readResponseBody) so chunked responses are also bounded.
|
|
18
19
|
const MAX_HTTP_BYTES = 10 * 1024 * 1024;
|
|
20
|
+
const MAX_URL_LENGTH = 2000;
|
|
19
21
|
const CACHE_TTL_MS = 15 * 60 * 1000;
|
|
20
22
|
const CACHE_MAX_ENTRIES = 50;
|
|
21
23
|
const BROWSER_UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36';
|
|
@@ -23,28 +25,55 @@ const BROWSER_UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
|
|
|
23
25
|
// while blocking browser impersonators that fail TLS-fingerprint checks.
|
|
24
26
|
const FALLBACK_UA = 'x-code-cli/0.1 (+https://github.com/woai3c/x-code-cli)';
|
|
25
27
|
const YEAR = new Date().getFullYear();
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
28
|
+
// ── SSRF protection ──
|
|
29
|
+
// Reject URLs targeting internal/private networks. Mirrors Claude Code's
|
|
30
|
+
// validateURL: hostname must have ≥2 dot-separated segments (rejects
|
|
31
|
+
// `localhost`, bare hostnames), no embedded credentials, no non-HTTP schemes,
|
|
32
|
+
// and no IPs in private/link-local/loopback ranges.
|
|
33
|
+
const PRIVATE_IP_PATTERNS = [
|
|
34
|
+
/^127\./, // loopback
|
|
35
|
+
/^10\./, // 10.0.0.0/8
|
|
36
|
+
/^172\.(1[6-9]|2\d|3[01])\./, // 172.16.0.0/12
|
|
37
|
+
/^192\.168\./, // 192.168.0.0/16
|
|
38
|
+
/^169\.254\./, // link-local (AWS/GCP metadata)
|
|
39
|
+
/^0\./, // 0.0.0.0/8
|
|
40
|
+
/^::1$/, // IPv6 loopback
|
|
41
|
+
/^fd[0-9a-f]{2}:/i, // IPv6 ULA
|
|
42
|
+
/^fe80:/i, // IPv6 link-local
|
|
43
|
+
];
|
|
44
|
+
function isPrivateHost(hostname) {
|
|
45
|
+
const lower = hostname.toLowerCase();
|
|
46
|
+
if (lower === 'localhost' || lower.endsWith('.local') || lower.endsWith('.internal'))
|
|
47
|
+
return true;
|
|
48
|
+
// IP-literal in URL — strip surrounding brackets for IPv6
|
|
49
|
+
const bare = lower.startsWith('[') ? lower.slice(1, -1) : lower;
|
|
50
|
+
return PRIVATE_IP_PATTERNS.some((re) => re.test(bare));
|
|
39
51
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
52
|
+
/** @internal Exported for testing only. */
|
|
53
|
+
export function validateFetchUrl(url) {
|
|
54
|
+
if (url.length > MAX_URL_LENGTH)
|
|
55
|
+
return `URL exceeds ${MAX_URL_LENGTH} character limit`;
|
|
56
|
+
let parsed;
|
|
57
|
+
try {
|
|
58
|
+
parsed = new URL(url);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return 'Invalid URL';
|
|
62
|
+
}
|
|
63
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
64
|
+
return `Unsupported protocol: ${parsed.protocol} (only http/https allowed)`;
|
|
65
|
+
}
|
|
66
|
+
if (parsed.username || parsed.password)
|
|
67
|
+
return 'URLs with embedded credentials are not allowed';
|
|
68
|
+
const parts = parsed.hostname.split('.');
|
|
69
|
+
if (parts.length < 2)
|
|
70
|
+
return `Hostname "${parsed.hostname}" is not a public domain (must have at least two segments)`;
|
|
71
|
+
if (isPrivateHost(parsed.hostname)) {
|
|
72
|
+
return `Fetching private/internal address "${parsed.hostname}" is blocked for security`;
|
|
45
73
|
}
|
|
46
|
-
|
|
74
|
+
return null;
|
|
47
75
|
}
|
|
76
|
+
const fetchCache = new LruCache({ maxEntries: CACHE_MAX_ENTRIES, ttlMs: CACHE_TTL_MS });
|
|
48
77
|
const turndown = new TurndownService({
|
|
49
78
|
headingStyle: 'atx',
|
|
50
79
|
codeBlockStyle: 'fenced',
|
|
@@ -56,9 +85,41 @@ async function doFetch(url, userAgent) {
|
|
|
56
85
|
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.5',
|
|
57
86
|
'Accept-Language': 'en-US,en;q=0.9',
|
|
58
87
|
},
|
|
88
|
+
redirect: 'follow',
|
|
59
89
|
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
60
90
|
});
|
|
61
91
|
}
|
|
92
|
+
/** Stream-read response body with a hard byte cap. Prevents OOM on chunked
|
|
93
|
+
* responses where content-length is absent or lying. */
|
|
94
|
+
async function readResponseBody(response, maxBytes) {
|
|
95
|
+
const reader = response.body?.getReader();
|
|
96
|
+
if (!reader)
|
|
97
|
+
return response.text();
|
|
98
|
+
const chunks = [];
|
|
99
|
+
let totalBytes = 0;
|
|
100
|
+
while (true) {
|
|
101
|
+
const { done, value } = await reader.read();
|
|
102
|
+
if (done)
|
|
103
|
+
break;
|
|
104
|
+
totalBytes += value.byteLength;
|
|
105
|
+
if (totalBytes > maxBytes) {
|
|
106
|
+
await reader.cancel();
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
chunks.push(value);
|
|
110
|
+
}
|
|
111
|
+
const merged = new Uint8Array(Math.min(totalBytes, maxBytes));
|
|
112
|
+
let offset = 0;
|
|
113
|
+
for (const chunk of chunks) {
|
|
114
|
+
const remaining = merged.byteLength - offset;
|
|
115
|
+
if (remaining <= 0)
|
|
116
|
+
break;
|
|
117
|
+
const slice = chunk.byteLength > remaining ? chunk.subarray(0, remaining) : chunk;
|
|
118
|
+
merged.set(slice, offset);
|
|
119
|
+
offset += slice.byteLength;
|
|
120
|
+
}
|
|
121
|
+
return new TextDecoder().decode(merged);
|
|
122
|
+
}
|
|
62
123
|
function formatOutput(url, markdown, prompt) {
|
|
63
124
|
if (prompt) {
|
|
64
125
|
return `# Content from ${url}\n\n${markdown}\n\n---\nExtract instruction: ${prompt}`;
|
|
@@ -77,7 +138,10 @@ export const webFetch = tool({
|
|
|
77
138
|
}),
|
|
78
139
|
execute: async ({ url, prompt }, { toolCallId }) => {
|
|
79
140
|
try {
|
|
80
|
-
const
|
|
141
|
+
const urlError = validateFetchUrl(url);
|
|
142
|
+
if (urlError)
|
|
143
|
+
return `Error: ${urlError}`;
|
|
144
|
+
const cached = fetchCache.get(url);
|
|
81
145
|
if (cached) {
|
|
82
146
|
reportProgress(toolCallId, 'Using cached copy');
|
|
83
147
|
return formatOutput(url, cached, prompt);
|
|
@@ -93,18 +157,19 @@ export const webFetch = tool({
|
|
|
93
157
|
if (!response.ok) {
|
|
94
158
|
return `Error: HTTP ${response.status} ${response.statusText}`;
|
|
95
159
|
}
|
|
96
|
-
//
|
|
97
|
-
// so we also rely on fetch's 15s timeout to bound pathological pages.
|
|
160
|
+
// Reject upfront when content-length exceeds the cap.
|
|
98
161
|
const contentLength = Number(response.headers.get('content-length') ?? '0');
|
|
99
162
|
if (contentLength > MAX_HTTP_BYTES) {
|
|
100
163
|
const mb = Math.round(contentLength / 1024 / 1024);
|
|
101
164
|
return `Error: Content too large (${mb} MB, limit ${MAX_HTTP_BYTES / 1024 / 1024} MB)`;
|
|
102
165
|
}
|
|
103
166
|
const contentType = response.headers.get('content-type') ?? '';
|
|
104
|
-
|
|
167
|
+
// Stream-read with hard byte cap — prevents OOM on chunked responses
|
|
168
|
+
// where content-length is absent or lies.
|
|
169
|
+
const body = await readResponseBody(response, MAX_HTTP_BYTES);
|
|
105
170
|
if (contentType.includes('application/json')) {
|
|
106
171
|
const json = body.slice(0, MAX_CONTENT_CHARS);
|
|
107
|
-
|
|
172
|
+
fetchCache.set(url, json);
|
|
108
173
|
return formatOutput(url, json, prompt);
|
|
109
174
|
}
|
|
110
175
|
const $ = cheerio.load(body);
|
|
@@ -117,7 +182,7 @@ export const webFetch = tool({
|
|
|
117
182
|
if (markdown.length > MAX_CONTENT_CHARS) {
|
|
118
183
|
markdown = markdown.slice(0, MAX_CONTENT_CHARS) + '\n\n... [content truncated]';
|
|
119
184
|
}
|
|
120
|
-
|
|
185
|
+
fetchCache.set(url, markdown);
|
|
121
186
|
return formatOutput(url, markdown, prompt);
|
|
122
187
|
}
|
|
123
188
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,yCAAyC;AACzC,OAAO,eAAe,MAAM,UAAU,CAAA;AAEtC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,gBAAgB,GAAG,MAAM,CAAA;AAC/B,mFAAmF;AACnF,kFAAkF;AAClF,sEAAsE;AACtE,mFAAmF;AACnF,MAAM,iBAAiB,GAAG,OAAO,CAAA;AACjC,gFAAgF;AAChF,
|
|
1
|
+
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-file.d.ts","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,SAAS;;;
|
|
1
|
+
{"version":3,"file":"write-file.d.ts","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,SAAS;;;SAapB,CAAA"}
|
package/dist/tools/write-file.js
CHANGED
|
@@ -2,7 +2,13 @@
|
|
|
2
2
|
import { tool } from 'ai';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
export const writeFile = tool({
|
|
5
|
-
description:
|
|
5
|
+
description: `Write a file to the local filesystem.
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
- This tool will overwrite the existing file if there is one at the provided path.
|
|
9
|
+
- If this is an existing file, you MUST use the readFile tool first to read the file's contents. This tool will fail if you did not read the file first.
|
|
10
|
+
- Prefer the edit tool for modifying existing files — it only sends the diff. Only use this tool to create new files or for complete rewrites.
|
|
11
|
+
- NEVER create documentation files (*.md) or README files unless explicitly requested by the user.`,
|
|
6
12
|
inputSchema: z.object({
|
|
7
13
|
filePath: z.string().describe('Absolute path to the file'),
|
|
8
14
|
content: z.string().describe('The full content to write'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;IAC5B,WAAW,
|
|
1
|
+
{"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE;;;;;;mGAMoF;IACjG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC1D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KAC1D,CAAC;IACF,mEAAmE;CACpE,CAAC,CAAA"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { LanguageModel, ModelMessage } from 'ai';
|
|
2
2
|
import type { EditDiffPayload } from '../agent/diff.js';
|
|
3
|
-
import type { SubAgentEvent } from '../agent/sub-agents/types.js';
|
|
4
3
|
import type { SubAgentRegistry } from '../agent/sub-agents/registry.js';
|
|
4
|
+
import type { SubAgentEvent } from '../agent/sub-agents/types.js';
|
|
5
5
|
export type PermissionLevel = 'always-allow' | 'ask' | 'deny';
|
|
6
6
|
/** Approval mode for the current session.
|
|
7
7
|
*
|
|
@@ -151,6 +151,13 @@ export interface AgentCallbacks {
|
|
|
151
151
|
/** Fired by the sub-agent runner to stream progress from child agent loops.
|
|
152
152
|
* The CLI UI uses these events to build the collapsed/expanded task block. */
|
|
153
153
|
onSubAgentEvent?: (event: SubAgentEvent) => void;
|
|
154
|
+
/** Optional. Fired by the post-turn memory extractor for each fact it
|
|
155
|
+
* commits to AutoMemory. Surfaces "Remembered: …" in scrollback so the
|
|
156
|
+
* user can see what the silent extractor saved. The extractor is
|
|
157
|
+
* fire-and-forget (runs after agentLoop returns), so this callback may
|
|
158
|
+
* fire AFTER `submit()` resolved and even into the next turn — keep
|
|
159
|
+
* the closure free of per-turn state. */
|
|
160
|
+
onMemoryWrite?: (notice: MemoryWriteNotice) => void;
|
|
154
161
|
}
|
|
155
162
|
export interface AgentOptions {
|
|
156
163
|
modelId: string;
|
|
@@ -202,6 +209,15 @@ export interface KnowledgeFact {
|
|
|
202
209
|
category: KnowledgeCategory;
|
|
203
210
|
date: string;
|
|
204
211
|
}
|
|
212
|
+
/** Surface event emitted by the post-turn memory extractor when it commits
|
|
213
|
+
* a fact to AutoMemory. Lets the UI render a "Remembered: …" line in
|
|
214
|
+
* scrollback so the user has visibility into otherwise-silent writes. */
|
|
215
|
+
export interface MemoryWriteNotice {
|
|
216
|
+
scope: 'project' | 'global';
|
|
217
|
+
category: KnowledgeCategory;
|
|
218
|
+
key: string;
|
|
219
|
+
fact: string;
|
|
220
|
+
}
|
|
205
221
|
export interface SessionSummary {
|
|
206
222
|
id: string;
|
|
207
223
|
title: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Minimal generic LRU cache backed by a Map (insertion-order iteration).
|
|
2
|
+
* Supports optional TTL. Not thread-safe (Node is single-threaded so this
|
|
3
|
+
* is fine for in-process caching). */
|
|
4
|
+
export declare class LruCache<V> {
|
|
5
|
+
private readonly map;
|
|
6
|
+
private readonly maxEntries;
|
|
7
|
+
private readonly ttlMs;
|
|
8
|
+
constructor(opts: {
|
|
9
|
+
maxEntries: number;
|
|
10
|
+
ttlMs?: number;
|
|
11
|
+
});
|
|
12
|
+
get(key: string): V | null;
|
|
13
|
+
set(key: string, value: V): void;
|
|
14
|
+
has(key: string): boolean;
|
|
15
|
+
get size(): number;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=lru-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru-cache.d.ts","sourceRoot":"","sources":["../../src/utils/lru-cache.ts"],"names":[],"mappings":"AAAA;;uCAEuC;AACvC,qBAAa,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA8C;IAClE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;gBAElB,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAKxD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAa1B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAQhC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Minimal generic LRU cache backed by a Map (insertion-order iteration).
|
|
2
|
+
* Supports optional TTL. Not thread-safe (Node is single-threaded so this
|
|
3
|
+
* is fine for in-process caching). */
|
|
4
|
+
export class LruCache {
|
|
5
|
+
map = new Map();
|
|
6
|
+
maxEntries;
|
|
7
|
+
ttlMs;
|
|
8
|
+
constructor(opts) {
|
|
9
|
+
this.maxEntries = opts.maxEntries;
|
|
10
|
+
this.ttlMs = opts.ttlMs ?? Infinity;
|
|
11
|
+
}
|
|
12
|
+
get(key) {
|
|
13
|
+
const entry = this.map.get(key);
|
|
14
|
+
if (!entry)
|
|
15
|
+
return null;
|
|
16
|
+
if (Date.now() - entry.at > this.ttlMs) {
|
|
17
|
+
this.map.delete(key);
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
// Move to tail (most-recently-used)
|
|
21
|
+
this.map.delete(key);
|
|
22
|
+
this.map.set(key, entry);
|
|
23
|
+
return entry.value;
|
|
24
|
+
}
|
|
25
|
+
set(key, value) {
|
|
26
|
+
if (this.map.size >= this.maxEntries) {
|
|
27
|
+
const oldest = this.map.keys().next().value;
|
|
28
|
+
if (oldest !== undefined)
|
|
29
|
+
this.map.delete(oldest);
|
|
30
|
+
}
|
|
31
|
+
this.map.set(key, { value, at: Date.now() });
|
|
32
|
+
}
|
|
33
|
+
has(key) {
|
|
34
|
+
return this.get(key) !== null;
|
|
35
|
+
}
|
|
36
|
+
get size() {
|
|
37
|
+
return this.map.size;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=lru-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru-cache.js","sourceRoot":"","sources":["../../src/utils/lru-cache.ts"],"names":[],"mappings":"AAAA;;uCAEuC;AACvC,MAAM,OAAO,QAAQ;IACF,GAAG,GAAG,IAAI,GAAG,EAAoC,CAAA;IACjD,UAAU,CAAQ;IAClB,KAAK,CAAQ;IAE9B,YAAY,IAA4C;QACtD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAA;IACrC,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC/B,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QACvB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACpB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,oCAAoC;QACpC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACxB,OAAO,KAAK,CAAC,KAAK,CAAA;IACpB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAQ;QACvB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA;YAC3C,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACnD,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA;IAC/B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAA;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Map a file extension to an IANA media type. Used for ImagePart mediaType
|
|
2
|
+
* hints; returning `image/png` for unknown extensions is safe — the SDK
|
|
3
|
+
* mostly treats mediaType as advisory. */
|
|
4
|
+
export declare function mediaTypeFor(filePath: string): string;
|
|
5
|
+
//# sourceMappingURL=media-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-type.d.ts","sourceRoot":"","sources":["../../src/utils/media-type.ts"],"names":[],"mappings":"AAEA;;2CAE2C;AAC3C,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQrD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
/** Map a file extension to an IANA media type. Used for ImagePart mediaType
|
|
3
|
+
* hints; returning `image/png` for unknown extensions is safe — the SDK
|
|
4
|
+
* mostly treats mediaType as advisory. */
|
|
5
|
+
export function mediaTypeFor(filePath) {
|
|
6
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
7
|
+
if (ext === '.jpg' || ext === '.jpeg')
|
|
8
|
+
return 'image/jpeg';
|
|
9
|
+
if (ext === '.png')
|
|
10
|
+
return 'image/png';
|
|
11
|
+
if (ext === '.webp')
|
|
12
|
+
return 'image/webp';
|
|
13
|
+
if (ext === '.gif')
|
|
14
|
+
return 'image/gif';
|
|
15
|
+
if (ext === '.bmp')
|
|
16
|
+
return 'image/bmp';
|
|
17
|
+
return 'image/png';
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=media-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-type.js","sourceRoot":"","sources":["../../src/utils/media-type.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B;;2CAE2C;AAC3C,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;IAChD,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,YAAY,CAAA;IAC1D,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,WAAW,CAAA;IACtC,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,YAAY,CAAA;IACxC,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,WAAW,CAAA;IACtC,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,WAAW,CAAA;IACtC,OAAO,WAAW,CAAA;AACpB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ModelMessage } from '../types/index.js';
|
|
2
|
+
/** Pull plain text out of a ModelMessage's content. CoreMessage content
|
|
3
|
+
* is either a string or an array of typed parts; we only extract text
|
|
4
|
+
* parts (image / file / tool-call go through other paths). */
|
|
5
|
+
export declare function extractText(content: ModelMessage['content']): string;
|
|
6
|
+
//# sourceMappingURL=message-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/message-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAIrD;;+DAE+D;AAC/D,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,GAAG,MAAM,CAOpE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Pull plain text out of a ModelMessage's content. CoreMessage content
|
|
2
|
+
* is either a string or an array of typed parts; we only extract text
|
|
3
|
+
* parts (image / file / tool-call go through other paths). */
|
|
4
|
+
export function extractText(content) {
|
|
5
|
+
if (typeof content === 'string')
|
|
6
|
+
return content;
|
|
7
|
+
if (!Array.isArray(content))
|
|
8
|
+
return '';
|
|
9
|
+
return content
|
|
10
|
+
.filter((p) => p?.type === 'text' && typeof p.text === 'string')
|
|
11
|
+
.map((p) => p.text)
|
|
12
|
+
.join('');
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=message-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-helpers.js","sourceRoot":"","sources":["../../src/utils/message-helpers.ts"],"names":[],"mappings":"AAIA;;+DAE+D;AAC/D,MAAM,UAAU,WAAW,CAAC,OAAgC;IAC1D,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAA;IAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAA;IACtC,OAAQ,OAA6B;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;SAC/D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAc,CAAC;SAC5B,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"save-knowledge.d.ts","sourceRoot":"","sources":["../../src/tools/save-knowledge.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,aAAa;;;;;;UAwDxB,CAAA"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
// @x-code-cli/core — saveKnowledge tool (AI-written persistent memory)
|
|
2
|
-
import { tool } from 'ai';
|
|
3
|
-
import { z } from 'zod';
|
|
4
|
-
import { getAutoMemory } from '../knowledge/auto-memory.js';
|
|
5
|
-
import { formatToolError } from '../utils/tool-errors.js';
|
|
6
|
-
export const saveKnowledge = tool({
|
|
7
|
-
description: `Save or delete a persistent memory that should survive across sessions.
|
|
8
|
-
|
|
9
|
-
Before calling this tool, ask yourself: **"Will a future session plausibly act better because I save this?"** If not — do NOT call the tool. No-op is the default; saving is the exception. This tool is strictly for durable, cross-session knowledge.
|
|
10
|
-
|
|
11
|
-
Every memory MUST be filed under one of four categories — pick the one that describes the TYPE of knowledge, not the topic:
|
|
12
|
-
|
|
13
|
-
user — Facts about the human user: their role, expertise, goals, long-term constraints. Example: "user is a senior Go engineer new to this frontend".
|
|
14
|
-
feedback — Corrections or validated approaches the user has given. Save both when the user corrects you AND when they confirm a non-obvious choice worked. Include WHY so edge cases are judgeable. Example: "integration tests must hit real DB, not mocks — prior incident where mocks masked broken migration".
|
|
15
|
-
project — Ongoing work, initiatives, deadlines, non-obvious project state that would NOT be derivable from reading code or git log. Example: "merge freeze begins 2026-03-05 for mobile release cut".
|
|
16
|
-
reference — Pointers to external systems. Example: "pipeline bugs tracked in Linear project INGEST".
|
|
17
|
-
|
|
18
|
-
Do NOT save any of these (these are the common failure modes):
|
|
19
|
-
- The user's current task or request ("user asked me to build a snake game") — this is transient, not durable
|
|
20
|
-
- Summaries of code you just wrote, bugs you just fixed, or findings from the current turn
|
|
21
|
-
- Anything derivable from the code or git log (tech stack, package.json scripts, dependencies, directory layout) — future sessions can read the code
|
|
22
|
-
- Content already in AGENTS.md / CLAUDE.md
|
|
23
|
-
- Debugging solutions (the fix is in the code; the commit has the context)
|
|
24
|
-
- Duplicates or near-duplicates of an existing memory — update the existing one instead
|
|
25
|
-
|
|
26
|
-
Even if the user says "remember X" — if X is one-off task context (a specific request, a game they wanted), still decline. Ask yourself what is *surprising* or *durable* about it; if nothing, no-op.
|
|
27
|
-
|
|
28
|
-
Scope: project = this repo only; global = applies across all repos.`,
|
|
29
|
-
inputSchema: z.object({
|
|
30
|
-
action: z
|
|
31
|
-
.enum(['add', 'delete'])
|
|
32
|
-
.describe('add = create or update (auto-replaces conflicting old fact), delete = remove outdated fact'),
|
|
33
|
-
key: z
|
|
34
|
-
.string()
|
|
35
|
-
.describe('Short unique slug identifying this fact. Same key under same category auto-replaces. Example: "testing-db-policy", "user-role".'),
|
|
36
|
-
fact: z
|
|
37
|
-
.string()
|
|
38
|
-
.describe('The fact itself. For feedback, lead with the rule and include a one-line reason so future edge cases are judgeable.'),
|
|
39
|
-
scope: z.enum(['project', 'global']).describe('project = this repo (.x-code/), global = all repos (~/.x-code/)'),
|
|
40
|
-
category: z
|
|
41
|
-
.enum(['user', 'feedback', 'project', 'reference'])
|
|
42
|
-
.describe('user | feedback | project | reference — see tool description for when to pick each'),
|
|
43
|
-
}),
|
|
44
|
-
execute: ({ action, key, fact, scope, category }) => {
|
|
45
|
-
try {
|
|
46
|
-
const memory = getAutoMemory(scope);
|
|
47
|
-
if (action === 'add') {
|
|
48
|
-
memory.add({ key, fact, category, date: new Date().toISOString().slice(0, 10) });
|
|
49
|
-
return `Knowledge saved: [${category}] ${key}: ${fact}`;
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
memory.delete(key, category);
|
|
53
|
-
return `Knowledge deleted: [${category}] ${key}`;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
catch (err) {
|
|
57
|
-
return formatToolError('saving knowledge', err);
|
|
58
|
-
}
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
//# sourceMappingURL=save-knowledge.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"save-knowledge.js","sourceRoot":"","sources":["../../src/tools/save-knowledge.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAEzD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;oEAqBqD;IAClE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;aACvB,QAAQ,CAAC,4FAA4F,CAAC;QACzG,GAAG,EAAE,CAAC;aACH,MAAM,EAAE;aACR,QAAQ,CACP,iIAAiI,CAClI;QACH,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,CACP,qHAAqH,CACtH;QACH,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,iEAAiE,CAAC;QAChH,QAAQ,EAAE,CAAC;aACR,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;aAClD,QAAQ,CAAC,oFAAoF,CAAC;KAClG,CAAC;IACF,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;YACnC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;gBAChF,OAAO,qBAAqB,QAAQ,KAAK,GAAG,KAAK,IAAI,EAAE,CAAA;YACzD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;gBAC5B,OAAO,uBAAuB,QAAQ,KAAK,GAAG,EAAE,CAAA;YAClD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,eAAe,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA;QACjD,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
|