@este.systems/dsc 1.2.1 → 1.4.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.
@@ -1,6 +1,64 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from "react";
3
3
  import { Box, Text } from "ink";
4
+ // Minimal markdown → ink Text-tree renderer. Handles the subset that's
5
+ // actually common in assistant output: headings, paragraphs, inline code,
6
+ // fenced code blocks, **bold**, *italic*, `code`, [link](url), `- ` lists,
7
+ // `> ` blockquotes. Anything not recognized falls through as plain text,
8
+ // so worst-case the user just sees the literal source — never an error.
9
+ //
10
+ // We intentionally don't pull in `marked` or similar — those produce HTML
11
+ // or ANSI strings, neither of which ink's Text component renders. A small
12
+ // purpose-built parser also lets us memoize per-source so streaming
13
+ // re-renders skip the parse when source hasn't changed.
14
+ // ── Syntax highlighting tables ──────────────────────────────────────────
15
+ // Compact keyword strings (split to Set at module-load time) + comment
16
+ // styles. Unrecognised languages fall through to flat cyan.
17
+ const KW_RAW = {
18
+ ts: "const let var function return if else for while do class interface type enum namespace module import export from default async await try catch throw new extends implements typeof instanceof in of as keyof infer is true false null undefined void never any unknown string number boolean symbol bigint readonly abstract static public private protected break continue switch case yield",
19
+ py: "def class return if elif else for while try except finally with as import from raise yield lambda pass break continue and or not in is True False None async await global nonlocal assert del",
20
+ sh: "if then else elif fi for while do done in case esac function return local export alias unset source echo exit break continue eval exec shift read declare",
21
+ rs: "fn let mut const return if else for while loop match impl struct enum trait type use mod pub crate self super where as in ref move async await true false Some None Ok Err unsafe extern static dyn box",
22
+ go: "func return if else for range var const type struct interface map chan go select case default defer package import true false nil break continue fallthrough switch make new append len cap close delete panic recover",
23
+ java: "class interface enum extends implements package import public private protected static final abstract synchronized volatile transient native return if else for while do switch case default break continue throw try catch finally new this super true false null void int long float double boolean char byte short String",
24
+ c: "if else for while do switch case default break continue return goto struct union enum typedef sizeof static extern const volatile register auto signed unsigned int char float double void long short true false NULL",
25
+ sql: "SELECT FROM WHERE JOIN LEFT RIGHT INNER OUTER ON AND OR NOT IN LIKE BETWEEN IS NULL AS ORDER BY GROUP HAVING LIMIT OFFSET INSERT INTO VALUES UPDATE SET DELETE CREATE TABLE ALTER DROP INDEX VIEW UNION ALL DISTINCT CASE WHEN THEN ELSE END EXISTS COUNT SUM AVG MIN MAX ASC DESC PRIMARY KEY FOREIGN REFERENCES CASCADE DEFAULT UNIQUE CONSTRAINT",
26
+ };
27
+ const KW = {};
28
+ for (const [lang, s] of Object.entries(KW_RAW)) {
29
+ KW[lang] = new Set(s.split(/\s+/));
30
+ }
31
+ const COMMENT = {
32
+ ts: { lc: "//", bc: ["/*", "*/"] },
33
+ py: { lc: "#" },
34
+ sh: { lc: "#" },
35
+ rs: { lc: "//", bc: ["/*", "*/"] },
36
+ go: { lc: "//", bc: ["/*", "*/"] },
37
+ java: { lc: "//", bc: ["/*", "*/"] },
38
+ c: { lc: "//", bc: ["/*", "*/"] },
39
+ sql: { lc: "--", bc: ["/*", "*/"] },
40
+ yaml: { lc: "#" },
41
+ css: { bc: ["/*", "*/"] },
42
+ };
43
+ const LANG_ALIAS = {
44
+ js: "ts", jsx: "ts", tsx: "ts", mjs: "ts", cjs: "ts",
45
+ bash: "sh", zsh: "sh",
46
+ cpp: "c", cc: "c", cxx: "c", hpp: "c", h: "c",
47
+ rb: "py", python: "py",
48
+ rust: "rs",
49
+ yml: "yaml",
50
+ scss: "css", less: "css",
51
+ kt: "java", kotlin: "java",
52
+ dockerfile: "sh", toml: "sh",
53
+ };
54
+ function resolveLang(lang) {
55
+ const l = lang.toLowerCase();
56
+ const base = LANG_ALIAS[l] ?? l;
57
+ return KW[base] || COMMENT[base] ? base : null;
58
+ }
59
+ export function hasSyntax(lang) {
60
+ return resolveLang(lang) !== null;
61
+ }
4
62
  // React.memo on `source`: when the parent re-renders (e.g. every chunk
5
63
  // of a streaming turn) but the source we're handed hasn't changed, skip
6
64
  // the parse + ink tree rebuild entirely. The streaming pipeline relies
@@ -122,7 +180,10 @@ function Block({ block }) {
122
180
  return (_jsx(Box, { children: _jsxs(Text, { bold: true, color: color, children: ["#".repeat(block.level), " ", block.text] }) }));
123
181
  }
124
182
  if (block.kind === "code") {
125
- return (_jsxs(Box, { flexDirection: "column", marginY: 0, children: [block.lang ? (_jsxs(Text, { dimColor: true, children: ["```", block.lang] })) : (_jsx(Text, { dimColor: true, children: "```" })), block.lines.map((l, i) => (_jsxs(Text, { color: "cyan", children: [" ", l] }, i))), _jsx(Text, { dimColor: true, children: "```" })] }));
183
+ const langOk = hasSyntax(block.lang);
184
+ return (_jsxs(Box, { flexDirection: "column", marginY: 0, children: [block.lang ? (_jsxs(Text, { dimColor: true, children: ["```", block.lang] })) : (_jsx(Text, { dimColor: true, children: "```" })), langOk
185
+ ? block.lines.map((l, i) => (_jsxs(Text, { children: [" ", highlightLine(l, resolveLang(block.lang))] }, i)))
186
+ : block.lines.map((l, i) => (_jsxs(Text, { color: "cyan", children: [" ", l] }, i))), _jsx(Text, { dimColor: true, children: "```" })] }));
126
187
  }
127
188
  if (block.kind === "quote") {
128
189
  return (_jsx(Box, { flexDirection: "column", children: block.lines.map((l, i) => (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "\u2502 " }), _jsx(Text, { dimColor: true, italic: true, children: _jsx(Inline, { source: l }) })] }, i))) }));
@@ -164,6 +225,112 @@ function Block({ block }) {
164
225
  }
165
226
  return (_jsx(Box, { children: _jsx(Text, { children: _jsx(Inline, { source: block.text }) }) }));
166
227
  }
228
+ // ── Syntax highlighting ─────────────────────────────────────────────────
229
+ /** Scan `line` and return styled spans for the given language's tokens.
230
+ * Unrecognised languages never reach here (caller checks hasSyntax first).
231
+ * Uses a single left-to-right pass with a plain-text buffer: keywords
232
+ * (blue bold), numbers (yellow), strings (green), comments (dim italic). */
233
+ function highlightLine(line, lang) {
234
+ const kw = KW[lang];
235
+ const cmt = COMMENT[lang] ?? {};
236
+ const lc = cmt.lc;
237
+ const [bo, bc] = cmt.bc ?? [];
238
+ const out = [];
239
+ let plain = "";
240
+ const flush = () => { if (plain) {
241
+ out.push(plain);
242
+ plain = "";
243
+ } };
244
+ let i = 0;
245
+ while (i < line.length) {
246
+ // Line comment — consume rest of line
247
+ if (lc && line.startsWith(lc, i)) {
248
+ flush();
249
+ out.push(_jsx(Text, { dimColor: true, italic: true, children: line.slice(i) }, out.length));
250
+ return out;
251
+ }
252
+ // Block comment
253
+ if (bo && bc && line.startsWith(bo, i)) {
254
+ const end = line.indexOf(bc, i + bo.length);
255
+ if (end !== -1) {
256
+ flush();
257
+ out.push(_jsx(Text, { dimColor: true, italic: true, children: line.slice(i, end + bc.length) }, out.length));
258
+ i = end + bc.length;
259
+ continue;
260
+ }
261
+ }
262
+ // String: "..." or '...'
263
+ if (line[i] === '"' || line[i] === "'") {
264
+ const end = findQuoteEnd(line, i, line[i]);
265
+ if (end !== -1) {
266
+ flush();
267
+ out.push(_jsx(Text, { color: "green", children: line.slice(i, end + 1) }, out.length));
268
+ i = end + 1;
269
+ continue;
270
+ }
271
+ }
272
+ // Template literal: `...`
273
+ if (line[i] === '`') {
274
+ let j = i + 1;
275
+ while (j < line.length) {
276
+ if (line[j] === '\\') {
277
+ j += 2;
278
+ continue;
279
+ }
280
+ if (line[j] === '`')
281
+ break;
282
+ j++;
283
+ }
284
+ if (j < line.length) {
285
+ flush();
286
+ out.push(_jsx(Text, { color: "green", children: line.slice(i, j + 1) }, out.length));
287
+ i = j + 1;
288
+ continue;
289
+ }
290
+ }
291
+ // Number (must start on a word boundary — not mid-identifier like foo123)
292
+ if (i === 0 || !/\w/.test(line[i - 1])) {
293
+ const m = line.slice(i).match(/^(0[xX][0-9a-fA-F]+|0[bB][01]+|0[oO][0-7]+|\d+\.?\d*(?:[eE][+-]?\d+)?)/);
294
+ if (m) {
295
+ flush();
296
+ out.push(_jsx(Text, { color: "yellow", children: m[0] }, out.length));
297
+ i += m[0].length;
298
+ continue;
299
+ }
300
+ }
301
+ // Keyword (must start on a word boundary)
302
+ if (kw && (i === 0 || !/\w/.test(line[i - 1]))) {
303
+ const m = line.slice(i).match(/^[a-zA-Z_]\w*/);
304
+ if (m && kw.has(m[0])) {
305
+ flush();
306
+ out.push(_jsx(Text, { color: "blue", bold: true, children: m[0] }, out.length));
307
+ i += m[0].length;
308
+ continue;
309
+ }
310
+ }
311
+ // Plain character
312
+ plain += line[i];
313
+ i++;
314
+ }
315
+ flush();
316
+ return out;
317
+ }
318
+ /** Find the closing quote for a string starting at `start` with `quote`,
319
+ * skipping backslash-escaped characters. Returns -1 if unclosed. */
320
+ function findQuoteEnd(line, start, quote) {
321
+ let j = start + 1;
322
+ while (j < line.length) {
323
+ if (line[j] === '\\') {
324
+ j += 2;
325
+ continue;
326
+ }
327
+ if (line[j] === quote)
328
+ return j;
329
+ j++;
330
+ }
331
+ return -1;
332
+ }
333
+ // ── Inline markdown parser ──────────────────────────────────────────────
167
334
  // Inline span parser: scans the string left-to-right and emits styled spans
168
335
  // for **bold**, *italic*, `code`, [text](url). The unambiguous markers are
169
336
  // chosen for predictability — markdown's full inline grammar is famously
@@ -1 +1 @@
1
- {"version":3,"file":"Markdown.js","sourceRoot":"","sources":["../../src/tui/Markdown.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Markdown.js","sourceRoot":"","sources":["../../src/tui/Markdown.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,uEAAuE;AACvE,0EAA0E;AAC1E,2EAA2E;AAC3E,yEAAyE;AACzE,wEAAwE;AACxE,EAAE;AACF,0EAA0E;AAC1E,0EAA0E;AAC1E,oEAAoE;AACpE,wDAAwD;AAExD,2EAA2E;AAC3E,uEAAuE;AACvE,4DAA4D;AAE5D,MAAM,MAAM,GAA2B;IACrC,EAAE,EAAG,+XAA+X;IACpY,EAAE,EAAG,+LAA+L;IACpM,EAAE,EAAG,2JAA2J;IAChK,EAAE,EAAG,yMAAyM;IAC9M,EAAE,EAAG,wNAAwN;IAC7N,IAAI,EAAC,8TAA8T;IACnU,CAAC,EAAI,uNAAuN;IAC5N,GAAG,EAAE,qVAAqV;CAC3V,CAAC;AAEF,MAAM,EAAE,GAAgC,EAAE,CAAC;AAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;IAC/C,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACrC,CAAC;AAGD,MAAM,OAAO,GAAiC;IAC5C,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;IAClC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;IACf,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;IACf,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;IAClC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;IAClC,IAAI,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;IACnC,CAAC,EAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;IACnC,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;IACnC,IAAI,EAAC,EAAE,EAAE,EAAE,GAAG,EAAE;IAChB,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;CAC1B,CAAC;AAEF,MAAM,UAAU,GAA2B;IACzC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI;IACpD,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI;IACrB,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG;IAC7C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI;IACtB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;IACxB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAC1B,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CAC7B,CAAC;AAEF,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;AACpC,CAAC;AAMD,uEAAuE;AACvE,wEAAwE;AACxE,uEAAuE;AACvE,uEAAuE;AACvE,oDAAoD;AACpD,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,EAAE,MAAM,EAAS;IACpE,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,CACL,4BACG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,KAAC,KAAK,IAAS,KAAK,EAAE,CAAC,IAAX,CAAC,CAAc,CAC5B,CAAC,GACD,CACJ,CAAC;AACJ,CAAC,CAAC,CAAC;AAWH,MAAM,UAAU,GAAG,CAAC,CAAS,EAAW,EAAE;IACxC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACnB,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC/D,CAAC,CAAC;AACF,MAAM,gBAAgB,GAAG,CAAC,CAAS,EAAW,EAAE,CAC9C,6BAA6B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAExC,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAClE,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,wEAAwE;IACxE,sEAAsE;IACtE,+DAA+D;IAC/D,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACtC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,mEAAmE;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,CAAC,EAAE,CAAC;YACJ,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC,EAAE,CAAC;YACN,CAAC;YACD,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM;gBAAE,CAAC,EAAE,CAAC,CAAC,0BAA0B;YACrD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,SAAS;QACX,CAAC;QACD,qCAAqC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9D,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,0CAA0C;QAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;gBACzC,CAAC,EAAE,CAAC;YACN,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,SAAS;QACX,CAAC;QACD,wEAAwE;QACxE,uEAAuE;QACvE,wDAAwD;QACxD,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,MAAM,IAAI,GAAe,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/C,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B;YAClC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpE,CAAC,EAAE,CAAC;YACN,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAClC,SAAS;QACX,CAAC;QACD,oFAAoF;QACpF,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC3D,CAAC,EAAE,CAAC;YACN,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3C,SAAS;QACX,CAAC;QACD,cAAc;QACd,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5B,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,mDAAmD;QACnD,MAAM,IAAI,GAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,EAAE,CAAC;QACJ,OACE,CAAC,GAAG,KAAK,CAAC,MAAM;YAChB,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;YACtB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EACxC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC,EAAE,CAAC;QACN,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,KAAK,CAAC,EAAE,KAAK,EAA0B;IAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,KAAC,IAAI,oBAAS,CAAC;IACxB,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACpD,OAAO,CACL,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,KAAK,aACpB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAG,KAAK,CAAC,IAAI,IAChC,GACH,CACP,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACnC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CACZ,MAAC,IAAI,IAAC,QAAQ,0BAAK,KAAK,CAAC,IAAI,IAAQ,CACtC,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,QAAQ,0BAAW,CAC1B,EACA,MAAM;oBACL,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,MAAC,IAAI,eACF,IAAI,EACJ,aAAa,CAAC,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,KAFlC,CAAC,CAGL,CACR,CAAC;oBACJ,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,MAAC,IAAI,IAAS,KAAK,EAAC,MAAM,aACvB,IAAI,EACJ,CAAC,KAFO,CAAC,CAGL,CACR,CAAC,EACN,KAAC,IAAI,IAAC,QAAQ,0BAAW,IACrB,CACP,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACxB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACzB,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,QAAQ,8BAAU,EACxB,KAAC,IAAI,IAAC,QAAQ,QAAC,MAAM,kBACnB,KAAC,MAAM,IAAC,MAAM,EAAE,CAAC,GAAI,GAChB,KAJC,CAAC,CAKL,CACP,CAAC,GACE,CACP,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,qEAAqE;QACrE,wEAAwE;QACxE,gEAAgE;QAChE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACxB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACtB,iEAAiE;YACjE,mEAAmE;YACnE,6DAA6D;YAC7D,gEAAgE;YAChE,0DAA0D;YAC1D,KAAC,IAAI,IAAS,IAAI,EAAE,CAAC,KAAK,CAAC,YACxB,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;oBACnB,6DAA6D;oBAC7D,yDAAyD;oBACzD,6DAA6D;oBAC7D,8DAA8D;oBAC9D,mCAAmC;oBACnC,MAAM,MAAM,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;oBACpC,MAAM,GAAG,GAAG,MAAM;wBAChB,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;oBAChC,OAAO,CACL,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,YAAG,IAAI,CAAC,IAAI,GAAQ,EACxC,GAAG,EACH,GAAG,KAHK,CAAC,CAIL,CACR,CAAC;gBACJ,CAAC,CAAC,IAnBO,CAAC,CAoBL,CACR,CAAC,GACE,CACP,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACxB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAC1B,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,QAAQ,kBAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAQ,EAC3D,KAAC,IAAI,cACH,KAAC,MAAM,IAAC,MAAM,EAAE,EAAE,GAAI,GACjB,KAJC,CAAC,CAKL,CACP,CAAC,GACE,CACP,CAAC;IACJ,CAAC;IACD,OAAO,CACL,KAAC,GAAG,cACF,KAAC,IAAI,cACH,KAAC,MAAM,IAAC,MAAM,EAAE,KAAK,CAAC,IAAI,GAAI,GACzB,GACH,CACP,CAAC;AACJ,CAAC;AAED,2EAA2E;AAE3E;;;6EAG6E;AAC7E,SAAS,aAAa,CAAC,IAAY,EAAE,IAAY;IAC/C,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACpB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;IAE9B,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,MAAM,KAAK,GAAG,GAAG,EAAE,GAAG,IAAI,KAAK,EAAE,CAAC;QAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAC,KAAK,GAAG,EAAE,CAAC;IAAC,CAAC,CAAC,CAAC,CAAC;IAEpE,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,sCAAsC;QACtC,IAAI,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YACjC,KAAK,EAAE,CAAC;YACR,GAAG,CAAC,IAAI,CAAC,KAAC,IAAI,IAAkB,QAAQ,QAAC,MAAM,kBAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAA1C,GAAG,CAAC,MAAM,CAAwC,CAAC,CAAC;YACxE,OAAO,GAAG,CAAC;QACb,CAAC;QACD,gBAAgB;QAChB,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,KAAK,EAAE,CAAC;gBACR,GAAG,CAAC,IAAI,CAAC,KAAC,IAAI,IAAkB,QAAQ,QAAC,MAAM,kBAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAA3D,GAAG,CAAC,MAAM,CAAyD,CAAC,CAAC;gBACzF,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC;gBACpB,SAAS;YACX,CAAC;QACH,CAAC;QACD,yBAAyB;QACzB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,KAAK,EAAE,CAAC;gBACR,GAAG,CAAC,IAAI,CAAC,KAAC,IAAI,IAAkB,KAAK,EAAC,OAAO,YAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,IAAjD,GAAG,CAAC,MAAM,CAA+C,CAAC,CAAC;gBAC/E,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;gBACZ,SAAS;YACX,CAAC;QACH,CAAC;QACD,0BAA0B;QAC1B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBAAC,CAAC,IAAI,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAC3C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;oBAAE,MAAM;gBAC3B,CAAC,EAAE,CAAC;YACN,CAAC;YACD,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpB,KAAK,EAAE,CAAC;gBACR,GAAG,CAAC,IAAI,CAAC,KAAC,IAAI,IAAkB,KAAK,EAAC,OAAO,YAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAA/C,GAAG,CAAC,MAAM,CAA6C,CAAC,CAAC;gBAC7E,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACV,SAAS;YACX,CAAC;QACH,CAAC;QACD,0EAA0E;QAC1E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAC;YACxG,IAAI,CAAC,EAAE,CAAC;gBACN,KAAK,EAAE,CAAC;gBACR,GAAG,CAAC,IAAI,CAAC,KAAC,IAAI,IAAkB,KAAK,EAAC,QAAQ,YAAE,CAAC,CAAC,CAAC,CAAC,IAAhC,GAAG,CAAC,MAAM,CAA8B,CAAC,CAAC;gBAC9D,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACjB,SAAS;YACX,CAAC;QACH,CAAC;QACD,0CAA0C;QAC1C,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAC/C,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtB,KAAK,EAAE,CAAC;gBACR,GAAG,CAAC,IAAI,CAAC,KAAC,IAAI,IAAkB,KAAK,EAAC,MAAM,EAAC,IAAI,kBAAE,CAAC,CAAC,CAAC,CAAC,IAAnC,GAAG,CAAC,MAAM,CAAiC,CAAC,CAAC;gBACjE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACjB,SAAS;YACX,CAAC;QACH,CAAC;QACD,kBAAkB;QAClB,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC,EAAE,CAAC;IACN,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO,GAAG,CAAC;AACb,CAAC;AAED;qEACqE;AACrE,SAAS,YAAY,CAAC,IAAY,EAAE,KAAa,EAAE,KAAa;IAC9D,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAAC,CAAC,IAAI,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK;YAAE,OAAO,CAAC,CAAC;QAChC,CAAC,EAAE,CAAC;IACN,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,2EAA2E;AAE3E,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,kDAAkD;AAClD,SAAS,MAAM,CAAC,EAAE,MAAM,EAAsB;IAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,CACL,4BACG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAClB,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,CAAC,CAAC;YACpC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;gBAAE,OAAO,KAAC,IAAI,IAAS,IAAI,kBAAE,CAAC,CAAC,IAAI,IAAf,CAAC,CAAsB,CAAC;YACjE,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,KAAC,IAAI,IAAS,MAAM,kBAAE,CAAC,CAAC,IAAI,IAAjB,CAAC,CAAwB,CAAC;YACrE,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;gBACnB,OAAO,CACL,MAAC,IAAI,IAAS,KAAK,EAAC,MAAM,EAAC,QAAQ,mBAChC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,KADR,CAAC,CAEL,CACR,CAAC;YACJ,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;gBACnB,OAAO,CACL,MAAC,IAAI,IAAS,KAAK,EAAC,MAAM,EAAC,SAAS,mBACjC,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAC,IAAI,IAAC,QAAQ,yBAAI,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,KAFzC,CAAC,CAGL,CACR,CAAC;YACJ,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,GACD,CACJ,CAAC;AACJ,CAAC;AAQD,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACd,GAAG,GAAG,EAAE,CAAC;QACX,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,mCAAmC;QACnC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,KAAK,EAAE,CAAC;gBACR,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC1D,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;gBACd,SAAS;YACX,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC/D,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACtC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,KAAK,EAAE,CAAC;gBACR,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC5D,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;gBACd,SAAS;YACX,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACtC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,KAAK,EAAE,CAAC;gBACR,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC1D,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;gBACd,SAAS;YACX,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7C,IAAI,YAAY,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACzD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;gBACtD,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;oBACtB,KAAK,EAAE,CAAC;oBACR,GAAG,CAAC,IAAI,CAAC;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC;wBACpC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,UAAU,CAAC;qBAC9C,CAAC,CAAC;oBACH,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC;oBACnB,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QACD,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACd,CAAC,EAAE,CAAC;IACN,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { useStore } from "./useStore.js";
4
+ /** Compact one-line plan progress indicator shown above the prompt.
5
+ * Renders nothing when there's no active plan. */
6
+ export function PlanLine() {
7
+ const plan = useStore((s) => s.plan);
8
+ if (!plan)
9
+ return null;
10
+ const done = plan.tasks.filter((t) => t.done).length;
11
+ const total = plan.tasks.length;
12
+ const pct = total > 0 ? Math.round((done / total) * 100) : 0;
13
+ const bar = plan.tasks.map((t) => (t.done ? "✓" : "◌")).join("");
14
+ return (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "plan: " }), _jsx(Text, { children: plan.title }), _jsxs(Text, { dimColor: true, children: [" [", bar, "] ", done, "/", total, " (", pct, "%)"] })] }));
15
+ }
16
+ //# sourceMappingURL=PlanLine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlanLine.js","sourceRoot":"","sources":["../../src/tui/PlanLine.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;mDACmD;AACnD,MAAM,UAAU,QAAQ;IACtB,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAChC,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEjE,OAAO,CACL,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,QAAQ,6BAAc,EAC5B,KAAC,IAAI,cAAE,IAAI,CAAC,KAAK,GAAQ,EACzB,MAAC,IAAI,IAAC,QAAQ,0BAAK,GAAG,QAAI,IAAI,OAAG,KAAK,QAAI,GAAG,UAAU,IACnD,CACP,CAAC;AACJ,CAAC"}
@@ -1,7 +1,8 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useState } from "react";
3
3
  import { Box, Text, useStdout } from "ink";
4
4
  import { useStore } from "./useStore.js";
5
+ import { modelSpec } from "../api.js";
5
6
  // Braille-block spinner — same shape Ora/cli-spinners use. Each entry is a
6
7
  // single column wide so it doesn't shift the status-bar layout per tick.
7
8
  const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
@@ -42,27 +43,59 @@ export function StatusBar() {
42
43
  const cache = s.cacheHitTokens > 0 || s.cacheMissTokens > 0
43
44
  ? ` (h:${formatCount(s.cacheHitTokens)} m:${formatCount(s.cacheMissTokens)})`
44
45
  : "";
45
- const left = `${s.model}${flags} · $${s.cost.toFixed(4)} ` +
46
- `▲${formatCount(s.inTokens)}${cache} ▼${formatCount(s.outTokens)} ` +
47
- `ctx:${formatCount(s.contextTokens)}` +
48
- (s.queueDepth > 0 ? ` queued:${s.queueDepth}` : "");
46
+ const ctxWindow = modelSpec(s.model).contextWindow;
47
+ const ctxPct = ctxWindow ? Math.round((s.contextTokens / ctxWindow) * 100) : null;
48
+ const ctxLabel = ctxWindow && ctxPct !== null
49
+ ? `ctx:${formatCount(s.contextTokens)}/${formatCount(ctxWindow)} (${ctxPct}%)`
50
+ : `ctx:${formatCount(s.contextTokens)}`;
51
+ // Color the ctx label when approaching the context window: yellow at 80%,
52
+ // red at 95%. The inverse background swaps fg/bg; these colors stay legible.
53
+ const ctxColor = ctxPct !== null && ctxPct >= 95 ? "red"
54
+ : ctxPct !== null && ctxPct >= 80 ? "yellow"
55
+ : undefined;
56
+ const leftBeforeCtx = `${s.model}${flags} · ${s.cost.toFixed(4)} ` +
57
+ `▲${formatCount(s.inTokens)}${cache} ▼${formatCount(s.outTokens)} `;
58
+ const afterCtx = s.queueDepth > 0 ? ` queued:${s.queueDepth}` : "";
59
+ const fullLeft = leftBeforeCtx + ctxLabel + afterCtx;
49
60
  const rightBody = s.busy
50
61
  ? s.task
51
62
  ? s.task
52
63
  : "thinking"
53
64
  : formatDuration(s.sessionSeconds);
54
- // Spinner sits just before the right-side text when busy, taking one
55
- // column. Padding math uses the visible length so the bar stays width-
56
- // exact regardless of which spinner frame is current.
57
65
  const right = spinner ? `${spinner} ${rightBody}` : rightBody;
58
- // Pad left + right to fill terminal width so the reverse-video block
59
- // spans edge-to-edge without wrapping. The rendered line is framed by a
60
- // single leading + trailing space, so subtract 2 from `width` to leave
61
- // room for them.
66
+ // Pad left + right to fill terminal width. Framed by leading + trailing space.
62
67
  const inner = Math.max(0, width - 2);
63
68
  const rightLen = right.length;
69
+ if (ctxColor) {
70
+ // When ctx is at warning level, render it as a colored span inside the
71
+ // inverse bar. We recompute clipping so the ctx portion stays visible.
72
+ const leftMax = Math.max(0, inner - rightLen - 1);
73
+ let beforeClipped = leftBeforeCtx;
74
+ let ctxClipped = ctxLabel;
75
+ let afterClipped = afterCtx;
76
+ if (fullLeft.length > leftMax) {
77
+ // Clip the left side, keeping ctx as intact as possible
78
+ const overflow = fullLeft.length - leftMax;
79
+ if (overflow >= leftBeforeCtx.length) {
80
+ beforeClipped = leftBeforeCtx.slice(0, Math.max(0, leftBeforeCtx.length - overflow - 1)) + "…";
81
+ }
82
+ else {
83
+ beforeClipped = leftBeforeCtx.slice(0, Math.max(0, leftBeforeCtx.length - overflow));
84
+ }
85
+ const remaining = leftMax - beforeClipped.length;
86
+ if (remaining < ctxLabel.length) {
87
+ ctxClipped = ctxLabel.slice(0, Math.max(0, remaining - 1)) + "…";
88
+ }
89
+ if (ctxClipped.length + beforeClipped.length < leftMax && afterCtx) {
90
+ afterClipped = afterCtx.slice(0, leftMax - beforeClipped.length - ctxClipped.length);
91
+ }
92
+ }
93
+ const padLen = Math.max(1, inner - beforeClipped.length - ctxClipped.length - afterClipped.length - rightLen);
94
+ return (_jsx(Box, { children: _jsxs(Text, { inverse: true, children: [" ", beforeClipped, _jsx(Text, { color: ctxColor, children: ctxClipped }), afterClipped, " ".repeat(padLen), right, " "] }) }));
95
+ }
96
+ // No ctx warning — single-string render as before.
64
97
  const leftMax = Math.max(0, inner - rightLen - 1);
65
- const leftClipped = left.length > leftMax ? left.slice(0, Math.max(0, leftMax - 1)) + "…" : left;
98
+ const leftClipped = fullLeft.length > leftMax ? fullLeft.slice(0, Math.max(0, leftMax - 1)) + "…" : fullLeft;
66
99
  const padCount = Math.max(1, inner - leftClipped.length - rightLen);
67
100
  const line = ` ${leftClipped}${" ".repeat(padCount)}${right} `;
68
101
  return (_jsx(Box, { children: _jsx(Text, { inverse: true, children: line }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../src/tui/StatusBar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../src/tui/StatusBar.tsx"],"names":[],"mappings":"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"}
package/dist/tui.js CHANGED
@@ -12,29 +12,49 @@ import * as approval from "./approval.js";
12
12
  import * as replHistory from "./repl_history.js";
13
13
  import { promises as fsp } from "node:fs";
14
14
  import { homedir } from "node:os";
15
+ import { spawn } from "node:child_process";
15
16
  import * as path from "node:path";
16
17
  import { compactSession } from "./compact.js";
17
18
  import { formatVersionInfo } from "./version.js";
18
19
  import { openEditor } from "./editor.js";
19
20
  import { checkForUpdate } from "./update.js";
20
21
  import { dispatchSlash } from "./slash_dispatch.js";
22
+ import { ProjectContext } from "./context.js";
23
+ /** Parse a numbered task list from the agent's response. Returns empty array
24
+ * if no clear plan structure was found. */
25
+ function parsePlanTasks(text) {
26
+ const tasks = [];
27
+ for (const line of text.split("\n")) {
28
+ const m = line.match(/^\s*(\d+)[.)]\s+(.+)/);
29
+ if (m) {
30
+ tasks.push({ id: parseInt(m[1], 10), text: m[2].trim(), done: false });
31
+ }
32
+ }
33
+ // Only accept if the tasks are sequential (1, 2, 3, ...) — guards against
34
+ // the agent casually writing "1. something" mid-paragraph.
35
+ if (tasks.length < 2)
36
+ return [];
37
+ for (let i = 0; i < tasks.length; i++) {
38
+ if (tasks[i].id !== i + 1)
39
+ return [];
40
+ }
41
+ return tasks;
42
+ }
21
43
  // Auto-compact threshold (token-count of estimated context). Default
22
44
  // 50K — well below the 1M model limit, but tuned to keep per-turn input
23
45
  // cost from creeping. Override via DSC_AUTO_COMPACT_AT; set to "0" /
24
- // "off" / "false" to disable. Matches the env-var name documented in
25
- // README + ENV table; the earlier TUI port read the wrong variable
26
- // (DSC_AUTO_COMPACT) and defaulted to 0, silently disabling
27
- // auto-compact for everyone since 0.2.0.
46
+ // "off" / "false" to disable. Default 20K tuned to keep per-turn
47
+ // input cost reasonable without losing too much context to summaries.
28
48
  const AUTO_COMPACT_AT_TOKENS = (() => {
29
49
  const raw = process.env.DSC_AUTO_COMPACT_AT;
30
50
  if (!raw)
31
- return 50_000;
51
+ return 20_000;
32
52
  if (raw === "0" || raw === "off" || raw === "false")
33
53
  return 0;
34
54
  const n = parseInt(raw, 10);
35
- return Number.isFinite(n) && n > 0 ? n : 50_000;
55
+ return Number.isFinite(n) && n > 0 ? n : 20_000;
36
56
  })();
37
- const AUTO_COMPACT_KEEP = Number(process.env.DSC_AUTO_COMPACT_KEEP ?? "4") || 4;
57
+ const AUTO_COMPACT_KEEP = Number(process.env.DSC_AUTO_COMPACT_KEEP ?? "8") || 8;
38
58
  class CliError extends Error {
39
59
  }
40
60
  // Full arg parsing for the TUI entry — this is the only entry point now
@@ -174,6 +194,11 @@ async function main() {
174
194
  const mcpDispatch = (name, args) => callMCPTool(mcpConnections, name, args, {
175
195
  sessionApprovals: toolCtx.sessionApprovals,
176
196
  });
197
+ // Project-context index: chunks AGENTS.md, README.md, etc. and
198
+ // injects relevant paragraphs before each agent turn. Re-indexed
199
+ // when the session resets (/clear, /resume).
200
+ const projectCtx = new ProjectContext();
201
+ await projectCtx.build(cwd);
177
202
  // Coalescing save (same shape as REPL).
178
203
  let savePromise = null;
179
204
  let savePending = false;
@@ -398,6 +423,16 @@ async function main() {
398
423
  return;
399
424
  }
400
425
  }
426
+ // Inject relevant project context from indexed files (AGENTS.md,
427
+ // README.md, and recently-touched files). The history shows the
428
+ // original user text; the model sees context-enriched.
429
+ const ctxSnippets = projectCtx.search(userText);
430
+ const enhancedText = ctxSnippets.length > 0
431
+ ? "Relevant project context:\n\n" +
432
+ ctxSnippets.join("\n\n") +
433
+ "\n\n---\nUser: " +
434
+ userText
435
+ : userText;
401
436
  // Push the user message into history immediately so it's visible before
402
437
  // the model responds.
403
438
  setState((s) => ({
@@ -407,7 +442,7 @@ async function main() {
407
442
  ],
408
443
  busy: true,
409
444
  }));
410
- messages.push({ role: "user", content: userText });
445
+ messages.push({ role: "user", content: enhancedText });
411
446
  pendingAbort = new AbortController();
412
447
  try {
413
448
  await runAgent({
@@ -448,6 +483,10 @@ async function main() {
448
483
  setState({ busy: false, task: null });
449
484
  }
450
485
  await persist();
486
+ // Index any files the agent touched this turn for future context queries.
487
+ for (const f of toolCtx.filesTouched) {
488
+ await projectCtx.addFile(cwd, f);
489
+ }
451
490
  };
452
491
  // Drain queued prompts after each turn so back-to-back submissions run in
453
492
  // order without overlapping turns.
@@ -461,6 +500,20 @@ async function main() {
461
500
  const next = promptQueue.shift();
462
501
  syncStatus();
463
502
  await runTurn(next);
503
+ // If the user requested a plan, try to parse the last assistant message
504
+ const pt = getState().planRequestTitle;
505
+ if (pt) {
506
+ const last = [...messages].reverse().find((m) => m.role === "assistant" && typeof m.content === "string");
507
+ if (last && typeof last.content === "string") {
508
+ const tasks = parsePlanTasks(last.content);
509
+ if (tasks.length > 0) {
510
+ setState({ plan: { title: pt, tasks }, planRequestTitle: null });
511
+ }
512
+ else {
513
+ setState({ planRequestTitle: null });
514
+ }
515
+ }
516
+ }
464
517
  if (AUTO_COMPACT_AT_TOKENS > 0) {
465
518
  const ctx = estimateContextTokens(messages);
466
519
  if (ctx > AUTO_COMPACT_AT_TOKENS) {
@@ -590,12 +643,13 @@ async function main() {
590
643
  tool_call_id: m.tool_call_id,
591
644
  });
592
645
  }
593
- setState({ history: restored, current: null, model });
646
+ setState({ history: restored, current: null, model, plan: null });
594
647
  }
595
648
  else {
596
- setState({ history: [], current: null, model });
649
+ setState({ history: [], current: null, model, plan: null });
597
650
  }
598
651
  syncStatus();
652
+ void projectCtx.build(cwd); // re-index on session reset
599
653
  },
600
654
  runEditor: (initial) => {
601
655
  // ink owns the terminal — unmount before spawning $EDITOR so the editor
@@ -612,11 +666,91 @@ async function main() {
612
666
  clearInterval(timerId);
613
667
  process.exit(0);
614
668
  },
669
+ getPlan: () => getState().plan,
670
+ setPlan: (p) => setState({ plan: p }),
671
+ runBashCommand: (command) => new Promise((resolve) => {
672
+ const child = spawn(command, [], {
673
+ cwd,
674
+ shell: true,
675
+ stdio: ["ignore", "pipe", "pipe"],
676
+ windowsHide: true,
677
+ });
678
+ let out = "";
679
+ child.stdout.on("data", (d) => (out += d.toString()));
680
+ child.stderr.on("data", (d) => (out += d.toString()));
681
+ child.on("close", () => {
682
+ const MAX = 16_000;
683
+ resolve(out.length > MAX
684
+ ? out.slice(0, MAX) + `\n…(truncated, ${out.length - MAX} more chars)`
685
+ : out);
686
+ });
687
+ child.on("error", (e) => resolve(`error: ${e.message}`));
688
+ }),
615
689
  };
616
690
  // Returns true if the input was a recognized slash command and got handled
617
691
  // (or rejected) — caller should not forward it to the agent. Returns false
618
692
  // for non-slash input and unknown commands (caller decides what to do).
619
693
  const handleSlash = (line) => dispatchSlash(line, slashContext);
694
+ /** Scan `text` for `@path` (and `@path:line` / `@path:start-end`) references,
695
+ * read each file, and prepend their contents to the prompt. References that
696
+ * don't resolve to readable files are replaced with a one-line error note.
697
+ * Returns the original text if no `@`-references were found. */
698
+ const resolveAtFiles = async (text) => {
699
+ const re = /(?:^|\s)@(\S+)/g;
700
+ const refs = [];
701
+ for (const m of text.matchAll(re)) {
702
+ const raw = m[1];
703
+ const lm = raw.match(/^(.+?):(\d+)(?:-(\d+))?$/);
704
+ if (lm) {
705
+ refs.push({ raw, path: lm[1], start: Number(lm[2]), end: lm[3] ? Number(lm[3]) : undefined });
706
+ }
707
+ else {
708
+ refs.push({ raw, path: raw });
709
+ }
710
+ }
711
+ if (refs.length === 0)
712
+ return text;
713
+ const blocks = [];
714
+ for (const ref of refs) {
715
+ try {
716
+ const abs = path.resolve(cwd, ref.path);
717
+ const s = await fsp.stat(abs);
718
+ if (s.isDirectory()) {
719
+ blocks.push(`(skipped ${ref.path} — directory)`);
720
+ continue;
721
+ }
722
+ let content = await fsp.readFile(abs, "utf-8");
723
+ const totalLines = content.split("\n").length;
724
+ if (ref.start) {
725
+ const lines = content.split("\n");
726
+ if (ref.end) {
727
+ content = lines.slice(ref.start - 1, ref.end).join("\n");
728
+ }
729
+ else {
730
+ content = lines.slice(ref.start - 1).join("\n");
731
+ }
732
+ }
733
+ const MAX = 50_000;
734
+ if (content.length > MAX) {
735
+ content = content.slice(0, MAX) + `\n…(truncated, ${content.length - MAX} more chars)`;
736
+ }
737
+ const range = ref.start ? ` lines ${ref.start}${ref.end ? `-${ref.end}` : "+"}` : "";
738
+ blocks.push(`File ${ref.path} (${totalLines} lines${range}):\n${content}`);
739
+ }
740
+ catch {
741
+ blocks.push(`(could not read ${ref.path})`);
742
+ }
743
+ }
744
+ if (blocks.length === 0)
745
+ return text;
746
+ // Strip @references from the original text
747
+ let clean = text;
748
+ for (const ref of refs) {
749
+ clean = clean.replace(new RegExp(`@${ref.raw.replace(/[.*+?^${}()|[\]\\]/g, "\\ const handleSubmit = (text: string) => {")}`, "g"), "");
750
+ }
751
+ clean = clean.trim().replace(/\s+/g, " ");
752
+ return blocks.join("\n\n") + "\n\n" + (clean ? `User: ${clean}` : "");
753
+ };
620
754
  const handleSubmit = (text) => {
621
755
  // Persist every submitted line — slash commands included, since
622
756
  // recalling "/resume 3" via arrow-up is useful.
@@ -638,9 +772,11 @@ async function main() {
638
772
  void handleSlash(text);
639
773
  return;
640
774
  }
641
- promptQueue.push(text);
642
- syncStatus();
643
- void drain();
775
+ void resolveAtFiles(text).then((resolved) => {
776
+ promptQueue.push(resolved);
777
+ syncStatus();
778
+ void drain();
779
+ });
644
780
  };
645
781
  const handleAbort = () => {
646
782
  if (pendingAbort && !pendingAbort.signal.aborted) {
@@ -657,7 +793,8 @@ async function main() {
657
793
  if (migratedFromOneShot) {
658
794
  process.stderr.write(`migrated config: copied ${migratedFromOneShot} → ${configPath()}\n`);
659
795
  }
660
- messages.push({ role: "user", content: cli.prompt });
796
+ const resolvedOneShot = await resolveAtFiles(cli.prompt);
797
+ messages.push({ role: "user", content: resolvedOneShot });
661
798
  pendingAbort = new AbortController();
662
799
  try {
663
800
  await runAgent({