@wrongstack/tui 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/markdown-table.ts","../src/components/history.tsx","../src/components/input.tsx","../src/components/status-bar.tsx","../src/components/file-picker.tsx","../src/components/slash-menu.tsx","../src/file-search.ts","../src/clipboard.ts","../src/queue-slash.ts","../src/git-info.ts","../src/app.tsx","../src/run-tui.ts"],"names":["jsxs","Box","Text","jsx","cache","Fragment","path","fs","parts","spawn","path3","fs3","next","fmtTok","React"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Scan a body of prose for GitHub-flavoured markdown tables and replace\n * each one with a Unicode box-drawing rendering that fits the terminal\n * width. Cells that overflow their column wrap over multiple lines.\n *\n * Non-table prose passes through unchanged.\n *\n * Input shape (rest of the doc may surround it):\n * | Header A | Header B |\n * |----------|---------:|\n * | a 1 | 42 |\n * | a 2 | 7 |\n *\n * Output shape:\n * ┌──────────┬──────────┐\n * │ Header A │ Header B │\n * ├──────────┼──────────┤\n * │ a 1 │ 42 │\n * │ a 2 │ 7 │\n * └──────────┴──────────┘\n */\nexport function renderMarkdownTables(text: string, maxWidth: number): string {\n if (!text.includes('|')) return text; // fast path\n const lines = text.split('\\n');\n const out: string[] = [];\n let i = 0;\n while (i < lines.length) {\n const end = detectTable(lines, i);\n if (end > i) {\n out.push(renderTable(lines.slice(i, end), Math.max(20, maxWidth)));\n i = end;\n } else {\n out.push(lines[i] ?? '');\n i++;\n }\n }\n return out.join('\\n');\n}\n\ntype Align = 'left' | 'right' | 'center';\n\nconst ROW_RE = /^\\s*\\|.*\\|\\s*$/;\nconst SEP_RE = /^\\s*\\|[\\s\\-:|]+\\|\\s*$/;\n\nfunction detectTable(lines: string[], start: number): number {\n if (start + 1 >= lines.length) return start;\n if (!ROW_RE.test(lines[start] ?? '')) return start;\n const sep = lines[start + 1] ?? '';\n // Need at least one dash somewhere — distinguishes the separator from\n // a regular row that happens to contain colons/spaces only.\n if (!SEP_RE.test(sep) || !/-/.test(sep)) return start;\n let end = start + 2;\n while (end < lines.length && ROW_RE.test(lines[end] ?? '')) end++;\n return end;\n}\n\nfunction parseCells(line: string): string[] {\n // Strip the outer pipes, then split on remaining pipes. Pipes inside a\n // cell would need escaping with `\\|`; we honour that minimally.\n const inner = line.trim().replace(/^\\||\\|$/g, '');\n const parts: string[] = [];\n let buf = '';\n for (let i = 0; i < inner.length; i++) {\n const ch = inner[i];\n if (ch === '\\\\' && inner[i + 1] === '|') {\n buf += '|';\n i++;\n continue;\n }\n if (ch === '|') {\n parts.push(buf);\n buf = '';\n continue;\n }\n buf += ch;\n }\n parts.push(buf);\n return parts.map((c) => c.trim());\n}\n\nfunction parseAlign(sep: string): Align {\n const t = sep.trim();\n const left = t.startsWith(':');\n const right = t.endsWith(':');\n if (left && right) return 'center';\n if (right) return 'right';\n return 'left';\n}\n\nfunction renderTable(tableLines: string[], maxWidth: number): string {\n const header = parseCells(tableLines[0] ?? '');\n const sepCells = parseCells(tableLines[1] ?? '');\n const cols = header.length;\n const aligns: Align[] = [];\n for (let c = 0; c < cols; c++) {\n aligns.push(parseAlign(sepCells[c] ?? ''));\n }\n const dataRows = tableLines.slice(2).map(parseCells);\n // Normalise short rows by padding with empty cells; drop extras.\n for (const row of dataRows) {\n while (row.length < cols) row.push('');\n row.length = cols;\n }\n\n const widths = computeWidths([header, ...dataRows], cols, maxWidth);\n\n const lines: string[] = [];\n lines.push(border('┌', '┬', '┐', widths));\n lines.push(...renderRow(header, widths, aligns));\n lines.push(border('├', '┼', '┤', widths));\n for (const row of dataRows) {\n lines.push(...renderRow(row, widths, aligns));\n }\n lines.push(border('└', '┴', '┘', widths));\n return lines.join('\\n');\n}\n\nfunction computeWidths(allRows: string[][], cols: number, maxWidth: number): number[] {\n // Each column adds `│ … ` of overhead (2 padding + 1 separator); the\n // very first column also gets an opening `│`. Net overhead = 3*cols + 1.\n const overhead = 3 * cols + 1;\n const avail = Math.max(cols * MIN_COL_WIDTH, maxWidth - overhead);\n const natural = new Array<number>(cols).fill(0);\n for (const row of allRows) {\n for (let c = 0; c < cols; c++) {\n const cell = row[c] ?? '';\n const w = longestWord(cell); // floor: never wrap mid-word in the middle of a short label\n const total = cell.length;\n // Track both, prefer the natural width but ensure at least `w`.\n natural[c] = Math.max(natural[c]!, total);\n if (w > natural[c]!) natural[c] = Math.min(total + 1, w);\n }\n }\n const sumNatural = natural.reduce((s, n) => s + n, 0);\n if (sumNatural <= avail) return natural;\n // Need to shrink. Repeatedly steal a char from the widest column above\n // MIN_COL_WIDTH until we fit. Cheap; cols is small.\n const widths = natural.slice();\n let sum = sumNatural;\n while (sum > avail) {\n let maxIdx = -1;\n let maxVal = MIN_COL_WIDTH;\n for (let i = 0; i < cols; i++) {\n const w = widths[i]!;\n if (w > maxVal) {\n maxVal = w;\n maxIdx = i;\n }\n }\n if (maxIdx < 0) break; // every column is at MIN_COL_WIDTH; give up\n widths[maxIdx]!--;\n sum--;\n }\n return widths;\n}\n\nconst MIN_COL_WIDTH = 4;\n\nfunction longestWord(s: string): number {\n let max = 0;\n for (const w of s.split(/\\s+/)) if (w.length > max) max = w.length;\n return max;\n}\n\nfunction border(left: string, mid: string, right: string, widths: number[]): string {\n return left + widths.map((w) => '─'.repeat(w + 2)).join(mid) + right;\n}\n\nfunction renderRow(cells: string[], widths: number[], aligns: Align[]): string[] {\n const wrapped = cells.map((c, i) => wrapCell(c, widths[i] ?? MIN_COL_WIDTH));\n const height = Math.max(1, ...wrapped.map((w) => w.length));\n const out: string[] = [];\n for (let line = 0; line < height; line++) {\n const parts: string[] = [];\n for (let c = 0; c < widths.length; c++) {\n const w = widths[c] ?? MIN_COL_WIDTH;\n const text = wrapped[c]?.[line] ?? '';\n parts.push(padCell(text, w, aligns[c] ?? 'left'));\n }\n out.push('│ ' + parts.join(' │ ') + ' │');\n }\n return out;\n}\n\nfunction wrapCell(text: string, width: number): string[] {\n if (text.length <= width) return [text];\n const out: string[] = [];\n // Split on whitespace, keep grouping until we'd overflow.\n const words = text.split(/(\\s+)/);\n let cur = '';\n for (const word of words) {\n if (!word) continue;\n if (cur.length + word.length <= width) {\n cur += word;\n continue;\n }\n if (cur) {\n out.push(cur.trimEnd());\n cur = '';\n }\n if (word.length > width) {\n // Hard-break a word longer than the column.\n let rest = word;\n while (rest.length > width) {\n out.push(rest.slice(0, width));\n rest = rest.slice(width);\n }\n cur = rest;\n } else if (!/^\\s+$/.test(word)) {\n cur = word;\n }\n }\n if (cur) out.push(cur.trimEnd());\n return out.length === 0 ? [''] : out;\n}\n\nfunction padCell(text: string, width: number, align: Align): string {\n if (text.length >= width) return text.slice(0, width);\n const pad = width - text.length;\n if (align === 'right') return ' '.repeat(pad) + text;\n if (align === 'center') {\n const l = Math.floor(pad / 2);\n return ' '.repeat(l) + text + ' '.repeat(pad - l);\n }\n return text + ' '.repeat(pad);\n}\n","import React from 'react';\nimport { Box, Static, Text, useStdout } from 'ink';\nimport { renderMarkdownTables } from '../markdown-table.js';\n\nexport type HistoryEntry =\n | { id: number; kind: 'user'; text: string; queued?: boolean }\n | { id: number; kind: 'assistant'; text: string }\n | {\n id: number;\n kind: 'tool';\n name: string;\n durationMs: number;\n ok: boolean;\n input?: unknown;\n output?: string;\n }\n | { id: number; kind: 'info'; text: string }\n | { id: number; kind: 'warn'; text: string }\n | { id: number; kind: 'error'; text: string }\n | { id: number; kind: 'turn-summary'; text: string }\n | {\n id: number;\n kind: 'banner';\n version: string;\n provider: string;\n model: string;\n cwd: string;\n };\n\nexport interface HistoryProps {\n entries: HistoryEntry[];\n streamingText?: string;\n}\n\nexport function History({ entries, streamingText }: HistoryProps): React.ReactElement {\n const { stdout } = useStdout();\n // Terminal width drives table column sizing. We snapshot it at render\n // time; Static-emitted entries won't reflow on resize, which is fine\n // — they're already in scrollback at the width they were drawn for.\n const termWidth = stdout?.columns ?? 80;\n const tail = streamingText ? tailForDisplay(streamingText, MAX_STREAM_DISPLAY_CHARS) : '';\n\n // Finalized entries go through <Static>: Ink prints each one ONCE and\n // never re-renders them, which means they flow into the terminal's\n // native scrollback. The user scrolls with the terminal's own\n // mechanism (mouse wheel, Shift+PgUp in Windows Terminal/PowerShell,\n // etc.) — we don't need an in-app scrollbar or scroll keys. Trying\n // to manage scroll ourselves clipped older content under a fixed\n // height box and lost it to redraws.\n return (\n <>\n <Static items={entries}>\n {(entry) => (\n <Box key={entry.id} marginBottom={entry.kind === 'turn-summary' ? 1 : 0}>\n <Entry entry={entry} termWidth={termWidth} />\n </Box>\n )}\n </Static>\n {tail ? (\n <Box>\n <Text dimColor>{'> '}</Text>\n <Text>{tail}</Text>\n </Box>\n ) : null}\n </>\n );\n}\n\nconst MAX_STREAM_DISPLAY_CHARS = 480;\n\nexport function tailForDisplay(text: string, maxChars: number): string {\n if (text.length <= maxChars) return text;\n const cut = text.length - maxChars;\n // Prefer a newline boundary near the cut for a cleaner visual edge.\n const nl = text.indexOf('\\n', cut);\n if (nl !== -1 && nl < cut + 80) {\n return `… ${text.slice(nl + 1)}`;\n }\n return `… ${text.slice(cut)}`;\n}\n\nfunction DiffBlock({ rows, hidden }: { rows: DiffLineRow[]; hidden: number }): React.ReactElement {\n return (\n <Box flexDirection=\"column\" marginLeft={4} marginTop={0}>\n {rows.map((row, i) => {\n if (row.kind === 'hunk') {\n return (\n <Text key={i} color=\"cyan\" dimColor>\n {row.text}\n </Text>\n );\n }\n if (row.kind === 'meta') {\n return (\n <Text key={i} dimColor>\n {row.text}\n </Text>\n );\n }\n if (row.kind === 'ctx') {\n return (\n <Text key={i} dimColor>\n {row.text}\n </Text>\n );\n }\n // add / del — colored backgrounds for the diff feel.\n const bg = row.kind === 'add' ? 'green' : 'red';\n const fg = row.kind === 'add' ? 'black' : 'white';\n return (\n <Text key={i} backgroundColor={bg} color={fg}>\n {row.text}\n </Text>\n );\n })}\n {hidden > 0 ? (\n <Text dimColor italic>\n {` … ${hidden} more line${hidden === 1 ? '' : 's'}`}\n </Text>\n ) : null}\n </Box>\n );\n}\n\nfunction Entry({ entry, termWidth }: { entry: HistoryEntry; termWidth: number }): React.ReactElement {\n switch (entry.kind) {\n case 'user':\n return (\n <Text>\n <Text color={entry.queued ? 'yellow' : 'cyan'}>{entry.queued ? '⌛' : '›'}</Text>{' '}\n <Text dimColor={entry.queued ?? false}>{entry.text}</Text>\n {entry.queued ? <Text dimColor>{' (queued)'}</Text> : null}\n </Text>\n );\n case 'assistant':\n return <Text>{renderMarkdownTables(entry.text, termWidth)}</Text>;\n case 'tool': {\n const argSummary = formatToolArgs(entry.name, entry.input);\n const outLines = formatToolOutput(entry.name, entry.output, entry.ok);\n const diff = entry.ok ? extractDiffPreview(entry.name, entry.output) : undefined;\n return (\n <Box flexDirection=\"column\">\n <Text>\n <Text color={entry.ok ? 'green' : 'red'}>{entry.ok ? '●' : '✗'}</Text>{' '}\n <Text bold color=\"cyan\">\n {entry.name}\n </Text>\n {argSummary ? (\n <>\n <Text>{' '}</Text>\n <Text dimColor>{argSummary}</Text>\n </>\n ) : null}\n <Text dimColor>{` · ${fmtDuration(entry.durationMs)}`}</Text>\n </Text>\n {outLines.map((line, i) => {\n const isLast = i === outLines.length - 1 && !diff;\n const prefix = isLast ? ' └─ ' : ' ├─ ';\n // Lines starting with '!' are stderr/error summaries — paint\n // them red even on overall-success runs (e.g. bash with\n // exit 0 + stderr output).\n const errish = !entry.ok || line.startsWith('!');\n return (\n <Text key={i}>\n <Text dimColor>{prefix}</Text>\n <Text color={errish ? 'red' : undefined} dimColor={!errish}>\n {line}\n </Text>\n </Text>\n );\n })}\n {diff ? <DiffBlock rows={diff.rows} hidden={diff.hidden} /> : null}\n </Box>\n );\n }\n case 'info':\n return <Text dimColor>{entry.text}</Text>;\n case 'warn':\n return <Text color=\"yellow\">{entry.text}</Text>;\n case 'error':\n return <Text color=\"red\">{entry.text}</Text>;\n case 'turn-summary':\n return <Text dimColor>{entry.text}</Text>;\n case 'banner':\n return <Banner entry={entry} />;\n }\n}\n\n/**\n * Startup splash. Renders into the Static area on mount and never\n * re-renders, so it's safe to use rich layout without worrying about\n * Ink's redraw cursor math. Keeping it inside one Box (no nested\n * borders that pull in different widths per line) keeps the frame\n * intact at any terminal width ≥ 60 cols.\n */\nfunction Banner({\n entry,\n}: {\n entry: Extract<HistoryEntry, { kind: 'banner' }>;\n}): React.ReactElement {\n const cwdShort = shortenPath(entry.cwd, 48);\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"magenta\"\n paddingX={2}\n paddingY={0}\n >\n <Text>\n <Text color=\"magenta\" bold>\n {' ▟▛ '}\n </Text>\n <Text color=\"magenta\" bold>\n WrongStack\n </Text>\n <Text dimColor>{' v'}</Text>\n <Text>{entry.version}</Text>\n </Text>\n <Text dimColor italic>\n {' Built on the wrong stack. Shipped anyway.'}\n </Text>\n <Text>\n <Text color=\"cyan\">{' provider '}</Text>\n <Text>\n {entry.provider}/{entry.model}\n </Text>\n </Text>\n <Text>\n <Text color=\"cyan\">{' cwd '}</Text>\n <Text dimColor>{cwdShort}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">{' hints '}</Text>\n <Text dimColor>/help · /init · /memory · /queue · /exit</Text>\n </Text>\n </Box>\n );\n}\n\nexport function shortenPath(p: string, max: number): string {\n if (p.length <= max) return p;\n // Keep the tail (closest to where the user is working).\n return `…${p.slice(p.length - (max - 1))}`;\n}\n\nconst MAX_PREVIEW = 120;\n\nexport function previewArgs(input: unknown): string {\n let s: string;\n try {\n s = typeof input === 'string' ? input : JSON.stringify(input);\n } catch {\n s = String(input);\n }\n return collapse(s, MAX_PREVIEW);\n}\n\nexport function previewOutput(output: string): string {\n return collapse(output, MAX_PREVIEW);\n}\n\nfunction collapse(s: string, max: number): string {\n const oneLine = s.replace(/\\r?\\n/g, '↵').replace(/\\s+/g, ' ').trim();\n return oneLine.length <= max ? oneLine : `${oneLine.slice(0, max - 1)}…`;\n}\n\nexport function fmtDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n const totalSec = Math.floor(ms / 1000);\n return `${Math.floor(totalSec / 60)}m${totalSec % 60}s`;\n}\n\nconst ARG_BUDGET = 60;\nconst OUT_BUDGET = 80;\n\n/**\n * Render the most useful single-line description of a tool call's\n * arguments. Each tool has the field a human cares about (path for\n * read/edit, command for bash, pattern for grep) — pick that and skip\n * the noisy JSON shape entirely. Falls back to a compact JSON preview\n * for unrecognised tools.\n */\nexport function formatToolArgs(toolName: string, input: unknown): string {\n if (!input || typeof input !== 'object') return '';\n const obj = input as Record<string, unknown>;\n\n switch (toolName) {\n case 'read':\n case 'write':\n case 'edit':\n case 'patch':\n case 'document':\n case 'list_dir':\n case 'ls':\n case 'tree': {\n const p = stringOf(obj['path']) ?? stringOf(obj['file']);\n return p ? shortenPath(p, ARG_BUDGET) : '';\n }\n case 'grep':\n case 'search':\n case 'replace': {\n const pat = stringOf(obj['pattern']) ?? stringOf(obj['query']);\n const scope = stringOf(obj['path']) ?? stringOf(obj['glob']);\n const head = pat ? `\"${truncMid(pat, 36)}\"` : '';\n const tail = scope ? ` in ${shortenPath(scope, 28)}` : '';\n return `${head}${tail}` || (stringOf(obj['command']) ?? '');\n }\n case 'glob': {\n const pat = stringOf(obj['pattern']) ?? stringOf(obj['glob']);\n return pat ? `\"${truncMid(pat, ARG_BUDGET - 2)}\"` : '';\n }\n case 'bash':\n case 'shell':\n case 'exec':\n case 'install':\n case 'git': {\n const cmd = stringOf(obj['command']) ?? stringOf(obj['args']);\n return cmd ? truncMid(cmd, ARG_BUDGET) : '';\n }\n case 'diff': {\n const files = Array.isArray(obj['files']) ? (obj['files'] as unknown[]) : undefined;\n if (files && files.length > 0) {\n const head = stringOf(files[0]) ?? '';\n const rest = files.length > 1 ? ` (+${files.length - 1})` : '';\n return head ? `${shortenPath(head, 50)}${rest}` : '';\n }\n const mode = stringOf(obj['mode']);\n return mode ? `mode: ${mode}` : '';\n }\n case 'fetch':\n case 'webfetch':\n case 'web_fetch': {\n const u = stringOf(obj['url']);\n return u ? truncMid(u, ARG_BUDGET) : '';\n }\n case 'todo': {\n const list = obj['todos'];\n if (Array.isArray(list)) return `${list.length} item${list.length === 1 ? '' : 's'}`;\n return '';\n }\n case 'lint':\n case 'format':\n case 'typecheck':\n case 'test':\n case 'audit':\n case 'outdated': {\n const files = obj['files'];\n if (Array.isArray(files) && files.length > 0) {\n const first = stringOf(files[0]);\n const more = files.length > 1 ? ` (+${files.length - 1})` : '';\n return first ? `${shortenPath(first, 50)}${more}` : `${files.length} files`;\n }\n const filter = stringOf(obj['filter']) ?? stringOf(obj['pattern']);\n return filter ? `\"${truncMid(filter, ARG_BUDGET - 2)}\"` : '';\n }\n case 'json': {\n const file = stringOf(obj['file']);\n const q = stringOf(obj['query']);\n if (file) return q ? `${shortenPath(file, 40)} ${q}` : shortenPath(file, ARG_BUDGET);\n return q ? truncMid(q, ARG_BUDGET) : '';\n }\n case 'scaffold': {\n const tmpl = stringOf(obj['template']) ?? stringOf(obj['type']);\n const name = stringOf(obj['name']);\n if (tmpl && name) return `${tmpl} → ${truncMid(name, ARG_BUDGET - tmpl.length - 4)}`;\n return name ?? tmpl ?? '';\n }\n case 'remember':\n case 'forget':\n case 'memory': {\n const key = stringOf(obj['key']) ?? stringOf(obj['name']);\n return key ? truncMid(key, ARG_BUDGET) : '';\n }\n case 'mode': {\n const m = stringOf(obj['mode']) ?? stringOf(obj['name']);\n return m ? truncMid(m, ARG_BUDGET) : '';\n }\n case 'logs': {\n const target = stringOf(obj['target']) ?? stringOf(obj['service']) ?? stringOf(obj['path']);\n return target ? truncMid(target, ARG_BUDGET) : '';\n }\n }\n\n // Generic fallback: prefer the most \"identifying\" string field, else\n // a tight JSON preview.\n for (const key of ['path', 'file', 'url', 'name', 'query', 'pattern', 'command']) {\n const v = stringOf(obj[key]);\n if (v) return truncMid(v, ARG_BUDGET);\n }\n try {\n return truncMid(JSON.stringify(obj), ARG_BUDGET);\n } catch {\n return '';\n }\n}\n\n/**\n * Distil a tool's result text into 0–N digest lines the renderer can\n * stack under the tool header. Some tools say everything in one line\n * (todo: nothing to add beyond the args); others (bash with both\n * stdout and stderr, grep with a first matching path) deserve two or\n * three. The shape is per-tool — there is no fixed budget.\n */\nexport function formatToolOutput(\n toolName: string,\n output: string | undefined,\n ok: boolean,\n): string[] {\n if (!output) return ok ? [] : ['failed'];\n const text = output.trim();\n if (!text) return ok ? [] : ['failed'];\n\n // Try to parse JSON-shaped tool outputs (grep, glob, etc.).\n const json = tryParseJson(text);\n\n if (toolName === 'write') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const bytes = numOf(o['bytes_written']) ?? numOf(o['bytes']);\n const created = o['created'] === true;\n const tag = created ? 'created' : 'updated';\n if (bytes !== undefined) return [`${tag} · ${fmtBytes(bytes)}`];\n return [tag];\n }\n }\n\n if (toolName === 'edit') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const reps = numOf(o['replacements']);\n if (reps !== undefined) return [`${reps} replacement${reps === 1 ? '' : 's'}`];\n }\n }\n\n if (toolName === 'patch') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const applied = numOf(o['applied']);\n const rejected = numOf(o['rejected']);\n const files = Array.isArray(o['files']) ? (o['files'] as unknown[]) : undefined;\n const lines: string[] = [];\n if (applied !== undefined || rejected !== undefined) {\n const parts = [];\n if (applied !== undefined) parts.push(`${applied} applied`);\n if (rejected !== undefined && rejected > 0) parts.push(`${rejected} rejected`);\n lines.push(parts.join(' · '));\n }\n if (files && files.length > 0) {\n const first = stringOf(files[0]) ?? '';\n const more = files.length > 1 ? ` (+${files.length - 1})` : '';\n lines.push(`${shortenPath(first, 60)}${more}`);\n }\n if (lines.length > 0) return lines;\n }\n }\n\n if (toolName === 'replace') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const files = numOf(o['files_modified']);\n const reps = numOf(o['total_replacements']);\n if (files !== undefined && reps !== undefined) {\n return [\n `${reps} replacement${reps === 1 ? '' : 's'} in ${files} file${files === 1 ? '' : 's'}`,\n ];\n }\n }\n }\n\n if (toolName === 'diff') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const files = Array.isArray(o['files']) ? (o['files'] as unknown[]) : undefined;\n const truncated = o['truncated'] === true;\n const mode = stringOf(o['mode']);\n const diff = stringOf(o['diff']);\n if (!diff) return [files && files.length === 0 ? 'no changes' : 'empty diff'];\n const head: string[] = [];\n if (mode) head.push(mode);\n if (files && files.length > 0) head.push(`${files.length} file${files.length === 1 ? '' : 's'}`);\n if (truncated) head.push('truncated');\n return head.length > 0 ? [head.join(' · ')] : [];\n }\n }\n\n if (toolName === 'read') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const bytes = numOf(o['bytes']);\n if (bytes !== undefined) return [`${fmtBytes(bytes)} read`];\n }\n // read returns numbered lines like \" 1→...\\n 2→...\". Surface the\n // actual line range (start–end) — that's denser than a count alone.\n const range = scanNumberedRange(text);\n if (range.count > 0 && range.first !== undefined && range.last !== undefined) {\n if (range.first === range.last) {\n return [`L${range.first} · ${fmtBytes(text.length)}`];\n }\n const contiguous = range.count === range.last - range.first + 1;\n const head = `L${range.first}–${range.last}`;\n const tail = contiguous\n ? `${range.count} line${range.count === 1 ? '' : 's'}`\n : `${range.count} lines (gaps)`;\n return [`${head} · ${tail} · ${fmtBytes(text.length)}`];\n }\n }\n\n if (toolName === 'grep' || toolName === 'glob') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const matches = Array.isArray(o['matches']) ? (o['matches'] as unknown[]) : undefined;\n const count = numOf(o['count']) ?? matches?.length;\n const truncated = o['truncated'] === true;\n if (count !== undefined) {\n if (count === 0) return ['no matches'];\n const lines: string[] = [\n `${count} match${count === 1 ? '' : 'es'}${truncated ? ' (truncated)' : ''}`,\n ];\n // Surface the first hit so the user knows *where* without\n // opening the tool result.\n const firstHit = matches && matches.length > 0 ? formatMatchHit(matches[0]) : undefined;\n if (firstHit) lines.push(firstHit);\n return lines;\n }\n }\n }\n\n if (toolName === 'bash' || toolName === 'shell') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const exit = numOf(o['exit_code']) ?? numOf(o['exitCode']);\n const stdout = stringOf(o['stdout']) ?? '';\n const stderr = stringOf(o['stderr']) ?? '';\n const stdoutLines = countLines(stdout);\n const stderrLines = countLines(stderr);\n const head: string[] = [];\n if (exit !== undefined) head.push(`exit ${exit}`);\n const lineParts: string[] = [];\n if (stdoutLines > 0) lineParts.push(`${stdoutLines} out`);\n if (stderrLines > 0) lineParts.push(`${stderrLines} err`);\n if (lineParts.length > 0) head.push(lineParts.join(' · '));\n const lines: string[] = [];\n if (head.length > 0) lines.push(head.join(' · '));\n const stdoutPreview = firstNonEmpty(stdout);\n const stderrPreview = firstNonEmpty(stderr);\n if (stdoutPreview) lines.push(`\"${truncMid(stdoutPreview, 70)}\"`);\n if (stderrPreview && stderrPreview !== stdoutPreview) {\n lines.push(`! \"${truncMid(stderrPreview, 70)}\"`);\n }\n if (lines.length > 0) return lines;\n }\n }\n\n if (toolName === 'todo') {\n // The arg summary already says \"N items\" — repeating \"updated\" is\n // noise, so emit nothing on success.\n return ok ? [] : [text.split('\\n')[0] ?? ''];\n }\n\n if (toolName === 'fetch' || toolName === 'webfetch' || toolName === 'web_fetch') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const status = numOf(o['status']);\n const ct = stringOf(o['content_type']);\n const url = stringOf(o['url']);\n const content = stringOf(o['content']);\n const head: string[] = [];\n if (status !== undefined) head.push(`HTTP ${status}`);\n if (ct) head.push(ct.split(';')[0] ?? ct);\n if (content) head.push(fmtBytes(Buffer.byteLength(content, 'utf8')));\n const lines: string[] = [];\n if (head.length > 0) lines.push(head.join(' · '));\n if (url && status !== undefined && (status < 200 || status >= 400)) {\n lines.push(shortenPath(url, 70));\n }\n if (lines.length > 0) return lines;\n }\n }\n\n if (toolName === 'git') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const exit = numOf(o['exitCode']) ?? numOf(o['exit_code']);\n const stdout = stringOf(o['stdout']) ?? '';\n const stderr = stringOf(o['stderr']) ?? '';\n const head: string[] = [];\n if (exit !== undefined) head.push(`exit ${exit}`);\n const stdoutLines = countLines(stdout);\n const stderrLines = countLines(stderr);\n const lparts: string[] = [];\n if (stdoutLines > 0) lparts.push(`${stdoutLines} out`);\n if (stderrLines > 0) lparts.push(`${stderrLines} err`);\n if (lparts.length > 0) head.push(lparts.join(' · '));\n const lines: string[] = [];\n if (head.length > 0) lines.push(head.join(' · '));\n const preview = firstNonEmpty(stdout) ?? firstNonEmpty(stderr);\n if (preview) lines.push(`\"${truncMid(preview, 70)}\"`);\n if (lines.length > 0) return lines;\n }\n }\n\n if (toolName === 'lint') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const linter = stringOf(o['linter']);\n const files = numOf(o['files_checked']);\n const errors = numOf(o['errors']) ?? 0;\n const warnings = numOf(o['warnings']) ?? 0;\n const fix = o['fix_applied'] === true;\n const head: string[] = [];\n if (linter && linter !== 'none') head.push(linter);\n head.push(`${errors} error${errors === 1 ? '' : 's'}`);\n head.push(`${warnings} warning${warnings === 1 ? '' : 's'}`);\n if (files !== undefined) head.push(`${files} file${files === 1 ? '' : 's'}`);\n if (fix) head.push('fixed');\n return [head.join(' · ')];\n }\n }\n\n if (toolName === 'format') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const fixer = stringOf(o['fixer']);\n const checked = numOf(o['files_checked']);\n const changed = numOf(o['files_changed']);\n const head: string[] = [];\n if (fixer && fixer !== 'none') head.push(fixer);\n if (changed !== undefined && checked !== undefined) {\n head.push(`${changed}/${checked} changed`);\n } else if (changed !== undefined) {\n head.push(`${changed} changed`);\n }\n return head.length > 0 ? [head.join(' · ')] : [];\n }\n }\n\n if (toolName === 'typecheck') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const exit = numOf(o['exit_code']) ?? numOf(o['exitCode']);\n const errors = numOf(o['errors']);\n const head: string[] = [];\n if (errors !== undefined) head.push(`${errors} error${errors === 1 ? '' : 's'}`);\n if (exit !== undefined) head.push(`exit ${exit}`);\n const stdout = stringOf(o['output']) ?? stringOf(o['stdout']) ?? '';\n const lines: string[] = [];\n if (head.length > 0) lines.push(head.join(' · '));\n const preview = firstNonEmpty(stdout);\n if (preview && (!errors || errors > 0)) lines.push(`\"${truncMid(preview, 70)}\"`);\n if (lines.length > 0) return lines;\n }\n }\n\n if (toolName === 'test') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const runner = stringOf(o['runner']);\n const total = numOf(o['tests_run']) ?? 0;\n const passed = numOf(o['passed']) ?? 0;\n const failed = numOf(o['failed']) ?? 0;\n const duration = numOf(o['duration_ms']);\n const head: string[] = [];\n if (runner && runner !== 'none') head.push(runner);\n head.push(`${passed}/${total} passed`);\n if (failed > 0) head.push(`${failed} failed`);\n if (duration !== undefined) head.push(fmtDuration(duration));\n return [head.join(' · ')];\n }\n }\n\n if (toolName === 'audit') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const total = numOf(o['total']) ?? 0;\n const summary = stringOf(o['summary']);\n if (total === 0) return ['no vulnerabilities'];\n const head = `${total} vulnerabilit${total === 1 ? 'y' : 'ies'}`;\n return summary && summary.toLowerCase() !== head.toLowerCase()\n ? [head, truncMid(summary, OUT_BUDGET)]\n : [head];\n }\n }\n\n if (toolName === 'outdated') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const total = numOf(o['total']) ?? 0;\n const pkgs = Array.isArray(o['packages']) ? (o['packages'] as unknown[]) : undefined;\n if (total === 0) return ['all up to date'];\n const lines: string[] = [`${total} outdated`];\n if (pkgs && pkgs.length > 0) {\n const first = pkgs[0];\n if (first && typeof first === 'object') {\n const p = first as Record<string, unknown>;\n const name = stringOf(p['name']) ?? stringOf(p['package']);\n const cur = stringOf(p['current']);\n const wanted = stringOf(p['wanted']) ?? stringOf(p['latest']);\n if (name && cur && wanted) lines.push(`${name}: ${cur} → ${wanted}`);\n else if (name) lines.push(name);\n }\n }\n return lines;\n }\n }\n\n if (toolName === 'tree') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const files = numOf(o['total_files']);\n const dirs = numOf(o['total_dirs']);\n const truncated = o['truncated'] === true;\n const parts: string[] = [];\n if (files !== undefined) parts.push(`${files} file${files === 1 ? '' : 's'}`);\n if (dirs !== undefined) parts.push(`${dirs} dir${dirs === 1 ? '' : 's'}`);\n if (truncated) parts.push('truncated');\n return parts.length > 0 ? [parts.join(' · ')] : [];\n }\n }\n\n if (toolName === 'json') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const err = stringOf(o['error']);\n if (err) return [truncMid(err, OUT_BUDGET)];\n const type = stringOf(o['type']);\n const keys = Array.isArray(o['keys']) ? (o['keys'] as unknown[]) : undefined;\n const parts: string[] = [];\n if (type) parts.push(type);\n if (keys) parts.push(`${keys.length} key${keys.length === 1 ? '' : 's'}`);\n return parts.length > 0 ? [parts.join(' · ')] : [];\n }\n }\n\n if (toolName === 'install') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const exit = numOf(o['exit_code']) ?? numOf(o['exitCode']);\n const added = numOf(o['added']);\n const removed = numOf(o['removed']);\n const head: string[] = [];\n if (exit !== undefined) head.push(`exit ${exit}`);\n if (added !== undefined) head.push(`+${added}`);\n if (removed !== undefined) head.push(`-${removed}`);\n const stdout = stringOf(o['stdout']) ?? stringOf(o['output']) ?? '';\n const lines: string[] = [];\n if (head.length > 0) lines.push(head.join(' · '));\n const preview = firstNonEmpty(stdout);\n if (preview) lines.push(`\"${truncMid(preview, 70)}\"`);\n if (lines.length > 0) return lines;\n }\n }\n\n if (toolName === 'scaffold') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const created = Array.isArray(o['created']) ? (o['created'] as unknown[]) : undefined;\n const skipped = Array.isArray(o['skipped']) ? (o['skipped'] as unknown[]) : undefined;\n const parts: string[] = [];\n if (created !== undefined) parts.push(`${created.length} created`);\n if (skipped !== undefined && skipped.length > 0) parts.push(`${skipped.length} skipped`);\n if (parts.length > 0) return [parts.join(' · ')];\n }\n }\n\n if (toolName === 'remember' || toolName === 'forget' || toolName === 'memory') {\n return ok ? [toolName === 'forget' ? 'removed' : 'saved'] : [text.split('\\n')[0] ?? ''];\n }\n\n if (toolName === 'mode') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const mode = stringOf(o['mode']) ?? stringOf(o['active']) ?? stringOf(o['name']);\n if (mode) return [`mode: ${mode}`];\n }\n }\n\n if (toolName === 'search') {\n if (json && typeof json === 'object') {\n const o = json as Record<string, unknown>;\n const matches = Array.isArray(o['matches'])\n ? (o['matches'] as unknown[])\n : Array.isArray(o['results'])\n ? (o['results'] as unknown[])\n : undefined;\n const count = numOf(o['count']) ?? matches?.length;\n if (count !== undefined) {\n if (count === 0) return ['no results'];\n const lines: string[] = [`${count} result${count === 1 ? '' : 's'}`];\n const firstHit = matches && matches.length > 0 ? formatMatchHit(matches[0]) : undefined;\n if (firstHit) lines.push(firstHit);\n return lines;\n }\n }\n }\n\n if (toolName === 'logs') {\n const lines = text.split('\\n').filter((l) => l.trim());\n if (lines.length === 0) return [];\n const head = `${lines.length} line${lines.length === 1 ? '' : 's'}`;\n const lastLine = lines[lines.length - 1];\n return lastLine ? [head, `\"${truncMid(lastLine.trim(), 70)}\"`] : [head];\n }\n\n // Generic fallback — first non-empty line, collapsed.\n const firstLine = text.split('\\n').find((l) => l.trim()) ?? text;\n return [truncMid(firstLine.replace(/\\s+/g, ' '), OUT_BUDGET)];\n}\n\nfunction firstNonEmpty(text: string): string | undefined {\n if (!text) return undefined;\n const line = text.split('\\n').find((l) => l.trim());\n return line ? line.replace(/\\s+/g, ' ').trim() : undefined;\n}\n\nfunction formatMatchHit(hit: unknown): string | undefined {\n if (typeof hit === 'string') return truncMid(hit, 70);\n if (hit && typeof hit === 'object') {\n const o = hit as Record<string, unknown>;\n const file = stringOf(o['file']) ?? stringOf(o['path']);\n const line = numOf(o['line']) ?? numOf(o['lineNumber']);\n const snippet = stringOf(o['text']) ?? stringOf(o['match']) ?? stringOf(o['preview']);\n if (file) {\n const head = line !== undefined ? `${shortenPath(file, 40)}:${line}` : shortenPath(file, 50);\n return snippet ? `${head} ${truncMid(snippet.replace(/\\s+/g, ' '), 40)}` : head;\n }\n if (snippet) return truncMid(snippet, 70);\n }\n return undefined;\n}\n\nexport type DiffLineKind = 'add' | 'del' | 'hunk' | 'ctx' | 'meta';\n\nexport interface DiffLineRow {\n kind: DiffLineKind;\n text: string;\n}\n\nconst DIFF_MAX_LINES = 8;\n\n/**\n * Pull a unified-diff string out of a tool's JSON output, then turn it\n * into a small, structured preview suitable for colour-coded rendering\n * in the TUI history. We cap at ~8 lines so a giant patch doesn't\n * dominate the chat scrollback; the renderer surfaces the hidden count.\n */\nexport function extractDiffPreview(\n toolName: string,\n output: string | undefined,\n): { rows: DiffLineRow[]; hidden: number } | undefined {\n if (!output) return undefined;\n const text = output.trim();\n if (!text) return undefined;\n\n let diff: string | undefined;\n if (toolName === 'edit' || toolName === 'diff') {\n const parsed = tryParseJson(text);\n if (parsed && typeof parsed === 'object') {\n diff = stringOf((parsed as Record<string, unknown>)['diff']);\n }\n } else if (toolName === 'patch') {\n const parsed = tryParseJson(text);\n if (parsed && typeof parsed === 'object') {\n diff =\n stringOf((parsed as Record<string, unknown>)['diff']) ??\n stringOf((parsed as Record<string, unknown>)['stdout']);\n } else if (text.includes('@@') || text.startsWith('---')) {\n diff = text;\n }\n }\n\n if (!diff || !diff.trim() || diff.startsWith('(no-op')) return undefined;\n return parseUnifiedDiff(diff, DIFF_MAX_LINES);\n}\n\nfunction parseUnifiedDiff(diff: string, maxLines: number): { rows: DiffLineRow[]; hidden: number } {\n const all: DiffLineRow[] = [];\n for (const raw of diff.split('\\n')) {\n const line = raw.replace(/\\r$/, '');\n if (line.startsWith('+++') || line.startsWith('---')) continue;\n if (line.startsWith('diff --git') || line.startsWith('index ')) continue;\n if (line.startsWith('@@')) {\n all.push({ kind: 'hunk', text: truncMid(line, 60) });\n continue;\n }\n if (line.startsWith('+')) {\n all.push({ kind: 'add', text: truncMid(line, 100) });\n continue;\n }\n if (line.startsWith('-')) {\n all.push({ kind: 'del', text: truncMid(line, 100) });\n continue;\n }\n if (line.startsWith('\\\\ No newline')) {\n all.push({ kind: 'meta', text: line });\n continue;\n }\n if (line.length === 0) continue;\n all.push({ kind: 'ctx', text: truncMid(line, 100) });\n }\n if (all.length === 0) return { rows: [], hidden: 0 };\n if (all.length <= maxLines) return { rows: all, hidden: 0 };\n return { rows: all.slice(0, maxLines), hidden: all.length - maxLines };\n}\n\nfunction stringOf(v: unknown): string | undefined {\n return typeof v === 'string' && v.length > 0 ? v : undefined;\n}\n\nfunction numOf(v: unknown): number | undefined {\n return typeof v === 'number' && Number.isFinite(v) ? v : undefined;\n}\n\nfunction tryParseJson(s: string): unknown {\n const t = s.trimStart();\n if (!t.startsWith('{') && !t.startsWith('[')) return undefined;\n try {\n return JSON.parse(s);\n } catch {\n return undefined;\n }\n}\n\nfunction scanNumberedRange(text: string): { first?: number; last?: number; count: number } {\n let first: number | undefined;\n let last: number | undefined;\n let count = 0;\n for (const line of text.split('\\n')) {\n const m = line.match(/^\\s*(\\d+)→/);\n if (m && m[1]) {\n const n = Number.parseInt(m[1], 10);\n if (Number.isFinite(n)) {\n if (first === undefined) first = n;\n last = n;\n count++;\n }\n }\n }\n return { first, last, count };\n}\n\nfunction countLines(text: string): number {\n if (!text) return 0;\n return text.replace(/\\n$/, '').split('\\n').length;\n}\n\nfunction fmtBytes(n: number): string {\n if (n < 1024) return `${n}B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)}KB`;\n return `${(n / (1024 * 1024)).toFixed(1)}MB`;\n}\n\nfunction truncMid(s: string, max: number): string {\n if (s.length <= max) return s;\n return `${s.slice(0, max - 1)}…`;\n}\n","import React from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nexport interface InputProps {\n prompt?: string;\n value: string;\n cursor: number;\n placeholders: string[];\n disabled?: boolean;\n hint?: string;\n onKey: (input: string, key: KeyEvent) => void;\n}\n\nexport interface KeyEvent {\n upArrow: boolean;\n downArrow: boolean;\n leftArrow: boolean;\n rightArrow: boolean;\n return: boolean;\n escape: boolean;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n tab: boolean;\n backspace: boolean;\n delete: boolean;\n pageUp: boolean;\n pageDown: boolean;\n}\n\nexport function Input({\n prompt = '› ',\n value,\n cursor,\n placeholders,\n disabled,\n hint,\n onKey,\n}: InputProps): React.ReactElement {\n useInput((input, key) => {\n if (disabled) return;\n onKey(input, key as KeyEvent);\n });\n\n const before = value.slice(0, cursor);\n const at = value.slice(cursor, cursor + 1) || ' ';\n const after = value.slice(cursor + 1);\n\n // Active = cyan when the user has anything typed; gray otherwise.\n // Disabled (aborting an iteration) overrides to red — Ctrl+C feedback.\n const borderColor = disabled ? 'red' : value.length > 0 ? 'cyan' : 'gray';\n\n return (\n <Box flexDirection=\"column\">\n {placeholders.map((p, i) => (\n <Text key={i} dimColor>\n {' ↳ '}\n {p}\n </Text>\n ))}\n <Box\n borderStyle=\"round\"\n borderColor={borderColor}\n paddingX={1}\n // width=\"100%\" makes the border stretch across the terminal; without\n // it the Box hugs its content and the border looks like a tag.\n width=\"100%\"\n >\n {/* Single <Text> wrapper so prompt + buffer + cursor + tail all wrap\n as one continuous string. Splitting them across sibling Text\n elements would let each piece wrap independently and shift the\n cursor cell off the intended character. */}\n <Text>\n <Text color=\"cyan\">{prompt}</Text>\n {before}\n <Text inverse>{at}</Text>\n {after}\n </Text>\n </Box>\n {hint ? <Text dimColor>{hint}</Text> : null}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { TokenCounter } from '@wrongstack/core';\nimport type { GitInfo } from '../git-info.js';\n\nexport interface TodoCounts {\n pending: number;\n inProgress: number;\n completed: number;\n}\n\nexport interface ContextWindow {\n /** Input tokens of the most recent provider request — the de-facto live context size. */\n used: number;\n /** Provider's declared maxContext capability. */\n max: number;\n}\n\nexport interface StatusBarProps {\n model: string;\n state: 'idle' | 'running' | 'streaming' | 'aborting';\n tokenCounter?: TokenCounter;\n hint?: string;\n queueCount?: number;\n yolo?: boolean;\n /** Session elapsed in milliseconds. Renders as `mm:ss` (< 1h) or `h:mm:ss`. */\n elapsedMs?: number;\n todos?: TodoCounts;\n git?: GitInfo | null;\n subagentCount?: number;\n /** Renders the \"ctx ████░░ 42%\" chip on line 1 when present. */\n context?: ContextWindow;\n}\n\n/**\n * Two-line status bar. The first line stays compact and shows the\n * runtime essentials (state · model · tokens · cost · queue · running\n * tool). The second line opts in only when there's actually something\n * to show — git branch, elapsed time, todo counts, YOLO marker — so a\n * vanilla session keeps the original single-line footprint.\n */\nexport function StatusBar({\n model,\n state,\n tokenCounter,\n hint,\n queueCount = 0,\n yolo = false,\n elapsedMs,\n todos,\n git,\n subagentCount = 0,\n context,\n}: StatusBarProps): React.ReactElement {\n const usage = tokenCounter?.total();\n const cost = tokenCounter?.estimateCost();\n const cache = tokenCounter?.cacheStats();\n const stateColor =\n state === 'idle' ? 'cyan' : state === 'aborting' ? 'yellow' : 'green';\n const stateLabel =\n state === 'idle' ? 'idle' : state === 'aborting' ? 'aborting…' : 'thinking…';\n\n const hasSecondLine =\n yolo ||\n elapsedMs !== undefined ||\n (todos && (todos.pending > 0 || todos.inProgress > 0 || todos.completed > 0)) ||\n (git !== null && git !== undefined) ||\n subagentCount > 0;\n\n return (\n <Box\n flexDirection=\"column\"\n paddingX={1}\n borderStyle=\"single\"\n borderTop={true}\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n >\n <Box flexDirection=\"row\" gap={2}>\n <Text color={stateColor}>● {stateLabel}</Text>\n <Text dimColor>│</Text>\n <Text color=\"magenta\">{model}</Text>\n {context && context.max > 0 ? (\n <>\n <Text dimColor>│</Text>\n <ContextChip ctx={context} />\n </>\n ) : null}\n {usage ? (\n <>\n <Text dimColor>│</Text>\n <Text>\n ↑ <Text color=\"cyan\">{fmtTok(usage.input)}</Text> ↓{' '}\n <Text color=\"cyan\">{fmtTok(usage.output)}</Text>\n </Text>\n </>\n ) : null}\n {cache && cache.hitRatio > 0 ? (\n <>\n <Text dimColor>│</Text>\n <Text dimColor>cache {(cache.hitRatio * 100).toFixed(0)}%</Text>\n </>\n ) : null}\n {cost && cost.total > 0 ? (\n <>\n <Text dimColor>│</Text>\n <Text color=\"yellow\">${cost.total.toFixed(4)}</Text>\n </>\n ) : null}\n {queueCount > 0 ? (\n <>\n <Text dimColor>│</Text>\n <Text color=\"cyan\">⌛ queued: {queueCount}</Text>\n </>\n ) : null}\n {hint ? (\n <>\n <Text dimColor>│</Text>\n <Text dimColor>{hint}</Text>\n </>\n ) : null}\n </Box>\n\n {hasSecondLine ? (\n <Box flexDirection=\"row\" gap={2}>\n {yolo ? (\n <Text color=\"red\" bold>\n ⚠ YOLO\n </Text>\n ) : null}\n {elapsedMs !== undefined ? (\n <>\n {yolo ? <Text dimColor>│</Text> : null}\n <Text dimColor>⏱ {fmtElapsed(elapsedMs)}</Text>\n </>\n ) : null}\n {git ? (\n <>\n {yolo || elapsedMs !== undefined ? <Text dimColor>│</Text> : null}\n <Text>\n <Text color=\"magenta\">⎇ {git.branch}</Text>\n {git.added > 0 ? <Text color=\"green\"> +{git.added}</Text> : null}\n {git.deleted > 0 ? <Text color=\"red\"> -{git.deleted}</Text> : null}\n {git.untracked > 0 ? <Text dimColor> ?{git.untracked}</Text> : null}\n </Text>\n </>\n ) : null}\n {todos && (todos.pending > 0 || todos.inProgress > 0 || todos.completed > 0) ? (\n <>\n <Text dimColor>│</Text>\n <Text>\n {todos.inProgress > 0 ? <Text color=\"yellow\">⌛ {todos.inProgress}</Text> : null}\n {todos.inProgress > 0 && (todos.pending > 0 || todos.completed > 0) ? ' ' : ''}\n {todos.pending > 0 ? <Text dimColor>☐ {todos.pending}</Text> : null}\n {todos.pending > 0 && todos.completed > 0 ? ' ' : ''}\n {todos.completed > 0 ? <Text color=\"green\">✓ {todos.completed}</Text> : null}\n </Text>\n </>\n ) : null}\n {subagentCount > 0 ? (\n <>\n <Text dimColor>│</Text>\n <Text color=\"blue\">🌐 {subagentCount} agent{subagentCount === 1 ? '' : 's'}</Text>\n </>\n ) : null}\n </Box>\n ) : null}\n </Box>\n );\n}\n\nfunction ContextChip({ ctx }: { ctx: ContextWindow }): React.ReactElement {\n const ratio = Math.max(0, Math.min(1, ctx.used / ctx.max));\n const pct = Math.round(ratio * 100);\n // Colour ramp: cool while there's plenty of headroom, warn at the\n // two-thirds mark, alarm once we're inside the last 20% — the model\n // typically starts losing the head of the conversation around there.\n const color = ratio >= 0.85 ? 'red' : ratio >= 0.65 ? 'yellow' : 'cyan';\n return (\n <Text>\n <Text dimColor>ctx </Text>\n <Text color={color}>{renderProgress(ratio, 10)}</Text>\n <Text color={color}> {pct}%</Text>\n <Text dimColor>\n {' '}\n ({fmtTok(ctx.used)}/{fmtTok(ctx.max)})\n </Text>\n </Text>\n );\n}\n\nconst FILLED = '█';\nconst EMPTY = '░';\n\n/**\n * Render a ratio 0..1 as a width-N block bar. We round to the nearest\n * cell rather than flooring so a 5% bar still shows one filled cell —\n * otherwise low-usage sessions look identical to an empty start.\n */\nexport function renderProgress(ratio: number, width: number): string {\n const clamped = Math.max(0, Math.min(1, ratio));\n const filled = clamped === 0 ? 0 : Math.max(1, Math.round(clamped * width));\n const capped = Math.min(width, filled);\n return FILLED.repeat(capped) + EMPTY.repeat(width - capped);\n}\n\nfunction fmtTok(n: number): string {\n if (n < 1000) return String(n);\n if (n < 1_000_000) return `${(n / 1000).toFixed(n < 10_000 ? 1 : 0)}k`;\n return `${(n / 1_000_000).toFixed(1)}M`;\n}\n\nexport function fmtElapsed(ms: number): string {\n const totalSec = Math.floor(ms / 1000);\n const h = Math.floor(totalSec / 3600);\n const m = Math.floor((totalSec % 3600) / 60);\n const s = totalSec % 60;\n if (h > 0) {\n return `${h}:${pad2(m)}:${pad2(s)}`;\n }\n return `${pad2(m)}:${pad2(s)}`;\n}\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nexport interface FilePickerProps {\n query: string;\n matches: string[];\n selected: number;\n}\n\nexport function FilePicker({ query, matches, selected }: FilePickerProps): React.ReactElement {\n if (matches.length === 0) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text dimColor>@{query} — no matches</Text>\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text dimColor>\n @{query || '…'} — ↑/↓ select, Enter attach, Esc cancel\n </Text>\n {matches.map((m, i) => (\n <Text key={m} color={i === selected ? 'cyan' : undefined} inverse={i === selected}>\n {i === selected ? '› ' : ' '}\n {highlight(m, query)}\n </Text>\n ))}\n </Box>\n );\n}\n\nfunction highlight(path: string, query: string): string {\n // Visual highlight is omitted for terseness; ink Text styling at char level\n // requires splitting into segments. Keep the path verbatim for now.\n return path;\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { SlashCommandMatch } from '../app.js';\n\nexport interface SlashMenuProps {\n query: string;\n matches: SlashCommandMatch[];\n selected: number;\n}\n\nexport function SlashMenu({ query, matches, selected }: SlashMenuProps): React.ReactElement {\n const placeholder = query ? `/${query}` : '/';\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text dimColor>\n {placeholder || '/'} — ↑/↓ select, Enter dispatch, Tab autocomplete, Esc close\n </Text>\n {matches.map((m, i) => (\n <Text key={m.name} color={i === selected ? 'cyan' : undefined} inverse={i === selected}>\n {i === selected ? '› ' : ' '}\n <Text bold>{m.name}</Text>\n {m.argsHint ? <Text dimColor> {m.argsHint}</Text> : null}\n <Text dimColor> — {m.description}</Text>\n </Text>\n ))}\n {matches.length === 0 && (\n <Text dimColor>No matching commands</Text>\n )}\n </Box>\n );\n}","import * as fs from 'node:fs/promises';\nimport type { Dirent } from 'node:fs';\nimport * as path from 'node:path';\n\nconst IGNORED_DIRS = new Set([\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n '.next',\n '.turbo',\n '.cache',\n 'coverage',\n '.idea',\n '.vscode',\n]);\n\nconst MAX_FILES_INDEXED = 5000;\nconst MAX_DEPTH = 8;\n\nlet cache: { root: string; files: string[]; loadedAt: number } | null = null;\nconst CACHE_TTL_MS = 30_000;\n\nasync function loadIndex(root: string): Promise<string[]> {\n const now = Date.now();\n if (cache && cache.root === root && now - cache.loadedAt < CACHE_TTL_MS) {\n return cache.files;\n }\n const files: string[] = [];\n await walk(root, '', 0, files);\n files.sort();\n cache = { root, files, loadedAt: now };\n return files;\n}\n\nasync function walk(root: string, rel: string, depth: number, out: string[]): Promise<void> {\n if (out.length >= MAX_FILES_INDEXED) return;\n if (depth > MAX_DEPTH) return;\n const dir = rel ? path.join(root, rel) : root;\n let entries: Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n if (out.length >= MAX_FILES_INDEXED) return;\n if (e.name.startsWith('.') && e.name !== '.env.example') continue;\n if (IGNORED_DIRS.has(e.name)) continue;\n const next = rel ? `${rel}/${e.name}` : e.name;\n if (e.isDirectory()) {\n await walk(root, next, depth + 1, out);\n } else if (e.isFile()) {\n out.push(next);\n }\n }\n}\n\n/**\n * Subsequence (fuzzy) match — each character of `query` must appear in `s`\n * in order. Lower scores rank earlier. Score combines:\n * - shorter match span (chars close together = better)\n * - earlier first-match offset\n * - shorter total path length\n */\nfunction score(s: string, query: string): number | null {\n if (!query) return s.length;\n const ql = query.toLowerCase();\n const sl = s.toLowerCase();\n let si = 0;\n let firstHit = -1;\n let lastHit = -1;\n for (let qi = 0; qi < ql.length; qi++) {\n const c = ql.charCodeAt(qi);\n while (si < sl.length && sl.charCodeAt(si) !== c) si++;\n if (si >= sl.length) return null;\n if (firstHit < 0) firstHit = si;\n lastHit = si;\n si++;\n }\n const span = lastHit - firstHit;\n return span * 100 + firstHit * 2 + s.length;\n}\n\nexport async function searchFiles(root: string, query: string, limit = 8): Promise<string[]> {\n const all = await loadIndex(root);\n if (!query) return all.slice(0, limit);\n const scored: { path: string; score: number }[] = [];\n for (const f of all) {\n const sc = score(f, query);\n if (sc !== null) scored.push({ path: f, score: sc });\n }\n scored.sort((a, b) => a.score - b.score);\n return scored.slice(0, limit).map((x) => x.path);\n}\n\nexport function invalidateFileCache(): void {\n cache = null;\n}\n","import { spawn } from 'node:child_process';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\n\nexport interface ClipboardImage {\n base64: string;\n mediaType: 'image/png';\n bytes: number;\n}\n\nconst MAX_IMAGE_BYTES = 10 * 1024 * 1024; // 10 MB\n\n/**\n * Read an image from the OS clipboard if one is present.\n * Returns null if no image is on the clipboard, or if the platform\n * implementation is unavailable. Throws only on unexpected I/O errors.\n */\nexport async function readClipboardImage(): Promise<ClipboardImage | null> {\n const platform = process.platform;\n if (platform === 'win32') return readWindows();\n if (platform === 'darwin') return readDarwin();\n if (platform === 'linux') return readLinux();\n return null;\n}\n\nasync function readWindows(): Promise<ClipboardImage | null> {\n // Save the clipboard image (if any) to a temp PNG via PowerShell, then\n // read the bytes back. The script prints \"OK\" or \"NO_IMAGE\" to stdout\n // so we can distinguish \"no image\" from \"powershell failure\".\n const tmp = path.join(os.tmpdir(), `wstack-clip-${Date.now()}.png`);\n const ps = [\n 'Add-Type -AssemblyName System.Windows.Forms',\n 'Add-Type -AssemblyName System.Drawing',\n '$img = [System.Windows.Forms.Clipboard]::GetImage()',\n 'if ($img -eq $null) { Write-Output \"NO_IMAGE\"; exit 0 }',\n `$img.Save('${tmp.replace(/\\\\/g, '\\\\\\\\')}', [System.Drawing.Imaging.ImageFormat]::Png)`,\n 'Write-Output \"OK\"',\n ].join('; ');\n const out = await runCmd('powershell', ['-NoProfile', '-Command', ps]);\n if (!out || out.trim() === 'NO_IMAGE') return null;\n if (!out.includes('OK')) return null;\n return readPngFile(tmp);\n}\n\nasync function readDarwin(): Promise<ClipboardImage | null> {\n // AppleScript: write clipboard image to a temp file. If the clipboard\n // doesn't hold an image, the script errors out — we treat that as \"no image\".\n const tmp = path.join(os.tmpdir(), `wstack-clip-${Date.now()}.png`);\n const script = [\n 'try',\n ` set the_file to (open for access POSIX file \"${tmp}\" with write permission)`,\n ' write (the clipboard as «class PNGf») to the_file',\n ' close access the_file',\n 'on error',\n ' try',\n ' close access POSIX file \"' + tmp + '\"',\n ' end try',\n ' return \"NO_IMAGE\"',\n 'end try',\n 'return \"OK\"',\n ].join('\\n');\n const out = await runCmd('osascript', ['-e', script]);\n if (!out || out.trim() !== 'OK') return null;\n return readPngFile(tmp);\n}\n\nasync function readLinux(): Promise<ClipboardImage | null> {\n // Try wl-paste (Wayland) first, then xclip. Both write the PNG to stdout\n // when the clipboard holds an image, and fail otherwise.\n const tmp = path.join(os.tmpdir(), `wstack-clip-${Date.now()}.png`);\n const tries: Array<[string, string[]]> = [\n ['wl-paste', ['--type', 'image/png']],\n ['xclip', ['-selection', 'clipboard', '-t', 'image/png', '-o']],\n ];\n for (const [cmd, args] of tries) {\n const ok = await runCmdToFile(cmd, args, tmp).catch(() => false);\n if (ok) return readPngFile(tmp);\n }\n return null;\n}\n\nasync function readPngFile(p: string): Promise<ClipboardImage | null> {\n try {\n const buf = await fs.readFile(p);\n if (buf.length === 0) {\n await fs.unlink(p).catch(() => undefined);\n return null;\n }\n if (buf.length > MAX_IMAGE_BYTES) {\n await fs.unlink(p).catch(() => undefined);\n throw new Error(`Clipboard image exceeds ${MAX_IMAGE_BYTES / 1024 / 1024}MB limit`);\n }\n // Sanity check: PNG magic bytes.\n if (\n buf[0] !== 0x89 ||\n buf[1] !== 0x50 ||\n buf[2] !== 0x4e ||\n buf[3] !== 0x47\n ) {\n await fs.unlink(p).catch(() => undefined);\n return null;\n }\n await fs.unlink(p).catch(() => undefined);\n return { base64: buf.toString('base64'), mediaType: 'image/png', bytes: buf.length };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n}\n\nfunction runCmd(cmd: string, args: string[]): Promise<string | null> {\n return new Promise((resolve) => {\n const child = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n let out = '';\n child.stdout.on('data', (c) => (out += String(c)));\n child.on('error', () => resolve(null));\n child.on('exit', (code) => resolve(code === 0 ? out : null));\n });\n}\n\nfunction runCmdToFile(cmd: string, args: string[], outPath: string): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n const chunks: Buffer[] = [];\n child.stdout.on('data', (c: Buffer) => chunks.push(c));\n child.on('error', () => resolve(false));\n child.on('exit', async (code) => {\n if (code !== 0 || chunks.length === 0) return resolve(false);\n try {\n await fs.writeFile(outPath, Buffer.concat(chunks));\n resolve(true);\n } catch {\n resolve(false);\n }\n });\n });\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { QueueItem } from './app.js';\n\n/**\n * Dependencies the `/queue` command needs from the App. The TUI registers\n * the command at mount time with closures over `getQueue` (reads the latest\n * queue snapshot via a ref) and the three mutators. The command returns\n * its output as `{ message }` which the App pipes into history as `info`.\n */\nexport interface QueueSlashDeps {\n getQueue: () => QueueItem[];\n clear: () => void;\n deleteAt: (positions: number[]) => void;\n}\n\nconst USAGE =\n 'Usage:\\n' +\n ' /queue — list pending messages\\n' +\n ' /queue list — same as /queue\\n' +\n ' /queue clear — drop all pending messages\\n' +\n ' /queue delete N M… — drop messages at 1-based positions';\n\nexport function createQueueSlashCommand(deps: QueueSlashDeps): SlashCommand {\n return {\n name: 'queue',\n description: 'List, clear, or delete pending messages typed while the agent was running.',\n async run(args) {\n const out = handleQueueCommand(args, deps);\n return { message: out };\n },\n };\n}\n\n/**\n * Pure logic for the /queue command. Exported separately so tests can\n * drive it without spinning up Ink.\n */\nexport function handleQueueCommand(args: string, deps: QueueSlashDeps): string {\n const trimmed = args.trim();\n const [sub, ...rest] = trimmed.split(/\\s+/);\n const subcommand = sub?.toLowerCase() ?? '';\n\n if (subcommand === '' || subcommand === 'list') {\n return renderList(deps.getQueue());\n }\n\n if (subcommand === 'clear') {\n const before = deps.getQueue().length;\n if (before === 0) return 'Queue is already empty.';\n deps.clear();\n return `Cleared ${before} queued message${before === 1 ? '' : 's'}.`;\n }\n\n if (subcommand === 'delete' || subcommand === 'del' || subcommand === 'rm') {\n if (rest.length === 0) return 'Usage: /queue delete <position> [<position>…]';\n const queue = deps.getQueue();\n if (queue.length === 0) return 'Queue is empty — nothing to delete.';\n const parsed: number[] = [];\n const invalid: string[] = [];\n const outOfRange: number[] = [];\n for (const tok of rest) {\n if (!/^\\d+$/.test(tok)) {\n invalid.push(tok);\n continue;\n }\n const n = Number.parseInt(tok, 10);\n if (n < 1 || n > queue.length) {\n outOfRange.push(n);\n continue;\n }\n parsed.push(n);\n }\n const uniqueValid = [...new Set(parsed)];\n if (uniqueValid.length === 0) {\n const parts = ['No valid positions to delete.'];\n if (invalid.length > 0) parts.push(`Invalid: ${invalid.join(', ')}.`);\n if (outOfRange.length > 0) parts.push(`Out of range (queue has ${queue.length}): ${outOfRange.join(', ')}.`);\n return parts.join(' ');\n }\n deps.deleteAt(uniqueValid);\n const parts = [\n `Deleted ${uniqueValid.length} of ${queue.length} (positions ${uniqueValid.sort((a, b) => a - b).join(', ')}).`,\n ];\n if (invalid.length > 0) parts.push(`Ignored invalid: ${invalid.join(', ')}.`);\n if (outOfRange.length > 0) parts.push(`Ignored out of range: ${outOfRange.join(', ')}.`);\n return parts.join(' ');\n }\n\n return `Unknown subcommand \"${sub}\".\\n${USAGE}`;\n}\n\nfunction renderList(queue: QueueItem[]): string {\n if (queue.length === 0) return 'Queue is empty.';\n const lines = [`Queue (${queue.length}):`];\n for (let i = 0; i < queue.length; i++) {\n const item = queue[i];\n if (!item) continue;\n const preview = oneLine(item.displayText, 100);\n lines.push(` ${i + 1}. ${preview}`);\n }\n return lines.join('\\n');\n}\n\nfunction oneLine(s: string, max: number): string {\n const collapsed = s.replace(/\\s+/g, ' ').trim();\n return collapsed.length <= max ? collapsed : `${collapsed.slice(0, max - 1)}…`;\n}\n","import { spawn } from 'node:child_process';\n\nexport interface GitInfo {\n branch: string;\n /** Total lines added in working tree vs HEAD (staged + unstaged). */\n added: number;\n /** Total lines deleted in working tree vs HEAD (staged + unstaged). */\n deleted: number;\n /** Count of untracked files in the working tree. */\n untracked: number;\n}\n\n/**\n * Read git branch + change summary for the given cwd. Returns `null`\n * when the directory isn't a git repository or git isn't installed —\n * the status bar just hides the git chip in that case.\n *\n * Spawns two short-lived `git` processes in parallel. Cheap enough to\n * call on a 3–5 second interval; the caller is responsible for the\n * cadence (this function is purely fire-and-result).\n */\nexport async function readGitInfo(cwd: string): Promise<GitInfo | null> {\n const [branchRes, numstatRes, statusRes] = await Promise.all([\n runGit(cwd, ['branch', '--show-current']),\n runGit(cwd, ['diff', 'HEAD', '--numstat']),\n runGit(cwd, ['status', '--porcelain']),\n ]);\n\n // If any of the three failed with a non-zero exit OR git wasn't\n // found, we're not in a repo (or git is missing) — bail entirely.\n if (!branchRes.ok || !numstatRes.ok || !statusRes.ok) return null;\n\n const branch = branchRes.stdout.trim();\n // Detached HEAD: `branch --show-current` returns empty. Render the\n // short SHA instead so the chip isn't blank.\n const branchLabel = branch || (await detachedShortSha(cwd)) || 'detached';\n\n let added = 0;\n let deleted = 0;\n for (const line of numstatRes.stdout.split('\\n')) {\n if (!line) continue;\n const [a, d] = line.split('\\t');\n // Binary files report '-' for both columns — skip them.\n if (a && a !== '-') added += Number.parseInt(a, 10) || 0;\n if (d && d !== '-') deleted += Number.parseInt(d, 10) || 0;\n }\n\n let untracked = 0;\n for (const line of statusRes.stdout.split('\\n')) {\n if (line.startsWith('?? ')) untracked++;\n }\n\n return { branch: branchLabel, added, deleted, untracked };\n}\n\nasync function detachedShortSha(cwd: string): Promise<string | null> {\n const res = await runGit(cwd, ['rev-parse', '--short', 'HEAD']);\n return res.ok ? res.stdout.trim() : null;\n}\n\ninterface GitResult {\n ok: boolean;\n stdout: string;\n}\n\nfunction runGit(cwd: string, args: string[]): Promise<GitResult> {\n return new Promise((resolve) => {\n let stdout = '';\n try {\n const child = spawn('git', args, {\n cwd,\n // Inherit stderr (silent) — we don't care about git's noise.\n stdio: ['ignore', 'pipe', 'ignore'],\n // Don't let a slow git hang the TUI.\n timeout: 3000,\n windowsHide: true,\n });\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk: string) => {\n stdout += chunk;\n });\n child.on('error', () => resolve({ ok: false, stdout: '' }));\n child.on('close', (code) => {\n resolve({ ok: code === 0, stdout });\n });\n } catch {\n resolve({ ok: false, stdout: '' });\n }\n });\n}\n","import React, { useEffect, useMemo, useReducer, useRef } from 'react';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { Box, useApp } from 'ink';\nimport type {\n Agent,\n AttachmentStore,\n ContentBlock,\n EventBus,\n QueueStore,\n SlashCommandRegistry,\n TokenCounter,\n} from '@wrongstack/core';\nimport { InputBuilder } from '@wrongstack/core';\nimport { History, type HistoryEntry } from './components/history.js';\nimport { Input, type KeyEvent } from './components/input.js';\nimport { StatusBar } from './components/status-bar.js';\nimport { FilePicker } from './components/file-picker.js';\nimport { SlashMenu } from './components/slash-menu.js';\nimport { searchFiles } from './file-search.js';\nimport { readClipboardImage } from './clipboard.js';\nimport { createQueueSlashCommand } from './queue-slash.js';\nimport { readGitInfo, type GitInfo } from './git-info.js';\n\nexport interface QueueItem {\n id: number;\n displayText: string;\n blocks: ContentBlock[];\n}\n\n/** A registered slash command matched against the user's current / query. */\nexport interface SlashCommandMatch {\n name: string;\n description: string;\n argsHint?: string;\n isBuiltin: boolean;\n}\n\nexport interface AppProps {\n agent: Agent;\n slashRegistry: SlashCommandRegistry;\n attachments: AttachmentStore;\n events: EventBus;\n tokenCounter?: TokenCounter;\n model: string;\n banner?: boolean;\n /** Persists the queue across crashes; rehydrated on mount, written on every mutation. */\n queueStore?: QueueStore;\n /** Reflects the policy's --yolo flag for the status bar's \"⚠ YOLO\" chip. */\n yolo?: boolean;\n /** Surfaced in the startup banner. Falls back to \"dev\" when omitted. */\n appVersion?: string;\n /** Provider id shown in the banner (\"openai\", \"anthropic\", …). Defaults to \"agent\". */\n provider?: string;\n /**\n * Real max-context token budget for the *active model*, resolved by the\n * CLI via the ModelsRegistry. The provider object only knows its family\n * default (e.g. anthropic = 200k) which is wrong for variants like the\n * 1M-context Opus model. The status bar's context chip uses this when\n * provided and falls back to the provider baseline otherwise.\n */\n effectiveMaxContext?: number;\n onExit: (code: number) => void;\n}\n\ntype DraftEntry = HistoryEntry extends infer T\n ? T extends { id: number }\n ? Omit<T, 'id'>\n : never\n : never;\n\ntype State = {\n entries: HistoryEntry[];\n buffer: string;\n cursor: number;\n placeholders: string[];\n streamingText: string;\n status: 'idle' | 'running' | 'streaming' | 'aborting';\n interrupts: number;\n hint: string;\n nextId: number;\n picker: { open: boolean; query: string; matches: string[]; selected: number };\n /** Slash command picker — open while typing a / command. */\n slashPicker: { open: boolean; query: string; matches: SlashCommandMatch[]; selected: number };\n /** Tool calls currently in-flight, by tool_use id. Surface in the status bar. */\n runningTools: Map<string, { name: string; startedAt: number }>;\n /** FIFO of user messages typed while the agent was running. Drained when idle. */\n queue: QueueItem[];\n nextQueueId: number;\n /** Previous input strings for up/down navigation. */\n inputHistory: string[];\n /** 0 = current buffer (not in history), 1 = most recent, n = nth most recent. */\n historyIndex: number;\n};\n\ntype Action =\n | { type: 'addEntry'; entry: DraftEntry }\n | { type: 'setBuffer'; buffer: string; cursor: number }\n | { type: 'addPlaceholder'; ph: string }\n | { type: 'clearInput' }\n | { type: 'streamDelta'; delta: string }\n | { type: 'streamReset' }\n | { type: 'status'; status: State['status'] }\n | { type: 'interrupt' }\n | { type: 'resetInterrupts' }\n | { type: 'hint'; text: string }\n | { type: 'pickerOpen'; query: string }\n | { type: 'pickerClose' }\n | { type: 'pickerSetMatches'; query: string; matches: string[] }\n | { type: 'pickerMove'; delta: number }\n | { type: 'toolStarted'; id: string; name: string }\n | { type: 'toolEnded'; id?: string; name?: string }\n | { type: 'enqueue'; item: Omit<QueueItem, 'id'> }\n | { type: 'dequeueFirst' }\n | { type: 'queueClear' }\n | { type: 'queueDelete'; positions: number[] }\n | { type: 'slashPickerOpen'; query: string; matches: SlashCommandMatch[] }\n | { type: 'slashPickerClose' }\n | { type: 'slashPickerMove'; delta: number }\n | { type: 'historyPush'; text: string }\n | { type: 'historyUp' }\n | { type: 'historyDown' };\n\nexport function reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'addEntry': {\n // Append-only. We render finalized entries via Ink's <Static>,\n // which forbids removals or reordering — old items live on in the\n // terminal's native scrollback. Memory growth is bounded by the\n // terminal's own scrollback limits in practice.\n const appended = [\n ...state.entries,\n { ...action.entry, id: state.nextId } as HistoryEntry,\n ];\n return { ...state, entries: appended, nextId: state.nextId + 1 };\n }\n case 'setBuffer':\n return { ...state, buffer: action.buffer, cursor: action.cursor };\n case 'addPlaceholder':\n return { ...state, placeholders: [...state.placeholders, action.ph] };\n case 'clearInput':\n return {\n ...state,\n buffer: '',\n cursor: 0,\n placeholders: [],\n picker: { open: false, query: '', matches: [], selected: 0 },\n slashPicker: { open: false, query: '', matches: [], selected: 0 },\n };\n case 'streamDelta':\n return { ...state, streamingText: state.streamingText + action.delta };\n case 'streamReset':\n return { ...state, streamingText: '' };\n case 'status':\n return { ...state, status: action.status };\n case 'interrupt':\n return { ...state, interrupts: state.interrupts + 1 };\n case 'resetInterrupts':\n return { ...state, interrupts: 0 };\n case 'hint':\n return { ...state, hint: action.text };\n case 'pickerOpen':\n return {\n ...state,\n picker: { open: true, query: action.query, matches: state.picker.matches, selected: 0 },\n };\n case 'pickerClose':\n return {\n ...state,\n picker: { open: false, query: '', matches: [], selected: 0 },\n };\n case 'pickerSetMatches':\n // Guard against stale async results — only apply if query still matches.\n if (!state.picker.open || state.picker.query !== action.query) return state;\n return {\n ...state,\n picker: {\n ...state.picker,\n matches: action.matches,\n selected: Math.min(state.picker.selected, Math.max(0, action.matches.length - 1)),\n },\n };\n case 'pickerMove': {\n const n = state.picker.matches.length;\n if (n === 0) return state;\n const next = (state.picker.selected + action.delta + n) % n;\n return { ...state, picker: { ...state.picker, selected: next } };\n }\n case 'toolStarted': {\n const next = new Map(state.runningTools);\n next.set(action.id, { name: action.name, startedAt: Date.now() });\n return { ...state, runningTools: next };\n }\n case 'toolEnded': {\n const next = new Map(state.runningTools);\n if (action.id !== undefined && next.has(action.id)) {\n next.delete(action.id);\n return { ...state, runningTools: next };\n }\n if (action.name !== undefined) {\n // Fall back to clearing the oldest running entry with this name —\n // `tool.executed` doesn't carry the tool_use id, so we approximate.\n for (const [id, info] of next) {\n if (info.name === action.name) {\n next.delete(id);\n return { ...state, runningTools: next };\n }\n }\n }\n return state;\n }\n case 'enqueue': {\n const item: QueueItem = { ...action.item, id: state.nextQueueId };\n return {\n ...state,\n queue: [...state.queue, item],\n nextQueueId: state.nextQueueId + 1,\n };\n }\n case 'dequeueFirst': {\n if (state.queue.length === 0) return state;\n return { ...state, queue: state.queue.slice(1) };\n }\n case 'queueClear': {\n if (state.queue.length === 0) return state;\n return { ...state, queue: [] };\n }\n case 'queueDelete': {\n if (state.queue.length === 0 || action.positions.length === 0) return state;\n // Positions are 1-based; convert to 0-based set for fast filtering.\n const drop = new Set(action.positions.map((p) => p - 1).filter((i) => i >= 0));\n const filtered = state.queue.filter((_, i) => !drop.has(i));\n if (filtered.length === state.queue.length) return state;\n return { ...state, queue: filtered };\n }\n case 'slashPickerOpen':\n return {\n ...state,\n slashPicker: { open: true, query: action.query, matches: action.matches, selected: 0 },\n };\n case 'slashPickerClose':\n return {\n ...state,\n slashPicker: { open: false, query: '', matches: [], selected: 0 },\n };\n case 'slashPickerMove': {\n const n = state.slashPicker.matches.length;\n if (n === 0) return state;\n const next = (state.slashPicker.selected + action.delta + n) % n;\n return { ...state, slashPicker: { ...state.slashPicker, selected: next } };\n }\n case 'historyPush': {\n if (action.text === '' || action.text === state.inputHistory[0]) return state;\n return { ...state, inputHistory: [action.text, ...state.inputHistory].slice(0, 100) };\n }\n case 'historyUp': {\n if (state.inputHistory.length === 0) return state;\n const next = Math.min(state.historyIndex + 1, state.inputHistory.length);\n const entry = state.inputHistory[next - 1] ?? '';\n return { ...state, historyIndex: next, buffer: entry, cursor: entry.length };\n }\n case 'historyDown': {\n if (state.historyIndex === 0) return state;\n const next = state.historyIndex - 1;\n const entry = next === 0 ? '' : (state.inputHistory[next - 1] ?? '');\n return { ...state, historyIndex: next, buffer: entry, cursor: entry.length };\n }\n }\n}\n\nconst PASTE_THRESHOLD_CHARS = 200;\n\nexport function App({\n agent,\n slashRegistry,\n attachments,\n events,\n tokenCounter,\n model,\n banner = true,\n queueStore,\n yolo = false,\n appVersion,\n provider,\n effectiveMaxContext,\n onExit,\n}: AppProps): React.ReactElement {\n const { exit } = useApp();\n const [state, dispatch] = useReducer(reducer, {\n entries: banner\n ? [\n {\n id: 0,\n kind: 'banner' as const,\n version: appVersion ?? 'dev',\n provider: provider ?? 'agent',\n model,\n cwd: agent.ctx.cwd,\n },\n ]\n : [],\n buffer: '',\n cursor: 0,\n placeholders: [],\n streamingText: '',\n status: 'idle' as const,\n interrupts: 0,\n hint: '',\n nextId: 1,\n picker: { open: false, query: '', matches: [], selected: 0 },\n slashPicker: { open: false, query: '', matches: [], selected: 0 },\n runningTools: new Map(),\n queue: [],\n nextQueueId: 1,\n inputHistory: [],\n historyIndex: 0,\n });\n\n const builderRef = useRef<InputBuilder | null>(null);\n if (builderRef.current === null) {\n builderRef.current = new InputBuilder({ store: attachments });\n }\n\n const activeCtrlRef = useRef<AbortController | null>(null);\n const projectRoot = agent.ctx.projectRoot;\n\n // Source of truth for the streamed assistant text — kept here, not in\n // React state, because we need to read it synchronously when `agent.run`\n // returns. The React `streamingText` shown in the live tail is throttled\n // (~10fps) for redraw cost, so it can lag the actual stream by up to\n // FLUSH_MS. Reading from this ref instead removes the race where the\n // final chunk lands in pending after run() returns and ends up flashing\n // into the next frame's tail (leaking into scrollback).\n const streamingTextRef = useRef('');\n const pendingDeltaRef = useRef('');\n const flushTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Latest state snapshot — async callbacks (the queue drainer, slash command\n // closures) read this instead of capturing `state` to avoid stale closures.\n const stateRef = useRef<State>(state);\n stateRef.current = state;\n\n // Session-elapsed clock. Mount time is fixed; we re-render once per\n // second to refresh the \"⏱ 12:34\" chip. The interval is cheap — one\n // dispatch per tick into the same `tick` action — and stops cleanly\n // on unmount.\n const startedAtRef = useRef<number>(Date.now());\n const [nowTick, setNowTick] = React.useState<number>(Date.now());\n useEffect(() => {\n const t = setInterval(() => setNowTick(Date.now()), 1000);\n return () => clearInterval(t);\n }, []);\n const elapsedMs = nowTick - startedAtRef.current;\n\n // Git branch + change counts. Polled every 5s (cheap, two short-lived\n // `git` subprocesses). Skipped silently when the cwd isn't a repo or\n // git isn't installed — the chip just doesn't render.\n const [gitInfo, setGitInfo] = React.useState<GitInfo | null>(null);\n useEffect(() => {\n let cancelled = false;\n const refresh = () => {\n readGitInfo(agent.ctx.cwd)\n .then((info) => {\n if (!cancelled) setGitInfo(info);\n })\n .catch(() => undefined);\n };\n refresh();\n const t = setInterval(refresh, 5000);\n return () => {\n cancelled = true;\n clearInterval(t);\n };\n }, [agent.ctx.cwd]);\n\n // Latest provider request's input-token count. Tracked separately\n // from `tokenCounter` (which is cumulative) because for the context\n // fullness bar we want the live size of the conversation as it sat\n // on the wire — that's what determines how close we are to the\n // model's max context window.\n const [lastInputTokens, setLastInputTokens] = React.useState<number>(0);\n useEffect(() => {\n const off = events.on('provider.response', (e) => {\n setLastInputTokens(e.usage.input);\n });\n return () => {\n off();\n };\n }, [events]);\n\n // Prefer the CLI-resolved per-model maxContext (looks up the active\n // model in the ModelsRegistry, so 1M-context variants report 1M rather\n // than the provider family's 200k baseline). Fall back to the provider\n // baseline when the CLI couldn't resolve it (e.g. unknown model id).\n const maxContext = effectiveMaxContext ?? agent.ctx.provider.capabilities.maxContext;\n const contextWindow = useMemo(\n () =>\n lastInputTokens > 0 && maxContext > 0\n ? { used: lastInputTokens, max: maxContext }\n : undefined,\n [lastInputTokens, maxContext],\n );\n\n // Todo counts come from the agent's context, which is mutated by\n // the `todo` tool. Re-read on each render — array access is O(N) on\n // a list that's typically < 20 items.\n const todos = useMemo(() => {\n const counts = { pending: 0, inProgress: 0, completed: 0 };\n for (const t of agent.ctx.todos) {\n if (t.status === 'pending') counts.pending++;\n else if (t.status === 'in_progress') counts.inProgress++;\n else if (t.status === 'completed') counts.completed++;\n }\n return counts;\n // Tick on `nowTick` so we pick up todo changes even though\n // agent.ctx.todos isn't React state — the 1s clock doubles as a\n // poll for ctx-side state.\n }, [nowTick, agent.ctx.todos]);\n\n // Detect an active `@<query>` token at the cursor and drive the picker.\n // Reruns whenever buffer/cursor changes — guards against stale results.\n useEffect(() => {\n const detected = detectAtToken(state.buffer, state.cursor);\n if (!detected) {\n if (state.picker.open) dispatch({ type: 'pickerClose' });\n return;\n }\n if (!state.picker.open || state.picker.query !== detected.query) {\n dispatch({ type: 'pickerOpen', query: detected.query });\n }\n let cancelled = false;\n searchFiles(projectRoot, detected.query, 8)\n .then((matches) => {\n if (!cancelled) {\n dispatch({ type: 'pickerSetMatches', query: detected.query, matches });\n }\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.buffer, state.cursor, projectRoot]);\n\n // Detect an active `/<query>` token at the cursor and drive the slash picker.\n useEffect(() => {\n const trimmed = state.buffer.trimStart();\n if (!trimmed.startsWith('/')) {\n if (state.slashPicker.open) dispatch({ type: 'slashPickerClose' });\n return;\n }\n // Once any whitespace appears after the leading '/', the user has moved\n // past the command name into argument territory (e.g. `/model glm-5.1`).\n // Keeping the picker open here is actively harmful: Enter would route to\n // acceptSlashPickerSelection() and overwrite the typed args with just\n // `/<cmd> `. Close the picker so Enter submits the full line.\n if (/\\s/.test(trimmed)) {\n if (state.slashPicker.open) dispatch({ type: 'slashPickerClose' });\n return;\n }\n const query = trimmed.slice(1).toLowerCase();\n const allCommands = slashRegistry.listWithOwner();\n const matches: SlashCommandMatch[] = allCommands\n .filter(({ cmd }) => {\n const name = cmd.name.toLowerCase();\n const aliases = cmd.aliases ?? [];\n return name.includes(query) || aliases.some((a) => a.toLowerCase().includes(query));\n })\n .slice(0, 12)\n .map(({ cmd, owner }) => ({\n name: cmd.name,\n description: cmd.description,\n argsHint: undefined as string | undefined,\n isBuiltin: owner === 'core',\n }));\n\n if (!state.slashPicker.open) {\n dispatch({ type: 'slashPickerOpen', query, matches });\n } else if (state.slashPicker.query !== query) {\n dispatch({ type: 'slashPickerOpen', query, matches });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.buffer, slashRegistry]);\n\n const pasteClipboardImage = async (): Promise<void> => {\n const builder = builderRef.current;\n if (!builder) return;\n try {\n const img = await readClipboardImage();\n if (!img) {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'info', text: 'No image on the clipboard.' },\n });\n return;\n }\n const placeholder = await builder.appendImage(img.base64, img.mediaType);\n const kb = (img.bytes / 1024).toFixed(0);\n dispatch({ type: 'addPlaceholder', ph: `${placeholder} (PNG ${kb}KB)` });\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'error',\n text: `Clipboard image error: ${err instanceof Error ? err.message : String(err)}`,\n },\n });\n }\n };\n\n const acceptPickerSelection = async (): Promise<void> => {\n const { open, matches, selected } = state.picker;\n if (!open || matches.length === 0) return;\n const picked = matches[selected];\n if (!picked) return;\n const builder = builderRef.current;\n if (!builder) return;\n\n // Find the @-token span we're replacing.\n const tok = detectAtToken(state.buffer, state.cursor);\n if (!tok) {\n dispatch({ type: 'pickerClose' });\n return;\n }\n\n // Attach the file via the builder. The builder appends \"[file #N]\" to its\n // own display string, but we want to put the placeholder inline in the\n // visible buffer (replacing @query) so the user sees it.\n const absPath = path.isAbsolute(picked) ? picked : path.join(projectRoot, picked);\n try {\n const data = await fs.readFile(absPath, 'utf8');\n const placeholder = await builder.appendFile({\n kind: 'file',\n data,\n meta: { filename: picked, label: picked },\n });\n const before = state.buffer.slice(0, tok.start);\n const after = state.buffer.slice(tok.end);\n const next = `${before}${placeholder}${after}`;\n dispatch({\n type: 'setBuffer',\n buffer: next,\n cursor: tok.start + placeholder.length,\n });\n dispatch({ type: 'pickerClose' });\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'error', text: `Attach failed: ${err instanceof Error ? err.message : String(err)}` },\n });\n dispatch({ type: 'pickerClose' });\n }\n };\n\n /** Fill the buffer with the selected slash command and close the picker. */\n const acceptSlashPickerSelection = (): void => {\n const { open, matches, selected } = state.slashPicker;\n if (!open || matches.length === 0) return;\n const picked = matches[selected];\n if (!picked) return;\n const cmd = picked.argsHint !== undefined ? `/${picked.name} ` : `/${picked.name}`;\n dispatch({ type: 'setBuffer', buffer: cmd, cursor: cmd.length });\n dispatch({ type: 'slashPickerClose' });\n };\n\n // Rehydrate any queue items persisted by a previous (crashed) run.\n // Fires once at mount; the persist effect below picks up afterwards.\n // We dispatch one enqueue per item so the reducer's id allocation\n // stays the single source of truth — no need to import its internals.\n useEffect(() => {\n if (!queueStore) return;\n let cancelled = false;\n queueStore\n .read()\n .then((items) => {\n if (cancelled || items.length === 0) return;\n for (const item of items) {\n dispatch({\n type: 'enqueue',\n item: { displayText: item.displayText, blocks: item.blocks },\n });\n }\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'info',\n text: `Restored ${items.length} queued message${items.length === 1 ? '' : 's'} from a previous run.`,\n },\n });\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [queueStore]);\n\n // Persist the queue snapshot on every change. Strip the in-memory id\n // before writing — it's render bookkeeping, not part of the message.\n // Errors are swallowed: the queue lives in memory regardless, so a\n // persistence failure only loses crash-recovery, not the queue itself.\n useEffect(() => {\n if (!queueStore) return;\n queueStore\n .write(state.queue.map(({ displayText, blocks }) => ({ displayText, blocks })))\n .catch(() => undefined);\n }, [state.queue, queueStore]);\n\n // Register the TUI-only /queue command for the lifetime of this App.\n useEffect(() => {\n const cmd = createQueueSlashCommand({\n getQueue: () => stateRef.current.queue,\n clear: () => dispatch({ type: 'queueClear' }),\n deleteAt: (positions) => dispatch({ type: 'queueDelete', positions }),\n });\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('queue');\n };\n }, [slashRegistry]);\n\n // Subscribe to provider streaming events.\n useEffect(() => {\n // Throttle stream delta DISPATCHES to reduce flicker — we batch into\n // React state at ~10fps. The full text is also written into\n // streamingTextRef synchronously on every delta, so `runBlocks` can\n // read the complete stream when `agent.run` returns without racing\n // the throttle's last unflushed batch.\n const FLUSH_MS = 100;\n const flush = () => {\n if (pendingDeltaRef.current) {\n dispatch({ type: 'streamDelta', delta: pendingDeltaRef.current });\n pendingDeltaRef.current = '';\n }\n flushTimerRef.current = null;\n };\n const offDelta = events.on('provider.text_delta', (e) => {\n // Strip any bracketed-paste DCS sequences that some providers echo\n // into the stream. They are invisible in a real terminal but appear as\n // junk text if Ink's raw rendering catches them.\n const text = e.text.replace(/\\x1b\\[200~|\\x1b\\[201~/g, '');\n streamingTextRef.current += text;\n pendingDeltaRef.current += text;\n if (!flushTimerRef.current) flushTimerRef.current = setTimeout(flush, FLUSH_MS);\n });\n const offToolStart = events.on('tool.started', (e) => {\n dispatch({ type: 'toolStarted', id: e.id, name: e.name });\n });\n const offTool = events.on('tool.executed', (e) => {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'tool',\n name: e.name,\n durationMs: e.durationMs,\n ok: e.ok,\n input: e.input,\n output: e.output,\n },\n });\n // `tool.executed` has no tool_use id; the reducer falls back to\n // clearing the oldest running entry that matches this name.\n dispatch({ type: 'toolEnded', name: e.name });\n });\n const offRetry = events.on('provider.retry', (e) => {\n const secs = (e.delayMs / 1000).toFixed(e.delayMs >= 1000 ? 1 : 2);\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: `⟳ retry ${e.attempt} in ${secs}s — ${e.description}` },\n });\n });\n const offProvErr = events.on('provider.error', (e) => {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'error', text: e.description },\n });\n });\n return () => {\n offDelta();\n offToolStart();\n offTool();\n offRetry();\n offProvErr();\n if (flushTimerRef.current) clearTimeout(flushTimerRef.current);\n };\n }, [events]);\n\n // Handle SIGINT: first cancels current iteration, second exits.\n useEffect(() => {\n const onSigint = () => {\n if (state.interrupts >= 1 && state.status === 'idle') {\n exit();\n onExit(130);\n return;\n }\n dispatch({ type: 'interrupt' });\n if (activeCtrlRef.current) {\n activeCtrlRef.current.abort();\n dispatch({ type: 'status', status: 'aborting' });\n const droppedCount = stateRef.current.queue.length;\n if (droppedCount > 0) {\n dispatch({ type: 'queueClear' });\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'warn',\n text: `Iteration cancelled. Dropped ${droppedCount} queued message${droppedCount === 1 ? '' : 's'}. Press Ctrl+C again to exit.`,\n },\n });\n } else {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: 'Iteration cancelled. Press Ctrl+C again to exit.' },\n });\n }\n } else {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: 'Press Ctrl+C again to exit.' },\n });\n }\n };\n process.on('SIGINT', onSigint);\n return () => {\n process.off('SIGINT', onSigint);\n };\n }, [state.interrupts, state.status, exit, onExit]);\n\n const handleKey = async (input: string, key: KeyEvent) => {\n // Note: we no longer block input while the agent is running. Enter\n // routes through the queue when busy (see submit()), but typing,\n // backspace, paste, and clipboard-image all stay live.\n if (state.status === 'aborting') return;\n\n // IMPORTANT: do NOT bail on `!input` here. Special keys (arrows,\n // Enter, Escape, Tab, Backspace) arrive with an empty `input`\n // string, and the slash/file pickers + cursor movement below all\n // depend on receiving those events. The late guard before text\n // insertion handles the empty-input case correctly.\n\n if (state.slashPicker.open) {\n if (key.escape) {\n dispatch({ type: 'slashPickerClose' });\n return;\n }\n if (key.upArrow) {\n dispatch({ type: 'slashPickerMove', delta: -1 });\n return;\n }\n if (key.downArrow) {\n dispatch({ type: 'slashPickerMove', delta: 1 });\n return;\n }\n if (key.return) {\n await acceptSlashPickerSelection();\n return;\n }\n // Tab → autocomplete with selected command\n if (key.tab && state.slashPicker.matches.length > 0) {\n const sel = state.slashPicker.matches[state.slashPicker.selected];\n if (sel) {\n dispatch({ type: 'setBuffer', buffer: `/${sel.name} `, cursor: sel.name.length + 2 });\n dispatch({ type: 'slashPickerClose' });\n }\n return;\n }\n // Any other key falls through to normal text handling.\n }\n\n // Picker takes precedence over normal input handling when open.\n if (state.picker.open) {\n if (key.escape) {\n dispatch({ type: 'pickerClose' });\n return;\n }\n if (key.upArrow) {\n dispatch({ type: 'pickerMove', delta: -1 });\n return;\n }\n if (key.downArrow) {\n dispatch({ type: 'pickerMove', delta: 1 });\n return;\n }\n if (key.return) {\n await acceptPickerSelection();\n return;\n }\n // Any other key falls through to normal text handling, which will\n // either extend the @-query (e.g. typing more chars) or break it\n // (e.g. typing a space) — handled below.\n }\n\n if (key.return) {\n await submit();\n return;\n }\n\n if (key.backspace || key.delete) {\n if (key.ctrl) {\n const { cursor, buffer } = state;\n if (key.backspace) {\n if (cursor === 0) return;\n const beforeCursor = buffer.slice(0, cursor);\n const lastWordStart = beforeCursor.lastIndexOf(' ') + 1;\n const next = buffer.slice(0, lastWordStart) + buffer.slice(cursor);\n dispatch({ type: 'setBuffer', buffer: next, cursor: lastWordStart });\n } else {\n if (cursor >= buffer.length) return;\n const afterCursor = buffer.slice(cursor);\n const nextWordStart = afterCursor.indexOf(' ');\n const end = nextWordStart === -1 ? buffer.length : cursor + nextWordStart + 1;\n const next = buffer.slice(0, cursor) + buffer.slice(end);\n dispatch({ type: 'setBuffer', buffer: next, cursor });\n }\n return;\n }\n if (state.cursor === 0) return;\n const next = state.buffer.slice(0, state.cursor - 1) + state.buffer.slice(state.cursor);\n dispatch({ type: 'setBuffer', buffer: next, cursor: state.cursor - 1 });\n return;\n }\n\n if (key.leftArrow) {\n if (key.ctrl) {\n const { cursor, buffer } = state;\n if (cursor === 0) return;\n const beforeCursor = buffer.slice(0, cursor);\n const prevWordStart = beforeCursor.lastIndexOf(' ');\n const target = prevWordStart === -1 ? 0 : prevWordStart + 1;\n dispatch({ type: 'setBuffer', buffer, cursor: target });\n return;\n }\n if (state.cursor > 0) dispatch({ type: 'setBuffer', buffer: state.buffer, cursor: state.cursor - 1 });\n return;\n }\n if (key.rightArrow) {\n if (key.ctrl) {\n const { cursor, buffer } = state;\n if (cursor >= buffer.length) return;\n const afterCursor = buffer.slice(cursor);\n const nextWordStart = afterCursor.indexOf(' ');\n const target = nextWordStart === -1 ? buffer.length : cursor + nextWordStart + 1;\n dispatch({ type: 'setBuffer', buffer, cursor: target });\n return;\n }\n if (state.cursor < state.buffer.length) dispatch({ type: 'setBuffer', buffer: state.buffer, cursor: state.cursor + 1 });\n return;\n }\n // History scrolling is delegated to the terminal's native scrollback\n // (mouse wheel, Shift+PgUp in Windows Terminal, etc.) — Ink's <Static>\n // emits each finalized entry once and never repaints over it.\n if (key.upArrow) {\n if (state.inputHistory.length > 0) dispatch({ type: 'historyUp' });\n return;\n }\n if (key.downArrow) {\n if (state.historyIndex > 0) dispatch({ type: 'historyDown' });\n return;\n }\n if (key.ctrl && input === 'a') {\n dispatch({ type: 'setBuffer', buffer: state.buffer, cursor: 0 });\n return;\n }\n if (key.ctrl && input === 'e') {\n dispatch({ type: 'setBuffer', buffer: state.buffer, cursor: state.buffer.length });\n return;\n }\n if (key.ctrl && input === 'u') {\n dispatch({ type: 'setBuffer', buffer: '', cursor: 0 });\n return;\n }\n if (key.ctrl && input === 'w') {\n // Ctrl+W → delete word before cursor (same as Ctrl+Backspace).\n const { cursor, buffer } = state;\n if (cursor === 0) return;\n const beforeCursor = buffer.slice(0, cursor);\n const lastWordStart = beforeCursor.lastIndexOf(' ') + 1;\n const next = buffer.slice(0, lastWordStart) + buffer.slice(cursor);\n dispatch({ type: 'setBuffer', buffer: next, cursor: lastWordStart });\n return;\n }\n\n // Alt+V → read image from clipboard and attach as [image #N].\n if (key.meta && input === 'v') {\n await pasteClipboardImage();\n return;\n }\n\n if (!input || key.ctrl || key.meta) return;\n\n // Strip bracketed-paste markers if the terminal sent them through.\n // The wrapped payload is always treated as a paste regardless of size.\n let bracketedPaste = false;\n if (input.includes('\\x1b[200~') || input.includes('\\x1b[201~')) {\n input = input.replace(/\\x1b\\[200~/g, '').replace(/\\x1b\\[201~/g, '');\n bracketedPaste = true;\n }\n\n // Paste detection: chunks larger than threshold or containing a newline\n // are routed through InputBuilder instead of inserted character-by-char.\n if (bracketedPaste || input.length > PASTE_THRESHOLD_CHARS || input.includes('\\n')) {\n const builder = builderRef.current;\n if (!builder) return;\n const ph = await builder.appendPaste(input);\n if (ph) {\n const lineCount = input.split('\\n').length;\n dispatch({ type: 'addPlaceholder', ph: `${ph} (${lineCount} lines)` });\n } else {\n const next =\n state.buffer.slice(0, state.cursor) + input + state.buffer.slice(state.cursor);\n dispatch({ type: 'setBuffer', buffer: next, cursor: state.cursor + input.length });\n }\n return;\n }\n\n const next = state.buffer.slice(0, state.cursor) + input + state.buffer.slice(state.cursor);\n dispatch({ type: 'setBuffer', buffer: next, cursor: state.cursor + input.length });\n };\n\n /**\n * Drive a single iteration: run the agent against `blocks`, render the\n * result into history, then if any messages were typed while we were\n * busy, pull the head of the queue and recurse. Recursion terminates\n * when the queue is empty (status stays idle).\n */\n const runBlocks = async (blocks: ContentBlock[]): Promise<void> => {\n const ctrl = new AbortController();\n activeCtrlRef.current = ctrl;\n dispatch({ type: 'status', status: 'running' });\n\n try {\n const startedAt = Date.now();\n const before = tokenCounter?.total();\n const costBefore = tokenCounter?.estimateCost().total ?? 0;\n const result = await agent.run(blocks, { signal: ctrl.signal });\n\n // Flush the streamed text into history as a single assistant entry.\n // Read from the synchronous ref (which mirrors every delta as it\n // arrives) rather than the React state — the latter trails by up to\n // FLUSH_MS via the throttler, so its last chunk can land *after*\n // run() returns and flash through the tail Box.\n const streamed = streamingTextRef.current;\n const text = result.status === 'done' && result.finalText ? result.finalText : streamed;\n if (text && text.trim()) {\n dispatch({ type: 'addEntry', entry: { kind: 'assistant', text } });\n }\n // Clear every form of streaming state in lockstep — ref, pending\n // throttle buffer, scheduled flush timer, and React state — so no\n // late delta can resurrect a phantom tail into the next iteration.\n streamingTextRef.current = '';\n pendingDeltaRef.current = '';\n if (flushTimerRef.current) {\n clearTimeout(flushTimerRef.current);\n flushTimerRef.current = null;\n }\n dispatch({ type: 'streamReset' });\n\n if (result.status === 'aborted') {\n dispatch({ type: 'addEntry', entry: { kind: 'warn', text: 'Aborted.' } });\n } else if (result.status === 'failed') {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'error',\n text: `Failed: ${result.error instanceof Error ? result.error.message : String(result.error)}`,\n },\n });\n } else if (result.status === 'max_iterations') {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: `Hit max iterations (${result.iterations}).` },\n });\n }\n\n if (tokenCounter && before) {\n const after = tokenCounter.total();\n const costAfter = tokenCounter.estimateCost().total;\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'turn-summary',\n text: `[in: ${fmtTok(after.input - before.input)} out: ${fmtTok(after.output - before.output)} iters: ${result.iterations} cost: ${(costAfter - costBefore).toFixed(4)} ${((Date.now() - startedAt) / 1000).toFixed(1)}s]`,\n },\n });\n }\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'error', text: err instanceof Error ? err.message : String(err) },\n });\n } finally {\n activeCtrlRef.current = null;\n dispatch({ type: 'status', status: 'idle' });\n }\n\n // Drain the queue. If the run was aborted, the SIGINT handler has\n // already cleared the queue, so the head will be undefined.\n const head = stateRef.current.queue[0];\n if (head) {\n dispatch({ type: 'dequeueFirst' });\n await runBlocks(head.blocks);\n }\n };\n\n const submit = async () => {\n const raw = state.buffer;\n const trimmed = raw.trim();\n if (!trimmed && state.placeholders.length === 0) return;\n\n dispatch({ type: 'resetInterrupts' });\n\n // Slash commands always dispatch immediately, even mid-iteration —\n // they don't conflict with a running agent.\n if (trimmed.startsWith('/')) {\n dispatch({ type: 'addEntry', entry: { kind: 'user', text: trimmed } });\n if (state.historyIndex > 0) dispatch({ type: 'historyPush', text: trimmed });\n dispatch({ type: 'clearInput' });\n try {\n const res = await slashRegistry.dispatch(trimmed, agent.ctx);\n if (res?.message) {\n dispatch({ type: 'addEntry', entry: { kind: 'info', text: res.message } });\n }\n if (res?.exit) {\n exit();\n onExit(0);\n }\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'error', text: err instanceof Error ? err.message : String(err) },\n });\n }\n return;\n }\n\n const builder = builderRef.current;\n if (!builder) return;\n if (trimmed) builder.appendText(trimmed);\n const blocks = await builder.submit();\n const displayText = trimmed || '(attachments only)';\n dispatch({ type: 'clearInput' });\n\n if (state.status !== 'idle') {\n // Agent is busy — queue this message for the drainer to pick up.\n dispatch({\n type: 'addEntry',\n entry: { kind: 'user', text: displayText, queued: true },\n });\n dispatch({ type: 'enqueue', item: { displayText, blocks } });\n if (state.historyIndex > 0) dispatch({ type: 'historyPush', text: trimmed });\n return;\n }\n\n dispatch({ type: 'addEntry', entry: { kind: 'user', text: displayText } });\n if (state.historyIndex > 0) dispatch({ type: 'historyPush', text: trimmed });\n await runBlocks(blocks);\n };\n\n const inputHint = useMemo(() => {\n if (state.status !== 'idle') return '';\n if (state.buffer.startsWith('/')) return 'slash command — Enter to dispatch';\n if (state.picker.open) return '';\n return '';\n }, [state.buffer, state.status, state.picker.open]);\n\n return (\n <Box flexDirection=\"column\">\n <History entries={state.entries} streamingText={state.streamingText} />\n <Input\n value={state.buffer}\n cursor={state.cursor}\n placeholders={state.placeholders}\n disabled={state.status === 'aborting'}\n hint={inputHint}\n onKey={handleKey}\n />\n {state.picker.open ? (\n <FilePicker\n query={state.picker.query}\n matches={state.picker.matches}\n selected={state.picker.selected}\n />\n ) : null}\n {state.slashPicker.open ? (\n <SlashMenu\n query={state.slashPicker.query}\n matches={state.slashPicker.matches}\n selected={state.slashPicker.selected}\n />\n ) : null}\n <StatusBar\n model={model}\n state={state.status}\n tokenCounter={tokenCounter}\n hint={renderRunningTools(state.runningTools) || state.hint}\n queueCount={state.queue.length}\n yolo={yolo}\n elapsedMs={elapsedMs}\n todos={todos}\n git={gitInfo}\n context={contextWindow}\n />\n </Box>\n );\n}\n\n/**\n * Render an at-a-glance \"running: …\" hint for the status bar. Shows the\n * oldest in-flight tool by name; if more than one, appends \"(+N)\".\n */\nexport function renderRunningTools(\n running: ReadonlyMap<string, { name: string; startedAt: number }>,\n): string {\n if (running.size === 0) return '';\n let oldest: { name: string; startedAt: number } | null = null;\n for (const info of running.values()) {\n if (!oldest || info.startedAt < oldest.startedAt) oldest = info;\n }\n if (!oldest) return '';\n const elapsedSec = ((Date.now() - oldest.startedAt) / 1000).toFixed(1);\n const more = running.size > 1 ? ` (+${running.size - 1})` : '';\n return `running: ${oldest.name} ${elapsedSec}s${more}`;\n}\n\n/**\n * Find an active `@<query>` token at the cursor. The token starts at the\n * last `@` not preceded by a non-whitespace char, and runs up to the cursor\n * (no whitespace allowed inside). Returns null if no active token.\n */\nexport function detectAtToken(\n buffer: string,\n cursor: number,\n): { start: number; end: number; query: string } | null {\n let i = cursor - 1;\n while (i >= 0) {\n const ch = buffer.charCodeAt(i);\n if (ch === 64 /* @ */) {\n // Must be at the start of buffer or preceded by whitespace.\n if (i === 0 || /\\s/.test(buffer[i - 1] ?? '')) {\n return { start: i, end: cursor, query: buffer.slice(i + 1, cursor) };\n }\n return null;\n }\n if (ch === 32 /* space */ || ch === 9 /* tab */ || ch === 10 /* nl */) return null;\n i--;\n }\n return null;\n}\n\nfunction fmtTok(n: number): string {\n if (n < 1000) return String(n);\n if (n < 1_000_000) return `${(n / 1000).toFixed(n < 10_000 ? 1 : 0)}k`;\n return `${(n / 1_000_000).toFixed(1)}M`;\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport type {\n Agent,\n AttachmentStore,\n EventBus,\n QueueStore,\n SlashCommandRegistry,\n TokenCounter,\n} from '@wrongstack/core';\nimport { App } from './app.js';\n\nexport interface RunTuiOptions {\n agent: Agent;\n slashRegistry: SlashCommandRegistry;\n attachments: AttachmentStore;\n events: EventBus;\n tokenCounter?: TokenCounter;\n model: string;\n banner?: boolean;\n /** Persists the input queue across crashes; if omitted, the queue is in-memory only. */\n queueStore?: QueueStore;\n /** Surfaces the \"⚠ YOLO\" chip in the status bar. */\n yolo?: boolean;\n /** Renders in the startup banner. Read from the CLI's package.json. */\n appVersion?: string;\n /** Provider id for the startup banner (\"openai\", \"anthropic\", ...). */\n provider?: string;\n /**\n * Model-specific maxContext (tokens), resolved by the CLI via the\n * ModelsRegistry. When omitted, the TUI falls back to the provider\n * family's baseline (e.g. anthropic = 200_000), which can be wrong\n * for variants like the 1M-context Opus build. The status bar's\n * context chip uses this for its progress denominator.\n */\n effectiveMaxContext?: number;\n /**\n * Render into the terminal's alternate screen buffer (like vim/less/htop).\n * Default: false — we render into normal scrollback so the user can\n * scroll history with the terminal's native mouse wheel / Shift+PgUp,\n * and so completed chat survives after exit. Pass true to switch to\n * a fixed full-screen view (no scrollback, no native scroll); useful\n * when terminal redraw flicker is bad enough to outweigh the loss of\n * scrollback.\n */\n altScreen?: boolean;\n /**\n * Called right after we exit the alt-screen on a clean shutdown. The\n * CLI uses this to print a one-line \"session saved to …\" hint into\n * the user's normal terminal, since alt-screen exit erases the whole\n * TUI view.\n */\n onAfterExit?: () => void;\n}\n\n// Bracketed paste mode wraps any pasted text with these markers, letting us\n// distinguish a paste from typed input even when chunks arrive identically.\nconst BRACKETED_PASTE_ON = '\\x1b[?2004h';\nconst BRACKETED_PASTE_OFF = '\\x1b[?2004l';\n\n// Alternate-screen buffer (DECSET 1049). Switches the terminal to a\n// dedicated virtual screen; on exit, the previous scrollback is restored\n// untouched. This is what every \"full-screen TUI\" uses (vim, less, htop).\n// Without it, Ink writes its dynamic area in line with scrollback and\n// each redraw can leak the previous frame's input/status into the\n// permanent terminal history — the exact bug we hit before this change.\nconst ALT_SCREEN_ON = '\\x1b[?1049h';\nconst ALT_SCREEN_OFF = '\\x1b[?1049l';\nconst CURSOR_HOME = '\\x1b[H';\n\nexport async function runTui(opts: RunTuiOptions): Promise<number> {\n const stdout = process.stdout;\n const stdin = process.stdin;\n\n // Ink requires a TTY on both stdin and stdout. Without this guard the\n // render call would fail with a terse internal Ink error; bail with a\n // clear message so a piped invocation (`echo hi | wstack --tui`) tells\n // the user what to do instead.\n if (!stdout.isTTY || !stdin.isTTY) {\n process.stderr.write(\n 'wstack: --tui requires an interactive terminal on both stdin and stdout.\\n' +\n ' Drop the flag (use the plain REPL) or run wstack directly without piping.\\n',\n );\n return 2;\n }\n\n const useAltScreen = opts.altScreen === true;\n if (useAltScreen) {\n stdout.write(ALT_SCREEN_ON);\n stdout.write(CURSOR_HOME);\n }\n stdout.write(BRACKETED_PASTE_ON);\n\n // Track cleanup state so signal handlers don't double-disable. Order\n // matters on exit: paste mode off first (it's a screen-independent\n // setting), then alt-screen off (which restores the user's previous\n // terminal contents).\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n try {\n stdout.write(BRACKETED_PASTE_OFF);\n if (useAltScreen) {\n stdout.write(ALT_SCREEN_OFF);\n }\n } catch {\n // stdout may already be closed during shutdown — ignore.\n }\n };\n\n // If the process is killed externally (terminal closed, SIGTERM from a\n // supervisor) waitUntilExit's .then/.catch never runs. Register signal +\n // exit listeners so the terminal isn't left in bracketed-paste mode.\n const signals: NodeJS.Signals[] = ['SIGTERM', 'SIGHUP', 'SIGINT'];\n const signalHandler = () => cleanup();\n const exitHandler = () => cleanup();\n for (const s of signals) process.on(s, signalHandler);\n process.on('exit', exitHandler);\n\n const detachListeners = () => {\n for (const s of signals) process.off(s, signalHandler);\n process.off('exit', exitHandler);\n };\n\n return new Promise<number>((resolve) => {\n let exitCode = 0;\n const onExit = (code: number) => {\n exitCode = code;\n };\n const settle = (code: number) => {\n cleanup();\n detachListeners();\n // Once the alt-screen is dismantled the user is staring at their\n // pre-TUI terminal again — print a quick line so they can see\n // where the session is preserved, instead of wondering \"where did\n // my chat go?\". Best-effort: callback failures don't change exit.\n if (useAltScreen && opts.onAfterExit) {\n try {\n opts.onAfterExit();\n } catch {\n // ignore — UX helper, not load-bearing\n }\n }\n resolve(code);\n };\n\n let instance: ReturnType<typeof render>;\n try {\n instance = render(\n React.createElement(App, {\n agent: opts.agent,\n slashRegistry: opts.slashRegistry,\n attachments: opts.attachments,\n events: opts.events,\n tokenCounter: opts.tokenCounter,\n model: opts.model,\n banner: opts.banner ?? true,\n queueStore: opts.queueStore,\n yolo: opts.yolo,\n appVersion: opts.appVersion,\n provider: opts.provider,\n effectiveMaxContext: opts.effectiveMaxContext,\n onExit,\n }),\n { exitOnCtrlC: false },\n );\n } catch (err) {\n process.stderr.write(\n `wstack: TUI failed to start: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n settle(1);\n return;\n }\n instance\n .waitUntilExit()\n .then(() => settle(exitCode))\n .catch(() => settle(1));\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/markdown-table.ts","../src/components/history.tsx","../src/components/input.tsx","../src/components/status-bar.tsx","../src/components/file-picker.tsx","../src/components/slash-menu.tsx","../src/components/model-picker.tsx","../src/components/confirm-prompt.tsx","../src/file-search.ts","../src/clipboard.ts","../src/queue-slash.ts","../src/git-info.ts","../src/app.tsx","../src/run-tui.ts"],"names":["jsxs","Box","Text","jsx","cache","Fragment","path","useInput","fs","parts","spawn","path3","fs3","next","text","fmtTok","React"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Scan a body of prose for GitHub-flavoured markdown tables and replace\n * each one with a Unicode box-drawing rendering that fits the terminal\n * width. Cells that overflow their column wrap over multiple lines.\n *\n * Non-table prose passes through unchanged.\n *\n * Input shape (rest of the doc may surround it):\n * | Header A | Header B |\n * |----------|---------:|\n * | a 1 | 42 |\n * | a 2 | 7 |\n *\n * Output shape:\n * ┌──────────┬──────────┐\n * │ Header A │ Header B │\n * ├──────────┼──────────┤\n * │ a 1 │ 42 │\n * │ a 2 │ 7 │\n * └──────────┴──────────┘\n */\nexport function renderMarkdownTables(text: string, maxWidth: number): string {\n if (!text.includes('|')) return text; // fast path\n const lines = text.split('\\n');\n const out: string[] = [];\n let i = 0;\n while (i < lines.length) {\n const end = detectTable(lines, i);\n if (end > i) {\n out.push(renderTable(lines.slice(i, end), Math.max(20, maxWidth)));\n i = end;\n } else {\n out.push(lines[i] ?? '');\n i++;\n }\n }\n return out.join('\\n');\n}\n\ntype Align = 'left' | 'right' | 'center';\n\nconst ROW_RE = /^\\s*\\|.*\\|\\s*$/;\nconst SEP_RE = /^\\s*\\|[\\s\\-:|]+\\|\\s*$/;\n\nfunction detectTable(lines: string[], start: number): number {\n if (start + 1 >= lines.length) return start;\n if (!ROW_RE.test(lines[start] ?? '')) return start;\n const sep = lines[start + 1] ?? '';\n // Need at least one dash somewhere — distinguishes the separator from\n // a regular row that happens to contain colons/spaces only.\n if (!SEP_RE.test(sep) || !/-/.test(sep)) return start;\n let end = start + 2;\n while (end < lines.length && ROW_RE.test(lines[end] ?? '')) end++;\n return end;\n}\n\nfunction parseCells(line: string): string[] {\n // Strip the outer pipes, then split on remaining pipes. Pipes inside a\n // cell would need escaping with `\\|`; we honour that minimally.\n const inner = line.trim().replace(/^\\||\\|$/g, '');\n const parts: string[] = [];\n let buf = '';\n for (let i = 0; i < inner.length; i++) {\n const ch = inner[i];\n if (ch === '\\\\' && inner[i + 1] === '|') {\n buf += '|';\n i++;\n continue;\n }\n if (ch === '|') {\n parts.push(buf);\n buf = '';\n continue;\n }\n buf += ch;\n }\n parts.push(buf);\n return parts.map((c) => c.trim());\n}\n\nfunction parseAlign(sep: string): Align {\n const t = sep.trim();\n const left = t.startsWith(':');\n const right = t.endsWith(':');\n if (left && right) return 'center';\n if (right) return 'right';\n return 'left';\n}\n\nfunction renderTable(tableLines: string[], maxWidth: number): string {\n const header = parseCells(tableLines[0] ?? '');\n const sepCells = parseCells(tableLines[1] ?? '');\n const cols = header.length;\n const aligns: Align[] = [];\n for (let c = 0; c < cols; c++) {\n aligns.push(parseAlign(sepCells[c] ?? ''));\n }\n const dataRows = tableLines.slice(2).map(parseCells);\n // Normalise short rows by padding with empty cells; drop extras.\n for (const row of dataRows) {\n while (row.length < cols) row.push('');\n row.length = cols;\n }\n\n const widths = computeWidths([header, ...dataRows], cols, maxWidth);\n\n const lines: string[] = [];\n lines.push(border('┌', '┬', '┐', widths));\n lines.push(...renderRow(header, widths, aligns));\n lines.push(border('├', '┼', '┤', widths));\n for (const row of dataRows) {\n lines.push(...renderRow(row, widths, aligns));\n }\n lines.push(border('└', '┴', '┘', widths));\n return lines.join('\\n');\n}\n\nfunction computeWidths(allRows: string[][], cols: number, maxWidth: number): number[] {\n // Each column adds `│ … ` of overhead (2 padding + 1 separator); the\n // very first column also gets an opening `│`. Net overhead = 3*cols + 1.\n const overhead = 3 * cols + 1;\n const avail = Math.max(cols * MIN_COL_WIDTH, maxWidth - overhead);\n const natural = new Array<number>(cols).fill(0);\n for (const row of allRows) {\n for (let c = 0; c < cols; c++) {\n const cell = row[c] ?? '';\n const w = longestWord(cell); // floor: never wrap mid-word in the middle of a short label\n const total = cell.length;\n // Track both, prefer the natural width but ensure at least `w`.\n natural[c] = Math.max(natural[c]!, total);\n if (w > natural[c]!) natural[c] = Math.min(total + 1, w);\n }\n }\n const sumNatural = natural.reduce((s, n) => s + n, 0);\n if (sumNatural <= avail) return natural;\n // Need to shrink. Repeatedly steal a char from the widest column above\n // MIN_COL_WIDTH until we fit. Cheap; cols is small.\n const widths = natural.slice();\n let sum = sumNatural;\n while (sum > avail) {\n let maxIdx = -1;\n let maxVal = MIN_COL_WIDTH;\n for (let i = 0; i < cols; i++) {\n const w = widths[i]!;\n if (w > maxVal) {\n maxVal = w;\n maxIdx = i;\n }\n }\n if (maxIdx < 0) break; // every column is at MIN_COL_WIDTH; give up\n widths[maxIdx]!--;\n sum--;\n }\n return widths;\n}\n\nconst MIN_COL_WIDTH = 4;\n\nfunction longestWord(s: string): number {\n let max = 0;\n for (const w of s.split(/\\s+/)) if (w.length > max) max = w.length;\n return max;\n}\n\nfunction border(left: string, mid: string, right: string, widths: number[]): string {\n return left + widths.map((w) => '─'.repeat(w + 2)).join(mid) + right;\n}\n\nfunction renderRow(cells: string[], widths: number[], aligns: Align[]): string[] {\n const wrapped = cells.map((c, i) => wrapCell(c, widths[i] ?? MIN_COL_WIDTH));\n const height = Math.max(1, ...wrapped.map((w) => w.length));\n const out: string[] = [];\n for (let line = 0; line < height; line++) {\n const parts: string[] = [];\n for (let c = 0; c < widths.length; c++) {\n const w = widths[c] ?? MIN_COL_WIDTH;\n const text = wrapped[c]?.[line] ?? '';\n parts.push(padCell(text, w, aligns[c] ?? 'left'));\n }\n out.push('│ ' + parts.join(' │ ') + ' │');\n }\n return out;\n}\n\nfunction wrapCell(text: string, width: number): string[] {\n if (text.length <= width) return [text];\n const out: string[] = [];\n // Split on whitespace, keep grouping until we'd overflow.\n const words = text.split(/(\\s+)/);\n let cur = '';\n for (const word of words) {\n if (!word) continue;\n if (cur.length + word.length <= width) {\n cur += word;\n continue;\n }\n if (cur) {\n out.push(cur.trimEnd());\n cur = '';\n }\n if (word.length > width) {\n // Hard-break a word longer than the column.\n let rest = word;\n while (rest.length > width) {\n out.push(rest.slice(0, width));\n rest = rest.slice(width);\n }\n cur = rest;\n } else if (!/^\\s+$/.test(word)) {\n cur = word;\n }\n }\n if (cur) out.push(cur.trimEnd());\n return out.length === 0 ? [''] : out;\n}\n\nfunction padCell(text: string, width: number, align: Align): string {\n if (text.length >= width) return text.slice(0, width);\n const pad = width - text.length;\n if (align === 'right') return ' '.repeat(pad) + text;\n if (align === 'center') {\n const l = Math.floor(pad / 2);\n return ' '.repeat(l) + text + ' '.repeat(pad - l);\n }\n return text + ' '.repeat(pad);\n}\n","import type React from 'react';\r\nimport { Box, Static, Text, useStdout } from 'ink';\r\nimport { renderMarkdownTables } from '../markdown-table.js';\r\nimport { ConfirmPrompt } from './confirm-prompt.js';\r\n\r\nexport type HistoryEntry =\r\n | { id: number; kind: 'user'; text: string; queued?: boolean }\r\n | { id: number; kind: 'assistant'; text: string }\r\n | {\r\n id: number;\r\n kind: 'tool';\r\n name: string;\r\n durationMs: number;\r\n ok: boolean;\r\n input?: unknown;\r\n output?: string;\r\n }\r\n | { id: number; kind: 'info'; text: string }\r\n | { id: number; kind: 'warn'; text: string }\r\n | { id: number; kind: 'error'; text: string }\r\n | { id: number; kind: 'turn-summary'; text: string }\r\n | {\r\n id: number;\r\n kind: 'banner';\r\n version: string;\r\n provider: string;\r\n model: string;\r\n cwd: string;\r\n /** Wire family the provider is configured to speak (anthropic, openai, …). */\r\n family?: string;\r\n /** Last 3 chars of the active API key — quick visual confirmation that the right account is wired up. */\r\n keyTail?: string;\r\n }\r\n /** Tool confirmation shown while waiting for the user to approve/deny. */\r\n | { id: number; kind: 'confirm'; toolName: string; input: unknown; suggestedPattern: string };\r\n\r\nexport interface HistoryProps {\r\n entries: HistoryEntry[];\r\n streamingText?: string;\r\n /**\r\n * Optional live tail of the currently streaming tool. Rendered below the\r\n * assistant tail so the user sees both at once: model thinking and tool\r\n * output. Cleared automatically when the tool's `tool.executed` event\r\n * fires and the final entry lands in `entries`.\r\n */\r\n toolStream?: { toolUseId: string; name: string; text: string } | null;\r\n}\r\n\r\nexport function History({ entries, streamingText, toolStream }: HistoryProps): React.ReactElement {\r\n const { stdout } = useStdout();\r\n // Terminal width drives table column sizing. We snapshot it at render\r\n // time; Static-emitted entries won't reflow on resize, which is fine\r\n // — they're already in scrollback at the width they were drawn for.\r\n const termWidth = stdout?.columns ?? 80;\r\n const tail = streamingText ? tailForDisplay(streamingText, MAX_STREAM_DISPLAY_CHARS) : '';\r\n const toolTail = toolStream && toolStream.text\r\n ? tailForDisplay(toolStream.text, MAX_STREAM_DISPLAY_CHARS)\r\n : '';\r\n\r\n // Finalized entries go through <Static>: Ink prints each one ONCE and\r\n // never re-renders them, which means they flow into the terminal's\r\n // native scrollback. The user scrolls with the terminal's own\r\n // mechanism (mouse wheel, Shift+PgUp in Windows Terminal/PowerShell,\r\n // etc.) — we don't need an in-app scrollbar or scroll keys. Trying\r\n // to manage scroll ourselves clipped older content under a fixed\r\n // height box and lost it to redraws.\r\n return (\r\n <>\r\n <Static items={entries}>\r\n {(entry) => (\r\n <Box key={entry.id} marginBottom={entry.kind === 'turn-summary' ? 1 : 0}>\r\n <Entry entry={entry} termWidth={termWidth} />\r\n </Box>\r\n )}\r\n </Static>\r\n {tail ? (\r\n <Box>\r\n <Text dimColor>{'> '}</Text>\r\n <Text>{tail}</Text>\r\n </Box>\r\n ) : null}\r\n {toolTail ? (\r\n <Box flexDirection=\"column\">\r\n <Text dimColor>{`◆ ${toolStream!.name} `}</Text>\r\n <Text>{toolTail}</Text>\r\n </Box>\r\n ) : null}\r\n </>\r\n );\r\n}\r\n\r\nconst MAX_STREAM_DISPLAY_CHARS = 480;\r\n\r\nexport function tailForDisplay(text: string, maxChars: number): string {\r\n if (text.length <= maxChars) return text;\r\n const cut = text.length - maxChars;\r\n // Prefer a newline boundary near the cut for a cleaner visual edge.\r\n const nl = text.indexOf('\\n', cut);\r\n if (nl !== -1 && nl < cut + 80) {\r\n return `… ${text.slice(nl + 1)}`;\r\n }\r\n return `… ${text.slice(cut)}`;\r\n}\r\n\r\nfunction DiffBlock({ rows, hidden }: { rows: DiffLineRow[]; hidden: number }): React.ReactElement {\r\n return (\r\n <Box flexDirection=\"column\" marginLeft={4} marginTop={0}>\r\n {rows.map((row, i) => {\r\n const key = i;\r\n if (row.kind === 'hunk') {\r\n return (\r\n <Text key={key} color=\"cyan\" dimColor>\r\n {row.text}\r\n </Text>\r\n );\r\n }\r\n if (row.kind === 'meta') {\r\n return (\r\n <Text key={key} dimColor>\r\n {row.text}\r\n </Text>\r\n );\r\n }\r\n if (row.kind === 'ctx') {\r\n return (\r\n <Text key={key} dimColor>\r\n {row.text}\r\n </Text>\r\n );\r\n }\r\n // add / del — colored backgrounds for the diff feel.\r\n const bg = row.kind === 'add' ? 'green' : 'red';\r\n const fg = row.kind === 'add' ? 'black' : 'white';\r\n return (\r\n <Text key={key} backgroundColor={bg} color={fg}>\r\n {row.text}\r\n </Text>\r\n );\r\n })}\r\n {hidden > 0 ? (\r\n <Text dimColor italic>\r\n {` … ${hidden} more line${hidden === 1 ? '' : 's'}`}\r\n </Text>\r\n ) : null}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction Entry({ entry, termWidth }: { entry: HistoryEntry; termWidth: number }): React.ReactElement {\r\n switch (entry.kind) {\r\n case 'user':\r\n return (\r\n <Text>\r\n <Text color={entry.queued ? 'yellow' : 'cyan'}>{entry.queued ? '⌛' : '›'}</Text>{' '}\r\n <Text dimColor={entry.queued ?? false}>{entry.text}</Text>\r\n {entry.queued ? <Text dimColor>{' (queued)'}</Text> : null}\r\n </Text>\r\n );\r\n case 'assistant':\r\n return <Text>{renderMarkdownTables(entry.text, termWidth)}</Text>;\r\n case 'tool': {\r\n const argSummary = formatToolArgs(entry.name, entry.input);\r\n const outLines = formatToolOutput(entry.name, entry.output, entry.ok);\r\n const diff = entry.ok ? extractDiffPreview(entry.name, entry.output) : undefined;\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text>\r\n <Text color={entry.ok ? 'green' : 'red'}>{entry.ok ? '●' : '✗'}</Text>{' '}\r\n <Text bold color=\"cyan\">\r\n {entry.name}\r\n </Text>\r\n {argSummary ? (\r\n <>\r\n <Text>{' '}</Text>\r\n <Text dimColor>{argSummary}</Text>\r\n </>\r\n ) : null}\r\n <Text dimColor>{` · ${fmtDuration(entry.durationMs)}`}</Text>\r\n </Text>\r\n {outLines.map((line, i) => (\r\n // biome-ignore lint/suspicious/noArrayIndexKey: tool output lines are static, index is stable\r\n <Text key={i}>\r\n <Text dimColor>{i === outLines.length - 1 && !diff ? ' └─ ' : ' ├─ '}</Text>\r\n <Text color={!entry.ok || line.startsWith('!') ? 'red' : undefined} dimColor={entry.ok && !line.startsWith('!')}>\r\n {line}\r\n </Text>\r\n </Text>\r\n ))}\r\n {diff ? <DiffBlock rows={diff.rows} hidden={diff.hidden} /> : null}\r\n </Box>\r\n );\r\n }\r\n case 'info':\r\n return <Text dimColor>{entry.text}</Text>;\r\n case 'warn':\r\n return <Text color=\"yellow\">{entry.text}</Text>;\r\n case 'error':\r\n return <Text color=\"red\">{entry.text}</Text>;\r\n case 'turn-summary':\r\n return <Text dimColor>{entry.text}</Text>;\r\n case 'confirm':\r\n return (\r\n <Box flexDirection=\"column\" borderStyle=\"single\" borderTop={false} borderLeft={false} borderRight={false} borderBottom={false} paddingX={1}>\r\n <Box flexDirection=\"row\">\r\n <Text bold color=\"yellow\">⚠ Confirm</Text>\r\n <Text> </Text>\r\n <Text bold>{entry.toolName}</Text>\r\n </Box>\r\n {entry.input && typeof entry.input === 'object' ? (\r\n <Text dimColor>\r\n {Object.entries(entry.input as Record<string, unknown>)\r\n .filter(([k]) => k !== 'content' && k !== 'new_string')\r\n .map(([k, v]) => `${k}: ${String(v).slice(0, 80)}`)\r\n .join(' ')}\r\n </Text>\r\n ) : null}\r\n <Text dimColor>─────────────────</Text>\r\n <Box flexDirection=\"row\">\r\n <Text>\r\n <Text bold color=\"green\">[↵]</Text>\r\n <Text dimColor> yes </Text>\r\n <Text bold color=\"red\">[Esc]</Text>\r\n <Text dimColor> no </Text>\r\n <Text bold color=\"cyan\">[Ctrl+A]</Text>\r\n <Text dimColor> always ({entry.suggestedPattern}) </Text>\r\n <Text bold color=\"red\">[Ctrl+D]</Text>\r\n <Text dimColor> deny</Text>\r\n </Text>\r\n </Box>\r\n </Box>\r\n );\r\n case 'banner':\r\n return <Banner entry={entry} />;\r\n }\r\n}\r\n\r\n/**\r\n * Startup splash. Renders into the Static area on mount and never\r\n * re-renders, so it's safe to use rich layout without worrying about\r\n * Ink's redraw cursor math. Keeping it inside one Box (no nested\r\n * borders that pull in different widths per line) keeps the frame\r\n * intact at any terminal width ≥ 60 cols.\r\n */\r\nfunction Banner({\r\n entry,\r\n}: {\r\n entry: Extract<HistoryEntry, { kind: 'banner' }>;\r\n}): React.ReactElement {\r\n const cwdShort = shortenPath(entry.cwd, 48);\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n borderStyle=\"round\"\r\n borderColor=\"magenta\"\r\n paddingX={2}\r\n paddingY={0}\r\n >\r\n <Text>\r\n <Text color=\"magenta\" bold>\r\n {' ▟▛ '}\r\n </Text>\r\n <Text color=\"magenta\" bold>\r\n WrongStack\r\n </Text>\r\n <Text dimColor>{' v'}</Text>\r\n <Text>{entry.version}</Text>\r\n </Text>\r\n <Text dimColor italic>\r\n {' Built on the wrong stack. Shipped anyway.'}\r\n </Text>\r\n <Text>\r\n <Text color=\"cyan\">{' provider '}</Text>\r\n <Text>\r\n {entry.provider}/{entry.model}\r\n </Text>\r\n </Text>\r\n {entry.family ? (\r\n <Text>\r\n <Text color=\"cyan\">{' family '}</Text>\r\n <Text dimColor>{entry.family}</Text>\r\n </Text>\r\n ) : null}\r\n {entry.keyTail ? (\r\n <Text>\r\n <Text color=\"cyan\">{' key '}</Text>\r\n <Text dimColor>{'●●●…'}</Text>\r\n <Text>{entry.keyTail}</Text>\r\n </Text>\r\n ) : null}\r\n <Text>\r\n <Text color=\"cyan\">{' cwd '}</Text>\r\n <Text dimColor>{cwdShort}</Text>\r\n </Text>\r\n <Text>\r\n <Text color=\"cyan\">{' hints '}</Text>\r\n <Text dimColor>/help · /init · /memory · /queue · /exit</Text>\r\n </Text>\r\n </Box>\r\n );\r\n}\r\n\r\nexport function shortenPath(p: string, max: number): string {\r\n if (p.length <= max) return p;\r\n // Keep the tail (closest to where the user is working).\r\n return `…${p.slice(p.length - (max - 1))}`;\r\n}\r\n\r\nconst MAX_PREVIEW = 120;\r\n\r\nexport function previewArgs(input: unknown): string {\r\n let s: string;\r\n try {\r\n s = typeof input === 'string' ? input : JSON.stringify(input);\r\n } catch {\r\n s = String(input);\r\n }\r\n return collapse(s, MAX_PREVIEW);\r\n}\r\n\r\nexport function previewOutput(output: string): string {\r\n return collapse(output, MAX_PREVIEW);\r\n}\r\n\r\nfunction collapse(s: string, max: number): string {\r\n const oneLine = s.replace(/\\r?\\n/g, '↵').replace(/\\s+/g, ' ').trim();\r\n return oneLine.length <= max ? oneLine : `${oneLine.slice(0, max - 1)}…`;\r\n}\r\n\r\nexport function fmtDuration(ms: number): string {\r\n if (ms < 1000) return `${ms}ms`;\r\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\r\n const totalSec = Math.floor(ms / 1000);\r\n return `${Math.floor(totalSec / 60)}m${totalSec % 60}s`;\r\n}\r\n\r\nconst ARG_BUDGET = 60;\r\nconst OUT_BUDGET = 80;\r\n\r\n/**\r\n * Render the most useful single-line description of a tool call's\r\n * arguments. Each tool has the field a human cares about (path for\r\n * read/edit, command for bash, pattern for grep) — pick that and skip\r\n * the noisy JSON shape entirely. Falls back to a compact JSON preview\r\n * for unrecognised tools.\r\n */\r\nexport function formatToolArgs(toolName: string, input: unknown): string {\r\n if (!input || typeof input !== 'object') return '';\r\n const obj = input as Record<string, unknown>;\r\n\r\n switch (toolName) {\r\n case 'read':\r\n case 'write':\r\n case 'edit':\r\n case 'patch':\r\n case 'document':\r\n case 'list_dir':\r\n case 'ls':\r\n case 'tree': {\r\n const p = stringOf(obj['path']) ?? stringOf(obj['file']);\r\n return p ? shortenPath(p, ARG_BUDGET) : '';\r\n }\r\n case 'grep':\r\n case 'search':\r\n case 'replace': {\r\n const pat = stringOf(obj['pattern']) ?? stringOf(obj['query']);\r\n const scope = stringOf(obj['path']) ?? stringOf(obj['glob']);\r\n const head = pat ? `\"${truncMid(pat, 36)}\"` : '';\r\n const tail = scope ? ` in ${shortenPath(scope, 28)}` : '';\r\n return `${head}${tail}` || (stringOf(obj['command']) ?? '');\r\n }\r\n case 'glob': {\r\n const pat = stringOf(obj['pattern']) ?? stringOf(obj['glob']);\r\n return pat ? `\"${truncMid(pat, ARG_BUDGET - 2)}\"` : '';\r\n }\r\n case 'bash':\r\n case 'shell':\r\n case 'exec':\r\n case 'install':\r\n case 'git': {\r\n const cmd = stringOf(obj['command']) ?? stringOf(obj['args']);\r\n return cmd ? truncMid(cmd, ARG_BUDGET) : '';\r\n }\r\n case 'diff': {\r\n const files = Array.isArray(obj['files']) ? (obj['files'] as unknown[]) : undefined;\r\n if (files && files.length > 0) {\r\n const head = stringOf(files[0]) ?? '';\r\n const rest = files.length > 1 ? ` (+${files.length - 1})` : '';\r\n return head ? `${shortenPath(head, 50)}${rest}` : '';\r\n }\r\n const mode = stringOf(obj['mode']);\r\n return mode ? `mode: ${mode}` : '';\r\n }\r\n case 'fetch':\r\n case 'webfetch':\r\n case 'web_fetch': {\r\n const u = stringOf(obj['url']);\r\n return u ? truncMid(u, ARG_BUDGET) : '';\r\n }\r\n case 'todo': {\r\n const list = obj['todos'];\r\n if (Array.isArray(list)) return `${list.length} item${list.length === 1 ? '' : 's'}`;\r\n return '';\r\n }\r\n case 'lint':\r\n case 'format':\r\n case 'typecheck':\r\n case 'test':\r\n case 'audit':\r\n case 'outdated': {\r\n const files = obj['files'];\r\n if (Array.isArray(files) && files.length > 0) {\r\n const first = stringOf(files[0]);\r\n const more = files.length > 1 ? ` (+${files.length - 1})` : '';\r\n return first ? `${shortenPath(first, 50)}${more}` : `${files.length} files`;\r\n }\r\n const filter = stringOf(obj['filter']) ?? stringOf(obj['pattern']);\r\n return filter ? `\"${truncMid(filter, ARG_BUDGET - 2)}\"` : '';\r\n }\r\n case 'json': {\r\n const file = stringOf(obj['file']);\r\n const q = stringOf(obj['query']);\r\n if (file) return q ? `${shortenPath(file, 40)} ${q}` : shortenPath(file, ARG_BUDGET);\r\n return q ? truncMid(q, ARG_BUDGET) : '';\r\n }\r\n case 'scaffold': {\r\n const tmpl = stringOf(obj['template']) ?? stringOf(obj['type']);\r\n const name = stringOf(obj['name']);\r\n if (tmpl && name) return `${tmpl} → ${truncMid(name, ARG_BUDGET - tmpl.length - 4)}`;\r\n return name ?? tmpl ?? '';\r\n }\r\n case 'remember':\r\n case 'forget':\r\n case 'memory': {\r\n const key = stringOf(obj['key']) ?? stringOf(obj['name']);\r\n return key ? truncMid(key, ARG_BUDGET) : '';\r\n }\r\n case 'mode': {\r\n const m = stringOf(obj['mode']) ?? stringOf(obj['name']);\r\n return m ? truncMid(m, ARG_BUDGET) : '';\r\n }\r\n case 'logs': {\r\n const target = stringOf(obj['target']) ?? stringOf(obj['service']) ?? stringOf(obj['path']);\r\n return target ? truncMid(target, ARG_BUDGET) : '';\r\n }\r\n }\r\n\r\n // Generic fallback: prefer the most \"identifying\" string field, else\r\n // a tight JSON preview.\r\n for (const key of ['path', 'file', 'url', 'name', 'query', 'pattern', 'command']) {\r\n const v = stringOf(obj[key]);\r\n if (v) return truncMid(v, ARG_BUDGET);\r\n }\r\n try {\r\n return truncMid(JSON.stringify(obj), ARG_BUDGET);\r\n } catch {\r\n return '';\r\n }\r\n}\r\n\r\n/**\r\n * Distil a tool's result text into 0–N digest lines the renderer can\r\n * stack under the tool header. Some tools say everything in one line\r\n * (todo: nothing to add beyond the args); others (bash with both\r\n * stdout and stderr, grep with a first matching path) deserve two or\r\n * three. The shape is per-tool — there is no fixed budget.\r\n */\r\nexport function formatToolOutput(\r\n toolName: string,\r\n output: string | undefined,\r\n ok: boolean,\r\n): string[] {\r\n if (!output) return ok ? [] : ['failed'];\r\n const text = output.trim();\r\n if (!text) return ok ? [] : ['failed'];\r\n\r\n // Try to parse JSON-shaped tool outputs (grep, glob, etc.).\r\n const json = tryParseJson(text);\r\n\r\n if (toolName === 'write') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const bytes = numOf(o['bytes_written']) ?? numOf(o['bytes']);\r\n const created = o['created'] === true;\r\n const tag = created ? 'created' : 'updated';\r\n if (bytes !== undefined) return [`${tag} · ${fmtBytes(bytes)}`];\r\n return [tag];\r\n }\r\n }\r\n\r\n if (toolName === 'edit') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const reps = numOf(o['replacements']);\r\n if (reps !== undefined) return [`${reps} replacement${reps === 1 ? '' : 's'}`];\r\n }\r\n }\r\n\r\n if (toolName === 'patch') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const applied = numOf(o['applied']);\r\n const rejected = numOf(o['rejected']);\r\n const files = Array.isArray(o['files']) ? (o['files'] as unknown[]) : undefined;\r\n const lines: string[] = [];\r\n if (applied !== undefined || rejected !== undefined) {\r\n const parts = [];\r\n if (applied !== undefined) parts.push(`${applied} applied`);\r\n if (rejected !== undefined && rejected > 0) parts.push(`${rejected} rejected`);\r\n lines.push(parts.join(' · '));\r\n }\r\n if (files && files.length > 0) {\r\n const first = stringOf(files[0]) ?? '';\r\n const more = files.length > 1 ? ` (+${files.length - 1})` : '';\r\n lines.push(`${shortenPath(first, 60)}${more}`);\r\n }\r\n if (lines.length > 0) return lines;\r\n }\r\n }\r\n\r\n if (toolName === 'replace') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const files = numOf(o['files_modified']);\r\n const reps = numOf(o['total_replacements']);\r\n if (files !== undefined && reps !== undefined) {\r\n return [\r\n `${reps} replacement${reps === 1 ? '' : 's'} in ${files} file${files === 1 ? '' : 's'}`,\r\n ];\r\n }\r\n }\r\n }\r\n\r\n if (toolName === 'diff') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const files = Array.isArray(o['files']) ? (o['files'] as unknown[]) : undefined;\r\n const truncated = o['truncated'] === true;\r\n const mode = stringOf(o['mode']);\r\n const diff = stringOf(o['diff']);\r\n if (!diff) return [files && files.length === 0 ? 'no changes' : 'empty diff'];\r\n const head: string[] = [];\r\n if (mode) head.push(mode);\r\n if (files && files.length > 0) head.push(`${files.length} file${files.length === 1 ? '' : 's'}`);\r\n if (truncated) head.push('truncated');\r\n return head.length > 0 ? [head.join(' · ')] : [];\r\n }\r\n }\r\n\r\n if (toolName === 'read') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const bytes = numOf(o['bytes']);\r\n if (bytes !== undefined) return [`${fmtBytes(bytes)} read`];\r\n }\r\n // read returns numbered lines like \" 1→...\\n 2→...\". Surface the\r\n // actual line range (start–end) — that's denser than a count alone.\r\n const range = scanNumberedRange(text);\r\n if (range.count > 0 && range.first !== undefined && range.last !== undefined) {\r\n if (range.first === range.last) {\r\n return [`L${range.first} · ${fmtBytes(text.length)}`];\r\n }\r\n const contiguous = range.count === range.last - range.first + 1;\r\n const head = `L${range.first}–${range.last}`;\r\n const tail = contiguous\r\n ? `${range.count} line${range.count === 1 ? '' : 's'}`\r\n : `${range.count} lines (gaps)`;\r\n return [`${head} · ${tail} · ${fmtBytes(text.length)}`];\r\n }\r\n }\r\n\r\n if (toolName === 'grep' || toolName === 'glob') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const matches = Array.isArray(o['matches']) ? (o['matches'] as unknown[]) : undefined;\r\n const count = numOf(o['count']) ?? matches?.length;\r\n const truncated = o['truncated'] === true;\r\n if (count !== undefined) {\r\n if (count === 0) return ['no matches'];\r\n const lines: string[] = [\r\n `${count} match${count === 1 ? '' : 'es'}${truncated ? ' (truncated)' : ''}`,\r\n ];\r\n // Surface the first hit so the user knows *where* without\r\n // opening the tool result.\r\n const firstHit = matches && matches.length > 0 ? formatMatchHit(matches[0]) : undefined;\r\n if (firstHit) lines.push(firstHit);\r\n return lines;\r\n }\r\n }\r\n }\r\n\r\n if (toolName === 'bash' || toolName === 'shell') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const exit = numOf(o['exit_code']) ?? numOf(o['exitCode']);\r\n const stdout = stringOf(o['stdout']) ?? '';\r\n const stderr = stringOf(o['stderr']) ?? '';\r\n const stdoutLines = countLines(stdout);\r\n const stderrLines = countLines(stderr);\r\n const head: string[] = [];\r\n if (exit !== undefined) head.push(`exit ${exit}`);\r\n const lineParts: string[] = [];\r\n if (stdoutLines > 0) lineParts.push(`${stdoutLines} out`);\r\n if (stderrLines > 0) lineParts.push(`${stderrLines} err`);\r\n if (lineParts.length > 0) head.push(lineParts.join(' · '));\r\n const lines: string[] = [];\r\n if (head.length > 0) lines.push(head.join(' · '));\r\n const stdoutPreview = firstNonEmpty(stdout);\r\n const stderrPreview = firstNonEmpty(stderr);\r\n if (stdoutPreview) lines.push(`\"${truncMid(stdoutPreview, 70)}\"`);\r\n if (stderrPreview && stderrPreview !== stdoutPreview) {\r\n lines.push(`! \"${truncMid(stderrPreview, 70)}\"`);\r\n }\r\n if (lines.length > 0) return lines;\r\n }\r\n }\r\n\r\n if (toolName === 'todo') {\r\n // The arg summary already says \"N items\" — repeating \"updated\" is\r\n // noise, so emit nothing on success.\r\n return ok ? [] : [text.split('\\n')[0] ?? ''];\r\n }\r\n\r\n if (toolName === 'fetch' || toolName === 'webfetch' || toolName === 'web_fetch') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const status = numOf(o['status']);\r\n const ct = stringOf(o['content_type']);\r\n const url = stringOf(o['url']);\r\n const content = stringOf(o['content']);\r\n const head: string[] = [];\r\n if (status !== undefined) head.push(`HTTP ${status}`);\r\n if (ct) head.push(ct.split(';')[0] ?? ct);\r\n if (content) head.push(fmtBytes(Buffer.byteLength(content, 'utf8')));\r\n const lines: string[] = [];\r\n if (head.length > 0) lines.push(head.join(' · '));\r\n if (url && status !== undefined && (status < 200 || status >= 400)) {\r\n lines.push(shortenPath(url, 70));\r\n }\r\n if (lines.length > 0) return lines;\r\n }\r\n }\r\n\r\n if (toolName === 'git') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const exit = numOf(o['exitCode']) ?? numOf(o['exit_code']);\r\n const stdout = stringOf(o['stdout']) ?? '';\r\n const stderr = stringOf(o['stderr']) ?? '';\r\n const head: string[] = [];\r\n if (exit !== undefined) head.push(`exit ${exit}`);\r\n const stdoutLines = countLines(stdout);\r\n const stderrLines = countLines(stderr);\r\n const lparts: string[] = [];\r\n if (stdoutLines > 0) lparts.push(`${stdoutLines} out`);\r\n if (stderrLines > 0) lparts.push(`${stderrLines} err`);\r\n if (lparts.length > 0) head.push(lparts.join(' · '));\r\n const lines: string[] = [];\r\n if (head.length > 0) lines.push(head.join(' · '));\r\n const preview = firstNonEmpty(stdout) ?? firstNonEmpty(stderr);\r\n if (preview) lines.push(`\"${truncMid(preview, 70)}\"`);\r\n if (lines.length > 0) return lines;\r\n }\r\n }\r\n\r\n if (toolName === 'lint') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const linter = stringOf(o['linter']);\r\n const files = numOf(o['files_checked']);\r\n const errors = numOf(o['errors']) ?? 0;\r\n const warnings = numOf(o['warnings']) ?? 0;\r\n const fix = o['fix_applied'] === true;\r\n const head: string[] = [];\r\n if (linter && linter !== 'none') head.push(linter);\r\n head.push(`${errors} error${errors === 1 ? '' : 's'}`);\r\n head.push(`${warnings} warning${warnings === 1 ? '' : 's'}`);\r\n if (files !== undefined) head.push(`${files} file${files === 1 ? '' : 's'}`);\r\n if (fix) head.push('fixed');\r\n return [head.join(' · ')];\r\n }\r\n }\r\n\r\n if (toolName === 'format') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const fixer = stringOf(o['fixer']);\r\n const checked = numOf(o['files_checked']);\r\n const changed = numOf(o['files_changed']);\r\n const head: string[] = [];\r\n if (fixer && fixer !== 'none') head.push(fixer);\r\n if (changed !== undefined && checked !== undefined) {\r\n head.push(`${changed}/${checked} changed`);\r\n } else if (changed !== undefined) {\r\n head.push(`${changed} changed`);\r\n }\r\n return head.length > 0 ? [head.join(' · ')] : [];\r\n }\r\n }\r\n\r\n if (toolName === 'typecheck') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const exit = numOf(o['exit_code']) ?? numOf(o['exitCode']);\r\n const errors = numOf(o['errors']);\r\n const head: string[] = [];\r\n if (errors !== undefined) head.push(`${errors} error${errors === 1 ? '' : 's'}`);\r\n if (exit !== undefined) head.push(`exit ${exit}`);\r\n const stdout = stringOf(o['output']) ?? stringOf(o['stdout']) ?? '';\r\n const lines: string[] = [];\r\n if (head.length > 0) lines.push(head.join(' · '));\r\n const preview = firstNonEmpty(stdout);\r\n if (preview && (!errors || errors > 0)) lines.push(`\"${truncMid(preview, 70)}\"`);\r\n if (lines.length > 0) return lines;\r\n }\r\n }\r\n\r\n if (toolName === 'test') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const runner = stringOf(o['runner']);\r\n const total = numOf(o['tests_run']) ?? 0;\r\n const passed = numOf(o['passed']) ?? 0;\r\n const failed = numOf(o['failed']) ?? 0;\r\n const duration = numOf(o['duration_ms']);\r\n const head: string[] = [];\r\n if (runner && runner !== 'none') head.push(runner);\r\n head.push(`${passed}/${total} passed`);\r\n if (failed > 0) head.push(`${failed} failed`);\r\n if (duration !== undefined) head.push(fmtDuration(duration));\r\n return [head.join(' · ')];\r\n }\r\n }\r\n\r\n if (toolName === 'audit') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const total = numOf(o['total']) ?? 0;\r\n const summary = stringOf(o['summary']);\r\n if (total === 0) return ['no vulnerabilities'];\r\n const head = `${total} vulnerabilit${total === 1 ? 'y' : 'ies'}`;\r\n return summary && summary.toLowerCase() !== head.toLowerCase()\r\n ? [head, truncMid(summary, OUT_BUDGET)]\r\n : [head];\r\n }\r\n }\r\n\r\n if (toolName === 'outdated') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const total = numOf(o['total']) ?? 0;\r\n const pkgs = Array.isArray(o['packages']) ? (o['packages'] as unknown[]) : undefined;\r\n if (total === 0) return ['all up to date'];\r\n const lines: string[] = [`${total} outdated`];\r\n if (pkgs && pkgs.length > 0) {\r\n const first = pkgs[0];\r\n if (first && typeof first === 'object') {\r\n const p = first as Record<string, unknown>;\r\n const name = stringOf(p['name']) ?? stringOf(p['package']);\r\n const cur = stringOf(p['current']);\r\n const wanted = stringOf(p['wanted']) ?? stringOf(p['latest']);\r\n if (name && cur && wanted) lines.push(`${name}: ${cur} → ${wanted}`);\r\n else if (name) lines.push(name);\r\n }\r\n }\r\n return lines;\r\n }\r\n }\r\n\r\n if (toolName === 'tree') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const files = numOf(o['total_files']);\r\n const dirs = numOf(o['total_dirs']);\r\n const truncated = o['truncated'] === true;\r\n const parts: string[] = [];\r\n if (files !== undefined) parts.push(`${files} file${files === 1 ? '' : 's'}`);\r\n if (dirs !== undefined) parts.push(`${dirs} dir${dirs === 1 ? '' : 's'}`);\r\n if (truncated) parts.push('truncated');\r\n return parts.length > 0 ? [parts.join(' · ')] : [];\r\n }\r\n }\r\n\r\n if (toolName === 'json') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const err = stringOf(o['error']);\r\n if (err) return [truncMid(err, OUT_BUDGET)];\r\n const type = stringOf(o['type']);\r\n const keys = Array.isArray(o['keys']) ? (o['keys'] as unknown[]) : undefined;\r\n const parts: string[] = [];\r\n if (type) parts.push(type);\r\n if (keys) parts.push(`${keys.length} key${keys.length === 1 ? '' : 's'}`);\r\n return parts.length > 0 ? [parts.join(' · ')] : [];\r\n }\r\n }\r\n\r\n if (toolName === 'install') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const exit = numOf(o['exit_code']) ?? numOf(o['exitCode']);\r\n const added = numOf(o['added']);\r\n const removed = numOf(o['removed']);\r\n const head: string[] = [];\r\n if (exit !== undefined) head.push(`exit ${exit}`);\r\n if (added !== undefined) head.push(`+${added}`);\r\n if (removed !== undefined) head.push(`-${removed}`);\r\n const stdout = stringOf(o['stdout']) ?? stringOf(o['output']) ?? '';\r\n const lines: string[] = [];\r\n if (head.length > 0) lines.push(head.join(' · '));\r\n const preview = firstNonEmpty(stdout);\r\n if (preview) lines.push(`\"${truncMid(preview, 70)}\"`);\r\n if (lines.length > 0) return lines;\r\n }\r\n }\r\n\r\n if (toolName === 'scaffold') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const created = Array.isArray(o['created']) ? (o['created'] as unknown[]) : undefined;\r\n const skipped = Array.isArray(o['skipped']) ? (o['skipped'] as unknown[]) : undefined;\r\n const parts: string[] = [];\r\n if (created !== undefined) parts.push(`${created.length} created`);\r\n if (skipped !== undefined && skipped.length > 0) parts.push(`${skipped.length} skipped`);\r\n if (parts.length > 0) return [parts.join(' · ')];\r\n }\r\n }\r\n\r\n if (toolName === 'remember' || toolName === 'forget' || toolName === 'memory') {\r\n return ok ? [toolName === 'forget' ? 'removed' : 'saved'] : [text.split('\\n')[0] ?? ''];\r\n }\r\n\r\n if (toolName === 'mode') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const mode = stringOf(o['mode']) ?? stringOf(o['active']) ?? stringOf(o['name']);\r\n if (mode) return [`mode: ${mode}`];\r\n }\r\n }\r\n\r\n if (toolName === 'search') {\r\n if (json && typeof json === 'object') {\r\n const o = json as Record<string, unknown>;\r\n const matches = Array.isArray(o['matches'])\r\n ? (o['matches'] as unknown[])\r\n : Array.isArray(o['results'])\r\n ? (o['results'] as unknown[])\r\n : undefined;\r\n const count = numOf(o['count']) ?? matches?.length;\r\n if (count !== undefined) {\r\n if (count === 0) return ['no results'];\r\n const lines: string[] = [`${count} result${count === 1 ? '' : 's'}`];\r\n const firstHit = matches && matches.length > 0 ? formatMatchHit(matches[0]) : undefined;\r\n if (firstHit) lines.push(firstHit);\r\n return lines;\r\n }\r\n }\r\n }\r\n\r\n if (toolName === 'logs') {\r\n const lines = text.split('\\n').filter((l) => l.trim());\r\n if (lines.length === 0) return [];\r\n const head = `${lines.length} line${lines.length === 1 ? '' : 's'}`;\r\n const lastLine = lines[lines.length - 1];\r\n return lastLine ? [head, `\"${truncMid(lastLine.trim(), 70)}\"`] : [head];\r\n }\r\n\r\n // Generic fallback — first non-empty line, collapsed.\r\n const firstLine = text.split('\\n').find((l) => l.trim()) ?? text;\r\n return [truncMid(firstLine.replace(/\\s+/g, ' '), OUT_BUDGET)];\r\n}\r\n\r\nfunction firstNonEmpty(text: string): string | undefined {\r\n if (!text) return undefined;\r\n const line = text.split('\\n').find((l) => l.trim());\r\n return line ? line.replace(/\\s+/g, ' ').trim() : undefined;\r\n}\r\n\r\nfunction formatMatchHit(hit: unknown): string | undefined {\r\n if (typeof hit === 'string') return truncMid(hit, 70);\r\n if (hit && typeof hit === 'object') {\r\n const o = hit as Record<string, unknown>;\r\n const file = stringOf(o['file']) ?? stringOf(o['path']);\r\n const line = numOf(o['line']) ?? numOf(o['lineNumber']);\r\n const snippet = stringOf(o['text']) ?? stringOf(o['match']) ?? stringOf(o['preview']);\r\n if (file) {\r\n const head = line !== undefined ? `${shortenPath(file, 40)}:${line}` : shortenPath(file, 50);\r\n return snippet ? `${head} ${truncMid(snippet.replace(/\\s+/g, ' '), 40)}` : head;\r\n }\r\n if (snippet) return truncMid(snippet, 70);\r\n }\r\n return undefined;\r\n}\r\n\r\nexport type DiffLineKind = 'add' | 'del' | 'hunk' | 'ctx' | 'meta';\r\n\r\nexport interface DiffLineRow {\r\n kind: DiffLineKind;\r\n text: string;\r\n}\r\n\r\nconst DIFF_MAX_LINES = 8;\r\n\r\n/**\r\n * Pull a unified-diff string out of a tool's JSON output, then turn it\r\n * into a small, structured preview suitable for colour-coded rendering\r\n * in the TUI history. We cap at ~8 lines so a giant patch doesn't\r\n * dominate the chat scrollback; the renderer surfaces the hidden count.\r\n */\r\nexport function extractDiffPreview(\r\n toolName: string,\r\n output: string | undefined,\r\n): { rows: DiffLineRow[]; hidden: number } | undefined {\r\n if (!output) return undefined;\r\n const text = output.trim();\r\n if (!text) return undefined;\r\n\r\n let diff: string | undefined;\r\n if (toolName === 'edit' || toolName === 'diff') {\r\n const parsed = tryParseJson(text);\r\n if (parsed && typeof parsed === 'object') {\r\n diff = stringOf((parsed as Record<string, unknown>)['diff']);\r\n }\r\n } else if (toolName === 'patch') {\r\n const parsed = tryParseJson(text);\r\n if (parsed && typeof parsed === 'object') {\r\n diff =\r\n stringOf((parsed as Record<string, unknown>)['diff']) ??\r\n stringOf((parsed as Record<string, unknown>)['stdout']);\r\n } else if (text.includes('@@') || text.startsWith('---')) {\r\n diff = text;\r\n }\r\n }\r\n\r\n if (!diff || !diff.trim() || diff.startsWith('(no-op')) return undefined;\r\n return parseUnifiedDiff(diff, DIFF_MAX_LINES);\r\n}\r\n\r\nfunction parseUnifiedDiff(diff: string, maxLines: number): { rows: DiffLineRow[]; hidden: number } {\r\n const all: DiffLineRow[] = [];\r\n for (const raw of diff.split('\\n')) {\r\n const line = raw.replace(/\\r$/, '');\r\n if (line.startsWith('+++') || line.startsWith('---')) continue;\r\n if (line.startsWith('diff --git') || line.startsWith('index ')) continue;\r\n if (line.startsWith('@@')) {\r\n all.push({ kind: 'hunk', text: truncMid(line, 60) });\r\n continue;\r\n }\r\n if (line.startsWith('+')) {\r\n all.push({ kind: 'add', text: truncMid(line, 100) });\r\n continue;\r\n }\r\n if (line.startsWith('-')) {\r\n all.push({ kind: 'del', text: truncMid(line, 100) });\r\n continue;\r\n }\r\n if (line.startsWith('\\\\ No newline')) {\r\n all.push({ kind: 'meta', text: line });\r\n continue;\r\n }\r\n if (line.length === 0) continue;\r\n all.push({ kind: 'ctx', text: truncMid(line, 100) });\r\n }\r\n if (all.length === 0) return { rows: [], hidden: 0 };\r\n if (all.length <= maxLines) return { rows: all, hidden: 0 };\r\n return { rows: all.slice(0, maxLines), hidden: all.length - maxLines };\r\n}\r\n\r\nfunction stringOf(v: unknown): string | undefined {\r\n return typeof v === 'string' && v.length > 0 ? v : undefined;\r\n}\r\n\r\nfunction numOf(v: unknown): number | undefined {\r\n return typeof v === 'number' && Number.isFinite(v) ? v : undefined;\r\n}\r\n\r\nfunction tryParseJson(s: string): unknown {\r\n const t = s.trimStart();\r\n if (!t.startsWith('{') && !t.startsWith('[')) return undefined;\r\n try {\r\n return JSON.parse(s);\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction scanNumberedRange(text: string): { first?: number; last?: number; count: number } {\r\n let first: number | undefined;\r\n let last: number | undefined;\r\n let count = 0;\r\n for (const line of text.split('\\n')) {\r\n const m = line.match(/^\\s*(\\d+)→/);\r\n if (m?.[1]) {\r\n const n = Number.parseInt(m[1], 10);\r\n if (Number.isFinite(n)) {\r\n if (first === undefined) first = n;\r\n last = n;\r\n count++;\r\n }\r\n }\r\n }\r\n return { first, last, count };\r\n}\r\n\r\nfunction countLines(text: string): number {\r\n if (!text) return 0;\r\n return text.replace(/\\n$/, '').split('\\n').length;\r\n}\r\n\r\nfunction fmtBytes(n: number): string {\r\n if (n < 1024) return `${n}B`;\r\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)}KB`;\r\n return `${(n / (1024 * 1024)).toFixed(1)}MB`;\r\n}\r\n\r\nfunction truncMid(s: string, max: number): string {\r\n if (s.length <= max) return s;\r\n return `${s.slice(0, max - 1)}…`;\r\n}\r\n","import type React from 'react';\r\nimport { Box, Text, useInput } from 'ink';\r\n\r\nexport interface InputProps {\r\n prompt?: string;\r\n value: string;\r\n cursor: number;\r\n placeholders: string[];\r\n disabled?: boolean;\r\n hint?: string;\r\n onKey: (input: string, key: KeyEvent) => void;\r\n}\r\n\r\nexport interface KeyEvent {\r\n upArrow: boolean;\r\n downArrow: boolean;\r\n leftArrow: boolean;\r\n rightArrow: boolean;\r\n return: boolean;\r\n escape: boolean;\r\n ctrl: boolean;\r\n meta: boolean;\r\n shift: boolean;\r\n tab: boolean;\r\n backspace: boolean;\r\n delete: boolean;\r\n pageUp: boolean;\r\n pageDown: boolean;\r\n}\r\n\r\nexport function Input({\r\n prompt = '› ',\r\n value,\r\n cursor,\r\n placeholders,\r\n disabled,\r\n hint,\r\n onKey,\r\n}: InputProps): React.ReactElement {\r\n useInput((input, key) => {\r\n if (disabled) return;\r\n onKey(input, key as KeyEvent);\r\n });\r\n\r\n const before = value.slice(0, cursor);\r\n const at = value.slice(cursor, cursor + 1) || ' ';\r\n const after = value.slice(cursor + 1);\r\n\r\n // Disabled (aborting an iteration) is the only signal that needs a\r\n // hard visual cue — paint the prompt red. We avoid wrapping the input\r\n // in a border Box: Ink redraws the live area on every state change,\r\n // and in non-altScreen mode the previous frame's border is left in\r\n // the terminal's scrollback. A `> ` prompt + inverse cursor is enough\r\n // to indicate the input row.\r\n const promptColor = disabled ? 'red' : 'cyan';\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n {placeholders.map((p, i) => (\r\n // biome-ignore lint/suspicious/noArrayIndexKey: placeholders are append-only, index is stable\r\n <Text key={i} dimColor>\r\n {' ↳ '}\r\n {p}\r\n </Text>\r\n ))}\r\n {/* Single <Text> wrapper so prompt + buffer + cursor + tail all wrap\r\n as one continuous string. Splitting them across sibling Text\r\n elements would let each piece wrap independently and shift the\r\n cursor cell off the intended character. */}\r\n <Text>\r\n <Text color={promptColor}>{prompt}</Text>\r\n {before}\r\n <Text inverse>{at}</Text>\r\n {after}\r\n </Text>\r\n {hint ? <Text dimColor>{hint}</Text> : null}\r\n </Box>\r\n );\r\n}\r\n","import type React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport type { TokenCounter } from '@wrongstack/core';\r\nimport type { GitInfo } from '../git-info.js';\r\n\r\nexport interface TodoCounts {\r\n pending: number;\r\n inProgress: number;\r\n completed: number;\r\n}\r\n\r\nexport interface ContextWindow {\r\n /** Input tokens of the most recent provider request — the de-facto live context size. */\r\n used: number;\r\n /** Provider's declared maxContext capability. */\r\n max: number;\r\n}\r\n\r\nexport interface StatusBarProps {\r\n model: string;\r\n state: 'idle' | 'running' | 'streaming' | 'aborting';\r\n tokenCounter?: TokenCounter;\r\n hint?: string;\r\n queueCount?: number;\r\n yolo?: boolean;\r\n /** Session elapsed in milliseconds. Renders as `mm:ss` (< 1h) or `h:mm:ss`. */\r\n elapsedMs?: number;\r\n todos?: TodoCounts;\r\n git?: GitInfo | null;\r\n subagentCount?: number;\r\n /** Renders the \"ctx ████░░ 42%\" chip on line 1 when present. */\r\n context?: ContextWindow;\r\n}\r\n\r\n/**\r\n * Two-line status bar. The first line stays compact and shows the\r\n * runtime essentials (state · model · tokens · cost · queue · running\r\n * tool). The second line opts in only when there's actually something\r\n * to show — git branch, elapsed time, todo counts, YOLO marker — so a\r\n * vanilla session keeps the original single-line footprint.\r\n */\r\nexport function StatusBar({\r\n model,\r\n state,\r\n tokenCounter,\r\n hint,\r\n queueCount = 0,\r\n yolo = false,\r\n elapsedMs,\r\n todos,\r\n git,\r\n subagentCount = 0,\r\n context,\r\n}: StatusBarProps): React.ReactElement {\r\n const usage = tokenCounter?.total();\r\n const cost = tokenCounter?.estimateCost();\r\n const cache = tokenCounter?.cacheStats();\r\n const stateColor =\r\n state === 'idle' ? 'cyan' : state === 'aborting' ? 'yellow' : 'green';\r\n const stateLabel =\r\n state === 'idle' ? 'idle' : state === 'aborting' ? 'aborting…' : 'thinking…';\r\n\r\n const hasSecondLine =\r\n yolo ||\r\n elapsedMs !== undefined ||\r\n (todos && (todos.pending > 0 || todos.inProgress > 0 || todos.completed > 0)) ||\r\n (git !== null && git !== undefined) ||\r\n subagentCount > 0;\r\n\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n paddingX={1}\r\n borderStyle=\"single\"\r\n borderTop={true}\r\n borderBottom={false}\r\n borderLeft={false}\r\n borderRight={false}\r\n >\r\n <Box flexDirection=\"row\" gap={2}>\r\n <Text color={stateColor}>● {stateLabel}</Text>\r\n <Text dimColor>│</Text>\r\n <Text color=\"magenta\">{model}</Text>\r\n {context && context.max > 0 ? (\r\n <>\r\n <Text dimColor>│</Text>\r\n <ContextChip ctx={context} />\r\n </>\r\n ) : null}\r\n {usage ? (\r\n <>\r\n <Text dimColor>│</Text>\r\n <Text>\r\n ↑ <Text color=\"cyan\">{fmtTok(usage.input)}</Text> ↓{' '}\r\n <Text color=\"cyan\">{fmtTok(usage.output)}</Text>\r\n </Text>\r\n </>\r\n ) : null}\r\n {cache && cache.hitRatio > 0 ? (\r\n <>\r\n <Text dimColor>│</Text>\r\n <Text dimColor>cache {(cache.hitRatio * 100).toFixed(0)}%</Text>\r\n </>\r\n ) : null}\r\n {cost && cost.total > 0 ? (\r\n <>\r\n <Text dimColor>│</Text>\r\n <Text color=\"yellow\">${cost.total.toFixed(4)}</Text>\r\n </>\r\n ) : null}\r\n {queueCount > 0 ? (\r\n <>\r\n <Text dimColor>│</Text>\r\n <Text color=\"cyan\">⌛ queued: {queueCount}</Text>\r\n </>\r\n ) : null}\r\n {hint ? (\r\n <>\r\n <Text dimColor>│</Text>\r\n <Text dimColor>{hint}</Text>\r\n </>\r\n ) : null}\r\n </Box>\r\n\r\n {hasSecondLine ? (\r\n <Box flexDirection=\"row\" gap={2}>\r\n {yolo ? (\r\n <Text color=\"red\" bold>\r\n ⚠ YOLO\r\n </Text>\r\n ) : null}\r\n {elapsedMs !== undefined ? (\r\n <>\r\n {yolo ? <Text dimColor>│</Text> : null}\r\n <Text dimColor>⏱ {fmtElapsed(elapsedMs)}</Text>\r\n </>\r\n ) : null}\r\n {git ? (\r\n <>\r\n {yolo || elapsedMs !== undefined ? <Text dimColor>│</Text> : null}\r\n <Text>\r\n <Text color=\"magenta\">⎇ {git.branch}</Text>\r\n {git.added > 0 ? <Text color=\"green\"> +{git.added}</Text> : null}\r\n {git.deleted > 0 ? <Text color=\"red\"> -{git.deleted}</Text> : null}\r\n {git.untracked > 0 ? <Text dimColor> ?{git.untracked}</Text> : null}\r\n </Text>\r\n </>\r\n ) : null}\r\n {todos && (todos.pending > 0 || todos.inProgress > 0 || todos.completed > 0) ? (\r\n <>\r\n <Text dimColor>│</Text>\r\n <Text>\r\n {todos.inProgress > 0 ? <Text color=\"yellow\">⌛ {todos.inProgress}</Text> : null}\r\n {todos.inProgress > 0 && (todos.pending > 0 || todos.completed > 0) ? ' ' : ''}\r\n {todos.pending > 0 ? <Text dimColor>☐ {todos.pending}</Text> : null}\r\n {todos.pending > 0 && todos.completed > 0 ? ' ' : ''}\r\n {todos.completed > 0 ? <Text color=\"green\">✓ {todos.completed}</Text> : null}\r\n </Text>\r\n </>\r\n ) : null}\r\n {subagentCount > 0 ? (\r\n <>\r\n <Text dimColor>│</Text>\r\n <Text color=\"blue\">🌐 {subagentCount} agent{subagentCount === 1 ? '' : 's'}</Text>\r\n </>\r\n ) : null}\r\n </Box>\r\n ) : null}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction ContextChip({ ctx }: { ctx: ContextWindow }): React.ReactElement {\r\n const ratio = Math.max(0, Math.min(1, ctx.used / ctx.max));\r\n const pct = Math.round(ratio * 100);\r\n // Colour ramp: cool while there's plenty of headroom, warn at the\r\n // two-thirds mark, alarm once we're inside the last 20% — the model\r\n // typically starts losing the head of the conversation around there.\r\n const color = ratio >= 0.85 ? 'red' : ratio >= 0.65 ? 'yellow' : 'cyan';\r\n return (\r\n <Text>\r\n <Text dimColor>ctx </Text>\r\n <Text color={color}>{renderProgress(ratio, 10)}</Text>\r\n <Text color={color}> {pct}%</Text>\r\n <Text dimColor>\r\n {' '}\r\n ({fmtTok(ctx.used)}/{fmtTok(ctx.max)})\r\n </Text>\r\n </Text>\r\n );\r\n}\r\n\r\nconst FILLED = '█';\r\nconst EMPTY = '░';\r\n\r\n/**\r\n * Render a ratio 0..1 as a width-N block bar. We round to the nearest\r\n * cell rather than flooring so a 5% bar still shows one filled cell —\r\n * otherwise low-usage sessions look identical to an empty start.\r\n */\r\nexport function renderProgress(ratio: number, width: number): string {\r\n const clamped = Math.max(0, Math.min(1, ratio));\r\n const filled = clamped === 0 ? 0 : Math.max(1, Math.round(clamped * width));\r\n const capped = Math.min(width, filled);\r\n return FILLED.repeat(capped) + EMPTY.repeat(width - capped);\r\n}\r\n\r\nfunction fmtTok(n: number): string {\r\n if (n < 1000) return String(n);\r\n if (n < 1_000_000) return `${(n / 1000).toFixed(n < 10_000 ? 1 : 0)}k`;\r\n return `${(n / 1_000_000).toFixed(1)}M`;\r\n}\r\n\r\nexport function fmtElapsed(ms: number): string {\r\n const totalSec = Math.floor(ms / 1000);\r\n const h = Math.floor(totalSec / 3600);\r\n const m = Math.floor((totalSec % 3600) / 60);\r\n const s = totalSec % 60;\r\n if (h > 0) {\r\n return `${h}:${pad2(m)}:${pad2(s)}`;\r\n }\r\n return `${pad2(m)}:${pad2(s)}`;\r\n}\r\n\r\nfunction pad2(n: number): string {\r\n return n < 10 ? `0${n}` : String(n);\r\n}\r\n","import type React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\nexport interface FilePickerProps {\r\n query: string;\r\n matches: string[];\r\n selected: number;\r\n}\r\n\r\nexport function FilePicker({ query, matches, selected }: FilePickerProps): React.ReactElement {\r\n if (matches.length === 0) {\r\n return (\r\n <Box flexDirection=\"column\" paddingX={1}>\r\n <Text dimColor>@{query} — no matches</Text>\r\n </Box>\r\n );\r\n }\r\n return (\r\n <Box flexDirection=\"column\" paddingX={1}>\r\n <Text dimColor>\r\n @{query || '…'} — ↑/↓ select, Enter attach, Esc cancel\r\n </Text>\r\n {matches.map((m, i) => (\r\n <Text key={m} color={i === selected ? 'cyan' : undefined} inverse={i === selected}>\r\n {i === selected ? '› ' : ' '}\r\n {highlight(m, query)}\r\n </Text>\r\n ))}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction highlight(path: string, query: string): string {\r\n // Visual highlight is omitted for terseness; ink Text styling at char level\r\n // requires splitting into segments. Keep the path verbatim for now.\r\n return path;\r\n}\r\n","import type React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport type { SlashCommandMatch } from '../app.js';\r\n\r\nexport interface SlashMenuProps {\r\n query: string;\r\n matches: SlashCommandMatch[];\r\n selected: number;\r\n}\r\n\r\nexport function SlashMenu({ query, matches, selected }: SlashMenuProps): React.ReactElement {\r\n const placeholder = query ? `/${query}` : '/';\r\n return (\r\n <Box flexDirection=\"column\" paddingX={1}>\r\n <Text dimColor>\r\n {placeholder || '/'} — ↑/↓ select, Enter dispatch, Tab autocomplete, Esc close\r\n </Text>\r\n {matches.map((m, i) => (\r\n <Text key={m.name} color={i === selected ? 'cyan' : undefined} inverse={i === selected}>\r\n {i === selected ? '› ' : ' '}\r\n <Text bold>{m.name}</Text>\r\n {m.argsHint ? <Text dimColor> {m.argsHint}</Text> : null}\r\n <Text dimColor> — {m.description}</Text>\r\n </Text>\r\n ))}\r\n {matches.length === 0 && (\r\n <Text dimColor>No matching commands</Text>\r\n )}\r\n </Box>\r\n );\r\n}","import type React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\nexport interface ProviderOption {\r\n id: string;\r\n family: string;\r\n /** Model ids the picker offers in step 2 for this provider. */\r\n models: string[];\r\n /** Optional dim hint shown next to the model list (e.g. \"from saved config\"). */\r\n modelsLabel?: string;\r\n}\r\n\r\nexport interface ModelPickerProps {\r\n step: 'provider' | 'model';\r\n providerOptions: ProviderOption[];\r\n modelOptions: string[];\r\n selected: number;\r\n pickedProviderId?: string;\r\n /** Status hint (e.g. error from a failed switch attempt) shown at the bottom. */\r\n hint?: string;\r\n}\r\n\r\n/**\r\n * Two-step Ink overlay for the TUI's `/model` command.\r\n * Step 1: pick a provider that has a key.\r\n * Step 2: pick a model bound to that provider.\r\n *\r\n * Driven entirely by props — App owns the cursor state and key events.\r\n * Render is intentionally compact; the host frames it in a single Box.\r\n */\r\nexport function ModelPicker({\r\n step,\r\n providerOptions,\r\n modelOptions,\r\n selected,\r\n pickedProviderId,\r\n hint,\r\n}: ModelPickerProps): React.ReactElement {\r\n if (step === 'provider') {\r\n return (\r\n <Box flexDirection=\"column\" paddingX={1}>\r\n <Text color=\"cyan\" bold>━━ Switch model — Step 1/2: Pick provider ━━</Text>\r\n <Text dimColor>↑/↓ navigate · Enter select · Esc cancel</Text>\r\n {providerOptions.length === 0 ? (\r\n <Text dimColor>(no providers with keys — add one via `wstack auth`)</Text>\r\n ) : (\r\n providerOptions.map((p, i) => (\r\n <Text key={p.id} color={i === selected ? 'cyan' : undefined} inverse={i === selected}>\r\n {i === selected ? '› ' : ' '}\r\n <Text bold>{p.id.padEnd(28)}</Text>\r\n <Text dimColor> [{p.family}]</Text>\r\n <Text dimColor> {p.models.length} model{p.models.length === 1 ? '' : 's'}</Text>\r\n </Text>\r\n ))\r\n )}\r\n {hint ? <Text color=\"yellow\">{hint}</Text> : null}\r\n </Box>\r\n );\r\n }\r\n return (\r\n <Box flexDirection=\"column\" paddingX={1}>\r\n <Text color=\"cyan\" bold>\r\n ━━ Switch model — Step 2/2: Pick model{' '}\r\n ({pickedProviderId}) ━━\r\n </Text>\r\n <Text dimColor>↑/↓ navigate · Enter select · Esc back · Ctrl-C cancel</Text>\r\n {modelOptions.length === 0 ? (\r\n <Text dimColor>(no models known for this provider)</Text>\r\n ) : (\r\n modelOptions.map((id, i) => (\r\n <Text key={id} color={i === selected ? 'cyan' : undefined} inverse={i === selected}>\r\n {i === selected ? '› ' : ' '}\r\n {id}\r\n </Text>\r\n ))\r\n )}\r\n {hint ? <Text color=\"yellow\">{hint}</Text> : null}\r\n </Box>\r\n );\r\n}\r\n","import type React from 'react';\r\nimport { Box, Text, useInput } from 'ink';\r\n\r\nexport interface ConfirmPromptProps {\r\n toolName: string;\r\n input: unknown;\r\n suggestedPattern: string;\r\n onDecision: (decision: 'yes' | 'no' | 'always' | 'deny') => void;\r\n}\r\n\r\nfunction stringifyInput(input: unknown): string {\r\n if (!input || typeof input !== 'object') return '';\r\n const obj = input as Record<string, unknown>;\r\n return Object.entries(obj)\r\n .filter(([k]) => k !== 'content' && k !== 'new_string')\r\n .map(([k, v]) => `${k}: ${truncate(JSON.stringify(v), 80)}`)\r\n .join(' ');\r\n}\r\n\r\nfunction truncate(s: string, max: number): string {\r\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\r\n}\r\n\r\nfunction hasDiff(input: unknown): boolean {\r\n return Boolean(\r\n input && typeof input === 'object' && 'diff' in (input as Record<string, unknown>),\r\n );\r\n}\r\n\r\nfunction renderDiffLine(line: string): React.ReactElement {\r\n const prefix = line.startsWith('+') ? 'green' : line.startsWith('-') ? 'red' : line.startsWith('@@') ? 'cyan' : undefined;\r\n return (\r\n <Text key={line} color={prefix}>\r\n {line}\r\n {'\\n'}\r\n </Text>\r\n );\r\n}\r\n\r\nfunction renderDiff(diff: string): React.ReactElement {\r\n const lines = diff.split('\\n').filter((l) => l.length > 0).slice(0, 20);\r\n return (\r\n <Box flexDirection=\"column\" paddingX={2}>\r\n {lines.map((l) => renderDiffLine(l))}\r\n </Box>\r\n );\r\n}\r\n\r\nexport function ConfirmPrompt({ toolName, input, suggestedPattern, onDecision }: ConfirmPromptProps): React.ReactElement {\r\n useInput((_, key) => {\r\n if (key.return) {\r\n onDecision('yes');\r\n } else if (key.escape) {\r\n onDecision('no');\r\n } else if (key.ctrl && _.toLowerCase() === 'a') {\r\n onDecision('always');\r\n } else if (key.ctrl && _.toLowerCase() === 'd') {\r\n onDecision('deny');\r\n }\r\n });\r\n\r\n const inputSummary = stringifyInput(input);\r\n const showDiff = hasDiff(input);\r\n const inp = input as { diff?: unknown };\r\n const diff = typeof inp?.diff === 'string' ? inp.diff : '';\r\n\r\n return (\r\n <Box flexDirection=\"column\" borderStyle=\"single\" borderTop={false} borderLeft={false} borderRight={false} borderBottom={false} paddingX={1}>\r\n <Box flexDirection=\"row\">\r\n <Text bold color=\"yellow\">\r\n ⚠ Confirm\r\n </Text>\r\n <Text> </Text>\r\n <Text bold>{toolName}</Text>\r\n </Box>\r\n {inputSummary ? (\r\n <Text dimColor>{inputSummary}</Text>\r\n ) : null}\r\n {showDiff && diff ? (\r\n <Box flexDirection=\"column\" marginY={1}>\r\n {renderDiff(diff)}\r\n </Box>\r\n ) : null}\r\n <Text dimColor>─────────────────</Text>\r\n <Box flexDirection=\"row\">\r\n <Text>\r\n <Text bold color=\"green\">[↵]</Text>\r\n <Text dimColor> yes </Text>\r\n <Text bold color=\"red\">[Esc]</Text>\r\n <Text dimColor> no </Text>\r\n <Text bold color=\"cyan\">[Ctrl+A]</Text>\r\n <Text dimColor> always ({suggestedPattern}) </Text>\r\n <Text bold color=\"red\">[Ctrl+D]</Text>\r\n <Text dimColor> deny</Text>\r\n </Text>\r\n </Box>\r\n </Box>\r\n );\r\n}","import * as fs from 'node:fs/promises';\nimport type { Dirent } from 'node:fs';\nimport * as path from 'node:path';\n\nconst IGNORED_DIRS = new Set([\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n '.next',\n '.turbo',\n '.cache',\n 'coverage',\n '.idea',\n '.vscode',\n]);\n\nconst MAX_FILES_INDEXED = 5000;\nconst MAX_DEPTH = 8;\n\nlet cache: { root: string; files: string[]; loadedAt: number } | null = null;\nconst CACHE_TTL_MS = 30_000;\n\nasync function loadIndex(root: string): Promise<string[]> {\n const now = Date.now();\n if (cache && cache.root === root && now - cache.loadedAt < CACHE_TTL_MS) {\n return cache.files;\n }\n const files: string[] = [];\n await walk(root, '', 0, files);\n files.sort();\n cache = { root, files, loadedAt: now };\n return files;\n}\n\nasync function walk(root: string, rel: string, depth: number, out: string[]): Promise<void> {\n if (out.length >= MAX_FILES_INDEXED) return;\n if (depth > MAX_DEPTH) return;\n const dir = rel ? path.join(root, rel) : root;\n let entries: Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n if (out.length >= MAX_FILES_INDEXED) return;\n if (e.name.startsWith('.') && e.name !== '.env.example') continue;\n if (IGNORED_DIRS.has(e.name)) continue;\n const next = rel ? `${rel}/${e.name}` : e.name;\n if (e.isDirectory()) {\n await walk(root, next, depth + 1, out);\n } else if (e.isFile()) {\n out.push(next);\n }\n }\n}\n\n/**\n * Subsequence (fuzzy) match — each character of `query` must appear in `s`\n * in order. Lower scores rank earlier. Score combines:\n * - shorter match span (chars close together = better)\n * - earlier first-match offset\n * - shorter total path length\n */\nfunction score(s: string, query: string): number | null {\n if (!query) return s.length;\n const ql = query.toLowerCase();\n const sl = s.toLowerCase();\n let si = 0;\n let firstHit = -1;\n let lastHit = -1;\n for (let qi = 0; qi < ql.length; qi++) {\n const c = ql.charCodeAt(qi);\n while (si < sl.length && sl.charCodeAt(si) !== c) si++;\n if (si >= sl.length) return null;\n if (firstHit < 0) firstHit = si;\n lastHit = si;\n si++;\n }\n const span = lastHit - firstHit;\n return span * 100 + firstHit * 2 + s.length;\n}\n\nexport async function searchFiles(root: string, query: string, limit = 8): Promise<string[]> {\n const all = await loadIndex(root);\n if (!query) return all.slice(0, limit);\n const scored: { path: string; score: number }[] = [];\n for (const f of all) {\n const sc = score(f, query);\n if (sc !== null) scored.push({ path: f, score: sc });\n }\n scored.sort((a, b) => a.score - b.score);\n return scored.slice(0, limit).map((x) => x.path);\n}\n\nexport function invalidateFileCache(): void {\n cache = null;\n}\n","import { spawn } from 'node:child_process';\r\nimport * as os from 'node:os';\r\nimport * as path from 'node:path';\r\nimport * as fs from 'node:fs/promises';\r\n\r\nexport interface ClipboardImage {\r\n base64: string;\r\n mediaType: 'image/png';\r\n bytes: number;\r\n}\r\n\r\nconst MAX_IMAGE_BYTES = 10 * 1024 * 1024; // 10 MB\r\n\r\n/**\r\n * Read an image from the OS clipboard if one is present.\r\n * Returns null if no image is on the clipboard, or if the platform\r\n * implementation is unavailable. Throws only on unexpected I/O errors.\r\n */\r\nexport async function readClipboardImage(): Promise<ClipboardImage | null> {\r\n const platform = process.platform;\r\n if (platform === 'win32') return readWindows();\r\n if (platform === 'darwin') return readDarwin();\r\n if (platform === 'linux') return readLinux();\r\n return null;\r\n}\r\n\r\nasync function readWindows(): Promise<ClipboardImage | null> {\r\n // Save the clipboard image (if any) to a temp PNG via PowerShell, then\r\n // read the bytes back. The script prints \"OK\" or \"NO_IMAGE\" to stdout\r\n // so we can distinguish \"no image\" from \"powershell failure\".\r\n const tmp = path.join(os.tmpdir(), `wstack-clip-${Date.now()}.png`);\r\n const ps = [\r\n 'Add-Type -AssemblyName System.Windows.Forms',\r\n 'Add-Type -AssemblyName System.Drawing',\r\n '$img = [System.Windows.Forms.Clipboard]::GetImage()',\r\n 'if ($img -eq $null) { Write-Output \"NO_IMAGE\"; exit 0 }',\r\n `$img.Save('${tmp.replace(/\\\\/g, '\\\\\\\\')}', [System.Drawing.Imaging.ImageFormat]::Png)`,\r\n 'Write-Output \"OK\"',\r\n ].join('; ');\r\n const out = await runCmd('powershell', ['-NoProfile', '-Command', ps]);\r\n if (!out || out.trim() === 'NO_IMAGE') return null;\r\n if (!out.includes('OK')) return null;\r\n return readPngFile(tmp);\r\n}\r\n\r\nasync function readDarwin(): Promise<ClipboardImage | null> {\r\n // AppleScript: write clipboard image to a temp file. If the clipboard\r\n // doesn't hold an image, the script errors out — we treat that as \"no image\".\r\n const tmp = path.join(os.tmpdir(), `wstack-clip-${Date.now()}.png`);\r\n const script = [\r\n 'try',\r\n ` set the_file to (open for access POSIX file \"${tmp}\" with write permission)`,\r\n ' write (the clipboard as «class PNGf») to the_file',\r\n ' close access the_file',\r\n 'on error',\r\n ' try',\r\n ' close access POSIX file \"' + tmp + '\"',\r\n ' end try',\r\n ' return \"NO_IMAGE\"',\r\n 'end try',\r\n 'return \"OK\"',\r\n ].join('\\n');\r\n const out = await runCmd('osascript', ['-e', script]);\r\n if (!out || out.trim() !== 'OK') return null;\r\n return readPngFile(tmp);\r\n}\r\n\r\nasync function readLinux(): Promise<ClipboardImage | null> {\r\n // Try wl-paste (Wayland) first, then xclip. Both write the PNG to stdout\r\n // when the clipboard holds an image, and fail otherwise.\r\n const tmp = path.join(os.tmpdir(), `wstack-clip-${Date.now()}.png`);\r\n const tries: Array<[string, string[]]> = [\r\n ['wl-paste', ['--type', 'image/png']],\r\n ['xclip', ['-selection', 'clipboard', '-t', 'image/png', '-o']],\r\n ];\r\n for (const [cmd, args] of tries) {\r\n const ok = await runCmdToFile(cmd, args, tmp).catch(() => false);\r\n if (ok) return readPngFile(tmp);\r\n }\r\n return null;\r\n}\r\n\r\nasync function readPngFile(p: string): Promise<ClipboardImage | null> {\r\n try {\r\n const buf = await fs.readFile(p);\r\n if (buf.length === 0) {\r\n await fs.unlink(p).catch(() => undefined);\r\n return null;\r\n }\r\n if (buf.length > MAX_IMAGE_BYTES) {\r\n await fs.unlink(p).catch(() => undefined);\r\n throw new Error(`Clipboard image exceeds ${MAX_IMAGE_BYTES / 1024 / 1024}MB limit`);\r\n }\r\n // Sanity check: PNG magic bytes.\r\n if (\r\n buf[0] !== 0x89 ||\r\n buf[1] !== 0x50 ||\r\n buf[2] !== 0x4e ||\r\n buf[3] !== 0x47\r\n ) {\r\n await fs.unlink(p).catch(() => undefined);\r\n return null;\r\n }\r\n await fs.unlink(p).catch(() => undefined);\r\n return { base64: buf.toString('base64'), mediaType: 'image/png', bytes: buf.length };\r\n } catch (err) {\r\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\r\n throw err;\r\n }\r\n}\r\n\r\nfunction runCmd(cmd: string, args: string[]): Promise<string | null> {\r\n return new Promise((resolve) => {\r\n const child = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });\r\n let out = '';\r\n child.stdout.on('data', (c) => { out += String(c); });\r\n child.on('error', () => resolve(null));\r\n child.on('exit', (code) => resolve(code === 0 ? out : null));\r\n });\r\n}\r\n\r\nfunction runCmdToFile(cmd: string, args: string[], outPath: string): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const child = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });\r\n const chunks: Buffer[] = [];\r\n child.stdout.on('data', (c: Buffer) => chunks.push(c));\r\n child.on('error', () => resolve(false));\r\n child.on('exit', async (code) => {\r\n if (code !== 0 || chunks.length === 0) return resolve(false);\r\n try {\r\n await fs.writeFile(outPath, Buffer.concat(chunks));\r\n resolve(true);\r\n } catch {\r\n resolve(false);\r\n }\r\n });\r\n });\r\n}\r\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { QueueItem } from './app.js';\n\n/**\n * Dependencies the `/queue` command needs from the App. The TUI registers\n * the command at mount time with closures over `getQueue` (reads the latest\n * queue snapshot via a ref) and the three mutators. The command returns\n * its output as `{ message }` which the App pipes into history as `info`.\n */\nexport interface QueueSlashDeps {\n getQueue: () => QueueItem[];\n clear: () => void;\n deleteAt: (positions: number[]) => void;\n}\n\nconst USAGE =\n 'Usage:\\n' +\n ' /queue — list pending messages\\n' +\n ' /queue list — same as /queue\\n' +\n ' /queue clear — drop all pending messages\\n' +\n ' /queue delete N M… — drop messages at 1-based positions';\n\nexport function createQueueSlashCommand(deps: QueueSlashDeps): SlashCommand {\n return {\n name: 'queue',\n description: 'List, clear, or delete pending messages typed while the agent was running.',\n async run(args) {\n const out = handleQueueCommand(args, deps);\n return { message: out };\n },\n };\n}\n\n/**\n * Pure logic for the /queue command. Exported separately so tests can\n * drive it without spinning up Ink.\n */\nexport function handleQueueCommand(args: string, deps: QueueSlashDeps): string {\n const trimmed = args.trim();\n const [sub, ...rest] = trimmed.split(/\\s+/);\n const subcommand = sub?.toLowerCase() ?? '';\n\n if (subcommand === '' || subcommand === 'list') {\n return renderList(deps.getQueue());\n }\n\n if (subcommand === 'clear') {\n const before = deps.getQueue().length;\n if (before === 0) return 'Queue is already empty.';\n deps.clear();\n return `Cleared ${before} queued message${before === 1 ? '' : 's'}.`;\n }\n\n if (subcommand === 'delete' || subcommand === 'del' || subcommand === 'rm') {\n if (rest.length === 0) return 'Usage: /queue delete <position> [<position>…]';\n const queue = deps.getQueue();\n if (queue.length === 0) return 'Queue is empty — nothing to delete.';\n const parsed: number[] = [];\n const invalid: string[] = [];\n const outOfRange: number[] = [];\n for (const tok of rest) {\n if (!/^\\d+$/.test(tok)) {\n invalid.push(tok);\n continue;\n }\n const n = Number.parseInt(tok, 10);\n if (n < 1 || n > queue.length) {\n outOfRange.push(n);\n continue;\n }\n parsed.push(n);\n }\n const uniqueValid = [...new Set(parsed)];\n if (uniqueValid.length === 0) {\n const parts = ['No valid positions to delete.'];\n if (invalid.length > 0) parts.push(`Invalid: ${invalid.join(', ')}.`);\n if (outOfRange.length > 0) parts.push(`Out of range (queue has ${queue.length}): ${outOfRange.join(', ')}.`);\n return parts.join(' ');\n }\n deps.deleteAt(uniqueValid);\n const parts = [\n `Deleted ${uniqueValid.length} of ${queue.length} (positions ${uniqueValid.sort((a, b) => a - b).join(', ')}).`,\n ];\n if (invalid.length > 0) parts.push(`Ignored invalid: ${invalid.join(', ')}.`);\n if (outOfRange.length > 0) parts.push(`Ignored out of range: ${outOfRange.join(', ')}.`);\n return parts.join(' ');\n }\n\n return `Unknown subcommand \"${sub}\".\\n${USAGE}`;\n}\n\nfunction renderList(queue: QueueItem[]): string {\n if (queue.length === 0) return 'Queue is empty.';\n const lines = [`Queue (${queue.length}):`];\n for (let i = 0; i < queue.length; i++) {\n const item = queue[i];\n if (!item) continue;\n const preview = oneLine(item.displayText, 100);\n lines.push(` ${i + 1}. ${preview}`);\n }\n return lines.join('\\n');\n}\n\nfunction oneLine(s: string, max: number): string {\n const collapsed = s.replace(/\\s+/g, ' ').trim();\n return collapsed.length <= max ? collapsed : `${collapsed.slice(0, max - 1)}…`;\n}\n","import { spawn } from 'node:child_process';\n\nexport interface GitInfo {\n branch: string;\n /** Total lines added in working tree vs HEAD (staged + unstaged). */\n added: number;\n /** Total lines deleted in working tree vs HEAD (staged + unstaged). */\n deleted: number;\n /** Count of untracked files in the working tree. */\n untracked: number;\n}\n\n/**\n * Read git branch + change summary for the given cwd. Returns `null`\n * when the directory isn't a git repository or git isn't installed —\n * the status bar just hides the git chip in that case.\n *\n * Spawns two short-lived `git` processes in parallel. Cheap enough to\n * call on a 3–5 second interval; the caller is responsible for the\n * cadence (this function is purely fire-and-result).\n */\nexport async function readGitInfo(cwd: string): Promise<GitInfo | null> {\n const [branchRes, numstatRes, statusRes] = await Promise.all([\n runGit(cwd, ['branch', '--show-current']),\n runGit(cwd, ['diff', 'HEAD', '--numstat']),\n runGit(cwd, ['status', '--porcelain']),\n ]);\n\n // If any of the three failed with a non-zero exit OR git wasn't\n // found, we're not in a repo (or git is missing) — bail entirely.\n if (!branchRes.ok || !numstatRes.ok || !statusRes.ok) return null;\n\n const branch = branchRes.stdout.trim();\n // Detached HEAD: `branch --show-current` returns empty. Render the\n // short SHA instead so the chip isn't blank.\n const branchLabel = branch || (await detachedShortSha(cwd)) || 'detached';\n\n let added = 0;\n let deleted = 0;\n for (const line of numstatRes.stdout.split('\\n')) {\n if (!line) continue;\n const [a, d] = line.split('\\t');\n // Binary files report '-' for both columns — skip them.\n if (a && a !== '-') added += Number.parseInt(a, 10) || 0;\n if (d && d !== '-') deleted += Number.parseInt(d, 10) || 0;\n }\n\n let untracked = 0;\n for (const line of statusRes.stdout.split('\\n')) {\n if (line.startsWith('?? ')) untracked++;\n }\n\n return { branch: branchLabel, added, deleted, untracked };\n}\n\nasync function detachedShortSha(cwd: string): Promise<string | null> {\n const res = await runGit(cwd, ['rev-parse', '--short', 'HEAD']);\n return res.ok ? res.stdout.trim() : null;\n}\n\ninterface GitResult {\n ok: boolean;\n stdout: string;\n}\n\nfunction runGit(cwd: string, args: string[]): Promise<GitResult> {\n return new Promise((resolve) => {\n let stdout = '';\n try {\n const child = spawn('git', args, {\n cwd,\n // Inherit stderr (silent) — we don't care about git's noise.\n stdio: ['ignore', 'pipe', 'ignore'],\n // Don't let a slow git hang the TUI.\n timeout: 3000,\n windowsHide: true,\n });\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk: string) => {\n stdout += chunk;\n });\n child.on('error', () => resolve({ ok: false, stdout: '' }));\n child.on('close', (code) => {\n resolve({ ok: code === 0, stdout });\n });\n } catch {\n resolve({ ok: false, stdout: '' });\n }\n });\n}\n","import React, { useEffect, useMemo, useReducer, useRef, useState } from 'react';\r\nimport * as path from 'node:path';\r\nimport * as fs from 'node:fs/promises';\r\nimport { Box, useApp } from 'ink';\r\nimport type {\r\n Agent,\r\n AttachmentStore,\r\n ContentBlock,\r\n EventBus,\r\n QueueStore,\r\n SlashCommandRegistry,\r\n TokenCounter,\r\n} from '@wrongstack/core';\r\nimport { InputBuilder } from '@wrongstack/core';\r\nimport { History, type HistoryEntry } from './components/history.js';\r\nimport { Input, type KeyEvent } from './components/input.js';\r\nimport { StatusBar } from './components/status-bar.js';\r\nimport { FilePicker } from './components/file-picker.js';\r\nimport { SlashMenu } from './components/slash-menu.js';\r\nimport { ModelPicker, type ProviderOption } from './components/model-picker.js';\r\nimport { ConfirmPrompt } from './components/confirm-prompt.js';\r\nimport { searchFiles } from './file-search.js';\r\nimport { readClipboardImage } from './clipboard.js';\r\nimport { createQueueSlashCommand } from './queue-slash.js';\r\nimport { readGitInfo, type GitInfo } from './git-info.js';\r\n\r\nexport interface QueueItem {\r\n id: number;\r\n displayText: string;\r\n blocks: ContentBlock[];\r\n}\r\n\r\n/** A registered slash command matched against the user's current / query. */\r\nexport interface SlashCommandMatch {\r\n name: string;\r\n description: string;\r\n argsHint?: string;\r\n isBuiltin: boolean;\r\n}\r\n\r\nexport interface AppProps {\r\n agent: Agent;\r\n slashRegistry: SlashCommandRegistry;\r\n attachments: AttachmentStore;\r\n events: EventBus;\r\n tokenCounter?: TokenCounter;\r\n model: string;\r\n banner?: boolean;\r\n /** Persists the queue across crashes; rehydrated on mount, written on every mutation. */\r\n queueStore?: QueueStore;\r\n /** Reflects the policy's --yolo flag for the status bar's \"⚠ YOLO\" chip. */\r\n yolo?: boolean;\r\n /** Surfaced in the startup banner. Falls back to \"dev\" when omitted. */\r\n appVersion?: string;\r\n /** Provider id shown in the banner (\"openai\", \"anthropic\", …). Defaults to \"agent\". */\r\n provider?: string;\r\n /** Wire family for the configured provider — rendered under provider in the banner. */\r\n family?: string;\r\n /** Last 3 chars of the active API key, shown in the banner for \"did I pick the right key?\" verification. */\r\n keyTail?: string;\r\n /**\r\n * Snapshot the keyed providers (and their model lists) for the\r\n * `/model` picker. Called every time the picker opens, so the result\r\n * stays in sync with config edits / new aliases. Async because the\r\n * host may need to load the models.dev catalog.\r\n */\r\n getPickableProviders?: () => Promise<ProviderOption[]>;\r\n /**\r\n * Apply a (provider, model) pair after the picker confirms. Returns\r\n * an error message on failure; null on success. The host owns the\r\n * actual Provider construction + Context mutation.\r\n */\r\n switchProviderAndModel?: (providerId: string, modelId: string) => string | null;\r\n /**\r\n * Real max-context token budget for the *active model*, resolved by the\r\n * CLI via the ModelsRegistry. The provider object only knows its family\r\n * default (e.g. anthropic = 200k) which is wrong for variants like the\r\n * 1M-context Opus model. The status bar's context chip uses this when\r\n * provided and falls back to the provider baseline otherwise.\r\n */\r\n effectiveMaxContext?: number;\r\n onExit: (code: number) => void;\r\n}\r\n\r\ntype DraftEntry = HistoryEntry extends infer T\r\n ? T extends { id: number }\r\n ? Omit<T, 'id'>\r\n : never\r\n : never;\r\n\r\ntype State = {\r\n entries: HistoryEntry[];\r\n buffer: string;\r\n cursor: number;\r\n placeholders: string[];\r\n streamingText: string;\r\n /**\r\n * Live tail of the currently streaming tool's stdout/progress text. Mirrors\r\n * the assistant `streamingText` pattern but is keyed by tool_use id so the\r\n * tail is cleared automatically when that tool finishes. Only one tool's\r\n * stream is shown at a time — multi-tool streaming is rare and stacking\r\n * tails fights for the same screen space.\r\n */\r\n toolStream: { toolUseId: string; name: string; text: string } | null;\r\n status: 'idle' | 'running' | 'streaming' | 'aborting';\r\n interrupts: number;\r\n hint: string;\r\n nextId: number;\r\n picker: { open: boolean; query: string; matches: string[]; selected: number };\r\n /** Slash command picker — open while typing a / command. */\r\n slashPicker: { open: boolean; query: string; matches: SlashCommandMatch[]; selected: number };\r\n /** Tool calls currently in-flight, by tool_use id. Surface in the status bar. */\r\n runningTools: Map<string, { name: string; startedAt: number }>;\r\n /** FIFO of user messages typed while the agent was running. Drained when idle. */\r\n queue: QueueItem[];\r\n nextQueueId: number;\r\n /** Previous input strings for up/down navigation. */\r\n inputHistory: string[];\r\n /** 0 = current buffer (not in history), 1 = most recent, n = nth most recent. */\r\n historyIndex: number;\r\n /** Two-step model picker (provider → model) — opened by `/model`. */\r\n modelPicker: {\r\n open: boolean;\r\n step: 'provider' | 'model';\r\n providerOptions: ProviderOption[];\r\n modelOptions: string[];\r\n selected: number;\r\n pickedProviderId?: string;\r\n hint?: string;\r\n };\r\n /** Pending tool confirmation — shown in place of the input when active. */\r\n confirm: {\r\n toolUseId: string;\r\n toolName: string;\r\n input: unknown;\r\n suggestedPattern: string;\r\n resolve: (decision: 'yes' | 'no' | 'always' | 'deny') => void;\r\n } | null;\r\n};\r\n\r\ntype Action =\r\n | { type: 'addEntry'; entry: DraftEntry }\r\n | { type: 'setBuffer'; buffer: string; cursor: number }\r\n | { type: 'addPlaceholder'; ph: string }\r\n | { type: 'clearInput' }\r\n | { type: 'streamDelta'; delta: string }\r\n | { type: 'streamReset' }\r\n | { type: 'status'; status: State['status'] }\r\n | { type: 'interrupt' }\r\n | { type: 'resetInterrupts' }\r\n | { type: 'hint'; text: string }\r\n | { type: 'pickerOpen'; query: string }\r\n | { type: 'pickerClose' }\r\n | { type: 'pickerSetMatches'; query: string; matches: string[] }\r\n | { type: 'pickerMove'; delta: number }\r\n | { type: 'toolStarted'; id: string; name: string }\r\n | { type: 'toolEnded'; id?: string; name?: string }\r\n | { type: 'toolStreamAppend'; toolUseId: string; name: string; text: string }\r\n | { type: 'toolStreamClear'; toolUseId?: string; name?: string }\r\n | { type: 'enqueue'; item: Omit<QueueItem, 'id'> }\r\n | { type: 'dequeueFirst' }\r\n | { type: 'queueClear' }\r\n | { type: 'queueDelete'; positions: number[] }\r\n | { type: 'slashPickerOpen'; query: string; matches: SlashCommandMatch[] }\r\n | { type: 'slashPickerClose' }\r\n | { type: 'slashPickerMove'; delta: number }\r\n | { type: 'modelPickerOpen'; providers: ProviderOption[] }\r\n | { type: 'modelPickerClose' }\r\n | { type: 'modelPickerMove'; delta: number }\r\n | { type: 'modelPickerPickProvider'; providerId: string; models: string[] }\r\n | { type: 'modelPickerBack' }\r\n | { type: 'modelPickerHint'; text?: string }\r\n | { type: 'historyPush'; text: string }\r\n | { type: 'historyUp' }\r\n | { type: 'historyDown' }\r\n | { type: 'confirmOpen'; info: State['confirm'] }\r\n | { type: 'confirmClose' };\r\n\r\nexport function reducer(state: State, action: Action): State {\r\n switch (action.type) {\r\n case 'addEntry': {\r\n // Append-only. We render finalized entries via Ink's <Static>,\r\n // which forbids removals or reordering — old items live on in the\r\n // terminal's native scrollback. Memory growth is bounded by the\r\n // terminal's own scrollback limits in practice.\r\n const appended = [\r\n ...state.entries,\r\n { ...action.entry, id: state.nextId } as HistoryEntry,\r\n ];\r\n return { ...state, entries: appended, nextId: state.nextId + 1 };\r\n }\r\n case 'setBuffer':\r\n return { ...state, buffer: action.buffer, cursor: action.cursor };\r\n case 'addPlaceholder':\r\n return { ...state, placeholders: [...state.placeholders, action.ph] };\r\n case 'clearInput':\r\n return {\r\n ...state,\r\n buffer: '',\r\n cursor: 0,\r\n placeholders: [],\r\n picker: { open: false, query: '', matches: [], selected: 0 },\r\n slashPicker: { open: false, query: '', matches: [], selected: 0 },\r\n };\r\n case 'streamDelta':\r\n return { ...state, streamingText: state.streamingText + action.delta };\r\n case 'streamReset':\r\n return { ...state, streamingText: '' };\r\n case 'status':\r\n return { ...state, status: action.status };\r\n case 'interrupt':\r\n return { ...state, interrupts: state.interrupts + 1 };\r\n case 'resetInterrupts':\r\n return { ...state, interrupts: 0 };\r\n case 'hint':\r\n return { ...state, hint: action.text };\r\n case 'pickerOpen':\r\n return {\r\n ...state,\r\n picker: { open: true, query: action.query, matches: state.picker.matches, selected: 0 },\r\n };\r\n case 'pickerClose':\r\n return {\r\n ...state,\r\n picker: { open: false, query: '', matches: [], selected: 0 },\r\n };\r\n case 'pickerSetMatches':\r\n // Guard against stale async results — only apply if query still matches.\r\n if (!state.picker.open || state.picker.query !== action.query) return state;\r\n return {\r\n ...state,\r\n picker: {\r\n ...state.picker,\r\n matches: action.matches,\r\n selected: Math.min(state.picker.selected, Math.max(0, action.matches.length - 1)),\r\n },\r\n };\r\n case 'pickerMove': {\r\n const n = state.picker.matches.length;\r\n if (n === 0) return state;\r\n const next = (state.picker.selected + action.delta + n) % n;\r\n return { ...state, picker: { ...state.picker, selected: next } };\r\n }\r\n case 'toolStarted': {\r\n const next = new Map(state.runningTools);\r\n next.set(action.id, { name: action.name, startedAt: Date.now() });\r\n return { ...state, runningTools: next };\r\n }\r\n case 'toolEnded': {\r\n const next = new Map(state.runningTools);\r\n if (action.id !== undefined && next.has(action.id)) {\r\n next.delete(action.id);\r\n return { ...state, runningTools: next };\r\n }\r\n if (action.name !== undefined) {\r\n // Fall back to clearing the oldest running entry with this name —\r\n // `tool.executed` doesn't carry the tool_use id, so we approximate.\r\n for (const [id, info] of next) {\r\n if (info.name === action.name) {\r\n next.delete(id);\r\n return { ...state, runningTools: next };\r\n }\r\n }\r\n }\r\n return state;\r\n }\r\n case 'toolStreamAppend': {\r\n // Only one tool's stream is shown at a time. If a different tool is\r\n // currently streaming, switch — last writer wins. Streams from\r\n // not-yet-acknowledged tools take over as soon as data arrives, which\r\n // matches user intuition (whatever just produced output is what's\r\n // visible).\r\n const cur = state.toolStream;\r\n if (cur && cur.toolUseId === action.toolUseId) {\r\n return {\r\n ...state,\r\n toolStream: { ...cur, text: cur.text + action.text },\r\n };\r\n }\r\n return {\r\n ...state,\r\n toolStream: { toolUseId: action.toolUseId, name: action.name, text: action.text },\r\n };\r\n }\r\n case 'toolStreamClear': {\r\n if (state.toolStream === null) return state;\r\n // Clear only when the finishing tool matches the streaming one. A\r\n // stale `tool.executed` for a different tool must not blank the\r\n // currently-visible stream.\r\n const t = state.toolStream;\r\n if (action.toolUseId !== undefined && action.toolUseId !== t.toolUseId) return state;\r\n if (action.name !== undefined && action.toolUseId === undefined && action.name !== t.name) return state;\r\n return { ...state, toolStream: null };\r\n }\r\n case 'enqueue': {\r\n const item: QueueItem = { ...action.item, id: state.nextQueueId };\r\n return {\r\n ...state,\r\n queue: [...state.queue, item],\r\n nextQueueId: state.nextQueueId + 1,\r\n };\r\n }\r\n case 'dequeueFirst': {\r\n if (state.queue.length === 0) return state;\r\n return { ...state, queue: state.queue.slice(1) };\r\n }\r\n case 'queueClear': {\r\n if (state.queue.length === 0) return state;\r\n return { ...state, queue: [] };\r\n }\r\n case 'queueDelete': {\r\n if (state.queue.length === 0 || action.positions.length === 0) return state;\r\n // Positions are 1-based; convert to 0-based set for fast filtering.\r\n const drop = new Set(action.positions.map((p) => p - 1).filter((i) => i >= 0));\r\n const filtered = state.queue.filter((_, i) => !drop.has(i));\r\n if (filtered.length === state.queue.length) return state;\r\n return { ...state, queue: filtered };\r\n }\r\n case 'slashPickerOpen':\r\n return {\r\n ...state,\r\n slashPicker: { open: true, query: action.query, matches: action.matches, selected: 0 },\r\n };\r\n case 'slashPickerClose':\r\n return {\r\n ...state,\r\n slashPicker: { open: false, query: '', matches: [], selected: 0 },\r\n };\r\n case 'slashPickerMove': {\r\n const n = state.slashPicker.matches.length;\r\n if (n === 0) return state;\r\n const next = (state.slashPicker.selected + action.delta + n) % n;\r\n return { ...state, slashPicker: { ...state.slashPicker, selected: next } };\r\n }\r\n case 'historyPush': {\r\n if (action.text === '' || action.text === state.inputHistory[0]) return state;\r\n return { ...state, inputHistory: [action.text, ...state.inputHistory].slice(0, 100) };\r\n }\r\n case 'historyUp': {\r\n if (state.inputHistory.length === 0) return state;\r\n const next = Math.min(state.historyIndex + 1, state.inputHistory.length);\r\n const entry = state.inputHistory[next - 1] ?? '';\r\n return { ...state, historyIndex: next, buffer: entry, cursor: entry.length };\r\n }\r\n case 'historyDown': {\r\n if (state.historyIndex === 0) return state;\r\n const next = state.historyIndex - 1;\r\n const entry = next === 0 ? '' : (state.inputHistory[next - 1] ?? '');\r\n return { ...state, historyIndex: next, buffer: entry, cursor: entry.length };\r\n }\r\n case 'modelPickerOpen':\r\n return {\r\n ...state,\r\n modelPicker: {\r\n open: true,\r\n step: 'provider',\r\n providerOptions: action.providers,\r\n modelOptions: [],\r\n selected: 0,\r\n hint: undefined,\r\n },\r\n };\r\n case 'modelPickerClose':\r\n return {\r\n ...state,\r\n modelPicker: {\r\n open: false,\r\n step: 'provider',\r\n providerOptions: [],\r\n modelOptions: [],\r\n selected: 0,\r\n },\r\n };\r\n case 'modelPickerMove': {\r\n if (!state.modelPicker.open) return state;\r\n const len =\r\n state.modelPicker.step === 'provider'\r\n ? state.modelPicker.providerOptions.length\r\n : state.modelPicker.modelOptions.length;\r\n if (len === 0) return state;\r\n const next = (state.modelPicker.selected + action.delta + len) % len;\r\n return {\r\n ...state,\r\n modelPicker: { ...state.modelPicker, selected: next },\r\n };\r\n }\r\n case 'modelPickerPickProvider':\r\n return {\r\n ...state,\r\n modelPicker: {\r\n ...state.modelPicker,\r\n step: 'model',\r\n modelOptions: action.models,\r\n selected: 0,\r\n pickedProviderId: action.providerId,\r\n hint: undefined,\r\n },\r\n };\r\n case 'modelPickerBack':\r\n return {\r\n ...state,\r\n modelPicker: {\r\n ...state.modelPicker,\r\n step: 'provider',\r\n modelOptions: [],\r\n selected: 0,\r\n pickedProviderId: undefined,\r\n hint: undefined,\r\n },\r\n };\r\n case 'modelPickerHint':\r\n return {\r\n ...state,\r\n modelPicker: { ...state.modelPicker, hint: action.text },\r\n };\r\n case 'confirmOpen':\r\n return { ...state, confirm: action.info };\r\n case 'confirmClose':\r\n return { ...state, confirm: null };\r\n }\r\n}\r\n\r\nconst PASTE_THRESHOLD_CHARS = 200;\r\n\r\nexport function App({\r\n agent,\r\n slashRegistry,\r\n attachments,\r\n events,\r\n tokenCounter,\r\n model,\r\n banner = true,\r\n queueStore,\r\n yolo = false,\r\n appVersion,\r\n provider,\r\n family,\r\n keyTail,\r\n getPickableProviders,\r\n switchProviderAndModel,\r\n effectiveMaxContext,\r\n onExit,\r\n}: AppProps): React.ReactElement {\r\n const { exit } = useApp();\r\n // Reactive mirrors of agent.ctx.{model,provider.id} so the status bar\r\n // re-renders when /model or /use mutate them. The banner is `Static`\r\n // and never re-renders — the user gets the textual confirmation from\r\n // the slash command's message in history instead.\r\n const [liveModel, setLiveModel] = useState<string>(model);\r\n const [liveProvider, setLiveProvider] = useState<string>(provider ?? 'agent');\r\n const [state, dispatch] = useReducer(reducer, {\r\n entries: banner\r\n ? [\r\n {\r\n id: 0,\r\n kind: 'banner' as const,\r\n version: appVersion ?? 'dev',\r\n provider: provider ?? 'agent',\r\n model,\r\n cwd: agent.ctx.cwd,\r\n family,\r\n keyTail,\r\n },\r\n ]\r\n : [],\r\n buffer: '',\r\n cursor: 0,\r\n placeholders: [],\r\n streamingText: '',\r\n toolStream: null,\r\n status: 'idle' as const,\r\n interrupts: 0,\r\n hint: '',\r\n nextId: 1,\r\n picker: { open: false, query: '', matches: [], selected: 0 },\r\n slashPicker: { open: false, query: '', matches: [], selected: 0 },\r\n runningTools: new Map(),\r\n queue: [],\r\n nextQueueId: 1,\r\n inputHistory: [],\r\n historyIndex: 0,\r\n modelPicker: {\r\n open: false,\r\n step: 'provider' as const,\r\n providerOptions: [],\r\n modelOptions: [],\r\n selected: 0,\r\n },\r\n confirm: null,\r\n });\r\n\r\n const builderRef = useRef<InputBuilder | null>(null);\r\n if (builderRef.current === null) {\r\n builderRef.current = new InputBuilder({ store: attachments });\r\n }\r\n\r\n const activeCtrlRef = useRef<AbortController | null>(null);\r\n const projectRoot = agent.ctx.projectRoot;\r\n\r\n // Source of truth for the streamed assistant text — kept here, not in\r\n // React state, because we need to read it synchronously when `agent.run`\r\n // returns. The React `streamingText` shown in the live tail is throttled\r\n // (~10fps) for redraw cost, so it can lag the actual stream by up to\r\n // FLUSH_MS. Reading from this ref instead removes the race where the\r\n // final chunk lands in pending after run() returns and ends up flashing\r\n // into the next frame's tail (leaking into scrollback).\r\n const streamingTextRef = useRef('');\r\n const pendingDeltaRef = useRef('');\r\n const flushTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n // Latest state snapshot — async callbacks (the queue drainer, slash command\r\n // closures) read this instead of capturing `state` to avoid stale closures.\r\n const stateRef = useRef<State>(state);\r\n stateRef.current = state;\r\n\r\n // Session-elapsed clock. Mount time is fixed; we re-render once per\r\n // second to refresh the \"⏱ 12:34\" chip. The interval is cheap — one\r\n // dispatch per tick into the same `tick` action — and stops cleanly\r\n // on unmount.\r\n const startedAtRef = useRef<number>(Date.now());\r\n const [nowTick, setNowTick] = React.useState<number>(Date.now());\r\n useEffect(() => {\r\n const t = setInterval(() => setNowTick(Date.now()), 1000);\r\n return () => clearInterval(t);\r\n }, []);\r\n const elapsedMs = nowTick - startedAtRef.current;\r\n\r\n // Git branch + change counts. Polled every 5s (cheap, two short-lived\r\n // `git` subprocesses). Skipped silently when the cwd isn't a repo or\r\n // git isn't installed — the chip just doesn't render.\r\n const [gitInfo, setGitInfo] = React.useState<GitInfo | null>(null);\r\n useEffect(() => {\r\n let cancelled = false;\r\n const refresh = () => {\r\n readGitInfo(agent.ctx.cwd)\r\n .then((info) => {\r\n if (!cancelled) setGitInfo(info);\r\n })\r\n .catch(() => undefined);\r\n };\r\n refresh();\r\n const t = setInterval(refresh, 5000);\r\n return () => {\r\n cancelled = true;\r\n clearInterval(t);\r\n };\r\n }, [agent.ctx.cwd]);\r\n\r\n // Latest provider request's input-token count. Tracked separately\r\n // from `tokenCounter` (which is cumulative) because for the context\r\n // fullness bar we want the live size of the conversation as it sat\r\n // on the wire — that's what determines how close we are to the\r\n // model's max context window.\r\n const [lastInputTokens, setLastInputTokens] = React.useState<number>(0);\r\n useEffect(() => {\r\n const off = events.on('provider.response', (e) => {\r\n setLastInputTokens(e.usage.input);\r\n });\r\n return () => {\r\n off();\r\n };\r\n }, [events]);\r\n\r\n // Prefer the CLI-resolved per-model maxContext (looks up the active\r\n // model in the ModelsRegistry, so 1M-context variants report 1M rather\r\n // than the provider family's 200k baseline). Fall back to the provider\r\n // baseline when the CLI couldn't resolve it (e.g. unknown model id).\r\n const maxContext = effectiveMaxContext ?? agent.ctx.provider.capabilities.maxContext;\r\n const contextWindow = useMemo(\r\n () =>\r\n lastInputTokens > 0 && maxContext > 0\r\n ? { used: lastInputTokens, max: maxContext }\r\n : undefined,\r\n [lastInputTokens, maxContext],\r\n );\r\n\r\n // Todo counts come from the agent's context, which is mutated by\r\n // the `todo` tool. Re-read on each render — array access is O(N) on\r\n // a list that's typically < 20 items.\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: nowTick intentionally triggers re-render; ctx.todos is not React state\r\n const todos = useMemo(() => {\r\n const counts = { pending: 0, inProgress: 0, completed: 0 };\r\n for (const t of agent.ctx.todos) {\r\n if (t.status === 'pending') counts.pending++;\r\n else if (t.status === 'in_progress') counts.inProgress++;\r\n else if (t.status === 'completed') counts.completed++;\r\n }\r\n return counts;\r\n // Tick on `nowTick` so we pick up todo changes even though\r\n // agent.ctx.todos isn't React state — the 1s clock doubles as a\r\n // poll for ctx-side state.\r\n }, [nowTick, agent.ctx.todos]);\r\n\r\n // Detect an active `@<query>` token at the cursor and drive the picker.\r\n // Reruns whenever buffer/cursor changes — guards against stale results.\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: picker state reads are intentional — dispatching based on stale picker state is harmless\r\n useEffect(() => {\r\n const detected = detectAtToken(state.buffer, state.cursor);\r\n if (!detected) {\r\n if (state.picker.open) dispatch({ type: 'pickerClose' });\r\n return;\r\n }\r\n if (!state.picker.open || state.picker.query !== detected.query) {\r\n dispatch({ type: 'pickerOpen', query: detected.query });\r\n }\r\n let cancelled = false;\r\n searchFiles(projectRoot, detected.query, 8)\r\n .then((matches) => {\r\n if (!cancelled) {\r\n dispatch({ type: 'pickerSetMatches', query: detected.query, matches });\r\n }\r\n })\r\n .catch(() => undefined);\r\n return () => {\r\n cancelled = true;\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [state.buffer, state.cursor, projectRoot]);\r\n\r\n // Detect an active `/<query>` token at the cursor and drive the slash picker.\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: slashPicker state reads are intentional — same pattern as @ picker above\r\n useEffect(() => {\r\n const trimmed = state.buffer.trimStart();\r\n if (!trimmed.startsWith('/')) {\r\n if (state.slashPicker.open) dispatch({ type: 'slashPickerClose' });\r\n return;\r\n }\r\n // Once any whitespace appears after the leading '/', the user has moved\r\n // past the command name into argument territory (e.g. `/model glm-5.1`).\r\n // Keeping the picker open here is actively harmful: Enter would route to\r\n // acceptSlashPickerSelection() and overwrite the typed args with just\r\n // `/<cmd> `. Close the picker so Enter submits the full line.\r\n if (/\\s/.test(trimmed)) {\r\n if (state.slashPicker.open) dispatch({ type: 'slashPickerClose' });\r\n return;\r\n }\r\n const query = trimmed.slice(1).toLowerCase();\r\n const allCommands = slashRegistry.listWithOwner();\r\n const matches: SlashCommandMatch[] = allCommands\r\n .filter(({ cmd }) => {\r\n const name = cmd.name.toLowerCase();\r\n const aliases = cmd.aliases ?? [];\r\n return name.includes(query) || aliases.some((a) => a.toLowerCase().includes(query));\r\n })\r\n .slice(0, 12)\r\n .map(({ cmd, owner }) => ({\r\n name: cmd.name,\r\n description: cmd.description,\r\n argsHint: undefined as string | undefined,\r\n isBuiltin: owner === 'core',\r\n }));\r\n\r\n if (!state.slashPicker.open) {\r\n dispatch({ type: 'slashPickerOpen', query, matches });\r\n } else if (state.slashPicker.query !== query) {\r\n dispatch({ type: 'slashPickerOpen', query, matches });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [state.buffer, slashRegistry]);\r\n\r\n const pasteClipboardImage = async (): Promise<void> => {\r\n const builder = builderRef.current;\r\n if (!builder) return;\r\n try {\r\n const img = await readClipboardImage();\r\n if (!img) {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'info', text: 'No image on the clipboard.' },\r\n });\r\n return;\r\n }\r\n const placeholder = await builder.appendImage(img.base64, img.mediaType);\r\n const kb = (img.bytes / 1024).toFixed(0);\r\n dispatch({ type: 'addPlaceholder', ph: `${placeholder} (PNG ${kb}KB)` });\r\n } catch (err) {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'error',\r\n text: `Clipboard image error: ${err instanceof Error ? err.message : String(err)}`,\r\n },\r\n });\r\n }\r\n };\r\n\r\n const acceptPickerSelection = async (): Promise<void> => {\r\n const { open, matches, selected } = state.picker;\r\n if (!open || matches.length === 0) return;\r\n const picked = matches[selected];\r\n if (!picked) return;\r\n const builder = builderRef.current;\r\n if (!builder) return;\r\n\r\n // Find the @-token span we're replacing.\r\n const tok = detectAtToken(state.buffer, state.cursor);\r\n if (!tok) {\r\n dispatch({ type: 'pickerClose' });\r\n return;\r\n }\r\n\r\n // Attach the file via the builder. The builder appends \"[file #N]\" to its\r\n // own display string, but we want to put the placeholder inline in the\r\n // visible buffer (replacing @query) so the user sees it.\r\n const absPath = path.isAbsolute(picked) ? picked : path.join(projectRoot, picked);\r\n try {\r\n const data = await fs.readFile(absPath, 'utf8');\r\n const placeholder = await builder.appendFile({\r\n kind: 'file',\r\n data,\r\n meta: { filename: picked, label: picked },\r\n });\r\n const before = state.buffer.slice(0, tok.start);\r\n const after = state.buffer.slice(tok.end);\r\n const next = `${before}${placeholder}${after}`;\r\n dispatch({\r\n type: 'setBuffer',\r\n buffer: next,\r\n cursor: tok.start + placeholder.length,\r\n });\r\n dispatch({ type: 'pickerClose' });\r\n } catch (err) {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'error', text: `Attach failed: ${err instanceof Error ? err.message : String(err)}` },\r\n });\r\n dispatch({ type: 'pickerClose' });\r\n }\r\n };\r\n\r\n /** Fill the buffer with the selected slash command and close the picker. */\r\n const acceptSlashPickerSelection = (): void => {\r\n const { open, matches, selected } = state.slashPicker;\r\n if (!open || matches.length === 0) return;\r\n const picked = matches[selected];\r\n if (!picked) return;\r\n const cmd = picked.argsHint !== undefined ? `/${picked.name} ` : `/${picked.name}`;\r\n dispatch({ type: 'setBuffer', buffer: cmd, cursor: cmd.length });\r\n dispatch({ type: 'slashPickerClose' });\r\n };\r\n\r\n // Rehydrate any queue items persisted by a previous (crashed) run.\r\n // Fires once at mount; the persist effect below picks up afterwards.\r\n // We dispatch one enqueue per item so the reducer's id allocation\r\n // stays the single source of truth — no need to import its internals.\r\n useEffect(() => {\r\n if (!queueStore) return;\r\n let cancelled = false;\r\n queueStore\r\n .read()\r\n .then((items) => {\r\n if (cancelled || items.length === 0) return;\r\n for (const item of items) {\r\n dispatch({\r\n type: 'enqueue',\r\n item: { displayText: item.displayText, blocks: item.blocks },\r\n });\r\n }\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'info',\r\n text: `Restored ${items.length} queued message${items.length === 1 ? '' : 's'} from a previous run.`,\r\n },\r\n });\r\n })\r\n .catch(() => undefined);\r\n return () => {\r\n cancelled = true;\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [queueStore]);\r\n\r\n // Persist the queue snapshot on every change. Strip the in-memory id\r\n // before writing — it's render bookkeeping, not part of the message.\r\n // Errors are swallowed: the queue lives in memory regardless, so a\r\n // persistence failure only loses crash-recovery, not the queue itself.\r\n useEffect(() => {\r\n if (!queueStore) return;\r\n queueStore\r\n .write(state.queue.map(({ displayText, blocks }) => ({ displayText, blocks })))\r\n .catch(() => undefined);\r\n }, [state.queue, queueStore]);\r\n\r\n // Register the TUI-only /queue command for the lifetime of this App.\r\n useEffect(() => {\r\n const cmd = createQueueSlashCommand({\r\n getQueue: () => stateRef.current.queue,\r\n clear: () => dispatch({ type: 'queueClear' }),\r\n deleteAt: (positions) => dispatch({ type: 'queueDelete', positions }),\r\n });\r\n slashRegistry.register(cmd);\r\n return () => {\r\n slashRegistry.unregister('queue');\r\n };\r\n }, [slashRegistry]);\r\n\r\n // Register the TUI-only `/model` command — opens a two-step picker\r\n // (provider → model). All work is local state mutation; the actual\r\n // switch fires only after the user confirms a model in step 2.\r\n useEffect(() => {\r\n if (!getPickableProviders || !switchProviderAndModel) return;\r\n const cmd = {\r\n name: 'model',\r\n aliases: ['provider', 'switch'],\r\n description: 'Pick a provider + model interactively (two-step).',\r\n async run() {\r\n const providers = await getPickableProviders();\r\n dispatch({ type: 'modelPickerOpen', providers });\r\n return { message: undefined };\r\n },\r\n };\r\n slashRegistry.register(cmd);\r\n return () => {\r\n slashRegistry.unregister('model');\r\n };\r\n }, [slashRegistry, getPickableProviders, switchProviderAndModel]);\r\n\r\n // Subscribe to provider streaming events.\r\n useEffect(() => {\r\n // Throttle stream delta DISPATCHES to reduce flicker — we batch into\r\n // React state at ~10fps. The full text is also written into\r\n // streamingTextRef synchronously on every delta, so `runBlocks` can\r\n // read the complete stream when `agent.run` returns without racing\r\n // the throttle's last unflushed batch.\r\n const FLUSH_MS = 100;\r\n const flush = () => {\r\n if (pendingDeltaRef.current) {\r\n dispatch({ type: 'streamDelta', delta: pendingDeltaRef.current });\r\n pendingDeltaRef.current = '';\r\n }\r\n flushTimerRef.current = null;\r\n };\r\n const offDelta = events.on('provider.text_delta', (e) => {\r\n // Strip any bracketed-paste DCS sequences that some providers echo\r\n // into the stream. They are invisible in a real terminal but appear as\r\n // junk text if Ink's raw rendering catches them.\r\n // biome-ignore lint/suspicious/noControlCharactersInRegex: bracketed paste escape sequences are intentional\r\n const text = e.text.replace(/\\x1b\\[200~|\\x1b\\[201~/g, '');\r\n streamingTextRef.current += text;\r\n pendingDeltaRef.current += text;\r\n if (!flushTimerRef.current) flushTimerRef.current = setTimeout(flush, FLUSH_MS);\r\n });\r\n const offToolStart = events.on('tool.started', (e) => {\r\n dispatch({ type: 'toolStarted', id: e.id, name: e.name });\r\n });\r\n const offToolProgress = events.on('tool.progress', (e) => {\r\n // Only `partial_output` becomes the live tail. Other event kinds\r\n // (`log`, `warning`, `metric`, `file_changed`) are deliberately not\r\n // rendered here — they pile up too fast and would steal screen real\r\n // estate from the assistant text. They still flow through EventBus\r\n // for observability/metrics consumers.\r\n if (e.event.type !== 'partial_output' || !e.event.text) return;\r\n dispatch({\r\n type: 'toolStreamAppend',\r\n toolUseId: e.id,\r\n name: e.name,\r\n text: e.event.text,\r\n });\r\n });\r\n const offTool = events.on('tool.executed', (e) => {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'tool',\r\n name: e.name,\r\n durationMs: e.durationMs,\r\n ok: e.ok,\r\n input: e.input,\r\n output: e.output,\r\n },\r\n });\r\n // `tool.executed` has no tool_use id; the reducer falls back to\r\n // clearing the oldest running entry that matches this name.\r\n dispatch({ type: 'toolEnded', name: e.name });\r\n // Clear the live tail for this tool — the final entry is now in\r\n // <Static>, no need to keep mirroring it below.\r\n dispatch({ type: 'toolStreamClear', name: e.name });\r\n });\r\n const offRetry = events.on('provider.retry', (e) => {\r\n const secs = (e.delayMs / 1000).toFixed(e.delayMs >= 1000 ? 1 : 2);\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'warn', text: `⟳ retry ${e.attempt} in ${secs}s — ${e.description}` },\r\n });\r\n });\r\n const offProvErr = events.on('provider.error', (e) => {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'error', text: e.description },\r\n });\r\n });\r\n const offConfirmNeeded = events.on('tool.confirm_needed', (e) => {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'confirm',\r\n toolName: e.tool.name,\r\n input: e.input,\r\n suggestedPattern: e.suggestedPattern,\r\n },\r\n });\r\n dispatch({\r\n type: 'confirmOpen',\r\n info: {\r\n toolUseId: e.toolUseId,\r\n toolName: e.tool.name,\r\n input: e.input,\r\n suggestedPattern: e.suggestedPattern,\r\n resolve: e.resolve,\r\n },\r\n });\r\n });\r\n return () => {\r\n offDelta();\r\n offToolStart();\r\n offToolProgress();\r\n offTool();\r\n offRetry();\r\n offProvErr();\r\n offConfirmNeeded();\r\n if (flushTimerRef.current) clearTimeout(flushTimerRef.current);\r\n };\r\n }, [events]);\r\n\r\n // Handle SIGINT: first cancels current iteration, second exits.\r\n useEffect(() => {\r\n const onSigint = () => {\r\n if (state.interrupts >= 1 && state.status === 'idle') {\r\n exit();\r\n onExit(130);\r\n return;\r\n }\r\n dispatch({ type: 'interrupt' });\r\n if (activeCtrlRef.current) {\r\n activeCtrlRef.current.abort();\r\n dispatch({ type: 'status', status: 'aborting' });\r\n const droppedCount = stateRef.current.queue.length;\r\n if (droppedCount > 0) {\r\n dispatch({ type: 'queueClear' });\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'warn',\r\n text: `Iteration cancelled. Dropped ${droppedCount} queued message${droppedCount === 1 ? '' : 's'}. Press Ctrl+C again to exit.`,\r\n },\r\n });\r\n } else {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'warn', text: 'Iteration cancelled. Press Ctrl+C again to exit.' },\r\n });\r\n }\r\n } else {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'warn', text: 'Press Ctrl+C again to exit.' },\r\n });\r\n }\r\n };\r\n process.on('SIGINT', onSigint);\r\n return () => {\r\n process.off('SIGINT', onSigint);\r\n };\r\n }, [state.interrupts, state.status, exit, onExit]);\r\n\r\n const handleKey = async (input: string, key: KeyEvent) => {\r\n // Note: we no longer block input while the agent is running. Enter\r\n // routes through the queue when busy (see submit()), but typing,\r\n // backspace, paste, and clipboard-image all stay live.\r\n if (state.status === 'aborting') return;\r\n\r\n // IMPORTANT: do NOT bail on `!input` here. Special keys (arrows,\r\n // Enter, Escape, Tab, Backspace) arrive with an empty `input`\r\n // string, and the slash/file pickers + cursor movement below all\r\n // depend on receiving those events. The late guard before text\r\n // insertion handles the empty-input case correctly.\r\n\r\n // Model picker takes absolute precedence: nothing else is meaningful\r\n // while the two-step overlay is open. Esc cancels (or backs out of\r\n // step 2 to step 1); Enter advances to the next step or confirms.\r\n if (state.modelPicker.open) {\r\n if (key.escape) {\r\n if (state.modelPicker.step === 'model') {\r\n dispatch({ type: 'modelPickerBack' });\r\n } else {\r\n dispatch({ type: 'modelPickerClose' });\r\n }\r\n return;\r\n }\r\n if (key.upArrow) {\r\n dispatch({ type: 'modelPickerMove', delta: -1 });\r\n return;\r\n }\r\n if (key.downArrow) {\r\n dispatch({ type: 'modelPickerMove', delta: 1 });\r\n return;\r\n }\r\n if (key.return) {\r\n if (state.modelPicker.step === 'provider') {\r\n const opt = state.modelPicker.providerOptions[state.modelPicker.selected];\r\n if (!opt) return;\r\n dispatch({\r\n type: 'modelPickerPickProvider',\r\n providerId: opt.id,\r\n models: opt.models,\r\n });\r\n return;\r\n }\r\n // step === 'model' → commit the switch\r\n const providerId = state.modelPicker.pickedProviderId;\r\n const modelId = state.modelPicker.modelOptions[state.modelPicker.selected];\r\n if (!providerId || !modelId) return;\r\n const err = switchProviderAndModel?.(providerId, modelId);\r\n if (err) {\r\n dispatch({ type: 'modelPickerHint', text: err });\r\n return;\r\n }\r\n setLiveProvider(providerId);\r\n setLiveModel(modelId);\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'info', text: `Switched to ${providerId} / ${modelId}.` },\r\n });\r\n dispatch({ type: 'modelPickerClose' });\r\n return;\r\n }\r\n // Any other key while picker is open: ignore.\r\n return;\r\n }\r\n\r\n if (state.slashPicker.open) {\r\n if (key.escape) {\r\n dispatch({ type: 'slashPickerClose' });\r\n return;\r\n }\r\n if (key.upArrow) {\r\n dispatch({ type: 'slashPickerMove', delta: -1 });\r\n return;\r\n }\r\n if (key.downArrow) {\r\n dispatch({ type: 'slashPickerMove', delta: 1 });\r\n return;\r\n }\r\n if (key.return) {\r\n await acceptSlashPickerSelection();\r\n return;\r\n }\r\n // Tab → autocomplete with selected command\r\n if (key.tab && state.slashPicker.matches.length > 0) {\r\n const sel = state.slashPicker.matches[state.slashPicker.selected];\r\n if (sel) {\r\n dispatch({ type: 'setBuffer', buffer: `/${sel.name} `, cursor: sel.name.length + 2 });\r\n dispatch({ type: 'slashPickerClose' });\r\n }\r\n return;\r\n }\r\n // Any other key falls through to normal text handling.\r\n }\r\n\r\n // Picker takes precedence over normal input handling when open.\r\n if (state.picker.open) {\r\n if (key.escape) {\r\n dispatch({ type: 'pickerClose' });\r\n return;\r\n }\r\n if (key.upArrow) {\r\n dispatch({ type: 'pickerMove', delta: -1 });\r\n return;\r\n }\r\n if (key.downArrow) {\r\n dispatch({ type: 'pickerMove', delta: 1 });\r\n return;\r\n }\r\n if (key.return) {\r\n await acceptPickerSelection();\r\n return;\r\n }\r\n // Any other key falls through to normal text handling, which will\r\n // either extend the @-query (e.g. typing more chars) or break it\r\n // (e.g. typing a space) — handled below.\r\n }\r\n\r\n if (key.return) {\r\n await submit();\r\n return;\r\n }\r\n\r\n if (key.backspace || key.delete) {\r\n if (key.ctrl) {\r\n const { cursor, buffer } = state;\r\n if (key.backspace) {\r\n if (cursor === 0) return;\r\n const beforeCursor = buffer.slice(0, cursor);\r\n const lastWordStart = beforeCursor.lastIndexOf(' ') + 1;\r\n const next = buffer.slice(0, lastWordStart) + buffer.slice(cursor);\r\n dispatch({ type: 'setBuffer', buffer: next, cursor: lastWordStart });\r\n } else {\r\n if (cursor >= buffer.length) return;\r\n const afterCursor = buffer.slice(cursor);\r\n const nextWordStart = afterCursor.indexOf(' ');\r\n const end = nextWordStart === -1 ? buffer.length : cursor + nextWordStart + 1;\r\n const next = buffer.slice(0, cursor) + buffer.slice(end);\r\n dispatch({ type: 'setBuffer', buffer: next, cursor });\r\n }\r\n return;\r\n }\r\n if (state.cursor === 0) return;\r\n const next = state.buffer.slice(0, state.cursor - 1) + state.buffer.slice(state.cursor);\r\n dispatch({ type: 'setBuffer', buffer: next, cursor: state.cursor - 1 });\r\n return;\r\n }\r\n\r\n if (key.leftArrow) {\r\n if (key.ctrl) {\r\n const { cursor, buffer } = state;\r\n if (cursor === 0) return;\r\n const beforeCursor = buffer.slice(0, cursor);\r\n const prevWordStart = beforeCursor.lastIndexOf(' ');\r\n const target = prevWordStart === -1 ? 0 : prevWordStart + 1;\r\n dispatch({ type: 'setBuffer', buffer, cursor: target });\r\n return;\r\n }\r\n if (state.cursor > 0) dispatch({ type: 'setBuffer', buffer: state.buffer, cursor: state.cursor - 1 });\r\n return;\r\n }\r\n if (key.rightArrow) {\r\n if (key.ctrl) {\r\n const { cursor, buffer } = state;\r\n if (cursor >= buffer.length) return;\r\n const afterCursor = buffer.slice(cursor);\r\n const nextWordStart = afterCursor.indexOf(' ');\r\n const target = nextWordStart === -1 ? buffer.length : cursor + nextWordStart + 1;\r\n dispatch({ type: 'setBuffer', buffer, cursor: target });\r\n return;\r\n }\r\n if (state.cursor < state.buffer.length) dispatch({ type: 'setBuffer', buffer: state.buffer, cursor: state.cursor + 1 });\r\n return;\r\n }\r\n // History scrolling is delegated to the terminal's native scrollback\r\n // (mouse wheel, Shift+PgUp in Windows Terminal, etc.) — Ink's <Static>\r\n // emits each finalized entry once and never repaints over it.\r\n if (key.upArrow) {\r\n if (state.inputHistory.length > 0) dispatch({ type: 'historyUp' });\r\n return;\r\n }\r\n if (key.downArrow) {\r\n if (state.historyIndex > 0) dispatch({ type: 'historyDown' });\r\n return;\r\n }\r\n if (key.ctrl && input === 'a') {\r\n dispatch({ type: 'setBuffer', buffer: state.buffer, cursor: 0 });\r\n return;\r\n }\r\n if (key.ctrl && input === 'e') {\r\n dispatch({ type: 'setBuffer', buffer: state.buffer, cursor: state.buffer.length });\r\n return;\r\n }\r\n if (key.ctrl && input === 'u') {\r\n dispatch({ type: 'setBuffer', buffer: '', cursor: 0 });\r\n return;\r\n }\r\n if (key.ctrl && input === 'w') {\r\n // Ctrl+W → delete word before cursor (same as Ctrl+Backspace).\r\n const { cursor, buffer } = state;\r\n if (cursor === 0) return;\r\n const beforeCursor = buffer.slice(0, cursor);\r\n const lastWordStart = beforeCursor.lastIndexOf(' ') + 1;\r\n const next = buffer.slice(0, lastWordStart) + buffer.slice(cursor);\r\n dispatch({ type: 'setBuffer', buffer: next, cursor: lastWordStart });\r\n return;\r\n }\r\n\r\n // Alt+V → read image from clipboard and attach as [image #N].\r\n if (key.meta && input === 'v') {\r\n await pasteClipboardImage();\r\n return;\r\n }\r\n\r\n if (!input || key.ctrl || key.meta) return;\r\n\r\n // Strip bracketed-paste markers if the terminal sent them through.\r\n // The wrapped payload is always treated as a paste regardless of size.\r\n let bracketedPaste = false;\r\n let cleanInput = input;\r\n if (input.includes('\\x1b[200~') || input.includes('\\x1b[201~')) {\r\n // biome-ignore lint/suspicious/noControlCharactersInRegex: bracketed paste escape sequences are intentional\r\n cleanInput = input.replace(/\\x1b\\[200~/g, '').replace(/\\x1b\\[201~/g, '');\r\n bracketedPaste = true;\r\n }\r\n\r\n // Paste detection: chunks larger than threshold or containing a newline\r\n // are routed through InputBuilder instead of inserted character-by-char.\r\n if (bracketedPaste || cleanInput.length > PASTE_THRESHOLD_CHARS || cleanInput.includes('\\n')) {\r\n const builder = builderRef.current;\r\n if (!builder) return;\r\n const ph = await builder.appendPaste(cleanInput);\r\n if (ph) {\r\n const lineCount = cleanInput.split('\\n').length;\r\n dispatch({ type: 'addPlaceholder', ph: `${ph} (${lineCount} lines)` });\r\n } else {\r\n const next =\r\n state.buffer.slice(0, state.cursor) + cleanInput + state.buffer.slice(state.cursor);\r\n dispatch({ type: 'setBuffer', buffer: next, cursor: state.cursor + cleanInput.length });\r\n }\r\n return;\r\n }\r\n\r\n const next = state.buffer.slice(0, state.cursor) + cleanInput + state.buffer.slice(state.cursor);\r\n dispatch({ type: 'setBuffer', buffer: next, cursor: state.cursor + cleanInput.length });\r\n };\r\n\r\n /**\r\n * Drive a single iteration: run the agent against `blocks`, render the\r\n * result into history, then if any messages were typed while we were\r\n * busy, pull the head of the queue and recurse. Recursion terminates\r\n * when the queue is empty (status stays idle).\r\n */\r\n const runBlocks = async (blocks: ContentBlock[]): Promise<void> => {\r\n const ctrl = new AbortController();\r\n activeCtrlRef.current = ctrl;\r\n dispatch({ type: 'status', status: 'running' });\r\n\r\n try {\r\n const startedAt = Date.now();\r\n const before = tokenCounter?.total();\r\n const costBefore = tokenCounter?.estimateCost().total ?? 0;\r\n const result = await agent.run(blocks, { signal: ctrl.signal });\r\n\r\n // Flush the streamed text into history as a single assistant entry.\r\n // Read from the synchronous ref (which mirrors every delta as it\r\n // arrives) rather than the React state — the latter trails by up to\r\n // FLUSH_MS via the throttler, so its last chunk can land *after*\r\n // run() returns and flash through the tail Box.\r\n const streamed = streamingTextRef.current;\r\n const text = result.status === 'done' && result.finalText ? result.finalText : streamed;\r\n if (text?.trim()) {\r\n dispatch({ type: 'addEntry', entry: { kind: 'assistant', text } });\r\n }\r\n // Clear every form of streaming state in lockstep — ref, pending\r\n // throttle buffer, scheduled flush timer, and React state — so no\r\n // late delta can resurrect a phantom tail into the next iteration.\r\n streamingTextRef.current = '';\r\n pendingDeltaRef.current = '';\r\n if (flushTimerRef.current) {\r\n clearTimeout(flushTimerRef.current);\r\n flushTimerRef.current = null;\r\n }\r\n dispatch({ type: 'streamReset' });\r\n\r\n if (result.status === 'aborted') {\r\n dispatch({ type: 'addEntry', entry: { kind: 'warn', text: 'Aborted.' } });\r\n } else if (result.status === 'failed') {\r\n const err = result.error;\r\n const text = err\r\n ? `Failed [${err.severity}${err.recoverable ? ', recoverable' : ''}]: ${err.describe()}`\r\n : 'Failed.';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'error', text },\r\n });\r\n } else if (result.status === 'max_iterations') {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'warn', text: `Hit max iterations (${result.iterations}).` },\r\n });\r\n }\r\n\r\n if (tokenCounter && before) {\r\n const after = tokenCounter.total();\r\n const costAfter = tokenCounter.estimateCost().total;\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'turn-summary',\r\n text: `[in: ${fmtTok(after.input - before.input)} out: ${fmtTok(after.output - before.output)} iters: ${result.iterations} cost: ${(costAfter - costBefore).toFixed(4)} ${((Date.now() - startedAt) / 1000).toFixed(1)}s]`,\r\n },\r\n });\r\n }\r\n } catch (err) {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'error', text: err instanceof Error ? err.message : String(err) },\r\n });\r\n } finally {\r\n activeCtrlRef.current = null;\r\n dispatch({ type: 'status', status: 'idle' });\r\n }\r\n\r\n // Drain the queue. If the run was aborted, the SIGINT handler has\r\n // already cleared the queue, so the head will be undefined.\r\n const head = stateRef.current.queue[0];\r\n if (head) {\r\n dispatch({ type: 'dequeueFirst' });\r\n await runBlocks(head.blocks);\r\n }\r\n };\r\n\r\n const submit = async () => {\r\n const raw = state.buffer;\r\n const trimmed = raw.trim();\r\n if (!trimmed && state.placeholders.length === 0) return;\r\n\r\n dispatch({ type: 'resetInterrupts' });\r\n\r\n // Slash commands always dispatch immediately, even mid-iteration —\r\n // they don't conflict with a running agent.\r\n if (trimmed.startsWith('/')) {\r\n dispatch({ type: 'addEntry', entry: { kind: 'user', text: trimmed } });\r\n if (state.historyIndex > 0) dispatch({ type: 'historyPush', text: trimmed });\r\n dispatch({ type: 'clearInput' });\r\n try {\r\n const res = await slashRegistry.dispatch(trimmed, agent.ctx);\r\n if (res?.message) {\r\n dispatch({ type: 'addEntry', entry: { kind: 'info', text: res.message } });\r\n }\r\n // Slash commands like /model and /use mutate agent.ctx directly.\r\n // Re-sync the visible status bar so the user sees the switch\r\n // landed; otherwise the bar keeps the startup-time values and\r\n // /model \"feels\" broken even when subsequent requests use the\r\n // new model.\r\n const ctxModel = agent.ctx.model;\r\n if (ctxModel && ctxModel !== liveModel) setLiveModel(ctxModel);\r\n const ctxProviderId = (agent.ctx.provider as { id?: string } | undefined)?.id;\r\n if (ctxProviderId && ctxProviderId !== liveProvider) setLiveProvider(ctxProviderId);\r\n if (res?.exit) {\r\n exit();\r\n onExit(0);\r\n }\r\n } catch (err) {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'error', text: err instanceof Error ? err.message : String(err) },\r\n });\r\n }\r\n return;\r\n }\r\n\r\n const builder = builderRef.current;\r\n if (!builder) return;\r\n if (trimmed) builder.appendText(trimmed);\r\n const blocks = await builder.submit();\r\n const displayText = trimmed || '(attachments only)';\r\n dispatch({ type: 'clearInput' });\r\n\r\n if (state.status !== 'idle') {\r\n // Agent is busy — queue this message for the drainer to pick up.\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'user', text: displayText, queued: true },\r\n });\r\n dispatch({ type: 'enqueue', item: { displayText, blocks } });\r\n if (state.historyIndex > 0) dispatch({ type: 'historyPush', text: trimmed });\r\n return;\r\n }\r\n\r\n dispatch({ type: 'addEntry', entry: { kind: 'user', text: displayText } });\r\n if (state.historyIndex > 0) dispatch({ type: 'historyPush', text: trimmed });\r\n await runBlocks(blocks);\r\n };\r\n\r\n const inputHint = useMemo(() => {\r\n if (state.status !== 'idle') return '';\r\n if (state.buffer.startsWith('/')) return 'slash command — Enter to dispatch';\r\n if (state.picker.open) return '';\r\n return '';\r\n }, [state.buffer, state.status, state.picker.open]);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <History entries={state.entries} streamingText={state.streamingText} toolStream={state.toolStream} />\r\n <Input\r\n value={state.buffer}\r\n cursor={state.cursor}\r\n placeholders={state.placeholders}\r\n disabled={state.status === 'aborting'}\r\n hint={inputHint}\r\n onKey={handleKey}\r\n />\r\n {state.picker.open ? (\r\n <FilePicker\r\n query={state.picker.query}\r\n matches={state.picker.matches}\r\n selected={state.picker.selected}\r\n />\r\n ) : null}\r\n {state.slashPicker.open ? (\r\n <SlashMenu\r\n query={state.slashPicker.query}\r\n matches={state.slashPicker.matches}\r\n selected={state.slashPicker.selected}\r\n />\r\n ) : null}\r\n {state.modelPicker.open ? (\r\n <ModelPicker\r\n step={state.modelPicker.step}\r\n providerOptions={state.modelPicker.providerOptions}\r\n modelOptions={state.modelPicker.modelOptions}\r\n selected={state.modelPicker.selected}\r\n pickedProviderId={state.modelPicker.pickedProviderId}\r\n hint={state.modelPicker.hint}\r\n />\r\n ) : null}\r\n {state.confirm ? (\r\n <ConfirmPrompt\r\n toolName={state.confirm.toolName}\r\n input={state.confirm.input}\r\n suggestedPattern={state.confirm.suggestedPattern}\r\n onDecision={state.confirm.resolve}\r\n />\r\n ) : null}\r\n <StatusBar\r\n model={`${liveProvider}/${liveModel}`}\r\n state={state.status}\r\n tokenCounter={tokenCounter}\r\n hint={renderRunningTools(state.runningTools) || state.hint}\r\n queueCount={state.queue.length}\r\n yolo={yolo}\r\n elapsedMs={elapsedMs}\r\n todos={todos}\r\n git={gitInfo}\r\n context={contextWindow}\r\n />\r\n </Box>\r\n );\r\n}\r\n\r\n/**\r\n * Render an at-a-glance \"running: …\" hint for the status bar. Shows the\r\n * oldest in-flight tool by name; if more than one, appends \"(+N)\".\r\n */\r\nexport function renderRunningTools(\r\n running: ReadonlyMap<string, { name: string; startedAt: number }>,\r\n): string {\r\n if (running.size === 0) return '';\r\n let oldest: { name: string; startedAt: number } | null = null;\r\n for (const info of running.values()) {\r\n if (!oldest || info.startedAt < oldest.startedAt) oldest = info;\r\n }\r\n if (!oldest) return '';\r\n const elapsedSec = ((Date.now() - oldest.startedAt) / 1000).toFixed(1);\r\n const more = running.size > 1 ? ` (+${running.size - 1})` : '';\r\n return `running: ${oldest.name} ${elapsedSec}s${more}`;\r\n}\r\n\r\n/**\r\n * Find an active `@<query>` token at the cursor. The token starts at the\r\n * last `@` not preceded by a non-whitespace char, and runs up to the cursor\r\n * (no whitespace allowed inside). Returns null if no active token.\r\n */\r\nexport function detectAtToken(\r\n buffer: string,\r\n cursor: number,\r\n): { start: number; end: number; query: string } | null {\r\n let i = cursor - 1;\r\n while (i >= 0) {\r\n const ch = buffer.charCodeAt(i);\r\n if (ch === 64 /* @ */) {\r\n // Must be at the start of buffer or preceded by whitespace.\r\n if (i === 0 || /\\s/.test(buffer[i - 1] ?? '')) {\r\n return { start: i, end: cursor, query: buffer.slice(i + 1, cursor) };\r\n }\r\n return null;\r\n }\r\n if (ch === 32 /* space */ || ch === 9 /* tab */ || ch === 10 /* nl */) return null;\r\n i--;\r\n }\r\n return null;\r\n}\r\n\r\nfunction fmtTok(n: number): string {\r\n if (n < 1000) return String(n);\r\n if (n < 1_000_000) return `${(n / 1000).toFixed(n < 10_000 ? 1 : 0)}k`;\r\n return `${(n / 1_000_000).toFixed(1)}M`;\r\n}\r\n","import React from 'react';\nimport { render } from 'ink';\nimport type {\n Agent,\n AttachmentStore,\n EventBus,\n QueueStore,\n SlashCommandRegistry,\n TokenCounter,\n} from '@wrongstack/core';\nimport { App } from './app.js';\n\nexport interface RunTuiOptions {\n agent: Agent;\n slashRegistry: SlashCommandRegistry;\n attachments: AttachmentStore;\n events: EventBus;\n tokenCounter?: TokenCounter;\n model: string;\n banner?: boolean;\n /** Persists the input queue across crashes; if omitted, the queue is in-memory only. */\n queueStore?: QueueStore;\n /** Surfaces the \"⚠ YOLO\" chip in the status bar. */\n yolo?: boolean;\n /** Renders in the startup banner. Read from the CLI's package.json. */\n appVersion?: string;\n /** Provider id for the startup banner (\"openai\", \"anthropic\", ...). */\n provider?: string;\n /** Wire family — shown beneath provider in the banner. */\n family?: string;\n /** Last 3 chars of the active API key — shown in the banner for visual key-pick verification. */\n keyTail?: string;\n /** Snapshot of keyed providers + their model lists for the `/model` picker. Async — the catalog fetch may need to hit disk/network. */\n getPickableProviders?: () => Promise<import('./components/model-picker.js').ProviderOption[]>;\n /** Apply a (provider, model) pair after the picker confirms. Returns an error string on failure. */\n switchProviderAndModel?: (providerId: string, modelId: string) => string | null;\n /**\n * Model-specific maxContext (tokens), resolved by the CLI via the\n * ModelsRegistry. When omitted, the TUI falls back to the provider\n * family's baseline (e.g. anthropic = 200_000), which can be wrong\n * for variants like the 1M-context Opus build. The status bar's\n * context chip uses this for its progress denominator.\n */\n effectiveMaxContext?: number;\n /**\n * Render into the terminal's alternate screen buffer (like vim/less/htop).\n * Default: false — we render into normal scrollback so the user can\n * scroll history with the terminal's native mouse wheel / Shift+PgUp,\n * and so completed chat survives after exit. Pass true to switch to\n * a fixed full-screen view (no scrollback, no native scroll); useful\n * when terminal redraw flicker is bad enough to outweigh the loss of\n * scrollback.\n */\n altScreen?: boolean;\n /**\n * Called right after we exit the alt-screen on a clean shutdown. The\n * CLI uses this to print a one-line \"session saved to …\" hint into\n * the user's normal terminal, since alt-screen exit erases the whole\n * TUI view.\n */\n onAfterExit?: () => void;\n}\n\n// Bracketed paste mode wraps any pasted text with these markers, letting us\n// distinguish a paste from typed input even when chunks arrive identically.\nconst BRACKETED_PASTE_ON = '\\x1b[?2004h';\nconst BRACKETED_PASTE_OFF = '\\x1b[?2004l';\n\n// Alternate-screen buffer (DECSET 1049). Switches the terminal to a\n// dedicated virtual screen; on exit, the previous scrollback is restored\n// untouched. This is what every \"full-screen TUI\" uses (vim, less, htop).\n// Without it, Ink writes its dynamic area in line with scrollback and\n// each redraw can leak the previous frame's input/status into the\n// permanent terminal history — the exact bug we hit before this change.\nconst ALT_SCREEN_ON = '\\x1b[?1049h';\nconst ALT_SCREEN_OFF = '\\x1b[?1049l';\nconst CURSOR_HOME = '\\x1b[H';\n\nexport async function runTui(opts: RunTuiOptions): Promise<number> {\n const stdout = process.stdout;\n const stdin = process.stdin;\n\n // Ink requires a TTY on both stdin and stdout. Without this guard the\n // render call would fail with a terse internal Ink error; bail with a\n // clear message so a piped invocation (`echo hi | wstack --tui`) tells\n // the user what to do instead.\n if (!stdout.isTTY || !stdin.isTTY) {\n process.stderr.write(\n 'wstack: --tui requires an interactive terminal on both stdin and stdout.\\n' +\n ' Drop the flag (use the plain REPL) or run wstack directly without piping.\\n',\n );\n return 2;\n }\n\n const useAltScreen = opts.altScreen === true;\n if (useAltScreen) {\n stdout.write(ALT_SCREEN_ON);\n stdout.write(CURSOR_HOME);\n }\n stdout.write(BRACKETED_PASTE_ON);\n\n // Track cleanup state so signal handlers don't double-disable. Order\n // matters on exit: paste mode off first (it's a screen-independent\n // setting), then alt-screen off (which restores the user's previous\n // terminal contents).\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n try {\n stdout.write(BRACKETED_PASTE_OFF);\n if (useAltScreen) {\n stdout.write(ALT_SCREEN_OFF);\n }\n } catch {\n // stdout may already be closed during shutdown — ignore.\n }\n };\n\n // If the process is killed externally (terminal closed, SIGTERM from a\n // supervisor) waitUntilExit's .then/.catch never runs. Register signal +\n // exit listeners so the terminal isn't left in bracketed-paste mode.\n const signals: NodeJS.Signals[] = ['SIGTERM', 'SIGHUP', 'SIGINT'];\n const signalHandler = () => cleanup();\n const exitHandler = () => cleanup();\n for (const s of signals) process.on(s, signalHandler);\n process.on('exit', exitHandler);\n\n const detachListeners = () => {\n for (const s of signals) process.off(s, signalHandler);\n process.off('exit', exitHandler);\n };\n\n return new Promise<number>((resolve) => {\n let exitCode = 0;\n const onExit = (code: number) => {\n exitCode = code;\n };\n const settle = (code: number) => {\n cleanup();\n detachListeners();\n // Once the alt-screen is dismantled the user is staring at their\n // pre-TUI terminal again — print a quick line so they can see\n // where the session is preserved, instead of wondering \"where did\n // my chat go?\". Best-effort: callback failures don't change exit.\n if (useAltScreen && opts.onAfterExit) {\n try {\n opts.onAfterExit();\n } catch {\n // ignore — UX helper, not load-bearing\n }\n }\n resolve(code);\n };\n\n let instance: ReturnType<typeof render>;\n try {\n instance = render(\n React.createElement(App, {\n agent: opts.agent,\n slashRegistry: opts.slashRegistry,\n attachments: opts.attachments,\n events: opts.events,\n tokenCounter: opts.tokenCounter,\n model: opts.model,\n banner: opts.banner ?? true,\n queueStore: opts.queueStore,\n yolo: opts.yolo,\n appVersion: opts.appVersion,\n provider: opts.provider,\n family: opts.family,\n keyTail: opts.keyTail,\n getPickableProviders: opts.getPickableProviders,\n switchProviderAndModel: opts.switchProviderAndModel,\n effectiveMaxContext: opts.effectiveMaxContext,\n onExit,\n }),\n { exitOnCtrlC: false },\n );\n } catch (err) {\n process.stderr.write(\n `wstack: TUI failed to start: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n settle(1);\n return;\n }\n instance\n .waitUntilExit()\n .then(() => settle(exitCode))\n .catch(() => settle(1));\n });\n}\n"]}