@cargo-ai/cli 1.0.126 → 1.0.128

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 (50) hide show
  1. package/build/commands/ai/prompt.d.ts.map +1 -1
  2. package/build/commands/ai/prompt.js +2 -2
  3. package/build/commands/ask/harness/bridgeOutput.d.ts +19 -0
  4. package/build/commands/ask/harness/bridgeOutput.d.ts.map +1 -0
  5. package/build/commands/ask/harness/bridgeOutput.js +42 -0
  6. package/build/commands/ask/harness/index.d.ts +3 -2
  7. package/build/commands/ask/harness/index.d.ts.map +1 -1
  8. package/build/commands/ask/harness/index.js +2 -1
  9. package/build/commands/ask/harness/turn.d.ts +17 -0
  10. package/build/commands/ask/harness/turn.d.ts.map +1 -1
  11. package/build/commands/ask/harness/turn.js +85 -3
  12. package/build/commands/ask/harness/usage.d.ts +19 -0
  13. package/build/commands/ask/harness/usage.d.ts.map +1 -1
  14. package/build/commands/ask/harness/usage.js +46 -0
  15. package/build/commands/ask/input/completer.d.ts +1 -1
  16. package/build/commands/ask/input/completer.d.ts.map +1 -1
  17. package/build/commands/ask/input/completer.js +2 -0
  18. package/build/commands/ask/input/prompt.d.ts.map +1 -1
  19. package/build/commands/ask/input/prompt.js +54 -8
  20. package/build/commands/ask/input/slash.d.ts +7 -1
  21. package/build/commands/ask/input/slash.d.ts.map +1 -1
  22. package/build/commands/ask/input/slash.js +10 -0
  23. package/build/commands/ask/session/index.d.ts +2 -1
  24. package/build/commands/ask/session/index.d.ts.map +1 -1
  25. package/build/commands/ask/session/index.js +2 -1
  26. package/build/commands/ask/session/markdown.d.ts +20 -0
  27. package/build/commands/ask/session/markdown.d.ts.map +1 -0
  28. package/build/commands/ask/session/markdown.js +451 -0
  29. package/build/commands/ask/session/run.d.ts.map +1 -1
  30. package/build/commands/ask/session/run.js +194 -12
  31. package/build/commands/ask/session/tree.d.ts +81 -0
  32. package/build/commands/ask/session/tree.d.ts.map +1 -1
  33. package/build/commands/ask/session/tree.js +322 -51
  34. package/build/commands/auth/index.js +1 -1
  35. package/build/commands/connection/connector.d.ts.map +1 -1
  36. package/build/commands/connection/connector.js +1 -1
  37. package/build/commands/hosting/envVar.d.ts.map +1 -1
  38. package/build/commands/hosting/envVar.js +15 -6
  39. package/build/commands/orchestration/span.js +2 -2
  40. package/build/commands/orchestration/trace.js +2 -2
  41. package/build/commands/runHandler.d.ts +1 -0
  42. package/build/commands/runHandler.d.ts.map +1 -1
  43. package/build/commands/runHandler.js +6 -3
  44. package/build/commands/segmentation/change.js +1 -1
  45. package/build/commands/workspaceManagement/user.d.ts.map +1 -1
  46. package/build/commands/workspaceManagement/user.js +8 -5
  47. package/build/utils/textWidth.d.ts +25 -0
  48. package/build/utils/textWidth.d.ts.map +1 -0
  49. package/build/utils/textWidth.js +147 -0
  50. package/package.json +2 -2
@@ -0,0 +1,451 @@
1
+ import { clipToCells, sliceToWidth, textCells, textWidth, } from "../../../utils/textWidth.js";
2
+ import { colorize } from "../../runHandler.js";
3
+ /**
4
+ * The model's markdown, drawn for the tree: headings, lists, quotes, code
5
+ * fences, rules and tables, with bold, italic, code and links inline.
6
+ *
7
+ * The block and table handling follows `@ai-sdk/tui`'s renderer
8
+ * (`src/tui/markdown.ts`). It is not exported from that package, and its
9
+ * output assumes it owns the whole width, so it is redone here around the
10
+ * rail: every line comes back already wrapped to `width`, because a line the
11
+ * terminal soft-wraps starts its next row at column zero, outside the tree.
12
+ *
13
+ * Styles are applied word by word rather than across a span. A colour code
14
+ * here ends with a full reset, so a bold phrase that wraps would lose its
15
+ * bold at the rail drawn in between.
16
+ *
17
+ * Exported for tests.
18
+ */
19
+ export function renderMarkdown(text, width, tone = "normal") {
20
+ const lines = text.split("\n");
21
+ const output = [];
22
+ const cursor = { index: 0, inFence: false };
23
+ while (cursor.index < lines.length) {
24
+ const line = lines[cursor.index];
25
+ if (line === undefined) {
26
+ break;
27
+ }
28
+ if (FENCE.test(line) === true) {
29
+ cursor.inFence = cursor.inFence === false;
30
+ cursor.index += 1;
31
+ continue;
32
+ }
33
+ if (cursor.inFence === true) {
34
+ // Code keeps its shape: clipped, never re-flowed, behind a bar that
35
+ // sets it apart from the prose around it.
36
+ output.push(`${paint(CODE_BAR, "url", tone)}${paint(clipToCells(line.replace(/\t/g, " "), width - CODE_BAR.length), "code", tone)}`);
37
+ cursor.index += 1;
38
+ continue;
39
+ }
40
+ const table = parseTable(lines, cursor.index);
41
+ if (table !== undefined) {
42
+ output.push(...renderTable(table, width, tone));
43
+ cursor.index = table.endIndex;
44
+ continue;
45
+ }
46
+ output.push(...renderBlockLine(line, width, tone));
47
+ cursor.index += 1;
48
+ }
49
+ return output;
50
+ }
51
+ const STYLE_CODES = {
52
+ plain: [],
53
+ bold: ["1"],
54
+ italic: ["3"],
55
+ code: ["36"],
56
+ link: ["4"],
57
+ url: ["2"],
58
+ };
59
+ const FENCE = /^\s*(```|~~~)/;
60
+ const HEADING = /^#{1,6}\s+(.*)$/;
61
+ const RULE = /^\s*([-*_])(\s*\1){2,}\s*$/;
62
+ const LIST_ITEM = /^(\s*)([-+*]|\d+[.)])\s+(.*)$/;
63
+ const QUOTE = /^\s*>\s?(.*)$/;
64
+ /**
65
+ * Code, bold, italic and links. `_` only opens italics at a word boundary, so
66
+ * `snake_case_names` stay as written.
67
+ */
68
+ const INLINE = /`([^`]+)`|\*\*(.+?)\*\*|__(.+?)__|(?<![\w*])\*(?![\s*])(.+?)(?<![\s*])\*(?![\w*])|(?<!\w)_(?![\s_])(.+?)(?<![\s_])_(?!\w)|\[([^\]]+)\]\(([^)\s]+)\)/g;
69
+ const TABLE_COLUMN_GAP = " ";
70
+ const CODE_BAR = "▎ ";
71
+ const STACKED_INDENT = " ";
72
+ /** How narrow a table column may be squeezed before it is left to overflow. */
73
+ const MIN_TABLE_COLUMN_WIDTH = 6;
74
+ function renderBlockLine(line, width, tone) {
75
+ if (line.trim() === "") {
76
+ return [""];
77
+ }
78
+ const heading = line.match(HEADING);
79
+ if (heading !== null) {
80
+ const words = parseInline(heading[1] === undefined ? "" : heading[1]);
81
+ return wrapWords(emphasize(words), width).map((row) => renderWords(row, tone));
82
+ }
83
+ if (RULE.test(line) === true) {
84
+ return [paint("─".repeat(Math.min(width, 40)), "url", tone)];
85
+ }
86
+ const item = line.match(LIST_ITEM);
87
+ if (item !== null) {
88
+ const indent = item[1] === undefined ? "" : item[1];
89
+ const marker = item[2] === undefined ? "-" : item[2];
90
+ const body = item[3] === undefined ? "" : item[3];
91
+ const bullet = /\d/.test(marker) === true ? marker : "•";
92
+ return renderHanging(`${indent}${bullet} `, parseInline(body), width, tone);
93
+ }
94
+ const quote = line.match(QUOTE);
95
+ if (quote !== null) {
96
+ const body = quote[1] === undefined ? "" : quote[1];
97
+ return wrapWords(parseInline(body), Math.max(1, width - 2)).map((row) => `${paint("│", "url", tone)} ${renderWords(row, tone)}`);
98
+ }
99
+ return wrapWords(parseInline(line), width).map((row) => renderWords(row, tone));
100
+ }
101
+ /** A list item: the marker on the first row, its width of indent after. */
102
+ function renderHanging(prefix, words, width, tone) {
103
+ const rows = wrapWords(words, Math.max(1, width - textWidth(prefix)));
104
+ if (rows.length === 0) {
105
+ return [prefix.trimEnd()];
106
+ }
107
+ const pad = " ".repeat(prefix.length);
108
+ return rows.map((row, index) => `${index === 0 ? prefix : pad}${renderWords(row, tone)}`);
109
+ }
110
+ function parseInline(text) {
111
+ const pieces = [];
112
+ const cursor = { at: 0 };
113
+ for (const match of text.matchAll(INLINE)) {
114
+ const start = match.index === undefined ? cursor.at : match.index;
115
+ if (start > cursor.at) {
116
+ pieces.push({ text: text.slice(cursor.at, start), style: "plain" });
117
+ }
118
+ pieces.push(...inlineMatchPieces(match));
119
+ cursor.at = start + match[0].length;
120
+ }
121
+ if (cursor.at < text.length) {
122
+ pieces.push({ text: text.slice(cursor.at), style: "plain" });
123
+ }
124
+ return toWords(pieces);
125
+ }
126
+ function inlineMatchPieces(match) {
127
+ const [, code, bold, boldUnderscore, italic, italicUnderscore, label, url] = match;
128
+ if (code !== undefined) {
129
+ return [{ text: code, style: "code" }];
130
+ }
131
+ if (bold !== undefined) {
132
+ return [{ text: bold, style: "bold" }];
133
+ }
134
+ if (boldUnderscore !== undefined) {
135
+ return [{ text: boldUnderscore, style: "bold" }];
136
+ }
137
+ if (italic !== undefined) {
138
+ return [{ text: italic, style: "italic" }];
139
+ }
140
+ if (italicUnderscore !== undefined) {
141
+ return [{ text: italicUnderscore, style: "italic" }];
142
+ }
143
+ if (label !== undefined && url !== undefined) {
144
+ // A bare link is written `[url](url)`; saying it twice adds nothing.
145
+ if (label === url) {
146
+ return [{ text: label, style: "link", href: url }];
147
+ }
148
+ return [
149
+ { text: label, style: "link", href: url },
150
+ { text: ` (${url})`, style: "url" },
151
+ ];
152
+ }
153
+ return [{ text: match[0], style: "plain" }];
154
+ }
155
+ /** Split styled runs on whitespace, gluing runs that touch into one word. */
156
+ function toWords(pieces) {
157
+ const words = [];
158
+ const state = { glued: false };
159
+ for (const piece of pieces) {
160
+ for (const part of piece.text.split(/(\s+)/)) {
161
+ if (part === "") {
162
+ continue;
163
+ }
164
+ if (/^\s+$/.test(part) === true) {
165
+ state.glued = false;
166
+ continue;
167
+ }
168
+ const last = words[words.length - 1];
169
+ if (state.glued === true && last !== undefined) {
170
+ last.push({ ...piece, text: part });
171
+ }
172
+ else {
173
+ words.push([{ ...piece, text: part }]);
174
+ }
175
+ state.glued = true;
176
+ }
177
+ }
178
+ return words;
179
+ }
180
+ /** Headings and table headers: everything plain becomes bold. */
181
+ function emphasize(words) {
182
+ return words.map((word) => word.map((piece) => piece.style === "plain" ? { ...piece, style: "bold" } : piece));
183
+ }
184
+ function wordWidth(word) {
185
+ return word.reduce((total, piece) => total + textWidth(piece.text), 0);
186
+ }
187
+ function rowWidth(row) {
188
+ if (row.length === 0) {
189
+ return 0;
190
+ }
191
+ return (row.reduce((total, word) => total + wordWidth(word), 0) + row.length - 1);
192
+ }
193
+ /**
194
+ * Greedy wrap on spaces. A word wider than the line is cut, unlike the plain
195
+ * wrap in `tree.ts`: a table cell or a long URL left whole would overflow,
196
+ * and the terminal would wrap it off the rail.
197
+ */
198
+ function wrapWords(words, width) {
199
+ const rows = [];
200
+ for (const word of words.flatMap((entry) => splitWord(entry, width))) {
201
+ const current = rows[rows.length - 1];
202
+ if (current === undefined ||
203
+ rowWidth(current) + 1 + wordWidth(word) > width) {
204
+ rows.push([word]);
205
+ continue;
206
+ }
207
+ current.push(word);
208
+ }
209
+ return rows;
210
+ }
211
+ function splitWord(word, width) {
212
+ if (wordWidth(word) <= width) {
213
+ return [word];
214
+ }
215
+ const chunks = [[]];
216
+ for (const piece of word) {
217
+ const remaining = { text: piece.text };
218
+ while (remaining.text.length > 0) {
219
+ const chunk = chunks[chunks.length - 1];
220
+ if (chunk === undefined) {
221
+ break;
222
+ }
223
+ const room = width - wordWidth(chunk);
224
+ if (room <= 0 && chunk.length > 0) {
225
+ chunks.push([]);
226
+ continue;
227
+ }
228
+ const fits = sliceToWidth(remaining.text, room);
229
+ // A two-column character with one column left: start the next row,
230
+ // unless this row is empty and the line is narrower than the character.
231
+ if (fits === "" && chunk.length > 0) {
232
+ chunks.push([]);
233
+ continue;
234
+ }
235
+ const taken = fits === "" ? textCells(remaining.text)[0] : fits;
236
+ if (taken === undefined) {
237
+ break;
238
+ }
239
+ chunk.push({ ...piece, text: taken });
240
+ remaining.text = remaining.text.slice(taken.length);
241
+ }
242
+ }
243
+ return chunks.filter((chunk) => chunk.length > 0);
244
+ }
245
+ function renderWords(row, tone) {
246
+ return row
247
+ .map((word) => word
248
+ .map((piece) => hyperlink(paint(piece.text, piece.style, tone), piece))
249
+ .join(""))
250
+ .join(" ");
251
+ }
252
+ /**
253
+ * OSC 8: the terminal shows `text` and opens `href` when it is clicked. Each
254
+ * word of a link is wrapped on its own, like its colour, so a link that wraps
255
+ * onto the next row stays clickable on both. Terminals without OSC 8 ignore
256
+ * the sequence, and the URL printed after the label still shows where it
257
+ * goes. Left out when stderr is not a terminal, along with the colours.
258
+ */
259
+ function hyperlink(text, piece) {
260
+ if (piece.href === undefined || process.stderr.isTTY !== true) {
261
+ return text;
262
+ }
263
+ return `\x1B]8;;${piece.href}\x1B\\${text}\x1B]8;;\x1B\\`;
264
+ }
265
+ function paint(text, style, tone) {
266
+ const codes = tone === "dim" ? ["2", ...STYLE_CODES[style]] : STYLE_CODES[style];
267
+ if (codes.length === 0) {
268
+ return text;
269
+ }
270
+ return colorize(text, codes.join(";"));
271
+ }
272
+ function parseTable(lines, startIndex) {
273
+ const headerLine = lines[startIndex];
274
+ const separatorLine = lines[startIndex + 1];
275
+ if (headerLine === undefined || separatorLine === undefined) {
276
+ return undefined;
277
+ }
278
+ const header = parseTableCells(headerLine);
279
+ if (header === undefined || header.length < 2) {
280
+ return undefined;
281
+ }
282
+ const separator = parseTableCells(separatorLine);
283
+ if (separator === undefined || separator.length !== header.length) {
284
+ return undefined;
285
+ }
286
+ const alignments = parseTableAlignments(separator);
287
+ if (alignments === undefined) {
288
+ return undefined;
289
+ }
290
+ const rows = [];
291
+ const cursor = { index: startIndex + 2 };
292
+ while (cursor.index < lines.length) {
293
+ const line = lines[cursor.index];
294
+ const row = line === undefined ? undefined : parseTableCells(line);
295
+ if (row === undefined) {
296
+ break;
297
+ }
298
+ rows.push(Array.from({ length: header.length }, (_, index) => {
299
+ const cell = row[index];
300
+ return cell === undefined ? "" : cell;
301
+ }));
302
+ cursor.index += 1;
303
+ }
304
+ return { alignments, endIndex: cursor.index, header, rows };
305
+ }
306
+ function parseTableCells(line) {
307
+ const trimmed = line.trim();
308
+ if (trimmed.includes("|") === false) {
309
+ return undefined;
310
+ }
311
+ const inner = trimmed.replace(/^\|/, "").replace(/(?<!\\)\|$/, "");
312
+ const cells = [""];
313
+ for (let index = 0; index < inner.length; index += 1) {
314
+ const character = inner[index];
315
+ if (character === "\\" && inner[index + 1] === "|") {
316
+ cells[cells.length - 1] += "|";
317
+ index += 1;
318
+ continue;
319
+ }
320
+ if (character === "|") {
321
+ cells.push("");
322
+ continue;
323
+ }
324
+ cells[cells.length - 1] += character === undefined ? "" : character;
325
+ }
326
+ return cells.map((cell) => cell.trim());
327
+ }
328
+ function parseTableAlignments(cells) {
329
+ const alignments = [];
330
+ for (const cell of cells) {
331
+ const match = cell.match(/^(:)?-{3,}(:)?$/);
332
+ if (match === null) {
333
+ return undefined;
334
+ }
335
+ const [, left, right] = match;
336
+ if (left !== undefined && right !== undefined) {
337
+ alignments.push("center");
338
+ }
339
+ else if (right !== undefined) {
340
+ alignments.push("right");
341
+ }
342
+ else {
343
+ alignments.push("left");
344
+ }
345
+ }
346
+ return alignments;
347
+ }
348
+ /**
349
+ * Columns sized to their content, then the widest squeezed until the table
350
+ * fits beside the rail; a cell that no longer fits wraps inside its column.
351
+ */
352
+ function renderTable(table, width, tone) {
353
+ const header = table.header.map((cell) => emphasize(parseInline(cell)));
354
+ const rows = table.rows.map((row) => row.map((cell) => parseInline(cell)));
355
+ const widths = fitColumns(table.alignments.map((_, column) => Math.max(3, ...[header, ...rows].map((row) => {
356
+ const cell = row[column];
357
+ return cell === undefined ? 0 : rowWidth(cell);
358
+ }))), width);
359
+ const tableWidth = widths.reduce((total, columnWidth) => total + columnWidth, 0) +
360
+ TABLE_COLUMN_GAP.length * (widths.length - 1);
361
+ // Too many columns to fit even squeezed: the terminal would wrap every row
362
+ // off the rail. One record per row reads better than six-column slivers.
363
+ if (tableWidth > width) {
364
+ return renderStackedTable(header, rows, width, tone);
365
+ }
366
+ return [
367
+ ...renderTableRow(header, widths, table.alignments, tone),
368
+ paint(widths
369
+ .map((columnWidth) => "─".repeat(columnWidth))
370
+ .join(TABLE_COLUMN_GAP), "url", tone),
371
+ ...rows.flatMap((row) => renderTableRow(row, widths, table.alignments, tone)),
372
+ ];
373
+ }
374
+ /**
375
+ * A table too wide for the screen, as one block per row:
376
+ *
377
+ * Name: Acme
378
+ * Industry: Software
379
+ *
380
+ * Name: Globex
381
+ * …
382
+ *
383
+ * Each field wraps with its continuation indented under the header.
384
+ */
385
+ function renderStackedTable(header, rows, width, tone) {
386
+ // Only the header so far, mid-stream or for good: show the field names
387
+ // rather than nothing.
388
+ if (rows.length === 0) {
389
+ return wrapWords(header.flatMap((label, column) => column < header.length - 1 ? appendText(label, ",") : label), width).map((line) => renderWords(line, tone));
390
+ }
391
+ return rows.flatMap((row, index) => {
392
+ const fields = header.flatMap((label, column) => {
393
+ const cell = row[column];
394
+ if (cell === undefined || cell.length === 0) {
395
+ return [];
396
+ }
397
+ return wrapWords([...appendText(label, ":"), ...cell], Math.max(1, width - STACKED_INDENT.length)).map((line, at) => at === 0
398
+ ? renderWords(line, tone)
399
+ : `${STACKED_INDENT}${renderWords(line, tone)}`);
400
+ });
401
+ return index === 0 ? fields : ["", ...fields];
402
+ });
403
+ }
404
+ /** `Name` → `Name:`, the mark glued to the header's last word. */
405
+ function appendText(label, mark) {
406
+ const last = label[label.length - 1];
407
+ if (last === undefined) {
408
+ return [];
409
+ }
410
+ return [...label.slice(0, -1), [...last, { text: mark, style: "bold" }]];
411
+ }
412
+ function fitColumns(natural, width) {
413
+ const widths = [...natural];
414
+ const available = width - TABLE_COLUMN_GAP.length * (widths.length - 1);
415
+ while (widths.reduce((total, columnWidth) => total + columnWidth, 0) > available) {
416
+ const widest = Math.max(...widths);
417
+ if (widest <= MIN_TABLE_COLUMN_WIDTH) {
418
+ break;
419
+ }
420
+ widths[widths.indexOf(widest)] = widest - 1;
421
+ }
422
+ return widths;
423
+ }
424
+ function renderTableRow(cells, widths, alignments, tone) {
425
+ const wrapped = widths.map((columnWidth, column) => {
426
+ const cell = cells[column];
427
+ return wrapWords(cell === undefined ? [] : cell, columnWidth);
428
+ });
429
+ const height = Math.max(1, ...wrapped.map((lines) => lines.length));
430
+ return Array.from({ length: height }, (_, line) => widths
431
+ .map((columnWidth, column) => {
432
+ const columnLines = wrapped[column];
433
+ const row = columnLines === undefined ? undefined : columnLines[line];
434
+ const alignment = alignments[column];
435
+ return alignCell(row === undefined ? [] : row, columnWidth, alignment === undefined ? "left" : alignment, tone);
436
+ })
437
+ .join(TABLE_COLUMN_GAP)
438
+ .trimEnd());
439
+ }
440
+ function alignCell(row, width, alignment, tone) {
441
+ const text = renderWords(row, tone);
442
+ const padding = Math.max(0, width - rowWidth(row));
443
+ if (alignment === "right") {
444
+ return `${" ".repeat(padding)}${text}`;
445
+ }
446
+ if (alignment === "center") {
447
+ const left = Math.floor(padding / 2);
448
+ return `${" ".repeat(left)}${text}${" ".repeat(padding - left)}`;
449
+ }
450
+ return `${text}${" ".repeat(padding)}`;
451
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../src/commands/ask/session/run.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAoD3C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,GAAG,CAAC;IACT,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAkHF;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAqBlB;AAyND;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,CAsmB7B;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE;IACvC,GAAG,EAAE,GAAG,CAAC;IACT,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGhB"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../src/commands/ask/session/run.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAkE3C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,GAAG,CAAC;IACT,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAwHF;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAqBlB;AAyND;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,CA0zB7B;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE;IACvC,GAAG,EAAE,GAAG,CAAC;IACT,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGhB"}