@wrongstack/tui 0.6.4 → 0.6.5
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.d.ts +7 -1
- package/dist/index.js +69 -2
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/confirm-prompt.tsx","../src/components/checkpoint-timeline.tsx","../src/components/file-picker.tsx","../src/components/fleet-panel.tsx","../src/markdown-table.ts","../src/components/history.tsx","../src/components/input.tsx","../src/components/live-activity-strip.tsx","../src/components/model-picker.tsx","../src/components/slash-menu.tsx","../src/components/status-bar.tsx","../src/file-search.ts","../src/git-info.ts","../src/queue-slash.ts","../src/kill-slash.ts","../src/ps-slash.ts","../src/app.tsx","../src/run-tui.ts"],"names":["React","input","useInput","jsxs","Box","jsx","Text","path","sep","Fragment","fmtDuration","fmtBytes","useEffect","fmtRecentTool","fmtRecentMessage","cache","fmtTok","fmtElapsed","fs","parts","USAGE","renderList","getProcessRegistry","useState","maxContext","next","blocks"],"mappings":"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","file":"index.js","sourcesContent":["import { Box, Text, useInput } from 'ink';\nimport React from 'react';\n\nexport interface ConfirmPromptProps {\n toolName: string;\n input: unknown;\n suggestedPattern: string;\n onDecision: (decision: 'yes' | 'no' | 'always' | 'deny') => void;\n}\n\nfunction stringifyInput(input: unknown): string {\n if (!input || typeof input !== 'object') return '';\n const obj = input as Record<string, unknown>;\n return Object.entries(obj)\n .filter(([k]) => k !== 'content' && k !== 'new_string')\n .map(([k, v]) => `${k}: ${truncate(JSON.stringify(v), 80)}`)\n .join(' ');\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n}\n\nfunction hasDiff(input: unknown): boolean {\n return Boolean(\n input && typeof input === 'object' && 'diff' in (input as Record<string, unknown>),\n );\n}\n\nfunction renderDiffLine(line: string): React.ReactElement {\n const prefix = line.startsWith('+')\n ? 'green'\n : line.startsWith('-')\n ? 'red'\n : line.startsWith('@@')\n ? 'cyan'\n : undefined;\n return (\n <Text key={line} color={prefix}>\n {line}\n {'\\n'}\n </Text>\n );\n}\n\nfunction renderDiff(diff: string): React.ReactElement {\n const lines = diff\n .split('\\n')\n .filter((l) => l.length > 0)\n .slice(0, 20);\n return (\n <Box flexDirection=\"column\" paddingX={2}>\n {lines.map((l) => renderDiffLine(l))}\n </Box>\n );\n}\n\nexport function ConfirmPrompt({\n toolName,\n input,\n suggestedPattern,\n onDecision,\n}: ConfirmPromptProps): React.ReactElement {\n // Terminal bell on mount — alerts the user that action is required,\n // especially important when the agent has been running autonomously\n // and the user may not be staring at the terminal.\n React.useEffect(() => {\n process.stdout.write('\\x07');\n }, []);\n\n useInput((input, key) => {\n // Ignore empty input and CRLF/LF artifacts (Enter produces \\r on Windows, \\n on Unix)\n if (!input || input === '\\r' || input === '\\n') return;\n const ch = input.toLowerCase();\n if (ch === 'y') {\n onDecision('yes');\n } else if (ch === 'n') {\n onDecision('no');\n } else if (ch === 'a') {\n onDecision('always');\n } else if (ch === 'd') {\n onDecision('deny');\n }\n });\n\n const inputSummary = stringifyInput(input);\n const showDiff = hasDiff(input);\n const inp = input as { diff?: unknown };\n const diff = typeof inp?.diff === 'string' ? inp.diff : '';\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n marginY={1}\n >\n <Box flexDirection=\"row\">\n <Text bold color=\"yellow\">\n ⚠ APPROVAL REQUIRED\n </Text>\n <Text> </Text>\n <Text bold color=\"white\">\n {toolName}\n </Text>\n </Box>\n {inputSummary ? <Text dimColor>{inputSummary}</Text> : null}\n {showDiff && diff ? (\n <Box flexDirection=\"column\" marginY={1}>\n {renderDiff(diff)}\n </Box>\n ) : null}\n <Text dimColor>─────────────────</Text>\n <Box flexDirection=\"row\">\n <Text>\n <Text bold color=\"green\">\n [y]\n </Text>\n <Text dimColor>es </Text>\n <Text bold color=\"red\">\n [n]\n </Text>\n <Text dimColor>o </Text>\n <Text bold color=\"cyan\">\n [a]\n </Text>\n <Text dimColor>lways ({suggestedPattern}) </Text>\n <Text bold color=\"red\">\n [d]\n </Text>\n <Text dimColor>eny</Text>\n </Text>\n </Box>\n </Box>\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport type React from 'react';\n\nexport interface CheckpointTimelineProps {\n checkpoints: Array<{\n promptIndex: number;\n promptPreview: string;\n ts: string;\n fileCount: number;\n }>;\n selected: number;\n onSelect: (index: number) => void;\n onConfirm: (index: number) => void;\n onClose: () => void;\n}\n\n/**\n * Full-screen checkpoint timeline overlay for the /rewind command.\n * Arrow keys to navigate, Enter to rewind to selected, Esc to close.\n */\nexport function CheckpointTimeline({\n checkpoints,\n selected,\n onSelect,\n onConfirm,\n onClose,\n}: CheckpointTimelineProps): React.ReactElement {\n useInput((_, key) => {\n if (key.escape) {\n onClose();\n } else if (key.upArrow) {\n onSelect(Math.max(0, selected - 1));\n } else if (key.downArrow) {\n onSelect(Math.min(checkpoints.length - 1, selected + 1));\n } else if (key.return) {\n onConfirm(selected);\n }\n });\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ⟲ Session Rewind\n </Text>\n <Text dimColor> — ↑/↓ navigate · Enter rewind · Esc cancel</Text>\n </Box>\n {checkpoints.length === 0 ? (\n <Text dimColor>No checkpoints in this session.</Text>\n ) : (\n checkpoints.map((cp, i) => {\n const isSelected = i === selected;\n const label = `[${cp.promptIndex}] ${cp.promptPreview}`;\n return (\n <Box key={cp.promptIndex}>\n <Text color={isSelected ? 'cyan' : undefined} bold={isSelected}>\n {isSelected ? '▸ ' : ' '}\n </Text>\n <Text color={isSelected ? 'cyan' : undefined} bold={isSelected}>\n {label}\n </Text>\n <Text dimColor> {new Date(cp.ts).toLocaleTimeString()}</Text>\n {cp.fileCount > 0 && (\n <Text dimColor> · {cp.fileCount} file{cp.fileCount !== 1 ? 's' : ''}</Text>\n )}\n </Box>\n );\n })\n )}\n </Box>\n );\n}","import { Box, Text } from 'ink';\nimport type React from 'react';\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>@{query || '…'} — ↑/↓ select, Enter attach, Esc cancel</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 { Box, Text } from 'ink';\r\nimport type React from 'react';\r\nimport type { FleetEntry } from '../app.js';\r\n\r\nexport interface FleetPanelProps {\r\n /** Per-subagent state, keyed by subagentId. */\r\n entries: Record<string, FleetEntry>;\r\n /** Fleet-wide accumulated cost (from FleetUsageAggregator). */\r\n totalCost: number;\r\n /** Optional roster for resolving role ids to display names. */\r\n roster?: Record<string, { name: string }>;\r\n}\r\n\r\nconst STATUS_ICON: Record<FleetEntry['status'], { icon: string; color: string }> = {\r\n idle: { icon: '○', color: 'gray' },\r\n running: { icon: '●', color: 'green' },\r\n success: { icon: '✓', color: 'green' },\r\n failed: { icon: '✗', color: 'red' },\r\n timeout: { icon: '⏱', color: 'yellow' },\r\n stopped: { icon: '⊘', color: 'yellow' },\r\n};\r\n\r\nfunction fmtCost(n: number): string {\r\n if (n === 0) return '—';\r\n return `$${n.toFixed(3)}`;\r\n}\r\n\r\nfunction fmtCount(n: number): string {\r\n if (n === 0) return '—';\r\n return String(n);\r\n}\r\n\r\nfunction fmtDuration(ms: number): string {\r\n if (ms < 1000) return `${ms}ms`;\r\n return `${(ms / 1000).toFixed(1)}s`;\r\n}\r\n\r\nfunction fmtBytes(n: number): string {\r\n if (n < 1024) return `${n}B`;\r\n return `${(n / 1024).toFixed(1)}KB`;\r\n}\r\n\r\nfunction fmtRecentTool(tool: FleetEntry['recentTools'][number]): string {\r\n const status = tool.ok === false ? 'fail' : 'ok';\r\n const name = tool.name.length > 24 ? `${tool.name.slice(0, 23)}...` : tool.name;\r\n const parts = [status, name];\r\n if (typeof tool.durationMs === 'number') parts.push(fmtDuration(tool.durationMs));\r\n if (typeof tool.outputBytes === 'number' && tool.outputBytes > 0) parts.push(fmtBytes(tool.outputBytes));\r\n if (typeof tool.outputLines === 'number' && tool.outputLines > 0) parts.push(`${tool.outputLines}L`);\r\n return parts.join(' ');\r\n}\r\n\r\nfunction fmtRecentMessage(message: FleetEntry['recentMessages'][number]): string {\r\n const text = message.text.replace(/\\s+/g, ' ');\r\n return text.length > 80 ? `${text.slice(0, 79)}...` : text;\r\n}\r\n\r\nfunction fmtModel(provider?: string, model?: string): string {\r\n if (!provider && !model) return '';\r\n const p = provider ?? '';\r\n const m = model ?? '';\r\n return p && m ? `${p}/${m}` : p || m;\r\n}\r\n\r\nfunction resolveName(entry: FleetEntry, roster?: Record<string, { name: string }>): string {\r\n // Try roster lookup by id first.\r\n const rosterEntry = roster?.[entry.id];\r\n if (rosterEntry) return rosterEntry.name;\r\n return entry.name;\r\n}\r\n\r\n/**\r\n * Live fleet panel rendered below the status bar when director mode is\r\n * active. Shows every known subagent with status, streaming output (for\r\n * running agents), iteration/tool/cost counts, and a fleet-wide cost total.\r\n *\r\n * Designed to be compact — each subagent is one or two lines. When no\r\n * subagents have been spawned yet, the panel is hidden entirely.\r\n */\r\nexport function FleetPanel({ entries, totalCost, roster }: FleetPanelProps): React.ReactElement | null {\r\n const list = Object.values(entries);\r\n if (list.length === 0) return null;\r\n\r\n // Sort: running first, then recent activity, then idle/done.\r\n const sorted = [...list].sort((a, b) => {\r\n const order: Record<string, number> = { running: 0, success: 1, failed: 2, timeout: 3, stopped: 4, idle: 5 };\r\n const ao = order[a.status] ?? 9;\r\n const bo = order[b.status] ?? 9;\r\n if (ao !== bo) return ao - bo;\r\n return b.lastEventAt - a.lastEventAt;\r\n });\r\n\r\n const runningCount = list.filter((e) => e.status === 'running').length;\r\n const totalLabel =\r\n totalCost > 0\r\n ? `$${totalCost.toFixed(3)} · ${runningCount} active`\r\n : `${runningCount} active`;\r\n\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n paddingX={1}\r\n borderStyle=\"single\"\r\n borderTop={false}\r\n borderBottom={false}\r\n borderLeft={false}\r\n borderRight={false}\r\n >\r\n {/* Header */}\r\n <Box flexDirection=\"row\" gap={2}>\r\n <Text dimColor>Fleet</Text>\r\n <Text dimColor>│</Text>\r\n <Text dimColor>{list.length} agent{list.length === 1 ? '' : 's'}</Text>\r\n <Text dimColor>│</Text>\r\n <Text dimColor>{totalLabel}</Text>\r\n </Box>\r\n\r\n {/* Per-subagent rows */}\r\n {sorted.map((entry) => {\r\n const si = STATUS_ICON[entry.status];\r\n const modelTag = fmtModel(entry.provider, entry.model);\r\n const name = resolveName(entry, roster);\r\n const recentTools = (entry.recentTools ?? []).slice(-2).map(fmtRecentTool).join(' | ');\r\n const recentMessages = (entry.recentMessages ?? []).slice(-2).map(fmtRecentMessage);\r\n\r\n return (\r\n <Box key={entry.id} flexDirection=\"column\">\r\n <Box flexDirection=\"row\" gap={1}>\r\n <Text color={si.color}>{si.icon}</Text>\r\n <Text>{name.slice(0, 16).padEnd(16)}</Text>\r\n {modelTag ? (\r\n <>\r\n <Text dimColor>·</Text>\r\n <Text dimColor>{modelTag}</Text>\r\n </>\r\n ) : null}\r\n <Text dimColor>·</Text>\r\n <Text dimColor>{fmtCount(entry.iterations).padStart(3)}it</Text>\r\n <Text dimColor>{fmtCount(entry.toolCalls).padStart(3)}tc</Text>\r\n <Text dimColor>·</Text>\r\n <Text color=\"yellow\">{fmtCost(entry.cost)}</Text>\r\n </Box>\r\n {/* Current tool — shown only while a tool is mid-flight. */}\r\n {entry.status === 'running' && entry.currentTool ? (\r\n <Box paddingLeft={2}>\r\n <Text color=\"cyan\">→ {entry.currentTool.name}</Text>\r\n <Text dimColor> ({Math.max(0, Date.now() - entry.currentTool.startedAt)}ms)</Text>\r\n </Box>\r\n ) : null}\r\n {recentTools ? (\r\n <Box paddingLeft={2}>\r\n <Text dimColor>tools: {recentTools}</Text>\r\n </Box>\r\n ) : null}\r\n {recentMessages.map((message, index) => (\r\n <Box key={`${entry.id}-msg-${index}-${message}`} paddingLeft={2}>\r\n <Text dimColor>msg: {message}</Text>\r\n </Box>\r\n ))}\r\n {/* Budget pressure warning */}\r\n {entry.budgetWarning ? (\r\n <Box paddingLeft={2}>\r\n <Text color=\"yellow\">⚡ hitting {entry.budgetWarning.kind} limit ({entry.budgetWarning.used}/{entry.budgetWarning.limit}) — extending</Text>\r\n </Box>\r\n ) : null}\r\n {/* Streaming tail for running agents */}\r\n {entry.status === 'running' && entry.streamingText ? (\r\n <Box paddingLeft={2}>\r\n <Text dimColor>\r\n {'>'} {entry.streamingText.slice(-80)}\r\n </Text>\r\n </Box>\r\n ) : null}\r\n {/* JSONL transcript path — dim, last so users grep -F it. */}\r\n {entry.transcriptPath ? (\r\n <Box paddingLeft={2}>\r\n <Text dimColor>log: {entry.transcriptPath}</Text>\r\n </Box>\r\n ) : null}\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n );\r\n}\r\n","/**\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';\nimport { useEffect, useState } from 'react';\nimport { Box, Static, Text, useStdout } from 'ink';\nimport { renderMarkdownTables } from '../markdown-table.js';\nimport { ConfirmPrompt } from './confirm-prompt.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 /** Full byte length of the result body the model actually received\n * (post-cap, post-scrub). Carried separately because `output` is a\n * ~400-char preview — `outputBytes` is what the model paid for. */\n outputBytes?: number;\n /** ~3.5 chars/token estimate over `outputBytes`. Cheap to render in\n * the chip; the authoritative count lives in provider.response.usage. */\n outputTokens?: number;\n /** Real line count for tools that have a meaningful one — read counts\n * numbered prefixes, shell/grep/logs count newlines. Undefined for\n * tools without a line notion (json, fetch, …). */\n outputLines?: number;\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 /** Wire family the provider is configured to speak (anthropic, openai, …). */\n family?: string;\n /** Last 3 chars of the active API key — quick visual confirmation that the right account is wired up. */\n keyTail?: string;\n }\n /** Tool confirmation shown while waiting for the user to approve/deny. */\n | { id: number; kind: 'confirm'; toolName: string; input: unknown; suggestedPattern: string }\n /**\n * Subagent activity surfaced into the leader's history. One entry per\n * tool call, assistant message, spawn, or completion — prefixed with a\n * stable `AGENT#N` label so users can follow each subagent across\n * interleaved output from multiple parallel runs.\n */\n | {\n id: number;\n kind: 'subagent';\n agentLabel: string;\n agentColor: string;\n icon: string;\n text: string;\n detail?: string;\n };\n\nexport interface HistoryProps {\n entries: HistoryEntry[];\n streamingText?: string;\n /**\n * Optional live tail of the currently streaming tool. Rendered below the\n * assistant tail so the user sees both at once: model thinking and tool\n * output. Cleared automatically when the tool's `tool.executed` event\n * fires and the final entry lands in `entries`.\n */\n toolStream?: { toolUseId: string; name: string; text: string; startedAt: number } | null;\n}\n\nexport function History({ entries, streamingText, toolStream }: 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 const toolTail = toolStream?.text\n ? tailForDisplay(toolStream.text, MAX_STREAM_DISPLAY_CHARS)\n : '';\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 flexDirection=\"column\" marginY={1}>\n <Box flexDirection=\"row\">\n <Text bold color=\"cyan\">{'ASSISTANT: '}</Text>\n <Text dimColor>(streaming...)</Text>\n </Box>\n <Text color=\"white\">{tail}</Text>\n </Box>\n ) : null}\n {toolTail ? (\n <ToolStreamBox\n name={toolStream!.name}\n text={toolTail}\n startedAt={toolStream!.startedAt}\n termWidth={termWidth}\n />\n ) : null}\n </>\n );\n}\n\nconst MAX_STREAM_DISPLAY_CHARS = 480;\n\nconst MAX_STREAM_LINES = 8;\n\n/**\n * Rich streaming tool output — framed header with live elapsed time,\n * tail-N output so the screen doesn't flood, and a \"N more lines\n * above\" indicator when truncated.\n */\nfunction ToolStreamBox({\n name,\n text,\n startedAt,\n termWidth,\n}: {\n name: string;\n text: string;\n startedAt: number;\n termWidth: number;\n}): React.ReactElement {\n // Tick every 500ms while streaming to refresh the elapsed counter.\n const [tick, setTick] = useState(0);\n useEffect(() => {\n const t = setInterval(() => setTick((n) => n + 1), 500);\n return () => clearInterval(t);\n }, []);\n void tick; // consumed in elapsed calc below\n\n const elapsedMs = Date.now() - startedAt;\n const lines = text.split('\\n');\n const totalLines = lines.length;\n const hidden = Math.max(0, totalLines - MAX_STREAM_LINES);\n const visible = hidden > 0 ? lines.slice(hidden) : lines;\n // Truncate long individual lines so borders don't break.\n const contentWidth = Math.max(20, Math.min(termWidth - 4, 100));\n\n return (\n <Box flexDirection=\"column\" marginTop={0}>\n {/* Header */}\n <Box flexDirection=\"row\">\n <Text color=\"yellow\">◆ </Text>\n <Text bold color=\"cyan\">\n {name}\n </Text>\n <Text dimColor>{` ⏱ ${fmtDuration(elapsedMs)}`}</Text>\n {hidden > 0 ? (\n <Text dimColor>{` (${totalLines} lines, showing last ${MAX_STREAM_LINES})`}</Text>\n ) : null}\n </Box>\n {/* Output lines */}\n <Box flexDirection=\"column\" marginLeft={2}>\n {hidden > 0 ? (\n <Text dimColor italic>{` … ${hidden} more line${hidden === 1 ? '' : 's'} above`}</Text>\n ) : null}\n {visible.map((line, i) => {\n const key = i;\n const trimmed = line.length > contentWidth ? `${line.slice(0, contentWidth - 1)}…` : line;\n return (\n <Text key={key} dimColor>\n {trimmed || ' '}\n </Text>\n );\n })}\n </Box>\n </Box>\n );\n}\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 // Width of the line-number gutter: pick the widest line number across all\n // rows so the column stays aligned. Fall back to 1 when no row carries a\n // line number (e.g. a diff with only a meta/hunk row).\n let gutterWidth = 1;\n for (const r of rows) {\n const n = r.kind === 'del' ? r.oldLine : r.newLine;\n if (typeof n === 'number') {\n const w = String(n).length;\n if (w > gutterWidth) gutterWidth = w;\n }\n }\n const blank = ' '.repeat(gutterWidth);\n return (\n <Box flexDirection=\"column\" marginLeft={4} marginTop={0}>\n {rows.map((row, i) => {\n const key = i;\n if (row.kind === 'hunk') {\n return (\n <Text key={key} color=\"cyan\" dimColor>\n {row.text}\n </Text>\n );\n }\n if (row.kind === 'meta') {\n return (\n <Text key={key} dimColor>\n {`${blank} ${row.text}`}\n </Text>\n );\n }\n const lnNumber = row.kind === 'del' ? row.oldLine : row.newLine;\n const lnText =\n typeof lnNumber === 'number' ? String(lnNumber).padStart(gutterWidth, ' ') : blank;\n if (row.kind === 'ctx') {\n return (\n <Text key={key} dimColor>\n {`${lnText} ${row.text}`}\n </Text>\n );\n }\n // add / del — soft background block on the content only; line number\n // stays dim outside the block so the eye anchors on the change, not\n // a wall of colour. Bright variants render lighter than plain\n // green/red on most terminals.\n const bg = row.kind === 'add' ? 'greenBright' : 'redBright';\n return (\n <Text key={key}>\n <Text dimColor>{`${lnText} `}</Text>\n <Text backgroundColor={bg} color=\"black\">\n {row.text}\n </Text>\n </Text>\n );\n })}\n {hidden > 0 ? (\n <Text dimColor italic>\n {`${blank} … ${hidden} more line${hidden === 1 ? '' : 's'}`}\n </Text>\n ) : null}\n </Box>\n );\n}\n\nfunction Entry({\n entry,\n termWidth,\n}: { 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 (\n <Box flexDirection=\"column\" marginY={1}>\n <Box flexDirection=\"row\">\n <Text bold color=\"cyan\">{'ASSISTANT: '}</Text>\n </Box>\n <Text color=\"white\">{renderMarkdownTables(entry.text, termWidth)}</Text>\n </Box>\n );\n case 'tool': {\n const argSummary = formatToolArgs(entry.name, entry.input);\n const outLines = formatToolOutput(\n entry.name,\n entry.output,\n entry.ok,\n entry.outputBytes,\n entry.outputLines,\n );\n const diff = entry.ok ? extractDiffPreview(entry.name, entry.output) : undefined;\n // Right-aligned size chip: what the MODEL actually received, not the\n // 400-char event preview. Lines (when meaningful), real bytes, and a\n // ~3.5 chars/token estimate. Skipped entirely on errors and empty\n // bodies so the success line stays clean.\n const sizeChip = (() => {\n if (!entry.ok) return '';\n const parts: string[] = [];\n if (entry.outputLines !== undefined && entry.outputLines > 0) {\n parts.push(`${entry.outputLines} L`);\n }\n if (entry.outputBytes && entry.outputBytes > 0) {\n parts.push(fmtBytes(entry.outputBytes));\n }\n if (entry.outputTokens && entry.outputTokens > 0) {\n parts.push(`≈${fmtTok(entry.outputTokens)} tok`);\n }\n return parts.join(' · ');\n })();\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 {sizeChip ? <Text dimColor>{` · ${sizeChip}`}</Text> : null}\n </Text>\n {outLines.map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: tool output lines are static, index is stable\n <Text key={i}>\n <Text dimColor>{i === outLines.length - 1 && !diff ? ' └─ ' : ' ├─ '}</Text>\n <Text\n color={!entry.ok || line.startsWith('!') ? 'red' : undefined}\n dimColor={entry.ok && !line.startsWith('!')}\n >\n {line}\n </Text>\n </Text>\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 'confirm':\n // Confirmation is handled by ConfirmPrompt component, not here.\n // This placeholder is intentionally minimal to avoid duplicating the UI.\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"yellow\" paddingX={1} marginY={1}>\n <Text bold color=\"yellow\">⚠ Confirm: {entry.toolName}</Text>\n <Text dimColor>Waiting for y / n / a / d...</Text>\n </Box>\n );\n case 'banner':\n return <Banner entry={entry} />;\n case 'subagent': {\n // One-line summary for tools/spawn/done; multi-line wrap for\n // assistant messages. The label color is stable per subagent so\n // the eye can track interleaved output from multiple agents.\n const lines = entry.text.split('\\n');\n return (\n <Box flexDirection=\"column\">\n <Text>\n <Text color={entry.agentColor} bold>\n {`[${entry.agentLabel}]`}\n </Text>\n <Text>{' '}</Text>\n <Text color={entry.agentColor}>{entry.icon}</Text>\n <Text>{' '}</Text>\n <Text>{lines[0] ?? ''}</Text>\n {entry.detail ? (\n <>\n <Text dimColor>{' · '}</Text>\n <Text dimColor>{entry.detail}</Text>\n </>\n ) : null}\n </Text>\n {lines.slice(1).map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: stable line index\n <Text key={i}>\n <Text dimColor>{' '}</Text>\n <Text>{line}</Text>\n </Text>\n ))}\n </Box>\n );\n }\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 flexDirection=\"column\" borderStyle=\"round\" borderColor=\"magenta\" paddingX={2} paddingY={0}>\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 {entry.family ? (\n <Text>\n <Text color=\"cyan\">{' family '}</Text>\n <Text dimColor>{entry.family}</Text>\n </Text>\n ) : null}\n {entry.keyTail ? (\n <Text>\n <Text color=\"cyan\">{' key '}</Text>\n <Text dimColor>{'●●●…'}</Text>\n <Text>{entry.keyTail}</Text>\n </Text>\n ) : null}\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\n/** Compact thousands formatter used by the tool-size chip. 4500 → \"4.5k\",\n * 12000 → \"12k\", 1_500_000 → \"1.5M\". Keeps the chip from blowing out the\n * status line when a tool dumps a megabyte of output. */\nexport function fmtTok(n: number): string {\n if (!Number.isFinite(n) || n <= 0) return '0';\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1000) return `${(n / 1000).toFixed(n >= 10_000 ? 0 : 1)}k`;\n return String(n);\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 /** Real bytes the model received — passed in by the Entry component so\n * read-tool / shell-tool digests can quote the true size instead of the\n * 400-char preview that `output` is capped to. */\n _outputBytes?: number,\n /** Real line count from the agent — preferred over scanning the preview\n * when present, since the preview rarely contains every prefix. */\n outputLines?: number,\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)\n 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 // When the agent supplied a real line count (new path), the size chip\n // beside the tool header already shows lines/bytes/tokens for the FULL\n // body the model received — no need to repeat misleading numbers\n // derived from the 400-char preview.\n if (outputLines !== undefined) return [];\n // Legacy fallback: derive what we can from the preview text. The byte\n // count below is the preview length, NOT what the model received, so\n // mark it as such to avoid confusion.\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 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.\n //\n // Earlier we just grabbed the first non-empty line. That broke\n // catastrophically for tools that return pretty-printed JSON (most\n // notably `delegate`): `JSON.stringify(obj, null, 2)` starts with a\n // bare `{` on line 1, so the preview rendered as `└─ {` and the\n // user couldn't see WHY the subagent finished — defeating the whole\n // point of the chip.\n //\n // New behavior:\n // 1. If the text parses as a JSON object, surface up to GENERIC_KV_KEYS\n // of its most informative keys inline (`ok=false · status=timeout\n // · iterations=12 · error=\"...\"`).\n // 2. Otherwise collapse ALL whitespace into single spaces (no more\n // \"first line only\" trap) and render up to GENERIC_BUDGET chars.\n if (json && typeof json === 'object' && !Array.isArray(json)) {\n const summary = summarizeJsonObject(json as Record<string, unknown>);\n if (summary) return [summary];\n }\n const collapsed = text.replace(/\\s+/g, ' ').trim();\n return [truncMid(collapsed, GENERIC_BUDGET)];\n}\n\nconst GENERIC_BUDGET = 240;\n\n/**\n * Build a one-line \"key=value · key=value …\" preview for a JSON-shaped\n * tool result. Prioritises fields the user cares about: status flags,\n * error/result fields, then everything else by appearance order. Stops\n * once the rendered preview hits the budget.\n */\nfunction summarizeJsonObject(obj: Record<string, unknown>): string | null {\n const keys = Object.keys(obj);\n if (keys.length === 0) return null;\n // Reorder: status-y keys first (so a failure/timeout reads obviously),\n // then narrative fields (result/error/message), then the rest.\n const priority = [\n 'ok',\n 'status',\n 'timedOut',\n 'stopReason',\n 'reason',\n 'error',\n 'message',\n 'result',\n 'summary',\n 'iterations',\n 'toolCalls',\n 'durationMs',\n 'subagentId',\n 'taskId',\n ];\n const ordered = [\n ...priority.filter((k) => keys.includes(k)),\n ...keys.filter((k) => !priority.includes(k)),\n ];\n const parts: string[] = [];\n let used = 0;\n for (const key of ordered) {\n const v = obj[key];\n if (v === undefined || v === null) continue;\n const rendered =\n typeof v === 'string'\n ? `${key}=\"${truncMid(v.replace(/\\s+/g, ' '), 80)}\"`\n : typeof v === 'number' || typeof v === 'boolean'\n ? `${key}=${v}`\n : Array.isArray(v)\n ? `${key}=[${v.length}]`\n : `${key}={…}`;\n if (used + rendered.length > GENERIC_BUDGET) {\n parts.push('…');\n break;\n }\n parts.push(rendered);\n used += rendered.length + 3; // \" · \" separator\n }\n return parts.length > 0 ? parts.join(' · ') : null;\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 oldLine?: number;\n newLine?: number;\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 // Counters advance as we walk through a hunk so each row can carry its\n // line number in the source/target file. Reset whenever we see a new @@.\n let oldLn = 0;\n let newLn = 0;\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 const m = line.match(/^@@\\s+-(\\d+)(?:,\\d+)?\\s+\\+(\\d+)(?:,\\d+)?\\s+@@/);\n if (m) {\n oldLn = Number.parseInt(m[1] ?? '0', 10) || 0;\n newLn = Number.parseInt(m[2] ?? '0', 10) || 0;\n }\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), newLine: newLn });\n newLn++;\n continue;\n }\n if (line.startsWith('-')) {\n all.push({ kind: 'del', text: truncMid(line, 100), oldLine: oldLn });\n oldLn++;\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), oldLine: oldLn, newLine: newLn });\n oldLn++;\n newLn++;\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?.[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 { Box, Text, useInput, useStdin } from 'ink';\nimport type React from 'react';\nimport { useEffect } from 'react';\nimport type { ReactNode } from 'react';\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 home: boolean;\n end: boolean;\n}\n\n// Ink 5.x useInput does not expose home/end as boolean flags even though\n// parseKeypress recognizes them. We subscribe to raw stdin to catch these.\nfunction isHomeEnd(data: string): 'home' | 'end' | null {\n // Common terminal sequences for Home/End.\n // CSI H / CSI F are the most universal; the longer variants are fallbacks.\n if (\n data === '\\x1b[H' ||\n data === '\\x1b[1~' ||\n data === '\\x1bOH' ||\n data === '\\x1b[7~'\n )\n return 'home';\n if (\n data === '\\x1b[F' ||\n data === '\\x1b[4~' ||\n data === '\\x1bOF' ||\n data === '\\x1b[8~'\n )\n return 'end';\n return null;\n}\n\nconst EMPTY_KEY: KeyEvent = {\n upArrow: false,\n downArrow: false,\n leftArrow: false,\n rightArrow: false,\n return: false,\n escape: false,\n ctrl: false,\n meta: false,\n shift: false,\n tab: false,\n backspace: false,\n delete: false,\n pageUp: false,\n pageDown: false,\n home: false,\n end: false,\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 // Catch Home/End that Ink's useInput doesn't surface.\n const { stdin } = useStdin();\n useEffect(() => {\n if (!stdin || disabled) return;\n const handleData = (data: Buffer) => {\n const kind = isHomeEnd(data.toString());\n if (kind === 'home') onKey('', { ...EMPTY_KEY, home: true });\n else if (kind === 'end') onKey('', { ...EMPTY_KEY, end: true });\n };\n stdin.on('data', handleData);\n return () => {\n stdin.off('data', handleData);\n };\n }, [stdin, disabled, onKey]);\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 // Disabled (aborting an iteration) is the only signal that needs a\n // hard visual cue — paint the prompt red. We avoid wrapping the input\n // in a border Box: Ink redraws the live area on every state change,\n // and in non-altScreen mode the previous frame's border is left in\n // the terminal's scrollback. A `> ` prompt + inverse cursor is enough\n // to indicate the input row.\n const promptColor = disabled ? 'red' : 'cyan';\n\n return (\n <Box flexDirection=\"column\">\n {placeholders.map((p, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: placeholders are append-only, index is stable\n <Text key={i} dimColor>\n {' ↳ '}\n {p}\n </Text>\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={promptColor}>{prompt}</Text>\n {before}\n <Text inverse>{at}</Text>\n {after}\n </Text>\n {hint ? <Text dimColor>{hint}</Text> : null}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\nimport type { FleetEntry } from '../app.js';\n\nexport interface LiveActivityStripProps {\n /** Per-subagent state from the FleetEntry table. */\n entries: Record<string, FleetEntry>;\n /** Re-renders every tick so elapsed timers stay live; otherwise the\n * bar freezes between FleetEntry updates (which can be 30s+ apart\n * if a subagent is parked in one tool). */\n nowTick: number;\n /** Optional cap on rows so a 20-subagent fleet doesn't push the\n * input off-screen. Default 4 — matches the status bar's 4th line. */\n maxRows?: number;\n}\n\nfunction fmtElapsed(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n const m = Math.floor(ms / 60_000);\n const s = Math.floor((ms % 60_000) / 1000);\n return `${m}m${s.toString().padStart(2, '0')}s`;\n}\n\nfunction fmtBytes(n: number): string {\n if (n < 1024) return `${n}B`;\n return `${(n / 1024).toFixed(1)}KB`;\n}\n\nfunction fmtRecentTool(tool: FleetEntry['recentTools'][number]): string {\n const status = tool.ok === false ? 'fail' : 'ok';\n const name = tool.name.length > 18 ? `${tool.name.slice(0, 17)}...` : tool.name;\n const parts = [status, name];\n if (typeof tool.durationMs === 'number') parts.push(fmtElapsed(tool.durationMs));\n if (typeof tool.outputBytes === 'number' && tool.outputBytes > 0) parts.push(fmtBytes(tool.outputBytes));\n if (typeof tool.outputLines === 'number' && tool.outputLines > 0) parts.push(`${tool.outputLines}L`);\n return parts.join(' ');\n}\n\nfunction fmtRecentMessage(message: FleetEntry['recentMessages'][number]): string {\n const text = message.text.replace(/\\s+/g, ' ');\n return text.length > 48 ? `${text.slice(0, 47)}...` : text;\n}\n\n/**\n * Compact one-line-per-subagent strip that sits directly above the\n * input area. Shows only RUNNING subagents — completed/failed entries\n * already surfaced as history rows and don't need to crowd the\n * always-visible band.\n *\n * Each row carries: `→ <label> <currentTool?> (elapsed) · <iter>it\n * <tool>tc`. The currentTool segment updates on `tool.started` /\n * `tool.executed` so the user can tell at a glance \"AGENT#1 has been\n * inside `bash` for 12s now\" without grep-tailing the JSONL.\n *\n * Renders nothing when no subagents are running, so the input area\n * sits flush against history during idle / solo work.\n */\nexport function LiveActivityStrip({\n entries,\n nowTick,\n maxRows = 4,\n}: LiveActivityStripProps): React.ReactElement | null {\n const running = Object.values(entries)\n .filter((e) => e.status === 'running')\n // Stable order: oldest-started first, so the strip doesn't shuffle\n // every time a tool starts/ends on one of the rows.\n .sort((a, b) => a.startedAt - b.startedAt)\n .slice(0, maxRows);\n if (running.length === 0) return null;\n\n // Reference nowTick so React knows we depend on it — otherwise the\n // 1s ticker won't re-render the elapsed values.\n void nowTick;\n const now = Date.now();\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n {running.map((e) => {\n const toolElapsed = e.currentTool ? now - e.currentTool.startedAt : 0;\n const taskElapsed = now - e.startedAt;\n const toolSeg = e.currentTool\n ? `→ ${e.currentTool.name} (${fmtElapsed(toolElapsed)})`\n : 'idle between tools';\n const recentTools = (e.recentTools ?? []).slice(-2).map(fmtRecentTool).join(' | ');\n const messageText =\n e.streamingText.trim() || (e.recentMessages ?? []).slice(-1).map(fmtRecentMessage).join('');\n return (\n <Box key={e.id} flexDirection=\"row\" gap={1}>\n <Text color=\"cyan\">●</Text>\n <Text>{e.name.slice(0, 14).padEnd(14)}</Text>\n <Text dimColor>·</Text>\n <Text color={e.currentTool ? 'green' : 'yellow'}>{toolSeg}</Text>\n <Text dimColor>·</Text>\n <Text dimColor>\n {e.iterations}it {e.toolCalls}tc · {fmtElapsed(taskElapsed)}\n </Text>\n {recentTools ? (\n <>\n <Text dimColor>|</Text>\n <Text dimColor>last: {recentTools}</Text>\n </>\n ) : null}\n {messageText ? (\n <>\n <Text dimColor>|</Text>\n <Text dimColor>msg: {fmtRecentMessage({ text: messageText, at: Date.now() })}</Text>\n </>\n ) : null}\n </Box>\n );\n })}\n {Object.values(entries).filter((e) => e.status === 'running').length > maxRows ? (\n <Box paddingLeft={2}>\n <Text dimColor>\n …+{Object.values(entries).filter((e) => e.status === 'running').length - maxRows} more\n </Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\n\nexport interface ProviderOption {\n id: string;\n family: string;\n /** Model ids the picker offers in step 2 for this provider. */\n models: string[];\n /** Optional dim hint shown next to the model list (e.g. \"from saved config\"). */\n modelsLabel?: string;\n}\n\nexport interface ModelPickerProps {\n step: 'provider' | 'model';\n providerOptions: ProviderOption[];\n modelOptions: string[];\n selected: number;\n pickedProviderId?: string;\n /** Status hint (e.g. error from a failed switch attempt) shown at the bottom. */\n hint?: string;\n}\n\n/**\n * Two-step Ink overlay for the TUI's `/model` command.\n * Step 1: pick a provider that has a key.\n * Step 2: pick a model bound to that provider.\n *\n * Driven entirely by props — App owns the cursor state and key events.\n * Render is intentionally compact; the host frames it in a single Box.\n */\nexport function ModelPicker({\n step,\n providerOptions,\n modelOptions,\n selected,\n pickedProviderId,\n hint,\n}: ModelPickerProps): React.ReactElement {\n if (step === 'provider') {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text color=\"cyan\" bold>\n ━━ Switch model — Step 1/2: Pick provider ━━\n </Text>\n <Text dimColor>↑/↓ navigate · Enter select · Esc cancel · Ctrl+C exit</Text>\n {providerOptions.length === 0 ? (\n <Text dimColor>(no providers with keys — add one via `wstack auth`)</Text>\n ) : (\n providerOptions.map((p, i) => (\n <Text key={p.id} color={i === selected ? 'cyan' : undefined} inverse={i === selected}>\n {i === selected ? '› ' : ' '}\n <Text bold>{p.id.padEnd(28)}</Text>\n <Text dimColor> [{p.family}]</Text>\n <Text dimColor>\n {' '}\n {p.models.length} model{p.models.length === 1 ? '' : 's'}\n </Text>\n </Text>\n ))\n )}\n {hint ? <Text color=\"yellow\">{hint}</Text> : null}\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text color=\"cyan\" bold>\n ━━ Switch model — Step 2/2: Pick model ({pickedProviderId}) ━━\n </Text>\n <Text dimColor>↑/↓ navigate · Enter select · Esc back · Ctrl+C exit</Text>\n {modelOptions.length === 0 ? (\n <Text dimColor>(no models known for this provider)</Text>\n ) : (\n modelOptions.map((id, i) => (\n <Text key={id} color={i === selected ? 'cyan' : undefined} inverse={i === selected}>\n {i === selected ? '› ' : ' '}\n {id}\n </Text>\n ))\n )}\n {hint ? <Text color=\"yellow\">{hint}</Text> : null}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\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 && <Text dimColor>No matching commands</Text>}\n </Box>\n );\n}\n","import type { TokenCounter } from '@wrongstack/core';\nimport { Box, Text } from 'ink';\nimport type React from 'react';\nimport type { GitInfo } from '../git-info.js';\n\nexport interface TodoCounts {\n pending: number;\n inProgress: number;\n completed: number;\n}\n\nexport interface PlanCounts {\n open: number;\n inProgress: number;\n done: number;\n}\n\n/**\n * Fleet activity breakdown surfaced on the work-in-flight line. Derived\n * from `director.status()` in the host app and refreshed alongside the\n * other dynamic chips. Kept optional (and the chip is only rendered\n * when any field is non-zero) so single-agent sessions stay quiet.\n */\nexport interface FleetCounts {\n /** Subagents currently mid-task. */\n running: number;\n /** Subagents spawned but idle (no current task). */\n idle: number;\n /** Tasks queued but not yet picked up by a worker. */\n pending: number;\n /** Tasks resolved (success/failure/timeout/stopped). */\n completed: number;\n}\n\n/**\n * Per-agent detail surfaced on the optional 4th line — one chip per\n * currently-running subagent so the user can see at a glance which\n * agent is doing what, for how long, and how many tools it has called.\n * Truncated to the top N by the host (typically 3-4) to keep the bar\n * from wrapping.\n */\nexport interface FleetAgentDetail {\n /** Stable label used by the streaming history (e.g. \"AGENT#1 bug-hunter\"). */\n label: string;\n /** Ink color name — same palette as the per-agent history prefix. */\n color: string;\n /** Ms since the subagent's first iteration. */\n elapsedMs: number;\n /** Tool calls observed via tool.executed. */\n toolCalls: number;\n /** True when the subagent is actively iterating. */\n running: boolean;\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 /**\n * Plan board counts surfaced as a chip on line 2. Distinct from\n * `todos` — plans are higher-level and persist across resume; the\n * chip uses a different glyph (📋) so the user can tell them apart\n * at a glance.\n */\n plan?: PlanCounts;\n /**\n * Per-status fleet breakdown. When provided, takes precedence over\n * `subagentCount` for chip rendering. `subagentCount` is kept for\n * backwards compatibility when callers haven't wired the richer\n * breakdown yet.\n */\n fleet?: FleetCounts;\n /**\n * Optional per-agent detail row (up to ~4 agents). Renders below the\n * aggregate fleet chip on a dedicated 4th line so the user can see\n * which specific agent is burning time/tools right now without\n * scrolling history.\n */\n fleetAgents?: FleetAgentDetail[];\n git?: GitInfo | null;\n subagentCount?: number;\n /** Renders the \"ctx ████░░ 42%\" chip on line 1 when present. */\n context?: ContextWindow;\n /**\n * Project / working-folder name. Rendered on line 2 just before the git\n * branch so users running multiple WrongStack windows can tell at a\n * glance which repo each one is pinned to. Usually the basename of\n * `agent.ctx.projectRoot`.\n */\n projectName?: string;\n /** Autonomy mode chip: 'off' | 'suggest' | 'auto' | 'eternal'. */\n autonomy?: 'off' | 'suggest' | 'auto' | 'eternal';\n /** Number of tracked bash/exec processes from the process registry. */\n processCount?: number;\n /** Items to hide from the status bar. */\n hiddenItems?: Array<'todos' | 'plan' | 'fleet' | 'git' | 'elapsed' | 'context' | 'cost'>;\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 autonomy,\n elapsedMs,\n todos,\n plan,\n fleet,\n fleetAgents,\n git,\n subagentCount = 0,\n context,\n projectName,\n processCount,\n hiddenItems,\n}: StatusBarProps): React.ReactElement {\n const hiddenSet = new Set(hiddenItems);\n const usage = tokenCounter?.total();\n const cost = tokenCounter?.estimateCost();\n const cache = tokenCounter?.cacheStats();\n const stateColor = state === 'idle' ? 'cyan' : state === 'aborting' ? 'yellow' : 'green';\n const stateLabel = state === 'idle' ? 'idle' : state === 'aborting' ? 'aborting…' : 'thinking…';\n\n // Line 2 is *session context* — slow-moving facts about where you\n // are: the project, the branch, the elapsed clock, YOLO chip. These\n // change at most once per session.\n const hasSecondLine =\n yolo ||\n (autonomy && autonomy !== 'off') ||\n elapsedMs !== undefined ||\n (git !== null && git !== undefined) ||\n (projectName !== undefined && projectName.length > 0);\n\n // Line 3 is *active work* — the dynamic chips that mutate as the\n // agent / subagents make progress. Hidden when nothing is in flight\n // so a fresh session keeps the two-line baseline.\n const fleetHasActivity =\n (fleet &&\n (fleet.running > 0 || fleet.idle > 0 || fleet.pending > 0 || fleet.completed > 0)) ||\n subagentCount > 0;\n const hasThirdLine =\n (todos && (todos.pending > 0 || todos.inProgress > 0 || todos.completed > 0)) ||\n (plan && (plan.open > 0 || plan.inProgress > 0 || plan.done > 0)) ||\n fleetHasActivity;\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 ↑{' '}\n <Text color=\"cyan\">\n {fmtTok(usage.input + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0))}\n </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 {typeof processCount === 'number' && processCount > 0 ? (\n <>\n <Text dimColor>│</Text>\n <Text color=\"red\">⚡ {processCount} process{processCount === 1 ? '' : 'es'}</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 {autonomy && autonomy !== 'off' ? (\n <>\n {yolo ? <Text dimColor>│</Text> : null}\n <Text\n color={\n autonomy === 'eternal' ? 'red' : autonomy === 'auto' ? 'yellow' : 'cyan'\n }\n bold\n >\n ∞ {autonomy.toUpperCase()}\n </Text>\n </>\n ) : null}\n {elapsedMs !== undefined && !hiddenSet.has('elapsed') ? (\n <>\n {yolo ? <Text dimColor>│</Text> : null}\n <Text dimColor>⏱ {fmtElapsed(elapsedMs)}</Text>\n </>\n ) : null}\n {projectName ? (\n <>\n {yolo || elapsedMs !== undefined ? <Text dimColor>│</Text> : null}\n <Text color=\"blue\">📁 {projectName}</Text>\n </>\n ) : null}\n {git ? (\n <>\n {yolo || elapsedMs !== undefined || projectName ? <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 </Box>\n ) : null}\n\n {hasThirdLine ? (\n <Box flexDirection=\"row\" gap={2}>\n {todos && (todos.pending > 0 || todos.inProgress > 0 || todos.completed > 0) ? (\n <Text>\n <Text dimColor>todos </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 ) : null}\n {plan && (plan.open > 0 || plan.inProgress > 0 || plan.done > 0) ? (\n <>\n {todos && (todos.pending > 0 || todos.inProgress > 0 || todos.completed > 0) ? (\n <Text dimColor>│</Text>\n ) : null}\n <Text>\n <Text color=\"cyan\">📋 </Text>\n {plan.inProgress > 0 ? <Text color=\"yellow\">⌛{plan.inProgress}</Text> : null}\n {plan.inProgress > 0 && (plan.open > 0 || plan.done > 0) ? ' ' : ''}\n {plan.open > 0 ? <Text dimColor>☐{plan.open}</Text> : null}\n {plan.open > 0 && plan.done > 0 ? ' ' : ''}\n {plan.done > 0 ? <Text color=\"green\">✓{plan.done}</Text> : null}\n </Text>\n </>\n ) : null}\n {fleetHasActivity ? (\n <>\n {((todos && (todos.pending > 0 || todos.inProgress > 0 || todos.completed > 0)) ||\n (plan && (plan.open > 0 || plan.inProgress > 0 || plan.done > 0))) ? (\n <Text dimColor>│</Text>\n ) : null}\n {fleet ? (\n <Text>\n <Text color=\"blue\">🌐 </Text>\n {fleet.running > 0 ? <Text color=\"yellow\">▶{fleet.running}</Text> : null}\n {fleet.running > 0 && (fleet.pending > 0 || fleet.idle > 0 || fleet.completed > 0)\n ? ' '\n : ''}\n {fleet.pending > 0 ? <Text dimColor>☐{fleet.pending}</Text> : null}\n {fleet.pending > 0 && (fleet.idle > 0 || fleet.completed > 0) ? ' ' : ''}\n {fleet.idle > 0 ? <Text dimColor>·{fleet.idle}idle</Text> : null}\n {fleet.idle > 0 && fleet.completed > 0 ? ' ' : ''}\n {fleet.completed > 0 ? <Text color=\"green\">✓{fleet.completed}</Text> : null}\n </Text>\n ) : (\n <Text color=\"blue\">\n 🌐 {subagentCount} agent{subagentCount === 1 ? '' : 's'}\n </Text>\n )}\n </>\n ) : null}\n </Box>\n ) : null}\n\n {fleetAgents && fleetAgents.length > 0 ? (\n <Box flexDirection=\"row\" gap={2}>\n {fleetAgents.map((a, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: agent list is stable per render\n <Text key={i}>\n <Text color={a.color} bold>\n {a.label}\n </Text>\n <Text dimColor>{' '}</Text>\n <Text color={a.running ? 'yellow' : undefined} dimColor={!a.running}>\n {a.running ? '▶' : '·'}\n </Text>\n <Text dimColor>{' '}</Text>\n <Text dimColor>{fmtElapsed(a.elapsedMs)}</Text>\n <Text dimColor>{' · '}</Text>\n <Text dimColor>{a.toolCalls}t</Text>\n </Text>\n ))}\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 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\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 type { Dirent } from 'node:fs';\nimport * as fs from 'node:fs/promises';\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 { buildChildEnv } from '@wrongstack/core';\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 env: buildChildEnv(),\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 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)\n 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 type { SlashCommand } from '@wrongstack/core';\nimport { getProcessRegistry } from '@wrongstack/tools';\n\nconst USAGE =\n 'Usage:\\n' +\n ' /kill — list active processes + breaker state\\n' +\n ' /kill list — same as /kill\\n' +\n ' /kill all — kill all tracked processes (SIGTERM → SIGKILL)\\n' +\n ' /kill force — kill all with SIGKILL immediately\\n' +\n ' /kill reset — reset the circuit breaker to closed\\n' +\n ' /kill <pid> — kill a specific process by PID';\n\nexport function createKillSlashCommand(): SlashCommand {\n return {\n name: 'kill',\n description: 'List or kill active bash/exec processes managed by the process registry.',\n async run(args) {\n const trimmed = args.trim();\n const parts = trimmed.split(/\\s+/);\n const sub = parts[0]?.toLowerCase() ?? '';\n\n if (sub === '' || sub === 'list') {\n return { message: renderList() };\n }\n\n if (sub === 'all') {\n const pids = getProcessRegistry().killAll();\n if (pids.length === 0) return { message: 'No processes to kill.' };\n return { message: `Killed ${pids.length} process${pids.length === 1 ? '' : 'es'}: ${pids.join(', ')}` };\n }\n\n if (sub === 'force') {\n getProcessRegistry().forceBreakerOpen();\n const pids = getProcessRegistry().killAll({ force: true });\n if (pids.length === 0) return { message: 'Circuit breaker forced open. No processes to kill.' };\n return { message: `Force-killed ${pids.length} process${pids.length === 1 ? '' : 'es'}: ${pids.join(', ')}` };\n }\n\n if (sub === 'reset') {\n getProcessRegistry().forceBreakerReset();\n return { message: 'Circuit breaker reset to closed. Bash/exec calls allowed.' };\n }\n\n const pid = Number.parseInt(sub, 10);\n if (!Number.isNaN(pid) && pid > 0) {\n const found = getProcessRegistry().kill(pid);\n if (found) return { message: `Killed process ${pid}.` };\n return { message: `Process ${pid} not found in registry.` };\n }\n\n return { message: `Unknown subcommand \"${sub}\".\\n${USAGE}` };\n },\n };\n}\n\nfunction renderList(): string {\n const registry = getProcessRegistry();\n const stats = registry.stats();\n const all = registry.list();\n\n const breaker = stats.breaker;\n const stateLabel =\n breaker.state === 'closed'\n ? '🟢 closed'\n : breaker.state === 'half-open'\n ? '🟡 half-open'\n : `🔴 open (cooldown ${breaker.cooldownRemainingMs !== null ? `${(breaker.cooldownRemainingMs / 1000).toFixed(0)}s` : '—'})`;\n\n const breakerLine = [\n ` Circuit breaker: ${stateLabel}`,\n ` consecutive failures: ${breaker.consecutiveFailures}/5`,\n ` slow calls in window: ${breaker.slowCallsInWindow}/3`,\n ` calls in window: ${breaker.callsInWindow}/30`,\n ].join('\\n');\n\n if (all.length === 0) {\n return `No active processes.\\n\\n${breakerLine}`;\n }\n\n const now = Date.now();\n const lines: string[] = [`Active processes (${all.length}):`];\n for (const p of all) {\n const age = ((now - p.startedAt) / 1000).toFixed(1);\n const killedTag = p.killed ? ' [killed]' : '';\n const cmd = p.command.length > 80 ? p.command.slice(0, 77) + '…' : p.command;\n lines.push(` ${p.pid} ${p.name} ${age}s ${cmd}${killedTag}`);\n }\n return [...lines, '', breakerLine].join('\\n');\n}","import type { SlashCommand } from '@wrongstack/core';\nimport { getProcessRegistry } from '@wrongstack/tools';\n\n/**\n * `/ps` — pure process list, no side effects.\n * `/kill` handles listing AND killing.\n */\nexport function createPsSlashCommand(): SlashCommand {\n return {\n name: 'ps',\n description: 'List all active bash/exec processes tracked by the process registry.',\n async run(_args) {\n return { message: renderList() };\n },\n };\n}\n\nfunction renderList(): string {\n const registry = getProcessRegistry();\n const stats = registry.stats();\n const all = registry.list();\n if (all.length === 0) return 'No active processes.';\n\n const breaker = stats.breaker;\n const stateLabel =\n breaker.state === 'closed'\n ? '🟢 closed'\n : breaker.state === 'half-open'\n ? '🟡 half-open'\n : `🔴 open`;\n\n const now = Date.now();\n const lines: string[] = [\n `Active processes (${all.length}) — breaker ${stateLabel}`,\n ` failure=${breaker.consecutiveFailures}/5 slow=${breaker.slowCallsInWindow}/3 rate=${breaker.callsInWindow}/30`,\n '',\n ];\n for (const p of all) {\n const age = ((now - p.startedAt) / 1000).toFixed(1);\n const killedTag = p.killed ? ' [killed]' : '';\n const cmd = p.command.length > 80 ? p.command.slice(0, 77) + '…' : p.command;\n lines.push(` ${p.pid} ${p.name} ${age}s ${cmd}${killedTag}`);\n }\n return lines.join('\\n');\n}","import * as fs from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport type {\r\n Agent,\r\n AttachmentStore,\r\n ContentBlock,\r\n Director,\r\n EventBus,\r\n FleetEvent,\r\n QueueStore,\r\n SlashCommandRegistry,\r\n TokenCounter,\r\n} from '@wrongstack/core';\r\nimport { DefaultSessionRewinder } from '@wrongstack/core';\r\nimport { InputBuilder, buildGoalPreamble, formatTodosList } from '@wrongstack/core';\r\nimport { type VisionAdapters, routeImagesForModel } from '@wrongstack/runtime/vision';\r\nimport { getProcessRegistry } from '@wrongstack/tools';\r\nimport { Box, useApp } from 'ink';\r\nimport React, { useEffect, useMemo, useReducer, useRef, useState } from 'react';\r\nimport { readClipboardImage } from './clipboard.js';\r\nimport { ConfirmPrompt } from './components/confirm-prompt.js';\r\nimport { CheckpointTimeline } from './components/checkpoint-timeline.js';\r\nimport { FilePicker } from './components/file-picker.js';\r\nimport { FleetPanel } from './components/fleet-panel.js';\r\nimport { History, type HistoryEntry } from './components/history.js';\r\nimport { Input, type KeyEvent } from './components/input.js';\r\nimport { LiveActivityStrip } from './components/live-activity-strip.js';\r\nimport { ModelPicker, type ProviderOption } from './components/model-picker.js';\r\nimport { SlashMenu } from './components/slash-menu.js';\r\nimport { StatusBar } from './components/status-bar.js';\r\nimport { searchFiles } from './file-search.js';\r\nimport { type GitInfo, readGitInfo } from './git-info.js';\r\nimport { createQueueSlashCommand } from './queue-slash.js';\r\nimport { createKillSlashCommand } from './kill-slash.js';\r\nimport { createPsSlashCommand } from './ps-slash.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/** Per-subagent state tracked live from the FleetBus. */\r\nexport interface FleetEntry {\r\n id: string;\r\n name: string;\r\n provider?: string;\r\n model?: string;\r\n status: 'idle' | 'running' | 'success' | 'failed' | 'timeout' | 'stopped';\r\n streamingText: string;\r\n iterations: number;\r\n toolCalls: number;\r\n recentTools: Array<{\r\n name: string;\r\n ok?: boolean;\r\n durationMs?: number;\r\n outputBytes?: number;\r\n outputLines?: number;\r\n at: number;\r\n }>;\r\n recentMessages: Array<{ text: string; at: number }>;\r\n cost: number;\r\n startedAt: number;\r\n lastEventAt: number;\r\n /**\r\n * Tool the subagent is currently inside, set on `tool.started` and\r\n * cleared on `tool.executed`. Lets the FleetPanel render \"running →\r\n * bash\" instead of an opaque \"running\". Undefined when no tool is\r\n * mid-flight (between iterations, before the first tool, or after\r\n * the last tool of a run).\r\n */\r\n currentTool?: { name: string; startedAt: number };\r\n /**\r\n * Absolute path to the per-subagent JSONL transcript on disk, when\r\n * one was created. Surfaced so the FleetPanel can render `path:`\r\n * dim under the entry — users grep / tail the file for full\r\n * visibility into the subagent's run.\r\n */\r\n transcriptPath?: string;\r\n /**\r\n * Most recent budget warning: subagent hit a soft limit and the\r\n * coordinator is auto-extending. Rendered in FleetPanel as:\r\n * \"⚡ hitting tool_calls limit (350/400) — extending\"\r\n * Cleared on the next fleetDone or fleetStart.\r\n */\r\n budgetWarning?: { kind: string; used: number; limit: number; at: number };\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 function selectedSlashCommandLine(picker: {\r\n open: boolean;\r\n matches: SlashCommandMatch[];\r\n selected: number;\r\n}): string | null {\r\n if (!picker.open || picker.matches.length === 0) return null;\r\n const picked = picker.matches[picker.selected];\r\n return picked ? `/${picked.name}` : null;\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 visionAdapters?: VisionAdapters;\r\n /** Resolve current model vision support. Falls back to provider capability when omitted. */\r\n supportsVision?: () => boolean | Promise<boolean>;\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 /**\r\n * Query the live YOLO state from the permission policy. Called after\r\n * every slash-command dispatch so `/yolo off` (which mutates the\r\n * policy inside the CLI) is immediately reflected in the status bar.\r\n * Mirrors the `agent.ctx.model` → `setLiveModel` pattern used for\r\n * provider/model sync.\r\n */\r\n getYolo?: () => boolean;\r\n /** Query the live autonomy mode. */\r\n getAutonomy?: () => 'off' | 'suggest' | 'auto' | 'eternal';\r\n /**\r\n * Access the eternal-autonomy engine. When autonomy mode goes to\r\n * 'eternal' the TUI drives `runOneIteration()` from a post-slash hook\r\n * so the engine and TUI never race for the shared Context.\r\n */\r\n getEternalEngine?: () => import('@wrongstack/core').EternalAutonomyEngine | null;\r\n /**\r\n * Subscribe to live per-iteration events from the eternal engine. The\r\n * TUI installs this on mount to render each iteration as a timeline\r\n * entry the moment it lands — strictly more responsive than reading\r\n * goal.json after the fact.\r\n */\r\n subscribeEternalIteration?: (\r\n fn: (entry: import('@wrongstack/core').JournalEntry) => void,\r\n ) => () => void;\r\n /**\r\n * SDD session context getter. When an SDD session is active, returns\r\n * the AI prompt context to inject into user messages so the model\r\n * knows it's in a spec-building conversation.\r\n */\r\n getSDDContext?: () => string | null;\r\n /**\r\n * Process AI output for SDD auto-detection (spec, tasks, plan).\r\n * Called after every agent.run() completes. Returns displayable\r\n * status messages (e.g. \"✓ Spec detected and saved!\").\r\n */\r\n onSDDOutput?: (output: string) => Promise<string[]>;\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 /** Called when /clear is dispatched — the TUI should wipe its history entries (but keep the banner). */\r\n onClearHistory?: (\r\n dispatch: React.Dispatch<{ type: 'clearHistory' } | { type: 'resetContextChip' }>,\r\n ) => void;\r\n\r\n /**\r\n * Goal text passed from `--goal \"...\"` on the command line. When set,\r\n * the App mounts, renders the banner, then automatically dispatches\r\n * a synthetic `/goal <text>` so the user lands in goal mode without\r\n * having to type the slash command. Mutually advisory with `initialSteer`\r\n * — `initialGoal` wins if both are present.\r\n */\r\n initialGoal?: string;\r\n /**\r\n * Initial user message passed from `--ask \"...\"` on the command line.\r\n * Submitted verbatim as the first turn (no preamble) so users can\r\n * launch the TUI and pre-populate one turn from a shell alias / script.\r\n */\r\n initialAsk?: string;\r\n /** Directory for session JSONL files. Passed to App for /rewind. */\r\n sessionsDir?: string;\r\n\r\n // --- Fleet ---\r\n /** Live director for fleet panel rendering. Null when director mode is off. */\r\n director: Director | null;\r\n /** Optional roster for human-readable subagent names. */\r\n fleetRoster?: Record<string, { name: string }>;\r\n /**\r\n * Shared controller for the `/fleet stream on|off` slash command. The\r\n * App installs a dispatch-backed setter on mount so the slash command\r\n * can flip the reducer's `streamFleet` flag from the CLI surface.\r\n */\r\n fleetStreamController?: {\r\n enabled: boolean;\r\n setEnabled: (enabled: boolean) => void;\r\n };\r\n /**\r\n * Controller for status bar hidden items. App installs a dispatch-backed\r\n * setter on mount so the /statusline slash command can update the TUI's\r\n * visible bar without a round-trip. The initial value is loaded from\r\n * the config file before App mounts.\r\n */\r\n statuslineHiddenItems: Array<'todos' | 'plan' | 'fleet' | 'git' | 'elapsed' | 'context' | 'cost'>;\r\n setStatuslineHiddenItems: (items: Array<'todos' | 'plan' | 'fleet' | 'git' | 'elapsed' | 'context' | 'cost'>) => 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; startedAt: number } | null;\r\n status: 'idle' | 'running' | 'streaming' | 'aborting';\r\n interrupts: number;\r\n /**\r\n * Set when the user pressed Esc mid-iteration to interrupt the agent.\r\n * The NEXT submitted user message gets a STEERING prefix block prepended\r\n * so the model sees \"I interrupted you on purpose — focus on this\r\n * instead of resuming the prior task\". Cleared once that message\r\n * lands. Distinct from `interrupts` (which is the Ctrl+C exit ladder).\r\n */\r\n steeringPending: boolean;\r\n /**\r\n * Context snapshot captured at Esc time, replayed into the STEERING\r\n * preamble so the model sees exactly what it was mid-doing when the\r\n * user pulled the cord. Cleared together with `steeringPending`.\r\n * Without this the model has to guess from chat scrollback which\r\n * tools were live — and it can't see subagent state at all.\r\n */\r\n steerSnapshot: {\r\n runningTools: string[];\r\n subagents: Array<{ label: string; status: string; tool?: string }>;\r\n subagentsTerminated: number;\r\n partialAssistantText: string;\r\n } | null;\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 confirmations — queue to handle multiple tools requesting confirmation. */\r\n confirmQueue: {\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 }[];\r\n /** Incremented on /clear so the context chip re-reads from agent.ctx tokens. */\r\n contextChipVersion: number;\r\n /** Live fleet state: per-subagent entries from FleetBus events. Keyed by subagentId. */\r\n fleet: Record<string, FleetEntry>;\r\n /** Fleet-wide accumulated cost. */\r\n fleetCost: number;\r\n /**\r\n * When true, subagent text activity is\r\n * streamed into the main history with an `AGENT#N` prefix. Toggled\r\n * with `/fleet stream on|off`. Tool calls stay in the live fleet\r\n * surfaces so chat history remains readable during multi-agent runs.\r\n */\r\n streamFleet: boolean;\r\n /** Session checkpoints recorded by SessionWriter.writeCheckpoint() events. */\r\n checkpoints: Array<{\r\n promptIndex: number;\r\n promptPreview: string;\r\n ts: string;\r\n fileCount: number;\r\n }>;\r\n /** Checkpoint timeline overlay — null when closed. */\r\n rewindOverlay: { checkpoints: Array<{\r\n promptIndex: number;\r\n promptPreview: string;\r\n ts: string;\r\n fileCount: number;\r\n }>; selected: number } | 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: 'removeLastPlaceholder' }\r\n | { type: 'clearInput' }\r\n | { type: 'clearHistory' }\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 /**\r\n * User pressed Esc mid-iteration — flag the next message for steering\r\n * AND stash a context snapshot so the preamble can tell the model\r\n * exactly what it was doing.\r\n */\r\n | { type: 'steerStart'; snapshot: State['steerSnapshot'] }\r\n /** Submit handler consumed the steering flag; reset. */\r\n | { type: 'steerConsume' }\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; startedAt: number }\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['confirmQueue'][0] }\r\n | { type: 'confirmClose' }\r\n | { type: 'resetContextChip' }\r\n // Fleet actions\r\n | { type: 'fleetSeed'; entries: FleetEntry[]; cost: number }\r\n | {\r\n type: 'fleetSpawn';\r\n id: string;\r\n name?: string;\r\n provider?: string;\r\n model?: string;\r\n transcriptPath?: string;\r\n }\r\n | { type: 'fleetStart'; id: string; taskId?: string }\r\n | { type: 'fleetDelta'; id: string; text: string }\r\n | { type: 'fleetMessage'; id: string; text: string }\r\n | {\r\n type: 'fleetTool';\r\n id: string;\r\n name?: string;\r\n ok?: boolean;\r\n durationMs?: number;\r\n outputBytes?: number;\r\n outputLines?: number;\r\n }\r\n /** tool.started: pin the current tool name for status display. */\r\n | { type: 'fleetToolStart'; id: string; name: string }\r\n /** tool.executed: clear the current tool (paired with fleetTool). */\r\n | { type: 'fleetToolEnd'; id: string }\r\n | {\r\n type: 'fleetUsage';\r\n id: string;\r\n input: number;\r\n output: number;\r\n cacheRead: number;\r\n cacheWrite: number;\r\n }\r\n | {\r\n type: 'fleetDone';\r\n id: string;\r\n status: FleetEntry['status'];\r\n iterations: number;\r\n toolCalls: number;\r\n }\r\n | {\r\n type: 'fleetBudgetWarning';\r\n id: string;\r\n kind: string;\r\n used: number;\r\n limit: number;\r\n }\r\n | { type: 'fleetCost'; cost: number }\r\n | { type: 'setStreamFleet'; enabled: boolean }\r\n | { type: 'checkpointReceived'; cp: State['checkpoints'][0] }\r\n | { type: 'rewindOverlayOpen' }\r\n | { type: 'rewindOverlayClose' }\r\n | { type: 'rewindOverlayMove'; delta: number }\r\n | { type: 'sessionRewound'; toPromptIndex: number };\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 = [...state.entries, { ...action.entry, id: state.nextId } as HistoryEntry];\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 'removeLastPlaceholder':\r\n if (state.placeholders.length === 0) return state;\r\n return { ...state, placeholders: state.placeholders.slice(0, -1) };\r\n case 'clearInput':\r\n return {\r\n ...state,\r\n buffer: '',\r\n cursor: 0,\r\n placeholders: [],\r\n historyIndex: 0,\r\n picker: { open: false, query: '', matches: [], selected: 0 },\r\n slashPicker: { open: false, query: '', matches: [], selected: 0 },\r\n };\r\n case 'clearHistory': {\r\n const last = state.entries[state.entries.length - 1];\r\n return {\r\n ...state,\r\n entries: last ? [last] : state.entries,\r\n queue: [],\r\n nextQueueId: 1,\r\n };\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 'steerStart':\r\n return { ...state, steeringPending: true, steerSnapshot: action.snapshot };\r\n case 'steerConsume':\r\n return { ...state, steeringPending: false, steerSnapshot: null };\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: {\r\n toolUseId: action.toolUseId,\r\n name: action.name,\r\n text: action.text,\r\n startedAt: action.startedAt,\r\n },\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)\r\n 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, confirmQueue: [...state.confirmQueue, action.info] };\r\n case 'confirmClose':\r\n return { ...state, confirmQueue: state.confirmQueue.slice(1) };\r\n case 'resetContextChip':\r\n return { ...state, contextChipVersion: state.contextChipVersion + 1 };\r\n // --- Fleet ---\r\n case 'fleetSeed': {\r\n const seeded: Record<string, FleetEntry> = {};\r\n for (const e of action.entries) {\r\n seeded[e.id] = {\r\n ...e,\r\n recentTools: e.recentTools ?? [],\r\n recentMessages: e.recentMessages ?? [],\r\n };\r\n }\r\n return { ...state, fleet: seeded, fleetCost: action.cost };\r\n }\r\n case 'fleetSpawn': {\r\n if (state.fleet[action.id]) return state;\r\n const entry: FleetEntry = {\r\n id: action.id,\r\n name: action.name ?? action.id.slice(0, 8),\r\n provider: action.provider,\r\n model: action.model,\r\n status: 'idle',\r\n streamingText: '',\r\n iterations: 0,\r\n toolCalls: 0,\r\n recentTools: [],\r\n recentMessages: [],\r\n cost: 0,\r\n startedAt: Date.now(),\r\n lastEventAt: Date.now(),\r\n transcriptPath: action.transcriptPath,\r\n };\r\n return { ...state, fleet: { ...state.fleet, [action.id]: entry } };\r\n }\r\n case 'fleetToolStart': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: {\r\n ...cur,\r\n currentTool: { name: action.name, startedAt: Date.now() },\r\n lastEventAt: Date.now(),\r\n },\r\n },\r\n };\r\n }\r\n case 'fleetToolEnd': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: { ...cur, currentTool: undefined, lastEventAt: Date.now() },\r\n },\r\n };\r\n }\r\n case 'fleetStart': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: {\r\n ...cur,\r\n status: 'running' as const,\r\n streamingText: '',\r\n budgetWarning: undefined, // clear on restart\r\n startedAt: Date.now(),\r\n },\r\n },\r\n };\r\n }\r\n case 'fleetDelta': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n // Keep only the last ~200 chars for display\r\n const appended = (cur.streamingText + action.text).slice(-200);\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: { ...cur, streamingText: appended, lastEventAt: Date.now() },\r\n },\r\n };\r\n }\r\n case 'fleetMessage': {\r\n const cur = state.fleet[action.id];\r\n const text = action.text.trim().replace(/\\s+/g, ' ');\r\n if (!cur || !text) return state;\r\n const now = Date.now();\r\n const recentMessages = [...(cur.recentMessages ?? []), { text, at: now }].slice(-2);\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: { ...cur, recentMessages, lastEventAt: now },\r\n },\r\n };\r\n }\r\n case 'fleetTool': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n const now = Date.now();\r\n const recentTools =\r\n action.name !== undefined\r\n ? [\r\n ...(cur.recentTools ?? []),\r\n {\r\n name: action.name,\r\n ok: action.ok,\r\n durationMs: action.durationMs,\r\n outputBytes: action.outputBytes,\r\n outputLines: action.outputLines,\r\n at: now,\r\n },\r\n ].slice(-2)\r\n : (cur.recentTools ?? []);\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: {\r\n ...cur,\r\n toolCalls: cur.toolCalls + 1,\r\n recentTools,\r\n lastEventAt: now,\r\n },\r\n },\r\n };\r\n }\r\n case 'fleetUsage': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n // Compute cost delta from raw token counts using a simplified pricing\r\n // model. The actual per-model pricing is applied by FleetUsageAggregator;\r\n // here we approximate as a live display hint.\r\n const cost = cur.cost;\r\n return {\r\n ...state,\r\n fleet: { ...state.fleet, [action.id]: { ...cur, cost, lastEventAt: Date.now() } },\r\n };\r\n }\r\n case 'fleetDone': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: {\r\n ...cur,\r\n status: action.status,\r\n iterations: action.iterations,\r\n toolCalls: action.toolCalls,\r\n streamingText: '',\r\n currentTool: undefined,\r\n budgetWarning: undefined, // clear on done/restart\r\n lastEventAt: Date.now(),\r\n },\r\n },\r\n };\r\n }\r\n case 'fleetBudgetWarning': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: {\r\n ...cur,\r\n budgetWarning: { kind: action.kind, used: action.used, limit: action.limit, at: Date.now() },\r\n lastEventAt: Date.now(),\r\n },\r\n },\r\n };\r\n }\r\n case 'fleetCost': {\r\n return { ...state, fleetCost: action.cost };\r\n }\r\n case 'setStreamFleet': {\r\n return { ...state, streamFleet: action.enabled };\r\n }\r\n case 'checkpointReceived': {\r\n const existing = state.checkpoints.find((c) => c.promptIndex === action.cp.promptIndex);\r\n if (existing) return state;\r\n return { ...state, checkpoints: [...state.checkpoints, action.cp] };\r\n }\r\n case 'rewindOverlayOpen': {\r\n return {\r\n ...state,\r\n rewindOverlay: { checkpoints: state.checkpoints, selected: state.checkpoints.length - 1 },\r\n };\r\n }\r\n case 'rewindOverlayClose': {\r\n return { ...state, rewindOverlay: null };\r\n }\r\n case 'rewindOverlayMove': {\r\n if (!state.rewindOverlay) return state;\r\n const len = state.rewindOverlay.checkpoints.length;\r\n if (len === 0) return { ...state, rewindOverlay: null };\r\n const selected = Math.max(0, Math.min(len - 1, state.rewindOverlay.selected + action.delta));\r\n return { ...state, rewindOverlay: { ...state.rewindOverlay, selected } };\r\n }\r\n case 'sessionRewound': {\r\n return {\r\n ...state,\r\n checkpoints: state.checkpoints.filter((c) => c.promptIndex <= action.toPromptIndex),\r\n rewindOverlay: null,\r\n };\r\n }\r\n }\r\n}\r\n\r\nconst PASTE_THRESHOLD_CHARS = 200;\r\n\r\n/**\r\n * Build the steering preamble that gets prepended to a user's message\r\n * after they pressed Esc to interrupt the agent. The preamble carries\r\n * three things the model would otherwise have to infer:\r\n *\r\n * 1. Context — exactly what was in flight (tool calls, subagents,\r\n * partial assistant text). Without this the model rationalizes\r\n * from chat scrollback and often resumes the prior task by\r\n * accident.\r\n * 2. Authority — a short, explicit list of what the model is\r\n * allowed to do (abandon the prior plan, respawn fresh\r\n * subagents, ask for clarification). Models hedge unless they\r\n * believe they have permission to pivot hard.\r\n * 3. New direction — the user's actual instruction, fenced off.\r\n *\r\n * The block is user-role plain text. We deliberately don't use a\r\n * system role here — the human triggered this, so accountability\r\n * stays with their turn and the model can challenge / clarify\r\n * without violating role separation.\r\n *\r\n * Exported for the steering test that pins the contract.\r\n */\r\nexport function buildSteeringPreamble(\r\n snapshot: State['steerSnapshot'],\r\n newDirection: string,\r\n): string {\r\n const lines: string[] = ['[STEERING — I pressed Esc to interrupt you mid-task on purpose.', ''];\r\n\r\n // Section 1: what was running. Even an empty list is useful —\r\n // tells the model \"you weren't doing much yet, no work to mourn\".\r\n const ctx: string[] = [];\r\n if (snapshot?.runningTools && snapshot.runningTools.length > 0) {\r\n ctx.push(`- in-flight tools (now cancelled): ${snapshot.runningTools.join(', ')}`);\r\n }\r\n if (snapshot?.subagentsTerminated && snapshot.subagentsTerminated > 0) {\r\n const subDetails = snapshot.subagents\r\n .map((s) => `${s.label}${s.tool ? ` (was running: ${s.tool})` : ''}`)\r\n .join(', ');\r\n ctx.push(\r\n `- subagents (${snapshot.subagentsTerminated} terminated by me, do NOT await them): ${subDetails}`,\r\n );\r\n }\r\n if (snapshot?.partialAssistantText && snapshot.partialAssistantText.trim().length > 0) {\r\n const tail = snapshot.partialAssistantText.trim().slice(-300);\r\n ctx.push(`- your last partial output (truncated, for context only): \"${tail}\"`);\r\n }\r\n if (ctx.length > 0) {\r\n lines.push('What was happening when I cut you off:');\r\n lines.push(...ctx);\r\n lines.push('');\r\n }\r\n\r\n // Section 2: authority. Explicit grant so the model doesn't hedge.\r\n lines.push('You have authority to:');\r\n lines.push('- Abandon the prior plan entirely if the new direction makes it stale.');\r\n lines.push('- Re-spawn fresh subagents (with different roles or tasks) if needed.');\r\n lines.push('- Skip a polite \"should I continue?\" — just pivot.');\r\n lines.push('- Ask me to clarify if the new direction is genuinely ambiguous.');\r\n lines.push('');\r\n\r\n // Section 3: the user's instruction, fenced so the model can't\r\n // mistake it for part of the preamble.\r\n lines.push('New direction:');\r\n lines.push('---');\r\n lines.push(newDirection);\r\n lines.push('---');\r\n lines.push(']');\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n// `buildGoalPreamble` was relocated to @wrongstack/core so headless and\r\n// WebUI callers (which depend on @wrongstack/cli but not @wrongstack/tui)\r\n// can issue `/goal set` without dragging the TUI package in. Re-exported\r\n// from this module for backward compatibility with consumers still\r\n// importing from @wrongstack/tui; also used locally within this file\r\n// where `/goal …` is wired into the chat-input handler.\r\nexport { buildGoalPreamble } from '@wrongstack/core';\r\n\r\nexport function App({\r\n agent,\r\n slashRegistry,\r\n attachments,\r\n events,\r\n tokenCounter,\r\n visionAdapters = [],\r\n supportsVision,\r\n model,\r\n banner = true,\r\n queueStore,\r\n yolo = false,\r\n getYolo,\r\n getAutonomy,\r\n getEternalEngine,\r\n subscribeEternalIteration,\r\n getSDDContext,\r\n onSDDOutput,\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 director,\r\n fleetRoster,\r\n onClearHistory,\r\n fleetStreamController,\r\n statuslineHiddenItems,\r\n setStatuslineHiddenItems,\r\n initialGoal,\r\n initialAsk,\r\n sessionsDir,\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 [yoloLive, setYoloLive] = useState<boolean>(yolo);\r\n const [autonomyLive, setAutonomyLive] = useState<'off' | 'suggest' | 'auto' | 'eternal'>(getAutonomy?.() ?? 'off');\r\n const [hiddenItems, setHiddenItems] = useState(statuslineHiddenItems);\r\n\r\n // Sync when parent re-loads from config file (e.g., after /statusline reset)\r\n useEffect(() => {\r\n setHiddenItems(statuslineHiddenItems);\r\n }, [statuslineHiddenItems]);\r\n\r\n // Push local changes back to the parent controller so /statusline sees them\r\n useEffect(() => {\r\n setStatuslineHiddenItems(hiddenItems);\r\n }, [setStatuslineHiddenItems]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\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 steeringPending: false,\r\n steerSnapshot: null,\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 confirmQueue: [],\r\n contextChipVersion: 0,\r\n fleet: {},\r\n fleetCost: 0,\r\n streamFleet: true,\r\n checkpoints: [],\r\n rewindOverlay: 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 // Prevent re-entrant handleKey: some terminals emit \\r\\n as two separate\r\n // stdin events for Enter. While the first event is being processed (submit\r\n // or picker accept), the second arrives with stale state and would trigger\r\n // a duplicate action. The gate blocks the stale-second event entirely.\r\n const inputGateRef = useRef(false);\r\n // Separate guard JUST for the submit path. The full `inputGateRef`\r\n // is held across `await foo()` blocks (picker accept, model picker\r\n // commit) — that's fine because those resolve in milliseconds. But\r\n // `await submit()` resolves only when `agent.run()` finishes, which\r\n // can be minutes for a delegated subagent task. Using the same gate\r\n // would lock ALL keystrokes (typing, backspace, slash menu) for the\r\n // entire agent run. This timestamp-based guard fires for the few\r\n // milliseconds needed to debounce a terminal-side `\\r\\n` double-event\r\n // and then auto-releases — leaving the input live for the user.\r\n const lastEnterAtRef = useRef(0);\r\n const projectRoot = agent.ctx.projectRoot;\r\n // The status-bar chip surfaces the basename so multiple WrongStack\r\n // windows running against different repos are immediately distinguishable.\r\n // Empty / root fallback to undefined so the chip just hides itself.\r\n const projectName = React.useMemo(() => {\r\n const base = path.basename(projectRoot);\r\n return base && base !== path.sep ? base : undefined;\r\n }, [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 const draftRef = useRef({ buffer: state.buffer, cursor: state.cursor });\r\n draftRef.current = { buffer: state.buffer, cursor: state.cursor };\r\n\r\n // handleRewindTo must be declared before the /rewind useEffect (line 1803)\r\n // so the closure can capture it. It is intentionally NOT in useCallback\r\n // — each call needs a fresh rewinder referencing the current sessionsDir.\r\n const handleRewindTo = React.useCallback(async (checkpointIndex: number) => {\r\n const sessionId = agent.ctx.session.id;\r\n if (!sessionId) return;\r\n const rewinder = new DefaultSessionRewinder(sessionsDir ?? '');\r\n // Revert file system changes first (read-only, safe to do eagerly).\r\n await rewinder.rewindToCheckpoint(sessionId, checkpointIndex);\r\n // Then truncate the conversation history — this fires session.rewound\r\n // on the EventBus, which the useEffect at line 2212 listens to and\r\n // dispatches sessionRewound + clearHistory.\r\n await agent.ctx.session.truncateToCheckpoint(checkpointIndex);\r\n }, [agent.ctx.session, sessionsDir]);\r\n\r\n const setDraft = (buffer: string, cursor: number): void => {\r\n draftRef.current = { buffer, cursor };\r\n dispatch({ type: 'setBuffer', buffer, cursor });\r\n };\r\n\r\n const clearDraft = (): void => {\r\n draftRef.current = { buffer: '', cursor: 0 };\r\n dispatch({ type: 'clearInput' });\r\n };\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 //\r\n // We sum input + cacheRead + cacheWrite so the chip reflects the TRUE\r\n // total context the model loaded (Usage is disjoint by design — see the\r\n // doc on Usage). Without this, prompt-cached turns would show only the\r\n // fresh-token delta and the chip would read 0% even when the context\r\n // was near the limit.\r\n // Cumulative \"effective context\" from tokenCounter: fresh input tokens\r\n // PLUS cached tokens that were sent as part of this prompt. All three\r\n // contribute to context-window pressure — cache tokens are still tokens\r\n // the model must process. (usage.input is disjoint from cacheRead/\r\n // cacheWrite, so simple sum is correct.)\r\n const totalCtxTokens =\r\n (tokenCounter?.total().input ?? 0) +\r\n (tokenCounter?.total().cacheRead ?? 0) +\r\n (tokenCounter?.total().cacheWrite ?? 0);\r\n\r\n // Per-model maxContext. CLI passes effectiveMaxContext (resolved via\r\n // ModelsRegistry — correct for 1M-context variants). Fall back to\r\n // agent.ctx.provider.capabilities.maxContext when not provided.\r\n const maxContext =\r\n effectiveMaxContext ?? agent.ctx.provider.capabilities.maxContext;\r\n\r\n // Per-request context pressure: current prompt tokens (input + cacheRead).\r\n // Unlike the cumulative tokenCounter.total() which grows across all turns,\r\n // this tracks the live request's context weight — what actually determines\r\n // how close we are to the maxContext ceiling.\r\n // Cached tokens (cacheWrite) are excluded because they are an accounting\r\n // artifact of THIS request (provider charges for them separately); they\r\n // are already counted in usage.input as part of the prompt the model sees.\r\n const currentContextTokens =\r\n (tokenCounter?.currentRequestTokens()?.input ?? 0) +\r\n (tokenCounter?.currentRequestTokens()?.cacheRead ?? 0);\r\n\r\n const contextWindow = useMemo(() => {\r\n void state.contextChipVersion;\r\n return currentContextTokens > 0 && maxContext > 0\r\n ? { used: currentContextTokens, max: maxContext }\r\n : undefined;\r\n }, [currentContextTokens, maxContext, state.contextChipVersion]);\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 // Fleet breakdown for the status-bar chip. Derived from `state.fleet`,\r\n // which the FleetBus event listeners already maintain — re-bucket\r\n // into running / idle / pending / completed because that's the slice\r\n // the user cares about at a glance. Recomputes on every state.fleet\r\n // change (cheap — fleet usually has <10 entries).\r\n const fleetCounts = useMemo(() => {\r\n const entries = Object.values(state.fleet);\r\n if (entries.length === 0) return undefined;\r\n let running = 0;\r\n let idle = 0;\r\n let completed = 0;\r\n for (const e of entries) {\r\n if (e.status === 'running') running += 1;\r\n else if (e.status === 'idle') idle += 1;\r\n else completed += 1; // success/failed/timeout/stopped all count as \"done\"\r\n }\r\n return { running, idle, pending: 0, completed };\r\n }, [state.fleet]);\r\n\r\n // Stable per-subagent label + color, assigned on first sighting and\r\n // shared between the FleetBus listener (history stream) and the\r\n // fleetAgents memo (status bar 4th line). Declared HERE — above\r\n // `fleetAgents` — because that memo's callback calls labelFor on\r\n // every recompute. The previous declaration site (below the memo)\r\n // worked while state.fleet was empty (the memo's early-return\r\n // skipped the call) but threw a TDZ error the moment a subagent\r\n // was spawned and the memo actually executed its body.\r\n const STREAM_COLORS = ['cyan', 'magenta', 'yellow', 'green', 'blue'];\r\n const labelsRef = useRef<Map<string, { label: string; color: string }>>(new Map());\r\n const labelFor = (id: string, name?: string): { label: string; color: string } => {\r\n const m = labelsRef.current;\r\n const existing = m.get(id);\r\n if (existing) return existing;\r\n const n = m.size + 1;\r\n const suffix = name && name !== id ? ` ${name}` : '';\r\n const v = {\r\n label: `AGENT#${n}${suffix}`,\r\n color: STREAM_COLORS[(n - 1) % STREAM_COLORS.length]!,\r\n };\r\n m.set(id, v);\r\n return v;\r\n };\r\n\r\n // Per-agent detail for the status bar's optional 4th line. Limited to\r\n // the top 4 active agents (running first, then idle) sorted by spawn\r\n // order so the bar doesn't wrap on wide fleets. Reuses the global\r\n // `nowTick` (bumped every 1s above) so elapsed time keeps ticking\r\n // without needing a second timer.\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: labelFor is ref-stable (uses useRef)\r\n const fleetAgents = useMemo(() => {\r\n const entries = Object.entries(state.fleet);\r\n if (entries.length === 0) return undefined;\r\n // Show running first, then idle. Completed/failed agents drop off\r\n // the active line — they're already reflected in the aggregate ✓N\r\n // counter on line 3.\r\n const active = entries.filter(([_id, e]) => e.status === 'running' || e.status === 'idle');\r\n if (active.length === 0) return undefined;\r\n active.sort((a, b) => {\r\n const sa = a[1].status === 'running' ? 0 : 1;\r\n const sb = b[1].status === 'running' ? 0 : 1;\r\n if (sa !== sb) return sa - sb;\r\n return a[1].startedAt - b[1].startedAt;\r\n });\r\n return active.slice(0, 4).map(([id, e]) => {\r\n const lbl = labelFor(id, e.name);\r\n return {\r\n label: lbl.label,\r\n color: lbl.color,\r\n elapsedMs: Math.max(0, nowTick - e.startedAt),\r\n toolCalls: e.toolCalls,\r\n running: e.status === 'running',\r\n };\r\n });\r\n }, [state.fleet, nowTick]);\r\n\r\n // Plan counts come from `<sessionId>.plan.json` on disk, not React\r\n // state. We poll lazily every few ticks so the chip stays current\r\n // without slamming the FS — plans change at human pace (a few times\r\n // per session at most), so 3s granularity is plenty.\r\n const [planCounts, setPlanCounts] = useState<{\r\n open: number;\r\n inProgress: number;\r\n done: number;\r\n } | null>(null);\r\n useEffect(() => {\r\n const planPath = (agent.ctx.meta as Record<string, unknown>)['plan.path'];\r\n if (typeof planPath !== 'string' || !planPath) return;\r\n let cancelled = false;\r\n const poll = async () => {\r\n try {\r\n const data = await fs.readFile(planPath, 'utf8');\r\n const parsed = JSON.parse(data) as {\r\n items?: Array<{ status?: string }>;\r\n };\r\n if (cancelled) return;\r\n if (!Array.isArray(parsed.items)) {\r\n setPlanCounts(null);\r\n return;\r\n }\r\n let open = 0;\r\n let inProgress = 0;\r\n let done = 0;\r\n for (const it of parsed.items) {\r\n if (it?.status === 'done') done++;\r\n else if (it?.status === 'in_progress') inProgress++;\r\n else open++;\r\n }\r\n setPlanCounts(open + inProgress + done > 0 ? { open, inProgress, done } : null);\r\n } catch {\r\n // Missing or corrupt — clear the chip.\r\n if (!cancelled) setPlanCounts(null);\r\n }\r\n };\r\n void poll();\r\n const id = setInterval(poll, 3000);\r\n return () => {\r\n cancelled = true;\r\n clearInterval(id);\r\n };\r\n }, [agent.ctx.meta]);\r\n\r\n // Live-region shrink mitigation. Ink's log-update tracks the previous\r\n // render's logical line count; when content visually wraps past the\r\n // terminal width, the visual-row count exceeds the logical count and\r\n // log-update's clear-and-rewrite leaves the extra visual rows behind.\r\n // Those extras then slide into native scrollback as the next render\r\n // commits new Static items above the live region — looking to the user\r\n // like an extra echo of the input (\"Enter ile boş input da history'e\r\n // sıyrılıyor\").\r\n //\r\n // We can't reach log-update directly, but we can issue an erase-below-\r\n // cursor (\\x1b[J) at the moments most likely to leak: when a picker /\r\n // dialog transitions from open → closed (the live region's height\r\n // drops sharply), and when a fresh history entry was just committed.\r\n // \\x1b[J only touches what's below the cursor, so committed Static\r\n // history above is preserved. For users in heavy resize / picker\r\n // workflows the bullet-proof alternative is still `--alt-screen`.\r\n const prevAnyOverlayOpen = useRef(false);\r\n const prevEntriesCount = useRef(0);\r\n useEffect(() => {\r\n const anyOpenNow =\r\n state.picker.open || state.slashPicker.open || state.modelPicker.open || state.confirmQueue.length > 0;\r\n const overlayClosed = prevAnyOverlayOpen.current && !anyOpenNow;\r\n const newEntryCommitted = state.entries.length > prevEntriesCount.current;\r\n prevAnyOverlayOpen.current = anyOpenNow;\r\n prevEntriesCount.current = state.entries.length;\r\n if (overlayClosed || newEntryCommitted) {\r\n try {\r\n process.stdout.write('\\x1b[J');\r\n } catch {\r\n // stdout might be detached during shutdown — ignore.\r\n }\r\n }\r\n }, [\r\n state.picker.open,\r\n state.slashPicker.open,\r\n state.modelPicker.open,\r\n state.confirmQueue.length,\r\n state.entries.length,\r\n ]);\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: arrow keys would\r\n // still target the command menu even though the user is typing args.\r\n // Close it 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: cmd.argsHint,\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 draft = draftRef.current;\r\n const tok = detectAtToken(draft.buffer, draft.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 = draft.buffer.slice(0, tok.start);\r\n const after = draft.buffer.slice(tok.end);\r\n const next = `${before}${placeholder}${after}`;\r\n setDraft(next, tok.start + placeholder.length);\r\n dispatch({ type: 'pickerClose' });\r\n } catch (err) {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'error',\r\n text: `Attach failed: ${err instanceof Error ? err.message : String(err)}`,\r\n },\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 setDraft(cmd, 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 /kill (list/kill tracked bash/exec processes) and /ps (list only).\r\n useEffect(() => {\r\n slashRegistry.register(createKillSlashCommand());\r\n slashRegistry.register(createPsSlashCommand());\r\n return () => {\r\n slashRegistry.unregister('kill');\r\n slashRegistry.unregister('ps');\r\n };\r\n }, [slashRegistry]);\r\n\r\n // Kill all tracked bash/exec processes when the TUI unmounts.\r\n // This fires on natural exit, Ctrl+C, and any other unmount path,\r\n // ensuring no orphaned child processes survive after the session ends.\r\n useEffect(() => {\r\n return () => {\r\n getProcessRegistry().killAll();\r\n };\r\n }, []);\r\n\r\n // Register `/altscreen on|off` — runtime escape valve for the\r\n // alt-screen scrollback limitation. In alt-screen mode the terminal's\r\n // native scrollback is disabled, so users can't review old chat\r\n // entries. `off` writes the alt-screen-exit escape so subsequent\r\n // entries land in the normal scroll region and the mouse wheel /\r\n // shift+pgup work again. The trade-off (lost on-screen history,\r\n // resize artifacts) is spelled out in the response message so the\r\n // user can decide whether to keep it.\r\n useEffect(() => {\r\n const ALT_OFF = '\\x1b[?1049l';\r\n const ALT_ON = '\\x1b[?1049h';\r\n const cmd = {\r\n name: 'altscreen',\r\n description:\r\n 'Toggle the alt-screen buffer. Default is OFF (native scroll); /altscreen on for full-screen mode.',\r\n async run(args: string) {\r\n const arg = args.trim().toLowerCase();\r\n if (arg === 'off') {\r\n try {\r\n process.stdout.write(ALT_OFF);\r\n } catch {\r\n return { message: 'Failed to exit alt-screen.' };\r\n }\r\n return {\r\n message:\r\n 'Alt-screen disabled. New entries will land in normal scrollback (mouse wheel / Shift+PgUp work). ' +\r\n 'On-screen history rendered before this command is no longer reachable via terminal scroll. ' +\r\n 'Resize may now leak the live region — `/altscreen on` to re-enable.',\r\n };\r\n }\r\n if (arg === 'on') {\r\n try {\r\n process.stdout.write(ALT_ON);\r\n } catch {\r\n return { message: 'Failed to re-enter alt-screen.' };\r\n }\r\n return { message: 'Alt-screen re-enabled. Native scroll is now disabled.' };\r\n }\r\n return { message: 'Usage: /altscreen on|off' };\r\n },\r\n };\r\n slashRegistry.register(cmd);\r\n return () => {\r\n slashRegistry.unregister('altscreen');\r\n };\r\n }, [slashRegistry]);\r\n\r\n // `/steer <message>` — slash-command equivalent of Esc-to-steer.\r\n // Useful when Esc is consumed by an outer terminal multiplexer, or\r\n // when the user wants a single-shot redirect without the typed\r\n // follow-up (the message is the new direction). Performs the same\r\n // sequence the Esc handler does: snapshot context, abort the active\r\n // run, terminate the fleet, drop the queue, then sets steeringPending\r\n // so the message — submitted as the slash command's return — picks\r\n // up the rich STEERING preamble in the normal submit path.\r\n //\r\n // Unlike Esc, this slash command can be invoked at any state. When\r\n // the agent is idle the abort and fleet-termination are no-ops; the\r\n // steering preamble still gets prepended, which is harmless extra\r\n // context (\"nothing was running\") for the next turn.\r\n useEffect(() => {\r\n const cmd = {\r\n name: 'steer',\r\n description: 'Interrupt the running agent (incl. fleet) and redirect: /steer <new direction>',\r\n help: [\r\n 'Usage: /steer <new direction>',\r\n '',\r\n 'Aborts the active iteration, terminates any running subagents,',\r\n 'drops queued messages, and sends your text to the model with a',\r\n 'STEERING preamble explaining what was in flight and what the',\r\n 'model is authorised to do (pivot hard, respawn subagents, ask',\r\n 'for clarification). Equivalent to pressing Esc then typing.',\r\n ].join('\\n'),\r\n async run(args: string) {\r\n const text = args.trim();\r\n if (!text) {\r\n return { message: 'Usage: /steer <new direction>' };\r\n }\r\n // Capture BEFORE mutating — same as the Esc handler.\r\n const s = stateRef.current;\r\n const runningTools = Array.from(s.runningTools.values()).map((t) => t.name);\r\n const subagents = Object.values(s.fleet)\r\n .filter((e) => e.status === 'running')\r\n .map((e) => ({ label: e.name, status: e.status, tool: e.currentTool?.name }));\r\n const subagentsTerminated = subagents.length;\r\n const partialAssistantText = streamingTextRef.current.slice(-1500);\r\n\r\n activeCtrlRef.current?.abort();\r\n dispatch({\r\n type: 'steerStart',\r\n snapshot: { runningTools, subagents, subagentsTerminated, partialAssistantText },\r\n });\r\n const droppedCount = s.queue.length;\r\n if (droppedCount > 0) dispatch({ type: 'queueClear' });\r\n if (director && subagentsTerminated > 0) {\r\n const cap = new Promise<void>((resolve) => {\r\n const t = setTimeout(resolve, 1500);\r\n t.unref?.();\r\n });\r\n void Promise.race([director.terminateAll().catch(() => undefined), cap]);\r\n }\r\n\r\n // Build the full preamble + direction here, return it as the\r\n // slash command output's `runText` so the submit pipeline\r\n // sends THIS to the model instead of \"/steer …\".\r\n const preamble = buildSteeringPreamble(\r\n { runningTools, subagents, subagentsTerminated, partialAssistantText },\r\n text,\r\n );\r\n // Consume immediately — the runText below already carries the\r\n // preamble; the steeringPending flag would otherwise double up.\r\n dispatch({ type: 'steerConsume' });\r\n\r\n const droppedTag = droppedCount > 0 ? ` · dropped ${droppedCount} queued` : '';\r\n const fleetTag =\r\n subagentsTerminated > 0\r\n ? ` · stopped ${subagentsTerminated} subagent${subagentsTerminated === 1 ? '' : 's'}`\r\n : '';\r\n return {\r\n message: `↯ Steering${droppedTag}${fleetTag}.`,\r\n runText: preamble,\r\n };\r\n },\r\n };\r\n slashRegistry.register(cmd);\r\n return () => {\r\n slashRegistry.unregister('steer');\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [slashRegistry, director]);\r\n\r\n // `/rewind` — open the checkpoint timeline overlay. If a checkpoint\r\n // index is provided as argument, rewinds directly to it.\r\n // eslint-disable-next-line react-hooks/exhaustive-deps -- handleRewindTo is stable via useCallback\r\n useEffect(() => {\r\n const cmd = {\r\n name: 'rewind',\r\n description: 'Open checkpoint timeline to rewind session: /rewind [checkpoint-index]',\r\n help: [\r\n 'Usage: /rewind [checkpoint-index]',\r\n '',\r\n 'Opens a checkpoint timeline. Use ↑/↓ to navigate, Enter to rewind,',\r\n 'Esc to cancel. The session is reverted to the selected checkpoint',\r\n 'and conversation history is truncated — LLM continues fresh.',\r\n '',\r\n 'If a checkpoint index is provided the timeline is skipped and',\r\n 'rewind happens immediately.',\r\n ].join('\\n'),\r\n async run(args: string) {\r\n const idx = Number.parseInt(args.trim(), 10);\r\n if (!Number.isNaN(idx) && idx >= 0) {\r\n handleRewindTo(idx);\r\n return {};\r\n }\r\n // No arg — open the timeline overlay\r\n const s = stateRef.current;\r\n if (s.checkpoints.length === 0) {\r\n return { message: 'No checkpoints in this session yet.' };\r\n }\r\n dispatch({ type: 'rewindOverlayOpen' });\r\n return {};\r\n },\r\n };\r\n slashRegistry.register(cmd);\r\n return () => {\r\n slashRegistry.unregister('rewind');\r\n };\r\n }, [slashRegistry, handleRewindTo]);\r\n\r\n // `/goal` is registered as a CLI builtin (packages/cli/src/slash-commands/\r\n // goal.ts) which handles both the preamble lock-in (the former TUI\r\n // behavior) and goal.json persistence for /autonomy eternal. The TUI\r\n // does NOT register its own /goal here — that would collide with the\r\n // builtin and throw \"already registered\" on mount.\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 startedAt: Date.now(),\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 // Real model-visible sizes — forwarded so the size chip beside\r\n // the tool header can show what the model paid for instead of\r\n // the misleading preview-byte count we used to surface.\r\n outputBytes: e.outputBytes,\r\n outputTokens: e.outputTokens,\r\n outputLines: e.outputLines,\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 // Echo the current todo list into chat whenever the `todo` tool\r\n // mutates ctx.todos — same format as `/todos list`. Snapshotted from\r\n // agent.ctx.todos at this point (the tool executor has already\r\n // applied the mutation by the time tool.executed fires).\r\n if (e.ok && e.name === 'todo') {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'info', text: formatTodosList(agent.ctx.todos) },\r\n });\r\n }\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 // Per-iteration text flush. Without this, the entire run buffers all text\r\n // deltas in the live tail box and dumps them into history as ONE assistant\r\n // entry only after `agent.run()` returns. Tool results, in contrast, land\r\n // in history immediately via `tool.executed` — so a multi-iteration turn\r\n // renders as \"all tools, then a wall of text\" instead of the natural\r\n // text → tool → text → tool interleaving that matches the actual stream.\r\n //\r\n // We hook `provider.response` (fires once per LLM call, both for\r\n // intermediate `tool_use` stops and the final `end_turn`) and commit\r\n // whatever has accumulated in `streamingTextRef` as an assistant history\r\n // entry. The next iteration's deltas start a fresh buffer. `runBlocks`\r\n // becomes purely the loop driver — it no longer adds the assistant entry,\r\n // since the per-iteration flushes have already done so.\r\n const offProvResp = events.on('provider.response', () => {\r\n const text = streamingTextRef.current;\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 if (text.trim()) {\r\n dispatch({ type: 'addEntry', entry: { kind: 'assistant', text } });\r\n }\r\n });\r\n const offConfirmNeeded = events.on('tool.confirm_needed', (e) => {\r\n // Only show the ConfirmPrompt component — no duplicate history entry needed.\r\n // The full ConfirmPrompt with y/n/a/d keys is rendered below;\r\n // the history placeholder was redundant.\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 const offTrustPersisted = events.on('trust.persisted', (e) => {\r\n const icon = e.decision === 'always' ? '✓' : '✗';\r\n const label = e.decision === 'always' ? 'always allowed' : 'denied';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'info',\r\n text: `${icon} ${label}: ${e.tool}(${e.pattern})`,\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 offProvResp();\r\n offConfirmNeeded();\r\n offTrustPersisted();\r\n if (flushTimerRef.current) clearTimeout(flushTimerRef.current);\r\n };\r\n }, [events, agent.ctx.todos]);\r\n\r\n // Live mirror of `streamFleet` for the FleetBus listener below. The\r\n // listener is wired in a single mount-time effect so it doesn't tear\r\n // down per-state-change; a ref lets it read the current toggle value\r\n // on every event without re-subscribing.\r\n const streamFleetRef = useRef(state.streamFleet);\r\n useEffect(() => {\r\n streamFleetRef.current = state.streamFleet;\r\n }, [state.streamFleet]);\r\n\r\n // --- Subagent lifecycle entries (uniform for director + non-director) ---\r\n // Wired to EventBus, not FleetBus, so /spawn-agent runs (which don't\r\n // build a Director) also surface in the chat. The director path emits\r\n // the same events through `MultiAgentHost`, so this single listener\r\n // covers both modes and replaces the per-status history entry that\r\n // previously lived inside the director.on('task.completed') hook.\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: labelFor is ref-stable (uses useRef)\r\n useEffect(() => {\r\n const offSpawned = events.on('subagent.spawned', (e) => {\r\n const lbl = labelFor(e.subagentId, e.name);\r\n dispatch({\r\n type: 'fleetSpawn',\r\n id: e.subagentId,\r\n name: e.name,\r\n provider: e.provider,\r\n model: e.model,\r\n transcriptPath: e.transcriptPath,\r\n });\r\n const where = e.provider && e.model ? `${e.provider}/${e.model}` : 'spawned';\r\n const desc = e.description ? ` — ${e.description.slice(0, 80)}` : '';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'subagent',\r\n agentLabel: lbl.label,\r\n agentColor: lbl.color,\r\n icon: '▶',\r\n text: `${where}${desc}`,\r\n },\r\n });\r\n });\r\n const offStarted = events.on('subagent.task_started', (e) => {\r\n const lbl = labelFor(e.subagentId);\r\n dispatch({ type: 'fleetStart', id: e.subagentId, taskId: e.taskId });\r\n const desc = e.description ? ` — ${e.description.slice(0, 80)}` : '';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'subagent',\r\n agentLabel: lbl.label,\r\n agentColor: lbl.color,\r\n icon: '●',\r\n text: `task started${desc}`,\r\n },\r\n });\r\n });\r\n const offCompleted = events.on('subagent.task_completed', (e) => {\r\n const lbl = labelFor(e.subagentId);\r\n dispatch({\r\n type: 'fleetDone',\r\n id: e.subagentId,\r\n status: e.status,\r\n iterations: e.iterations,\r\n toolCalls: e.toolCalls,\r\n });\r\n // Status-specific icon so timeout/stopped/failed are visually\r\n // distinct from a plain success. We now have a structured error\r\n // envelope with `kind` (e.g. `provider_rate_limit`,\r\n // `tool_failed`) — prefix the tail with `[kind]` so the user\r\n // sees the actual failure mode, not just \"✗ failed\" for every\r\n // breed of failure.\r\n const icon =\r\n e.status === 'success'\r\n ? '✓'\r\n : e.status === 'timeout'\r\n ? '⏱'\r\n : e.status === 'stopped'\r\n ? '⊘'\r\n : '✗';\r\n const errKind = e.error?.kind;\r\n const errMsg = e.error?.message;\r\n const errMsgTail = errMsg\r\n ? ` — ${errMsg.replace(/\\s+/g, ' ').slice(0, 100)}${errMsg.length > 100 ? '…' : ''}`\r\n : '';\r\n const errChip = errKind ? ` [${errKind}]` : '';\r\n const secs = (e.durationMs / 1000).toFixed(e.durationMs < 10_000 ? 1 : 0);\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'subagent',\r\n agentLabel: lbl.label,\r\n agentColor: lbl.color,\r\n icon,\r\n text: `${e.status} (${e.iterations} iter · ${e.toolCalls} tools · ${secs}s)${errChip}${errMsgTail}`,\r\n },\r\n });\r\n });\r\n // Budget pressure: subagent hit a soft limit and the coordinator\r\n // is auto-extending. Surface as a fleet warning so the user can see\r\n // \"⚡ agent#bug-hunter hitting tool_calls limit (350/400) — extending\".\r\n const offBudgetWarning = events.on('subagent.budget_warning', (e) => {\r\n const lbl = labelFor(e.subagentId);\r\n dispatch({ type: 'fleetBudgetWarning', id: e.subagentId, kind: e.kind, used: e.used, limit: e.limit });\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'subagent',\r\n agentLabel: lbl.label,\r\n agentColor: lbl.color,\r\n icon: '⚡',\r\n text: `hitting ${e.kind} limit (${e.used}/${e.limit}) — extending`,\r\n },\r\n });\r\n });\r\n // Always-on per-tool state surface. Director mode also gets a\r\n // FleetBus path, but this bridge fires regardless of mode so plain\r\n // `/spawn` still updates the live strip/panel without flooding chat.\r\n const offTool = events.on('subagent.tool_executed', (e) => {\r\n if (director) return;\r\n // Also bump the entry's currentTool/toolCalls so the status bar\r\n // 4th line + FleetPanel update in non-director mode.\r\n dispatch({\r\n type: 'fleetTool',\r\n id: e.subagentId,\r\n name: e.name,\r\n ok: e.ok,\r\n durationMs: e.durationMs,\r\n outputBytes: e.outputBytes,\r\n });\r\n dispatch({ type: 'fleetToolEnd', id: e.subagentId });\r\n });\r\n return () => {\r\n offSpawned();\r\n offStarted();\r\n offCompleted();\r\n offBudgetWarning();\r\n offTool();\r\n };\r\n }, [events, director]);\r\n\r\n // Checkpoint and session rewind event listeners — no director required.\r\n // eslint-disable-next-line react-hooks/exhaustive-deps -- onClearHistory is stable\r\n useEffect(() => {\r\n const offCheckpoint = events.on('checkpoint.written', (e) => {\r\n dispatch({\r\n type: 'checkpointReceived',\r\n cp: {\r\n promptIndex: e.promptIndex,\r\n promptPreview: e.promptPreview,\r\n ts: e.ts,\r\n fileCount: e.fileCount,\r\n },\r\n });\r\n });\r\n const offRewound = events.on('session.rewound', (_e) => {\r\n dispatch({ type: 'sessionRewound', toPromptIndex: 0 });\r\n dispatch({ type: 'clearHistory' });\r\n if (onClearHistory) {\r\n onClearHistory(dispatch);\r\n }\r\n });\r\n return () => {\r\n offCheckpoint();\r\n offRewound();\r\n };\r\n }, [events, onClearHistory]);\r\n\r\n // --- Leader agent compaction events → chat history ---\r\n useEffect(() => {\r\n const offFired = events.on('compaction.fired', (e) => {\r\n const { level, tokens, load, maxContext, report, aggressive } = e as {\r\n level: string;\r\n tokens: number;\r\n load: number;\r\n maxContext: number;\r\n report: { before: number; after: number; reductions: { phase: string; saved: number }[] };\r\n aggressive: boolean;\r\n };\r\n const pct = (load * 100).toFixed(0);\r\n const before = report.before;\r\n const after = report.after;\r\n const saved = before - after;\r\n const table = [\r\n `▸ context compacted at ${level} (${pct}% of ${maxContext.toLocaleString()} tok)`,\r\n ` tokens before ${before.toLocaleString().padStart(8)}`,\r\n ` tokens after ${after.toLocaleString().padStart(8)}`,\r\n ` saved ${saved.toLocaleString().padStart(8)} (${((saved / before) * 100).toFixed(1)}%)`,\r\n ];\r\n for (const line of table) {\r\n dispatch({ type: 'addEntry', entry: { kind: 'info', text: line } });\r\n }\r\n });\r\n const offFailed = events.on('compaction.failed', (e) => {\r\n const { level, load, maxContext, fatal } = e as { level: string; load: number; maxContext: number; fatal: boolean };\r\n const pct = (load * 100).toFixed(0);\r\n const text = fatal\r\n ? `✗ compaction failed at ${level} (${pct}% of ${maxContext.toLocaleString()} tok) — FATAL`\r\n : `⚠ compaction failed at ${level} (${pct}% of ${maxContext.toLocaleString()} tok) — continuing`;\r\n dispatch({ type: 'addEntry', entry: { kind: fatal ? 'error' : 'warn', text } });\r\n });\r\n return () => {\r\n offFired();\r\n offFailed();\r\n };\r\n }, [events]);\r\n\r\n // Install a dispatch-backed setter into the shared controller so the\r\n // `/fleet stream on|off` slash command can flip our reducer flag.\r\n // Restored to a noop on unmount so a late-arriving slash callback\r\n // doesn't dispatch into a torn-down React tree.\r\n useEffect(() => {\r\n if (!fleetStreamController) return;\r\n fleetStreamController.enabled = state.streamFleet;\r\n fleetStreamController.setEnabled = (enabled: boolean) => {\r\n dispatch({ type: 'setStreamFleet', enabled });\r\n };\r\n return () => {\r\n fleetStreamController.setEnabled = (enabled: boolean) => {\r\n fleetStreamController.enabled = enabled;\r\n };\r\n };\r\n }, [fleetStreamController, state.streamFleet]);\r\n\r\n // Keep the controller's mirror of `enabled` in sync when the toggle is\r\n // flipped from a TUI-side path (not the slash command).\r\n useEffect(() => {\r\n if (fleetStreamController) fleetStreamController.enabled = state.streamFleet;\r\n }, [state.streamFleet, fleetStreamController]);\r\n\r\n // --- FleetBus → TUI dispatch bridge ---\r\n // Subscribes to every event on the director's FleetBus and dispatches\r\n // fleet state actions. Text deltas are throttled (FLUSH_MS) to avoid\r\n // flooding React re-renders; other events dispatch immediately.\r\n // Seeds initial fleet state from director.status() on mount so the\r\n // panel reflects subagents spawned before the TUI attached.\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: labelFor is ref-stable\r\n useEffect(() => {\r\n const d = director;\r\n if (!d) return;\r\n const FLUSH_MS = 150;\r\n\r\n // Per-agent buffered assistant text. Flushed as one `subagent`\r\n // history entry when the agent stops emitting deltas for FLUSH_MS,\r\n // so we don't fire a fresh history entry on every token.\r\n const streamBuf = new Map<string, string>();\r\n let streamFlushTimer: ReturnType<typeof setTimeout> | null = null;\r\n const flushStreamBufs = () => {\r\n for (const [id, text] of streamBuf) {\r\n const trimmed = text.trim();\r\n if (!trimmed) continue;\r\n const lbl = labelFor(id);\r\n dispatch({ type: 'fleetMessage', id, text: trimmed });\r\n if (streamFleetRef.current) {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'subagent',\r\n agentLabel: lbl.label,\r\n agentColor: lbl.color,\r\n icon: '💬',\r\n text: trimmed,\r\n },\r\n });\r\n }\r\n }\r\n streamBuf.clear();\r\n streamFlushTimer = null;\r\n };\r\n\r\n // Seed: discover already-spawned subagents from the coordinator.\r\n const status = d.status();\r\n for (const s of status.subagents) {\r\n const meta = d.getSubagentMeta(s.id);\r\n dispatch({\r\n type: 'fleetSpawn',\r\n id: s.id,\r\n name: meta?.name ?? s.name,\r\n provider: meta?.provider,\r\n model: meta?.model,\r\n });\r\n // Seed a stable label so subagents spawned before TUI mount still\r\n // show up by name in the status bar's per-agent detail line.\r\n labelFor(s.id, meta?.name ?? s.name);\r\n }\r\n // Also seed cost from the usage aggregator.\r\n dispatch({ type: 'fleetCost', cost: d.snapshot().total.cost });\r\n\r\n // Discover new subagents on first FleetBus event for an unknown id.\r\n const seen = new Set(Object.keys(status.subagents));\r\n\r\n // Throttled delta accumulator per subagent.\r\n const pending = new Map<string, string>();\r\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\r\n const doFlush = () => {\r\n for (const [id, text] of pending) {\r\n if (text) dispatch({ type: 'fleetDelta', id, text });\r\n }\r\n pending.clear();\r\n flushTimer = null;\r\n };\r\n\r\n const offFleet = d.fleet.onAny((e: FleetEvent) => {\r\n // Discover new subagents.\r\n const fresh = !seen.has(e.subagentId);\r\n if (fresh) {\r\n seen.add(e.subagentId);\r\n const meta = d.getSubagentMeta(e.subagentId);\r\n dispatch({\r\n type: 'fleetSpawn',\r\n id: e.subagentId,\r\n name: meta?.name,\r\n provider: meta?.provider,\r\n model: meta?.model,\r\n });\r\n // Always assign a label on first sighting so the status bar's\r\n // 4th line has stable AGENT#N names even when history streaming\r\n // is disabled. The history `spawned` entry below is gated on\r\n // streamFleet; label assignment itself is unconditional.\r\n const lbl = labelFor(e.subagentId, meta?.name);\r\n if (streamFleetRef.current) {\r\n const where =\r\n meta?.provider && meta?.model ? `${meta.provider}/${meta.model}` : 'spawned';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'subagent',\r\n agentLabel: lbl.label,\r\n agentColor: lbl.color,\r\n icon: '▶',\r\n text: where,\r\n },\r\n });\r\n }\r\n }\r\n\r\n switch (e.type) {\r\n case 'iteration.started':\r\n dispatch({ type: 'fleetStart', id: e.subagentId });\r\n break;\r\n case 'session.started':\r\n // First event a subagent emits — treat as start so the fleet\r\n // panel is populated even if no iteration.started fires yet.\r\n dispatch({ type: 'fleetStart', id: e.subagentId });\r\n break;\r\n case 'provider.text_delta': {\r\n const p = e.payload as { text?: string };\r\n if (p?.text) {\r\n const cur = pending.get(e.subagentId) ?? '';\r\n pending.set(e.subagentId, cur + p.text);\r\n if (!flushTimer) flushTimer = setTimeout(doFlush, FLUSH_MS);\r\n streamBuf.set(e.subagentId, (streamBuf.get(e.subagentId) ?? '') + p.text);\r\n if (streamFlushTimer) clearTimeout(streamFlushTimer);\r\n streamFlushTimer = setTimeout(flushStreamBufs, FLUSH_MS * 4);\r\n }\r\n break;\r\n }\r\n case 'provider.thinking_delta': {\r\n // Extended thinking output — same buffering as text_delta so\r\n // it gets flushed into recentMessages and (when streaming is\r\n // on) injected into leader history.\r\n const p = e.payload as { text?: string };\r\n if (p?.text) {\r\n streamBuf.set(e.subagentId, (streamBuf.get(e.subagentId) ?? '') + p.text);\r\n if (streamFlushTimer) clearTimeout(streamFlushTimer);\r\n streamFlushTimer = setTimeout(flushStreamBufs, FLUSH_MS * 4);\r\n }\r\n break;\r\n }\r\n case 'provider.retry': {\r\n const p = e.payload as { attempt?: number; delayMs?: number };\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'warn',\r\n text: `subagent retry ${p?.attempt ?? '?'}${p?.delayMs ? ` (${p.delayMs}ms)` : ''}`,\r\n },\r\n });\r\n break;\r\n }\r\n case 'provider.error': {\r\n const p = e.payload as { description?: string };\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'error',\r\n text: `subagent error${p?.description ? `: ${p.description}` : ''}`,\r\n },\r\n });\r\n break;\r\n }\r\n case 'tool.started': {\r\n const p = e.payload as { name?: string };\r\n if (p?.name) {\r\n dispatch({ type: 'fleetToolStart', id: e.subagentId, name: p.name });\r\n }\r\n break;\r\n }\r\n case 'tool.executed': {\r\n const p = e.payload as {\r\n name?: string;\r\n ok?: boolean;\r\n durationMs?: number;\r\n outputBytes?: number;\r\n outputLines?: number;\r\n };\r\n dispatch({\r\n type: 'fleetTool',\r\n id: e.subagentId,\r\n name: p?.name,\r\n ok: p?.ok,\r\n durationMs: p?.durationMs,\r\n outputBytes: p?.outputBytes,\r\n outputLines: p?.outputLines,\r\n });\r\n dispatch({ type: 'fleetToolEnd', id: e.subagentId });\r\n break;\r\n }\r\n case 'provider.response': {\r\n // Surface live cost from the aggregator (already computed with\r\n // per-model pricing). The fleetUsage reducer case is a stub that\r\n // preserves cost; fleetCost carries the real value.\r\n dispatch({ type: 'fleetCost', cost: d.snapshot().total.cost });\r\n break;\r\n }\r\n case 'session.ended':\r\n // Subagent finished — leave status update to task.completed.\r\n break;\r\n case 'compaction.fired':\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'info', text: 'subagent compaction triggered' },\r\n });\r\n break;\r\n case 'compaction.failed':\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'warn', text: 'subagent compaction failed' },\r\n });\r\n break;\r\n case 'token.threshold':\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'info', text: 'subagent token threshold reached' },\r\n });\r\n break;\r\n case 'budget.threshold_reached': {\r\n const p = e.payload as { kind?: string; used?: number; limit?: number };\r\n dispatch({\r\n type: 'fleetBudgetWarning',\r\n id: e.subagentId,\r\n kind: p?.kind ?? 'unknown',\r\n used: p?.used ?? 0,\r\n limit: p?.limit ?? 0,\r\n });\r\n break;\r\n }\r\n }\r\n });\r\n\r\n // Task completions arrive on the director's bus too, but the\r\n // history entry is now produced by the `subagent.task_completed`\r\n // EventBus listener (which fires uniformly for director and\r\n // non-director paths). Here we only update fleet panel state +\r\n // running cost — the chat-side entry would otherwise duplicate.\r\n const offDone = d.on('task.completed', (payload) => {\r\n dispatch({\r\n type: 'fleetDone',\r\n id: payload.result.subagentId,\r\n status: payload.result.status,\r\n iterations: payload.result.iterations,\r\n toolCalls: payload.result.toolCalls,\r\n });\r\n dispatch({ type: 'fleetCost', cost: d.snapshot().total.cost });\r\n // Drain any pending streaming text right before the completion\r\n // entry is committed by the EventBus listener so the order\r\n // \"chat → done line\" stays correct.\r\n if (streamFlushTimer) {\r\n clearTimeout(streamFlushTimer);\r\n flushStreamBufs();\r\n }\r\n });\r\n\r\n return () => {\r\n offFleet();\r\n offDone();\r\n if (flushTimer) clearTimeout(flushTimer);\r\n doFlush(); // commit any pending deltas before cleanup\r\n if (streamFlushTimer) clearTimeout(streamFlushTimer);\r\n flushStreamBufs();\r\n };\r\n }, [director]);\r\n\r\n // Handle SIGINT: first cancels current iteration + kills the fleet,\r\n // second forces exit regardless of state (the old `status === 'idle'`\r\n // gate left users stuck in 'aborting' forever when a delegate call\r\n // wouldn't unwind — agent.run() doesn't return while subagents\r\n // ignore the abort signal). Third press hard-kills via process.exit\r\n // so a wedged Ink loop can't trap the user.\r\n useEffect(() => {\r\n const onSigint = () => {\r\n const current = stateRef.current;\r\n // Second (or later) Ctrl+C — exit no matter what. Status may be\r\n // 'aborting', 'running', or 'streaming'; the user has clearly\r\n // decided they want out. Try Ink's graceful exit first, then\r\n // hard-exit on a short timer in case the React tree is wedged.\r\n if (current.interrupts >= 1) {\r\n // Second (or later) Ctrl+C — force-kill all processes and exit.\r\n // This is the \"you really mean it\" exit path.\r\n getProcessRegistry().killAll({ force: true });\r\n if (current.interrupts >= 2) {\r\n process.exit(130);\r\n }\r\n try {\r\n process.exit(130);\r\n } catch {\r\n // ignore\r\n }\r\n dispatch({ type: 'interrupt' });\r\n return;\r\n }\r\n dispatch({ type: 'interrupt' });\r\n\r\n // Pickers are safe to cancel outright — closing the overlay\r\n // restores the previous state cleanly with no side-effects.\r\n // Do this first so a single Ctrl+C from the model picker or\r\n // slash picker exits gracefully instead of doing nothing.\r\n if (current.modelPicker.open) {\r\n dispatch({ type: 'modelPickerClose' });\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'warn', text: 'Model picker cancelled.' },\r\n });\r\n return;\r\n }\r\n if (current.slashPicker.open) {\r\n dispatch({ type: 'slashPickerClose' });\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'warn', text: 'Cancelled.' },\r\n });\r\n return;\r\n }\r\n\r\n if (activeCtrlRef.current) {\r\n activeCtrlRef.current.abort();\r\n dispatch({ type: 'status', status: 'aborting' });\r\n // Kill every running subagent on the first interrupt — without\r\n // this the parent agent.run() stays parked in `await delegate\r\n // → director.awaitTasks` forever and the \"press again to exit\"\r\n // hint becomes a lie.\r\n //\r\n // We `await` terminateAll AND race a 1500ms cap so a stuck\r\n // bridge or hung tool can't trap us in cleanup — the user\r\n // pressed Ctrl+C; their patience is finite. The second\r\n // Ctrl+C still forces exit immediately via the path above,\r\n // so this race only matters for the polite-shutdown window.\r\n if (director) {\r\n const cap = new Promise<void>((resolve) => {\r\n const t = setTimeout(resolve, 1500);\r\n t.unref?.();\r\n });\r\n void Promise.race([director.terminateAll().catch(() => undefined), cap]);\r\n }\r\n // Kill all tracked bash/exec processes from the process registry.\r\n // This ensures runaway child processes (including background bashes\r\n // that outlive the agent iteration) are cleaned up on Ctrl+C.\r\n const killed = getProcessRegistry().killAll();\r\n const procTag = killed.length > 0 ? ` + killed ${killed.length} process${killed.length === 1 ? '' : 'es'}` : '';\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${director ? ' + fleet terminated' : ''}${procTag}. 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: {\r\n kind: 'warn',\r\n text: `Iteration cancelled${director ? ' + fleet terminated' : ''}${procTag}. Press Ctrl+C again to exit.`,\r\n },\r\n });\r\n }\r\n } else {\r\n // No active ctrl (agent idle, or activeCtrlRef wasn't set).\r\n // Still kill any lingering bash/exec processes and exit.\r\n const killed = getProcessRegistry().killAll();\r\n const procTag = killed.length > 0 ? ` Killed ${killed.length} process${killed.length === 1 ? '' : 'es'}.` : '';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'warn', text: `Press Ctrl+C again to exit.${procTag}` },\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 }, [director]);\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 // Exception: when status is 'aborting', all input is blocked — except\r\n // Ctrl+C which the SIGINT handler processes directly (not through handleKey).\r\n // We check interrupts here so the second Ctrl+C can still reach the handler\r\n // even though status is 'aborting'.\r\n if (state.status === 'aborting' && state.interrupts === 0) return;\r\n // Block all input while confirmation prompt is shown — the ConfirmPrompt\r\n // component handles y/n/a/d/escape/enter itself and Input's disabled prop\r\n // is not reliable when multiple useInput hooks are active.\r\n if (state.confirmQueue.length > 0) return;\r\n\r\n // Re-entrancy guard: block stale-second events from \\r\\n terminals.\r\n if (inputGateRef.current) return;\r\n\r\n // Some terminals emit \\r\\n for Enter as two separate stdin events.\r\n // \\r arrives with key.return=true (handled below); \\n may arrive as\r\n // a stray character with key.return=false. Normalize both to Enter\r\n // and prevent them from polluting the buffer as literal text.\r\n const isEnter = key.return || input === '\\r' || input === '\\n';\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 (isEnter) {\r\n inputGateRef.current = true;\r\n try {\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 } finally {\r\n inputGateRef.current = false;\r\n }\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 (isEnter) {\r\n const now = Date.now();\r\n if (now - lastEnterAtRef.current < 50) return;\r\n lastEnterAtRef.current = now;\r\n inputGateRef.current = true;\r\n const line = selectedSlashCommandLine(state.slashPicker);\r\n if (line) {\r\n void submit(line);\r\n } else {\r\n acceptSlashPickerSelection();\r\n }\r\n inputGateRef.current = false;\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 setDraft(`/${sel.name} `, 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 (isEnter) {\r\n inputGateRef.current = true;\r\n try {\r\n await acceptPickerSelection();\r\n } finally {\r\n inputGateRef.current = false;\r\n }\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 // Esc when the agent is busy = \"drop what you're doing, I want to\r\n // steer\". Aborts the current iteration, terminates any running\r\n // subagents (otherwise they keep burning tokens on now-stale work),\r\n // and stashes a context snapshot so the STEERING preamble can tell\r\n // the model exactly what it was mid-doing. Does NOT consume the\r\n // Ctrl+C exit ladder (interrupts counter untouched). When no run\r\n // is active, Esc falls through to normal text handling.\r\n if (key.escape && state.status !== 'idle' && state.confirmQueue.length === 0) {\r\n // Snapshot context BEFORE we mutate anything. The submit handler\r\n // replays this into the model prompt so the model isn't guessing.\r\n const runningTools = Array.from(state.runningTools.values()).map((t) => t.name);\r\n const subagents = Object.values(state.fleet)\r\n .filter((e) => e.status === 'running')\r\n .map((e) => ({\r\n label: e.name,\r\n status: e.status,\r\n tool: e.currentTool?.name,\r\n }));\r\n const subagentsTerminated = subagents.length;\r\n const partialAssistantText = streamingTextRef.current.slice(-1500);\r\n\r\n activeCtrlRef.current?.abort();\r\n dispatch({ type: 'status', status: 'aborting' });\r\n dispatch({\r\n type: 'steerStart',\r\n snapshot: {\r\n runningTools,\r\n subagents,\r\n subagentsTerminated,\r\n partialAssistantText,\r\n },\r\n });\r\n\r\n // Kill the fleet too. Without this the subagents keep running\r\n // on the old direction, finish minutes later, and pollute the\r\n // chat with task.completed events the model doesn't care about\r\n // anymore. Cap at 1.5s so a wedged bridge can't hang the steer.\r\n if (director && subagentsTerminated > 0) {\r\n const cap = new Promise<void>((resolve) => {\r\n const t = setTimeout(resolve, 1500);\r\n t.unref?.();\r\n });\r\n void Promise.race([director.terminateAll().catch(() => undefined), cap]);\r\n }\r\n\r\n // Drop anything queued — steering means the user is redirecting,\r\n // not adding to the backlog. Without this the queued items would\r\n // run *before* the steering message, which contradicts the UX.\r\n const droppedCount = state.queue.length;\r\n if (droppedCount > 0) dispatch({ type: 'queueClear' });\r\n const droppedTag = droppedCount > 0 ? ` · dropped ${droppedCount} queued` : '';\r\n const fleetTag =\r\n subagentsTerminated > 0\r\n ? ` · stopped ${subagentsTerminated} subagent${subagentsTerminated === 1 ? '' : 's'}`\r\n : '';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'warn',\r\n text: `↯ Interrupted${droppedTag}${fleetTag}. Type your new direction.`,\r\n },\r\n });\r\n return;\r\n }\r\n\r\n if (isEnter) {\r\n // Re-entrancy protection for terminals that emit `\\r\\n` as two\r\n // separate stdin events: ignore Enter pressed within 50ms of the\r\n // last one. The 50ms window catches the double-event reliably\r\n // (the second `\\n` arrives within microseconds of the `\\r`) while\r\n // staying well below human double-tap speed.\r\n //\r\n // We intentionally do NOT await submit() here — it kicks off\r\n // agent.run() which can stay pending for minutes when a delegate\r\n // call is in flight. Awaiting would block this handler frame for\r\n // the full duration, which means every subsequent keystroke would\r\n // miss its dispatch (including the slash key — the user reported\r\n // the input feeling dead during delegated work). submit() handles\r\n // its own re-entrancy via state.status: when the agent is busy,\r\n // the message is queued instead of re-running concurrently.\r\n const now = Date.now();\r\n if (now - lastEnterAtRef.current < 50) return;\r\n lastEnterAtRef.current = now;\r\n void submit();\r\n return;\r\n }\r\n\r\n const { buffer, cursor } = draftRef.current;\r\n\r\n if (key.backspace || key.delete) {\r\n if (key.ctrl) {\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 = beforeCursor.slice(0, lastWordStart) + buffer.slice(cursor);\r\n setDraft(next, 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 setDraft(next, cursor);\r\n }\r\n return;\r\n }\r\n\r\n // Block-level backspace: if cursor is at end and buffer ends with a\r\n // placeholder pattern ([pasted #N] or [pasted]), delete the whole\r\n // placeholder and remove it from the placeholders list.\r\n if (key.backspace && cursor === buffer.length && state.placeholders.length > 0) {\r\n const BLOCK_PH_RE = /\\[pasted(?: #\\d+)?\\]$/;\r\n if (BLOCK_PH_RE.test(buffer)) {\r\n const newBuffer = buffer.replace(BLOCK_PH_RE, '').replace(/\\s+$/, '');\r\n dispatch({ type: 'removeLastPlaceholder' });\r\n setDraft(newBuffer, newBuffer.length);\r\n return;\r\n }\r\n }\r\n\r\n if (cursor === 0) return;\r\n const next = buffer.slice(0, cursor - 1) + buffer.slice(cursor);\r\n setDraft(next, cursor - 1);\r\n return;\r\n }\r\n\r\n if (key.leftArrow) {\r\n if (key.ctrl) {\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 setDraft(buffer, target);\r\n return;\r\n }\r\n if (cursor > 0) setDraft(buffer, cursor - 1);\r\n return;\r\n }\r\n if (key.rightArrow) {\r\n if (key.ctrl) {\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 setDraft(buffer, target);\r\n return;\r\n }\r\n if (cursor < buffer.length) setDraft(buffer, cursor + 1);\r\n return;\r\n }\r\n if (key.home) {\r\n setDraft(buffer, 0);\r\n return;\r\n }\r\n if (key.end) {\r\n setDraft(buffer, buffer.length);\r\n return;\r\n }\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 setDraft(buffer, 0);\r\n return;\r\n }\r\n if (key.ctrl && input === 'e') {\r\n setDraft(buffer, buffer.length);\r\n return;\r\n }\r\n if (key.ctrl && input === 'u') {\r\n setDraft('', 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 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 setDraft(next, 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 bracketed pastes\r\n // are routed through InputBuilder. Plain multi-line pastes (no bracket\r\n // sequence) are inserted as-is — without triggering the visual\r\n // \"[pasted #N N lines]\" placeholder — so the input stays a clean\r\n // single logical line while the content carries the newlines through\r\n // to the agent.\r\n if (bracketedPaste || cleanInput.length > PASTE_THRESHOLD_CHARS) {\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 if (cleanInput.includes('\\n')) {\r\n // Small paste with multiple lines — still show a placeholder.\r\n const lineCount = cleanInput.split('\\n').length;\r\n dispatch({ type: 'addPlaceholder', ph: `[pasted] (${lineCount} lines)` });\r\n } else {\r\n const next = buffer.slice(0, cursor) + cleanInput + buffer.slice(cursor);\r\n setDraft(next, cursor + cleanInput.length);\r\n }\r\n return;\r\n }\r\n\r\n // Plain multi-line paste (no bracket sequence, below paste threshold).\r\n // Strip newlines to spaces so the input row stays visually single-line.\r\n if (cleanInput.includes('\\n')) {\r\n const normalized = cleanInput.replace(/\\r?\\n/g, ' ');\r\n const next = buffer.slice(0, cursor) + normalized + buffer.slice(cursor);\r\n setDraft(next, cursor + normalized.length);\r\n return;\r\n }\r\n\r\n const next = buffer.slice(0, cursor) + cleanInput + buffer.slice(cursor);\r\n setDraft(next, 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 routed = blocks.some((block) => block.type === 'image')\r\n ? await routeImagesForModel(blocks, {\r\n supportsVision: supportsVision\r\n ? await supportsVision()\r\n : agent.ctx.provider.capabilities.vision,\r\n adapters: visionAdapters,\r\n ctx: agent.ctx,\r\n signal: ctrl.signal,\r\n providerId: agent.ctx.provider.id,\r\n model: agent.ctx.model,\r\n })\r\n : { blocks, route: 'none' as const, convertedImages: 0 };\r\n if (routed.route === 'adapter') {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'info',\r\n text: `Image input analyzed via ${routed.adapterName ?? 'vision adapter'} (${routed.convertedImages} image${routed.convertedImages === 1 ? '' : 's'}).`,\r\n },\r\n });\r\n }\r\n const result = await agent.run(routed.blocks, { signal: ctrl.signal });\r\n\r\n // Per-iteration assistant text was already committed by the\r\n // `provider.response` listener as each LLM call finished. Safety net:\r\n // if anything is still lingering in the synchronous ref (e.g. an\r\n // aborted run that never received a final provider.response), commit\r\n // it now so partial output is preserved rather than silently dropped.\r\n const lingering = streamingTextRef.current;\r\n if (lingering.trim()) {\r\n dispatch({ type: 'addEntry', entry: { kind: 'assistant', text: lingering } });\r\n }\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 // ── SDD Auto-Detection ──────────────────────────────────────────\r\n // Process AI output for spec, implementation plan, and task detection.\r\n if (result.status === 'done' && result.finalText && onSDDOutput) {\r\n try {\r\n const sddMessages = await onSDDOutput(result.finalText);\r\n for (const msg of sddMessages) {\r\n dispatch({ type: 'addEntry', entry: { kind: 'info', text: msg } });\r\n }\r\n } catch {\r\n // Non-fatal — SDD detection is best-effort\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 const runBlocksRef = useRef(runBlocks);\r\n runBlocksRef.current = runBlocks;\r\n\r\n /**\r\n * Eternal-mode driver. Loops `engine.runOneIteration()` until autonomy\r\n * flips away from 'eternal' or the engine reports stopped state. Each\r\n * iteration appends an info entry summarizing what happened so the TUI\r\n * timeline shows the engine's activity. Runs as a single sequential\r\n * consumer of `agent.run` — no race with user submissions because user\r\n * input is gated by `state.status` (a running iteration keeps status\r\n * at 'running' until the agent.run inside the engine returns).\r\n */\r\n const runEternalLoop = async (): Promise<void> => {\r\n const engine = getEternalEngine?.();\r\n if (!engine) return;\r\n // Avoid double-driving if the loop is already running. Status will\r\n // bounce idle↔running per iteration; the autonomy flag is the source\r\n // of truth for \"should we keep going\".\r\n if (eternalLoopRunningRef.current) return;\r\n eternalLoopRunningRef.current = true;\r\n try {\r\n while (true) {\r\n // Re-check the live state every iteration — /autonomy stop, SIGINT,\r\n // or /goal clear could have flipped it during the prior iteration.\r\n const liveMode = getAutonomy?.() ?? 'off';\r\n if (liveMode !== 'eternal') break;\r\n if (engine.currentState === 'stopped') break;\r\n dispatch({ type: 'status', status: 'running' });\r\n try {\r\n // Per-iteration entries land via the subscribeEternalIteration\r\n // useEffect below — we don't need to log here. Only surface\r\n // *errors* the engine catches but doesn't journal.\r\n await engine.runOneIteration();\r\n } catch (err) {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'error', text: `[eternal] ${err instanceof Error ? err.message : String(err)}` },\r\n });\r\n }\r\n dispatch({ type: 'status', status: 'idle' });\r\n // Yield so a slash command submitted between iterations (e.g.\r\n // /autonomy stop) actually lands before we kick the next one.\r\n await new Promise((r) => setTimeout(r, 200));\r\n }\r\n } finally {\r\n eternalLoopRunningRef.current = false;\r\n // Sync the displayed autonomy state with reality. The loop only exits\r\n // when getAutonomy() !== 'eternal' or engine.currentState === 'stopped',\r\n // both of which mean the mode is effectively off/idle. Refreshing here\r\n // stops the status bar from oscillating between \"● thinking…\" and\r\n // \"● idle\" forever after the goal is done.\r\n if (getAutonomy) {\r\n const finalMode = getAutonomy();\r\n if (finalMode !== autonomyLive) setAutonomyLive(finalMode);\r\n }\r\n }\r\n };\r\n const eternalLoopRunningRef = useRef(false);\r\n const runEternalLoopRef = useRef(runEternalLoop);\r\n runEternalLoopRef.current = runEternalLoop;\r\n\r\n // Subscribe to live per-iteration events from the eternal engine. The\r\n // engine's loop drive (runEternalLoop above) emits \"iteration completed\"\r\n // info entries, but those are coarse — this subscription surfaces the\r\n // *actual* journal entry per iteration with source, status, and cost.\r\n // Without it the TUI timeline only shows one-line summaries; with it the\r\n // user sees `#42 ✓ [todo] refactor parser ($0.0034)`.\r\n useEffect(() => {\r\n if (!subscribeEternalIteration) return;\r\n const unsub = subscribeEternalIteration((entry) => {\r\n const mark = entry.status === 'success' ? '✓' : entry.status === 'failure' ? '✗' : entry.status === 'aborted' ? '⊘' : '·';\r\n const cost = typeof entry.costUsd === 'number' ? ` ($${entry.costUsd.toFixed(4)})` : '';\r\n const note = entry.note ? ` — ${entry.note.slice(0, 80)}` : '';\r\n const text = `#${entry.iteration} ${mark} [${entry.source}] ${entry.task}${cost}${note}`;\r\n dispatch({ type: 'addEntry', entry: { kind: 'info', text } });\r\n });\r\n return unsub;\r\n }, [subscribeEternalIteration]);\r\n\r\n const submit = async (overrideRaw?: string) => {\r\n const raw = overrideRaw ?? draftRef.current.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 const pushSubmittedHistory = () => {\r\n if (trimmed) dispatch({ type: 'historyPush', text: trimmed });\r\n };\r\n if (trimmed === '/image' || trimmed === '/paste-image') {\r\n pushSubmittedHistory();\r\n clearDraft();\r\n await pasteClipboardImage();\r\n return;\r\n }\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 pushSubmittedHistory();\r\n clearDraft();\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 (getYolo) {\r\n const currentYolo = getYolo();\r\n if (currentYolo !== yoloLive) setYoloLive(currentYolo);\r\n }\r\n if (getAutonomy) {\r\n const currentAutonomy = getAutonomy();\r\n if (currentAutonomy !== autonomyLive) setAutonomyLive(currentAutonomy);\r\n // When /autonomy eternal lands, kick off the engine-driven loop.\r\n // Fire-and-forget — the loop runs until autonomy flips away from\r\n // 'eternal' or the engine's currentState goes !== 'running'.\r\n // Without this, the slash command would set the flag but the\r\n // TUI would just sit at the prompt waiting for user input.\r\n if (currentAutonomy === 'eternal' && getEternalEngine) {\r\n void runEternalLoopRef.current();\r\n }\r\n }\r\n if (res?.exit) {\r\n exit();\r\n onExit(0);\r\n }\r\n // `runText` lets a slash command queue a follow-up user-role\r\n // message (used by `/steer <text>` to send the STEERING\r\n // preamble + new direction as if the user had typed it).\r\n // Run AFTER the message is rendered so the user sees the\r\n // slash result before the model's response streams.\r\n if (res?.runText) {\r\n const b = builderRef.current;\r\n if (b) {\r\n b.appendText(res.runText);\r\n const blocks = await b.submit();\r\n // Wait briefly for any in-flight abort to settle into\r\n // 'idle' before kicking the next iteration — otherwise\r\n // runBlocks would early-return on the busy guard.\r\n const start = Date.now();\r\n while (stateRef.current.status !== 'idle' && Date.now() - start < 1500) {\r\n await new Promise((r) => setTimeout(r, 25));\r\n }\r\n await runBlocks(blocks);\r\n }\r\n }\r\n // Only fire onClearHistory for `/clear` — without this gate every\r\n // slash command (`/model`, `/use`, `/help`, …) would wipe the\r\n // conversation. Match the command name segment, not just the\r\n // prefix, so `/clearfoo` doesn't trigger.\r\n const cmd = trimmed.slice(1).split(/\\s+/, 1)[0];\r\n if (cmd === 'clear') {\r\n onClearHistory?.(dispatch);\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 // Steering inject: if the user pressed Esc on the prior iteration,\r\n // prepend a STEERING preamble so the model sees this isn't a\r\n // follow-up — it's an interrupt redirecting the work. The preamble\r\n // carries (a) context the model would otherwise have to guess\r\n // (what tools were running, what subagents were live) and (b)\r\n // explicit authority — \"drop the prior plan, respawn subagents\r\n // if useful, ask for clarification if needed\". Plain user-role\r\n // text so accountability stays with the human who triggered it.\r\n const steering = state.steeringPending;\r\n\r\n // ── SDD Context Injection ──────────────────────────────────────────\r\n // When an SDD session is active, prepend the session context so the\r\n // model knows it's in a spec-building conversation.\r\n const sddContext = getSDDContext?.();\r\n if (sddContext && trimmed) {\r\n builder.appendText(`[SDD SESSION ACTIVE]\\n${sddContext}\\n\\n---\\nUser message:\\n`);\r\n }\r\n\r\n if (trimmed) {\r\n const toAppend = steering ? buildSteeringPreamble(state.steerSnapshot, trimmed) : trimmed;\r\n builder.appendText(toAppend);\r\n }\r\n if (steering) dispatch({ type: 'steerConsume' });\r\n // The user sees their original text + a visual ↯ marker when\r\n // steering, not the full preamble — keeps the chat readable while\r\n // the model still gets the explicit instruction.\r\n const displayText = trimmed ? (steering ? `↯ ${trimmed}` : trimmed) : '(attachments only)';\r\n pushSubmittedHistory();\r\n clearDraft();\r\n const blocks = await builder.submit();\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 return;\r\n }\r\n\r\n dispatch({ type: 'addEntry', entry: { kind: 'user', text: displayText } });\r\n await runBlocks(blocks);\r\n };\r\n\r\n // ─── --goal / --ask boot inject ─────────────────────────────────────\r\n // The CLI may pass `--goal \"...\"` or `--ask \"...\"` to pre-populate the\r\n // very first turn. `initialGoal` wraps the text in the GOAL preamble so\r\n // the model lands in autonomous goal mode; `initialAsk` submits the text\r\n // verbatim (handy for scripted shell aliases). Both fire one-shot via a\r\n // mount-time ref guard so a re-render can't double-submit. We wait a tick\r\n // for the input builder to settle, then push directly into runBlocks —\r\n // bypassing the slash registry / submit() path keeps the boot path\r\n // self-contained even if user-installed slash commands haven't mounted\r\n // their effects yet.\r\n const bootInjectedRef = useRef(false);\r\n useEffect(() => {\r\n if (bootInjectedRef.current) return;\r\n bootInjectedRef.current = true;\r\n const goal = initialGoal?.trim();\r\n const ask = initialAsk?.trim();\r\n if (!goal && !ask) return;\r\n void (async () => {\r\n // Give the banner a frame to render first so the user sees the\r\n // greeting before the first turn streams over the top of it.\r\n await new Promise((r) => setTimeout(r, 50));\r\n const b = builderRef.current;\r\n if (!b) return;\r\n if (goal) {\r\n const shortGoal = goal.length > 80 ? `${goal.slice(0, 80)}…` : goal;\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'info',\r\n text: `🎯 Goal locked: ${shortGoal}\\n Agent will work until verifiably complete. Esc / /steer to redirect, Ctrl+C to stop.`,\r\n },\r\n });\r\n b.appendText(buildGoalPreamble(goal));\r\n } else if (ask) {\r\n dispatch({ type: 'addEntry', entry: { kind: 'user', text: ask } });\r\n b.appendText(ask);\r\n }\r\n const blocks = await b.submit();\r\n await runBlocksRef.current(blocks);\r\n })();\r\n }, [initialAsk, initialGoal]);\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\r\n entries={state.entries}\r\n streamingText={state.streamingText}\r\n toolStream={state.toolStream}\r\n />\r\n {/* Live activity strip — one line per running subagent with\r\n current tool + elapsed timer. Sits directly above the input\r\n area so it's always visible without scrolling. Renders\r\n nothing when no subagents are running. */}\r\n <LiveActivityStrip entries={state.fleet} nowTick={nowTick} />\r\n <Input\r\n value={state.buffer}\r\n cursor={state.cursor}\r\n placeholders={state.placeholders}\r\n disabled={state.status === 'aborting' || state.confirmQueue.length > 0}\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.rewindOverlay ? (\r\n <CheckpointTimeline\r\n checkpoints={state.rewindOverlay.checkpoints}\r\n selected={state.rewindOverlay.selected}\r\n onSelect={(i) => dispatch({ type: 'rewindOverlayMove', delta: i - state.rewindOverlay!.selected })}\r\n onConfirm={(i) => handleRewindTo(state.rewindOverlay!.checkpoints[i]!.promptIndex)}\r\n onClose={() => dispatch({ type: 'rewindOverlayClose' })}\r\n />\r\n ) : null}\r\n {state.confirmQueue.length > 0 && (() => {\r\n const head = state.confirmQueue[0]!;\r\n let resolved = false;\r\n return (\r\n <ConfirmPrompt\r\n toolName={head.toolName}\r\n input={head.input}\r\n suggestedPattern={head.suggestedPattern}\r\n onDecision={(decision) => {\r\n if (resolved) return;\r\n resolved = true;\r\n head.resolve(decision);\r\n dispatch({ type: 'confirmClose' });\r\n }}\r\n />\r\n );\r\n })()}\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={yoloLive}\r\n autonomy={autonomyLive}\r\n elapsedMs={elapsedMs}\r\n todos={todos}\r\n plan={planCounts ?? undefined}\r\n fleet={fleetCounts}\r\n fleetAgents={fleetAgents}\r\n git={gitInfo}\r\n context={contextWindow}\r\n projectName={projectName}\r\n subagentCount={Object.keys(state.fleet).length}\r\n processCount={getProcessRegistry().activeCount}\r\n hiddenItems={hiddenItems}\r\n />\r\n {director ? (\r\n <FleetPanel entries={state.fleet} totalCost={state.fleetCost} roster={fleetRoster} />\r\n ) : null}\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 type {\n Agent,\n AttachmentStore,\n Director,\n EventBus,\n FleetBus,\n FleetUsageAggregator,\n QueueStore,\n SlashCommandRegistry,\n TokenCounter,\n} from '@wrongstack/core';\nimport type { VisionAdapters } from '@wrongstack/runtime/vision';\nimport { render } from 'ink';\nimport React from 'react';\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 visionAdapters?: VisionAdapters;\n /** Resolve current model vision support. Falls back to provider capability when omitted. */\n supportsVision?: () => boolean | Promise<boolean>;\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 /** Query live YOLO state from the permission policy. */\n getYolo?: () => boolean;\n /** Query the live autonomy mode. */\n getAutonomy?: () => 'off' | 'suggest' | 'auto' | 'eternal';\n /**\n * Access the eternal-autonomy engine. When autonomy mode flips to\n * 'eternal' the TUI drives `runOneIteration()` from the post-slash hook\n * so the engine and TUI never race for the shared Context.\n */\n getEternalEngine?: () => import('@wrongstack/core').EternalAutonomyEngine | null;\n /**\n * Subscribe to live per-iteration events from the eternal engine.\n * Returns an unsubscribe function. TUI uses this to render each\n * iteration as a live timeline entry as it lands.\n */\n subscribeEternalIteration?: (\n fn: (entry: import('@wrongstack/core').JournalEntry) => void,\n ) => () => void;\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 — native scrollback stays live so chat history is\n * scrollable via mouse wheel / Shift+PgUp, which matches the user's\n * \"this is a chat app, let me scroll the chat\" intuition. Pass true\n * (or run with `--alt-screen`) for the full-screen mode that owns the\n * terminal and prevents resize/overlay leaks of the live region —\n * trade-off is that the terminal's native scrollback is suspended\n * while the TUI is up and only what's currently on screen is visible.\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 /** Called from /clear so the TUI can wipe its history entries while agent.ctx + memory are cleared separately. */\n onClearHistory?: (\n dispatch: React.Dispatch<{ type: 'clearHistory' } | { type: 'resetContextChip' }>,\n ) => void;\n\n // --- Fleet surface (director mode) ---\n\n /**\n * Live director instance. When set, the TUI renders a fleet panel\n * showing every spawned subagent, its current task, streaming output,\n * and runtime cost — updated live from the FleetBus. Pass null or omit\n * when multi-agent / director mode is disabled.\n */\n director?: Director | null;\n /**\n * Optional roster reference for resolving subagent role ids to\n * human-readable names. Same value passed to director.tools().\n */\n fleetRoster?: Record<string, { name: string }>;\n /**\n * Shared controller for the `/fleet stream on|off` toggle. The slash\n * command runs in the CLI process and needs to flip TUI reducer state;\n * the App installs a dispatch-backed `setEnabled` here on mount so\n * both sides stay synchronized.\n */\n /**\n * Shared controller for the `/fleet stream on|off` toggle. The slash\n * command runs in the CLI process and needs to flip TUI reducer state;\n * the App installs a dispatch-backed `setEnabled` here on mount so\n * both sides stay synchronized.\n */\n fleetStreamController?: {\n enabled: boolean;\n setEnabled: (enabled: boolean) => void;\n };\n /**\n * Controller for status bar hidden items. App installs a dispatch-backed\n * setter on mount so the /statusline slash command can update the TUI's\n * visible bar without a round-trip. The initial value is loaded from\n * the config file before App mounts.\n */\n statuslineHiddenItems: Array<'todos' | 'plan' | 'fleet' | 'git' | 'elapsed' | 'context' | 'cost'>;\n setStatuslineHiddenItems: (items: Array<'todos' | 'plan' | 'fleet' | 'git' | 'elapsed' | 'context' | 'cost'>) => void;\n\n /**\n * If set, the App boots straight into goal mode — the text is wrapped\n * in the GOAL preamble and submitted as the first turn. Lets users\n * launch directly from the shell:\n * wstack --tui --director --goal \"audit packages/core for races\"\n * The chat shows a one-line \"🎯 Goal locked: …\" hint; the actual\n * preamble is hidden from the visible history (same as `/goal`).\n */\n initialGoal?: string;\n /**\n * If set, submitted as the first turn verbatim (no preamble). Mainly\n * for scripted shell aliases — `wstack --tui --ask \"summarize foo.md\"`\n * — that want one turn pre-populated without the goal-mode framing.\n * Ignored when `initialGoal` is also set.\n */\n initialAsk?: string;\n /**\n * Directory containing session JSONL files. Required for rewind\n * functionality. When provided the TUI can list checkpoints and\n * trigger a rewind via `/rewind` or Ctrl+R.\n */\n sessionsDir?: string;\n /**\n * SDD session context getter. When an SDD session is active, returns\n * the AI prompt context to inject into user messages.\n */\n getSDDContext?: () => string | null;\n /**\n * Process AI output for SDD auto-detection (spec, tasks, plan).\n * Returns displayable status messages.\n */\n onSDDOutput?: (output: string) => Promise<string[]>;\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 // Take over EVERY keystroke. Raw mode (Ink turns this on when render\n // mounts) already disables ICANON/ECHO/ISIG/IXON on Linux+macOS, so\n // Ctrl+C/Z/\\\\/S/Q arrive as input bytes instead of generating\n // signals or being eaten by the terminal driver. Belt-and-suspenders:\n // install no-op handlers for the suspend/quit signals just in case\n // some shell or terminal still surfaces them — without these, a\n // stray Ctrl+Z could background the TUI mid-session.\n const swallowSignals: NodeJS.Signals[] = ['SIGTSTP', 'SIGQUIT', 'SIGTTIN', 'SIGTTOU'];\n const swallow = () => {};\n for (const s of swallowSignals) {\n try {\n process.on(s, swallow);\n } catch {\n // Signal not supported on this platform (Windows ignores most of\n // these). Safe to skip — there's nothing for the terminal to\n // deliver in the first place.\n }\n }\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 for (const s of swallowSignals) {\n try {\n process.off(s, swallow);\n } catch {\n // ignore — see install site\n }\n }\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 visionAdapters: opts.visionAdapters,\n supportsVision: opts.supportsVision,\n model: opts.model,\n banner: opts.banner ?? true,\n queueStore: opts.queueStore,\n yolo: opts.yolo,\n getYolo: opts.getYolo,\n getAutonomy: opts.getAutonomy,\n getEternalEngine: opts.getEternalEngine,\n subscribeEternalIteration: opts.subscribeEternalIteration,\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 director: opts.director ?? null,\n fleetRoster: opts.fleetRoster,\n onClearHistory: opts.onClearHistory\n ? (dispatch) => opts.onClearHistory!(dispatch)\n : undefined,\n fleetStreamController: opts.fleetStreamController,\n statuslineHiddenItems: opts.statuslineHiddenItems,\n setStatuslineHiddenItems: opts.setStatuslineHiddenItems,\n initialGoal: opts.initialGoal,\n initialAsk: opts.initialAsk,\n getSDDContext: opts.getSDDContext,\n onSDDOutput: opts.onSDDOutput,\n sessionsDir: opts.sessionsDir,\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 // Non-altScreen mode: terminal reflows visible text on resize BEFORE\n // Ink can react, which leaks one or more lines of the live region\n // (input prompt, status bar) into native scrollback. We can't recover\n // what the terminal already pushed up, but we CAN ensure no leftover\n // ghosts persist below the cursor by erasing from-cursor-to-end on\n // every resize. Combined with Ink's automatic re-render on resize,\n // this minimizes the artifact to (at most) the lines the terminal\n // itself pushed up at the moment of the resize event.\n //\n // For users doing heavy resize / split-pane workflows, --alt-screen\n // is the bullet-proof fix: Ink renders into a separate screen buffer\n // that has no native scrollback, so terminal-side reflow can't push\n // anything anywhere. Trade-off documented in tui/README.md.\n let detachResize: (() => void) | null = null;\n if (!useAltScreen) {\n const onResize = () => {\n try {\n // \\x1b[J = erase from cursor to end of screen. Does NOT touch\n // anything above the cursor, so committed Static history in\n // scrollback is preserved. Ink's useStdout subscriber will\n // immediately re-render the live region at the new width, and\n // log-update's stale line-count tracker gets a clean slate to\n // draw onto.\n stdout.write('\\x1b[J');\n } catch {\n // stdout might be detached mid-shutdown — ignore.\n }\n };\n stdout.on('resize', onResize);\n detachResize = () => stdout.off('resize', onResize);\n }\n\n instance\n .waitUntilExit()\n .then(() => {\n detachResize?.();\n settle(exitCode);\n })\n .catch(() => {\n detachResize?.();\n settle(1);\n });\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/confirm-prompt.tsx","../src/components/checkpoint-timeline.tsx","../src/components/file-picker.tsx","../src/components/fleet-panel.tsx","../src/markdown-table.ts","../src/components/history.tsx","../src/components/input.tsx","../src/components/live-activity-strip.tsx","../src/components/model-picker.tsx","../src/components/slash-menu.tsx","../src/components/status-bar.tsx","../src/file-search.ts","../src/git-info.ts","../src/queue-slash.ts","../src/kill-slash.ts","../src/ps-slash.ts","../src/app.tsx","../src/run-tui.ts"],"names":["React","input","useInput","jsxs","Box","jsx","Text","path","sep","Fragment","fmtDuration","fmtBytes","useEffect","fmtRecentTool","fmtRecentMessage","cache","fmtTok","fmtElapsed","fs","parts","USAGE","renderList","getProcessRegistry","useState","maxContext","next","blocks"],"mappings":"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","file":"index.js","sourcesContent":["import { Box, Text, useInput } from 'ink';\nimport React from 'react';\n\nexport interface ConfirmPromptProps {\n toolName: string;\n input: unknown;\n suggestedPattern: string;\n onDecision: (decision: 'yes' | 'no' | 'always' | 'deny') => void;\n}\n\nfunction stringifyInput(input: unknown): string {\n if (!input || typeof input !== 'object') return '';\n const obj = input as Record<string, unknown>;\n return Object.entries(obj)\n .filter(([k]) => k !== 'content' && k !== 'new_string')\n .map(([k, v]) => `${k}: ${truncate(JSON.stringify(v), 80)}`)\n .join(' ');\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n}\n\nfunction hasDiff(input: unknown): boolean {\n return Boolean(\n input && typeof input === 'object' && 'diff' in (input as Record<string, unknown>),\n );\n}\n\nfunction renderDiffLine(line: string): React.ReactElement {\n const prefix = line.startsWith('+')\n ? 'green'\n : line.startsWith('-')\n ? 'red'\n : line.startsWith('@@')\n ? 'cyan'\n : undefined;\n return (\n <Text key={line} color={prefix}>\n {line}\n {'\\n'}\n </Text>\n );\n}\n\nfunction renderDiff(diff: string): React.ReactElement {\n const lines = diff\n .split('\\n')\n .filter((l) => l.length > 0)\n .slice(0, 20);\n return (\n <Box flexDirection=\"column\" paddingX={2}>\n {lines.map((l) => renderDiffLine(l))}\n </Box>\n );\n}\n\nexport function ConfirmPrompt({\n toolName,\n input,\n suggestedPattern,\n onDecision,\n}: ConfirmPromptProps): React.ReactElement {\n // Terminal bell on mount — alerts the user that action is required,\n // especially important when the agent has been running autonomously\n // and the user may not be staring at the terminal.\n React.useEffect(() => {\n process.stdout.write('\\x07');\n }, []);\n\n useInput((input, key) => {\n // Ignore empty input and CRLF/LF artifacts (Enter produces \\r on Windows, \\n on Unix)\n if (!input || input === '\\r' || input === '\\n') return;\n const ch = input.toLowerCase();\n if (ch === 'y') {\n onDecision('yes');\n } else if (ch === 'n') {\n onDecision('no');\n } else if (ch === 'a') {\n onDecision('always');\n } else if (ch === 'd') {\n onDecision('deny');\n }\n });\n\n const inputSummary = stringifyInput(input);\n const showDiff = hasDiff(input);\n const inp = input as { diff?: unknown };\n const diff = typeof inp?.diff === 'string' ? inp.diff : '';\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n marginY={1}\n >\n <Box flexDirection=\"row\">\n <Text bold color=\"yellow\">\n ⚠ APPROVAL REQUIRED\n </Text>\n <Text> </Text>\n <Text bold color=\"white\">\n {toolName}\n </Text>\n </Box>\n {inputSummary ? <Text dimColor>{inputSummary}</Text> : null}\n {showDiff && diff ? (\n <Box flexDirection=\"column\" marginY={1}>\n {renderDiff(diff)}\n </Box>\n ) : null}\n <Text dimColor>─────────────────</Text>\n <Box flexDirection=\"row\">\n <Text>\n <Text bold color=\"green\">\n [y]\n </Text>\n <Text dimColor>es </Text>\n <Text bold color=\"red\">\n [n]\n </Text>\n <Text dimColor>o </Text>\n <Text bold color=\"cyan\">\n [a]\n </Text>\n <Text dimColor>lways ({suggestedPattern}) </Text>\n <Text bold color=\"red\">\n [d]\n </Text>\n <Text dimColor>eny</Text>\n </Text>\n </Box>\n </Box>\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport type React from 'react';\n\nexport interface CheckpointTimelineProps {\n checkpoints: Array<{\n promptIndex: number;\n promptPreview: string;\n ts: string;\n fileCount: number;\n }>;\n selected: number;\n onSelect: (index: number) => void;\n onConfirm: (index: number) => void;\n onClose: () => void;\n}\n\n/**\n * Full-screen checkpoint timeline overlay for the /rewind command.\n * Arrow keys to navigate, Enter to rewind to selected, Esc to close.\n */\nexport function CheckpointTimeline({\n checkpoints,\n selected,\n onSelect,\n onConfirm,\n onClose,\n}: CheckpointTimelineProps): React.ReactElement {\n useInput((_, key) => {\n if (key.escape) {\n onClose();\n } else if (key.upArrow) {\n onSelect(Math.max(0, selected - 1));\n } else if (key.downArrow) {\n onSelect(Math.min(checkpoints.length - 1, selected + 1));\n } else if (key.return) {\n onConfirm(selected);\n }\n });\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ⟲ Session Rewind\n </Text>\n <Text dimColor> — ↑/↓ navigate · Enter rewind · Esc cancel</Text>\n </Box>\n {checkpoints.length === 0 ? (\n <Text dimColor>No checkpoints in this session.</Text>\n ) : (\n checkpoints.map((cp, i) => {\n const isSelected = i === selected;\n const label = `[${cp.promptIndex}] ${cp.promptPreview}`;\n return (\n <Box key={cp.promptIndex}>\n <Text color={isSelected ? 'cyan' : undefined} bold={isSelected}>\n {isSelected ? '▸ ' : ' '}\n </Text>\n <Text color={isSelected ? 'cyan' : undefined} bold={isSelected}>\n {label}\n </Text>\n <Text dimColor> {new Date(cp.ts).toLocaleTimeString()}</Text>\n {cp.fileCount > 0 && (\n <Text dimColor> · {cp.fileCount} file{cp.fileCount !== 1 ? 's' : ''}</Text>\n )}\n </Box>\n );\n })\n )}\n </Box>\n );\n}","import { Box, Text } from 'ink';\nimport type React from 'react';\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>@{query || '…'} — ↑/↓ select, Enter attach, Esc cancel</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 { Box, Text } from 'ink';\r\nimport type React from 'react';\r\nimport type { FleetEntry } from '../app.js';\r\n\r\nexport interface FleetPanelProps {\r\n /** Per-subagent state, keyed by subagentId. */\r\n entries: Record<string, FleetEntry>;\r\n /** Fleet-wide accumulated cost (from FleetUsageAggregator). */\r\n totalCost: number;\r\n /** Optional roster for resolving role ids to display names. */\r\n roster?: Record<string, { name: string }>;\r\n}\r\n\r\nconst STATUS_ICON: Record<FleetEntry['status'], { icon: string; color: string }> = {\r\n idle: { icon: '○', color: 'gray' },\r\n running: { icon: '●', color: 'green' },\r\n success: { icon: '✓', color: 'green' },\r\n failed: { icon: '✗', color: 'red' },\r\n timeout: { icon: '⏱', color: 'yellow' },\r\n stopped: { icon: '⊘', color: 'yellow' },\r\n};\r\n\r\nfunction fmtCost(n: number): string {\r\n if (n === 0) return '—';\r\n return `$${n.toFixed(3)}`;\r\n}\r\n\r\nfunction fmtCount(n: number): string {\r\n if (n === 0) return '—';\r\n return String(n);\r\n}\r\n\r\nfunction fmtDuration(ms: number): string {\r\n if (ms < 1000) return `${ms}ms`;\r\n return `${(ms / 1000).toFixed(1)}s`;\r\n}\r\n\r\nfunction fmtBytes(n: number): string {\r\n if (n < 1024) return `${n}B`;\r\n return `${(n / 1024).toFixed(1)}KB`;\r\n}\r\n\r\nfunction fmtRecentTool(tool: FleetEntry['recentTools'][number]): string {\r\n const status = tool.ok === false ? 'fail' : 'ok';\r\n const name = tool.name.length > 24 ? `${tool.name.slice(0, 23)}...` : tool.name;\r\n const parts = [status, name];\r\n if (typeof tool.durationMs === 'number') parts.push(fmtDuration(tool.durationMs));\r\n if (typeof tool.outputBytes === 'number' && tool.outputBytes > 0) parts.push(fmtBytes(tool.outputBytes));\r\n if (typeof tool.outputLines === 'number' && tool.outputLines > 0) parts.push(`${tool.outputLines}L`);\r\n return parts.join(' ');\r\n}\r\n\r\nfunction fmtRecentMessage(message: FleetEntry['recentMessages'][number]): string {\r\n const text = message.text.replace(/\\s+/g, ' ');\r\n return text.length > 80 ? `${text.slice(0, 79)}...` : text;\r\n}\r\n\r\nfunction fmtModel(provider?: string, model?: string): string {\r\n if (!provider && !model) return '';\r\n const p = provider ?? '';\r\n const m = model ?? '';\r\n return p && m ? `${p}/${m}` : p || m;\r\n}\r\n\r\nfunction resolveName(entry: FleetEntry, roster?: Record<string, { name: string }>): string {\r\n // Try roster lookup by id first.\r\n const rosterEntry = roster?.[entry.id];\r\n if (rosterEntry) return rosterEntry.name;\r\n return entry.name;\r\n}\r\n\r\n/**\r\n * Live fleet panel rendered below the status bar when director mode is\r\n * active. Shows every known subagent with status, streaming output (for\r\n * running agents), iteration/tool/cost counts, and a fleet-wide cost total.\r\n *\r\n * Designed to be compact — each subagent is one or two lines. When no\r\n * subagents have been spawned yet, the panel is hidden entirely.\r\n */\r\nexport function FleetPanel({ entries, totalCost, roster }: FleetPanelProps): React.ReactElement | null {\r\n const list = Object.values(entries);\r\n if (list.length === 0) return null;\r\n\r\n // Sort: running first, then recent activity, then idle/done.\r\n const sorted = [...list].sort((a, b) => {\r\n const order: Record<string, number> = { running: 0, success: 1, failed: 2, timeout: 3, stopped: 4, idle: 5 };\r\n const ao = order[a.status] ?? 9;\r\n const bo = order[b.status] ?? 9;\r\n if (ao !== bo) return ao - bo;\r\n return b.lastEventAt - a.lastEventAt;\r\n });\r\n\r\n const runningCount = list.filter((e) => e.status === 'running').length;\r\n const totalLabel =\r\n totalCost > 0\r\n ? `$${totalCost.toFixed(3)} · ${runningCount} active`\r\n : `${runningCount} active`;\r\n\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n paddingX={1}\r\n borderStyle=\"single\"\r\n borderTop={false}\r\n borderBottom={false}\r\n borderLeft={false}\r\n borderRight={false}\r\n >\r\n {/* Header */}\r\n <Box flexDirection=\"row\" gap={2}>\r\n <Text dimColor>Fleet</Text>\r\n <Text dimColor>│</Text>\r\n <Text dimColor>{list.length} agent{list.length === 1 ? '' : 's'}</Text>\r\n <Text dimColor>│</Text>\r\n <Text dimColor>{totalLabel}</Text>\r\n </Box>\r\n\r\n {/* Per-subagent rows */}\r\n {sorted.map((entry) => {\r\n const si = STATUS_ICON[entry.status];\r\n const modelTag = fmtModel(entry.provider, entry.model);\r\n const name = resolveName(entry, roster);\r\n const recentTools = (entry.recentTools ?? []).slice(-2).map(fmtRecentTool).join(' | ');\r\n const recentMessages = (entry.recentMessages ?? []).slice(-2).map(fmtRecentMessage);\r\n\r\n return (\r\n <Box key={entry.id} flexDirection=\"column\">\r\n <Box flexDirection=\"row\" gap={1}>\r\n <Text color={si.color}>{si.icon}</Text>\r\n <Text>{name.slice(0, 16).padEnd(16)}</Text>\r\n {modelTag ? (\r\n <>\r\n <Text dimColor>·</Text>\r\n <Text dimColor>{modelTag}</Text>\r\n </>\r\n ) : null}\r\n <Text dimColor>·</Text>\r\n <Text dimColor>{fmtCount(entry.iterations).padStart(3)}it</Text>\r\n <Text dimColor>{fmtCount(entry.toolCalls).padStart(3)}tc</Text>\r\n <Text dimColor>·</Text>\r\n <Text color=\"yellow\">{fmtCost(entry.cost)}</Text>\r\n </Box>\r\n {/* Current tool — shown only while a tool is mid-flight. */}\r\n {entry.status === 'running' && entry.currentTool ? (\r\n <Box paddingLeft={2}>\r\n <Text color=\"cyan\">→ {entry.currentTool.name}</Text>\r\n <Text dimColor> ({Math.max(0, Date.now() - entry.currentTool.startedAt)}ms)</Text>\r\n </Box>\r\n ) : null}\r\n {recentTools ? (\r\n <Box paddingLeft={2}>\r\n <Text dimColor>tools: {recentTools}</Text>\r\n </Box>\r\n ) : null}\r\n {recentMessages.map((message, index) => (\r\n <Box key={`${entry.id}-msg-${index}-${message}`} paddingLeft={2}>\r\n <Text dimColor>msg: {message}</Text>\r\n </Box>\r\n ))}\r\n {/* Budget pressure warning */}\r\n {entry.budgetWarning ? (\r\n <Box paddingLeft={2}>\r\n <Text color=\"yellow\">⚡ hitting {entry.budgetWarning.kind} limit ({entry.budgetWarning.used}/{entry.budgetWarning.limit}) — extending</Text>\r\n </Box>\r\n ) : null}\r\n {/* Streaming tail for running agents */}\r\n {entry.status === 'running' && entry.streamingText ? (\r\n <Box paddingLeft={2}>\r\n <Text dimColor>\r\n {'>'} {entry.streamingText.slice(-80)}\r\n </Text>\r\n </Box>\r\n ) : null}\r\n {/* JSONL transcript path — dim, last so users grep -F it. */}\r\n {entry.transcriptPath ? (\r\n <Box paddingLeft={2}>\r\n <Text dimColor>log: {entry.transcriptPath}</Text>\r\n </Box>\r\n ) : null}\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n );\r\n}\r\n","/**\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';\nimport { useEffect, useState } from 'react';\nimport { Box, Static, Text, useStdout } from 'ink';\nimport { renderMarkdownTables } from '../markdown-table.js';\nimport { ConfirmPrompt } from './confirm-prompt.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 /** Full byte length of the result body the model actually received\n * (post-cap, post-scrub). Carried separately because `output` is a\n * ~400-char preview — `outputBytes` is what the model paid for. */\n outputBytes?: number;\n /** ~3.5 chars/token estimate over `outputBytes`. Cheap to render in\n * the chip; the authoritative count lives in provider.response.usage. */\n outputTokens?: number;\n /** Real line count for tools that have a meaningful one — read counts\n * numbered prefixes, shell/grep/logs count newlines. Undefined for\n * tools without a line notion (json, fetch, …). */\n outputLines?: number;\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 /** Wire family the provider is configured to speak (anthropic, openai, …). */\n family?: string;\n /** Last 3 chars of the active API key — quick visual confirmation that the right account is wired up. */\n keyTail?: string;\n }\n /** Tool confirmation shown while waiting for the user to approve/deny. */\n | { id: number; kind: 'confirm'; toolName: string; input: unknown; suggestedPattern: string }\n /**\n * Subagent activity surfaced into the leader's history. One entry per\n * tool call, assistant message, spawn, or completion — prefixed with a\n * stable `AGENT#N` label so users can follow each subagent across\n * interleaved output from multiple parallel runs.\n */\n | {\n id: number;\n kind: 'subagent';\n agentLabel: string;\n agentColor: string;\n icon: string;\n text: string;\n detail?: string;\n };\n\nexport interface HistoryProps {\n entries: HistoryEntry[];\n streamingText?: string;\n /**\n * Optional live tail of the currently streaming tool. Rendered below the\n * assistant tail so the user sees both at once: model thinking and tool\n * output. Cleared automatically when the tool's `tool.executed` event\n * fires and the final entry lands in `entries`.\n */\n toolStream?: { toolUseId: string; name: string; text: string; startedAt: number } | null;\n}\n\nexport function History({ entries, streamingText, toolStream }: 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 const toolTail = toolStream?.text\n ? tailForDisplay(toolStream.text, MAX_STREAM_DISPLAY_CHARS)\n : '';\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 flexDirection=\"column\" marginY={1}>\n <Box flexDirection=\"row\">\n <Text bold color=\"cyan\">{'ASSISTANT: '}</Text>\n <Text dimColor>(streaming...)</Text>\n </Box>\n <Text color=\"white\">{tail}</Text>\n </Box>\n ) : null}\n {toolTail ? (\n <ToolStreamBox\n name={toolStream!.name}\n text={toolTail}\n startedAt={toolStream!.startedAt}\n termWidth={termWidth}\n />\n ) : null}\n </>\n );\n}\n\nconst MAX_STREAM_DISPLAY_CHARS = 480;\n\nconst MAX_STREAM_LINES = 8;\n\n/**\n * Rich streaming tool output — framed header with live elapsed time,\n * tail-N output so the screen doesn't flood, and a \"N more lines\n * above\" indicator when truncated.\n */\nfunction ToolStreamBox({\n name,\n text,\n startedAt,\n termWidth,\n}: {\n name: string;\n text: string;\n startedAt: number;\n termWidth: number;\n}): React.ReactElement {\n // Tick every 500ms while streaming to refresh the elapsed counter.\n const [tick, setTick] = useState(0);\n useEffect(() => {\n const t = setInterval(() => setTick((n) => n + 1), 500);\n return () => clearInterval(t);\n }, []);\n void tick; // consumed in elapsed calc below\n\n const elapsedMs = Date.now() - startedAt;\n const lines = text.split('\\n');\n const totalLines = lines.length;\n const hidden = Math.max(0, totalLines - MAX_STREAM_LINES);\n const visible = hidden > 0 ? lines.slice(hidden) : lines;\n // Truncate long individual lines so borders don't break.\n const contentWidth = Math.max(20, Math.min(termWidth - 4, 100));\n\n return (\n <Box flexDirection=\"column\" marginTop={0}>\n {/* Header */}\n <Box flexDirection=\"row\">\n <Text color=\"yellow\">◆ </Text>\n <Text bold color=\"cyan\">\n {name}\n </Text>\n <Text dimColor>{` ⏱ ${fmtDuration(elapsedMs)}`}</Text>\n {hidden > 0 ? (\n <Text dimColor>{` (${totalLines} lines, showing last ${MAX_STREAM_LINES})`}</Text>\n ) : null}\n </Box>\n {/* Output lines */}\n <Box flexDirection=\"column\" marginLeft={2}>\n {hidden > 0 ? (\n <Text dimColor italic>{` … ${hidden} more line${hidden === 1 ? '' : 's'} above`}</Text>\n ) : null}\n {visible.map((line, i) => {\n const key = i;\n const trimmed = line.length > contentWidth ? `${line.slice(0, contentWidth - 1)}…` : line;\n return (\n <Text key={key} dimColor>\n {trimmed || ' '}\n </Text>\n );\n })}\n </Box>\n </Box>\n );\n}\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 // Width of the line-number gutter: pick the widest line number across all\n // rows so the column stays aligned. Fall back to 1 when no row carries a\n // line number (e.g. a diff with only a meta/hunk row).\n let gutterWidth = 1;\n for (const r of rows) {\n const n = r.kind === 'del' ? r.oldLine : r.newLine;\n if (typeof n === 'number') {\n const w = String(n).length;\n if (w > gutterWidth) gutterWidth = w;\n }\n }\n const blank = ' '.repeat(gutterWidth);\n return (\n <Box flexDirection=\"column\" marginLeft={4} marginTop={0}>\n {rows.map((row, i) => {\n const key = i;\n if (row.kind === 'hunk') {\n return (\n <Text key={key} color=\"cyan\" dimColor>\n {row.text}\n </Text>\n );\n }\n if (row.kind === 'meta') {\n return (\n <Text key={key} dimColor>\n {`${blank} ${row.text}`}\n </Text>\n );\n }\n const lnNumber = row.kind === 'del' ? row.oldLine : row.newLine;\n const lnText =\n typeof lnNumber === 'number' ? String(lnNumber).padStart(gutterWidth, ' ') : blank;\n if (row.kind === 'ctx') {\n return (\n <Text key={key} dimColor>\n {`${lnText} ${row.text}`}\n </Text>\n );\n }\n // add / del — soft background block on the content only; line number\n // stays dim outside the block so the eye anchors on the change, not\n // a wall of colour. Bright variants render lighter than plain\n // green/red on most terminals.\n const bg = row.kind === 'add' ? 'greenBright' : 'redBright';\n return (\n <Text key={key}>\n <Text dimColor>{`${lnText} `}</Text>\n <Text backgroundColor={bg} color=\"black\">\n {row.text}\n </Text>\n </Text>\n );\n })}\n {hidden > 0 ? (\n <Text dimColor italic>\n {`${blank} … ${hidden} more line${hidden === 1 ? '' : 's'}`}\n </Text>\n ) : null}\n </Box>\n );\n}\n\nfunction Entry({\n entry,\n termWidth,\n}: { 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 (\n <Box flexDirection=\"column\" marginY={1}>\n <Box flexDirection=\"row\">\n <Text bold color=\"cyan\">{'ASSISTANT: '}</Text>\n </Box>\n <Text color=\"white\">{renderMarkdownTables(entry.text, termWidth)}</Text>\n </Box>\n );\n case 'tool': {\n const argSummary = formatToolArgs(entry.name, entry.input);\n const outLines = formatToolOutput(\n entry.name,\n entry.output,\n entry.ok,\n entry.outputBytes,\n entry.outputLines,\n );\n const diff = entry.ok ? extractDiffPreview(entry.name, entry.output) : undefined;\n // Right-aligned size chip: what the MODEL actually received, not the\n // 400-char event preview. Lines (when meaningful), real bytes, and a\n // ~3.5 chars/token estimate. Skipped entirely on errors and empty\n // bodies so the success line stays clean.\n const sizeChip = (() => {\n if (!entry.ok) return '';\n const parts: string[] = [];\n if (entry.outputLines !== undefined && entry.outputLines > 0) {\n parts.push(`${entry.outputLines} L`);\n }\n if (entry.outputBytes && entry.outputBytes > 0) {\n parts.push(fmtBytes(entry.outputBytes));\n }\n if (entry.outputTokens && entry.outputTokens > 0) {\n parts.push(`≈${fmtTok(entry.outputTokens)} tok`);\n }\n return parts.join(' · ');\n })();\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 {sizeChip ? <Text dimColor>{` · ${sizeChip}`}</Text> : null}\n </Text>\n {outLines.map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: tool output lines are static, index is stable\n <Text key={i}>\n <Text dimColor>{i === outLines.length - 1 && !diff ? ' └─ ' : ' ├─ '}</Text>\n <Text\n color={!entry.ok || line.startsWith('!') ? 'red' : undefined}\n dimColor={entry.ok && !line.startsWith('!')}\n >\n {line}\n </Text>\n </Text>\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 'confirm':\n // Confirmation is handled by ConfirmPrompt component, not here.\n // This placeholder is intentionally minimal to avoid duplicating the UI.\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"yellow\" paddingX={1} marginY={1}>\n <Text bold color=\"yellow\">⚠ Confirm: {entry.toolName}</Text>\n <Text dimColor>Waiting for y / n / a / d...</Text>\n </Box>\n );\n case 'banner':\n return <Banner entry={entry} />;\n case 'subagent': {\n // One-line summary for tools/spawn/done; multi-line wrap for\n // assistant messages. The label color is stable per subagent so\n // the eye can track interleaved output from multiple agents.\n const lines = entry.text.split('\\n');\n return (\n <Box flexDirection=\"column\">\n <Text>\n <Text color={entry.agentColor} bold>\n {`[${entry.agentLabel}]`}\n </Text>\n <Text>{' '}</Text>\n <Text color={entry.agentColor}>{entry.icon}</Text>\n <Text>{' '}</Text>\n <Text>{lines[0] ?? ''}</Text>\n {entry.detail ? (\n <>\n <Text dimColor>{' · '}</Text>\n <Text dimColor>{entry.detail}</Text>\n </>\n ) : null}\n </Text>\n {lines.slice(1).map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: stable line index\n <Text key={i}>\n <Text dimColor>{' '}</Text>\n <Text>{line}</Text>\n </Text>\n ))}\n </Box>\n );\n }\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 flexDirection=\"column\" borderStyle=\"round\" borderColor=\"magenta\" paddingX={2} paddingY={0}>\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 {entry.family ? (\n <Text>\n <Text color=\"cyan\">{' family '}</Text>\n <Text dimColor>{entry.family}</Text>\n </Text>\n ) : null}\n {entry.keyTail ? (\n <Text>\n <Text color=\"cyan\">{' key '}</Text>\n <Text dimColor>{'●●●…'}</Text>\n <Text>{entry.keyTail}</Text>\n </Text>\n ) : null}\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\n/** Compact thousands formatter used by the tool-size chip. 4500 → \"4.5k\",\n * 12000 → \"12k\", 1_500_000 → \"1.5M\". Keeps the chip from blowing out the\n * status line when a tool dumps a megabyte of output. */\nexport function fmtTok(n: number): string {\n if (!Number.isFinite(n) || n <= 0) return '0';\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1000) return `${(n / 1000).toFixed(n >= 10_000 ? 0 : 1)}k`;\n return String(n);\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 /** Real bytes the model received — passed in by the Entry component so\n * read-tool / shell-tool digests can quote the true size instead of the\n * 400-char preview that `output` is capped to. */\n _outputBytes?: number,\n /** Real line count from the agent — preferred over scanning the preview\n * when present, since the preview rarely contains every prefix. */\n outputLines?: number,\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)\n 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 // When the agent supplied a real line count (new path), the size chip\n // beside the tool header already shows lines/bytes/tokens for the FULL\n // body the model received — no need to repeat misleading numbers\n // derived from the 400-char preview.\n if (outputLines !== undefined) return [];\n // Legacy fallback: derive what we can from the preview text. The byte\n // count below is the preview length, NOT what the model received, so\n // mark it as such to avoid confusion.\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 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.\n //\n // Earlier we just grabbed the first non-empty line. That broke\n // catastrophically for tools that return pretty-printed JSON (most\n // notably `delegate`): `JSON.stringify(obj, null, 2)` starts with a\n // bare `{` on line 1, so the preview rendered as `└─ {` and the\n // user couldn't see WHY the subagent finished — defeating the whole\n // point of the chip.\n //\n // New behavior:\n // 1. If the text parses as a JSON object, surface up to GENERIC_KV_KEYS\n // of its most informative keys inline (`ok=false · status=timeout\n // · iterations=12 · error=\"...\"`).\n // 2. Otherwise collapse ALL whitespace into single spaces (no more\n // \"first line only\" trap) and render up to GENERIC_BUDGET chars.\n if (json && typeof json === 'object' && !Array.isArray(json)) {\n const summary = summarizeJsonObject(json as Record<string, unknown>);\n if (summary) return [summary];\n }\n const collapsed = text.replace(/\\s+/g, ' ').trim();\n return [truncMid(collapsed, GENERIC_BUDGET)];\n}\n\nconst GENERIC_BUDGET = 240;\n\n/**\n * Build a one-line \"key=value · key=value …\" preview for a JSON-shaped\n * tool result. Prioritises fields the user cares about: status flags,\n * error/result fields, then everything else by appearance order. Stops\n * once the rendered preview hits the budget.\n */\nfunction summarizeJsonObject(obj: Record<string, unknown>): string | null {\n const keys = Object.keys(obj);\n if (keys.length === 0) return null;\n // Reorder: status-y keys first (so a failure/timeout reads obviously),\n // then narrative fields (result/error/message), then the rest.\n const priority = [\n 'ok',\n 'status',\n 'timedOut',\n 'stopReason',\n 'reason',\n 'error',\n 'message',\n 'result',\n 'summary',\n 'iterations',\n 'toolCalls',\n 'durationMs',\n 'subagentId',\n 'taskId',\n ];\n const ordered = [\n ...priority.filter((k) => keys.includes(k)),\n ...keys.filter((k) => !priority.includes(k)),\n ];\n const parts: string[] = [];\n let used = 0;\n for (const key of ordered) {\n const v = obj[key];\n if (v === undefined || v === null) continue;\n const rendered =\n typeof v === 'string'\n ? `${key}=\"${truncMid(v.replace(/\\s+/g, ' '), 80)}\"`\n : typeof v === 'number' || typeof v === 'boolean'\n ? `${key}=${v}`\n : Array.isArray(v)\n ? `${key}=[${v.length}]`\n : `${key}={…}`;\n if (used + rendered.length > GENERIC_BUDGET) {\n parts.push('…');\n break;\n }\n parts.push(rendered);\n used += rendered.length + 3; // \" · \" separator\n }\n return parts.length > 0 ? parts.join(' · ') : null;\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 oldLine?: number;\n newLine?: number;\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 // Counters advance as we walk through a hunk so each row can carry its\n // line number in the source/target file. Reset whenever we see a new @@.\n let oldLn = 0;\n let newLn = 0;\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 const m = line.match(/^@@\\s+-(\\d+)(?:,\\d+)?\\s+\\+(\\d+)(?:,\\d+)?\\s+@@/);\n if (m) {\n oldLn = Number.parseInt(m[1] ?? '0', 10) || 0;\n newLn = Number.parseInt(m[2] ?? '0', 10) || 0;\n }\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), newLine: newLn });\n newLn++;\n continue;\n }\n if (line.startsWith('-')) {\n all.push({ kind: 'del', text: truncMid(line, 100), oldLine: oldLn });\n oldLn++;\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), oldLine: oldLn, newLine: newLn });\n oldLn++;\n newLn++;\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?.[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 { Box, Text, useInput, useStdin } from 'ink';\nimport type React from 'react';\nimport { useEffect } from 'react';\nimport type { ReactNode } from 'react';\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 home: boolean;\n end: boolean;\n}\n\n// Ink 5.x useInput does not expose home/end as boolean flags even though\n// parseKeypress recognizes them. We subscribe to raw stdin to catch these.\nfunction isHomeEnd(data: string): 'home' | 'end' | null {\n // Common terminal sequences for Home/End.\n // CSI H / CSI F are the most universal; the longer variants are fallbacks.\n if (\n data === '\\x1b[H' ||\n data === '\\x1b[1~' ||\n data === '\\x1bOH' ||\n data === '\\x1b[7~'\n )\n return 'home';\n if (\n data === '\\x1b[F' ||\n data === '\\x1b[4~' ||\n data === '\\x1bOF' ||\n data === '\\x1b[8~'\n )\n return 'end';\n return null;\n}\n\nconst EMPTY_KEY: KeyEvent = {\n upArrow: false,\n downArrow: false,\n leftArrow: false,\n rightArrow: false,\n return: false,\n escape: false,\n ctrl: false,\n meta: false,\n shift: false,\n tab: false,\n backspace: false,\n delete: false,\n pageUp: false,\n pageDown: false,\n home: false,\n end: false,\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 // Catch Home/End that Ink's useInput doesn't surface.\n const { stdin } = useStdin();\n useEffect(() => {\n if (!stdin || disabled) return;\n const handleData = (data: Buffer) => {\n const kind = isHomeEnd(data.toString());\n if (kind === 'home') onKey('', { ...EMPTY_KEY, home: true });\n else if (kind === 'end') onKey('', { ...EMPTY_KEY, end: true });\n };\n stdin.on('data', handleData);\n return () => {\n stdin.off('data', handleData);\n };\n }, [stdin, disabled, onKey]);\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 // Disabled (aborting an iteration) is the only signal that needs a\n // hard visual cue — paint the prompt red. We avoid wrapping the input\n // in a border Box: Ink redraws the live area on every state change,\n // and in non-altScreen mode the previous frame's border is left in\n // the terminal's scrollback. A `> ` prompt + inverse cursor is enough\n // to indicate the input row.\n const promptColor = disabled ? 'red' : 'cyan';\n\n return (\n <Box flexDirection=\"column\">\n {placeholders.map((p, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: placeholders are append-only, index is stable\n <Text key={i} dimColor>\n {' ↳ '}\n {p}\n </Text>\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={promptColor}>{prompt}</Text>\n {before}\n <Text inverse>{at}</Text>\n {after}\n </Text>\n {hint ? <Text dimColor>{hint}</Text> : null}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\nimport type { FleetEntry } from '../app.js';\n\nexport interface LiveActivityStripProps {\n /** Per-subagent state from the FleetEntry table. */\n entries: Record<string, FleetEntry>;\n /** Re-renders every tick so elapsed timers stay live; otherwise the\n * bar freezes between FleetEntry updates (which can be 30s+ apart\n * if a subagent is parked in one tool). */\n nowTick: number;\n /** Optional cap on rows so a 20-subagent fleet doesn't push the\n * input off-screen. Default 4 — matches the status bar's 4th line. */\n maxRows?: number;\n}\n\nfunction fmtElapsed(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n const m = Math.floor(ms / 60_000);\n const s = Math.floor((ms % 60_000) / 1000);\n return `${m}m${s.toString().padStart(2, '0')}s`;\n}\n\nfunction fmtBytes(n: number): string {\n if (n < 1024) return `${n}B`;\n return `${(n / 1024).toFixed(1)}KB`;\n}\n\nfunction fmtRecentTool(tool: FleetEntry['recentTools'][number]): string {\n const status = tool.ok === false ? 'fail' : 'ok';\n const name = tool.name.length > 18 ? `${tool.name.slice(0, 17)}...` : tool.name;\n const parts = [status, name];\n if (typeof tool.durationMs === 'number') parts.push(fmtElapsed(tool.durationMs));\n if (typeof tool.outputBytes === 'number' && tool.outputBytes > 0) parts.push(fmtBytes(tool.outputBytes));\n if (typeof tool.outputLines === 'number' && tool.outputLines > 0) parts.push(`${tool.outputLines}L`);\n return parts.join(' ');\n}\n\nfunction fmtRecentMessage(message: FleetEntry['recentMessages'][number]): string {\n const text = message.text.replace(/\\s+/g, ' ');\n return text.length > 48 ? `${text.slice(0, 47)}...` : text;\n}\n\n/**\n * Compact one-line-per-subagent strip that sits directly above the\n * input area. Shows only RUNNING subagents — completed/failed entries\n * already surfaced as history rows and don't need to crowd the\n * always-visible band.\n *\n * Each row carries: `→ <label> <currentTool?> (elapsed) · <iter>it\n * <tool>tc`. The currentTool segment updates on `tool.started` /\n * `tool.executed` so the user can tell at a glance \"AGENT#1 has been\n * inside `bash` for 12s now\" without grep-tailing the JSONL.\n *\n * Renders nothing when no subagents are running, so the input area\n * sits flush against history during idle / solo work.\n */\nexport function LiveActivityStrip({\n entries,\n nowTick,\n maxRows = 4,\n}: LiveActivityStripProps): React.ReactElement | null {\n const running = Object.values(entries)\n .filter((e) => e.status === 'running')\n // Stable order: oldest-started first, so the strip doesn't shuffle\n // every time a tool starts/ends on one of the rows.\n .sort((a, b) => a.startedAt - b.startedAt)\n .slice(0, maxRows);\n if (running.length === 0) return null;\n\n // Reference nowTick so React knows we depend on it — otherwise the\n // 1s ticker won't re-render the elapsed values.\n void nowTick;\n const now = Date.now();\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n {running.map((e) => {\n const toolElapsed = e.currentTool ? now - e.currentTool.startedAt : 0;\n const taskElapsed = now - e.startedAt;\n const toolSeg = e.currentTool\n ? `→ ${e.currentTool.name} (${fmtElapsed(toolElapsed)})`\n : 'idle between tools';\n const recentTools = (e.recentTools ?? []).slice(-2).map(fmtRecentTool).join(' | ');\n const messageText =\n e.streamingText.trim() || (e.recentMessages ?? []).slice(-1).map(fmtRecentMessage).join('');\n return (\n <Box key={e.id} flexDirection=\"row\" gap={1}>\n <Text color=\"cyan\">●</Text>\n <Text>{e.name.slice(0, 14).padEnd(14)}</Text>\n <Text dimColor>·</Text>\n <Text color={e.currentTool ? 'green' : 'yellow'}>{toolSeg}</Text>\n <Text dimColor>·</Text>\n <Text dimColor>\n {e.iterations}it {e.toolCalls}tc · {fmtElapsed(taskElapsed)}\n </Text>\n {recentTools ? (\n <>\n <Text dimColor>|</Text>\n <Text dimColor>last: {recentTools}</Text>\n </>\n ) : null}\n {messageText ? (\n <>\n <Text dimColor>|</Text>\n <Text dimColor>msg: {fmtRecentMessage({ text: messageText, at: Date.now() })}</Text>\n </>\n ) : null}\n </Box>\n );\n })}\n {Object.values(entries).filter((e) => e.status === 'running').length > maxRows ? (\n <Box paddingLeft={2}>\n <Text dimColor>\n …+{Object.values(entries).filter((e) => e.status === 'running').length - maxRows} more\n </Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\n\nexport interface ProviderOption {\n id: string;\n family: string;\n /** Model ids the picker offers in step 2 for this provider. */\n models: string[];\n /** Optional dim hint shown next to the model list (e.g. \"from saved config\"). */\n modelsLabel?: string;\n}\n\nexport interface ModelPickerProps {\n step: 'provider' | 'model';\n providerOptions: ProviderOption[];\n modelOptions: string[];\n selected: number;\n pickedProviderId?: string;\n /** Status hint (e.g. error from a failed switch attempt) shown at the bottom. */\n hint?: string;\n}\n\n/**\n * Two-step Ink overlay for the TUI's `/model` command.\n * Step 1: pick a provider that has a key.\n * Step 2: pick a model bound to that provider.\n *\n * Driven entirely by props — App owns the cursor state and key events.\n * Render is intentionally compact; the host frames it in a single Box.\n */\nexport function ModelPicker({\n step,\n providerOptions,\n modelOptions,\n selected,\n pickedProviderId,\n hint,\n}: ModelPickerProps): React.ReactElement {\n if (step === 'provider') {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text color=\"cyan\" bold>\n ━━ Switch model — Step 1/2: Pick provider ━━\n </Text>\n <Text dimColor>↑/↓ navigate · Enter select · Esc cancel · Ctrl+C exit</Text>\n {providerOptions.length === 0 ? (\n <Text dimColor>(no providers with keys — add one via `wstack auth`)</Text>\n ) : (\n providerOptions.map((p, i) => (\n <Text key={p.id} color={i === selected ? 'cyan' : undefined} inverse={i === selected}>\n {i === selected ? '› ' : ' '}\n <Text bold>{p.id.padEnd(28)}</Text>\n <Text dimColor> [{p.family}]</Text>\n <Text dimColor>\n {' '}\n {p.models.length} model{p.models.length === 1 ? '' : 's'}\n </Text>\n </Text>\n ))\n )}\n {hint ? <Text color=\"yellow\">{hint}</Text> : null}\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text color=\"cyan\" bold>\n ━━ Switch model — Step 2/2: Pick model ({pickedProviderId}) ━━\n </Text>\n <Text dimColor>↑/↓ navigate · Enter select · Esc back · Ctrl+C exit</Text>\n {modelOptions.length === 0 ? (\n <Text dimColor>(no models known for this provider)</Text>\n ) : (\n modelOptions.map((id, i) => (\n <Text key={id} color={i === selected ? 'cyan' : undefined} inverse={i === selected}>\n {i === selected ? '› ' : ' '}\n {id}\n </Text>\n ))\n )}\n {hint ? <Text color=\"yellow\">{hint}</Text> : null}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\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 && <Text dimColor>No matching commands</Text>}\n </Box>\n );\n}\n","import type { TokenCounter } from '@wrongstack/core';\nimport { Box, Text } from 'ink';\nimport type React from 'react';\nimport type { GitInfo } from '../git-info.js';\n\nexport interface TodoCounts {\n pending: number;\n inProgress: number;\n completed: number;\n}\n\nexport interface PlanCounts {\n open: number;\n inProgress: number;\n done: number;\n}\n\n/**\n * Fleet activity breakdown surfaced on the work-in-flight line. Derived\n * from `director.status()` in the host app and refreshed alongside the\n * other dynamic chips. Kept optional (and the chip is only rendered\n * when any field is non-zero) so single-agent sessions stay quiet.\n */\nexport interface FleetCounts {\n /** Subagents currently mid-task. */\n running: number;\n /** Subagents spawned but idle (no current task). */\n idle: number;\n /** Tasks queued but not yet picked up by a worker. */\n pending: number;\n /** Tasks resolved (success/failure/timeout/stopped). */\n completed: number;\n}\n\n/**\n * Per-agent detail surfaced on the optional 4th line — one chip per\n * currently-running subagent so the user can see at a glance which\n * agent is doing what, for how long, and how many tools it has called.\n * Truncated to the top N by the host (typically 3-4) to keep the bar\n * from wrapping.\n */\nexport interface FleetAgentDetail {\n /** Stable label used by the streaming history (e.g. \"AGENT#1 bug-hunter\"). */\n label: string;\n /** Ink color name — same palette as the per-agent history prefix. */\n color: string;\n /** Ms since the subagent's first iteration. */\n elapsedMs: number;\n /** Tool calls observed via tool.executed. */\n toolCalls: number;\n /** True when the subagent is actively iterating. */\n running: boolean;\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 /**\n * Plan board counts surfaced as a chip on line 2. Distinct from\n * `todos` — plans are higher-level and persist across resume; the\n * chip uses a different glyph (📋) so the user can tell them apart\n * at a glance.\n */\n plan?: PlanCounts;\n /**\n * Per-status fleet breakdown. When provided, takes precedence over\n * `subagentCount` for chip rendering. `subagentCount` is kept for\n * backwards compatibility when callers haven't wired the richer\n * breakdown yet.\n */\n fleet?: FleetCounts;\n /**\n * Optional per-agent detail row (up to ~4 agents). Renders below the\n * aggregate fleet chip on a dedicated 4th line so the user can see\n * which specific agent is burning time/tools right now without\n * scrolling history.\n */\n fleetAgents?: FleetAgentDetail[];\n git?: GitInfo | null;\n subagentCount?: number;\n /** Renders the \"ctx ████░░ 42%\" chip on line 1 when present. */\n context?: ContextWindow;\n /**\n * Project / working-folder name. Rendered on line 2 just before the git\n * branch so users running multiple WrongStack windows can tell at a\n * glance which repo each one is pinned to. Usually the basename of\n * `agent.ctx.projectRoot`.\n */\n projectName?: string;\n /** Autonomy mode chip: 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel'. */\n autonomy?: 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel';\n /** Number of tracked bash/exec processes from the process registry. */\n processCount?: number;\n /** Items to hide from the status bar. */\n hiddenItems?: Array<'todos' | 'plan' | 'fleet' | 'git' | 'elapsed' | 'context' | 'cost'>;\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 autonomy,\n elapsedMs,\n todos,\n plan,\n fleet,\n fleetAgents,\n git,\n subagentCount = 0,\n context,\n projectName,\n processCount,\n hiddenItems,\n}: StatusBarProps): React.ReactElement {\n const hiddenSet = new Set(hiddenItems);\n const usage = tokenCounter?.total();\n const cost = tokenCounter?.estimateCost();\n const cache = tokenCounter?.cacheStats();\n const stateColor = state === 'idle' ? 'cyan' : state === 'aborting' ? 'yellow' : 'green';\n const stateLabel = state === 'idle' ? 'idle' : state === 'aborting' ? 'aborting…' : 'thinking…';\n\n // Line 2 is *session context* — slow-moving facts about where you\n // are: the project, the branch, the elapsed clock, YOLO chip. These\n // change at most once per session.\n const hasSecondLine =\n yolo ||\n (autonomy && autonomy !== 'off') ||\n elapsedMs !== undefined ||\n (git !== null && git !== undefined) ||\n (projectName !== undefined && projectName.length > 0);\n\n // Line 3 is *active work* — the dynamic chips that mutate as the\n // agent / subagents make progress. Hidden when nothing is in flight\n // so a fresh session keeps the two-line baseline.\n const fleetHasActivity =\n (fleet &&\n (fleet.running > 0 || fleet.idle > 0 || fleet.pending > 0 || fleet.completed > 0)) ||\n subagentCount > 0;\n const hasThirdLine =\n (todos && (todos.pending > 0 || todos.inProgress > 0 || todos.completed > 0)) ||\n (plan && (plan.open > 0 || plan.inProgress > 0 || plan.done > 0)) ||\n fleetHasActivity;\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 ↑{' '}\n <Text color=\"cyan\">\n {fmtTok(usage.input + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0))}\n </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 {typeof processCount === 'number' && processCount > 0 ? (\n <>\n <Text dimColor>│</Text>\n <Text color=\"red\">⚡ {processCount} process{processCount === 1 ? '' : 'es'}</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 {autonomy && autonomy !== 'off' ? (\n <>\n {yolo ? <Text dimColor>│</Text> : null}\n <Text\n color={\n autonomy === 'eternal' ? 'red' : autonomy === 'auto' ? 'yellow' : 'cyan'\n }\n bold\n >\n ∞ {autonomy.toUpperCase()}\n </Text>\n </>\n ) : null}\n {elapsedMs !== undefined && !hiddenSet.has('elapsed') ? (\n <>\n {yolo ? <Text dimColor>│</Text> : null}\n <Text dimColor>⏱ {fmtElapsed(elapsedMs)}</Text>\n </>\n ) : null}\n {projectName ? (\n <>\n {yolo || elapsedMs !== undefined ? <Text dimColor>│</Text> : null}\n <Text color=\"blue\">📁 {projectName}</Text>\n </>\n ) : null}\n {git ? (\n <>\n {yolo || elapsedMs !== undefined || projectName ? <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 </Box>\n ) : null}\n\n {hasThirdLine ? (\n <Box flexDirection=\"row\" gap={2}>\n {todos && (todos.pending > 0 || todos.inProgress > 0 || todos.completed > 0) ? (\n <Text>\n <Text dimColor>todos </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 ) : null}\n {plan && (plan.open > 0 || plan.inProgress > 0 || plan.done > 0) ? (\n <>\n {todos && (todos.pending > 0 || todos.inProgress > 0 || todos.completed > 0) ? (\n <Text dimColor>│</Text>\n ) : null}\n <Text>\n <Text color=\"cyan\">📋 </Text>\n {plan.inProgress > 0 ? <Text color=\"yellow\">⌛{plan.inProgress}</Text> : null}\n {plan.inProgress > 0 && (plan.open > 0 || plan.done > 0) ? ' ' : ''}\n {plan.open > 0 ? <Text dimColor>☐{plan.open}</Text> : null}\n {plan.open > 0 && plan.done > 0 ? ' ' : ''}\n {plan.done > 0 ? <Text color=\"green\">✓{plan.done}</Text> : null}\n </Text>\n </>\n ) : null}\n {fleetHasActivity ? (\n <>\n {((todos && (todos.pending > 0 || todos.inProgress > 0 || todos.completed > 0)) ||\n (plan && (plan.open > 0 || plan.inProgress > 0 || plan.done > 0))) ? (\n <Text dimColor>│</Text>\n ) : null}\n {fleet ? (\n <Text>\n <Text color=\"blue\">🌐 </Text>\n {fleet.running > 0 ? <Text color=\"yellow\">▶{fleet.running}</Text> : null}\n {fleet.running > 0 && (fleet.pending > 0 || fleet.idle > 0 || fleet.completed > 0)\n ? ' '\n : ''}\n {fleet.pending > 0 ? <Text dimColor>☐{fleet.pending}</Text> : null}\n {fleet.pending > 0 && (fleet.idle > 0 || fleet.completed > 0) ? ' ' : ''}\n {fleet.idle > 0 ? <Text dimColor>·{fleet.idle}idle</Text> : null}\n {fleet.idle > 0 && fleet.completed > 0 ? ' ' : ''}\n {fleet.completed > 0 ? <Text color=\"green\">✓{fleet.completed}</Text> : null}\n </Text>\n ) : (\n <Text color=\"blue\">\n 🌐 {subagentCount} agent{subagentCount === 1 ? '' : 's'}\n </Text>\n )}\n </>\n ) : null}\n </Box>\n ) : null}\n\n {fleetAgents && fleetAgents.length > 0 ? (\n <Box flexDirection=\"row\" gap={2}>\n {fleetAgents.map((a, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: agent list is stable per render\n <Text key={i}>\n <Text color={a.color} bold>\n {a.label}\n </Text>\n <Text dimColor>{' '}</Text>\n <Text color={a.running ? 'yellow' : undefined} dimColor={!a.running}>\n {a.running ? '▶' : '·'}\n </Text>\n <Text dimColor>{' '}</Text>\n <Text dimColor>{fmtElapsed(a.elapsedMs)}</Text>\n <Text dimColor>{' · '}</Text>\n <Text dimColor>{a.toolCalls}t</Text>\n </Text>\n ))}\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 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\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 type { Dirent } from 'node:fs';\nimport * as fs from 'node:fs/promises';\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 { buildChildEnv } from '@wrongstack/core';\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 env: buildChildEnv(),\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 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)\n 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 type { SlashCommand } from '@wrongstack/core';\nimport { getProcessRegistry } from '@wrongstack/tools';\n\nconst USAGE =\n 'Usage:\\n' +\n ' /kill — list active processes + breaker state\\n' +\n ' /kill list — same as /kill\\n' +\n ' /kill all — kill all tracked processes (SIGTERM → SIGKILL)\\n' +\n ' /kill force — kill all with SIGKILL immediately\\n' +\n ' /kill reset — reset the circuit breaker to closed\\n' +\n ' /kill <pid> — kill a specific process by PID';\n\nexport function createKillSlashCommand(): SlashCommand {\n return {\n name: 'kill',\n description: 'List or kill active bash/exec processes managed by the process registry.',\n async run(args) {\n const trimmed = args.trim();\n const parts = trimmed.split(/\\s+/);\n const sub = parts[0]?.toLowerCase() ?? '';\n\n if (sub === '' || sub === 'list') {\n return { message: renderList() };\n }\n\n if (sub === 'all') {\n const pids = getProcessRegistry().killAll();\n if (pids.length === 0) return { message: 'No processes to kill.' };\n return { message: `Killed ${pids.length} process${pids.length === 1 ? '' : 'es'}: ${pids.join(', ')}` };\n }\n\n if (sub === 'force') {\n getProcessRegistry().forceBreakerOpen();\n const pids = getProcessRegistry().killAll({ force: true });\n if (pids.length === 0) return { message: 'Circuit breaker forced open. No processes to kill.' };\n return { message: `Force-killed ${pids.length} process${pids.length === 1 ? '' : 'es'}: ${pids.join(', ')}` };\n }\n\n if (sub === 'reset') {\n getProcessRegistry().forceBreakerReset();\n return { message: 'Circuit breaker reset to closed. Bash/exec calls allowed.' };\n }\n\n const pid = Number.parseInt(sub, 10);\n if (!Number.isNaN(pid) && pid > 0) {\n const found = getProcessRegistry().kill(pid);\n if (found) return { message: `Killed process ${pid}.` };\n return { message: `Process ${pid} not found in registry.` };\n }\n\n return { message: `Unknown subcommand \"${sub}\".\\n${USAGE}` };\n },\n };\n}\n\nfunction renderList(): string {\n const registry = getProcessRegistry();\n const stats = registry.stats();\n const all = registry.list();\n\n const breaker = stats.breaker;\n const stateLabel =\n breaker.state === 'closed'\n ? '🟢 closed'\n : breaker.state === 'half-open'\n ? '🟡 half-open'\n : `🔴 open (cooldown ${breaker.cooldownRemainingMs !== null ? `${(breaker.cooldownRemainingMs / 1000).toFixed(0)}s` : '—'})`;\n\n const breakerLine = [\n ` Circuit breaker: ${stateLabel}`,\n ` consecutive failures: ${breaker.consecutiveFailures}/5`,\n ` slow calls in window: ${breaker.slowCallsInWindow}/3`,\n ` calls in window: ${breaker.callsInWindow}/30`,\n ].join('\\n');\n\n if (all.length === 0) {\n return `No active processes.\\n\\n${breakerLine}`;\n }\n\n const now = Date.now();\n const lines: string[] = [`Active processes (${all.length}):`];\n for (const p of all) {\n const age = ((now - p.startedAt) / 1000).toFixed(1);\n const killedTag = p.killed ? ' [killed]' : '';\n const cmd = p.command.length > 80 ? p.command.slice(0, 77) + '…' : p.command;\n lines.push(` ${p.pid} ${p.name} ${age}s ${cmd}${killedTag}`);\n }\n return [...lines, '', breakerLine].join('\\n');\n}","import type { SlashCommand } from '@wrongstack/core';\nimport { getProcessRegistry } from '@wrongstack/tools';\n\n/**\n * `/ps` — pure process list, no side effects.\n * `/kill` handles listing AND killing.\n */\nexport function createPsSlashCommand(): SlashCommand {\n return {\n name: 'ps',\n description: 'List all active bash/exec processes tracked by the process registry.',\n async run(_args) {\n return { message: renderList() };\n },\n };\n}\n\nfunction renderList(): string {\n const registry = getProcessRegistry();\n const stats = registry.stats();\n const all = registry.list();\n if (all.length === 0) return 'No active processes.';\n\n const breaker = stats.breaker;\n const stateLabel =\n breaker.state === 'closed'\n ? '🟢 closed'\n : breaker.state === 'half-open'\n ? '🟡 half-open'\n : `🔴 open`;\n\n const now = Date.now();\n const lines: string[] = [\n `Active processes (${all.length}) — breaker ${stateLabel}`,\n ` failure=${breaker.consecutiveFailures}/5 slow=${breaker.slowCallsInWindow}/3 rate=${breaker.callsInWindow}/30`,\n '',\n ];\n for (const p of all) {\n const age = ((now - p.startedAt) / 1000).toFixed(1);\n const killedTag = p.killed ? ' [killed]' : '';\n const cmd = p.command.length > 80 ? p.command.slice(0, 77) + '…' : p.command;\n lines.push(` ${p.pid} ${p.name} ${age}s ${cmd}${killedTag}`);\n }\n return lines.join('\\n');\n}","import * as fs from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport type {\r\n Agent,\r\n AttachmentStore,\r\n ContentBlock,\r\n Director,\r\n EventBus,\r\n FleetEvent,\r\n QueueStore,\r\n SlashCommandRegistry,\r\n TokenCounter,\r\n} from '@wrongstack/core';\r\nimport { DefaultSessionRewinder } from '@wrongstack/core';\r\nimport { InputBuilder, buildGoalPreamble, formatTodosList } from '@wrongstack/core';\r\nimport { type VisionAdapters, routeImagesForModel } from '@wrongstack/runtime/vision';\r\nimport { getProcessRegistry } from '@wrongstack/tools';\r\nimport { Box, useApp } from 'ink';\r\nimport React, { useEffect, useMemo, useReducer, useRef, useState } from 'react';\r\nimport { readClipboardImage } from './clipboard.js';\r\nimport { ConfirmPrompt } from './components/confirm-prompt.js';\r\nimport { CheckpointTimeline } from './components/checkpoint-timeline.js';\r\nimport { FilePicker } from './components/file-picker.js';\r\nimport { FleetPanel } from './components/fleet-panel.js';\r\nimport { History, type HistoryEntry } from './components/history.js';\r\nimport { Input, type KeyEvent } from './components/input.js';\r\nimport { LiveActivityStrip } from './components/live-activity-strip.js';\r\nimport { ModelPicker, type ProviderOption } from './components/model-picker.js';\r\nimport { SlashMenu } from './components/slash-menu.js';\r\nimport { StatusBar } from './components/status-bar.js';\r\nimport { searchFiles } from './file-search.js';\r\nimport { type GitInfo, readGitInfo } from './git-info.js';\r\nimport { createQueueSlashCommand } from './queue-slash.js';\r\nimport { createKillSlashCommand } from './kill-slash.js';\r\nimport { createPsSlashCommand } from './ps-slash.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/** Per-subagent state tracked live from the FleetBus. */\r\nexport interface FleetEntry {\r\n id: string;\r\n name: string;\r\n provider?: string;\r\n model?: string;\r\n status: 'idle' | 'running' | 'success' | 'failed' | 'timeout' | 'stopped';\r\n streamingText: string;\r\n iterations: number;\r\n toolCalls: number;\r\n recentTools: Array<{\r\n name: string;\r\n ok?: boolean;\r\n durationMs?: number;\r\n outputBytes?: number;\r\n outputLines?: number;\r\n at: number;\r\n }>;\r\n recentMessages: Array<{ text: string; at: number }>;\r\n cost: number;\r\n startedAt: number;\r\n lastEventAt: number;\r\n /**\r\n * Tool the subagent is currently inside, set on `tool.started` and\r\n * cleared on `tool.executed`. Lets the FleetPanel render \"running →\r\n * bash\" instead of an opaque \"running\". Undefined when no tool is\r\n * mid-flight (between iterations, before the first tool, or after\r\n * the last tool of a run).\r\n */\r\n currentTool?: { name: string; startedAt: number };\r\n /**\r\n * Absolute path to the per-subagent JSONL transcript on disk, when\r\n * one was created. Surfaced so the FleetPanel can render `path:`\r\n * dim under the entry — users grep / tail the file for full\r\n * visibility into the subagent's run.\r\n */\r\n transcriptPath?: string;\r\n /**\r\n * Most recent budget warning: subagent hit a soft limit and the\r\n * coordinator is auto-extending. Rendered in FleetPanel as:\r\n * \"⚡ hitting tool_calls limit (350/400) — extending\"\r\n * Cleared on the next fleetDone or fleetStart.\r\n */\r\n budgetWarning?: { kind: string; used: number; limit: number; at: number };\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 function selectedSlashCommandLine(picker: {\r\n open: boolean;\r\n matches: SlashCommandMatch[];\r\n selected: number;\r\n}): string | null {\r\n if (!picker.open || picker.matches.length === 0) return null;\r\n const picked = picker.matches[picker.selected];\r\n return picked ? `/${picked.name}` : null;\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 visionAdapters?: VisionAdapters;\r\n /** Resolve current model vision support. Falls back to provider capability when omitted. */\r\n supportsVision?: () => boolean | Promise<boolean>;\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 /**\r\n * Query the live YOLO state from the permission policy. Called after\r\n * every slash-command dispatch so `/yolo off` (which mutates the\r\n * policy inside the CLI) is immediately reflected in the status bar.\r\n * Mirrors the `agent.ctx.model` → `setLiveModel` pattern used for\r\n * provider/model sync.\r\n */\r\n getYolo?: () => boolean;\r\n /** Query the live autonomy mode. */\r\n getAutonomy?: () => 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel';\r\n /**\r\n * Access the eternal-autonomy engine. When autonomy mode goes to\r\n * 'eternal' the TUI drives `runOneIteration()` from a post-slash hook\r\n * so the engine and TUI never race for the shared Context.\r\n */\r\n getEternalEngine?: () => import('@wrongstack/core').EternalAutonomyEngine | null;\r\n /**\r\n * Access the parallel-eternal engine. When autonomy mode goes to\r\n * 'eternal-parallel' the TUI drives `runOneIteration()` from a post-slash\r\n * hook so the engine and TUI never race for the shared Context.\r\n */\r\n getParallelEngine?: () => import('@wrongstack/core').ParallelEternalEngine | null;\r\n /**\r\n * Subscribe to live per-iteration events from the eternal engine. The\r\n * TUI installs this on mount to render each iteration as a timeline\r\n * entry the moment it lands — strictly more responsive than reading\r\n * goal.json after the fact.\r\n */\r\n subscribeEternalIteration?: (\r\n fn: (entry: import('@wrongstack/core').JournalEntry) => void,\r\n ) => () => void;\r\n /**\r\n * SDD session context getter. When an SDD session is active, returns\r\n * the AI prompt context to inject into user messages so the model\r\n * knows it's in a spec-building conversation.\r\n */\r\n getSDDContext?: () => string | null;\r\n /**\r\n * Process AI output for SDD auto-detection (spec, tasks, plan).\r\n * Called after every agent.run() completes. Returns displayable\r\n * status messages (e.g. \"✓ Spec detected and saved!\").\r\n */\r\n onSDDOutput?: (output: string) => Promise<string[]>;\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 /** Called when /clear is dispatched — the TUI should wipe its history entries (but keep the banner). */\r\n onClearHistory?: (\r\n dispatch: React.Dispatch<{ type: 'clearHistory' } | { type: 'resetContextChip' }>,\r\n ) => void;\r\n\r\n /**\r\n * Goal text passed from `--goal \"...\"` on the command line. When set,\r\n * the App mounts, renders the banner, then automatically dispatches\r\n * a synthetic `/goal <text>` so the user lands in goal mode without\r\n * having to type the slash command. Mutually advisory with `initialSteer`\r\n * — `initialGoal` wins if both are present.\r\n */\r\n initialGoal?: string;\r\n /**\r\n * Initial user message passed from `--ask \"...\"` on the command line.\r\n * Submitted verbatim as the first turn (no preamble) so users can\r\n * launch the TUI and pre-populate one turn from a shell alias / script.\r\n */\r\n initialAsk?: string;\r\n /** Directory for session JSONL files. Passed to App for /rewind. */\r\n sessionsDir?: string;\r\n\r\n // --- Fleet ---\r\n /** Live director for fleet panel rendering. Null when director mode is off. */\r\n director: Director | null;\r\n /** Optional roster for human-readable subagent names. */\r\n fleetRoster?: Record<string, { name: string }>;\r\n /**\r\n * Shared controller for the `/fleet stream on|off` slash command. The\r\n * App installs a dispatch-backed setter on mount so the slash command\r\n * can flip the reducer's `streamFleet` flag from the CLI surface.\r\n */\r\n fleetStreamController?: {\r\n enabled: boolean;\r\n setEnabled: (enabled: boolean) => void;\r\n };\r\n /**\r\n * Controller for status bar hidden items. App installs a dispatch-backed\r\n * setter on mount so the /statusline slash command can update the TUI's\r\n * visible bar without a round-trip. The initial value is loaded from\r\n * the config file before App mounts.\r\n */\r\n statuslineHiddenItems: Array<'todos' | 'plan' | 'fleet' | 'git' | 'elapsed' | 'context' | 'cost'>;\r\n setStatuslineHiddenItems: (items: Array<'todos' | 'plan' | 'fleet' | 'git' | 'elapsed' | 'context' | 'cost'>) => 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; startedAt: number } | null;\r\n status: 'idle' | 'running' | 'streaming' | 'aborting';\r\n interrupts: number;\r\n /**\r\n * Set when the user pressed Esc mid-iteration to interrupt the agent.\r\n * The NEXT submitted user message gets a STEERING prefix block prepended\r\n * so the model sees \"I interrupted you on purpose — focus on this\r\n * instead of resuming the prior task\". Cleared once that message\r\n * lands. Distinct from `interrupts` (which is the Ctrl+C exit ladder).\r\n */\r\n steeringPending: boolean;\r\n /**\r\n * Context snapshot captured at Esc time, replayed into the STEERING\r\n * preamble so the model sees exactly what it was mid-doing when the\r\n * user pulled the cord. Cleared together with `steeringPending`.\r\n * Without this the model has to guess from chat scrollback which\r\n * tools were live — and it can't see subagent state at all.\r\n */\r\n steerSnapshot: {\r\n runningTools: string[];\r\n subagents: Array<{ label: string; status: string; tool?: string }>;\r\n subagentsTerminated: number;\r\n partialAssistantText: string;\r\n } | null;\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 confirmations — queue to handle multiple tools requesting confirmation. */\r\n confirmQueue: {\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 }[];\r\n /** Incremented on /clear so the context chip re-reads from agent.ctx tokens. */\r\n contextChipVersion: number;\r\n /** Live fleet state: per-subagent entries from FleetBus events. Keyed by subagentId. */\r\n fleet: Record<string, FleetEntry>;\r\n /** Fleet-wide accumulated cost. */\r\n fleetCost: number;\r\n /**\r\n * When true, subagent text activity is\r\n * streamed into the main history with an `AGENT#N` prefix. Toggled\r\n * with `/fleet stream on|off`. Tool calls stay in the live fleet\r\n * surfaces so chat history remains readable during multi-agent runs.\r\n */\r\n streamFleet: boolean;\r\n /** Session checkpoints recorded by SessionWriter.writeCheckpoint() events. */\r\n checkpoints: Array<{\r\n promptIndex: number;\r\n promptPreview: string;\r\n ts: string;\r\n fileCount: number;\r\n }>;\r\n /** Checkpoint timeline overlay — null when closed. */\r\n rewindOverlay: { checkpoints: Array<{\r\n promptIndex: number;\r\n promptPreview: string;\r\n ts: string;\r\n fileCount: number;\r\n }>; selected: number } | 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: 'removeLastPlaceholder' }\r\n | { type: 'clearInput' }\r\n | { type: 'clearHistory' }\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 /**\r\n * User pressed Esc mid-iteration — flag the next message for steering\r\n * AND stash a context snapshot so the preamble can tell the model\r\n * exactly what it was doing.\r\n */\r\n | { type: 'steerStart'; snapshot: State['steerSnapshot'] }\r\n /** Submit handler consumed the steering flag; reset. */\r\n | { type: 'steerConsume' }\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; startedAt: number }\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['confirmQueue'][0] }\r\n | { type: 'confirmClose' }\r\n | { type: 'resetContextChip' }\r\n // Fleet actions\r\n | { type: 'fleetSeed'; entries: FleetEntry[]; cost: number }\r\n | {\r\n type: 'fleetSpawn';\r\n id: string;\r\n name?: string;\r\n provider?: string;\r\n model?: string;\r\n transcriptPath?: string;\r\n }\r\n | { type: 'fleetStart'; id: string; taskId?: string }\r\n | { type: 'fleetDelta'; id: string; text: string }\r\n | { type: 'fleetMessage'; id: string; text: string }\r\n | {\r\n type: 'fleetTool';\r\n id: string;\r\n name?: string;\r\n ok?: boolean;\r\n durationMs?: number;\r\n outputBytes?: number;\r\n outputLines?: number;\r\n }\r\n /** tool.started: pin the current tool name for status display. */\r\n | { type: 'fleetToolStart'; id: string; name: string }\r\n /** tool.executed: clear the current tool (paired with fleetTool). */\r\n | { type: 'fleetToolEnd'; id: string }\r\n | {\r\n type: 'fleetUsage';\r\n id: string;\r\n input: number;\r\n output: number;\r\n cacheRead: number;\r\n cacheWrite: number;\r\n }\r\n | {\r\n type: 'fleetDone';\r\n id: string;\r\n status: FleetEntry['status'];\r\n iterations: number;\r\n toolCalls: number;\r\n }\r\n | {\r\n type: 'fleetBudgetWarning';\r\n id: string;\r\n kind: string;\r\n used: number;\r\n limit: number;\r\n }\r\n | { type: 'fleetCost'; cost: number }\r\n | { type: 'setStreamFleet'; enabled: boolean }\r\n | { type: 'checkpointReceived'; cp: State['checkpoints'][0] }\r\n | { type: 'rewindOverlayOpen' }\r\n | { type: 'rewindOverlayClose' }\r\n | { type: 'rewindOverlayMove'; delta: number }\r\n | { type: 'sessionRewound'; toPromptIndex: number };\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 = [...state.entries, { ...action.entry, id: state.nextId } as HistoryEntry];\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 'removeLastPlaceholder':\r\n if (state.placeholders.length === 0) return state;\r\n return { ...state, placeholders: state.placeholders.slice(0, -1) };\r\n case 'clearInput':\r\n return {\r\n ...state,\r\n buffer: '',\r\n cursor: 0,\r\n placeholders: [],\r\n historyIndex: 0,\r\n picker: { open: false, query: '', matches: [], selected: 0 },\r\n slashPicker: { open: false, query: '', matches: [], selected: 0 },\r\n };\r\n case 'clearHistory': {\r\n const last = state.entries[state.entries.length - 1];\r\n return {\r\n ...state,\r\n entries: last ? [last] : state.entries,\r\n queue: [],\r\n nextQueueId: 1,\r\n };\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 'steerStart':\r\n return { ...state, steeringPending: true, steerSnapshot: action.snapshot };\r\n case 'steerConsume':\r\n return { ...state, steeringPending: false, steerSnapshot: null };\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: {\r\n toolUseId: action.toolUseId,\r\n name: action.name,\r\n text: action.text,\r\n startedAt: action.startedAt,\r\n },\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)\r\n 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, confirmQueue: [...state.confirmQueue, action.info] };\r\n case 'confirmClose':\r\n return { ...state, confirmQueue: state.confirmQueue.slice(1) };\r\n case 'resetContextChip':\r\n return { ...state, contextChipVersion: state.contextChipVersion + 1 };\r\n // --- Fleet ---\r\n case 'fleetSeed': {\r\n const seeded: Record<string, FleetEntry> = {};\r\n for (const e of action.entries) {\r\n seeded[e.id] = {\r\n ...e,\r\n recentTools: e.recentTools ?? [],\r\n recentMessages: e.recentMessages ?? [],\r\n };\r\n }\r\n return { ...state, fleet: seeded, fleetCost: action.cost };\r\n }\r\n case 'fleetSpawn': {\r\n if (state.fleet[action.id]) return state;\r\n const entry: FleetEntry = {\r\n id: action.id,\r\n name: action.name ?? action.id.slice(0, 8),\r\n provider: action.provider,\r\n model: action.model,\r\n status: 'idle',\r\n streamingText: '',\r\n iterations: 0,\r\n toolCalls: 0,\r\n recentTools: [],\r\n recentMessages: [],\r\n cost: 0,\r\n startedAt: Date.now(),\r\n lastEventAt: Date.now(),\r\n transcriptPath: action.transcriptPath,\r\n };\r\n return { ...state, fleet: { ...state.fleet, [action.id]: entry } };\r\n }\r\n case 'fleetToolStart': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: {\r\n ...cur,\r\n currentTool: { name: action.name, startedAt: Date.now() },\r\n lastEventAt: Date.now(),\r\n },\r\n },\r\n };\r\n }\r\n case 'fleetToolEnd': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: { ...cur, currentTool: undefined, lastEventAt: Date.now() },\r\n },\r\n };\r\n }\r\n case 'fleetStart': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: {\r\n ...cur,\r\n status: 'running' as const,\r\n streamingText: '',\r\n budgetWarning: undefined, // clear on restart\r\n startedAt: Date.now(),\r\n },\r\n },\r\n };\r\n }\r\n case 'fleetDelta': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n // Keep only the last ~200 chars for display\r\n const appended = (cur.streamingText + action.text).slice(-200);\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: { ...cur, streamingText: appended, lastEventAt: Date.now() },\r\n },\r\n };\r\n }\r\n case 'fleetMessage': {\r\n const cur = state.fleet[action.id];\r\n const text = action.text.trim().replace(/\\s+/g, ' ');\r\n if (!cur || !text) return state;\r\n const now = Date.now();\r\n const recentMessages = [...(cur.recentMessages ?? []), { text, at: now }].slice(-2);\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: { ...cur, recentMessages, lastEventAt: now },\r\n },\r\n };\r\n }\r\n case 'fleetTool': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n const now = Date.now();\r\n const recentTools =\r\n action.name !== undefined\r\n ? [\r\n ...(cur.recentTools ?? []),\r\n {\r\n name: action.name,\r\n ok: action.ok,\r\n durationMs: action.durationMs,\r\n outputBytes: action.outputBytes,\r\n outputLines: action.outputLines,\r\n at: now,\r\n },\r\n ].slice(-2)\r\n : (cur.recentTools ?? []);\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: {\r\n ...cur,\r\n toolCalls: cur.toolCalls + 1,\r\n recentTools,\r\n lastEventAt: now,\r\n },\r\n },\r\n };\r\n }\r\n case 'fleetUsage': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n // Compute cost delta from raw token counts using a simplified pricing\r\n // model. The actual per-model pricing is applied by FleetUsageAggregator;\r\n // here we approximate as a live display hint.\r\n const cost = cur.cost;\r\n return {\r\n ...state,\r\n fleet: { ...state.fleet, [action.id]: { ...cur, cost, lastEventAt: Date.now() } },\r\n };\r\n }\r\n case 'fleetDone': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: {\r\n ...cur,\r\n status: action.status,\r\n iterations: action.iterations,\r\n toolCalls: action.toolCalls,\r\n streamingText: '',\r\n currentTool: undefined,\r\n budgetWarning: undefined, // clear on done/restart\r\n lastEventAt: Date.now(),\r\n },\r\n },\r\n };\r\n }\r\n case 'fleetBudgetWarning': {\r\n const cur = state.fleet[action.id];\r\n if (!cur) return state;\r\n return {\r\n ...state,\r\n fleet: {\r\n ...state.fleet,\r\n [action.id]: {\r\n ...cur,\r\n budgetWarning: { kind: action.kind, used: action.used, limit: action.limit, at: Date.now() },\r\n lastEventAt: Date.now(),\r\n },\r\n },\r\n };\r\n }\r\n case 'fleetCost': {\r\n return { ...state, fleetCost: action.cost };\r\n }\r\n case 'setStreamFleet': {\r\n return { ...state, streamFleet: action.enabled };\r\n }\r\n case 'checkpointReceived': {\r\n const existing = state.checkpoints.find((c) => c.promptIndex === action.cp.promptIndex);\r\n if (existing) return state;\r\n return { ...state, checkpoints: [...state.checkpoints, action.cp] };\r\n }\r\n case 'rewindOverlayOpen': {\r\n return {\r\n ...state,\r\n rewindOverlay: { checkpoints: state.checkpoints, selected: state.checkpoints.length - 1 },\r\n };\r\n }\r\n case 'rewindOverlayClose': {\r\n return { ...state, rewindOverlay: null };\r\n }\r\n case 'rewindOverlayMove': {\r\n if (!state.rewindOverlay) return state;\r\n const len = state.rewindOverlay.checkpoints.length;\r\n if (len === 0) return { ...state, rewindOverlay: null };\r\n const selected = Math.max(0, Math.min(len - 1, state.rewindOverlay.selected + action.delta));\r\n return { ...state, rewindOverlay: { ...state.rewindOverlay, selected } };\r\n }\r\n case 'sessionRewound': {\r\n return {\r\n ...state,\r\n checkpoints: state.checkpoints.filter((c) => c.promptIndex <= action.toPromptIndex),\r\n rewindOverlay: null,\r\n };\r\n }\r\n }\r\n}\r\n\r\nconst PASTE_THRESHOLD_CHARS = 200;\r\n\r\n/**\r\n * Build the steering preamble that gets prepended to a user's message\r\n * after they pressed Esc to interrupt the agent. The preamble carries\r\n * three things the model would otherwise have to infer:\r\n *\r\n * 1. Context — exactly what was in flight (tool calls, subagents,\r\n * partial assistant text). Without this the model rationalizes\r\n * from chat scrollback and often resumes the prior task by\r\n * accident.\r\n * 2. Authority — a short, explicit list of what the model is\r\n * allowed to do (abandon the prior plan, respawn fresh\r\n * subagents, ask for clarification). Models hedge unless they\r\n * believe they have permission to pivot hard.\r\n * 3. New direction — the user's actual instruction, fenced off.\r\n *\r\n * The block is user-role plain text. We deliberately don't use a\r\n * system role here — the human triggered this, so accountability\r\n * stays with their turn and the model can challenge / clarify\r\n * without violating role separation.\r\n *\r\n * Exported for the steering test that pins the contract.\r\n */\r\nexport function buildSteeringPreamble(\r\n snapshot: State['steerSnapshot'],\r\n newDirection: string,\r\n): string {\r\n const lines: string[] = ['[STEERING — I pressed Esc to interrupt you mid-task on purpose.', ''];\r\n\r\n // Section 1: what was running. Even an empty list is useful —\r\n // tells the model \"you weren't doing much yet, no work to mourn\".\r\n const ctx: string[] = [];\r\n if (snapshot?.runningTools && snapshot.runningTools.length > 0) {\r\n ctx.push(`- in-flight tools (now cancelled): ${snapshot.runningTools.join(', ')}`);\r\n }\r\n if (snapshot?.subagentsTerminated && snapshot.subagentsTerminated > 0) {\r\n const subDetails = snapshot.subagents\r\n .map((s) => `${s.label}${s.tool ? ` (was running: ${s.tool})` : ''}`)\r\n .join(', ');\r\n ctx.push(\r\n `- subagents (${snapshot.subagentsTerminated} terminated by me, do NOT await them): ${subDetails}`,\r\n );\r\n }\r\n if (snapshot?.partialAssistantText && snapshot.partialAssistantText.trim().length > 0) {\r\n const tail = snapshot.partialAssistantText.trim().slice(-300);\r\n ctx.push(`- your last partial output (truncated, for context only): \"${tail}\"`);\r\n }\r\n if (ctx.length > 0) {\r\n lines.push('What was happening when I cut you off:');\r\n lines.push(...ctx);\r\n lines.push('');\r\n }\r\n\r\n // Section 2: authority. Explicit grant so the model doesn't hedge.\r\n lines.push('You have authority to:');\r\n lines.push('- Abandon the prior plan entirely if the new direction makes it stale.');\r\n lines.push('- Re-spawn fresh subagents (with different roles or tasks) if needed.');\r\n lines.push('- Skip a polite \"should I continue?\" — just pivot.');\r\n lines.push('- Ask me to clarify if the new direction is genuinely ambiguous.');\r\n lines.push('');\r\n\r\n // Section 3: the user's instruction, fenced so the model can't\r\n // mistake it for part of the preamble.\r\n lines.push('New direction:');\r\n lines.push('---');\r\n lines.push(newDirection);\r\n lines.push('---');\r\n lines.push(']');\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n// `buildGoalPreamble` was relocated to @wrongstack/core so headless and\r\n// WebUI callers (which depend on @wrongstack/cli but not @wrongstack/tui)\r\n// can issue `/goal set` without dragging the TUI package in. Re-exported\r\n// from this module for backward compatibility with consumers still\r\n// importing from @wrongstack/tui; also used locally within this file\r\n// where `/goal …` is wired into the chat-input handler.\r\nexport { buildGoalPreamble } from '@wrongstack/core';\r\n\r\nexport function App({\r\n agent,\r\n slashRegistry,\r\n attachments,\r\n events,\r\n tokenCounter,\r\n visionAdapters = [],\r\n supportsVision,\r\n model,\r\n banner = true,\r\n queueStore,\r\n yolo = false,\r\n getYolo,\r\n getAutonomy,\r\n getEternalEngine,\r\n getParallelEngine,\r\n subscribeEternalIteration,\r\n getSDDContext,\r\n onSDDOutput,\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 director,\r\n fleetRoster,\r\n onClearHistory,\r\n fleetStreamController,\r\n statuslineHiddenItems,\r\n setStatuslineHiddenItems,\r\n initialGoal,\r\n initialAsk,\r\n sessionsDir,\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 [yoloLive, setYoloLive] = useState<boolean>(yolo);\r\n const [autonomyLive, setAutonomyLive] = useState<'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel'>(getAutonomy?.() ?? 'off');\r\n const [hiddenItems, setHiddenItems] = useState(statuslineHiddenItems);\r\n\r\n // Sync when parent re-loads from config file (e.g., after /statusline reset)\r\n useEffect(() => {\r\n setHiddenItems(statuslineHiddenItems);\r\n }, [statuslineHiddenItems]);\r\n\r\n // Push local changes back to the parent controller so /statusline sees them\r\n useEffect(() => {\r\n setStatuslineHiddenItems(hiddenItems);\r\n }, [setStatuslineHiddenItems]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\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 steeringPending: false,\r\n steerSnapshot: null,\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 confirmQueue: [],\r\n contextChipVersion: 0,\r\n fleet: {},\r\n fleetCost: 0,\r\n streamFleet: true,\r\n checkpoints: [],\r\n rewindOverlay: 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 // Prevent re-entrant handleKey: some terminals emit \\r\\n as two separate\r\n // stdin events for Enter. While the first event is being processed (submit\r\n // or picker accept), the second arrives with stale state and would trigger\r\n // a duplicate action. The gate blocks the stale-second event entirely.\r\n const inputGateRef = useRef(false);\r\n // Separate guard JUST for the submit path. The full `inputGateRef`\r\n // is held across `await foo()` blocks (picker accept, model picker\r\n // commit) — that's fine because those resolve in milliseconds. But\r\n // `await submit()` resolves only when `agent.run()` finishes, which\r\n // can be minutes for a delegated subagent task. Using the same gate\r\n // would lock ALL keystrokes (typing, backspace, slash menu) for the\r\n // entire agent run. This timestamp-based guard fires for the few\r\n // milliseconds needed to debounce a terminal-side `\\r\\n` double-event\r\n // and then auto-releases — leaving the input live for the user.\r\n const lastEnterAtRef = useRef(0);\r\n const projectRoot = agent.ctx.projectRoot;\r\n // The status-bar chip surfaces the basename so multiple WrongStack\r\n // windows running against different repos are immediately distinguishable.\r\n // Empty / root fallback to undefined so the chip just hides itself.\r\n const projectName = React.useMemo(() => {\r\n const base = path.basename(projectRoot);\r\n return base && base !== path.sep ? base : undefined;\r\n }, [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 const draftRef = useRef({ buffer: state.buffer, cursor: state.cursor });\r\n draftRef.current = { buffer: state.buffer, cursor: state.cursor };\r\n\r\n // handleRewindTo must be declared before the /rewind useEffect (line 1803)\r\n // so the closure can capture it. It is intentionally NOT in useCallback\r\n // — each call needs a fresh rewinder referencing the current sessionsDir.\r\n const handleRewindTo = React.useCallback(async (checkpointIndex: number) => {\r\n const sessionId = agent.ctx.session.id;\r\n if (!sessionId) return;\r\n const rewinder = new DefaultSessionRewinder(sessionsDir ?? '');\r\n // Revert file system changes first (read-only, safe to do eagerly).\r\n await rewinder.rewindToCheckpoint(sessionId, checkpointIndex);\r\n // Then truncate the conversation history — this fires session.rewound\r\n // on the EventBus, which the useEffect at line 2212 listens to and\r\n // dispatches sessionRewound + clearHistory.\r\n await agent.ctx.session.truncateToCheckpoint(checkpointIndex);\r\n }, [agent.ctx.session, sessionsDir]);\r\n\r\n const setDraft = (buffer: string, cursor: number): void => {\r\n draftRef.current = { buffer, cursor };\r\n dispatch({ type: 'setBuffer', buffer, cursor });\r\n };\r\n\r\n const clearDraft = (): void => {\r\n draftRef.current = { buffer: '', cursor: 0 };\r\n dispatch({ type: 'clearInput' });\r\n };\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 //\r\n // We sum input + cacheRead + cacheWrite so the chip reflects the TRUE\r\n // total context the model loaded (Usage is disjoint by design — see the\r\n // doc on Usage). Without this, prompt-cached turns would show only the\r\n // fresh-token delta and the chip would read 0% even when the context\r\n // was near the limit.\r\n // Cumulative \"effective context\" from tokenCounter: fresh input tokens\r\n // PLUS cached tokens that were sent as part of this prompt. All three\r\n // contribute to context-window pressure — cache tokens are still tokens\r\n // the model must process. (usage.input is disjoint from cacheRead/\r\n // cacheWrite, so simple sum is correct.)\r\n const totalCtxTokens =\r\n (tokenCounter?.total().input ?? 0) +\r\n (tokenCounter?.total().cacheRead ?? 0) +\r\n (tokenCounter?.total().cacheWrite ?? 0);\r\n\r\n // Per-model maxContext. CLI passes effectiveMaxContext (resolved via\r\n // ModelsRegistry — correct for 1M-context variants). Fall back to\r\n // agent.ctx.provider.capabilities.maxContext when not provided.\r\n const maxContext =\r\n effectiveMaxContext ?? agent.ctx.provider.capabilities.maxContext;\r\n\r\n // Per-request context pressure: current prompt tokens (input + cacheRead).\r\n // Unlike the cumulative tokenCounter.total() which grows across all turns,\r\n // this tracks the live request's context weight — what actually determines\r\n // how close we are to the maxContext ceiling.\r\n // Cached tokens (cacheWrite) are excluded because they are an accounting\r\n // artifact of THIS request (provider charges for them separately); they\r\n // are already counted in usage.input as part of the prompt the model sees.\r\n const currentContextTokens =\r\n (tokenCounter?.currentRequestTokens()?.input ?? 0) +\r\n (tokenCounter?.currentRequestTokens()?.cacheRead ?? 0);\r\n\r\n const contextWindow = useMemo(() => {\r\n void state.contextChipVersion;\r\n return currentContextTokens > 0 && maxContext > 0\r\n ? { used: currentContextTokens, max: maxContext }\r\n : undefined;\r\n }, [currentContextTokens, maxContext, state.contextChipVersion]);\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 // Fleet breakdown for the status-bar chip. Derived from `state.fleet`,\r\n // which the FleetBus event listeners already maintain — re-bucket\r\n // into running / idle / pending / completed because that's the slice\r\n // the user cares about at a glance. Recomputes on every state.fleet\r\n // change (cheap — fleet usually has <10 entries).\r\n const fleetCounts = useMemo(() => {\r\n const entries = Object.values(state.fleet);\r\n if (entries.length === 0) return undefined;\r\n let running = 0;\r\n let idle = 0;\r\n let completed = 0;\r\n for (const e of entries) {\r\n if (e.status === 'running') running += 1;\r\n else if (e.status === 'idle') idle += 1;\r\n else completed += 1; // success/failed/timeout/stopped all count as \"done\"\r\n }\r\n return { running, idle, pending: 0, completed };\r\n }, [state.fleet]);\r\n\r\n // Stable per-subagent label + color, assigned on first sighting and\r\n // shared between the FleetBus listener (history stream) and the\r\n // fleetAgents memo (status bar 4th line). Declared HERE — above\r\n // `fleetAgents` — because that memo's callback calls labelFor on\r\n // every recompute. The previous declaration site (below the memo)\r\n // worked while state.fleet was empty (the memo's early-return\r\n // skipped the call) but threw a TDZ error the moment a subagent\r\n // was spawned and the memo actually executed its body.\r\n const STREAM_COLORS = ['cyan', 'magenta', 'yellow', 'green', 'blue'];\r\n const labelsRef = useRef<Map<string, { label: string; color: string }>>(new Map());\r\n const labelFor = (id: string, name?: string): { label: string; color: string } => {\r\n const m = labelsRef.current;\r\n const existing = m.get(id);\r\n if (existing) return existing;\r\n const n = m.size + 1;\r\n const suffix = name && name !== id ? ` ${name}` : '';\r\n const v = {\r\n label: `AGENT#${n}${suffix}`,\r\n color: STREAM_COLORS[(n - 1) % STREAM_COLORS.length]!,\r\n };\r\n m.set(id, v);\r\n return v;\r\n };\r\n\r\n // Per-agent detail for the status bar's optional 4th line. Limited to\r\n // the top 4 active agents (running first, then idle) sorted by spawn\r\n // order so the bar doesn't wrap on wide fleets. Reuses the global\r\n // `nowTick` (bumped every 1s above) so elapsed time keeps ticking\r\n // without needing a second timer.\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: labelFor is ref-stable (uses useRef)\r\n const fleetAgents = useMemo(() => {\r\n const entries = Object.entries(state.fleet);\r\n if (entries.length === 0) return undefined;\r\n // Show running first, then idle. Completed/failed agents drop off\r\n // the active line — they're already reflected in the aggregate ✓N\r\n // counter on line 3.\r\n const active = entries.filter(([_id, e]) => e.status === 'running' || e.status === 'idle');\r\n if (active.length === 0) return undefined;\r\n active.sort((a, b) => {\r\n const sa = a[1].status === 'running' ? 0 : 1;\r\n const sb = b[1].status === 'running' ? 0 : 1;\r\n if (sa !== sb) return sa - sb;\r\n return a[1].startedAt - b[1].startedAt;\r\n });\r\n return active.slice(0, 4).map(([id, e]) => {\r\n const lbl = labelFor(id, e.name);\r\n return {\r\n label: lbl.label,\r\n color: lbl.color,\r\n elapsedMs: Math.max(0, nowTick - e.startedAt),\r\n toolCalls: e.toolCalls,\r\n running: e.status === 'running',\r\n };\r\n });\r\n }, [state.fleet, nowTick]);\r\n\r\n // Plan counts come from `<sessionId>.plan.json` on disk, not React\r\n // state. We poll lazily every few ticks so the chip stays current\r\n // without slamming the FS — plans change at human pace (a few times\r\n // per session at most), so 3s granularity is plenty.\r\n const [planCounts, setPlanCounts] = useState<{\r\n open: number;\r\n inProgress: number;\r\n done: number;\r\n } | null>(null);\r\n useEffect(() => {\r\n const planPath = (agent.ctx.meta as Record<string, unknown>)['plan.path'];\r\n if (typeof planPath !== 'string' || !planPath) return;\r\n let cancelled = false;\r\n const poll = async () => {\r\n try {\r\n const data = await fs.readFile(planPath, 'utf8');\r\n const parsed = JSON.parse(data) as {\r\n items?: Array<{ status?: string }>;\r\n };\r\n if (cancelled) return;\r\n if (!Array.isArray(parsed.items)) {\r\n setPlanCounts(null);\r\n return;\r\n }\r\n let open = 0;\r\n let inProgress = 0;\r\n let done = 0;\r\n for (const it of parsed.items) {\r\n if (it?.status === 'done') done++;\r\n else if (it?.status === 'in_progress') inProgress++;\r\n else open++;\r\n }\r\n setPlanCounts(open + inProgress + done > 0 ? { open, inProgress, done } : null);\r\n } catch {\r\n // Missing or corrupt — clear the chip.\r\n if (!cancelled) setPlanCounts(null);\r\n }\r\n };\r\n void poll();\r\n const id = setInterval(poll, 3000);\r\n return () => {\r\n cancelled = true;\r\n clearInterval(id);\r\n };\r\n }, [agent.ctx.meta]);\r\n\r\n // Live-region shrink mitigation. Ink's log-update tracks the previous\r\n // render's logical line count; when content visually wraps past the\r\n // terminal width, the visual-row count exceeds the logical count and\r\n // log-update's clear-and-rewrite leaves the extra visual rows behind.\r\n // Those extras then slide into native scrollback as the next render\r\n // commits new Static items above the live region — looking to the user\r\n // like an extra echo of the input (\"Enter ile boş input da history'e\r\n // sıyrılıyor\").\r\n //\r\n // We can't reach log-update directly, but we can issue an erase-below-\r\n // cursor (\\x1b[J) at the moments most likely to leak: when a picker /\r\n // dialog transitions from open → closed (the live region's height\r\n // drops sharply), and when a fresh history entry was just committed.\r\n // \\x1b[J only touches what's below the cursor, so committed Static\r\n // history above is preserved. For users in heavy resize / picker\r\n // workflows the bullet-proof alternative is still `--alt-screen`.\r\n const prevAnyOverlayOpen = useRef(false);\r\n const prevEntriesCount = useRef(0);\r\n useEffect(() => {\r\n const anyOpenNow =\r\n state.picker.open || state.slashPicker.open || state.modelPicker.open || state.confirmQueue.length > 0;\r\n const overlayClosed = prevAnyOverlayOpen.current && !anyOpenNow;\r\n const newEntryCommitted = state.entries.length > prevEntriesCount.current;\r\n prevAnyOverlayOpen.current = anyOpenNow;\r\n prevEntriesCount.current = state.entries.length;\r\n if (overlayClosed || newEntryCommitted) {\r\n try {\r\n process.stdout.write('\\x1b[J');\r\n } catch {\r\n // stdout might be detached during shutdown — ignore.\r\n }\r\n }\r\n }, [\r\n state.picker.open,\r\n state.slashPicker.open,\r\n state.modelPicker.open,\r\n state.confirmQueue.length,\r\n state.entries.length,\r\n ]);\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: arrow keys would\r\n // still target the command menu even though the user is typing args.\r\n // Close it 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: cmd.argsHint,\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 draft = draftRef.current;\r\n const tok = detectAtToken(draft.buffer, draft.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 = draft.buffer.slice(0, tok.start);\r\n const after = draft.buffer.slice(tok.end);\r\n const next = `${before}${placeholder}${after}`;\r\n setDraft(next, tok.start + placeholder.length);\r\n dispatch({ type: 'pickerClose' });\r\n } catch (err) {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'error',\r\n text: `Attach failed: ${err instanceof Error ? err.message : String(err)}`,\r\n },\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 setDraft(cmd, 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 /kill (list/kill tracked bash/exec processes) and /ps (list only).\r\n useEffect(() => {\r\n slashRegistry.register(createKillSlashCommand());\r\n slashRegistry.register(createPsSlashCommand());\r\n return () => {\r\n slashRegistry.unregister('kill');\r\n slashRegistry.unregister('ps');\r\n };\r\n }, [slashRegistry]);\r\n\r\n // Kill all tracked bash/exec processes when the TUI unmounts.\r\n // This fires on natural exit, Ctrl+C, and any other unmount path,\r\n // ensuring no orphaned child processes survive after the session ends.\r\n useEffect(() => {\r\n return () => {\r\n getProcessRegistry().killAll();\r\n };\r\n }, []);\r\n\r\n // Register `/altscreen on|off` — runtime escape valve for the\r\n // alt-screen scrollback limitation. In alt-screen mode the terminal's\r\n // native scrollback is disabled, so users can't review old chat\r\n // entries. `off` writes the alt-screen-exit escape so subsequent\r\n // entries land in the normal scroll region and the mouse wheel /\r\n // shift+pgup work again. The trade-off (lost on-screen history,\r\n // resize artifacts) is spelled out in the response message so the\r\n // user can decide whether to keep it.\r\n useEffect(() => {\r\n const ALT_OFF = '\\x1b[?1049l';\r\n const ALT_ON = '\\x1b[?1049h';\r\n const cmd = {\r\n name: 'altscreen',\r\n description:\r\n 'Toggle the alt-screen buffer. Default is OFF (native scroll); /altscreen on for full-screen mode.',\r\n async run(args: string) {\r\n const arg = args.trim().toLowerCase();\r\n if (arg === 'off') {\r\n try {\r\n process.stdout.write(ALT_OFF);\r\n } catch {\r\n return { message: 'Failed to exit alt-screen.' };\r\n }\r\n return {\r\n message:\r\n 'Alt-screen disabled. New entries will land in normal scrollback (mouse wheel / Shift+PgUp work). ' +\r\n 'On-screen history rendered before this command is no longer reachable via terminal scroll. ' +\r\n 'Resize may now leak the live region — `/altscreen on` to re-enable.',\r\n };\r\n }\r\n if (arg === 'on') {\r\n try {\r\n process.stdout.write(ALT_ON);\r\n } catch {\r\n return { message: 'Failed to re-enter alt-screen.' };\r\n }\r\n return { message: 'Alt-screen re-enabled. Native scroll is now disabled.' };\r\n }\r\n return { message: 'Usage: /altscreen on|off' };\r\n },\r\n };\r\n slashRegistry.register(cmd);\r\n return () => {\r\n slashRegistry.unregister('altscreen');\r\n };\r\n }, [slashRegistry]);\r\n\r\n // `/steer <message>` — slash-command equivalent of Esc-to-steer.\r\n // Useful when Esc is consumed by an outer terminal multiplexer, or\r\n // when the user wants a single-shot redirect without the typed\r\n // follow-up (the message is the new direction). Performs the same\r\n // sequence the Esc handler does: snapshot context, abort the active\r\n // run, terminate the fleet, drop the queue, then sets steeringPending\r\n // so the message — submitted as the slash command's return — picks\r\n // up the rich STEERING preamble in the normal submit path.\r\n //\r\n // Unlike Esc, this slash command can be invoked at any state. When\r\n // the agent is idle the abort and fleet-termination are no-ops; the\r\n // steering preamble still gets prepended, which is harmless extra\r\n // context (\"nothing was running\") for the next turn.\r\n useEffect(() => {\r\n const cmd = {\r\n name: 'steer',\r\n description: 'Interrupt the running agent (incl. fleet) and redirect: /steer <new direction>',\r\n help: [\r\n 'Usage: /steer <new direction>',\r\n '',\r\n 'Aborts the active iteration, terminates any running subagents,',\r\n 'drops queued messages, and sends your text to the model with a',\r\n 'STEERING preamble explaining what was in flight and what the',\r\n 'model is authorised to do (pivot hard, respawn subagents, ask',\r\n 'for clarification). Equivalent to pressing Esc then typing.',\r\n ].join('\\n'),\r\n async run(args: string) {\r\n const text = args.trim();\r\n if (!text) {\r\n return { message: 'Usage: /steer <new direction>' };\r\n }\r\n // Capture BEFORE mutating — same as the Esc handler.\r\n const s = stateRef.current;\r\n const runningTools = Array.from(s.runningTools.values()).map((t) => t.name);\r\n const subagents = Object.values(s.fleet)\r\n .filter((e) => e.status === 'running')\r\n .map((e) => ({ label: e.name, status: e.status, tool: e.currentTool?.name }));\r\n const subagentsTerminated = subagents.length;\r\n const partialAssistantText = streamingTextRef.current.slice(-1500);\r\n\r\n activeCtrlRef.current?.abort();\r\n dispatch({\r\n type: 'steerStart',\r\n snapshot: { runningTools, subagents, subagentsTerminated, partialAssistantText },\r\n });\r\n const droppedCount = s.queue.length;\r\n if (droppedCount > 0) dispatch({ type: 'queueClear' });\r\n if (director && subagentsTerminated > 0) {\r\n const cap = new Promise<void>((resolve) => {\r\n const t = setTimeout(resolve, 1500);\r\n t.unref?.();\r\n });\r\n void Promise.race([director.terminateAll().catch(() => undefined), cap]);\r\n }\r\n\r\n // Build the full preamble + direction here, return it as the\r\n // slash command output's `runText` so the submit pipeline\r\n // sends THIS to the model instead of \"/steer …\".\r\n const preamble = buildSteeringPreamble(\r\n { runningTools, subagents, subagentsTerminated, partialAssistantText },\r\n text,\r\n );\r\n // Consume immediately — the runText below already carries the\r\n // preamble; the steeringPending flag would otherwise double up.\r\n dispatch({ type: 'steerConsume' });\r\n\r\n const droppedTag = droppedCount > 0 ? ` · dropped ${droppedCount} queued` : '';\r\n const fleetTag =\r\n subagentsTerminated > 0\r\n ? ` · stopped ${subagentsTerminated} subagent${subagentsTerminated === 1 ? '' : 's'}`\r\n : '';\r\n return {\r\n message: `↯ Steering${droppedTag}${fleetTag}.`,\r\n runText: preamble,\r\n };\r\n },\r\n };\r\n slashRegistry.register(cmd);\r\n return () => {\r\n slashRegistry.unregister('steer');\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [slashRegistry, director]);\r\n\r\n // `/rewind` — open the checkpoint timeline overlay. If a checkpoint\r\n // index is provided as argument, rewinds directly to it.\r\n // eslint-disable-next-line react-hooks/exhaustive-deps -- handleRewindTo is stable via useCallback\r\n useEffect(() => {\r\n const cmd = {\r\n name: 'rewind',\r\n description: 'Open checkpoint timeline to rewind session: /rewind [checkpoint-index]',\r\n help: [\r\n 'Usage: /rewind [checkpoint-index]',\r\n '',\r\n 'Opens a checkpoint timeline. Use ↑/↓ to navigate, Enter to rewind,',\r\n 'Esc to cancel. The session is reverted to the selected checkpoint',\r\n 'and conversation history is truncated — LLM continues fresh.',\r\n '',\r\n 'If a checkpoint index is provided the timeline is skipped and',\r\n 'rewind happens immediately.',\r\n ].join('\\n'),\r\n async run(args: string) {\r\n const idx = Number.parseInt(args.trim(), 10);\r\n if (!Number.isNaN(idx) && idx >= 0) {\r\n handleRewindTo(idx);\r\n return {};\r\n }\r\n // No arg — open the timeline overlay\r\n const s = stateRef.current;\r\n if (s.checkpoints.length === 0) {\r\n return { message: 'No checkpoints in this session yet.' };\r\n }\r\n dispatch({ type: 'rewindOverlayOpen' });\r\n return {};\r\n },\r\n };\r\n slashRegistry.register(cmd);\r\n return () => {\r\n slashRegistry.unregister('rewind');\r\n };\r\n }, [slashRegistry, handleRewindTo]);\r\n\r\n // `/goal` is registered as a CLI builtin (packages/cli/src/slash-commands/\r\n // goal.ts) which handles both the preamble lock-in (the former TUI\r\n // behavior) and goal.json persistence for /autonomy eternal. The TUI\r\n // does NOT register its own /goal here — that would collide with the\r\n // builtin and throw \"already registered\" on mount.\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 startedAt: Date.now(),\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 // Real model-visible sizes — forwarded so the size chip beside\r\n // the tool header can show what the model paid for instead of\r\n // the misleading preview-byte count we used to surface.\r\n outputBytes: e.outputBytes,\r\n outputTokens: e.outputTokens,\r\n outputLines: e.outputLines,\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 // Echo the current todo list into chat whenever the `todo` tool\r\n // mutates ctx.todos — same format as `/todos list`. Snapshotted from\r\n // agent.ctx.todos at this point (the tool executor has already\r\n // applied the mutation by the time tool.executed fires).\r\n if (e.ok && e.name === 'todo') {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'info', text: formatTodosList(agent.ctx.todos) },\r\n });\r\n }\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 // Per-iteration text flush. Without this, the entire run buffers all text\r\n // deltas in the live tail box and dumps them into history as ONE assistant\r\n // entry only after `agent.run()` returns. Tool results, in contrast, land\r\n // in history immediately via `tool.executed` — so a multi-iteration turn\r\n // renders as \"all tools, then a wall of text\" instead of the natural\r\n // text → tool → text → tool interleaving that matches the actual stream.\r\n //\r\n // We hook `provider.response` (fires once per LLM call, both for\r\n // intermediate `tool_use` stops and the final `end_turn`) and commit\r\n // whatever has accumulated in `streamingTextRef` as an assistant history\r\n // entry. The next iteration's deltas start a fresh buffer. `runBlocks`\r\n // becomes purely the loop driver — it no longer adds the assistant entry,\r\n // since the per-iteration flushes have already done so.\r\n const offProvResp = events.on('provider.response', () => {\r\n const text = streamingTextRef.current;\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 if (text.trim()) {\r\n dispatch({ type: 'addEntry', entry: { kind: 'assistant', text } });\r\n }\r\n });\r\n const offConfirmNeeded = events.on('tool.confirm_needed', (e) => {\r\n // Only show the ConfirmPrompt component — no duplicate history entry needed.\r\n // The full ConfirmPrompt with y/n/a/d keys is rendered below;\r\n // the history placeholder was redundant.\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 const offTrustPersisted = events.on('trust.persisted', (e) => {\r\n const icon = e.decision === 'always' ? '✓' : '✗';\r\n const label = e.decision === 'always' ? 'always allowed' : 'denied';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'info',\r\n text: `${icon} ${label}: ${e.tool}(${e.pattern})`,\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 offProvResp();\r\n offConfirmNeeded();\r\n offTrustPersisted();\r\n if (flushTimerRef.current) clearTimeout(flushTimerRef.current);\r\n };\r\n }, [events, agent.ctx.todos]);\r\n\r\n // Live mirror of `streamFleet` for the FleetBus listener below. The\r\n // listener is wired in a single mount-time effect so it doesn't tear\r\n // down per-state-change; a ref lets it read the current toggle value\r\n // on every event without re-subscribing.\r\n const streamFleetRef = useRef(state.streamFleet);\r\n useEffect(() => {\r\n streamFleetRef.current = state.streamFleet;\r\n }, [state.streamFleet]);\r\n\r\n // --- Subagent lifecycle entries (uniform for director + non-director) ---\r\n // Wired to EventBus, not FleetBus, so /spawn-agent runs (which don't\r\n // build a Director) also surface in the chat. The director path emits\r\n // the same events through `MultiAgentHost`, so this single listener\r\n // covers both modes and replaces the per-status history entry that\r\n // previously lived inside the director.on('task.completed') hook.\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: labelFor is ref-stable (uses useRef)\r\n useEffect(() => {\r\n const offSpawned = events.on('subagent.spawned', (e) => {\r\n const lbl = labelFor(e.subagentId, e.name);\r\n dispatch({\r\n type: 'fleetSpawn',\r\n id: e.subagentId,\r\n name: e.name,\r\n provider: e.provider,\r\n model: e.model,\r\n transcriptPath: e.transcriptPath,\r\n });\r\n const where = e.provider && e.model ? `${e.provider}/${e.model}` : 'spawned';\r\n const desc = e.description ? ` — ${e.description.slice(0, 80)}` : '';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'subagent',\r\n agentLabel: lbl.label,\r\n agentColor: lbl.color,\r\n icon: '▶',\r\n text: `${where}${desc}`,\r\n },\r\n });\r\n });\r\n const offStarted = events.on('subagent.task_started', (e) => {\r\n const lbl = labelFor(e.subagentId);\r\n dispatch({ type: 'fleetStart', id: e.subagentId, taskId: e.taskId });\r\n const desc = e.description ? ` — ${e.description.slice(0, 80)}` : '';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'subagent',\r\n agentLabel: lbl.label,\r\n agentColor: lbl.color,\r\n icon: '●',\r\n text: `task started${desc}`,\r\n },\r\n });\r\n });\r\n const offCompleted = events.on('subagent.task_completed', (e) => {\r\n const lbl = labelFor(e.subagentId);\r\n dispatch({\r\n type: 'fleetDone',\r\n id: e.subagentId,\r\n status: e.status,\r\n iterations: e.iterations,\r\n toolCalls: e.toolCalls,\r\n });\r\n // Status-specific icon so timeout/stopped/failed are visually\r\n // distinct from a plain success. We now have a structured error\r\n // envelope with `kind` (e.g. `provider_rate_limit`,\r\n // `tool_failed`) — prefix the tail with `[kind]` so the user\r\n // sees the actual failure mode, not just \"✗ failed\" for every\r\n // breed of failure.\r\n const icon =\r\n e.status === 'success'\r\n ? '✓'\r\n : e.status === 'timeout'\r\n ? '⏱'\r\n : e.status === 'stopped'\r\n ? '⊘'\r\n : '✗';\r\n const errKind = e.error?.kind;\r\n const errMsg = e.error?.message;\r\n const errMsgTail = errMsg\r\n ? ` — ${errMsg.replace(/\\s+/g, ' ').slice(0, 100)}${errMsg.length > 100 ? '…' : ''}`\r\n : '';\r\n const errChip = errKind ? ` [${errKind}]` : '';\r\n const secs = (e.durationMs / 1000).toFixed(e.durationMs < 10_000 ? 1 : 0);\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'subagent',\r\n agentLabel: lbl.label,\r\n agentColor: lbl.color,\r\n icon,\r\n text: `${e.status} (${e.iterations} iter · ${e.toolCalls} tools · ${secs}s)${errChip}${errMsgTail}`,\r\n },\r\n });\r\n });\r\n // Budget pressure: subagent hit a soft limit and the coordinator\r\n // is auto-extending. Surface as a fleet warning so the user can see\r\n // \"⚡ agent#bug-hunter hitting tool_calls limit (350/400) — extending\".\r\n // Timeout-specific: never says \"extending\" since timeout is a pure\r\n // warning — the subagent just keeps running until it finishes.\r\n const offBudgetWarning = events.on('subagent.budget_warning', (e) => {\r\n const lbl = labelFor(e.subagentId);\r\n dispatch({ type: 'fleetBudgetWarning', id: e.subagentId, kind: e.kind, used: e.used, limit: e.limit });\r\n const timeoutSuffix = e.kind === 'timeout' ? ' (subagent continues running)' : ' — extending';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'subagent',\r\n agentLabel: lbl.label,\r\n agentColor: lbl.color,\r\n icon: '⚡',\r\n text: `hitting ${e.kind} limit (${e.used}/${e.limit})${timeoutSuffix}`,\r\n },\r\n });\r\n });\r\n // Periodic progress snapshot so the user can see what each subagent\r\n // is doing in the main chat history without opening the FleetPanel.\r\n // Format: \"AGENT#2 💬 L25 · 47 tools · $0.023 · doing bash...\"\r\n const offIterationSummary = events.on('subagent.iteration_summary', (e) => {\r\n const lbl = labelFor(e.subagentId);\r\n const costStr = e.costUsd > 0 ? ` · ${e.costUsd.toFixed(3)}` : '';\r\n const toolStr = e.currentTool ? ` · doing ${e.currentTool}` : '';\r\n const partial = e.partialText ? ` · \"${e.partialText.slice(0, 60)}${e.partialText.length > 60 ? '…' : ''}\"` : '';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'subagent',\r\n agentLabel: lbl.label,\r\n agentColor: lbl.color,\r\n icon: '💬',\r\n text: `L${e.iteration} · ${e.toolCalls} tools${costStr}${toolStr}${partial}`,\r\n },\r\n });\r\n });\r\n // Always-on per-tool state surface. Now fires in both director and\r\n // non-director modes, so the leader's chat history shows subagent\r\n // tool calls regardless of mode. Director mode also gets FleetBus\r\n // path for richer FleetPanel streaming.\r\n const offTool = events.on('subagent.tool_executed', (e) => {\r\n dispatch({\r\n type: 'fleetTool',\r\n id: e.subagentId,\r\n name: e.name,\r\n ok: e.ok,\r\n durationMs: e.durationMs,\r\n outputBytes: e.outputBytes,\r\n });\r\n dispatch({ type: 'fleetToolEnd', id: e.subagentId });\r\n });\r\n return () => {\r\n offSpawned();\r\n offStarted();\r\n offCompleted();\r\n offBudgetWarning();\r\n offIterationSummary();\r\n offTool();\r\n };\r\n }, [events, director]);\r\n\r\n // Checkpoint and session rewind event listeners — no director required.\r\n // eslint-disable-next-line react-hooks/exhaustive-deps -- onClearHistory is stable\r\n useEffect(() => {\r\n const offCheckpoint = events.on('checkpoint.written', (e) => {\r\n dispatch({\r\n type: 'checkpointReceived',\r\n cp: {\r\n promptIndex: e.promptIndex,\r\n promptPreview: e.promptPreview,\r\n ts: e.ts,\r\n fileCount: e.fileCount,\r\n },\r\n });\r\n });\r\n const offRewound = events.on('session.rewound', (_e) => {\r\n dispatch({ type: 'sessionRewound', toPromptIndex: 0 });\r\n dispatch({ type: 'clearHistory' });\r\n if (onClearHistory) {\r\n onClearHistory(dispatch);\r\n }\r\n });\r\n return () => {\r\n offCheckpoint();\r\n offRewound();\r\n };\r\n }, [events, onClearHistory]);\r\n\r\n // --- Leader agent compaction events → chat history ---\r\n useEffect(() => {\r\n const offFired = events.on('compaction.fired', (e) => {\r\n const { level, tokens, load, maxContext, report, aggressive } = e as {\r\n level: string;\r\n tokens: number;\r\n load: number;\r\n maxContext: number;\r\n report: { before: number; after: number; reductions: { phase: string; saved: number }[] };\r\n aggressive: boolean;\r\n };\r\n const pct = (load * 100).toFixed(0);\r\n const before = report.before;\r\n const after = report.after;\r\n const saved = before - after;\r\n const table = [\r\n `▸ context compacted at ${level} (${pct}% of ${maxContext.toLocaleString()} tok)`,\r\n ` tokens before ${before.toLocaleString().padStart(8)}`,\r\n ` tokens after ${after.toLocaleString().padStart(8)}`,\r\n ` saved ${saved.toLocaleString().padStart(8)} (${((saved / before) * 100).toFixed(1)}%)`,\r\n ];\r\n for (const line of table) {\r\n dispatch({ type: 'addEntry', entry: { kind: 'info', text: line } });\r\n }\r\n });\r\n const offFailed = events.on('compaction.failed', (e) => {\r\n const { level, load, maxContext, fatal } = e as { level: string; load: number; maxContext: number; fatal: boolean };\r\n const pct = (load * 100).toFixed(0);\r\n const text = fatal\r\n ? `✗ compaction failed at ${level} (${pct}% of ${maxContext.toLocaleString()} tok) — FATAL`\r\n : `⚠ compaction failed at ${level} (${pct}% of ${maxContext.toLocaleString()} tok) — continuing`;\r\n dispatch({ type: 'addEntry', entry: { kind: fatal ? 'error' : 'warn', text } });\r\n });\r\n return () => {\r\n offFired();\r\n offFailed();\r\n };\r\n }, [events]);\r\n\r\n // Install a dispatch-backed setter into the shared controller so the\r\n // `/fleet stream on|off` slash command can flip our reducer flag.\r\n // Restored to a noop on unmount so a late-arriving slash callback\r\n // doesn't dispatch into a torn-down React tree.\r\n useEffect(() => {\r\n if (!fleetStreamController) return;\r\n fleetStreamController.enabled = state.streamFleet;\r\n fleetStreamController.setEnabled = (enabled: boolean) => {\r\n dispatch({ type: 'setStreamFleet', enabled });\r\n };\r\n return () => {\r\n fleetStreamController.setEnabled = (enabled: boolean) => {\r\n fleetStreamController.enabled = enabled;\r\n };\r\n };\r\n }, [fleetStreamController, state.streamFleet]);\r\n\r\n // Keep the controller's mirror of `enabled` in sync when the toggle is\r\n // flipped from a TUI-side path (not the slash command).\r\n useEffect(() => {\r\n if (fleetStreamController) fleetStreamController.enabled = state.streamFleet;\r\n }, [state.streamFleet, fleetStreamController]);\r\n\r\n // --- FleetBus → TUI dispatch bridge ---\r\n // Subscribes to every event on the director's FleetBus and dispatches\r\n // fleet state actions. Text deltas are throttled (FLUSH_MS) to avoid\r\n // flooding React re-renders; other events dispatch immediately.\r\n // Seeds initial fleet state from director.status() on mount so the\r\n // panel reflects subagents spawned before the TUI attached.\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: labelFor is ref-stable\r\n useEffect(() => {\r\n const d = director;\r\n if (!d) return;\r\n const FLUSH_MS = 150;\r\n\r\n // Per-agent buffered assistant text. Flushed as one `subagent`\r\n // history entry when the agent stops emitting deltas for FLUSH_MS,\r\n // so we don't fire a fresh history entry on every token.\r\n const streamBuf = new Map<string, string>();\r\n let streamFlushTimer: ReturnType<typeof setTimeout> | null = null;\r\n const flushStreamBufs = () => {\r\n for (const [id, text] of streamBuf) {\r\n const trimmed = text.trim();\r\n if (!trimmed) continue;\r\n const lbl = labelFor(id);\r\n dispatch({ type: 'fleetMessage', id, text: trimmed });\r\n if (streamFleetRef.current) {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'subagent',\r\n agentLabel: lbl.label,\r\n agentColor: lbl.color,\r\n icon: '💬',\r\n text: trimmed,\r\n },\r\n });\r\n }\r\n }\r\n streamBuf.clear();\r\n streamFlushTimer = null;\r\n };\r\n\r\n // Seed: discover already-spawned subagents from the coordinator.\r\n const status = d.status();\r\n for (const s of status.subagents) {\r\n const meta = d.getSubagentMeta(s.id);\r\n dispatch({\r\n type: 'fleetSpawn',\r\n id: s.id,\r\n name: meta?.name ?? s.name,\r\n provider: meta?.provider,\r\n model: meta?.model,\r\n });\r\n // Seed a stable label so subagents spawned before TUI mount still\r\n // show up by name in the status bar's per-agent detail line.\r\n labelFor(s.id, meta?.name ?? s.name);\r\n }\r\n // Also seed cost from the usage aggregator.\r\n dispatch({ type: 'fleetCost', cost: d.snapshot().total.cost });\r\n\r\n // Discover new subagents on first FleetBus event for an unknown id.\r\n const seen = new Set(Object.keys(status.subagents));\r\n\r\n // Throttled delta accumulator per subagent.\r\n const pending = new Map<string, string>();\r\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\r\n const doFlush = () => {\r\n for (const [id, text] of pending) {\r\n if (text) dispatch({ type: 'fleetDelta', id, text });\r\n }\r\n pending.clear();\r\n flushTimer = null;\r\n };\r\n\r\n const offFleet = d.fleet.onAny((e: FleetEvent) => {\r\n // Discover new subagents.\r\n const fresh = !seen.has(e.subagentId);\r\n if (fresh) {\r\n seen.add(e.subagentId);\r\n const meta = d.getSubagentMeta(e.subagentId);\r\n dispatch({\r\n type: 'fleetSpawn',\r\n id: e.subagentId,\r\n name: meta?.name,\r\n provider: meta?.provider,\r\n model: meta?.model,\r\n });\r\n // Always assign a label on first sighting so the status bar's\r\n // 4th line has stable AGENT#N names even when history streaming\r\n // is disabled. The history `spawned` entry below is gated on\r\n // streamFleet; label assignment itself is unconditional.\r\n const lbl = labelFor(e.subagentId, meta?.name);\r\n if (streamFleetRef.current) {\r\n const where =\r\n meta?.provider && meta?.model ? `${meta.provider}/${meta.model}` : 'spawned';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'subagent',\r\n agentLabel: lbl.label,\r\n agentColor: lbl.color,\r\n icon: '▶',\r\n text: where,\r\n },\r\n });\r\n }\r\n }\r\n\r\n switch (e.type) {\r\n case 'iteration.started':\r\n dispatch({ type: 'fleetStart', id: e.subagentId });\r\n break;\r\n case 'session.started':\r\n // First event a subagent emits — treat as start so the fleet\r\n // panel is populated even if no iteration.started fires yet.\r\n dispatch({ type: 'fleetStart', id: e.subagentId });\r\n break;\r\n case 'provider.text_delta': {\r\n const p = e.payload as { text?: string };\r\n if (p?.text) {\r\n const cur = pending.get(e.subagentId) ?? '';\r\n pending.set(e.subagentId, cur + p.text);\r\n if (!flushTimer) flushTimer = setTimeout(doFlush, FLUSH_MS);\r\n streamBuf.set(e.subagentId, (streamBuf.get(e.subagentId) ?? '') + p.text);\r\n if (streamFlushTimer) clearTimeout(streamFlushTimer);\r\n streamFlushTimer = setTimeout(flushStreamBufs, FLUSH_MS * 4);\r\n }\r\n break;\r\n }\r\n case 'provider.thinking_delta': {\r\n // Extended thinking output — same buffering as text_delta so\r\n // it gets flushed into recentMessages and (when streaming is\r\n // on) injected into leader history.\r\n const p = e.payload as { text?: string };\r\n if (p?.text) {\r\n streamBuf.set(e.subagentId, (streamBuf.get(e.subagentId) ?? '') + p.text);\r\n if (streamFlushTimer) clearTimeout(streamFlushTimer);\r\n streamFlushTimer = setTimeout(flushStreamBufs, FLUSH_MS * 4);\r\n }\r\n break;\r\n }\r\n case 'provider.retry': {\r\n const p = e.payload as { attempt?: number; delayMs?: number };\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'warn',\r\n text: `subagent retry ${p?.attempt ?? '?'}${p?.delayMs ? ` (${p.delayMs}ms)` : ''}`,\r\n },\r\n });\r\n break;\r\n }\r\n case 'provider.error': {\r\n const p = e.payload as { description?: string };\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'error',\r\n text: `subagent error${p?.description ? `: ${p.description}` : ''}`,\r\n },\r\n });\r\n break;\r\n }\r\n case 'tool.started': {\r\n const p = e.payload as { name?: string };\r\n if (p?.name) {\r\n dispatch({ type: 'fleetToolStart', id: e.subagentId, name: p.name });\r\n }\r\n break;\r\n }\r\n case 'tool.executed': {\r\n const p = e.payload as {\r\n name?: string;\r\n ok?: boolean;\r\n durationMs?: number;\r\n outputBytes?: number;\r\n outputLines?: number;\r\n };\r\n dispatch({\r\n type: 'fleetTool',\r\n id: e.subagentId,\r\n name: p?.name,\r\n ok: p?.ok,\r\n durationMs: p?.durationMs,\r\n outputBytes: p?.outputBytes,\r\n outputLines: p?.outputLines,\r\n });\r\n dispatch({ type: 'fleetToolEnd', id: e.subagentId });\r\n break;\r\n }\r\n case 'provider.response': {\r\n // Surface live cost from the aggregator (already computed with\r\n // per-model pricing). The fleetUsage reducer case is a stub that\r\n // preserves cost; fleetCost carries the real value.\r\n dispatch({ type: 'fleetCost', cost: d.snapshot().total.cost });\r\n break;\r\n }\r\n case 'session.ended':\r\n // Subagent finished — leave status update to task.completed.\r\n break;\r\n case 'compaction.fired':\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'info', text: 'subagent compaction triggered' },\r\n });\r\n break;\r\n case 'compaction.failed':\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'warn', text: 'subagent compaction failed' },\r\n });\r\n break;\r\n case 'token.threshold':\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'info', text: 'subagent token threshold reached' },\r\n });\r\n break;\r\n case 'budget.threshold_reached': {\r\n const p = e.payload as { kind?: string; used?: number; limit?: number };\r\n dispatch({\r\n type: 'fleetBudgetWarning',\r\n id: e.subagentId,\r\n kind: p?.kind ?? 'unknown',\r\n used: p?.used ?? 0,\r\n limit: p?.limit ?? 0,\r\n });\r\n break;\r\n }\r\n }\r\n });\r\n\r\n // Task completions arrive on the director's bus too, but the\r\n // history entry is now produced by the `subagent.task_completed`\r\n // EventBus listener (which fires uniformly for director and\r\n // non-director paths). Here we only update fleet panel state +\r\n // running cost — the chat-side entry would otherwise duplicate.\r\n const offDone = d.on('task.completed', (payload) => {\r\n dispatch({\r\n type: 'fleetDone',\r\n id: payload.result.subagentId,\r\n status: payload.result.status,\r\n iterations: payload.result.iterations,\r\n toolCalls: payload.result.toolCalls,\r\n });\r\n dispatch({ type: 'fleetCost', cost: d.snapshot().total.cost });\r\n // Drain any pending streaming text right before the completion\r\n // entry is committed by the EventBus listener so the order\r\n // \"chat → done line\" stays correct.\r\n if (streamFlushTimer) {\r\n clearTimeout(streamFlushTimer);\r\n flushStreamBufs();\r\n }\r\n });\r\n\r\n return () => {\r\n offFleet();\r\n offDone();\r\n if (flushTimer) clearTimeout(flushTimer);\r\n doFlush(); // commit any pending deltas before cleanup\r\n if (streamFlushTimer) clearTimeout(streamFlushTimer);\r\n flushStreamBufs();\r\n };\r\n }, [director]);\r\n\r\n // Handle SIGINT: first cancels current iteration + kills the fleet,\r\n // second forces exit regardless of state (the old `status === 'idle'`\r\n // gate left users stuck in 'aborting' forever when a delegate call\r\n // wouldn't unwind — agent.run() doesn't return while subagents\r\n // ignore the abort signal). Third press hard-kills via process.exit\r\n // so a wedged Ink loop can't trap the user.\r\n useEffect(() => {\r\n const onSigint = () => {\r\n const current = stateRef.current;\r\n // Second (or later) Ctrl+C — exit no matter what. Status may be\r\n // 'aborting', 'running', or 'streaming'; the user has clearly\r\n // decided they want out. Try Ink's graceful exit first, then\r\n // hard-exit on a short timer in case the React tree is wedged.\r\n if (current.interrupts >= 1) {\r\n // Second (or later) Ctrl+C — force-kill all processes and exit.\r\n // This is the \"you really mean it\" exit path.\r\n getProcessRegistry().killAll({ force: true });\r\n if (current.interrupts >= 2) {\r\n process.exit(130);\r\n }\r\n try {\r\n process.exit(130);\r\n } catch {\r\n // ignore\r\n }\r\n dispatch({ type: 'interrupt' });\r\n return;\r\n }\r\n dispatch({ type: 'interrupt' });\r\n\r\n // Pickers are safe to cancel outright — closing the overlay\r\n // restores the previous state cleanly with no side-effects.\r\n // Do this first so a single Ctrl+C from the model picker or\r\n // slash picker exits gracefully instead of doing nothing.\r\n if (current.modelPicker.open) {\r\n dispatch({ type: 'modelPickerClose' });\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'warn', text: 'Model picker cancelled.' },\r\n });\r\n return;\r\n }\r\n if (current.slashPicker.open) {\r\n dispatch({ type: 'slashPickerClose' });\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'warn', text: 'Cancelled.' },\r\n });\r\n return;\r\n }\r\n\r\n if (activeCtrlRef.current) {\r\n activeCtrlRef.current.abort();\r\n dispatch({ type: 'status', status: 'aborting' });\r\n // Kill every running subagent on the first interrupt — without\r\n // this the parent agent.run() stays parked in `await delegate\r\n // → director.awaitTasks` forever and the \"press again to exit\"\r\n // hint becomes a lie.\r\n //\r\n // We `await` terminateAll AND race a 1500ms cap so a stuck\r\n // bridge or hung tool can't trap us in cleanup — the user\r\n // pressed Ctrl+C; their patience is finite. The second\r\n // Ctrl+C still forces exit immediately via the path above,\r\n // so this race only matters for the polite-shutdown window.\r\n if (director) {\r\n const cap = new Promise<void>((resolve) => {\r\n const t = setTimeout(resolve, 1500);\r\n t.unref?.();\r\n });\r\n void Promise.race([director.terminateAll().catch(() => undefined), cap]);\r\n }\r\n // Kill all tracked bash/exec processes from the process registry.\r\n // This ensures runaway child processes (including background bashes\r\n // that outlive the agent iteration) are cleaned up on Ctrl+C.\r\n const killed = getProcessRegistry().killAll();\r\n const procTag = killed.length > 0 ? ` + killed ${killed.length} process${killed.length === 1 ? '' : 'es'}` : '';\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${director ? ' + fleet terminated' : ''}${procTag}. 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: {\r\n kind: 'warn',\r\n text: `Iteration cancelled${director ? ' + fleet terminated' : ''}${procTag}. Press Ctrl+C again to exit.`,\r\n },\r\n });\r\n }\r\n } else {\r\n // No active ctrl (agent idle, or activeCtrlRef wasn't set).\r\n // Still kill any lingering bash/exec processes and exit.\r\n const killed = getProcessRegistry().killAll();\r\n const procTag = killed.length > 0 ? ` Killed ${killed.length} process${killed.length === 1 ? '' : 'es'}.` : '';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'warn', text: `Press Ctrl+C again to exit.${procTag}` },\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 }, [director]);\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 // Exception: when status is 'aborting', all input is blocked — except\r\n // Ctrl+C which the SIGINT handler processes directly (not through handleKey).\r\n // We check interrupts here so the second Ctrl+C can still reach the handler\r\n // even though status is 'aborting'.\r\n if (state.status === 'aborting' && state.interrupts === 0) return;\r\n // Block all input while confirmation prompt is shown — the ConfirmPrompt\r\n // component handles y/n/a/d/escape/enter itself and Input's disabled prop\r\n // is not reliable when multiple useInput hooks are active.\r\n if (state.confirmQueue.length > 0) return;\r\n\r\n // Re-entrancy guard: block stale-second events from \\r\\n terminals.\r\n if (inputGateRef.current) return;\r\n\r\n // Some terminals emit \\r\\n for Enter as two separate stdin events.\r\n // \\r arrives with key.return=true (handled below); \\n may arrive as\r\n // a stray character with key.return=false. Normalize both to Enter\r\n // and prevent them from polluting the buffer as literal text.\r\n const isEnter = key.return || input === '\\r' || input === '\\n';\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 (isEnter) {\r\n inputGateRef.current = true;\r\n try {\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 } finally {\r\n inputGateRef.current = false;\r\n }\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 (isEnter) {\r\n const now = Date.now();\r\n if (now - lastEnterAtRef.current < 50) return;\r\n lastEnterAtRef.current = now;\r\n inputGateRef.current = true;\r\n const line = selectedSlashCommandLine(state.slashPicker);\r\n if (line) {\r\n void submit(line);\r\n } else {\r\n acceptSlashPickerSelection();\r\n }\r\n inputGateRef.current = false;\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 setDraft(`/${sel.name} `, 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 (isEnter) {\r\n inputGateRef.current = true;\r\n try {\r\n await acceptPickerSelection();\r\n } finally {\r\n inputGateRef.current = false;\r\n }\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 // Esc when the agent is busy = \"drop what you're doing, I want to\r\n // steer\". Aborts the current iteration, terminates any running\r\n // subagents (otherwise they keep burning tokens on now-stale work),\r\n // and stashes a context snapshot so the STEERING preamble can tell\r\n // the model exactly what it was mid-doing. Does NOT consume the\r\n // Ctrl+C exit ladder (interrupts counter untouched). When no run\r\n // is active, Esc falls through to normal text handling.\r\n if (key.escape && state.status !== 'idle' && state.confirmQueue.length === 0) {\r\n // Snapshot context BEFORE we mutate anything. The submit handler\r\n // replays this into the model prompt so the model isn't guessing.\r\n const runningTools = Array.from(state.runningTools.values()).map((t) => t.name);\r\n const subagents = Object.values(state.fleet)\r\n .filter((e) => e.status === 'running')\r\n .map((e) => ({\r\n label: e.name,\r\n status: e.status,\r\n tool: e.currentTool?.name,\r\n }));\r\n const subagentsTerminated = subagents.length;\r\n const partialAssistantText = streamingTextRef.current.slice(-1500);\r\n\r\n activeCtrlRef.current?.abort();\r\n dispatch({ type: 'status', status: 'aborting' });\r\n dispatch({\r\n type: 'steerStart',\r\n snapshot: {\r\n runningTools,\r\n subagents,\r\n subagentsTerminated,\r\n partialAssistantText,\r\n },\r\n });\r\n\r\n // Kill the fleet too. Without this the subagents keep running\r\n // on the old direction, finish minutes later, and pollute the\r\n // chat with task.completed events the model doesn't care about\r\n // anymore. Cap at 1.5s so a wedged bridge can't hang the steer.\r\n if (director && subagentsTerminated > 0) {\r\n const cap = new Promise<void>((resolve) => {\r\n const t = setTimeout(resolve, 1500);\r\n t.unref?.();\r\n });\r\n void Promise.race([director.terminateAll().catch(() => undefined), cap]);\r\n }\r\n\r\n // Drop anything queued — steering means the user is redirecting,\r\n // not adding to the backlog. Without this the queued items would\r\n // run *before* the steering message, which contradicts the UX.\r\n const droppedCount = state.queue.length;\r\n if (droppedCount > 0) dispatch({ type: 'queueClear' });\r\n const droppedTag = droppedCount > 0 ? ` · dropped ${droppedCount} queued` : '';\r\n const fleetTag =\r\n subagentsTerminated > 0\r\n ? ` · stopped ${subagentsTerminated} subagent${subagentsTerminated === 1 ? '' : 's'}`\r\n : '';\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'warn',\r\n text: `↯ Interrupted${droppedTag}${fleetTag}. Type your new direction.`,\r\n },\r\n });\r\n return;\r\n }\r\n\r\n if (isEnter) {\r\n // Re-entrancy protection for terminals that emit `\\r\\n` as two\r\n // separate stdin events: ignore Enter pressed within 50ms of the\r\n // last one. The 50ms window catches the double-event reliably\r\n // (the second `\\n` arrives within microseconds of the `\\r`) while\r\n // staying well below human double-tap speed.\r\n //\r\n // We intentionally do NOT await submit() here — it kicks off\r\n // agent.run() which can stay pending for minutes when a delegate\r\n // call is in flight. Awaiting would block this handler frame for\r\n // the full duration, which means every subsequent keystroke would\r\n // miss its dispatch (including the slash key — the user reported\r\n // the input feeling dead during delegated work). submit() handles\r\n // its own re-entrancy via state.status: when the agent is busy,\r\n // the message is queued instead of re-running concurrently.\r\n const now = Date.now();\r\n if (now - lastEnterAtRef.current < 50) return;\r\n lastEnterAtRef.current = now;\r\n void submit();\r\n return;\r\n }\r\n\r\n const { buffer, cursor } = draftRef.current;\r\n\r\n if (key.backspace || key.delete) {\r\n if (key.ctrl) {\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 = beforeCursor.slice(0, lastWordStart) + buffer.slice(cursor);\r\n setDraft(next, 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 setDraft(next, cursor);\r\n }\r\n return;\r\n }\r\n\r\n // Block-level backspace: if cursor is at end and buffer ends with a\r\n // placeholder pattern ([pasted #N] or [pasted]), delete the whole\r\n // placeholder and remove it from the placeholders list.\r\n if (key.backspace && cursor === buffer.length && state.placeholders.length > 0) {\r\n const BLOCK_PH_RE = /\\[pasted(?: #\\d+)?\\]$/;\r\n if (BLOCK_PH_RE.test(buffer)) {\r\n const newBuffer = buffer.replace(BLOCK_PH_RE, '').replace(/\\s+$/, '');\r\n dispatch({ type: 'removeLastPlaceholder' });\r\n setDraft(newBuffer, newBuffer.length);\r\n return;\r\n }\r\n }\r\n\r\n if (cursor === 0) return;\r\n const next = buffer.slice(0, cursor - 1) + buffer.slice(cursor);\r\n setDraft(next, cursor - 1);\r\n return;\r\n }\r\n\r\n if (key.leftArrow) {\r\n if (key.ctrl) {\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 setDraft(buffer, target);\r\n return;\r\n }\r\n if (cursor > 0) setDraft(buffer, cursor - 1);\r\n return;\r\n }\r\n if (key.rightArrow) {\r\n if (key.ctrl) {\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 setDraft(buffer, target);\r\n return;\r\n }\r\n if (cursor < buffer.length) setDraft(buffer, cursor + 1);\r\n return;\r\n }\r\n if (key.home) {\r\n setDraft(buffer, 0);\r\n return;\r\n }\r\n if (key.end) {\r\n setDraft(buffer, buffer.length);\r\n return;\r\n }\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 setDraft(buffer, 0);\r\n return;\r\n }\r\n if (key.ctrl && input === 'e') {\r\n setDraft(buffer, buffer.length);\r\n return;\r\n }\r\n if (key.ctrl && input === 'u') {\r\n setDraft('', 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 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 setDraft(next, lastWordStart);\r\n return;\r\n }\r\n\r\n // Delete key and Ctrl+D → delete character at cursor (forward delete).\r\n // Ctrl+D also doubles as \"EOF\" in some shells — here it's just convenient\r\n // forward-delete when the user isn't at the terminal's physical Delete key.\r\n if (key.delete || (key.ctrl && input === 'd')) {\r\n if (cursor >= buffer.length) return;\r\n const next = buffer.slice(0, cursor) + buffer.slice(cursor + 1);\r\n setDraft(next, cursor);\r\n return;\r\n }\r\n\r\n // Ctrl+K → kill: delete from cursor to end of line.\r\n if (key.ctrl && input === 'k') {\r\n if (cursor >= buffer.length) return;\r\n const next = buffer.slice(0, cursor);\r\n setDraft(next, cursor);\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 bracketed pastes\r\n // are routed through InputBuilder. Plain multi-line pastes (no bracket\r\n // sequence) are inserted as-is — without triggering the visual\r\n // \"[pasted #N N lines]\" placeholder — so the input stays a clean\r\n // single logical line while the content carries the newlines through\r\n // to the agent.\r\n if (bracketedPaste || cleanInput.length > PASTE_THRESHOLD_CHARS) {\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 if (cleanInput.includes('\\n')) {\r\n // Small paste with multiple lines — still show a placeholder.\r\n const lineCount = cleanInput.split('\\n').length;\r\n dispatch({ type: 'addPlaceholder', ph: `[pasted] (${lineCount} lines)` });\r\n } else {\r\n const next = buffer.slice(0, cursor) + cleanInput + buffer.slice(cursor);\r\n setDraft(next, cursor + cleanInput.length);\r\n }\r\n return;\r\n }\r\n\r\n // Plain multi-line paste (no bracket sequence, below paste threshold).\r\n // Strip newlines to spaces so the input row stays visually single-line.\r\n if (cleanInput.includes('\\n')) {\r\n const normalized = cleanInput.replace(/\\r?\\n/g, ' ');\r\n const next = buffer.slice(0, cursor) + normalized + buffer.slice(cursor);\r\n setDraft(next, cursor + normalized.length);\r\n return;\r\n }\r\n\r\n const next = buffer.slice(0, cursor) + cleanInput + buffer.slice(cursor);\r\n setDraft(next, 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 routed = blocks.some((block) => block.type === 'image')\r\n ? await routeImagesForModel(blocks, {\r\n supportsVision: supportsVision\r\n ? await supportsVision()\r\n : agent.ctx.provider.capabilities.vision,\r\n adapters: visionAdapters,\r\n ctx: agent.ctx,\r\n signal: ctrl.signal,\r\n providerId: agent.ctx.provider.id,\r\n model: agent.ctx.model,\r\n })\r\n : { blocks, route: 'none' as const, convertedImages: 0 };\r\n if (routed.route === 'adapter') {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'info',\r\n text: `Image input analyzed via ${routed.adapterName ?? 'vision adapter'} (${routed.convertedImages} image${routed.convertedImages === 1 ? '' : 's'}).`,\r\n },\r\n });\r\n }\r\n const result = await agent.run(routed.blocks, { signal: ctrl.signal });\r\n\r\n // Per-iteration assistant text was already committed by the\r\n // `provider.response` listener as each LLM call finished. Safety net:\r\n // if anything is still lingering in the synchronous ref (e.g. an\r\n // aborted run that never received a final provider.response), commit\r\n // it now so partial output is preserved rather than silently dropped.\r\n const lingering = streamingTextRef.current;\r\n if (lingering.trim()) {\r\n dispatch({ type: 'addEntry', entry: { kind: 'assistant', text: lingering } });\r\n }\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 // ── SDD Auto-Detection ──────────────────────────────────────────\r\n // Process AI output for spec, implementation plan, and task detection.\r\n if (result.status === 'done' && result.finalText && onSDDOutput) {\r\n try {\r\n const sddMessages = await onSDDOutput(result.finalText);\r\n for (const msg of sddMessages) {\r\n dispatch({ type: 'addEntry', entry: { kind: 'info', text: msg } });\r\n }\r\n } catch {\r\n // Non-fatal — SDD detection is best-effort\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 const runBlocksRef = useRef(runBlocks);\r\n runBlocksRef.current = runBlocks;\r\n\r\n /**\r\n * Eternal-mode driver. Loops `engine.runOneIteration()` until autonomy\r\n * flips away from 'eternal' or the engine reports stopped state. Each\r\n * iteration appends an info entry summarizing what happened so the TUI\r\n * timeline shows the engine's activity. Runs as a single sequential\r\n * consumer of `agent.run` — no race with user submissions because user\r\n * input is gated by `state.status` (a running iteration keeps status\r\n * at 'running' until the agent.run inside the engine returns).\r\n */\r\n const runEternalLoop = async (): Promise<void> => {\r\n const engine = getEternalEngine?.();\r\n if (!engine) return;\r\n // Avoid double-driving if the loop is already running. Status will\r\n // bounce idle↔running per iteration; the autonomy flag is the source\r\n // of truth for \"should we keep going\".\r\n if (eternalLoopRunningRef.current) return;\r\n eternalLoopRunningRef.current = true;\r\n try {\r\n while (true) {\r\n // Re-check the live state every iteration — /autonomy stop, SIGINT,\r\n // or /goal clear could have flipped it during the prior iteration.\r\n const liveMode = getAutonomy?.() ?? 'off';\r\n if (liveMode !== 'eternal') break;\r\n if (engine.currentState === 'stopped') break;\r\n dispatch({ type: 'status', status: 'running' });\r\n try {\r\n // Per-iteration entries land via the subscribeEternalIteration\r\n // useEffect below — we don't need to log here. Only surface\r\n // *errors* the engine catches but doesn't journal.\r\n await engine.runOneIteration();\r\n } catch (err) {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'error', text: `[eternal] ${err instanceof Error ? err.message : String(err)}` },\r\n });\r\n }\r\n dispatch({ type: 'status', status: 'idle' });\r\n // Yield so a slash command submitted between iterations (e.g.\r\n // /autonomy stop) actually lands before we kick the next one.\r\n await new Promise((r) => setTimeout(r, 200));\r\n }\r\n } finally {\r\n eternalLoopRunningRef.current = false;\r\n // Sync the displayed autonomy state with reality. The loop only exits\r\n // when getAutonomy() !== 'eternal' or engine.currentState === 'stopped',\r\n // both of which mean the mode is effectively off/idle. Refreshing here\r\n // stops the status bar from oscillating between \"● thinking…\" and\r\n // \"● idle\" forever after the goal is done.\r\n if (getAutonomy) {\r\n const finalMode = getAutonomy();\r\n if (finalMode !== autonomyLive) setAutonomyLive(finalMode);\r\n }\r\n }\r\n };\r\n const eternalLoopRunningRef = useRef(false);\r\n const runEternalLoopRef = useRef(runEternalLoop);\r\n runEternalLoopRef.current = runEternalLoop;\r\n\r\n /** Parallel-eternal driver — fan-out loop for the ParallelEternalEngine. */\r\n const runParallelLoop = async (): Promise<void> => {\r\n const engine = getParallelEngine?.();\r\n if (!engine) return;\r\n if (parallelLoopRunningRef.current) return;\r\n parallelLoopRunningRef.current = true;\r\n try {\r\n while (true) {\r\n const liveMode = getAutonomy?.() ?? 'off';\r\n if (liveMode !== 'eternal-parallel') break;\r\n if (engine.currentState === 'stopped') break;\r\n dispatch({ type: 'status', status: 'running' });\r\n try {\r\n await engine.runOneIteration();\r\n } catch (err) {\r\n dispatch({\r\n type: 'addEntry',\r\n entry: { kind: 'error', text: `[parallel] ${err instanceof Error ? err.message : String(err)}` },\r\n });\r\n }\r\n dispatch({ type: 'status', status: 'idle' });\r\n await new Promise((r) => setTimeout(r, 200));\r\n }\r\n } finally {\r\n parallelLoopRunningRef.current = false;\r\n if (getAutonomy) {\r\n const finalMode = getAutonomy();\r\n if (finalMode !== autonomyLive) setAutonomyLive(finalMode);\r\n }\r\n }\r\n };\r\n const parallelLoopRunningRef = useRef(false);\r\n const runParallelLoopRef = useRef(runParallelLoop);\r\n runParallelLoopRef.current = runParallelLoop;\r\n\r\n // Subscribe to live per-iteration events from the eternal engine. The\r\n // engine's loop drive (runEternalLoop above) emits \"iteration completed\"\r\n // info entries, but those are coarse — this subscription surfaces the\r\n // *actual* journal entry per iteration with source, status, and cost.\r\n // Without it the TUI timeline only shows one-line summaries; with it the\r\n // user sees `#42 ✓ [todo] refactor parser ($0.0034)`.\r\n useEffect(() => {\r\n if (!subscribeEternalIteration) return;\r\n const unsub = subscribeEternalIteration((entry) => {\r\n const mark = entry.status === 'success' ? '✓' : entry.status === 'failure' ? '✗' : entry.status === 'aborted' ? '⊘' : '·';\r\n const cost = typeof entry.costUsd === 'number' ? ` ($${entry.costUsd.toFixed(4)})` : '';\r\n const note = entry.note ? ` — ${entry.note.slice(0, 80)}` : '';\r\n const text = `#${entry.iteration} ${mark} [${entry.source}] ${entry.task}${cost}${note}`;\r\n dispatch({ type: 'addEntry', entry: { kind: 'info', text } });\r\n });\r\n return unsub;\r\n }, [subscribeEternalIteration]);\r\n\r\n const submit = async (overrideRaw?: string) => {\r\n const raw = overrideRaw ?? draftRef.current.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 const pushSubmittedHistory = () => {\r\n if (trimmed) dispatch({ type: 'historyPush', text: trimmed });\r\n };\r\n if (trimmed === '/image' || trimmed === '/paste-image') {\r\n pushSubmittedHistory();\r\n clearDraft();\r\n await pasteClipboardImage();\r\n return;\r\n }\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 pushSubmittedHistory();\r\n clearDraft();\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 (getYolo) {\r\n const currentYolo = getYolo();\r\n if (currentYolo !== yoloLive) setYoloLive(currentYolo);\r\n }\r\n if (getAutonomy) {\r\n const currentAutonomy = getAutonomy();\r\n if (currentAutonomy !== autonomyLive) setAutonomyLive(currentAutonomy);\r\n // When /autonomy eternal lands, kick off the engine-driven loop.\r\n // Fire-and-forget — the loop runs until autonomy flips away from\r\n // 'eternal' or the engine's currentState goes !== 'running'.\r\n // Without this, the slash command would set the flag but the\r\n // TUI would just sit at the prompt waiting for user input.\r\n if (currentAutonomy === 'eternal' && getEternalEngine) {\r\n void runEternalLoopRef.current();\r\n }\r\n if (currentAutonomy === 'eternal-parallel' && getParallelEngine) {\r\n void runParallelLoopRef.current();\r\n }\r\n }\r\n if (res?.exit) {\r\n exit();\r\n onExit(0);\r\n }\r\n // `runText` lets a slash command queue a follow-up user-role\r\n // message (used by `/steer <text>` to send the STEERING\r\n // preamble + new direction as if the user had typed it).\r\n // Run AFTER the message is rendered so the user sees the\r\n // slash result before the model's response streams.\r\n if (res?.runText) {\r\n const b = builderRef.current;\r\n if (b) {\r\n b.appendText(res.runText);\r\n const blocks = await b.submit();\r\n // Wait briefly for any in-flight abort to settle into\r\n // 'idle' before kicking the next iteration — otherwise\r\n // runBlocks would early-return on the busy guard.\r\n const start = Date.now();\r\n while (stateRef.current.status !== 'idle' && Date.now() - start < 1500) {\r\n await new Promise((r) => setTimeout(r, 25));\r\n }\r\n await runBlocks(blocks);\r\n }\r\n }\r\n // Only fire onClearHistory for `/clear` — without this gate every\r\n // slash command (`/model`, `/use`, `/help`, …) would wipe the\r\n // conversation. Match the command name segment, not just the\r\n // prefix, so `/clearfoo` doesn't trigger.\r\n const cmd = trimmed.slice(1).split(/\\s+/, 1)[0];\r\n if (cmd === 'clear') {\r\n onClearHistory?.(dispatch);\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 // Steering inject: if the user pressed Esc on the prior iteration,\r\n // prepend a STEERING preamble so the model sees this isn't a\r\n // follow-up — it's an interrupt redirecting the work. The preamble\r\n // carries (a) context the model would otherwise have to guess\r\n // (what tools were running, what subagents were live) and (b)\r\n // explicit authority — \"drop the prior plan, respawn subagents\r\n // if useful, ask for clarification if needed\". Plain user-role\r\n // text so accountability stays with the human who triggered it.\r\n const steering = state.steeringPending;\r\n\r\n // ── SDD Context Injection ──────────────────────────────────────────\r\n // When an SDD session is active, prepend the session context so the\r\n // model knows it's in a spec-building conversation.\r\n const sddContext = getSDDContext?.();\r\n if (sddContext && trimmed) {\r\n builder.appendText(`[SDD SESSION ACTIVE]\\n${sddContext}\\n\\n---\\nUser message:\\n`);\r\n }\r\n\r\n if (trimmed) {\r\n const toAppend = steering ? buildSteeringPreamble(state.steerSnapshot, trimmed) : trimmed;\r\n builder.appendText(toAppend);\r\n }\r\n if (steering) dispatch({ type: 'steerConsume' });\r\n // The user sees their original text + a visual ↯ marker when\r\n // steering, not the full preamble — keeps the chat readable while\r\n // the model still gets the explicit instruction.\r\n const displayText = trimmed ? (steering ? `↯ ${trimmed}` : trimmed) : '(attachments only)';\r\n pushSubmittedHistory();\r\n clearDraft();\r\n const blocks = await builder.submit();\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 return;\r\n }\r\n\r\n dispatch({ type: 'addEntry', entry: { kind: 'user', text: displayText } });\r\n await runBlocks(blocks);\r\n };\r\n\r\n // ─── --goal / --ask boot inject ─────────────────────────────────────\r\n // The CLI may pass `--goal \"...\"` or `--ask \"...\"` to pre-populate the\r\n // very first turn. `initialGoal` wraps the text in the GOAL preamble so\r\n // the model lands in autonomous goal mode; `initialAsk` submits the text\r\n // verbatim (handy for scripted shell aliases). Both fire one-shot via a\r\n // mount-time ref guard so a re-render can't double-submit. We wait a tick\r\n // for the input builder to settle, then push directly into runBlocks —\r\n // bypassing the slash registry / submit() path keeps the boot path\r\n // self-contained even if user-installed slash commands haven't mounted\r\n // their effects yet.\r\n const bootInjectedRef = useRef(false);\r\n useEffect(() => {\r\n if (bootInjectedRef.current) return;\r\n bootInjectedRef.current = true;\r\n const goal = initialGoal?.trim();\r\n const ask = initialAsk?.trim();\r\n if (!goal && !ask) return;\r\n void (async () => {\r\n // Give the banner a frame to render first so the user sees the\r\n // greeting before the first turn streams over the top of it.\r\n await new Promise((r) => setTimeout(r, 50));\r\n const b = builderRef.current;\r\n if (!b) return;\r\n if (goal) {\r\n const shortGoal = goal.length > 80 ? `${goal.slice(0, 80)}…` : goal;\r\n dispatch({\r\n type: 'addEntry',\r\n entry: {\r\n kind: 'info',\r\n text: `🎯 Goal locked: ${shortGoal}\\n Agent will work until verifiably complete. Esc / /steer to redirect, Ctrl+C to stop.`,\r\n },\r\n });\r\n b.appendText(buildGoalPreamble(goal));\r\n } else if (ask) {\r\n dispatch({ type: 'addEntry', entry: { kind: 'user', text: ask } });\r\n b.appendText(ask);\r\n }\r\n const blocks = await b.submit();\r\n await runBlocksRef.current(blocks);\r\n })();\r\n }, [initialAsk, initialGoal]);\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\r\n entries={state.entries}\r\n streamingText={state.streamingText}\r\n toolStream={state.toolStream}\r\n />\r\n {/* Live activity strip — one line per running subagent with\r\n current tool + elapsed timer. Sits directly above the input\r\n area so it's always visible without scrolling. Renders\r\n nothing when no subagents are running. */}\r\n <LiveActivityStrip entries={state.fleet} nowTick={nowTick} />\r\n <Input\r\n value={state.buffer}\r\n cursor={state.cursor}\r\n placeholders={state.placeholders}\r\n disabled={state.status === 'aborting' || state.confirmQueue.length > 0}\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.rewindOverlay ? (\r\n <CheckpointTimeline\r\n checkpoints={state.rewindOverlay.checkpoints}\r\n selected={state.rewindOverlay.selected}\r\n onSelect={(i) => dispatch({ type: 'rewindOverlayMove', delta: i - state.rewindOverlay!.selected })}\r\n onConfirm={(i) => handleRewindTo(state.rewindOverlay!.checkpoints[i]!.promptIndex)}\r\n onClose={() => dispatch({ type: 'rewindOverlayClose' })}\r\n />\r\n ) : null}\r\n {state.confirmQueue.length > 0 && (() => {\r\n const head = state.confirmQueue[0]!;\r\n let resolved = false;\r\n return (\r\n <ConfirmPrompt\r\n toolName={head.toolName}\r\n input={head.input}\r\n suggestedPattern={head.suggestedPattern}\r\n onDecision={(decision) => {\r\n if (resolved) return;\r\n resolved = true;\r\n head.resolve(decision);\r\n dispatch({ type: 'confirmClose' });\r\n }}\r\n />\r\n );\r\n })()}\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={yoloLive}\r\n autonomy={autonomyLive}\r\n elapsedMs={elapsedMs}\r\n todos={todos}\r\n plan={planCounts ?? undefined}\r\n fleet={fleetCounts}\r\n fleetAgents={fleetAgents}\r\n git={gitInfo}\r\n context={contextWindow}\r\n projectName={projectName}\r\n subagentCount={Object.keys(state.fleet).length}\r\n processCount={getProcessRegistry().activeCount}\r\n hiddenItems={hiddenItems}\r\n />\r\n {director ? (\r\n <FleetPanel entries={state.fleet} totalCost={state.fleetCost} roster={fleetRoster} />\r\n ) : null}\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 type {\n Agent,\n AttachmentStore,\n Director,\n EventBus,\n FleetBus,\n FleetUsageAggregator,\n QueueStore,\n SlashCommandRegistry,\n TokenCounter,\n} from '@wrongstack/core';\nimport type { VisionAdapters } from '@wrongstack/runtime/vision';\nimport { render } from 'ink';\nimport React from 'react';\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 visionAdapters?: VisionAdapters;\n /** Resolve current model vision support. Falls back to provider capability when omitted. */\n supportsVision?: () => boolean | Promise<boolean>;\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 /** Query live YOLO state from the permission policy. */\n getYolo?: () => boolean;\n /** Query the live autonomy mode. */\n getAutonomy?: () => 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel';\n /**\n * Access the eternal-autonomy engine. When autonomy mode flips to\n * 'eternal' the TUI drives `runOneIteration()` from the post-slash hook\n * so the engine and TUI never race for the shared Context.\n */\n getEternalEngine?: () => import('@wrongstack/core').EternalAutonomyEngine | null;\n /**\n * Access the parallel-eternal engine. When autonomy mode flips to\n * 'eternal-parallel' the TUI drives `runOneIteration()` from the post-slash\n * hook so the engine and TUI never race for the shared Context.\n */\n getParallelEngine?: () => import('@wrongstack/core').ParallelEternalEngine | null;\n /**\n * Subscribe to live per-iteration events from the eternal engine.\n * Returns an unsubscribe function. TUI uses this to render each\n * iteration as a live timeline entry as it lands.\n */\n subscribeEternalIteration?: (\n fn: (entry: import('@wrongstack/core').JournalEntry) => void,\n ) => () => void;\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 — native scrollback stays live so chat history is\n * scrollable via mouse wheel / Shift+PgUp, which matches the user's\n * \"this is a chat app, let me scroll the chat\" intuition. Pass true\n * (or run with `--alt-screen`) for the full-screen mode that owns the\n * terminal and prevents resize/overlay leaks of the live region —\n * trade-off is that the terminal's native scrollback is suspended\n * while the TUI is up and only what's currently on screen is visible.\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 /** Called from /clear so the TUI can wipe its history entries while agent.ctx + memory are cleared separately. */\n onClearHistory?: (\n dispatch: React.Dispatch<{ type: 'clearHistory' } | { type: 'resetContextChip' }>,\n ) => void;\n\n // --- Fleet surface (director mode) ---\n\n /**\n * Live director instance. When set, the TUI renders a fleet panel\n * showing every spawned subagent, its current task, streaming output,\n * and runtime cost — updated live from the FleetBus. Pass null or omit\n * when multi-agent / director mode is disabled.\n */\n director?: Director | null;\n /**\n * Optional roster reference for resolving subagent role ids to\n * human-readable names. Same value passed to director.tools().\n */\n fleetRoster?: Record<string, { name: string }>;\n /**\n * Shared controller for the `/fleet stream on|off` toggle. The slash\n * command runs in the CLI process and needs to flip TUI reducer state;\n * the App installs a dispatch-backed `setEnabled` here on mount so\n * both sides stay synchronized.\n */\n /**\n * Shared controller for the `/fleet stream on|off` toggle. The slash\n * command runs in the CLI process and needs to flip TUI reducer state;\n * the App installs a dispatch-backed `setEnabled` here on mount so\n * both sides stay synchronized.\n */\n fleetStreamController?: {\n enabled: boolean;\n setEnabled: (enabled: boolean) => void;\n };\n /**\n * Controller for status bar hidden items. App installs a dispatch-backed\n * setter on mount so the /statusline slash command can update the TUI's\n * visible bar without a round-trip. The initial value is loaded from\n * the config file before App mounts.\n */\n statuslineHiddenItems: Array<'todos' | 'plan' | 'fleet' | 'git' | 'elapsed' | 'context' | 'cost'>;\n setStatuslineHiddenItems: (items: Array<'todos' | 'plan' | 'fleet' | 'git' | 'elapsed' | 'context' | 'cost'>) => void;\n\n /**\n * If set, the App boots straight into goal mode — the text is wrapped\n * in the GOAL preamble and submitted as the first turn. Lets users\n * launch directly from the shell:\n * wstack --tui --director --goal \"audit packages/core for races\"\n * The chat shows a one-line \"🎯 Goal locked: …\" hint; the actual\n * preamble is hidden from the visible history (same as `/goal`).\n */\n initialGoal?: string;\n /**\n * If set, submitted as the first turn verbatim (no preamble). Mainly\n * for scripted shell aliases — `wstack --tui --ask \"summarize foo.md\"`\n * — that want one turn pre-populated without the goal-mode framing.\n * Ignored when `initialGoal` is also set.\n */\n initialAsk?: string;\n /**\n * Directory containing session JSONL files. Required for rewind\n * functionality. When provided the TUI can list checkpoints and\n * trigger a rewind via `/rewind` or Ctrl+R.\n */\n sessionsDir?: string;\n /**\n * SDD session context getter. When an SDD session is active, returns\n * the AI prompt context to inject into user messages.\n */\n getSDDContext?: () => string | null;\n /**\n * Process AI output for SDD auto-detection (spec, tasks, plan).\n * Returns displayable status messages.\n */\n onSDDOutput?: (output: string) => Promise<string[]>;\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 // Take over EVERY keystroke. Raw mode (Ink turns this on when render\n // mounts) already disables ICANON/ECHO/ISIG/IXON on Linux+macOS, so\n // Ctrl+C/Z/\\\\/S/Q arrive as input bytes instead of generating\n // signals or being eaten by the terminal driver. Belt-and-suspenders:\n // install no-op handlers for the suspend/quit signals just in case\n // some shell or terminal still surfaces them — without these, a\n // stray Ctrl+Z could background the TUI mid-session.\n const swallowSignals: NodeJS.Signals[] = ['SIGTSTP', 'SIGQUIT', 'SIGTTIN', 'SIGTTOU'];\n const swallow = () => {};\n for (const s of swallowSignals) {\n try {\n process.on(s, swallow);\n } catch {\n // Signal not supported on this platform (Windows ignores most of\n // these). Safe to skip — there's nothing for the terminal to\n // deliver in the first place.\n }\n }\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 for (const s of swallowSignals) {\n try {\n process.off(s, swallow);\n } catch {\n // ignore — see install site\n }\n }\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 visionAdapters: opts.visionAdapters,\n supportsVision: opts.supportsVision,\n model: opts.model,\n banner: opts.banner ?? true,\n queueStore: opts.queueStore,\n yolo: opts.yolo,\n getYolo: opts.getYolo,\n getAutonomy: opts.getAutonomy,\n getEternalEngine: opts.getEternalEngine,\n getParallelEngine: opts.getParallelEngine,\n subscribeEternalIteration: opts.subscribeEternalIteration,\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 director: opts.director ?? null,\n fleetRoster: opts.fleetRoster,\n onClearHistory: opts.onClearHistory\n ? (dispatch) => opts.onClearHistory!(dispatch)\n : undefined,\n fleetStreamController: opts.fleetStreamController,\n statuslineHiddenItems: opts.statuslineHiddenItems,\n setStatuslineHiddenItems: opts.setStatuslineHiddenItems,\n initialGoal: opts.initialGoal,\n initialAsk: opts.initialAsk,\n getSDDContext: opts.getSDDContext,\n onSDDOutput: opts.onSDDOutput,\n sessionsDir: opts.sessionsDir,\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 // Non-altScreen mode: terminal reflows visible text on resize BEFORE\n // Ink can react, which leaks one or more lines of the live region\n // (input prompt, status bar) into native scrollback. We can't recover\n // what the terminal already pushed up, but we CAN ensure no leftover\n // ghosts persist below the cursor by erasing from-cursor-to-end on\n // every resize. Combined with Ink's automatic re-render on resize,\n // this minimizes the artifact to (at most) the lines the terminal\n // itself pushed up at the moment of the resize event.\n //\n // For users doing heavy resize / split-pane workflows, --alt-screen\n // is the bullet-proof fix: Ink renders into a separate screen buffer\n // that has no native scrollback, so terminal-side reflow can't push\n // anything anywhere. Trade-off documented in tui/README.md.\n let detachResize: (() => void) | null = null;\n if (!useAltScreen) {\n const onResize = () => {\n try {\n // \\x1b[J = erase from cursor to end of screen. Does NOT touch\n // anything above the cursor, so committed Static history in\n // scrollback is preserved. Ink's useStdout subscriber will\n // immediately re-render the live region at the new width, and\n // log-update's stale line-count tracker gets a clean slate to\n // draw onto.\n stdout.write('\\x1b[J');\n } catch {\n // stdout might be detached mid-shutdown — ignore.\n }\n };\n stdout.on('resize', onResize);\n detachResize = () => stdout.off('resize', onResize);\n }\n\n instance\n .waitUntilExit()\n .then(() => {\n detachResize?.();\n settle(exitCode);\n })\n .catch(() => {\n detachResize?.();\n settle(1);\n });\n });\n}\n"]}
|