agent-nuvira 3.5.1 → 3.5.2

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 (108) hide show
  1. package/dist/cli/chat.d.ts +42 -0
  2. package/dist/cli/chat.d.ts.map +1 -1
  3. package/dist/cli/chat.js +240 -16
  4. package/dist/cli/chat.js.map +1 -1
  5. package/dist/cli/edit.d.ts.map +1 -1
  6. package/dist/cli/edit.js +3 -2
  7. package/dist/cli/edit.js.map +1 -1
  8. package/dist/cli/execute.d.ts.map +1 -1
  9. package/dist/cli/execute.js +10 -3
  10. package/dist/cli/execute.js.map +1 -1
  11. package/dist/cli/loop-executor.d.ts +16 -0
  12. package/dist/cli/loop-executor.d.ts.map +1 -1
  13. package/dist/cli/loop-executor.js +9 -0
  14. package/dist/cli/loop-executor.js.map +1 -1
  15. package/dist/cli/plan.d.ts.map +1 -1
  16. package/dist/cli/plan.js +18 -6
  17. package/dist/cli/plan.js.map +1 -1
  18. package/dist/cli/run.d.ts.map +1 -1
  19. package/dist/cli/run.js +23 -8
  20. package/dist/cli/run.js.map +1 -1
  21. package/dist/cli/ui/answer-view.d.ts +38 -0
  22. package/dist/cli/ui/answer-view.d.ts.map +1 -0
  23. package/dist/cli/ui/answer-view.js +72 -0
  24. package/dist/cli/ui/answer-view.js.map +1 -0
  25. package/dist/cli/ui/cards.d.ts +61 -0
  26. package/dist/cli/ui/cards.d.ts.map +1 -0
  27. package/dist/cli/ui/cards.js +141 -0
  28. package/dist/cli/ui/cards.js.map +1 -0
  29. package/dist/cli/ui/highlight.d.ts +32 -0
  30. package/dist/cli/ui/highlight.d.ts.map +1 -0
  31. package/dist/cli/ui/highlight.js +261 -0
  32. package/dist/cli/ui/highlight.js.map +1 -0
  33. package/dist/cli/ui/index.d.ts +21 -0
  34. package/dist/cli/ui/index.d.ts.map +1 -0
  35. package/dist/cli/ui/index.js +14 -0
  36. package/dist/cli/ui/index.js.map +1 -0
  37. package/dist/cli/ui/markdown.d.ts +90 -0
  38. package/dist/cli/ui/markdown.d.ts.map +1 -0
  39. package/dist/cli/ui/markdown.js +292 -0
  40. package/dist/cli/ui/markdown.js.map +1 -0
  41. package/dist/cli/ui/presenter.d.ts +147 -0
  42. package/dist/cli/ui/presenter.d.ts.map +1 -0
  43. package/dist/cli/ui/presenter.js +313 -0
  44. package/dist/cli/ui/presenter.js.map +1 -0
  45. package/dist/cli/ui/render.d.ts +52 -0
  46. package/dist/cli/ui/render.d.ts.map +1 -0
  47. package/dist/cli/ui/render.js +384 -0
  48. package/dist/cli/ui/render.js.map +1 -0
  49. package/dist/cli/ui/theme.d.ts +36 -0
  50. package/dist/cli/ui/theme.d.ts.map +1 -0
  51. package/dist/cli/ui/theme.js +92 -0
  52. package/dist/cli/ui/theme.js.map +1 -0
  53. package/dist/inference/model-entitlement.d.ts +10 -0
  54. package/dist/inference/model-entitlement.d.ts.map +1 -1
  55. package/dist/inference/model-entitlement.js +1 -1
  56. package/dist/inference/model-entitlement.js.map +1 -1
  57. package/dist/learning/auto-router.d.ts +10 -1
  58. package/dist/learning/auto-router.d.ts.map +1 -1
  59. package/dist/learning/auto-router.js +63 -11
  60. package/dist/learning/auto-router.js.map +1 -1
  61. package/dist/learning/reasoning-trace.d.ts +21 -1
  62. package/dist/learning/reasoning-trace.d.ts.map +1 -1
  63. package/dist/learning/reasoning-trace.js.map +1 -1
  64. package/dist/learning/resilient-call.d.ts.map +1 -1
  65. package/dist/learning/resilient-call.js +70 -4
  66. package/dist/learning/resilient-call.js.map +1 -1
  67. package/dist/tools/process-liveness.d.ts +227 -0
  68. package/dist/tools/process-liveness.d.ts.map +1 -0
  69. package/dist/tools/process-liveness.js +486 -0
  70. package/dist/tools/process-liveness.js.map +1 -0
  71. package/dist/tools/registry.d.ts.map +1 -1
  72. package/dist/tools/registry.js +4 -2
  73. package/dist/tools/registry.js.map +1 -1
  74. package/dist/tools/run-registry.d.ts +282 -0
  75. package/dist/tools/run-registry.d.ts.map +1 -0
  76. package/dist/tools/run-registry.js +544 -0
  77. package/dist/tools/run-registry.js.map +1 -0
  78. package/dist/tools/run-terminal.d.ts +100 -2
  79. package/dist/tools/run-terminal.d.ts.map +1 -1
  80. package/dist/tools/run-terminal.js +841 -67
  81. package/dist/tools/run-terminal.js.map +1 -1
  82. package/dist/tools/tool-loop.d.ts +46 -0
  83. package/dist/tools/tool-loop.d.ts.map +1 -1
  84. package/dist/tools/tool-loop.js +115 -2
  85. package/dist/tools/tool-loop.js.map +1 -1
  86. package/dist/web-dashboard/chat-console.d.ts +25 -0
  87. package/dist/web-dashboard/chat-console.d.ts.map +1 -1
  88. package/dist/web-dashboard/chat-console.js +16 -1
  89. package/dist/web-dashboard/chat-console.js.map +1 -1
  90. package/dist/web-dashboard/server.d.ts.map +1 -1
  91. package/dist/web-dashboard/server.js +7 -1
  92. package/dist/web-dashboard/server.js.map +1 -1
  93. package/dist/web-dashboard/src/types.d.ts +32 -1
  94. package/dist/web-dashboard/src/types.d.ts.map +1 -1
  95. package/dist/web-dashboard/task-registry.d.ts +98 -0
  96. package/dist/web-dashboard/task-registry.d.ts.map +1 -0
  97. package/dist/web-dashboard/task-registry.js +159 -0
  98. package/dist/web-dashboard/task-registry.js.map +1 -0
  99. package/dist/web-dashboard/task-runner.d.ts +155 -5
  100. package/dist/web-dashboard/task-runner.d.ts.map +1 -1
  101. package/dist/web-dashboard/task-runner.js +505 -14
  102. package/dist/web-dashboard/task-runner.js.map +1 -1
  103. package/package.json +1 -1
  104. package/src/web-dashboard/public/assets/index-DycGBWwy.js +236 -0
  105. package/src/web-dashboard/public/assets/index-DycGBWwy.js.map +1 -0
  106. package/src/web-dashboard/public/index.html +1 -1
  107. package/src/web-dashboard/public/assets/index-Bik91KJh.js +0 -236
  108. package/src/web-dashboard/public/assets/index-Bik91KJh.js.map +0 -1
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Card builders — one pure function per event family.
3
+ *
4
+ * Cards are how a turn SHOWS what it did instead of only saying it: a tool call,
5
+ * a shell command and a git diff each become a bordered block the user can read
6
+ * at a glance. Keeping the mapping pure (event → `CardOptions`) means the card
7
+ * content is unit-testable without a terminal, and both surfaces — chat and
8
+ * execute — render the SAME card for the same event, so they cannot drift.
9
+ *
10
+ * These functions only shape data; the rendering (borders, colour, width) lives
11
+ * in `render.ts` / `answer-view.tsx`.
12
+ */
13
+ import { EventNames, getEventBus } from '../../observability/event-bus.js';
14
+ /** How many arguments to preview on a tool card before summarising the rest. */
15
+ const MAX_ARG_PREVIEWS = 3;
16
+ /** Bounds so a huge diff or argument list cannot flood the transcript. */
17
+ const MAX_DIFF_FILES = 4;
18
+ const MAX_DIFF_LINES_PER_FILE = 12;
19
+ const MAX_DETAIL_CHARS = 72;
20
+ /** Compact duration: `840ms`, `3.2s`, `1m 04s`. */
21
+ export function formatDuration(ms) {
22
+ if (!Number.isFinite(ms) || ms < 0)
23
+ return '?';
24
+ if (ms < 1000)
25
+ return `${Math.round(ms)}ms`;
26
+ const s = ms / 1000;
27
+ if (s < 60)
28
+ return `${s.toFixed(1)}s`;
29
+ const m = Math.floor(s / 60);
30
+ const rest = Math.round(s - m * 60);
31
+ return `${m}m ${String(rest).padStart(2, '0')}s`;
32
+ }
33
+ /** One-line, bounded preview of a value — never the whole multi-line blob. */
34
+ function clip(text, max = MAX_DETAIL_CHARS) {
35
+ const first = text.replace(/\s+/g, ' ').trim();
36
+ return first.length > max ? first.slice(0, max - 1) + '…' : first;
37
+ }
38
+ function previewArgs(args) {
39
+ if (!args)
40
+ return [];
41
+ const entries = Object.entries(args).filter(([, v]) => v !== undefined && v !== null);
42
+ return entries.slice(0, MAX_ARG_PREVIEWS).map(([k, v]) => ({
43
+ text: `${k}: ${clip(typeof v === 'string' ? v : JSON.stringify(v))}`,
44
+ role: 'muted',
45
+ }));
46
+ }
47
+ /**
48
+ * A tool call. Rendered on COMPLETION (the `called` phase), because only then is
49
+ * the outcome known — a card that says "running" and is immediately replaced by
50
+ * an outcome is noise in a transcript.
51
+ */
52
+ export function toolCallCard(info) {
53
+ const ok = info.ok !== false;
54
+ const lines = [...previewArgs(info.args)];
55
+ const detail = info.error || info.result;
56
+ if (detail)
57
+ lines.push({ text: clip(detail), role: ok ? 'muted' : 'error' });
58
+ const ms = typeof info.durationMs === 'number' ? ` · ${formatDuration(info.durationMs)}` : '';
59
+ return {
60
+ icon: ok ? '🔧' : '⛔',
61
+ title: `tool · ${info.tool}${ms}`,
62
+ role: ok ? 'info' : 'error',
63
+ lines,
64
+ };
65
+ }
66
+ /** A finished shell command, with the failure reason when there is one. */
67
+ export function shellCard(payload) {
68
+ const ok = payload.success ?? payload.exitCode === 0;
69
+ const lines = [{ text: `$ ${clip(payload.command, 100)}`, role: 'muted' }];
70
+ if (!ok) {
71
+ const why = (payload.stderr || payload.stdout || '').trim();
72
+ if (why)
73
+ lines.push({ text: clip(why), role: 'error' });
74
+ else if (payload.timedOut)
75
+ lines.push({ text: 'timed out', role: 'error' });
76
+ else if (payload.aborted)
77
+ lines.push({ text: 'aborted', role: 'error' });
78
+ }
79
+ const bits = [`exit ${payload.exitCode ?? (ok ? 0 : '?')}`];
80
+ if (typeof payload.durationMs === 'number')
81
+ bits.push(formatDuration(payload.durationMs));
82
+ return {
83
+ icon: ok ? '💻' : '💥',
84
+ title: `shell · ${bits.join(' · ')}`,
85
+ role: ok ? 'info' : 'error',
86
+ lines,
87
+ };
88
+ }
89
+ /** Colour role for one line of a unified diff. */
90
+ export function diffLineRole(line) {
91
+ if (line.startsWith('@@'))
92
+ return 'diffHunk';
93
+ if (line.startsWith('+++') || line.startsWith('---'))
94
+ return 'muted';
95
+ if (line.startsWith('+'))
96
+ return 'diffAdd';
97
+ if (line.startsWith('-'))
98
+ return 'diffDel';
99
+ return 'muted';
100
+ }
101
+ /** A `git diff`, one block per changed file, lines coloured by kind. */
102
+ export function gitDiffCard(payload) {
103
+ const lines = [];
104
+ for (const file of payload.files.slice(0, MAX_DIFF_FILES)) {
105
+ lines.push({ text: file.path, role: 'accent' });
106
+ const body = file.body.split('\n');
107
+ for (const l of body.slice(0, MAX_DIFF_LINES_PER_FILE)) {
108
+ lines.push({ text: ` ${l}`, role: diffLineRole(l) });
109
+ }
110
+ if (body.length > MAX_DIFF_LINES_PER_FILE) {
111
+ lines.push({ text: ` … ${body.length - MAX_DIFF_LINES_PER_FILE} more line(s)`, role: 'faint' });
112
+ }
113
+ }
114
+ const more = payload.files.length > MAX_DIFF_FILES ? ` (+${payload.files.length - MAX_DIFF_FILES} more file(s))` : '';
115
+ return { icon: '📝', title: `git diff · ${payload.summary}${more}`, role: 'accent', lines };
116
+ }
117
+ /**
118
+ * Subscribe to shell completion events for the duration of one turn.
119
+ *
120
+ * Shell is the one event family driven by the GLOBAL bus rather than a turn
121
+ * callback: `runShell` emits it from deep inside `utils/shell.ts`, which no
122
+ * surface owns. Returns the unsubscribe function the caller must invoke (the
123
+ * turn's `stop()` does).
124
+ */
125
+ export function attachShellCards(onCard, bus) {
126
+ try {
127
+ const source = bus ?? getEventBus();
128
+ return source.on(EventNames.EXEC_SHELL_END, (record) => {
129
+ try {
130
+ onCard(shellCard(record.data));
131
+ }
132
+ catch {
133
+ // A card must never break the turn.
134
+ }
135
+ });
136
+ }
137
+ catch {
138
+ return () => { };
139
+ }
140
+ }
141
+ //# sourceMappingURL=cards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cards.js","sourceRoot":"","sources":["../../../src/cli/ui/cards.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Syntax highlighting — a small, dependency-free, line-based tokenizer.
3
+ *
4
+ * WHY NOT A LIBRARY. The codebase deliberately keeps a small runtime dependency
5
+ * footprint, and the CLI only needs to colour the ~10 languages that appear in
6
+ * model answers (ts/js, json, shell, python, go, rust, sql, yaml, css). A full
7
+ * TextMate/Shiki grammar is orders of magnitude heavier than that job. This
8
+ * tokenizer is heuristic by design: it never needs to be *correct*, only to make
9
+ * code readable, and every rule is a pure function with a unit test.
10
+ *
11
+ * The output is a per-line, per-token structure of `{ text, kind }`. Both the
12
+ * ANSI renderer and the Ink view map `kind` through the shared theme, so code
13
+ * colouring is identical on both surfaces.
14
+ */
15
+ export type TokenKind = 'plain' | 'keyword' | 'boolean' | 'string' | 'number' | 'comment' | 'func' | 'type' | 'punct' | 'operator';
16
+ export interface Token {
17
+ text: string;
18
+ kind: TokenKind;
19
+ }
20
+ /** Per-line token stream. */
21
+ export type TokenizedCode = Token[][];
22
+ /** Map many aliases to the canonical language key used by {@link highlightCode}. */
23
+ export declare function normalizeLang(raw: string): string;
24
+ /**
25
+ * Highlight a code block into per-line tokens.
26
+ *
27
+ * Block comments (`/​* ... *​/`) and backtick template literals are tracked across
28
+ * lines through {@link LineState}, so a multi-line comment is coloured as a
29
+ * comment on every line rather than only the first.
30
+ */
31
+ export declare function highlightCode(code: string, lang: string): TokenizedCode;
32
+ //# sourceMappingURL=highlight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/highlight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,SAAS,GACT,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,MAAM,GACN,OAAO,GACP,UAAU,CAAC;AAEf,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,6BAA6B;AAC7B,MAAM,MAAM,aAAa,GAAG,KAAK,EAAE,EAAE,CAAC;AA+CtC,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAcjD;AAwBD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAUvE"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Syntax highlighting — a small, dependency-free, line-based tokenizer.
3
+ *
4
+ * WHY NOT A LIBRARY. The codebase deliberately keeps a small runtime dependency
5
+ * footprint, and the CLI only needs to colour the ~10 languages that appear in
6
+ * model answers (ts/js, json, shell, python, go, rust, sql, yaml, css). A full
7
+ * TextMate/Shiki grammar is orders of magnitude heavier than that job. This
8
+ * tokenizer is heuristic by design: it never needs to be *correct*, only to make
9
+ * code readable, and every rule is a pure function with a unit test.
10
+ *
11
+ * The output is a per-line, per-token structure of `{ text, kind }`. Both the
12
+ * ANSI renderer and the Ink view map `kind` through the shared theme, so code
13
+ * colouring is identical on both surfaces.
14
+ */
15
+ const KEYWORDS = {
16
+ js: [
17
+ 'as', 'async', 'await', 'break', 'case', 'catch', 'class', 'const', 'continue', 'default',
18
+ 'delete', 'do', 'else', 'enum', 'export', 'extends', 'finally', 'for', 'from', 'function',
19
+ 'get', 'if', 'implements', 'import', 'in', 'instanceof', 'interface', 'let', 'new', 'of',
20
+ 'package', 'private', 'protected', 'public', 'readonly', 'return', 'set', 'static', 'super',
21
+ 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void', 'while', 'with', 'yield',
22
+ 'type', 'namespace', 'declare', 'abstract', 'satisfies', 'keyof', 'infer',
23
+ ],
24
+ python: [
25
+ 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif',
26
+ 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda',
27
+ 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield',
28
+ ],
29
+ shell: [
30
+ 'case', 'do', 'done', 'elif', 'else', 'esac', 'fi', 'for', 'function', 'if', 'in', 'select',
31
+ 'then', 'until', 'while', 'export', 'local', 'return', 'source', 'echo',
32
+ ],
33
+ go: [
34
+ 'break', 'case', 'chan', 'const', 'continue', 'default', 'defer', 'else', 'fallthrough',
35
+ 'for', 'func', 'go', 'goto', 'if', 'import', 'interface', 'map', 'package', 'range',
36
+ 'return', 'select', 'struct', 'switch', 'type', 'var',
37
+ ],
38
+ rust: [
39
+ 'as', 'async', 'await', 'break', 'const', 'continue', 'crate', 'dyn', 'else', 'enum', 'extern',
40
+ 'false', 'fn', 'for', 'if', 'impl', 'in', 'let', 'loop', 'match', 'mod', 'move', 'mut', 'pub',
41
+ 'ref', 'return', 'self', 'Self', 'static', 'struct', 'super', 'trait', 'true', 'type',
42
+ 'unsafe', 'use', 'where', 'while',
43
+ ],
44
+ sql: [
45
+ 'select', 'from', 'where', 'insert', 'into', 'values', 'update', 'set', 'delete', 'create',
46
+ 'table', 'alter', 'drop', 'join', 'inner', 'left', 'right', 'outer', 'on', 'group', 'by',
47
+ 'order', 'having', 'limit', 'offset', 'as', 'and', 'or', 'not', 'null', 'distinct', 'union',
48
+ 'primary', 'key', 'foreign', 'references', 'index',
49
+ ],
50
+ css: ['important', 'media', 'keyframes', 'supports', 'import', 'from', 'to', 'and', 'not'],
51
+ };
52
+ const LITERALS = new Set([
53
+ 'true', 'false', 'null', 'undefined', 'nil', 'None', 'True', 'False', 'NULL', 'NaN', 'Infinity',
54
+ ]);
55
+ const HASH_COMMENT_LANGS = new Set(['python', 'shell', 'yaml', 'ruby', 'toml', 'make']);
56
+ const DASH_COMMENT_LANGS = new Set(['sql']);
57
+ /** Map many aliases to the canonical language key used by {@link highlightCode}. */
58
+ export function normalizeLang(raw) {
59
+ const l = (raw || '').trim().toLowerCase();
60
+ if (!l)
61
+ return 'plain';
62
+ if (['ts', 'tsx', 'typescript', 'mts', 'cts'].includes(l))
63
+ return 'js';
64
+ if (['js', 'jsx', 'javascript', 'mjs', 'cjs', 'node'].includes(l))
65
+ return 'js';
66
+ if (['py', 'python3'].includes(l))
67
+ return 'python';
68
+ if (['sh', 'bash', 'zsh', 'shell', 'console', 'shellsession'].includes(l))
69
+ return 'shell';
70
+ if (['json', 'jsonc'].includes(l))
71
+ return 'json';
72
+ if (['golang'].includes(l))
73
+ return 'go';
74
+ if (['rs'].includes(l))
75
+ return 'rust';
76
+ if (['yml'].includes(l))
77
+ return 'yaml';
78
+ if (['postgres', 'postgresql', 'mysql', 'sqlite'].includes(l))
79
+ return 'sql';
80
+ if (KEYWORDS[l])
81
+ return l;
82
+ return 'plain';
83
+ }
84
+ function isIdentStart(ch) {
85
+ return /[A-Za-z_$]/.test(ch);
86
+ }
87
+ function isIdentPart(ch) {
88
+ return /[A-Za-z0-9_$]/.test(ch);
89
+ }
90
+ function isDigit(ch) {
91
+ return ch >= '0' && ch <= '9';
92
+ }
93
+ /** Is this language one where `/` starts a regex rather than division? */
94
+ function slashStartsComment(lang) {
95
+ return !DASH_COMMENT_LANGS.has(lang) && lang !== 'python' && lang !== 'shell';
96
+ }
97
+ /**
98
+ * Highlight a code block into per-line tokens.
99
+ *
100
+ * Block comments (`/​* ... *​/`) and backtick template literals are tracked across
101
+ * lines through {@link LineState}, so a multi-line comment is coloured as a
102
+ * comment on every line rather than only the first.
103
+ */
104
+ export function highlightCode(code, lang) {
105
+ const language = normalizeLang(lang);
106
+ const keywords = new Set(KEYWORDS[language] ?? []);
107
+ const hashComment = HASH_COMMENT_LANGS.has(language);
108
+ const dashComment = DASH_COMMENT_LANGS.has(language);
109
+ const supportsSlash = slashStartsComment(language);
110
+ const lines = code.replace(/\r\n/g, '\n').replace(/\r/g, '\n').split('\n');
111
+ const state = { blockComment: false, template: false };
112
+ return lines.map((line) => tokenizeLine(line, { language, keywords, hashComment, dashComment, supportsSlash, state }));
113
+ }
114
+ function tokenizeLine(line, ctx) {
115
+ const out = [];
116
+ let i = 0;
117
+ const push = (text, kind) => {
118
+ if (!text)
119
+ return;
120
+ const last = out[out.length - 1];
121
+ if (last && last.kind === kind)
122
+ last.text += text;
123
+ else
124
+ out.push({ text, kind });
125
+ };
126
+ // Continue a block comment / template string from the previous line.
127
+ if (ctx.state.blockComment) {
128
+ const end = line.indexOf('*/');
129
+ if (end === -1) {
130
+ push(line, 'comment');
131
+ return out;
132
+ }
133
+ push(line.slice(0, end + 2), 'comment');
134
+ ctx.state.blockComment = false;
135
+ i = end + 2;
136
+ }
137
+ if (ctx.state.template) {
138
+ const end = findUnescaped(line, i, '`');
139
+ if (end === -1) {
140
+ push(line.slice(i), 'string');
141
+ return out;
142
+ }
143
+ push(line.slice(i, end + 1), 'string');
144
+ ctx.state.template = false;
145
+ i = end + 1;
146
+ }
147
+ const n = line.length;
148
+ while (i < n) {
149
+ const ch = line[i];
150
+ const rest = line.slice(i);
151
+ // ── Comments ──────────────────────────────────────────────────────
152
+ if (ctx.supportsSlash && rest.startsWith('//')) {
153
+ push(line.slice(i), 'comment');
154
+ break;
155
+ }
156
+ if (ctx.supportsSlash && rest.startsWith('/*')) {
157
+ const end = line.indexOf('*/', i + 2);
158
+ if (end === -1) {
159
+ push(line.slice(i), 'comment');
160
+ ctx.state.blockComment = true;
161
+ break;
162
+ }
163
+ push(line.slice(i, end + 2), 'comment');
164
+ i = end + 2;
165
+ continue;
166
+ }
167
+ if (ctx.hashComment && ch === '#') {
168
+ push(line.slice(i), 'comment');
169
+ break;
170
+ }
171
+ if (ctx.dashComment && rest.startsWith('--')) {
172
+ push(line.slice(i), 'comment');
173
+ break;
174
+ }
175
+ // ── Strings ───────────────────────────────────────────────────────
176
+ if (ch === '"' || ch === "'") {
177
+ const end = findUnescaped(line, i + 1, ch);
178
+ if (end === -1) {
179
+ push(line.slice(i), 'string');
180
+ break;
181
+ }
182
+ push(line.slice(i, end + 1), 'string');
183
+ i = end + 1;
184
+ continue;
185
+ }
186
+ if (ch === '`' && ctx.language === 'js') {
187
+ const end = findUnescaped(line, i + 1, '`');
188
+ if (end === -1) {
189
+ push(line.slice(i), 'string');
190
+ ctx.state.template = true;
191
+ break;
192
+ }
193
+ push(line.slice(i, end + 1), 'string');
194
+ i = end + 1;
195
+ continue;
196
+ }
197
+ // ── Numbers ───────────────────────────────────────────────────────
198
+ if (isDigit(ch) || (ch === '.' && isDigit(line[i + 1] ?? ''))) {
199
+ let j = i;
200
+ while (j < n && /[0-9a-fA-FxXoObB._]/.test(line[j]))
201
+ j++;
202
+ push(line.slice(i, j), 'number');
203
+ i = j;
204
+ continue;
205
+ }
206
+ // ── Identifiers ───────────────────────────────────────────────────
207
+ if (isIdentStart(ch)) {
208
+ let j = i;
209
+ while (j < n && isIdentPart(line[j]))
210
+ j++;
211
+ const word = line.slice(i, j);
212
+ let kind = 'plain';
213
+ if (LITERALS.has(word))
214
+ kind = 'boolean';
215
+ else if (ctx.keywords.has(word))
216
+ kind = 'keyword';
217
+ else if (word === word.toUpperCase() && word.length > 1 && /^[A-Z0-9_]+$/.test(word))
218
+ kind = 'type';
219
+ else if (line[j] === '(')
220
+ kind = 'func';
221
+ else if (/^[A-Z]/.test(word))
222
+ kind = 'type';
223
+ push(word, kind);
224
+ i = j;
225
+ continue;
226
+ }
227
+ // ── Punctuation / operators ───────────────────────────────────────
228
+ if ('(){}[];,.:'.includes(ch)) {
229
+ push(ch, 'punct');
230
+ i++;
231
+ continue;
232
+ }
233
+ if ('+-*/%=<>!&|^~?'.includes(ch)) {
234
+ push(ch, 'operator');
235
+ i++;
236
+ continue;
237
+ }
238
+ push(ch, 'plain');
239
+ i++;
240
+ }
241
+ return out;
242
+ }
243
+ /** Index of the next unescaped `quote` at or after `from`, or -1. */
244
+ function findUnescaped(line, from, quote) {
245
+ let escaped = false;
246
+ for (let k = from; k < line.length; k++) {
247
+ const c = line[k];
248
+ if (escaped) {
249
+ escaped = false;
250
+ continue;
251
+ }
252
+ if (c === '\\') {
253
+ escaped = true;
254
+ continue;
255
+ }
256
+ if (c === quote)
257
+ return k;
258
+ }
259
+ return -1;
260
+ }
261
+ //# sourceMappingURL=highlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.js","sourceRoot":"","sources":["../../../src/cli/ui/highlight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * CLI presentation layer — markdown, syntax highlighting, cards and streaming.
3
+ *
4
+ * Consumers import from here, never from the individual modules, so the internal
5
+ * split (parser → renderers → presenter) can change without touching call sites.
6
+ */
7
+ export { DARK_THEME, LIGHT_THEME, resolveTheme } from './theme.js';
8
+ export type { Theme, ThemeRole, ThemeName } from './theme.js';
9
+ export { highlightCode, normalizeLang } from './highlight.js';
10
+ export type { Token, TokenKind, TokenizedCode } from './highlight.js';
11
+ export { parseMarkdown, parseInline, inlineText, blocksToPlainText } from './markdown.js';
12
+ export type { Block, Inline, Align, ListItem } from './markdown.js';
13
+ export { renderMarkdown, renderBlocks, renderCard, visibleWidth } from './render.js';
14
+ export type { RenderOptions, CardOptions, CardLine } from './render.js';
15
+ export { attachShellCards, diffLineRole, formatDuration, gitDiffCard, shellCard, toolCallCard, } from './cards.js';
16
+ export type { ShellEndPayload, ToolCallCardInfo } from './cards.js';
17
+ export { LiveAnswer } from './answer-view.js';
18
+ export type { LiveAnswerProps } from './answer-view.js';
19
+ export { AnswerStream, createCardSink, presentAnswer, presentCard, renderAnswer, shouldUseRichUi, } from './presenter.js';
20
+ export type { CardSinkOverrides, PresenterOptions, StreamMeta } from './presenter.js';
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACnE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC9D,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC1F,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrF,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,SAAS,EACT,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,WAAW,EACX,YAAY,EACZ,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * CLI presentation layer — markdown, syntax highlighting, cards and streaming.
3
+ *
4
+ * Consumers import from here, never from the individual modules, so the internal
5
+ * split (parser → renderers → presenter) can change without touching call sites.
6
+ */
7
+ export { DARK_THEME, LIGHT_THEME, resolveTheme } from './theme.js';
8
+ export { highlightCode, normalizeLang } from './highlight.js';
9
+ export { parseMarkdown, parseInline, inlineText, blocksToPlainText } from './markdown.js';
10
+ export { renderMarkdown, renderBlocks, renderCard, visibleWidth } from './render.js';
11
+ export { attachShellCards, diffLineRole, formatDuration, gitDiffCard, shellCard, toolCallCard, } from './cards.js';
12
+ export { LiveAnswer } from './answer-view.js';
13
+ export { AnswerStream, createCardSink, presentAnswer, presentCard, renderAnswer, shouldUseRichUi, } from './presenter.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAG1F,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGrF,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,SAAS,EACT,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,WAAW,EACX,YAAY,EACZ,eAAe,GAChB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Markdown → shared AST parser.
3
+ *
4
+ * ONE PARSE, TWO RENDERERS. The CLI needs to show a model's markdown reply both
5
+ * live (Ink) and as a final frame / non-TTY fallback (a plain ANSI string).
6
+ * Parsing twice would guarantee drift, so the parse lives here and each renderer
7
+ * is a pure consumer of {@link Block}[]:
8
+ *
9
+ * markdown.ts → Block[] → render.ts (ANSI string)
10
+ * → answer-view.tsx (Ink elements)
11
+ *
12
+ * A single AST also makes the behaviour testable without a terminal: assertions
13
+ * are made against the parsed structure, not against bytes of coloured output.
14
+ *
15
+ * SCOPE. This is a deliberately small subset — headings, paragraphs, fenced
16
+ * code, ordered/unordered (nested) lists, pipe tables, block quotes and rules,
17
+ * with inline strong/em/code/link. That is what coding-agent answers actually
18
+ * use; anything else degrades to a paragraph. It is not a CommonMark engine.
19
+ */
20
+ import { type TokenizedCode } from './highlight.js';
21
+ export type Inline = {
22
+ kind: 'text';
23
+ text: string;
24
+ } | {
25
+ kind: 'code';
26
+ text: string;
27
+ } | {
28
+ kind: 'strong';
29
+ children: Inline[];
30
+ } | {
31
+ kind: 'em';
32
+ children: Inline[];
33
+ } | {
34
+ kind: 'link';
35
+ text: string;
36
+ href: string;
37
+ };
38
+ export type Align = 'left' | 'center' | 'right' | null;
39
+ export interface ListItem {
40
+ inlines: Inline[];
41
+ /** Nesting depth (0 = top level), derived from leading indentation. */
42
+ depth: number;
43
+ /** Whether THIS item used an ordered marker (`1.`). */
44
+ ordered: boolean;
45
+ /** The item's own number when ordered (0 for a bullet). */
46
+ index: number;
47
+ }
48
+ export type Block = {
49
+ type: 'heading';
50
+ level: number;
51
+ inlines: Inline[];
52
+ } | {
53
+ type: 'paragraph';
54
+ inlines: Inline[];
55
+ } | {
56
+ type: 'code';
57
+ lang: string;
58
+ code: string;
59
+ tokens: TokenizedCode;
60
+ } | {
61
+ type: 'list';
62
+ ordered: boolean;
63
+ start: number;
64
+ items: ListItem[];
65
+ } | {
66
+ type: 'table';
67
+ header: Inline[][];
68
+ rows: Inline[][][];
69
+ align: Align[];
70
+ } | {
71
+ type: 'quote';
72
+ blocks: Block[];
73
+ } | {
74
+ type: 'hr';
75
+ };
76
+ /** Parse a markdown string into blocks. */
77
+ export declare function parseMarkdown(md: string): Block[];
78
+ /**
79
+ * Parse inline markdown into styled runs.
80
+ *
81
+ * Deliberately non-greedy and pragmatic: an unmatched marker such as a lone `*`
82
+ * or a `[` without `](…)` is emitted as literal text, never swallowed, so
83
+ * ordinary prose containing asterisks and brackets survives intact.
84
+ */
85
+ export declare function parseInline(text: string): Inline[];
86
+ /** Plain text of an inline run — used for measuring and for non-colour output. */
87
+ export declare function inlineText(inlines: readonly Inline[]): string;
88
+ /** Plain text of a block tree — a markdown-aware fallback when colour is off. */
89
+ export declare function blocksToPlainText(blocks: readonly Block[]): string;
90
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEnE,MAAM,MAAM,MAAM,GACd;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,KAAK,GACb;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAAC,KAAK,EAAE,KAAK,EAAE,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAUnB,2CAA2C;AAC3C,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,EAAE,CAGjD;AA6JD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA2DlD;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAe7D;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,MAAM,CAkClE"}