@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.
Files changed (147) hide show
  1. package/dist/agent/api-errors.js +1 -1
  2. package/dist/agent/api-errors.js.map +1 -1
  3. package/dist/agent/compression.d.ts +25 -0
  4. package/dist/agent/compression.d.ts.map +1 -0
  5. package/dist/agent/compression.js +105 -0
  6. package/dist/agent/compression.js.map +1 -0
  7. package/dist/agent/diff.js.map +1 -1
  8. package/dist/agent/file-ingest.d.ts +14 -0
  9. package/dist/agent/file-ingest.d.ts.map +1 -1
  10. package/dist/agent/file-ingest.js +125 -34
  11. package/dist/agent/file-ingest.js.map +1 -1
  12. package/dist/agent/light-compact.d.ts.map +1 -1
  13. package/dist/agent/light-compact.js +0 -19
  14. package/dist/agent/light-compact.js.map +1 -1
  15. package/dist/agent/loop-guard.d.ts.map +1 -1
  16. package/dist/agent/loop-guard.js.map +1 -1
  17. package/dist/agent/loop-state.d.ts.map +1 -1
  18. package/dist/agent/loop-state.js +8 -1
  19. package/dist/agent/loop-state.js.map +1 -1
  20. package/dist/agent/loop.d.ts +2 -3
  21. package/dist/agent/loop.d.ts.map +1 -1
  22. package/dist/agent/loop.js +53 -93
  23. package/dist/agent/loop.js.map +1 -1
  24. package/dist/agent/memory-extractor.d.ts +22 -0
  25. package/dist/agent/memory-extractor.d.ts.map +1 -0
  26. package/dist/agent/memory-extractor.js +253 -0
  27. package/dist/agent/memory-extractor.js.map +1 -0
  28. package/dist/agent/messages.d.ts +9 -0
  29. package/dist/agent/messages.d.ts.map +1 -1
  30. package/dist/agent/messages.js +15 -0
  31. package/dist/agent/messages.js.map +1 -1
  32. package/dist/agent/plan-storage.d.ts.map +1 -1
  33. package/dist/agent/plan-storage.js +1 -1
  34. package/dist/agent/plan-storage.js.map +1 -1
  35. package/dist/agent/plan-tools.d.ts +8 -0
  36. package/dist/agent/plan-tools.d.ts.map +1 -0
  37. package/dist/agent/plan-tools.js +150 -0
  38. package/dist/agent/plan-tools.js.map +1 -0
  39. package/dist/agent/provider-compat.d.ts.map +1 -1
  40. package/dist/agent/provider-compat.js.map +1 -1
  41. package/dist/agent/sub-agents/built-in.d.ts.map +1 -1
  42. package/dist/agent/sub-agents/built-in.js +41 -15
  43. package/dist/agent/sub-agents/built-in.js.map +1 -1
  44. package/dist/agent/sub-agents/loader.d.ts.map +1 -1
  45. package/dist/agent/sub-agents/loader.js.map +1 -1
  46. package/dist/agent/sub-agents/runner.d.ts.map +1 -1
  47. package/dist/agent/sub-agents/runner.js +12 -8
  48. package/dist/agent/sub-agents/runner.js.map +1 -1
  49. package/dist/agent/system-prompt.d.ts.map +1 -1
  50. package/dist/agent/system-prompt.js +0 -31
  51. package/dist/agent/system-prompt.js.map +1 -1
  52. package/dist/agent/tool-execution.d.ts +34 -2
  53. package/dist/agent/tool-execution.d.ts.map +1 -1
  54. package/dist/agent/tool-execution.js +363 -360
  55. package/dist/agent/tool-execution.js.map +1 -1
  56. package/dist/agent/tool-result-sanitize.d.ts +21 -7
  57. package/dist/agent/tool-result-sanitize.d.ts.map +1 -1
  58. package/dist/agent/tool-result-sanitize.js +56 -30
  59. package/dist/agent/tool-result-sanitize.js.map +1 -1
  60. package/dist/agent/vision-fallback.d.ts.map +1 -1
  61. package/dist/agent/vision-fallback.js +3 -14
  62. package/dist/agent/vision-fallback.js.map +1 -1
  63. package/dist/index.d.ts +3 -0
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +3 -0
  66. package/dist/index.js.map +1 -1
  67. package/dist/knowledge/loader.d.ts.map +1 -1
  68. package/dist/knowledge/loader.js +50 -23
  69. package/dist/knowledge/loader.js.map +1 -1
  70. package/dist/permissions/index.d.ts +9 -4
  71. package/dist/permissions/index.d.ts.map +1 -1
  72. package/dist/permissions/index.js +41 -7
  73. package/dist/permissions/index.js.map +1 -1
  74. package/dist/permissions/session-store.d.ts +34 -20
  75. package/dist/permissions/session-store.d.ts.map +1 -1
  76. package/dist/permissions/session-store.js +94 -34
  77. package/dist/permissions/session-store.js.map +1 -1
  78. package/dist/providers/cache-control.d.ts.map +1 -1
  79. package/dist/providers/cache-control.js +0 -29
  80. package/dist/providers/cache-control.js.map +1 -1
  81. package/dist/providers/thinking.d.ts.map +1 -1
  82. package/dist/providers/thinking.js +2 -6
  83. package/dist/providers/thinking.js.map +1 -1
  84. package/dist/tools/ask-user.d.ts.map +1 -1
  85. package/dist/tools/ask-user.js +17 -7
  86. package/dist/tools/ask-user.js.map +1 -1
  87. package/dist/tools/edit.d.ts.map +1 -1
  88. package/dist/tools/edit.js +8 -1
  89. package/dist/tools/edit.js.map +1 -1
  90. package/dist/tools/glob.d.ts.map +1 -1
  91. package/dist/tools/glob.js +9 -2
  92. package/dist/tools/glob.js.map +1 -1
  93. package/dist/tools/grep.d.ts +1 -1
  94. package/dist/tools/grep.d.ts.map +1 -1
  95. package/dist/tools/grep.js +29 -6
  96. package/dist/tools/grep.js.map +1 -1
  97. package/dist/tools/index.d.ts +2 -10
  98. package/dist/tools/index.d.ts.map +1 -1
  99. package/dist/tools/index.js +10 -3
  100. package/dist/tools/index.js.map +1 -1
  101. package/dist/tools/list-dir.d.ts.map +1 -1
  102. package/dist/tools/list-dir.js.map +1 -1
  103. package/dist/tools/read-file.d.ts.map +1 -1
  104. package/dist/tools/read-file.js +78 -36
  105. package/dist/tools/read-file.js.map +1 -1
  106. package/dist/tools/shell-provider.d.ts +1 -0
  107. package/dist/tools/shell-provider.d.ts.map +1 -1
  108. package/dist/tools/shell-provider.js +7 -0
  109. package/dist/tools/shell-provider.js.map +1 -1
  110. package/dist/tools/shell-utils.d.ts.map +1 -1
  111. package/dist/tools/shell-utils.js +45 -2
  112. package/dist/tools/shell-utils.js.map +1 -1
  113. package/dist/tools/shell.d.ts.map +1 -1
  114. package/dist/tools/shell.js +15 -1
  115. package/dist/tools/shell.js.map +1 -1
  116. package/dist/tools/task.d.ts.map +1 -1
  117. package/dist/tools/task.js +4 -4
  118. package/dist/tools/task.js.map +1 -1
  119. package/dist/tools/todo-write.d.ts.map +1 -1
  120. package/dist/tools/todo-write.js.map +1 -1
  121. package/dist/tools/web-fetch.d.ts +2 -0
  122. package/dist/tools/web-fetch.d.ts.map +1 -1
  123. package/dist/tools/web-fetch.js +92 -27
  124. package/dist/tools/web-fetch.js.map +1 -1
  125. package/dist/tools/write-file.d.ts.map +1 -1
  126. package/dist/tools/write-file.js +7 -1
  127. package/dist/tools/write-file.js.map +1 -1
  128. package/dist/types/index.d.ts +17 -1
  129. package/dist/types/index.d.ts.map +1 -1
  130. package/dist/types/index.js.map +1 -1
  131. package/dist/utils/lru-cache.d.ts +17 -0
  132. package/dist/utils/lru-cache.d.ts.map +1 -0
  133. package/dist/utils/lru-cache.js +40 -0
  134. package/dist/utils/lru-cache.js.map +1 -0
  135. package/dist/utils/media-type.d.ts +5 -0
  136. package/dist/utils/media-type.d.ts.map +1 -0
  137. package/dist/utils/media-type.js +19 -0
  138. package/dist/utils/media-type.js.map +1 -0
  139. package/dist/utils/message-helpers.d.ts +6 -0
  140. package/dist/utils/message-helpers.d.ts.map +1 -0
  141. package/dist/utils/message-helpers.js +14 -0
  142. package/dist/utils/message-helpers.js.map +1 -0
  143. package/package.json +1 -1
  144. package/dist/tools/save-knowledge.d.ts +0 -8
  145. package/dist/tools/save-knowledge.d.ts.map +0 -1
  146. package/dist/tools/save-knowledge.js +0 -61
  147. package/dist/tools/save-knowledge.js.map +0 -1
@@ -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 via content-length header (best-effort chunked responses skip this,
17
- // in which case the 15 s fetch timeout bounds the download).
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
- const fetchCache = new Map();
27
- function cacheGet(url) {
28
- const entry = fetchCache.get(url);
29
- if (!entry)
30
- return null;
31
- if (Date.now() - entry.at > CACHE_TTL_MS) {
32
- fetchCache.delete(url);
33
- return null;
34
- }
35
- // LRU: re-insert to move this entry to the tail (most-recently-used)
36
- fetchCache.delete(url);
37
- fetchCache.set(url, entry);
38
- return entry.markdown;
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
- function cacheSet(url, markdown) {
41
- if (fetchCache.size >= CACHE_MAX_ENTRIES) {
42
- const oldest = fetchCache.keys().next().value;
43
- if (oldest !== undefined)
44
- fetchCache.delete(oldest);
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
- fetchCache.set(url, { markdown, at: Date.now() });
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 cached = cacheGet(url);
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
- // Best-effort size guard: content-length is optional under chunked encoding,
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
- const body = await response.text();
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
- cacheSet(url, json);
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
- cacheSet(url, markdown);
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":"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"}
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;;;SAQpB,CAAA"}
1
+ {"version":3,"file":"write-file.d.ts","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,SAAS;;;SAapB,CAAA"}
@@ -2,7 +2,13 @@
2
2
  import { tool } from 'ai';
3
3
  import { z } from 'zod';
4
4
  export const writeFile = tool({
5
- description: 'Create or overwrite a file at the given path. Always prefer edit (string replacement) over writeFile for modifying existing files.',
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,EACT,oIAAoI;IACtI,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"}
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"}
@@ -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":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAiPA,wBAAwB;AAExB,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,MAAM,EAAE,6BAA6B;IACrC,IAAI,EAAE,2BAA2B;IACjC,KAAK,EAAE,4BAA4B;IACnC,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,uBAAuB;IAC/B,QAAQ,EAAE,4BAA4B;IACtC,cAAc,EAAE,0BAA0B;IAC1C,IAAI,EAAE,kBAAkB;IACxB,GAAG,EAAE,kBAAkB;IACvB,IAAI,EAAE,sBAAsB;CAC7B,CAAA;AAED,wDAAwD;AAExD,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,EAAE,MAAM,EAAE,mBAAmB,EAAE,YAAY,EAAE,6BAA6B,EAAE;IAC5E,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE;IAC5D,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,4BAA4B,EAAE;IAC1E,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE;IAC/D,EAAE,MAAM,EAAE,8BAA8B,EAAE,YAAY,EAAE,uBAAuB,EAAE;IACjF,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE;IACrD,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAE;IAC7D,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,sBAAsB,EAAE;CAC5D,CAAA;AAaV;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAA6C;IACvE,SAAS,EAAE;QACT;YACE,EAAE,EAAE,6BAA6B;YACjC,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,4DAA4D;SAC1E;QACD;YACE,EAAE,EAAE,2BAA2B;YAC/B,KAAK,EAAE,UAAU;YACjB,WAAW,EAAE,uDAAuD;SACrE;QACD,EAAE,EAAE,EAAE,4BAA4B,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,qCAAqC,EAAE;KAC7G;IACD,MAAM,EAAE;QACN,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,oCAAoC,EAAE;QAC7F,EAAE,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,iCAAiC,EAAE;QACpG,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,qDAAqD,EAAE;QACpG,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,yBAAyB,EAAE;KACnF;IACD,QAAQ,EAAE;QACR;YACE,EAAE,EAAE,4BAA4B;YAChC,KAAK,EAAE,mBAAmB;YAC1B,WAAW,EAAE,6CAA6C;SAC3D;QACD;YACE,EAAE,EAAE,0BAA0B;YAC9B,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE,0CAA0C;SACxD;KACF;IACD,OAAO,EAAE;QACP,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,sCAAsC,EAAE;QAClG,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,uBAAuB,EAAE;QACrF,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE;QAChF,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE;QAC/E,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,wBAAwB,EAAE;QACpG,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE;KAC9E;IACD,MAAM,EAAE;QACN,EAAE,EAAE,EAAE,uBAAuB,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,sCAAsC,EAAE;QAC7G,EAAE,EAAE,EAAE,yBAAyB,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,qBAAqB,EAAE;KACjG;IACD,GAAG,EAAE;QACH,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;QAClE,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,yBAAyB,EAAE;KACxF;IACD,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;IACrF,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,sBAAsB,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;CAC9F,CAAA;AAED,gCAAgC;AAEhC,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,SAAS,EAAE,gCAAgC;IAC3C,MAAM,EAAE,sCAAsC;IAC9C,MAAM,EAAE,oCAAoC;IAC5C,GAAG,EAAE,uBAAuB;IAC5B,QAAQ,EAAE,wCAAwC;IAClD,OAAO,EAAE,6CAA6C;IACtD,KAAK,EAAE,6CAA6C;IACpD,UAAU,EAAE,+CAA+C;CAC5D,CAAA"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@x-code-cli/core",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/woai3c/x-code-cli",
@@ -1,8 +0,0 @@
1
- export declare const saveKnowledge: import("ai").Tool<{
2
- category: "project" | "user" | "feedback" | "reference";
3
- action: "add" | "delete";
4
- key: string;
5
- fact: string;
6
- scope: "global" | "project";
7
- }, string>;
8
- //# sourceMappingURL=save-knowledge.d.ts.map
@@ -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"}