@wrongstack/tui 0.51.3 → 0.54.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +102 -14
- 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/theme.ts","../src/components/status-bar.tsx","../src/components/fleet-monitor.tsx","../src/components/agents-monitor.tsx","../src/components/autonomy-picker.tsx","../src/components/brain-decision-prompt.tsx","../src/components/checkpoint-timeline.tsx","../src/components/confirm-prompt.tsx","../src/components/file-picker.tsx","../src/components/fleet-panel.tsx","../src/components/help-overlay.tsx","../src/highlight.ts","../src/markdown-table.ts","../src/markdown.tsx","../src/components/history.tsx","../src/fn-keys.ts","../src/input-tokens.ts","../src/components/input.tsx","../src/components/key-hint-bar.tsx","../src/components/live-activity-strip.tsx","../src/components/model-picker.tsx","../src/components/phase-monitor.tsx","../src/components/phase-panel.tsx","../src/components/scrollable-history.tsx","../src/components/settings-picker.tsx","../src/components/slash-menu.tsx","../src/components/worktree-monitor.tsx","../src/components/worktree-panel.tsx","../src/file-search.ts","../src/git-info.ts","../src/kill-slash.ts","../src/paste-accumulator.ts","../src/ps-slash.ts","../src/queue-slash.ts","../src/app.tsx","../src/mouse.ts","../src/terminal-title.ts","../src/run-tui.ts"],"names":["cache","s","jsxs","Box","jsx","Text","Fragment","STATUS","fmtTokens","oneLine","useInput","React","input","path","useStdout","useState","useEffect","sep","ToolStreamBox","Entry","fmtTok","riskColor","snippet","renderRow","fmtElapsed","fmtBytes","LiveActivityStrip","st","fs","renderList","getProcessRegistry","USAGE","parts","base","next","useRef","measureElement","firstItemRow","index","writeOut","maxContext","dispatch","killed","buffer","cursor","blocks"],"mappings":"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","file":"index.js","sourcesContent":["// Central TUI palette. Until now colors were hardcoded as Ink color names\n// (`color=\"cyan\"`, `borderColor=\"magenta\"`, …) scattered across ~18\n// components, so there was no single place to tune the look. This module is\n// that place: semantic tokens whose *values* are the Ink color names already\n// in use, so adopting it is a pure rename with zero visual change. Re-skinning\n// later is then a one-line edit here that propagates everywhere.\n//\n// Values are Ink color names (https://github.com/vadimdemedes/ink#color) — any\n// of the 16 ANSI names, `gray`, the *Bright variants, or a hex/rgb string.\n\nexport interface Theme {\n /** Primary accent — prompts, links, tool names, assistant label. */\n accent: string;\n /** USER: label + the user's own message text marker. */\n user: string;\n /** ASSISTANT: label. */\n assistant: string;\n /** Tool name / tool activity. */\n tool: string;\n /** Success states (✓, passing, added diff lines). */\n success: string;\n /** Warnings, queued items, the user-input label. */\n warn: string;\n /** Errors, failures, deleted diff lines, danger chips. */\n error: string;\n /** Muted/secondary text. `true` maps to Ink's `dimColor`; a color name also works. */\n dim: true | string;\n /** Default (quiet) border color for panels. */\n borderDefault: string;\n /** Active/attention border (confirm prompts, focused frames). */\n borderActive: string;\n /** Banner / brand accent. */\n brand: string;\n /** Per-monitor accent borders so each overlay has a distinct identity. */\n monitor: {\n fleet: string;\n agents: string;\n worktree: string;\n phase: string;\n };\n /** Diff add/delete background blocks (content highlight). */\n diffAddBg: string;\n diffDelBg: string;\n}\n\n// Single tuned dark palette. The values intentionally mirror the colors already\n// hardcoded today (cyan/yellow/green/red/magenta), so the first adoption pass is\n// visually identical. A second palette can be added later as a drop-in; we keep\n// the shape (a `Theme`) ready for that without paying the tuning cost now.\nexport const theme: Theme = Object.freeze({\n accent: 'cyan',\n user: 'yellow',\n assistant: 'cyan',\n tool: 'cyan',\n success: 'green',\n warn: 'yellow',\n error: 'red',\n dim: true,\n borderDefault: 'gray',\n borderActive: 'yellow',\n brand: 'magenta',\n monitor: {\n fleet: 'cyan',\n agents: 'magenta',\n worktree: 'green',\n phase: 'cyan',\n },\n diffAddBg: 'greenBright',\n diffDelBg: 'redBright',\n});\n","import type { TokenCounter } from '@wrongstack/core';\nimport { Box, Text, useStdout } from 'ink';\nimport type React from 'react';\nimport { useEffect, useState } from 'react';\nimport type { GitInfo } from '../git-info.js';\nimport { theme } from '../theme.js';\n\n/** Minimum terminal width before we switch to ultra-compact mode. */\nconst COMPACT_THRESHOLD = 50;\n/** Above this width, show most available information. */\nconst COMFORTABLE_THRESHOLD = 90;\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 /** Current/last tool the subagent invoked, shown as its live action. */\n tool?: string;\n /** Cumulative budget auto-extensions granted — rendered as \"⚡×N\". */\n extensions?: number;\n}\n\nexport interface BrainStatusChip {\n state: 'idle' | 'deciding' | 'answered' | 'ask_human' | 'denied';\n source?: string;\n risk?: 'low' | 'medium' | 'high' | 'critical';\n summary?: string;\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\ntype SerialAutonomyStage =\n | { phase: 'idle' }\n | { phase: 'decide'; reason: string }\n | { phase: 'execute'; task: string }\n | { phase: 'reflect'; status: 'success' | 'failure' | 'aborted' | 'skipped'; note?: string }\n | { phase: 'sleep'; ms: number }\n | { phase: 'paused' }\n | { phase: 'stopped' }\n | { phase: 'error'; message: string };\n\ntype ParallelAutonomyStage =\n | { phase: 'idle' }\n | { phase: 'decompose' }\n | { phase: 'fanout'; slots: number }\n | { phase: 'await'; taskIds: string[] }\n | { phase: 'aggregate'; successCount: number; total: number; goalComplete: boolean }\n | { phase: 'sleep'; ms: number }\n | { phase: 'stopped' }\n | { phase: 'error'; message: string };\n\ntype AutonomyStage = SerialAutonomyStage | ParallelAutonomyStage;\n\nexport interface StatusBarProps {\n model: string;\n /**\n * App version string (e.g. \"0.7.0\"). When set, renders a compact\n * `WS v0.7.0` chip at the head of line 1 so the running build is always\n * visible, not just in the startup banner.\n */\n version?: 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 /** Live Brain arbiter state, shown as a compact work chip when active/recent. */\n brain?: BrainStatusChip;\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 * Live iteration stage from the active autonomy engine. When set, renders\n * a chip like `⏸ decide` or `▶ execute(todo:fix-auth)` next to the\n * autonomy chip on line 2.\n */\n eternalStage?: AutonomyStage | null;\n /** Active goal summary for startup banner display. */\n goalSummary?: {\n goal: string;\n goalState: 'active' | 'paused' | 'completed' | 'abandoned';\n iterations: number;\n lastTask?: string;\n lastStatus?: string;\n } | null;\n /**\n * Seconds remaining in the auto-proceed countdown. null = not counting.\n * Rendered as a chip on line 2 when non-null.\n */\n autoProceedCountdown?: number | null;\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 version,\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 brain,\n projectName,\n processCount,\n hiddenItems,\n eternalStage,\n goalSummary,\n}: StatusBarProps): React.ReactElement {\n // Track terminal width so we can adapt layout on narrow terminals.\n // We snapshot into state so that renders are stable — we don't want\n // the live-region to churn on every resize event during active streaming.\n const { stdout } = useStdout();\n const [termWidth, setTermWidth] = useState(stdout?.columns ?? 90);\n useEffect(() => {\n const handleResize = () => setTermWidth(stdout?.columns ?? 90);\n handleResize(); // snapshot immediately\n process.stdout.on('resize', handleResize);\n return () => {\n process.stdout.off('resize', handleResize);\n };\n }, [stdout]);\n\n const isCompact = termWidth < COMPACT_THRESHOLD;\n const isComfortable = termWidth >= COMFORTABLE_THRESHOLD;\n const hiddenSet = new Set(hiddenItems);\n const usage = tokenCounter?.total();\n const cost = tokenCounter?.estimateCost();\n const cache = tokenCounter?.cacheStats();\n const { label: stateLabel, color: stateColor } = stateChip(state, fleet?.running ?? 0);\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 (goalSummary !== null && goalSummary !== undefined);\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 && (fleet.running > 0 || fleet.idle > 0 || fleet.pending > 0 || fleet.completed > 0)) ||\n subagentCount > 0;\n const hasBrainActivity = !!brain && brain.state !== 'idle';\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 hasBrainActivity;\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 {/* Line 1: Essential runtime info. Compact mode shows only state + model. */}\n <Box flexDirection=\"row\" gap={2}>\n {isCompact ? (\n // Ultra-compact: state · model\n <>\n <Text color={stateColor}>●{stateLabel}</Text>\n <Text dimColor>·</Text>\n <Text color=\"magenta\">{model}</Text>\n </>\n ) : (\n // Full mode: version · state · model · context · tokens · cost · queue · processes · hint\n <>\n {version ? (\n <>\n <Text>\n <Text color=\"blue\" bold>\n WS\n </Text>\n <Text dimColor> v{version}</Text>\n </Text>\n <Text dimColor>│</Text>\n </>\n ) : null}\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 && isComfortable ? (\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 && isComfortable ? (\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\">\n ⚡ {processCount} process{processCount === 1 ? '' : 'es'}\n </Text>\n </>\n ) : null}\n {hint ? (\n <>\n <Text dimColor>│</Text>\n <Text dimColor>{hint}</Text>\n </>\n ) : null}\n </>\n )}\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={autonomy === 'eternal' ? 'red' : autonomy === 'auto' ? 'yellow' : 'cyan'}\n bold\n >\n ∞ {autonomy.toUpperCase()}\n </Text>\n </>\n ) : null}\n {eternalStage ? (\n <>\n {yolo || (autonomy && autonomy !== 'off') ? <Text dimColor>│</Text> : null}\n <EternalStageChip stage={eternalStage} />\n </>\n ) : null}\n {elapsedMs !== undefined && !hiddenSet.has('elapsed') ? (\n <>\n {yolo || (autonomy && autonomy !== 'off') || eternalStage ? (\n <Text dimColor>│</Text>\n ) : 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 {goalSummary ? (\n <>\n {yolo || elapsedMs !== undefined || projectName ? <Text dimColor>│</Text> : null}\n <Text\n color={\n goalSummary.goalState === 'active'\n ? 'green'\n : goalSummary.goalState === 'paused'\n ? 'yellow'\n : goalSummary.goalState === 'completed'\n ? 'green'\n : 'dim'\n }\n >\n 🎯{' '}\n {goalSummary.goal.length > 40\n ? `${goalSummary.goal.slice(0, 37)}…`\n : goalSummary.goal}{' '}\n [{goalSummary.goalState}] (iter {goalSummary.iterations})\n </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 {hasBrainActivity && brain ? (\n <>\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 <Text dimColor>│</Text>\n ) : null}\n <BrainChip brain={brain} />\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 {a.tool ? (\n <>\n <Text dimColor>{' · '}</Text>\n <Text color=\"cyan\">{a.tool}</Text>\n </>\n ) : null}\n {a.extensions && a.extensions > 0 ? (\n <>\n <Text dimColor>{' · '}</Text>\n <Text color=\"yellow\">⚡×{a.extensions}</Text>\n </>\n ) : null}\n </Text>\n ))}\n </Box>\n ) : null}\n </Box>\n );\n}\n\nfunction BrainChip({ brain }: { brain: BrainStatusChip }): React.ReactElement {\n const color =\n brain.state === 'denied'\n ? 'red'\n : brain.state === 'ask_human'\n ? 'yellow'\n : brain.state === 'deciding'\n ? 'magenta'\n : 'cyan';\n const label =\n brain.state === 'deciding' ? 'deciding' : brain.state === 'ask_human' ? 'human' : brain.state;\n const scope = brain.source ? ` ${brain.source}` : '';\n const summary = brain.summary ? ` · ${brain.summary.slice(0, 40)}` : '';\n return (\n <Text color={color}>\n 🧠 {label}\n <Text dimColor>{scope}</Text>\n <Text dimColor>{summary}</Text>\n </Text>\n );\n}\n\nfunction EternalStageChip({\n stage,\n}: {\n stage: NonNullable<StatusBarProps['eternalStage']>;\n}): React.ReactElement {\n switch (stage.phase) {\n case 'idle':\n return <Text dimColor>⬜ idle</Text>;\n case 'decide':\n return <Text color=\"cyan\">⬇ decide: {stage.reason}</Text>;\n case 'execute':\n return (\n <Text color=\"green\">\n ▶ <Text bold>execute</Text>\n {stage.task ? `(${stage.task})` : ''}\n </Text>\n );\n case 'reflect':\n return (\n <Text\n color={\n stage.status === 'success' ? 'green' : stage.status === 'failure' ? 'red' : 'yellow'\n }\n >\n ↩ reflect: {stage.status}\n </Text>\n );\n case 'decompose':\n return <Text color=\"cyan\">⬇ decompose</Text>;\n case 'fanout':\n return <Text color=\"magenta\">⇄ fanout: {stage.slots}</Text>;\n case 'await':\n return <Text color=\"magenta\">⏳ await: {stage.taskIds.length}</Text>;\n case 'aggregate':\n return (\n <Text color={stage.goalComplete ? 'green' : 'magenta'}>\n ↩ aggregate: {stage.successCount}/{stage.total}\n </Text>\n );\n case 'sleep':\n return <Text dimColor>💤 sleep {Math.round(stage.ms / 1000)}s</Text>;\n case 'paused':\n return <Text color=\"yellow\">⏸ paused</Text>;\n case 'stopped':\n return <Text dimColor>■ stopped</Text>;\n case 'error':\n return <Text color=\"red\">⚠ error: {stage.message}</Text>;\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 ? theme.error : ratio >= 0.65 ? theme.warn : theme.accent;\n return (\n <Text>\n <Text dimColor>ctx </Text>\n <Text color={color}>{renderMeter(ratio, 12)}</Text>\n <Text color={color} bold>\n {' '}\n {pct}%\n </Text>\n <Text dimColor>\n {' '}\n {fmtTok(ctx.used)}/{fmtTok(ctx.max)}\n </Text>\n </Text>\n );\n}\n\n/**\n * Compute the leading state chip (label + Ink color) for the status bar.\n *\n * The foreground loop reports 'idle' between turns, but background subagents\n * can still be running — e.g. between eternal/parallel autonomy iterations,\n * or a fleet spawned outside a foreground run. Showing plain \"idle\" then is\n * misleading, so when `fleetRunning > 0` and the foreground is idle we surface\n * the live agent count (`agents ▶N`) in a distinct color instead.\n */\n// Layout constants shared by the status-bar span helpers below — they MUST\n// mirror the `<Box gap={2} paddingX={1}>` rows rendered above so the TUI mouse\n// hit-test lands on the right chip.\nconst SB_GAP = 2;\nconst SB_PADX = 1;\n\n/**\n * 0-based column span (offset from the box's left edge, including the left\n * paddingX) of the `{provider}/{model}` chip on status-bar line 1. The TUI\n * mouse handler uses it to make the model chip clickable (→ open model\n * picker). Mirrors the line-1 flex layout: optional `WS v…` chip + `│`, then\n * `● {stateLabel}` + `│`, then the model.\n */\nexport function statusBarModelSpan(opts: {\n version?: string;\n state: 'idle' | 'running' | 'streaming' | 'aborting';\n fleetRunning?: number;\n model: string;\n}): { start: number; len: number } {\n let col = SB_PADX;\n if (opts.version) {\n col += `WS v${opts.version}`.length + SB_GAP; // WS chip\n col += 1 + SB_GAP; // │ separator\n }\n const { label } = stateChip(opts.state, opts.fleetRunning ?? 0);\n col += 2 + label.length + SB_GAP; // \"● \" + label\n col += 1 + SB_GAP; // │ separator\n return { start: col, len: opts.model.length };\n}\n\n/**\n * 0-based column span of the `∞ MODE` autonomy chip on status-bar line 2, or\n * null when it isn't shown (autonomy off/unset). When YOLO is on it precedes\n * the autonomy chip (plus a `│` separator), so the span shifts right.\n */\nexport function statusBarAutonomySpan(opts: {\n yolo?: boolean;\n autonomy?: 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel';\n}): { start: number; len: number } | null {\n if (!opts.autonomy || opts.autonomy === 'off') return null;\n let col = SB_PADX;\n if (opts.yolo) {\n col += '⚠ YOLO'.length + SB_GAP;\n col += 1 + SB_GAP; // │ separator\n }\n return { start: col, len: 2 + opts.autonomy.toUpperCase().length }; // \"∞ \" + MODE\n}\n\nexport function stateChip(\n state: 'idle' | 'running' | 'streaming' | 'aborting',\n fleetRunning: number,\n): { label: string; color: string } {\n if (state === 'idle' && fleetRunning > 0) {\n return { label: `agents ▶${fleetRunning}`, color: 'magenta' };\n }\n if (state === 'idle') return { label: 'idle', color: 'cyan' };\n if (state === 'aborting') return { label: 'aborting…', color: 'yellow' };\n return { label: 'thinking…', color: 'green' };\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\n// Sub-cell-precise meter: each cell is 1/8 resolution via Unicode block\n// fractions, so the bar grows smoothly token-by-token instead of jumping a\n// whole cell. Empty track stays '░'. Total width is always `width` chars.\nconst EIGHTHS = ['', '▏', '▎', '▍', '▌', '▋', '▊', '▉'];\n\nexport function renderMeter(ratio: number, width: number): string {\n const clamped = Math.max(0, Math.min(1, ratio));\n let remaining = Math.round(clamped * width * 8);\n let out = '';\n for (let i = 0; i < width; i++) {\n if (remaining >= 8) {\n out += FILLED;\n remaining -= 8;\n } else if (remaining > 0) {\n out += EIGHTHS[remaining];\n remaining = 0;\n } else {\n out += EMPTY;\n }\n }\n return out;\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 { Box, Text } from 'ink';\nimport type React from 'react';\nimport type { FleetEntry } from '../app.js';\nimport { fmtElapsed, renderProgress } from './status-bar.js';\n\nexport interface FleetMonitorProps {\n entries: Record<string, FleetEntry>;\n /** Fleet-wide accumulated cost. */\n totalCost: number;\n /** Fleet-wide token totals, when available. */\n totalTokens?: { input: number; output: number };\n /** Concurrency ceiling for the gauge. */\n maxConcurrent?: number;\n /** 1s clock tick so elapsed times + sparklines stay live. */\n nowTick: number;\n /** Active or completed collaborative debugging session. */\n collabSession?: {\n sessionId: string | null;\n bugCount: number;\n planCount: number;\n evalCount: number;\n overallVerdict: 'approve' | 'needs_revision' | 'reject' | null;\n timeline: Array<{ at: number; icon: string; color: string; text: string }>;\n startedAt: number | null;\n } | null;\n}\n\nconst STATUS: Record<FleetEntry['status'], { icon: string; color: string }> = {\n idle: { icon: '○', color: 'gray' },\n running: { icon: '▶', color: 'yellow' },\n success: { icon: '✓', color: 'green' },\n failed: { icon: '✗', color: 'red' },\n timeout: { icon: '⏱', color: 'yellow' },\n stopped: { icon: '⊘', color: 'gray' },\n};\n\nconst SPARK = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];\n\n/**\n * Bucket recent tool executions into a fixed number of time bins ending at\n * `now`, returning a per-bin count. Drives the per-agent activity sparkline\n * in the Agents (live) monitor; exported here because it was historically\n * defined alongside the fleet monitor.\n */\nexport function bucketActivity(\n recentTools: ReadonlyArray<{ at: number }>,\n now: number,\n bins = 12,\n binMs = 2000,\n): number[] {\n const out = new Array<number>(bins).fill(0);\n const windowStart = now - bins * binMs;\n for (const t of recentTools) {\n if (t.at < windowStart || t.at > now) continue;\n let idx = Math.floor((t.at - windowStart) / binMs);\n if (idx < 0) idx = 0;\n if (idx >= bins) idx = bins - 1;\n out[idx]!++;\n }\n return out;\n}\n\n/** Render a numeric series as a unicode sparkline. */\nexport function sparkline(values: number[]): string {\n if (values.length === 0) return '';\n const max = Math.max(1, ...values);\n return values\n .map((v) => {\n if (v <= 0) return SPARK[0];\n const idx = Math.min(SPARK.length - 1, Math.ceil((v / max) * (SPARK.length - 1)));\n return SPARK[idx];\n })\n .join('');\n}\n\nfunction fmtTokens(n: number): string {\n if (n < 1000) return String(n);\n if (n < 1_000_000) return `${(n / 1000).toFixed(1)}k`;\n return `${(n / 1_000_000).toFixed(1)}M`;\n}\n\nfunction fmtCost(n: number): string {\n if (n === 0) return '—';\n return `$${n.toFixed(3)}`;\n}\n\n/**\n * Compact `provider:model` label for the monitors. Strips any `provider/`\n * prefix from the model id and keeps it terminal-friendly. Returns '' when\n * neither is known (e.g. a leader entry before the first request resolves).\n * Shared by the Agents (Ctrl+G) and Fleet (Ctrl+F) monitors.\n */\nexport function fmtModelLabel(provider?: string, model?: string): string {\n if (!model && !provider) return '';\n const short = model\n ? model.includes('/')\n ? model.slice(model.lastIndexOf('/') + 1)\n : model\n : '?';\n return provider ? `${provider}:${short}` : short;\n}\n\n/**\n * Fleet orchestration dashboard (Ctrl+F). Concurrency gauge, fleet totals,\n * a compact one-line-per-agent table, and a recent-events timeline. Live\n * per-agent context (current tool / streaming tail) lives in the Agents\n * monitor (Ctrl+G) — this view is for \"how the fleet is doing overall\".\n */\nexport function FleetMonitor({\n entries,\n totalCost,\n totalTokens,\n maxConcurrent = 4,\n nowTick,\n collabSession,\n}: FleetMonitorProps): React.ReactElement {\n const all = Object.values(entries);\n const running = all.filter((e) => e.status === 'running');\n const idle = all.filter((e) => e.status === 'idle').length;\n const done = all.filter((e) => e.status === 'success').length;\n const failed = all.filter((e) => e.status === 'failed' || e.status === 'timeout').length;\n\n const concurrencyRatio = maxConcurrent > 0 ? running.length / maxConcurrent : 0;\n\n // Sort: running → idle → recently-finished (newest first).\n const ordered = [...all].sort((a, b) => {\n const ra = a.status === 'running' ? 0 : a.status === 'idle' ? 1 : 2;\n const rb = b.status === 'running' ? 0 : b.status === 'idle' ? 1 : 2;\n if (ra !== rb) return ra - rb;\n if (ra === 2) return b.lastEventAt - a.lastEventAt;\n return a.startedAt - b.startedAt;\n });\n const shown = ordered.slice(0, 12);\n const overflow = all.length - shown.length;\n\n // Timeline: spawn + terminal-status events across all agents + collab session events, newest first.\n const events: Array<{ at: number; icon: string; color: string; text: string }> = [];\n for (const e of all) {\n events.push({ at: e.startedAt, icon: '●', color: 'cyan', text: `${e.name} spawned` });\n if (e.status !== 'running' && e.status !== 'idle') {\n const s = STATUS[e.status];\n const reason = e.failureReason ? ` [${e.failureReason}]` : '';\n events.push({\n at: e.lastEventAt,\n icon: s.icon,\n color: s.color,\n text: `${e.name} ${e.status} (${e.toolCalls}t)${reason}`,\n });\n }\n if (e.budgetWarning) {\n events.push({\n at: e.budgetWarning.at,\n icon: '⚡',\n color: 'yellow',\n text: `${e.name} ${e.budgetWarning.kind} ${e.budgetWarning.used}/${e.budgetWarning.limit} — extending`,\n });\n }\n }\n events.sort((a, b) => b.at - a.at);\n const timeline = events.slice(0, 20);\n\n // Collab verdict chip color\n const VERDICT_COLOR: Record<string, string> = {\n approve: 'green',\n needs_revision: 'yellow',\n reject: 'red',\n };\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n {/* Header — orchestration identity, distinct from AGENTS · LIVE */}\n <Box flexDirection=\"row\" gap={1}>\n <Text bold color=\"cyan\">\n FLEET · ORCHESTRATION\n </Text>\n <Text dimColor>│</Text>\n <Text color=\"yellow\">▶{running.length}</Text>\n <Text dimColor>○{idle}</Text>\n <Text color=\"green\">✓{done}</Text>\n {failed > 0 ? <Text color=\"red\">✗{failed}</Text> : null}\n <Text dimColor>· Ctrl+F / F2 to close</Text>\n </Box>\n\n {/* Collab session banner — shown when a session is active or completed */}\n {collabSession ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"row\" gap={1}>\n <Text bold color=\"magenta\">\n ⚡ COLLAB SESSION\n </Text>\n {collabSession.sessionId ? (\n <Text dimColor>{collabSession.sessionId.slice(0, 8)}</Text>\n ) : null}\n <Text dimColor>│</Text>\n <Text color=\"red\">🐛{collabSession.bugCount}</Text>\n <Text dimColor>│</Text>\n <Text color=\"yellow\">📐{collabSession.planCount}</Text>\n <Text dimColor>│</Text>\n <Text color=\"blue\">⚖️{collabSession.evalCount}</Text>\n {collabSession.overallVerdict ? (\n <>\n <Text dimColor>│</Text>\n <Text bold color={VERDICT_COLOR[collabSession.overallVerdict]}>\n {collabSession.overallVerdict}\n </Text>\n </>\n ) : null}\n </Box>\n {/* Inline collab timeline — first 6 entries */}\n {collabSession.timeline.length > 0 ? (\n <Box flexDirection=\"column\" marginTop={0}>\n {collabSession.timeline.slice(0, 6).map((ev, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: timeline is rebuilt per render\n <Box key={i} flexDirection=\"row\" gap={1}>\n <Text dimColor>\n {`${fmtElapsed(Math.max(0, nowTick - ev.at))} ago`.padEnd(10)}\n </Text>\n <Text color={ev.color}>{ev.icon}</Text>\n <Text dimColor>{ev.text}</Text>\n </Box>\n ))}\n </Box>\n ) : null}\n </Box>\n ) : null}\n\n {/* Concurrency + totals gauge */}\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>concurrency</Text>\n <Text color=\"cyan\">[{renderProgress(concurrencyRatio, 12)}]</Text>\n <Text dimColor>\n {running.length}/{maxConcurrent}\n </Text>\n {totalTokens ? (\n <Text dimColor>\n {' '}\n {fmtTokens(totalTokens.input)}↑ {fmtTokens(totalTokens.output)}↓\n </Text>\n ) : null}\n <Text color=\"green\">{` $${totalCost.toFixed(3)}`}</Text>\n </Box>\n\n {shown.length === 0 ? (\n <Text dimColor>No subagents yet — spawn with /fleet spawn or /fleet dispatch.</Text>\n ) : null}\n\n {/* Compact one-line-per-agent table */}\n {shown.length > 0 ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>{' '}</Text>\n <Text dimColor>{'name'.padEnd(14)}</Text>\n <Text dimColor>{'model'.padEnd(18)}</Text>\n <Text dimColor>{'status'.padEnd(9)}</Text>\n <Text dimColor>{'L/t·ctx'.padEnd(12)}</Text>\n <Text dimColor>{'elapsed'.padEnd(8)}</Text>\n <Text dimColor>cost</Text>\n </Box>\n {shown.map((e) => {\n const s = STATUS[e.status];\n const elapsed =\n e.status === 'running'\n ? fmtElapsed(Math.max(0, nowTick - e.startedAt))\n : fmtElapsed(Math.max(0, nowTick - e.lastEventAt)) + ' ago';\n const model = fmtModelLabel(e.provider, e.model) || '—';\n const ltCtx =\n e.ctxPct !== undefined\n ? `L${e.iterations} ${e.toolCalls}t ${Math.round(e.ctxPct * 100)}%`\n : `L${e.iterations} ${e.toolCalls}t`;\n return (\n <Box key={e.id} flexDirection=\"row\" gap={1}>\n <Text color={s.color}>{s.icon}</Text>\n <Text>{e.name.padEnd(14).slice(0, 14)}</Text>\n <Text dimColor>{model.padEnd(18).slice(0, 18)}</Text>\n <Text color={s.color}>{e.status.padEnd(9)}</Text>\n <Text dimColor>{ltCtx.padEnd(12).slice(0, 12)}</Text>\n <Text dimColor>{elapsed.padEnd(8).slice(0, 8)}</Text>\n <Text color=\"yellow\">{fmtCost(e.cost)}</Text>\n {e.extensions && e.extensions > 0 ? (\n <Text color=\"yellow\"> ⚡×{e.extensions}</Text>\n ) : null}\n </Box>\n );\n })}\n {overflow > 0 ? <Text dimColor>{` … +${overflow} more`}</Text> : null}\n </Box>\n ) : null}\n\n {/* Timeline */}\n {timeline.length > 0 ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>timeline</Text>\n {timeline.map((ev, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: timeline is rebuilt per render\n <Box key={i} flexDirection=\"row\" gap={1}>\n <Text dimColor>{`${fmtElapsed(Math.max(0, nowTick - ev.at))} ago`.padEnd(10)}</Text>\n <Text color={ev.color}>{ev.icon}</Text>\n <Text dimColor>{ev.text}</Text>\n </Box>\n ))}\n </Box>\n ) : null}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\nimport type { FleetEntry } from '../app.js';\nimport { bucketActivity, fmtModelLabel, sparkline } from './fleet-monitor.js';\nimport { fmtElapsed } from './status-bar.js';\n\nexport interface AgentsMonitorProps {\n entries: Record<string, FleetEntry>;\n /** Fleet-wide accumulated cost. */\n totalCost: number;\n /** Fleet-wide token totals, when available. */\n totalTokens?: { input: number; output: number };\n /** 1s clock tick so elapsed times + sparklines stay live. */\n nowTick: number;\n}\n\nconst STATUS: Record<FleetEntry['status'], { icon: string; color: string }> = {\n idle: { icon: '○', color: 'gray' },\n running: { icon: '▶', color: 'yellow' },\n success: { icon: '✓', color: 'green' },\n failed: { icon: '✗', color: 'red' },\n timeout: { icon: '⏱', color: 'yellow' },\n stopped: { icon: '⊘', color: 'gray' },\n};\n\nfunction isTerminal(status: FleetEntry['status']): boolean {\n return (\n status === 'success' || status === 'failed' || status === 'timeout' || status === 'stopped'\n );\n}\n\n/**\n * An idle agent that hasn't produced any event for this long is considered\n * stale and dropped from the live view — a running agent is never hidden.\n * `lastEventAt` is bumped on every tool / message / stream event.\n */\nexport const IDLE_HIDE_MS = 60_000;\n\n/**\n * Select the agents the live monitor should render: never-terminal agents,\n * with idle agents pruned once they've been silent longer than `idleHideMs`.\n * Running agents come first (oldest first), then surviving idle agents\n * (most-recently-active first). Pure + exported for unit testing.\n */\nexport function selectLiveAgents(\n all: FleetEntry[],\n now: number,\n idleHideMs: number = IDLE_HIDE_MS,\n): FleetEntry[] {\n const visible = all.filter((e) => {\n if (isTerminal(e.status)) return false;\n if (e.status === 'running') return true;\n // idle: keep only while it's been recently active\n return now - e.lastEventAt < idleHideMs;\n });\n return visible.sort((a, b) => {\n if (a.status === 'running' && b.status !== 'running') return -1;\n if (a.status !== 'running' && b.status === 'running') return 1;\n if (a.status === 'running') return a.startedAt - b.startedAt; // oldest run first\n return b.lastEventAt - a.lastEventAt; // freshest idle first\n });\n}\n\nfunction fmtTokens(n: number): string {\n if (n < 1000) return String(n);\n if (n < 1_000_000) return `${(n / 1000).toFixed(1)}k`;\n return `${(n / 1_000_000).toFixed(1)}M`;\n}\n\nexport function fmtExactTokens(n: number): string {\n return `${Math.round(n).toLocaleString('en-US')} tok`;\n}\n\nfunction snippet(s: string, max = 72): string {\n const oneLine = s.replace(/\\s+/g, ' ').trim();\n if (oneLine.length <= max) return oneLine;\n return `${oneLine.slice(0, max - 1)}…`;\n}\n\n/** Colored context-window fill bar: ████░░░░░░ 67% */\nfunction ContextBar({\n pct,\n tokens,\n maxTokens,\n}: {\n pct: number;\n tokens?: number;\n maxTokens?: number;\n}): React.ReactElement {\n const clamped = Math.max(0, Math.min(2, pct)); // cap visual at 200%\n const totalBars = 10;\n const filled = Math.round(clamped * totalBars);\n const empty = totalBars - filled;\n const color = pct < 0.6 ? 'green' : pct < 0.75 ? 'yellow' : 'red';\n const pctText = pct >= 1 ? `${Math.round(pct * 100)}%+` : `${Math.round(pct * 100)}%`;\n const tokenText = tokens ? ` ${fmtTokens(tokens)}/${fmtTokens(maxTokens ?? 200_000)}` : '';\n return (\n <Text color={color}>\n {'█'.repeat(filled)}\n {'░'.repeat(Math.max(0, empty))} {pctText}\n {tokenText}\n </Text>\n );\n}\n\n/**\n * Live per-agent context view (Ctrl+G). Each active agent gets a card with\n * its current tool, the last tool result, the most recent streaming /\n * message text, an activity sparkline, and budget pressure. Terminal\n * agents are excluded so the monitor reflects only what's actually live.\n */\nexport function AgentsMonitor({\n entries,\n totalCost,\n totalTokens,\n nowTick,\n}: AgentsMonitorProps): React.ReactElement {\n const all = Object.values(entries);\n\n // Terminal agents are excluded, and idle agents that have been silent for\n // longer than IDLE_HIDE_MS are pruned — the FleetPanel + history still hold\n // the full record; this view shows only what's actually live right now.\n const live = selectLiveAgents(all, nowTick);\n\n const running = live.filter((e) => e.status === 'running').length;\n const totalDone = all.filter((e) => e.status === 'success').length;\n const totalFailed = all.filter((e) => e.status === 'failed' || e.status === 'timeout').length;\n // Idle agents pruned for being stale (live but not in the visible set).\n const hiddenIdle = all.filter(\n (e) => e.status === 'idle' && nowTick - e.lastEventAt >= IDLE_HIDE_MS,\n ).length;\n\n const ordered = live;\n const shown = ordered.slice(0, 8);\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"magenta\" paddingX={1}>\n {/* Header — live identity, distinct from FLEET MONITOR */}\n <Box flexDirection=\"row\" gap={1}>\n <Text bold color=\"magenta\">\n AGENTS · LIVE\n </Text>\n <Text dimColor>│</Text>\n <Text color=\"yellow\">▶{running}</Text>\n <Text dimColor>─────────────────</Text>\n <Text dimColor>done</Text>\n <Text color=\"green\">✓{totalDone}</Text>\n <Text dimColor>·</Text>\n <Text dimColor>failed</Text>\n {totalFailed > 0 ? <Text color=\"red\">✗{totalFailed}</Text> : null}\n <Text dimColor>· Ctrl+G / F3 to close</Text>\n </Box>\n\n {/* Token + cost row */}\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>shown</Text>\n <Text color=\"magenta\">{live.length}</Text>\n {totalTokens ? (\n <Text dimColor>\n {' '}\n {fmtTokens(totalTokens.input)}↑ {fmtTokens(totalTokens.output)}↓\n </Text>\n ) : null}\n <Text color=\"green\">${totalCost.toFixed(3)}</Text>\n {hiddenIdle > 0 ? <Text dimColor>· {hiddenIdle} idle hidden</Text> : null}\n </Box>\n\n {shown.length === 0 ? (\n <Text dimColor>No live agents — spawn with /spawn or /fleet dispatch.</Text>\n ) : null}\n\n {/* Per-agent live cards */}\n {shown.map((e) => {\n const s = STATUS[e.status];\n const elapsed =\n e.status === 'running' ? fmtElapsed(Math.max(0, nowTick - e.startedAt)) : e.status;\n const spark = sparkline(bucketActivity(e.recentTools, nowTick));\n const lastTool = e.recentTools[e.recentTools.length - 1];\n const lastMessage = e.recentMessages[e.recentMessages.length - 1];\n const streamTail = e.streamingText ? snippet(e.streamingText.slice(-160)) : '';\n const toolElapsed = e.currentTool ? Math.max(0, nowTick - e.currentTool.startedAt) : 0;\n\n return (\n <Box key={e.id} flexDirection=\"column\" marginTop={1}>\n {/* Identity line: icon · name · model · elapsed · iter/tools · ctx · extensions\n — ctx bar lives here (not its own line) to save vertical space. */}\n <Box flexDirection=\"row\" gap={1}>\n <Text color={s.color} bold>\n {s.icon}\n </Text>\n <Text bold>{e.name}</Text>\n {fmtModelLabel(e.provider, e.model) ? (\n <Text dimColor>{fmtModelLabel(e.provider, e.model)}</Text>\n ) : null}\n {e.ctxMaxTokens && e.ctxMaxTokens > 0 ? (\n <Text color=\"blue\">ctx max {fmtExactTokens(e.ctxMaxTokens)}</Text>\n ) : null}\n <Text dimColor>·</Text>\n <Text dimColor>{elapsed}</Text>\n <Text dimColor>·</Text>\n <Text dimColor>\n L{e.iterations} {e.toolCalls}t\n </Text>\n {e.ctxPct !== undefined ? (\n <>\n <Text dimColor>·</Text>\n <ContextBar pct={e.ctxPct} tokens={e.ctxTokens} maxTokens={e.ctxMaxTokens} />\n </>\n ) : null}\n {e.extensions && e.extensions > 0 ? (\n <Text color=\"yellow\">⚡×{e.extensions}</Text>\n ) : null}\n </Box>\n\n {/* Current tool (live, ms-precision) — only while inside a tool */}\n {e.status === 'running' && e.currentTool ? (\n <Box flexDirection=\"row\" gap={1} paddingLeft={2}>\n <Text color=\"cyan\">→ {e.currentTool.name}</Text>\n <Text dimColor>({toolElapsed}ms)</Text>\n </Box>\n ) : null}\n\n {/* Activity sparkline + last completed tool summary */}\n {spark || lastTool ? (\n <Box flexDirection=\"row\" gap={1} paddingLeft={2}>\n <Text color=\"green\">{spark || ''}</Text>\n {lastTool ? (\n <Text dimColor>\n last: {lastTool.name}\n {typeof lastTool.durationMs === 'number' ? ` ${lastTool.durationMs}ms` : ''}\n {lastTool.ok === false ? ' ✗' : ''}\n </Text>\n ) : null}\n </Box>\n ) : null}\n\n {/* Live streaming tail (for running agents) */}\n {e.status === 'running' && streamTail ? (\n <Box paddingLeft={2}>\n <Text dimColor>\n {'>'} {streamTail}\n </Text>\n </Box>\n ) : null}\n\n {/* Latest finished-message snippet (when nothing streaming) */}\n {(e.status !== 'running' || !streamTail) && lastMessage ? (\n <Box paddingLeft={2}>\n <Text dimColor>msg: {snippet(lastMessage.text)}</Text>\n </Box>\n ) : null}\n\n {/* Budget pressure */}\n {e.budgetWarning ? (\n <Box paddingLeft={2}>\n <Text color=\"yellow\">\n ⚡ {e.budgetWarning.kind} {e.budgetWarning.used}/{e.budgetWarning.limit} —\n extending\n </Text>\n </Box>\n ) : null}\n\n {/* Failure reason (shown for failed/timeout/stopped agents) */}\n {e.failureReason && e.status !== 'success' ? (\n <Box paddingLeft={2}>\n <Text color=\"red\">✗ {e.failureReason}</Text>\n </Box>\n ) : null}\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\n\nexport interface AutonomyOption {\n mode: 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel';\n label: string;\n description: string;\n color: string;\n}\n\nexport interface AutonomyPickerProps {\n options: AutonomyOption[];\n selected: number;\n hint?: string;\n}\n\nexport const AUTONOMY_OPTIONS: AutonomyOption[] = [\n {\n mode: 'off',\n label: 'OFF',\n description: 'Agent stops after each turn (normal interactive mode)',\n color: 'green',\n },\n {\n mode: 'suggest',\n label: 'SUGGEST',\n description: 'Shows next-step suggestions after each turn',\n color: 'cyan',\n },\n {\n mode: 'auto',\n label: 'AUTO',\n description: 'Self-driving — agent picks next step and continues',\n color: 'yellow',\n },\n {\n mode: 'eternal',\n label: 'ETERNAL',\n description: 'Goal-driven loop — requires /goal set first',\n color: 'red',\n },\n {\n mode: 'eternal-parallel',\n label: 'PARALLEL',\n description: 'Fan-out 4–8 subagents per tick — requires /goal',\n color: 'magenta',\n },\n];\n\nexport function AutonomyPicker({\n options,\n selected,\n hint,\n}: AutonomyPickerProps): React.ReactElement {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text color=\"cyan\" bold>\n ━━ Autonomy Mode ━━\n </Text>\n <Text dimColor>↑/↓ navigate · Enter select · Esc cancel · Ctrl+C exit</Text>\n {options.map((opt, i) => (\n <Text\n key={opt.mode}\n color={i === selected ? opt.color : undefined}\n inverse={i === selected}\n >\n {i === selected ? '› ' : ' '}\n <Text bold>{opt.label.padEnd(12)}</Text>\n <Text dimColor>{opt.description}</Text>\n </Text>\n ))}\n {hint ? <Text color=\"yellow\">{hint}</Text> : null}\n </Box>\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport type React from 'react';\n\nexport interface BrainDecisionPromptOption {\n id: string;\n label: string;\n risk?: 'low' | 'medium' | 'high' | 'critical' | string;\n consequence?: string;\n recommended?: boolean;\n}\n\nexport interface BrainDecisionPromptProps {\n requestId: string;\n source: string;\n risk: 'low' | 'medium' | 'high' | 'critical' | string;\n question: string;\n context?: string;\n options?: BrainDecisionPromptOption[];\n onAnswer?: (answer: { id: string; optionId?: string; deny?: boolean; text?: string }) => void;\n}\n\nfunction riskColor(risk: string): string {\n switch (risk) {\n case 'low':\n return 'green';\n case 'medium':\n return 'cyan';\n case 'high':\n return 'yellow';\n case 'critical':\n return 'red';\n default:\n return 'white';\n }\n}\n\nfunction optionKey(index: number): string {\n return String.fromCharCode('A'.charCodeAt(0) + index);\n}\n\nfunction contextLines(context?: string): string[] {\n if (!context?.trim()) return [];\n return context.trim().split('\\n').slice(0, 5);\n}\n\n/**\n * Brain escalation panel. It renders the options and, when `onAnswer` is wired,\n * maps A/B/C (or 1/2/3) to the matching option and Esc/D to a safe denial.\n */\nexport function BrainDecisionPrompt({\n requestId,\n source,\n risk,\n question,\n context,\n options = [],\n onAnswer,\n}: BrainDecisionPromptProps): React.ReactElement {\n const color = riskColor(risk);\n const ctx = contextLines(context);\n\n useInput((input, key) => {\n if (!onAnswer) return;\n if (key.escape || input.toLowerCase() === 'd') {\n onAnswer({ id: requestId, deny: true, text: 'Denied by human from TUI.' });\n return;\n }\n const ch = input.toLowerCase();\n const index = ch >= 'a' && ch <= 'z' ? ch.charCodeAt(0) - 'a'.charCodeAt(0) : Number(ch) - 1;\n const option = Number.isInteger(index) && index >= 0 ? options[index] : undefined;\n if (option) onAnswer({ id: requestId, optionId: option.id, text: option.label });\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"magenta\" paddingX={1}>\n <Box flexDirection=\"row\">\n <Text bold color=\"magenta\">\n 🧠 BRAIN REQUIRES HUMAN DECISION\n </Text>\n </Box>\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>Source:</Text>\n <Text>{source}</Text>\n <Text dimColor>Risk:</Text>\n <Text color={color}>{risk}</Text>\n </Box>\n <Text color=\"white\">{question}</Text>\n {ctx.length > 0 ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>Context:</Text>\n {ctx.map((line, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: context lines are static for this prompt render\n <Text key={index} dimColor>\n {line}\n </Text>\n ))}\n </Box>\n ) : null}\n {options.length > 0 ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>Options:</Text>\n {options.slice(0, 6).map((option, index) => {\n const key = optionKey(index);\n const optionColor = riskColor(String(option.risk ?? risk));\n return (\n <Box key={option.id} flexDirection=\"column\">\n <Text>\n <Text bold color=\"yellow\">\n [{key}]\n </Text>{' '}\n <Text color={optionColor}>{option.label}</Text>\n {option.recommended ? <Text color=\"green\"> recommended</Text> : null}\n </Text>\n {option.consequence ? <Text dimColor> {option.consequence}</Text> : null}\n </Box>\n );\n })}\n </Box>\n ) : null}\n <Text dimColor>─────────────────</Text>\n <Text dimColor>Press A/B/C or 1/2/3 to answer; Esc or D denies with the safe default.</Text>\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>\n {' '}\n · {cp.fileCount} file{cp.fileCount !== 1 ? 's' : ''}\n </Text>\n )}\n </Box>\n );\n })\n )}\n </Box>\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport { writeOut } from '@wrongstack/core';\nimport React from 'react';\n\nexport type ConfirmDecision = 'yes' | 'no' | 'always' | 'deny';\n\nexport interface ConfirmPromptProps {\n toolName: string;\n input: unknown;\n suggestedPattern: string;\n onDecision: (decision: ConfirmDecision) => void;\n}\n\n/** Ink color for each button's bracketed key. */\nconst BUTTON_COLOR: Record<ConfirmDecision, string> = {\n yes: 'green',\n no: 'red',\n always: 'cyan',\n deny: 'red',\n};\n\n/**\n * The button row as a list of {bracket, rest} segments. Single source of\n * truth for BOTH the rendered row and the mouse hit-test geometry\n * (`confirmButtonSegments`), so they can never drift. `rest` carries the\n * trailing space that separates one button from the next.\n */\nfunction buttonLabels(suggestedPattern: string): Array<{\n decision: ConfirmDecision;\n bracket: string;\n rest: string;\n}> {\n return [\n { decision: 'yes', bracket: '[y]', rest: 'es ' },\n { decision: 'no', bracket: '[n]', rest: 'o ' },\n { decision: 'always', bracket: '[a]', rest: `lways (${suggestedPattern}) ` },\n { decision: 'deny', bracket: '[d]', rest: 'eny' },\n ];\n}\n\n/**\n * 0-based column spans of each button WITHIN the dialog's content area (i.e.\n * relative to the first printable column inside the border + paddingX). Used\n * by the TUI mouse handler to map a click on the button row to a decision.\n * Derived from the same `buttonLabels` the component renders, so the offsets\n * always match what's on screen.\n */\nexport function confirmButtonSegments(\n suggestedPattern: string,\n): Array<{ decision: ConfirmDecision; start: number; len: number }> {\n const out: Array<{ decision: ConfirmDecision; start: number; len: number }> = [];\n let col = 0;\n for (const l of buttonLabels(suggestedPattern)) {\n const len = l.bracket.length + l.rest.length;\n out.push({ decision: l.decision, start: col, len });\n col += len;\n }\n return out;\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 writeOut('\\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 // NOTE: no marginY here — the call site wraps this in a measured Box that\n // owns the vertical margin, so `measureElement` on the wrapper reports the\n // exact box height (top border + content + bottom border) the mouse\n // hit-test relies on to locate the button row.\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"yellow\" paddingX={1}>\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 {buttonLabels(suggestedPattern).map((l) => (\n <React.Fragment key={l.decision}>\n <Text bold color={BUTTON_COLOR[l.decision]}>\n {l.bracket}\n </Text>\n <Text dimColor>{l.rest}</Text>\n </React.Fragment>\n ))}\n </Text>\n </Box>\n </Box>\n );\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, useStdout } from 'ink';\nimport type React from 'react';\nimport { useEffect, useState } from 'react';\nimport type { FleetEntry } from '../app.js';\n\nexport interface FleetPanelProps {\n /** Per-subagent state, keyed by subagentId. */\n entries: Record<string, FleetEntry>;\n /** Fleet-wide accumulated cost (from FleetUsageAggregator). */\n totalCost: number;\n /** Optional roster for resolving role ids to display names. */\n roster?: Record<string, { name: string }>;\n /** When set, the LEADER row is always shown (even when idle) with a collab session indicator. */\n collabSession?: {\n sessionId: string | null;\n bugCount: number;\n planCount: number;\n evalCount: number;\n } | null;\n}\n\n/**\n * Compact fleet summary rendered below the status bar when director mode is\n * active. Max 6 lines: fleet summary + up to 5 running agents with only\n * name and current tool. Idle/finished agents are excluded unless a collab\n * session is active (LEADER always shows as \"waiting\" in that case).\n */\nexport function FleetPanel({\n entries,\n totalCost,\n collabSession,\n}: FleetPanelProps): React.ReactElement | null {\n // Track terminal width to adapt name truncation.\n const { stdout } = useStdout();\n const [termWidth, setTermWidth] = useState(stdout?.columns ?? 90);\n useEffect(() => {\n const handleResize = () => setTermWidth(stdout?.columns ?? 90);\n handleResize();\n process.stdout.on('resize', handleResize);\n return () => {\n process.stdout.off('resize', handleResize);\n };\n }, [stdout]);\n\n const list = Object.values(entries);\n if (list.length === 0 && !collabSession) return null;\n\n // Adapt name truncation based on terminal width.\n const nameMaxLen = Math.max(6, Math.min(14, termWidth - 30));\n\n // Always extract the leader entry separately — it gets special treatment.\n const leader = list.find((e) => e.id === 'leader');\n const subagents = list.filter((e) => e.id !== 'leader');\n\n // Only running agents — idle and finished agents are not shown.\n // But when a collab session is active, the leader is always shown with its\n // collab-specific status so the user can see the director is still alive.\n const running = subagents.filter((e) => e.status === 'running');\n const runningCount = running.length;\n const hasCollab = !!collabSession;\n\n // Fleet summary line\n const costLabel = totalCost > 0 ? ` · ${totalCost.toFixed(3)}` : '';\n const collabLabel =\n hasCollab && collabSession.sessionId\n ? ` · collab(${collabSession.bugCount}b/${collabSession.planCount}p/${collabSession.evalCount}e)`\n : '';\n const summaryLine =\n runningCount > 0\n ? `${runningCount} running${costLabel}${collabLabel}`\n : `idle${costLabel}${collabLabel}`;\n\n // Show up to 5 running agents (collab agents or regular subagents).\n const shown = running.slice(0, 5);\n const overflow = running.length > 5 ? running.length - 5 : 0;\n\n // Leader status label: when collab is active show \"waiting for agents\",\n // otherwise show its current tool or a dash.\n const leaderTool = hasCollab\n ? 'waiting for agents'\n : (leader?.currentTool?.name ?? (leader?.status === 'running' ? 'running' : '—'));\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n {/* Fleet summary */}\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>⚡ Fleet</Text>\n <Text dimColor>│</Text>\n <Text>{summaryLine}</Text>\n </Box>\n\n {/* Leader row — always shown when collab session is active, regardless of idle/running */}\n {hasCollab && leader ? (\n <Box flexDirection=\"row\" gap={1}>\n <Text color=\"yellow\">●</Text>\n <Text>{leader.name.slice(0, nameMaxLen)}</Text>\n <Text dimColor>→</Text>\n <Text color=\"yellow\">{leaderTool}</Text>\n </Box>\n ) : null}\n\n {/* Running agents: name + current tool only */}\n {shown.map((entry) => {\n // entry.name is the subagent's display name (nickname when assigned,\n // e.g. \"Einstein (Bug Hunter)\") — prefer it over the raw id.\n const name =\n entry.name && entry.name !== entry.id ? entry.name : entry.id.slice(0, nameMaxLen);\n const tool = entry.currentTool?.name ?? '—';\n return (\n <Box key={entry.id} flexDirection=\"row\" gap={1}>\n <Text color=\"green\">●</Text>\n <Text>{name.slice(0, nameMaxLen)}</Text>\n <Text dimColor>→</Text>\n <Text color=\"cyan\">{tool}</Text>\n </Box>\n );\n })}\n\n {/* Overflow indicator — show count and first 2 overflowed agent names */}\n {overflow > 0 ? (\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>+{overflow}:</Text>\n {running.slice(5, 7).map((e) => (\n <Text key={e.id} dimColor>\n {e.name?.split(' ')[0]?.slice(0, nameMaxLen - 2) ?? 'agent'},\n </Text>\n ))}\n <Text dimColor>…</Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\nimport { theme } from '../theme.js';\n\nexport interface HelpEntry {\n /** Key chord or command, e.g. `Ctrl+F` or `/model`. */\n keys: string;\n /** What it does. */\n desc: string;\n}\n\nexport interface HelpSection {\n title: string;\n entries: HelpEntry[];\n}\n\n/**\n * Static cheat-sheet content: keybindings + common slash commands, grouped by\n * area. Pure data (no JSX) so the exact set of entries is unit-testable and the\n * overlay renders identically everywhere. The Navigation section adapts to the\n * active surface — scroll keys only make sense in the managed viewport, wheel/\n * click only when full mouse mode is on.\n */\nexport function helpSections(opts: { managed: boolean; mouse: boolean }): HelpSection[] {\n const nav: HelpEntry[] = [];\n if (opts.managed) nav.push({ keys: 'PgUp/PgDn', desc: 'scroll chat history' });\n if (opts.mouse)\n nav.push(\n { keys: 'wheel', desc: 'scroll chat history' },\n { keys: 'drag scrollbar', desc: 'scrub to any position' },\n { keys: 'click input', desc: 'move the caret' },\n { keys: 'click', desc: 'select / confirm' },\n );\n nav.push(\n { keys: '↑/↓', desc: 'previous / next input (empty prompt)' },\n { keys: '?', desc: 'open this help (empty prompt)' },\n );\n\n return [\n { title: 'Navigation', entries: nav },\n {\n title: 'Monitors',\n entries: [\n { keys: 'Ctrl+F / F2', desc: 'fleet orchestration monitor' },\n { keys: 'Ctrl+G / F3', desc: 'agents live monitor' },\n { keys: 'Ctrl+T / F4', desc: 'worktree monitor' },\n { keys: 'Esc', desc: 'close the open monitor / overlay' },\n ],\n },\n {\n title: 'Editing',\n entries: [\n { keys: 'Enter', desc: 'send (queues while the agent is busy)' },\n { keys: 'Esc Esc', desc: 'clear the input buffer' },\n { keys: 'Ctrl+Backspace', desc: 'delete the previous word' },\n { keys: 'Ctrl+S', desc: 'edit autonomy settings' },\n { keys: 'Ctrl+C', desc: 'interrupt the run · twice to exit' },\n ],\n },\n {\n title: 'Commands',\n entries: [\n { keys: '/help', desc: 'list all slash commands' },\n { keys: '/model', desc: 'switch the active model' },\n { keys: '/fleet', desc: 'multi-agent fleet controls' },\n { keys: '/goal', desc: 'set an autonomous goal' },\n { keys: '/autonomy', desc: 'autonomy mode (eternal / off)' },\n { keys: '/settings', desc: 'autonomy defaults (also Ctrl+S)' },\n { keys: '/clear', desc: 'clear the conversation' },\n ],\n },\n ];\n}\n\n/**\n * Full-width modal cheat-sheet overlay (opened with `?` on an empty prompt,\n * closed with Esc / `?` / `q`). Mirrors the bordered-panel look of the monitor\n * overlays so it sits naturally in the bottom region. Two columns: the key\n * chord (accent) and its description (dim), with the key column padded to a\n * shared width so descriptions align.\n */\nexport function HelpOverlay({\n managed,\n mouse,\n}: {\n managed: boolean;\n mouse: boolean;\n}): React.ReactElement {\n const sections = helpSections({ managed, mouse });\n const keyWidth = Math.max(...sections.flatMap((s) => s.entries.map((e) => e.keys.length)), 0);\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.accent} paddingX={1}>\n <Box flexDirection=\"row\" gap={1}>\n <Text bold color={theme.accent}>\n WrongStack — keys & commands\n </Text>\n <Text dimColor>· Esc to close</Text>\n </Box>\n {sections.map((sec) => (\n <Box key={sec.title} flexDirection=\"column\" marginTop={1}>\n <Text bold color={theme.brand}>\n {sec.title}\n </Text>\n {sec.entries.map((e, i) => (\n <Box\n // biome-ignore lint/suspicious/noArrayIndexKey: positional, stable per section\n key={i}\n flexDirection=\"row\"\n >\n <Text color={theme.accent}>{e.keys.padEnd(keyWidth + 2)}</Text>\n <Text dimColor>{e.desc}</Text>\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n );\n}\n","// Lightweight, synchronous syntax highlighter that emits Ink <Text color>\n// SEGMENTS — never raw ANSI escape codes. This matters: Ink measures text by\n// the visible glyphs of the strings it is given, and embedded SGR escapes\n// inflate that measurement and corrupt the viewport's clip/scroll math. By\n// returning {text,color} tokens (the caller wraps each in <Text color>), Ink\n// owns the styling and width stays exact.\n//\n// It is deliberately a shallow regex/scan tokenizer, not a real parser —\n// approximate coloring reads fine in a terminal. The ONE invariant every\n// language path must keep: the concatenation of token texts equals the input\n// line (no glyph added or dropped), so measurement never drifts. A test\n// asserts `tokens.map(t=>t.text).join('') === line` across a corpus.\n\nexport interface Token {\n text: string;\n color?: string;\n dim?: boolean;\n bold?: boolean;\n}\n\nexport type Lang = 'ts' | 'js' | 'json' | 'bash' | 'python' | 'diff' | 'plain';\n\n/** Carry state for constructs that span lines (block comments, triple strings). */\nexport interface HLState {\n block?: boolean; // inside a /* … */ comment (ts/js)\n triple?: string | null; // inside a python triple-quoted string (\"\"\"/''')\n}\n\n// Conventional terminal syntax colors (Ink color names).\nconst C = {\n keyword: 'magenta',\n string: 'green',\n comment: 'gray',\n number: 'yellow',\n literal: 'yellow', // true/false/null\n property: 'cyan',\n variable: 'cyan',\n command: 'cyan',\n flag: 'yellow',\n decorator: 'magenta',\n diffAdd: 'green',\n diffDel: 'red',\n diffMeta: 'cyan',\n} as const;\n\nconst TS_KEYWORDS = new Set([\n 'const',\n 'let',\n 'var',\n 'function',\n 'return',\n 'if',\n 'else',\n 'for',\n 'while',\n 'do',\n 'switch',\n 'case',\n 'break',\n 'continue',\n 'new',\n 'class',\n 'extends',\n 'implements',\n 'interface',\n 'type',\n 'enum',\n 'import',\n 'export',\n 'from',\n 'as',\n 'default',\n 'async',\n 'await',\n 'yield',\n 'try',\n 'catch',\n 'finally',\n 'throw',\n 'typeof',\n 'instanceof',\n 'in',\n 'of',\n 'this',\n 'super',\n 'void',\n 'delete',\n 'public',\n 'private',\n 'protected',\n 'readonly',\n 'static',\n 'get',\n 'set',\n 'true',\n 'false',\n 'null',\n 'undefined',\n 'never',\n 'any',\n 'unknown',\n 'string',\n 'number',\n 'boolean',\n 'satisfies',\n]);\n\nconst PY_KEYWORDS = new Set([\n 'def',\n 'return',\n 'if',\n 'elif',\n 'else',\n 'for',\n 'while',\n 'break',\n 'continue',\n 'class',\n 'import',\n 'from',\n 'as',\n 'with',\n 'try',\n 'except',\n 'finally',\n 'raise',\n 'yield',\n 'lambda',\n 'pass',\n 'global',\n 'nonlocal',\n 'assert',\n 'del',\n 'and',\n 'or',\n 'not',\n 'in',\n 'is',\n 'None',\n 'True',\n 'False',\n 'async',\n 'await',\n 'self',\n 'print',\n]);\n\nconst BASH_KEYWORDS = new Set([\n 'if',\n 'then',\n 'else',\n 'elif',\n 'fi',\n 'for',\n 'while',\n 'do',\n 'done',\n 'case',\n 'esac',\n 'function',\n 'in',\n 'select',\n 'return',\n 'export',\n 'local',\n 'readonly',\n 'source',\n 'echo',\n 'cd',\n 'set',\n 'unset',\n]);\n\n// Anchored (^) so `.match` only matches at the START of the sliced remainder.\nconst IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*/;\nconst NUMBER = /^(?:0[xX][0-9a-fA-F]+|\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)/;\nconst WS = /^\\s+/;\nconst BASH_VAR = /^(?:\\$\\{[^}]*\\}|\\$[A-Za-z0-9_]+)/;\nconst BASH_FLAG = /^--?[A-Za-z0-9][A-Za-z0-9-]*/;\nconst BASH_WORD = /^[A-Za-z0-9_./-]+/;\nconst PY_DECORATOR = /^@[A-Za-z_][A-Za-z0-9_.]*/;\n\n/** Return the match of anchored `re` at position `i`, or null. */\nfunction matchAt(re: RegExp, s: string, i: number): string | null {\n const m = s.slice(i).match(re);\n return m ? m[0] : null;\n}\n\n/** Consume a quoted string starting at i (quote char = s[i]); returns the span\n * including both quotes (or to end of line if unterminated). Length-preserving. */\nfunction readString(s: string, i: number): string {\n const q = s[i];\n let j = i + 1;\n while (j < s.length) {\n if (s[j] === '\\\\') {\n j += 2;\n continue;\n }\n if (s[j] === q) {\n j += 1;\n break;\n }\n j += 1;\n }\n return s.slice(i, Math.min(j, s.length));\n}\n\nfunction tokenizeCLike(\n line: string,\n kw: Set<string>,\n carry: HLState,\n): { tokens: Token[]; carry: HLState } {\n const tokens: Token[] = [];\n let i = 0;\n const next: HLState = { ...carry };\n\n // Continue an open block comment from a previous line.\n if (next.block) {\n const end = line.indexOf('*/');\n if (end === -1) {\n tokens.push({ text: line, color: C.comment, dim: true });\n return { tokens, carry: { block: true } };\n }\n tokens.push({ text: line.slice(0, end + 2), color: C.comment, dim: true });\n i = end + 2;\n next.block = false;\n }\n\n while (i < line.length) {\n const ch = line[i] ?? '';\n const two = line.slice(i, i + 2);\n\n if (two === '//') {\n tokens.push({ text: line.slice(i), color: C.comment, dim: true });\n break;\n }\n if (two === '/*') {\n const end = line.indexOf('*/', i + 2);\n if (end === -1) {\n tokens.push({ text: line.slice(i), color: C.comment, dim: true });\n next.block = true;\n break;\n }\n tokens.push({ text: line.slice(i, end + 2), color: C.comment, dim: true });\n i = end + 2;\n continue;\n }\n if (ch === '\"' || ch === \"'\" || ch === '`') {\n const str = readString(line, i);\n tokens.push({ text: str, color: C.string });\n i += str.length;\n continue;\n }\n const ws = matchAt(WS, line, i);\n if (ws) {\n tokens.push({ text: ws });\n i += ws.length;\n continue;\n }\n const num = matchAt(NUMBER, line, i);\n if (num) {\n tokens.push({ text: num, color: C.number });\n i += num.length;\n continue;\n }\n const id = matchAt(IDENT, line, i);\n if (id) {\n tokens.push(kw.has(id) ? { text: id, color: C.keyword } : { text: id });\n i += id.length;\n continue;\n }\n // Punctuation / anything else — one char, uncolored. Always advances.\n tokens.push({ text: ch });\n i += 1;\n }\n return { tokens, carry: next };\n}\n\nfunction tokenizeJson(line: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n while (i < line.length) {\n const ch = line[i] ?? '';\n if (ch === '\"') {\n const str = readString(line, i);\n // Property key if the next non-space char is a colon.\n let k = i + str.length;\n while (k < line.length && (line[k] === ' ' || line[k] === '\\t')) k += 1;\n tokens.push({ text: str, color: line[k] === ':' ? C.property : C.string });\n i += str.length;\n continue;\n }\n const ws = matchAt(WS, line, i);\n if (ws) {\n tokens.push({ text: ws });\n i += ws.length;\n continue;\n }\n const num = matchAt(NUMBER, line, i);\n if (num) {\n tokens.push({ text: num, color: C.number });\n i += num.length;\n continue;\n }\n const id = matchAt(IDENT, line, i);\n if (id) {\n tokens.push(\n id === 'true' || id === 'false' || id === 'null'\n ? { text: id, color: C.literal }\n : { text: id },\n );\n i += id.length;\n continue;\n }\n tokens.push({ text: ch });\n i += 1;\n }\n return tokens;\n}\n\nfunction tokenizeBash(line: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n let firstWord = true;\n while (i < line.length) {\n const ch = line[i] ?? '';\n if (ch === '#') {\n tokens.push({ text: line.slice(i), color: C.comment, dim: true });\n break;\n }\n if (ch === '\"' || ch === \"'\") {\n const str = readString(line, i);\n tokens.push({ text: str, color: C.string });\n i += str.length;\n continue;\n }\n if (ch === '$') {\n const varMatch = matchAt(BASH_VAR, line, i);\n if (varMatch) {\n tokens.push({ text: varMatch, color: C.variable });\n i += varMatch.length;\n continue;\n }\n }\n const ws = matchAt(WS, line, i);\n if (ws) {\n tokens.push({ text: ws });\n i += ws.length;\n continue;\n }\n if (ch === '-' && firstWord === false) {\n const flag = matchAt(BASH_FLAG, line, i);\n if (flag) {\n tokens.push({ text: flag, color: C.flag });\n i += flag.length;\n continue;\n }\n }\n const id = matchAt(BASH_WORD, line, i);\n if (id) {\n const color = firstWord ? C.command : BASH_KEYWORDS.has(id) ? C.keyword : undefined;\n tokens.push(color ? { text: id, color } : { text: id });\n i += id.length;\n firstWord = false;\n continue;\n }\n tokens.push({ text: ch });\n i += 1;\n if (ch !== ' ' && ch !== '\\t') firstWord = false;\n }\n return tokens;\n}\n\nfunction tokenizePython(line: string, carry: HLState): { tokens: Token[]; carry: HLState } {\n const tokens: Token[] = [];\n const next: HLState = { ...carry };\n let i = 0;\n\n if (next.triple) {\n const close = line.indexOf(next.triple);\n if (close === -1) {\n tokens.push({ text: line, color: C.string });\n return { tokens, carry: next };\n }\n tokens.push({ text: line.slice(0, close + 3), color: C.string });\n i = close + 3;\n next.triple = null;\n }\n\n while (i < line.length) {\n const ch = line[i] ?? '';\n const three = line.slice(i, i + 3);\n if (ch === '#') {\n tokens.push({ text: line.slice(i), color: C.comment, dim: true });\n break;\n }\n if (three === '\"\"\"' || three === \"'''\") {\n const close = line.indexOf(three, i + 3);\n if (close === -1) {\n tokens.push({ text: line.slice(i), color: C.string });\n next.triple = three;\n break;\n }\n tokens.push({ text: line.slice(i, close + 3), color: C.string });\n i = close + 3;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n const str = readString(line, i);\n tokens.push({ text: str, color: C.string });\n i += str.length;\n continue;\n }\n if (ch === '@') {\n const dec = matchAt(PY_DECORATOR, line, i);\n if (dec) {\n tokens.push({ text: dec, color: C.decorator });\n i += dec.length;\n continue;\n }\n }\n const ws = matchAt(WS, line, i);\n if (ws) {\n tokens.push({ text: ws });\n i += ws.length;\n continue;\n }\n const num = matchAt(NUMBER, line, i);\n if (num) {\n tokens.push({ text: num, color: C.number });\n i += num.length;\n continue;\n }\n const id = matchAt(IDENT, line, i);\n if (id) {\n tokens.push(PY_KEYWORDS.has(id) ? { text: id, color: C.keyword } : { text: id });\n i += id.length;\n continue;\n }\n tokens.push({ text: ch });\n i += 1;\n }\n return { tokens, carry: next };\n}\n\nfunction tokenizeDiff(line: string): Token[] {\n // Whole-line classification — one token, length-preserving.\n if (line.startsWith('@@')) return [{ text: line, color: C.diffMeta }];\n if (line.startsWith('+++') || line.startsWith('---'))\n return [{ text: line, color: C.diffMeta, dim: true }];\n if (line.startsWith('+')) return [{ text: line, color: C.diffAdd }];\n if (line.startsWith('-')) return [{ text: line, color: C.diffDel }];\n return [{ text: line, dim: true }];\n}\n\n/**\n * Highlight ONE line. `carry` threads multi-line state (block comments, triple\n * strings) from the previous line; pass the returned `carry` into the next call.\n * Guarantees `result.tokens.map(t=>t.text).join('') === line`.\n */\nexport function highlightLine(\n line: string,\n lang: Lang,\n carry: HLState = {},\n): { tokens: Token[]; carry: HLState } {\n switch (lang) {\n case 'ts':\n case 'js':\n return tokenizeCLike(line, TS_KEYWORDS, carry);\n case 'json':\n return { tokens: tokenizeJson(line), carry: {} };\n case 'bash':\n return { tokens: tokenizeBash(line), carry: {} };\n case 'python':\n return tokenizePython(line, carry);\n case 'diff':\n return { tokens: tokenizeDiff(line), carry: {} };\n default:\n return { tokens: line.length > 0 ? [{ text: line }] : [], carry: {} };\n }\n}\n\nconst LANG_ALIASES: Record<string, Lang> = {\n ts: 'ts',\n tsx: 'ts',\n typescript: 'ts',\n js: 'js',\n jsx: 'js',\n javascript: 'js',\n mjs: 'js',\n cjs: 'js',\n json: 'json',\n json5: 'json',\n sh: 'bash',\n bash: 'bash',\n shell: 'bash',\n zsh: 'bash',\n console: 'bash',\n py: 'python',\n python: 'python',\n diff: 'diff',\n patch: 'diff',\n};\n\n/** Map a code-fence info string (```ts, ```bash, …) to a supported Lang. */\nexport function detectLang(fenceInfo: string): Lang {\n const tag = fenceInfo.trim().toLowerCase().split(/\\s+/)[0] ?? '';\n return LANG_ALIASES[tag] ?? 'plain';\n}\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\nexport function 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\n/**\n * Extract visual widths from a separator row (e.g., \"|------|--------|\").\n * Counts dash characters as the minimum width for each column.\n * Returns null for cells that don't look like valid separators.\n */\nfunction parseSeparatorWidths(sepCells: string[]): (number | null)[] {\n return sepCells.map((cell) => {\n const trimmed = cell.trim();\n // Must be dashes only (possibly with colons for alignment).\n const dashes = trimmed.replace(/:/g, '');\n if (/^-+$/.test(dashes)) return dashes.length;\n return null;\n });\n}\n\nexport function 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 // Parse separator widths to use as minimum column widths.\n const sepWidths = parseSeparatorWidths(sepCells);\n const widths = computeWidths([header, ...dataRows], cols, maxWidth, sepWidths);\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(\n allRows: string[][],\n cols: number,\n maxWidth: number,\n sepWidths?: (number | null)[],\n): 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); // visual width of the longest word in this cell\n const total = strWidth(cell); // visual width of the entire cell content\n // Ensure the column is at least wide enough for the longest word,\n // and at least wide enough for the full cell content.\n natural[c] = Math.max(natural[c]!, w, total);\n }\n }\n // Apply separator widths as minimums (markdown separator defines column widths).\n if (sepWidths) {\n for (let c = 0; c < cols && c < sepWidths.length; c++) {\n const sepW = sepWidths[c];\n if (sepW != null) {\n natural[c] = Math.max(natural[c]!, sepW);\n }\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\n/**\n * Return the number of terminal columns a string occupies.\n * Uses East Asian Width property to determine character widths:\n * - Emoji (U+1F000+ and various other emoji blocks) count as 2 columns.\n * - Full-width (F) and Wide (W) characters count as 2 columns.\n * - ASCII printable characters count as 1.\n * - Control characters count as 0.\n */\nexport function strWidth(s: string): number {\n let width = 0;\n for (const cp of s) {\n const code = cp.codePointAt(0)!;\n // Control characters: no width\n if (code < 0x20 || (code >= 0x7f && code < 0xa0)) {\n continue;\n }\n // Emoji: Most emoji render as double-width in terminals.\n // Modern emoji are in U+1F000+ or various other blocks.\n if (\n code >= 0x1f000 || // Supplementary Pictographs (U+1F000-U+1FFFF)\n (code >= 0x2600 && code <= 0x27bf) || // Miscellaneous Symbols, Dingbats\n (code >= 0x2300 && code <= 0x23ff) || // Miscellaneous Technical\n (code >= 0x2b50 && code <= 0x2b55) || // Stars and similar\n (code >= 0x2934 && code <= 0x2935) || // Arrow forms\n (code >= 0x2190 && code <= 0x21ff) || // Arrows\n (code >= 0x25a0 && code <= 0x25ff) || // Geometric Shapes\n (code >= 0x25c0 && code <= 0x25fe) || // More Geometric Shapes (includes ▶)\n (code >= 0x2700 && code <= 0x27bf) // Dingbats (includes ✅ ❌)\n ) {\n width += 2;\n continue;\n }\n // East Asian Width: Wide characters take 2 columns.\n // CJK Unified Ideographs, Hiragana, Katakana, Hangul, etc.\n if (\n (code >= 0x1100 && code <= 0x115f) || // Hangul Jamo\n code === 0x2329 || // LEFT-POINTING ANGLE BRACKET\n code === 0x232a || // RIGHT-POINTING ANGLE BRACKET\n (code >= 0x2e80 && code <= 0x303e) || // CJK Radicals Supplement\n (code >= 0x3040 && code <= 0xa4cf) || // Hiragana, Katakana, CJK\n (code >= 0xac00 && code <= 0xd7a3) || // Hangul Syllables\n (code >= 0xf900 && code <= 0xfaf9) || // CJK Compatibility Ideographs\n (code >= 0xfe10 && code <= 0xfe1f) || // Vertical forms\n (code >= 0xfe30 && code <= 0xfe6f) || // CJK Compatibility Forms\n (code >= 0xff00 && code <= 0xff60) || // Fullwidth Forms\n (code >= 0xffe0 && code <= 0xffe6) || // Halfwidth and Fullwidth Forms\n (code >= 0x20000 && code <= 0x2fffd) || // CJK Extension B+\n (code >= 0x30000 && code <= 0x3fffd) // CJK Extension F+\n ) {\n width += 2;\n continue;\n }\n // ASCII and most other printable characters: 1 column\n width += 1;\n }\n return width;\n}\n\nfunction longestWord(s: string): number {\n let max = 0;\n for (const w of s.split(/\\s+/)) {\n const visualWidth = strWidth(w);\n if (visualWidth > max) max = visualWidth;\n }\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 (strWidth(text) <= 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 let curWidth = 0;\n for (const word of words) {\n if (!word) continue;\n const wordWidth = strWidth(word);\n if (curWidth + wordWidth <= width) {\n cur += word;\n curWidth += wordWidth;\n continue;\n }\n if (cur) {\n out.push(padVisual(cur, width));\n cur = '';\n curWidth = 0;\n }\n if (wordWidth > width) {\n // Hard-break a word longer than the column — slice by visual width.\n let rest = word;\n let restWidth = wordWidth;\n while (restWidth > width) {\n // Collect characters until we reach `width` visual columns.\n let collected = '';\n let collectedWidth = 0;\n for (const cp of rest) {\n const cpWidth = strWidth(cp);\n if (collectedWidth + cpWidth > width) break;\n collected += cp;\n collectedWidth += cpWidth;\n }\n out.push(padVisual(collected, width));\n rest = rest.slice([...collected].join('').length);\n restWidth = strWidth(rest);\n }\n cur = rest;\n curWidth = strWidth(rest);\n } else if (!/^\\s+$/.test(word)) {\n cur = word;\n curWidth = wordWidth;\n }\n }\n if (cur) out.push(padVisual(cur, width));\n return out.length === 0 ? [''] : out;\n}\n\n/** Pad a string to a target visual width using spaces. */\nfunction padVisual(text: string, targetWidth: number): string {\n const w = strWidth(text);\n if (w >= targetWidth) {\n // Truncate to targetWidth visual columns, iterating code points.\n let taken = 0;\n let endIdx = 0;\n for (const cp of text) {\n const cpw = strWidth(cp);\n if (taken + cpw > targetWidth) break;\n taken += cpw;\n endIdx += [...cp].join('').length;\n }\n return text.slice(0, endIdx);\n }\n return text + ' '.repeat(targetWidth - w);\n}\n\nfunction padCell(text: string, width: number, align: Align): string {\n const visualLen = strWidth(text);\n // Pad (or truncate) text so its visual width equals `width`.\n // This matches how `border` creates `─`.repeat(width + 2) dashes,\n // which gives a visual content width of `width` columns.\n let displayText = text;\n if (visualLen > width) {\n // Truncate to visual width — iterate code points, stop when we'd exceed target.\n let takenWidth = 0;\n let endIdx = 0;\n for (const cp of text) {\n const cpWidth = strWidth(cp);\n if (takenWidth + cpWidth > width) break;\n takenWidth += cpWidth;\n endIdx += [...cp].join('').length;\n }\n displayText = text.slice(0, endIdx);\n }\n const pad = width - strWidth(displayText);\n if (align === 'right') return ' '.repeat(pad) + displayText;\n if (align === 'center') {\n const l = Math.floor(pad / 2);\n return ' '.repeat(l) + displayText + ' '.repeat(pad - l);\n }\n return displayText + ' '.repeat(pad);\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\nimport { detectTable, renderTable } from './markdown-table.js';\nimport { theme } from './theme.js';\n\n// Lightweight markdown renderer for assistant prose. Handles inline emphasis\n// (**bold**, *italic*, `code`, ~~strike~~) plus block constructs (ATX headings,\n// bullet / numbered lists, blockquotes) and defers GitHub tables to the\n// existing box-drawing table renderer. Fenced code blocks are handled upstream\n// by AssistantBody before this sees the text.\n//\n// Like the syntax highlighter, emphasis is expressed as Ink <Text> props\n// (bold/italic/color), never raw ANSI, so width measurement stays correct.\n\nexport interface InlineToken {\n text: string;\n bold?: boolean;\n italic?: boolean;\n code?: boolean;\n strike?: boolean;\n}\n\n/**\n * Parse one line of prose into inline-emphasis tokens. Markers are stripped\n * (this is display text, not length-preserving). `_..._` is intentionally NOT\n * treated as italic so snake_case / file_names aren't mangled. An unterminated\n * marker is emitted literally so no text is ever lost.\n */\nexport function parseInline(text: string): InlineToken[] {\n const tokens: InlineToken[] = [];\n let plain = '';\n let i = 0;\n const flush = () => {\n if (plain) {\n tokens.push({ text: plain });\n plain = '';\n }\n };\n while (i < text.length) {\n const ch = text[i] ?? '';\n const two = text.slice(i, i + 2);\n\n // `inline code` — highest precedence, no inner parsing.\n if (ch === '`') {\n const close = text.indexOf('`', i + 1);\n if (close > i) {\n flush();\n tokens.push({ text: text.slice(i + 1, close), code: true });\n i = close + 1;\n continue;\n }\n }\n // **bold**\n if (two === '**') {\n const close = text.indexOf('**', i + 2);\n if (close > i) {\n flush();\n tokens.push({ text: text.slice(i + 2, close), bold: true });\n i = close + 2;\n continue;\n }\n }\n // ~~strike~~\n if (two === '~~') {\n const close = text.indexOf('~~', i + 2);\n if (close > i) {\n flush();\n tokens.push({ text: text.slice(i + 2, close), strike: true });\n i = close + 2;\n continue;\n }\n }\n // *italic* — single asterisk only (the `**` case is handled above).\n if (ch === '*' && text[i + 1] !== '*') {\n const close = text.indexOf('*', i + 1);\n if (close > i + 1) {\n flush();\n tokens.push({ text: text.slice(i + 1, close), italic: true });\n i = close + 1;\n continue;\n }\n }\n plain += ch;\n i += 1;\n }\n flush();\n return tokens;\n}\n\nfunction InlineLine({ tokens, dim }: { tokens: InlineToken[]; dim?: boolean }): React.ReactElement {\n if (tokens.length === 0) return <Text> </Text>;\n return (\n <Text>\n {tokens.map((t, j) => (\n <Text\n // biome-ignore lint/suspicious/noArrayIndexKey: token order is stable per line\n key={j}\n color={t.code ? theme.accent : 'white'}\n bold={t.bold}\n italic={t.italic}\n strikethrough={t.strike}\n dimColor={dim}\n >\n {t.text}\n </Text>\n ))}\n </Text>\n );\n}\n\nconst HEADING_RE = /^(#{1,6})\\s+(.*)$/;\nconst BULLET_RE = /^(\\s*)[-*+]\\s+(.*)$/;\nconst NUMBERED_RE = /^(\\s*)(\\d+)\\.\\s+(.*)$/;\nconst QUOTE_RE = /^>\\s?(.*)$/;\n\n/**\n * Render assistant prose with markdown emphasis + block formatting. Tables are\n * routed through the existing box-drawing renderer; everything else is parsed\n * line-by-line.\n *\n * `contentWidth` is the real inner width of the panel that wraps this view\n * (the assistant entry's left-border + paddingLeft). When provided, tables\n * are sized against it so they don't overflow the panel; otherwise we fall\n * back to `termWidth`, which is correct for callers without a bordered\n * container. Non-table prose is unaffected — Ink handles its soft wrap.\n */\nexport function MarkdownView({\n text,\n termWidth,\n contentWidth,\n}: {\n text: string;\n termWidth: number;\n /** Real inner width of the surrounding panel. Defaults to `termWidth`. */\n contentWidth?: number;\n}): React.ReactElement {\n const lines = text.split('\\n');\n const rows: React.ReactNode[] = [];\n let i = 0;\n let key = 0;\n // Tables are the only width-sensitive path here; size them to the real\n // content area so a 2-col-chrome border (assistant panel) doesn't push\n // the last cell off the right edge and force an Ink wrap.\n const tableBudget = Math.max(20, contentWidth ?? termWidth);\n while (i < lines.length) {\n // GitHub table block → existing renderer.\n const tableEnd = detectTable(lines, i);\n if (tableEnd > i) {\n rows.push(\n <Text key={`t${key++}`}>{renderTable(lines.slice(i, tableEnd), tableBudget)}</Text>,\n );\n i = tableEnd;\n continue;\n }\n const line = lines[i] ?? '';\n i += 1;\n\n const heading = line.match(HEADING_RE);\n if (heading) {\n rows.push(\n <Text key={`h${key++}`} bold color={theme.accent}>\n {heading[2] ?? ''}\n </Text>,\n );\n continue;\n }\n const quote = line.match(QUOTE_RE);\n if (quote && line.startsWith('>')) {\n rows.push(\n <Box key={`q${key++}`} flexDirection=\"row\">\n <Text dimColor>{' '}</Text>\n <InlineLine tokens={parseInline(quote[1] ?? '')} dim />\n </Box>,\n );\n continue;\n }\n const bullet = line.match(BULLET_RE);\n if (bullet) {\n rows.push(\n <Box key={`b${key++}`} flexDirection=\"row\">\n <Text color={theme.accent}>{`${bullet[1] ?? ''}• `}</Text>\n <InlineLine tokens={parseInline(bullet[2] ?? '')} />\n </Box>,\n );\n continue;\n }\n const numbered = line.match(NUMBERED_RE);\n if (numbered) {\n rows.push(\n <Box key={`n${key++}`} flexDirection=\"row\">\n <Text color={theme.accent}>{`${numbered[1] ?? ''}${numbered[2]}. `}</Text>\n <InlineLine tokens={parseInline(numbered[3] ?? '')} />\n </Box>,\n );\n continue;\n }\n rows.push(<InlineLine key={`p${key++}`} tokens={parseInline(line)} />);\n }\n return <Box flexDirection=\"column\">{rows}</Box>;\n}\n","import { Box, Static, Text, useStdout } from 'ink';\nimport React, { useEffect, useState } from 'react';\nimport { type HLState, type Lang, detectLang, highlightLine } from '../highlight.js';\nimport { MarkdownView } from '../markdown.js';\nimport { theme } from '../theme.js';\n\nexport type HistoryEntry =\n | { id: number; kind: 'user'; text: string; queued?: boolean; pasteContent?: string }\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: 'brain';\n status: 'thinking' | 'answered' | 'ask_human' | 'denied';\n source: string;\n risk: 'low' | 'medium' | 'high' | 'critical';\n question: string;\n decision?: string;\n rationale?: string;\n }\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\n/**\n * Horizontal columns consumed by every bordered message panel in this\n * file (the user / assistant / warn / error cases below). 1 column for\n * the left-border glyph + 1 column for `paddingLeft={1}`. Width-sensitive\n * renderers in the panel body (notably the markdown table renderer) must\n * budget against `termWidth - MESSAGE_PANEL_CHROME_WIDTH`, otherwise they\n * lay out for the full terminal width and Ink wraps the last cell at the\n * right edge, producing a 2-column shift / extra row.\n *\n * Exported so the regression test can assert against the same number the\n * Entry uses — drift between the two would silently re-introduce the bug.\n */\nexport const MESSAGE_PANEL_CHROME_WIDTH = 2;\n\n/**\n * Compute the real inner content width of an assistant panel. Pulled out\n * as a named helper so the formula lives in exactly one place: both the\n * Entry render and the regression test import this, so a future change\n * to the chrome model (e.g. adding paddingRight) only has to be made\n * here and both sides stay in lockstep.\n */\nexport function assistantContentWidth(termWidth: number): number {\n return Math.max(20, termWidth - MESSAGE_PANEL_CHROME_WIDTH);\n}\n\nexport function History({ entries, streamingText, toolStream }: HistoryProps): React.ReactElement {\n const { stdout } = useStdout();\n // Track terminal dimensions imperatively so that every resize triggers a\n // re-render. We snapshot into state rather than deriving directly from\n // useStdout because Static children receive `termWidth` as a prop — if\n // the parent doesn't re-render on resize, the stale value gets baked\n // into committed scrollback entries. This ensures Entry components in\n // both Static (committed) and live-streaming regions use the current\n // width for table wrapping etc.\n const [termSize, setTermSize] = useState({\n columns: stdout?.columns ?? 80,\n rows: stdout?.rows ?? 24,\n });\n useEffect(() => {\n const handleResize = () => {\n setTermSize({ columns: stdout?.columns ?? 80, rows: stdout?.rows ?? 24 });\n };\n process.stdout.on('resize', handleResize);\n return () => {\n process.stdout.off('resize', handleResize);\n };\n }, [stdout]);\n const termWidth = termSize.columns;\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 ? <AssistantTail text={tail} /> : 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\n/**\n * The live \"ASSISTANT: (streaming...)\" tail shown below committed history\n * while a response streams in. Extracted so both the legacy `<Static>` History\n * and the scrollable viewport render an identical tail.\n */\nexport function AssistantTail({ text }: { text: string }): React.ReactElement {\n return (\n <Box\n flexDirection=\"column\"\n marginY={1}\n borderStyle=\"single\"\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderColor={theme.assistant}\n paddingLeft={1}\n >\n <Box flexDirection=\"row\">\n <Text bold color={theme.assistant}>\n {'ASSISTANT'}\n </Text>\n <Text dimColor>{' (streaming…)'}</Text>\n </Box>\n <Text color=\"white\">{text}</Text>\n </Box>\n );\n}\n\n/** Max code-block lines rendered before a \"+N more\" footer (mirrors ToolStreamBox). */\nconst MAX_CODE_LINES = 80;\n\nexport interface BodySegment {\n type: 'prose' | 'code';\n text: string;\n lang?: Lang;\n}\n\n/**\n * Split assistant text into prose and ```fenced``` code segments, in order.\n * Pure + testable. An unterminated fence treats the remainder as code.\n */\nexport function splitFencedBlocks(text: string): BodySegment[] {\n const lines = text.split('\\n');\n const segs: BodySegment[] = [];\n let prose: string[] = [];\n let code: string[] | null = null;\n let lang: Lang = 'plain';\n const flushProse = () => {\n if (prose.length > 0) {\n segs.push({ type: 'prose', text: prose.join('\\n') });\n prose = [];\n }\n };\n for (const line of lines) {\n const fence = line.match(/^\\s*```(.*)$/);\n if (fence) {\n if (code === null) {\n flushProse();\n code = [];\n lang = detectLang(fence[1] ?? '');\n } else {\n segs.push({ type: 'code', text: code.join('\\n'), lang });\n code = null;\n lang = 'plain';\n }\n continue;\n }\n if (code !== null) code.push(line);\n else prose.push(line);\n }\n if (code !== null) segs.push({ type: 'code', text: code.join('\\n'), lang });\n flushProse();\n return segs;\n}\n\n/** Syntax-highlighted, framed code block. Each line is a row of <Text color>\n * segments (never raw ANSI), so Ink measures width by visible glyphs. */\nfunction CodeBlock({\n code,\n lang,\n contentWidth,\n}: { code: string; lang: Lang; contentWidth: number }): React.ReactElement {\n let lines = code.replace(/\\n+$/, '').split('\\n');\n const hidden = Math.max(0, lines.length - MAX_CODE_LINES);\n if (hidden > 0) lines = lines.slice(0, MAX_CODE_LINES);\n const gutterW = String(lines.length).length;\n // Reserve room for the border (1+1), paddingX (1+1), and the line-number\n // gutter so long lines truncate instead of wrapping out of the frame.\n // CodeBlock is already inside a panel with marginLeft=2, so we only subtract\n // its own chrome (border+paddingX = 4 chars) + gutter + 1 space.\n const maxW = Math.max(20, Math.min(contentWidth - 6 - gutterW - 1, 120));\n let carry: HLState = {};\n const rows = lines.map((raw) => {\n const display = raw.length > maxW ? `${raw.slice(0, maxW - 1)}…` : raw;\n const r = highlightLine(display, lang, carry);\n carry = r.carry;\n return r.tokens;\n });\n return (\n <Box\n flexDirection=\"column\"\n marginLeft={2}\n marginY={0}\n borderStyle=\"round\"\n borderColor={theme.borderDefault}\n paddingX={1}\n >\n {lang !== 'plain' ? <Text dimColor>{lang}</Text> : null}\n {rows.map((tokens, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: code lines are positional\n <Text key={i}>\n <Text dimColor>{`${String(i + 1).padStart(gutterW, ' ')} `}</Text>\n {tokens.length === 0\n ? ' '\n : tokens.map((t, j) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: token order is stable per line\n <Text key={j} color={t.color} dimColor={t.dim} bold={t.bold}>\n {t.text}\n </Text>\n ))}\n </Text>\n ))}\n {hidden > 0 ? (\n <Text dimColor italic>{`… +${hidden} more line${hidden === 1 ? '' : 's'}`}</Text>\n ) : null}\n </Box>\n );\n}\n\n/** Assistant message body: prose (with markdown tables) interleaved with\n * highlighted code blocks.\n *\n * - `contentWidth` is the real inner width of the surrounding panel. It is\n * forwarded to both `MarkdownView` (for tables) and `CodeBlock` (for line\n * truncation) so neither overflows the panel and forces Ink to wrap the\n * last cell at the right edge — a 2-column shift / extra row.\n * Optional, defaults to `termWidth`, so `AssistantBody` is still safe to\n * call from contexts without a bordered panel.\n */\nexport function AssistantBody({\n text,\n termWidth,\n contentWidth,\n}: {\n text: string;\n termWidth: number;\n /** Real inner width of the surrounding panel. Defaults to `termWidth`. */\n contentWidth?: number;\n}): React.ReactElement {\n const segments = splitFencedBlocks(text);\n const inner = contentWidth ?? termWidth;\n return (\n <Box flexDirection=\"column\">\n {segments.map((seg, i) =>\n seg.type === 'code' ? (\n // biome-ignore lint/suspicious/noArrayIndexKey: segment order is stable\n <CodeBlock key={i} code={seg.text} lang={seg.lang ?? 'plain'} contentWidth={inner} />\n ) : (\n // biome-ignore lint/suspicious/noArrayIndexKey: segment order is stable\n <MarkdownView key={i} text={seg.text} termWidth={inner} />\n ),\n )}\n </Box>\n );\n}\n\nexport const 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 */\nexport const ToolStreamBox = React.memo(function 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={theme.warn}>◆ </Text>\n <Text bold color={theme.tool}>\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' ? theme.diffAddBg : theme.diffDelBg;\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 brainStatusStyle(status: Extract<HistoryEntry, { kind: 'brain' }>['status']): {\n icon: string;\n color: string;\n} {\n switch (status) {\n case 'thinking':\n return { icon: '…', color: 'magenta' };\n case 'answered':\n return { icon: '⚖', color: 'cyan' };\n case 'ask_human':\n return { icon: '?', color: 'yellow' };\n case 'denied':\n return { icon: '×', color: 'red' };\n }\n}\n\nfunction brainRiskColor(risk: Extract<HistoryEntry, { kind: 'brain' }>['risk']): string {\n switch (risk) {\n case 'low':\n return 'green';\n case 'medium':\n return 'cyan';\n case 'high':\n return 'yellow';\n case 'critical':\n return 'red';\n }\n}\n\nexport const Entry = React.memo(function Entry({\n entry,\n termWidth,\n}: { entry: HistoryEntry; termWidth: number }): React.ReactElement {\n switch (entry.kind) {\n case 'user':\n return (\n <Box\n borderStyle=\"single\"\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderColor={theme.user}\n paddingLeft={1}\n >\n <Text>\n <Text bold color={theme.user}>\n {'USER '}\n </Text>\n <Text color=\"white\">{entry.text}</Text>\n {entry.queued ? <Text dimColor>{' (queued)'}</Text> : null}\n {entry.pasteContent ? (\n <>\n {entry.text ? '\\n' : null}\n <Text dimColor>\n {' ↳ '}\n {entry.pasteContent}\n </Text>\n </>\n ) : null}\n </Text>\n </Box>\n );\n case 'assistant': {\n // Subtract the panel's left-border + paddingLeft chrome from the\n // terminal width so the body lays out inside the box, not against\n // the full terminal. Tables in particular will overflow otherwise\n // (see assistantContentWidth).\n const contentWidth = assistantContentWidth(termWidth);\n return (\n <Box\n flexDirection=\"column\"\n marginY={1}\n borderStyle=\"single\"\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderColor={theme.assistant}\n paddingLeft={1}\n >\n <Box flexDirection=\"row\">\n <Text bold color={theme.assistant}>\n {'ASSISTANT'}\n </Text>\n </Box>\n <AssistantBody text={entry.text} termWidth={termWidth} contentWidth={contentWidth} />\n </Box>\n );\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 ? theme.success : theme.error}>{entry.ok ? '●' : '✗'}</Text>{' '}\n <Text bold color={theme.tool}>\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 (\n <Box\n borderStyle=\"single\"\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderColor={theme.warn}\n paddingLeft={1}\n >\n <Text color={theme.warn}>{entry.text}</Text>\n </Box>\n );\n case 'error':\n return (\n <Box\n borderStyle=\"single\"\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderColor={theme.error}\n paddingLeft={1}\n >\n <Text color={theme.error}>{entry.text}</Text>\n </Box>\n );\n case 'turn-summary':\n return <Text dimColor>{entry.text}</Text>;\n case 'brain': {\n const statusStyle = brainStatusStyle(entry.status);\n const riskColor = brainRiskColor(entry.risk);\n return (\n <Box\n flexDirection=\"column\"\n marginY={1}\n borderStyle=\"single\"\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderColor=\"magenta\"\n paddingLeft={1}\n >\n <Box flexDirection=\"row\" gap={1}>\n <Text bold color=\"magenta\">\n BRAIN\n </Text>\n <Text color={statusStyle.color}>{statusStyle.icon}</Text>\n <Text dimColor>{entry.source}</Text>\n <Text dimColor>·</Text>\n <Text color={riskColor}>{entry.risk}</Text>\n </Box>\n <Text color=\"white\">{entry.question}</Text>\n {entry.decision ? (\n <Text>\n <Text dimColor>Decision: </Text>\n <Text color={statusStyle.color}>{entry.decision}</Text>\n </Text>\n ) : null}\n {entry.rationale ? <Text dimColor>{entry.rationale}</Text> : null}\n </Box>\n );\n }\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\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n marginY={1}\n >\n <Text bold color=\"yellow\">\n ⚠ Confirm: {entry.toolName}\n </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","/**\n * Function-key decoding for raw terminal input.\n *\n * Ink's `useInput` does not decode F1–F12, so the Input component catches the\n * raw escape sequences from stdin (the same mechanism it uses for Home/End)\n * and turns them into a `KeyEvent.fn` number. F-keys are terminal-safe aliases\n * for chords some terminals intercept before the app sees them — most notably\n * Windows Terminal, which binds Ctrl+F to \"Find\".\n *\n * Kept in its own pure, dependency-free module so it can be unit-tested without\n * importing the Ink/React component tree.\n */\n\n/**\n * Map a raw terminal escape sequence to a plain function-key number (1–12),\n * or null when it isn't a plain F-key. Covers both the SS3 form (xterm F1–F4,\n * `ESC O P..S`) and the CSI `~` form used by F1–F12 across most terminals.\n * Modifier-augmented variants (Shift+F2 = `ESC [ 1 ; 2 Q`, etc.) are ignored.\n */\nexport function fnKey(data: string): number | null {\n switch (data) {\n case '\\x1bOP':\n case '\\x1b[11~':\n return 1;\n case '\\x1bOQ':\n case '\\x1b[12~':\n return 2;\n case '\\x1bOR':\n case '\\x1b[13~':\n return 3;\n case '\\x1bOS':\n case '\\x1b[14~':\n return 4;\n case '\\x1b[15~':\n return 5;\n case '\\x1b[17~':\n return 6;\n case '\\x1b[18~':\n return 7;\n case '\\x1b[19~':\n return 8;\n case '\\x1b[20~':\n return 9;\n case '\\x1b[21~':\n return 10;\n case '\\x1b[23~':\n return 11;\n case '\\x1b[24~':\n return 12;\n default:\n return null;\n }\n}\n","/**\n * Inline attachment chip token grammar, shared by the editable input for chip\n * rendering and whole-token cursor deletion. Kept in sync with the\n * AttachmentStore placeholder regex in @wrongstack/core. Two shapes:\n * - seq-keyed `[pasted|image|file #N …]` (a cosmetic suffix after the seq,\n * e.g. `, 123 lines`, is tolerated; legacy `[file #N]` is included)\n * - path-keyed `[file:<path>]`\n */\nexport const INLINE_TOKEN_SRC = '\\\\[(?:pasted|image|file) #\\\\d+[^\\\\]]*\\\\]|\\\\[file:[^\\\\]]+\\\\]';\n\nconst AT_END = new RegExp(`(?:${INLINE_TOKEN_SRC})$`);\nconst AT_START = new RegExp(`^(?:${INLINE_TOKEN_SRC})`);\nconst GLOBAL = new RegExp(INLINE_TOKEN_SRC, 'g');\n\n/**\n * If a whole chip ends immediately before `cursor`, return the buffer and\n * cursor with that chip removed (so one backspace deletes the entire token,\n * anywhere in the line). Returns null when there's no chip there — the caller\n * falls back to a single-character delete.\n */\nexport function deleteTokenBackward(\n buffer: string,\n cursor: number,\n): { buffer: string; cursor: number } | null {\n const m = buffer.slice(0, cursor).match(AT_END);\n if (!m) return null;\n const start = cursor - m[0].length;\n return { buffer: buffer.slice(0, start) + buffer.slice(cursor), cursor: start };\n}\n\n/**\n * Length of a chip that starts exactly at `cursor`, or 0 if none — lets a\n * forward delete drop the whole token in one keystroke.\n */\nexport function tokenLengthForward(buffer: string, cursor: number): number {\n const m = buffer.slice(cursor).match(AT_START);\n return m ? m[0].length : 0;\n}\n\nexport interface ChipSpan {\n text: string;\n /** True for an attachment chip token, false for a plain run. */\n chip: boolean;\n}\n\n/** Split a string into chip / plain spans for styled rendering. */\nexport function splitChips(text: string): ChipSpan[] {\n if (!text) return [];\n const spans: ChipSpan[] = [];\n let last = 0;\n for (const m of text.matchAll(GLOBAL)) {\n const idx = m.index ?? 0;\n if (idx > last) spans.push({ text: text.slice(last, idx), chip: false });\n spans.push({ text: m[0], chip: true });\n last = idx + m[0].length;\n }\n if (last < text.length) spans.push({ text: text.slice(last), chip: false });\n return spans;\n}\n\n/** One rendered cell of the input row. Exactly one of chip/prompt/cursor may be true. */\nexport interface InputCell {\n ch: string;\n /** Inside an attachment chip token. */\n chip: boolean;\n /** Part of the leading prompt (e.g. \"› \"). */\n prompt: boolean;\n /** The single cursor cell (rendered inverse). */\n cursor: boolean;\n}\n\n/**\n * Lay out `prompt + value` into wrapped rows of at most `width` columns, so the\n * input area can grow to exactly the number of visual lines its content needs.\n * Char-wrap (not word-wrap) keeps every cell index aligned with the buffer, so\n * the cursor lands on the right row/column. A cursor at end-of-buffer gets a\n * virtual trailing space cell (which may spill onto a fresh row, exactly like a\n * terminal). Newlines in `value` start a new row.\n */\nexport function layoutInputRows(\n prompt: string,\n value: string,\n cursor: number,\n width: number,\n): InputCell[][] {\n const w = Math.max(1, Math.floor(width));\n // Mark which value-character offsets fall inside a chip token.\n const chipAt = new Array<boolean>(value.length).fill(false);\n let off = 0;\n for (const span of splitChips(value)) {\n if (span.chip) for (let i = 0; i < span.text.length; i++) chipAt[off + i] = true;\n off += span.text.length;\n }\n const cursorIdx = prompt.length + Math.max(0, Math.min(cursor, value.length));\n const cells: InputCell[] = [];\n for (let i = 0; i < prompt.length; i++) {\n cells.push({ ch: prompt[i] as string, chip: false, prompt: true, cursor: false });\n }\n for (let i = 0; i < value.length; i++) {\n cells.push({ ch: value[i] as string, chip: chipAt[i] === true, prompt: false, cursor: false });\n }\n if (cursorIdx >= cells.length) {\n cells.push({ ch: ' ', chip: false, prompt: false, cursor: true });\n } else {\n (cells[cursorIdx] as InputCell).cursor = true;\n }\n // Wrap into rows: break on explicit '\\n' (consumed) or when a row fills `w`.\n const rows: InputCell[][] = [];\n let row: InputCell[] = [];\n for (const cell of cells) {\n if (cell.ch === '\\n') {\n rows.push(row);\n row = [];\n continue;\n }\n row.push(cell);\n if (row.length >= w) {\n rows.push(row);\n row = [];\n }\n }\n if (row.length > 0 || rows.length === 0) rows.push(row);\n return rows;\n}\n\n/**\n * Inverse of {@link layoutInputRows} for mouse clicks: given a click at visual\n * `(row, col)` (both 0-based; col is the column WITHIN the input area, i.e. the\n * prompt occupies the first columns of row 0), return the buffer cursor index\n * to place the caret. Mirrors layoutInputRows' wrapping exactly so the mapping\n * matches what's on screen. Clicking the prompt → start of buffer; clicking\n * past a row's last character → just after it; clicking below all rows → end of\n * buffer. Exported for the TUI input-click handler and unit tests.\n */\nexport function inputIndexAtRowCol(\n prompt: string,\n value: string,\n width: number,\n row: number,\n col: number,\n): number {\n const w = Math.max(1, Math.floor(width));\n // Flat cells: prompt (buf = -1) then value (buf = its index). Newlines are\n // consumed as row breaks, exactly like layoutInputRows.\n const flat: Array<{ ch: string; buf: number }> = [];\n for (let i = 0; i < prompt.length; i++) flat.push({ ch: prompt[i] as string, buf: -1 });\n for (let i = 0; i < value.length; i++) flat.push({ ch: value[i] as string, buf: i });\n\n const rows: Array<{ buf: number }[]> = [];\n const starts: number[] = []; // value index where each row's content begins\n let cur: Array<{ buf: number }> = [];\n let curStart = 0;\n for (const cell of flat) {\n if (cell.ch === '\\n') {\n rows.push(cur);\n starts.push(curStart);\n cur = [];\n curStart = cell.buf + 1; // content after the newline\n continue;\n }\n if (cur.length === 0 && cell.buf >= 0) curStart = cell.buf;\n cur.push({ buf: cell.buf });\n if (cur.length >= w) {\n rows.push(cur);\n starts.push(curStart);\n cur = [];\n curStart = -1; // set by the next pushed cell (or stays for a trailing newline)\n }\n }\n if (cur.length > 0 || rows.length === 0) {\n rows.push(cur);\n starts.push(curStart);\n }\n\n const clamp = (n: number) => Math.max(0, Math.min(value.length, n));\n if (row < 0) return 0;\n if (row >= rows.length) return value.length;\n const r = rows[row] as { buf: number }[];\n const c = Math.max(0, col);\n if (c < r.length) {\n const b = (r[c] as { buf: number }).buf;\n return b < 0 ? 0 : clamp(b); // prompt cell → start of value\n }\n // Past the last visible cell: place after the row's last value char…\n for (let k = r.length - 1; k >= 0; k--) {\n const b = (r[k] as { buf: number }).buf;\n if (b >= 0) return clamp(b + 1);\n }\n // …or, for an empty / prompt-only row, at the row's start offset.\n const start = starts[row];\n return clamp(start !== undefined && start >= 0 ? start : value.length);\n}\n","import { Box, Text, useInput, useStdin, useStdout } from 'ink';\nimport type React from 'react';\nimport { useEffect, useState } from 'react';\nimport { fnKey } from '../fn-keys.js';\nimport { type InputCell, layoutInputRows } from '../input-tokens.js';\n\nexport interface InputProps {\n prompt?: string;\n value: string;\n cursor: number;\n disabled?: boolean;\n hint?: string;\n onKey: (input: string, key: KeyEvent) => void;\n}\n\n/**\n * Render one wrapped row of input cells into styled `<Text>` spans. Consecutive\n * cells with the same style are coalesced into a single span; the cursor cell is\n * always emitted on its own (inverse). `promptColor` styles the leading prompt.\n */\nfunction renderRow(cells: InputCell[], rowKey: string, promptColor: string): React.ReactNode[] {\n const out: React.ReactNode[] = [];\n let run = '';\n let runStart = 0;\n let runStyle: 'prompt' | 'chip' | 'plain' | null = null;\n const flush = (end: number) => {\n if (run === '' || runStyle === null) return;\n const key = `${rowKey}-${runStart}`;\n if (runStyle === 'prompt')\n out.push(\n <Text key={key} color={promptColor}>\n {run}\n </Text>,\n );\n else if (runStyle === 'chip')\n out.push(\n <Text key={key} color=\"cyan\" dimColor>\n {run}\n </Text>,\n );\n else out.push(<Text key={key}>{run}</Text>);\n run = '';\n runStart = end;\n };\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i] as InputCell;\n if (cell.cursor) {\n flush(i);\n out.push(\n <Text key={`${rowKey}-c${i}`} inverse>\n {cell.ch}\n </Text>,\n );\n runStart = i + 1;\n continue;\n }\n const style = cell.prompt ? 'prompt' : cell.chip ? 'chip' : 'plain';\n if (style !== runStyle) {\n flush(i);\n runStyle = style;\n runStart = i;\n }\n run += cell.ch;\n }\n flush(cells.length);\n return out;\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 /** Function-key number 1–12 when a plain F-key was pressed, else undefined.\n * Ink's useInput does not decode F-keys, so these are caught from raw stdin\n * (same mechanism as Home/End) and surfaced here. F-keys are terminal-safe\n * aliases for chords some terminals intercept (e.g. Windows Terminal eats\n * Ctrl+F for \"Find\"). */\n fn?: number;\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 (data === '\\x1b[H' || data === '\\x1b[1~' || data === '\\x1bOH' || data === '\\x1b[7~')\n return 'home';\n if (data === '\\x1b[F' || data === '\\x1b[4~' || data === '\\x1bOF' || data === '\\x1b[8~')\n return 'end';\n return null;\n}\n\nexport const 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 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 s = data.toString();\n const kind = isHomeEnd(s);\n if (kind === 'home') {\n onKey('', { ...EMPTY_KEY, home: true });\n return;\n }\n if (kind === 'end') {\n onKey('', { ...EMPTY_KEY, end: true });\n return;\n }\n const fn = fnKey(s);\n if (fn !== null) onKey('', { ...EMPTY_KEY, fn });\n };\n stdin.on('data', handleData);\n return () => {\n stdin.off('data', handleData);\n };\n }, [stdin, disabled, onKey]);\n\n // Track terminal width so the input wraps at the real column count and the\n // box grows to exactly the number of visual rows the content needs.\n const { stdout } = useStdout();\n const [cols, setCols] = useState(stdout?.columns ?? 80);\n useEffect(() => {\n if (!stdout) return;\n const onResize = () => setCols(stdout.columns ?? 80);\n onResize();\n stdout.on('resize', onResize);\n return () => {\n stdout.off('resize', onResize);\n };\n }, [stdout]);\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 // One <Text> per wrapped row: the column box's height becomes the row count,\n // so a long message that soft-wraps (or any embedded newlines) gives the\n // input area a correct, line-count-driven height instead of clipping or\n // overflowing. layoutInputRows keeps the cursor on the right row/column.\n const rows = layoutInputRows(prompt, value, cursor, cols);\n\n return (\n <Box flexDirection=\"column\">\n {rows.map((row, i) =>\n row.length === 0 ? (\n // biome-ignore lint/suspicious/noArrayIndexKey: rows are positional and re-laid out every render\n <Text key={i}> </Text> // keep blank lines one row tall\n ) : (\n // biome-ignore lint/suspicious/noArrayIndexKey: rows are positional and re-laid out every render\n <Text key={i}>{renderRow(row, `r${i}`, promptColor)}</Text>\n ),\n )}\n {hint ? <Text dimColor>{hint}</Text> : null}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\nimport { theme } from '../theme.js';\n\n/** Which interactive context is active — drives which shortcuts the bar shows.\n * Ordered by priority (a confirm prompt overrides a picker, etc.). */\nexport interface KeyHintContext {\n confirm?: boolean;\n picker?: boolean; // file / slash / model / autonomy picker, or rewind overlay\n monitor?: boolean; // any full-screen monitor overlay open\n managed?: boolean; // managed viewport active (in-app scroll)\n mouse?: boolean; // full mouse mode on\n}\n\nexport interface Hint {\n key: string;\n label: string;\n}\n\nexport function hintsFor(ctx: KeyHintContext): Hint[] {\n if (ctx.confirm) {\n return [\n { key: 'y', label: 'yes' },\n { key: 'n', label: 'no' },\n { key: 'a', label: 'always' },\n { key: 'd', label: 'deny' },\n ];\n }\n if (ctx.picker) {\n return [\n { key: '↑↓', label: 'move' },\n { key: '↵', label: 'select' },\n { key: 'Esc', label: 'cancel' },\n ...(ctx.mouse ? [{ key: 'click', label: 'pick' }] : []),\n ];\n }\n if (ctx.monitor) {\n return [\n { key: 'Esc', label: 'close' },\n { key: '^F', label: 'fleet' },\n { key: '^G', label: 'agents' },\n { key: '^T', label: 'worktrees' },\n ];\n }\n // Idle / chat.\n const base: Hint[] = [{ key: '?', label: 'help' }];\n if (ctx.managed) base.push({ key: 'PgUp/PgDn', label: 'scroll' });\n if (ctx.mouse) base.push({ key: 'wheel', label: 'scroll' }, { key: 'click', label: 'select' });\n base.push({ key: '^G', label: 'agents' }, { key: '^C', label: 'stop' });\n return base;\n}\n\n/**\n * Persistent one-line keybinding hint bar shown at the very bottom of the TUI,\n * like a status-line cheat sheet. Context-aware: surfaces the keys that matter\n * for whatever is on screen (confirm prompt → y/n/a/d, picker → ↑↓/↵, etc.).\n */\nexport function KeyHintBar({ context }: { context: KeyHintContext }): React.ReactElement {\n const hints = hintsFor(context);\n return (\n <Box flexDirection=\"row\" paddingX={1}>\n {hints.map((h, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: hints are positional + stable\n <Box key={i} flexDirection=\"row\" marginRight={2}>\n <Text color={theme.accent}>{h.key}</Text>\n <Text dimColor>{` ${h.label}`}</Text>\n </Box>\n ))}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport React from 'react';\nimport type { FleetEntry } from '../app.js';\nimport { theme } from '../theme.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)\n parts.push(fmtBytes(tool.outputBytes));\n if (typeof tool.outputLines === 'number' && tool.outputLines > 0)\n 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 const LiveActivityStrip = React.memo(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() ||\n (e.recentMessages ?? []).slice(-1).map(fmtRecentMessage).join('');\n return (\n <Box key={e.id} flexDirection=\"row\" gap={1}>\n <Text color={theme.accent}>●</Text>\n <Text>{e.name.slice(0, 14).padEnd(14)}</Text>\n <Text dimColor>·</Text>\n <Text color={e.currentTool ? theme.success : theme.warn}>{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, useInput } from 'ink';\nimport type React from 'react';\n\nconst fmtElapsed = (ms: number): string => {\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n if (h > 0) return `${h}:${String(m % 60).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}`;\n if (m > 0) return `${m}:${String(s % 60).padStart(2, '0')}`;\n return `${s}s`;\n};\n\nexport interface PhaseMonitorProps {\n /** Per-phase state from the App reducer. */\n phases: Record<\n string,\n {\n name: string;\n status: string;\n completedTasks: number;\n totalTasks: number;\n startedAt?: number;\n }\n >;\n /** IDs of currently running phases. */\n runningPhaseIds: string[];\n /** Session-level elapsed ms. */\n elapsedMs: number;\n /** nowTick for elapsed time calculation. */\n nowTick: number;\n onClose: () => void;\n}\n\nconst PHASE_STATUS: Record<string, { icon: string; color: string; label: string }> = {\n pending: { icon: '⏳', color: 'gray', label: 'pending' },\n ready: { icon: '🔜', color: 'cyan', label: 'ready' },\n running: { icon: '▶', color: 'yellow', label: 'running' },\n paused: { icon: '⏸', color: 'magenta', label: 'paused' },\n completed: { icon: '✓', color: 'green', label: 'done' },\n failed: { icon: '✗', color: 'red', label: 'failed' },\n skipped: { icon: '⏭', color: 'gray', label: 'skipped' },\n};\n\nfunction fmtPhase(s: string): { icon: string; color: string; label: string } {\n return PHASE_STATUS[s] ?? { icon: '?', color: 'white', label: s };\n}\n\n/**\n * Full-screen PhaseMonitor overlay (Ctrl+P in TUI).\n *\n * Layout:\n * Header: project title + elapsed time + Ctrl+P to close\n * Per-phase rows:\n * · icon · name · status · (task progress) · started/elapsed\n * Bottom: keyboard hint\n */\nexport function PhaseMonitor({\n phases,\n runningPhaseIds,\n elapsedMs,\n nowTick,\n onClose,\n}: PhaseMonitorProps): React.ReactElement {\n useInput((_, key) => {\n if (key.escape) onClose();\n });\n\n const phaseList = Object.values(phases);\n const running = phaseList.filter((p) =>\n runningPhaseIds.includes(Object.keys(phases).find((k) => phases[k] === p) ?? ''),\n );\n const done = phaseList.filter((p) => p.status === 'completed' || p.status === 'skipped');\n const failed = phaseList.filter((p) => p.status === 'failed');\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n {/* Header */}\n <Box flexDirection=\"row\" gap={1} marginBottom={1}>\n <Text bold color=\"cyan\">\n PHASE MONITOR\n </Text>\n <Text dimColor>│</Text>\n <Text dimColor>⏱ {fmtElapsed(elapsedMs)}</Text>\n <Text dimColor>│</Text>\n <Text color=\"yellow\">▶{running.length}</Text>\n <Text dimColor>·</Text>\n <Text color=\"green\">✓{done.length}</Text>\n {failed.length > 0 ? (\n <>\n <Text dimColor>·</Text>\n <Text color=\"red\">✗{failed.length}</Text>\n </>\n ) : null}\n <Text dimColor>│ Ctrl+P / Esc to close</Text>\n </Box>\n\n {phaseList.length === 0 ? (\n <Text dimColor>No phases active. Use /autophase start [title] to begin.</Text>\n ) : (\n phaseList.map((phase, i) => {\n const s = fmtPhase(phase.status);\n const phaseKey = Object.keys(phases).find((k) => phases[k] === phase) ?? String(i);\n const isRunning = runningPhaseIds.includes(phaseKey);\n const elapsed = phase.startedAt ? fmtElapsed(nowTick - phase.startedAt) : '—';\n const progress =\n phase.totalTasks > 0 ? `${phase.completedTasks}/${phase.totalTasks}` : '—';\n\n return (\n <Box key={phaseKey} flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"row\" gap={1}>\n <Text color={s.color} bold>\n {s.icon}\n </Text>\n <Text bold>{phase.name}</Text>\n <Text dimColor>·</Text>\n <Text color={s.color}>{s.label}</Text>\n {isRunning ? (\n <>\n <Text dimColor>·</Text>\n <Text dimColor>elapsed {elapsed}</Text>\n </>\n ) : null}\n {phase.totalTasks > 0 && (\n <>\n <Text dimColor>·</Text>\n <Text dimColor>tasks {progress}</Text>\n </>\n )}\n </Box>\n </Box>\n );\n })\n )}\n\n {/* Keyboard hints */}\n <Box marginTop={1}>\n <Text dimColor>↑/↓ navigate phases · Esc close</Text>\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\n\nconst fmtElapsed = (ms: number): string => {\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n if (h > 0) return `${h}:${String(m % 60).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}`;\n if (m > 0) return `${m}:${String(s % 60).padStart(2, '0')}`;\n return `${s}s`;\n};\n\nexport interface PhasePanelProps {\n /** Per-phase state from the App reducer. */\n phases: Record<\n string,\n {\n name: string;\n status: string;\n completedTasks: number;\n totalTasks: number;\n startedAt?: number;\n }\n >;\n /** Active running phase IDs. */\n runningPhaseIds: string[];\n /** nowTick for elapsed time display. */\n nowTick: number;\n}\n\nconst STATUS: Record<string, { icon: string; color: string }> = {\n pending: { icon: '○', color: 'gray' },\n ready: { icon: '◐', color: 'cyan' },\n running: { icon: '●', color: 'yellow' },\n paused: { icon: '⏸', color: 'magenta' },\n completed: { icon: '✓', color: 'green' },\n failed: { icon: '✗', color: 'red' },\n skipped: { icon: '⊘', color: 'gray' },\n};\n\nfunction s(entry: string) {\n return STATUS[entry] ?? { icon: '?', color: 'white' };\n}\n\n/**\n * AutoPhase sidebar panel — shown below fleet panel when AutoPhase is active.\n * Compact 2-line-per-phase view optimized for the TUI layout.\n * Unlike PhaseMonitor (an overlay), PhasePanel is always visible while active.\n */\nexport function PhasePanel({ phases, nowTick }: PhasePanelProps): React.ReactElement | null {\n const list = Object.values(phases);\n if (list.length === 0) return null;\n\n const done = list.filter((p) => p.status === 'completed' || p.status === 'skipped').length;\n const running = list.filter((p) => p.status === 'running').length;\n const failed = list.filter((p) => p.status === 'failed').length;\n\n return (\n <Box\n flexDirection=\"column\"\n paddingX={1}\n borderStyle=\"single\"\n borderTop={false}\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n >\n {/* Header */}\n <Box flexDirection=\"row\" gap={2}>\n <Text dimColor>Phases</Text>\n <Text dimColor>│</Text>\n <Text color=\"yellow\">▶{running}</Text>\n <Text dimColor>✓{done}</Text>\n {failed > 0 ? <Text color=\"red\">✗{failed}</Text> : null}\n <Text dimColor>· {list.length} total</Text>\n <Text dimColor>· Ctrl+P for details</Text>\n </Box>\n\n {/* Per-phase compact rows */}\n {list.map((phase, i) => {\n const phaseKey = Object.keys(phases).find((k) => phases[k] === phase) ?? String(i);\n const st = s(phase.status);\n const progress = phase.totalTasks > 0 ? `${phase.completedTasks}/${phase.totalTasks}` : '';\n const elapsed = phase.startedAt ? fmtElapsed(nowTick - phase.startedAt) : '';\n\n return (\n <Box key={phaseKey} flexDirection=\"row\" gap={1}>\n <Text color={st.color}>{st.icon}</Text>\n <Text>{phase.name.slice(0, 14).padEnd(14)}</Text>\n <Text color={st.color} dimColor>\n {st.icon === '●' ? phase.status : ''}\n </Text>\n {progress ? <Text dimColor> {progress}</Text> : null}\n {elapsed && st.icon === '●' ? <Text dimColor> {elapsed}</Text> : null}\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { Box, type DOMElement, Text, measureElement, useStdout } from 'ink';\nimport type React from 'react';\nimport { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { theme } from '../theme.js';\nimport {\n AssistantTail,\n Entry,\n type HistoryEntry,\n type HistoryProps,\n MAX_STREAM_DISPLAY_CHARS,\n ToolStreamBox,\n tailForDisplay,\n} from './history.js';\n\n/** Max history entries laid out in the managed viewport at once. Generous\n * enough to cover a long session's in-app scrollback while bounding the\n * per-frame Yoga layout cost. */\nconst MAX_MOUNTED = 500;\n\nexport interface ScrollableHistoryProps extends HistoryProps {\n /** Lines scrolled up from the bottom. 0 = pinned to the newest output. */\n scrollOffset: number;\n /** Height of the viewport in rows, computed by App from the bottom region. */\n viewportRows: number;\n /** Last measured total content height (rows). Drives the scrollbar thumb. */\n totalLines: number;\n /** Reports the measured total content height (rows) after every layout so\n * App can clamp the scroll offset and drive the \"N new lines\" affordance. */\n onMeasure: (totalLines: number) => void;\n}\n\n/**\n * Right-edge scrollbar for the managed viewport. A 1-column track with a thumb\n * sized + positioned from (scrollOffset, totalLines, viewportRows). Always\n * reserves its column so toggling scrollability doesn't reflow the content.\n */\n/** Pure thumb geometry for the scrollbar: where the thumb starts and how many\n * cells it spans, given the track height, scroll offset, and total content\n * height. Exported for testing. */\nexport function scrollbarThumb(\n rows: number,\n offset: number,\n total: number,\n): { top: number; size: number; scrollable: boolean } {\n const scrollable = total > rows;\n if (!scrollable) return { top: 0, size: rows, scrollable: false };\n // Visible window top in content-line space; 0 = oldest, total = newest.\n const windowTop = Math.max(0, total - rows - offset);\n const size = Math.max(1, Math.round((rows / total) * rows));\n const rawTop = Math.round((windowTop / total) * rows);\n const top = Math.max(0, Math.min(rawTop, rows - size));\n return { top, size, scrollable: true };\n}\n\n/** Inverse of {@link scrollbarThumb}: given a clicked/dragged 0-based cell on a\n * track of `rows` height, return the scroll offset (rows up from the bottom)\n * that lands the visible window there. Cell 0 (top) → oldest content (max\n * offset); cell rows-1 (bottom) → newest (offset 0). Exported for testing and\n * the TUI scrollbar mouse handler. */\nexport function scrollOffsetForTrackRow(rows: number, total: number, cell: number): number {\n if (total <= rows) return 0;\n const maxOffset = total - rows;\n const clampedCell = Math.max(0, Math.min(rows - 1, cell));\n const windowTop = Math.round((clampedCell / Math.max(1, rows - 1)) * maxOffset);\n return Math.max(0, Math.min(maxOffset, maxOffset - windowTop));\n}\n\nfunction Scrollbar({\n rows,\n offset,\n total,\n}: { rows: number; offset: number; total: number }): React.ReactElement {\n const { top: thumbTop, size: thumbSize, scrollable } = scrollbarThumb(rows, offset, total);\n const cells: string[] = [];\n for (let i = 0; i < rows; i++) {\n cells.push(i >= thumbTop && i < thumbTop + thumbSize ? '█' : '│');\n }\n return (\n <Box flexDirection=\"column\" marginLeft={1} flexShrink={0}>\n {cells.map((c, i) => (\n <Text\n // biome-ignore lint/suspicious/noArrayIndexKey: fixed-height track, index is the row\n key={i}\n color={scrollable ? theme.accent : undefined}\n dimColor={!scrollable || c === '│'}\n >\n {c}\n </Text>\n ))}\n </Box>\n );\n}\n\n/**\n * Mouse-mode replacement for {@link History}. Instead of streaming each entry\n * into the terminal's native scrollback via `<Static>`, it renders all entries\n * into a fixed-height, `overflowY:'hidden'` viewport that the app scrolls\n * itself. The terminal's wheel is captured by mouse mode, so scrolling MUST be\n * managed here.\n *\n * Mechanism (Ink-5 verified): the parent Box is height-bounded with\n * `justifyContent:'flex-end'`, so when content overflows, its BOTTOM aligns to\n * the viewport bottom — newest output visible, oldest clipped off the top. That\n * is the pinned (offset 0) state for free, with no height math. Scrolling up is\n * a single `marginBottom={scrollOffset}` on the content box: it pushes the\n * content up, dropping `scrollOffset` rows off the bottom of the clip and\n * revealing that many older rows at the top. Ink's output clipper slices the\n * over/underflowing child at both edges while preserving ANSI styling.\n *\n * Streaming tails (assistant + tool) are the last children of the content box,\n * so they participate in the scrolled content and auto-follow when pinned.\n */\nexport function ScrollableHistory({\n entries,\n streamingText,\n toolStream,\n scrollOffset,\n viewportRows,\n totalLines,\n onMeasure,\n}: ScrollableHistoryProps): React.ReactElement {\n const { stdout } = useStdout();\n const [termWidth, setTermWidth] = useState(stdout?.columns ?? 80);\n useEffect(() => {\n const onResize = () => setTermWidth(stdout?.columns ?? 80);\n process.stdout.on('resize', onResize);\n return () => {\n process.stdout.off('resize', onResize);\n };\n }, [stdout]);\n\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 // Performance bound: the managed viewport re-lays-out every mounted entry\n // each frame (unlike the <Static> path, which prints once). Mounting only\n // the most recent MAX_MOUNTED keeps Yoga layout O(MAX_MOUNTED) regardless of\n // how long the session runs. Older entries stay in the reducer + on disk;\n // they're just not laid out. (True windowing — spacer boxes for measured\n // off-screen entries — is a later upgrade; this is the safe bound.)\n const hiddenCount = Math.max(0, entries.length - MAX_MOUNTED);\n const shown = hiddenCount > 0 ? entries.slice(-MAX_MOUNTED) : entries;\n\n // Measure the content box height after each commit and report it up only\n // when it changes. The content's own computed height does NOT depend on\n // viewportRows or marginBottom (margins/justify are layout-outside), so this\n // is stable — no measure → dispatch → re-measure feedback loop.\n const contentRef = useRef<DOMElement | null>(null);\n const lastReported = useRef(-1);\n useLayoutEffect(() => {\n const node = contentRef.current;\n if (!node) return;\n const { height } = measureElement(node);\n if (height !== lastReported.current) {\n lastReported.current = height;\n onMeasure(height);\n }\n // onMeasure is stable (dispatch from useReducer) and node is a ref.\n }, [onMeasure]);\n\n const vp = Math.max(1, viewportRows);\n return (\n <Box flexDirection=\"row\">\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n height={vp}\n overflowY=\"hidden\"\n justifyContent=\"flex-end\"\n >\n <Box\n ref={contentRef}\n flexDirection=\"column\"\n marginBottom={Math.max(0, scrollOffset)}\n flexShrink={0}\n >\n {hiddenCount > 0 ? (\n <Box flexShrink={0}>\n <Text dimColor italic>\n {` ↑ ${hiddenCount} earlier ${hiddenCount === 1 ? 'entry' : 'entries'} (scroll lives in this session; full log on disk)`}\n </Text>\n </Box>\n ) : null}\n {shown.map((entry) => (\n <Box key={entry.id} marginBottom={entry.kind === 'turn-summary' ? 1 : 0} flexShrink={0}>\n <Entry entry={entry} termWidth={termWidth} />\n </Box>\n ))}\n {tail ? <AssistantTail text={tail} /> : null}\n {toolTail ? (\n <ToolStreamBox\n name={toolStream!.name}\n text={toolTail}\n startedAt={toolStream!.startedAt}\n termWidth={termWidth}\n />\n ) : null}\n </Box>\n </Box>\n <Scrollbar rows={vp} offset={Math.max(0, scrollOffset)} total={totalLines} />\n </Box>\n );\n}\n\n// Re-exported for convenience so app.tsx can import both from one module.\nexport type { HistoryEntry };\n","import { Box, Text } from 'ink';\nimport type React from 'react';\n\n/** Selectable presets for the auto-proceed delay, so the field is fully\n * keyboard-cyclable (←/→) instead of needing typed numeric input. */\nexport const DELAY_PRESETS_MS = [0, 15_000, 30_000, 45_000, 60_000, 120_000];\nexport const SETTINGS_MODES = ['off', 'suggest', 'auto'] as const;\nexport type SettingsMode = (typeof SETTINGS_MODES)[number];\n\nexport function formatSettingsDelay(ms: number): string {\n if (ms === 0) return 'disabled';\n if (ms >= 60_000) return `${Math.round(ms / 60_000)}m`;\n return `${Math.round(ms / 1000)}s`;\n}\n\nconst MODE_DESC: Record<SettingsMode, string> = {\n off: 'Agent stops after each turn (normal)',\n suggest: 'Shows next-step suggestions after each turn',\n auto: 'Self-driving — agent continues automatically',\n};\n\nexport interface SettingsPickerProps {\n /** Focused row: 0 = mode, 1 = delay. */\n field: number;\n mode: SettingsMode;\n delayMs: number;\n hint?: string;\n}\n\nexport function SettingsPicker({\n field,\n mode,\n delayMs,\n hint,\n}: SettingsPickerProps): React.ReactElement {\n const rows = [\n { label: 'Default autonomy mode', value: mode, detail: MODE_DESC[mode] },\n {\n label: 'Auto-proceed delay',\n value: formatSettingsDelay(delayMs),\n detail: 'Wait before auto-continuing in auto mode',\n },\n ];\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text color=\"cyan\" bold>\n ━━ Settings ━━\n </Text>\n <Text dimColor>↑/↓ field · ←/→ change · Enter save · Esc cancel</Text>\n {rows.map((row, i) => (\n <Text key={row.label} color={i === field ? 'yellow' : undefined} inverse={i === field}>\n {i === field ? '› ' : ' '}\n <Text bold>{row.label.padEnd(22)}</Text>\n <Text color=\"cyan\">{String(row.value).padEnd(10)}</Text>\n <Text dimColor>{row.detail}</Text>\n </Text>\n ))}\n <Text dimColor>Persisted to ~/.wrongstack/config.json</Text>\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 { Box, Text, useInput } from 'ink';\nimport type React from 'react';\nimport type { WorktreeRow } from './worktree-panel.js';\n\nconst fmtElapsed = (ms: number): string => {\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n if (h > 0) return `${h}:${String(m % 60).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}`;\n if (m > 0) return `${m}:${String(s % 60).padStart(2, '0')}`;\n return `${s}s`;\n};\n\nconst WT_STATUS: Record<string, { icon: string; color: string; label: string }> = {\n allocating: { icon: '○', color: 'gray', label: 'allocating' },\n active: { icon: '●', color: 'yellow', label: 'active' },\n committing: { icon: '◐', color: 'cyan', label: 'committing' },\n merging: { icon: '⇡', color: 'blue', label: 'merging' },\n merged: { icon: '✓', color: 'green', label: 'merged' },\n 'needs-review': { icon: '⚠', color: 'magenta', label: 'needs-review' },\n failed: { icon: '✗', color: 'red', label: 'failed' },\n};\n\nfunction fmt(s: string) {\n return WT_STATUS[s] ?? { icon: '?', color: 'white', label: s };\n}\n\n/**\n * Full-screen Worktree monitor overlay (Ctrl+T to open, Ctrl+T/Esc to close).\n * Shows each AutoPhase worktree: branch, base→branch, owner phase, diff stats,\n * and conflict files for any worktree left in needs-review.\n */\nexport function WorktreeMonitor({\n worktrees,\n baseBranch,\n nowTick,\n onClose,\n}: {\n worktrees: Record<string, WorktreeRow & { baseBranch?: string }>;\n baseBranch?: string;\n nowTick: number;\n onClose: () => void;\n}): React.ReactElement {\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'w')) onClose();\n });\n\n const list = Object.values(worktrees);\n const active = list.filter((w) => ['active', 'committing', 'merging'].includes(w.status)).length;\n const merged = list.filter((w) => w.status === 'merged').length;\n const failed = list.filter((w) => w.status === 'failed' || w.status === 'needs-review').length;\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"green\" paddingX={1}>\n <Box flexDirection=\"row\" gap={1} marginBottom={1}>\n <Text bold color=\"green\">\n WORKTREE MONITOR\n </Text>\n <Text dimColor>│</Text>\n {baseBranch ? <Text dimColor>base {baseBranch}</Text> : null}\n <Text dimColor>│</Text>\n <Text color=\"yellow\">▶{active}</Text>\n <Text dimColor>·</Text>\n <Text color=\"green\">✓{merged}</Text>\n {failed > 0 ? (\n <>\n <Text dimColor>·</Text>\n <Text color=\"red\">✗{failed}</Text>\n </>\n ) : null}\n <Text dimColor>│ Ctrl+T / F4 / Esc to close</Text>\n </Box>\n\n {list.length === 0 ? (\n <Text dimColor>No worktrees. They appear when AutoPhase runs with isolation on.</Text>\n ) : (\n list.map((w) => {\n const s = fmt(w.status);\n const short = w.branch.replace(/^wstack\\/ap\\//, '');\n const elapsed = w.allocatedAt ? fmtElapsed(nowTick - w.allocatedAt) : '—';\n return (\n <Box key={w.branch} flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"row\" gap={1}>\n <Text color={s.color} bold>\n {s.icon}\n </Text>\n <Text bold>{short}</Text>\n <Text dimColor>·</Text>\n <Text color={s.color}>{s.label}</Text>\n <Text dimColor>· elapsed {elapsed}</Text>\n </Box>\n <Box flexDirection=\"row\" gap={1} marginLeft={2}>\n <Text dimColor>\n {w.baseBranch ?? baseBranch ?? 'base'} → {short}\n </Text>\n <Text dimColor>· owner: {w.ownerLabel}</Text>\n </Box>\n <Box flexDirection=\"row\" gap={1} marginLeft={2}>\n <Text color=\"green\">+{w.insertions}</Text>\n <Text color=\"red\">-{w.deletions}</Text>\n <Text dimColor>· {w.files} files</Text>\n </Box>\n {w.conflictFiles && w.conflictFiles.length > 0 ? (\n <Box marginLeft={2}>\n <Text color=\"magenta\">conflicts: {w.conflictFiles.join(', ')}</Text>\n </Box>\n ) : null}\n </Box>\n );\n })\n )}\n\n <Box marginTop={1}>\n <Text dimColor>Esc close · merge conflicts with /worktree merge <branch></Text>\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\n\nconst fmtElapsed = (ms: number): string => {\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n if (h > 0) return `${h}:${String(m % 60).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}`;\n if (m > 0) return `${m}:${String(s % 60).padStart(2, '0')}`;\n return `${s}s`;\n};\n\nexport interface WorktreeRow {\n branch: string;\n ownerLabel: string;\n status: string;\n insertions: number;\n deletions: number;\n files: number;\n allocatedAt: number;\n conflictFiles?: string[];\n}\n\nconst STATUS: Record<string, { icon: string; color: string }> = {\n allocating: { icon: '○', color: 'gray' },\n active: { icon: '●', color: 'yellow' },\n committing: { icon: '◐', color: 'cyan' },\n merging: { icon: '⇡', color: 'blue' },\n merged: { icon: '✓', color: 'green' },\n 'needs-review': { icon: '⚠', color: 'magenta' },\n failed: { icon: '✗', color: 'red' },\n};\n\nfunction st(status: string) {\n return STATUS[status] ?? { icon: '?', color: 'white' };\n}\n\n/**\n * Worktree sidebar panel — shown beside the AutoPhase PhasePanel when git\n * worktree isolation is active. One compact row per worktree (branch, owner\n * phase, diff stats, status). Always visible while live; details on Ctrl+T.\n */\nexport function WorktreePanel({\n worktrees,\n nowTick,\n}: {\n worktrees: Record<string, WorktreeRow>;\n nowTick: number;\n}): React.ReactElement | null {\n const list = Object.values(worktrees);\n if (list.length === 0) return null;\n\n const active = list.filter(\n (w) => w.status === 'active' || w.status === 'committing' || w.status === 'merging',\n ).length;\n const merged = list.filter((w) => w.status === 'merged').length;\n const failed = list.filter((w) => w.status === 'failed' || w.status === 'needs-review').length;\n\n return (\n <Box\n flexDirection=\"column\"\n paddingX={1}\n borderStyle=\"single\"\n borderTop={false}\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n >\n <Box flexDirection=\"row\" gap={2}>\n <Text dimColor>Worktrees</Text>\n <Text dimColor>│</Text>\n <Text color=\"yellow\">▶{active}</Text>\n <Text color=\"green\">✓{merged}</Text>\n {failed > 0 ? <Text color=\"red\">✗{failed}</Text> : null}\n <Text dimColor>· {list.length} total · Ctrl+T for details</Text>\n </Box>\n\n {list.map((w) => {\n const s = st(w.status);\n const conflict = w.status === 'needs-review';\n const elapsed = w.allocatedAt ? fmtElapsed(nowTick - w.allocatedAt) : '';\n return (\n <Box key={w.branch} flexDirection=\"row\" gap={1}>\n <Text color={s.color}>{s.icon}</Text>\n <Text>\n {w.branch\n .replace(/^wstack\\/ap\\//, '')\n .slice(0, 18)\n .padEnd(18)}\n </Text>\n <Text dimColor>{w.ownerLabel.slice(0, 12)}</Text>\n {conflict ? (\n <Text color=\"magenta\"> CONFLICT</Text>\n ) : (\n <Text dimColor>\n {' '}\n +{w.insertions}/-{w.deletions} {w.files}f\n </Text>\n )}\n {elapsed && (w.status === 'active' || w.status === 'committing') ? (\n <Text dimColor> {elapsed}</Text>\n ) : null}\n </Box>\n );\n })}\n </Box>\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 { 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 {\n message: `Killed ${pids.length} process${pids.length === 1 ? '' : 'es'}: ${pids.join(', ')}`,\n };\n }\n\n if (sub === 'force') {\n getProcessRegistry().forceBreakerOpen();\n const pids = getProcessRegistry().killAll({ force: true });\n if (pids.length === 0)\n return { message: 'Circuit breaker forced open. No processes to kill.' };\n return {\n message: `Force-killed ${pids.length} process${pids.length === 1 ? '' : 'es'}: ${pids.join(', ')}`,\n };\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}\n","// Bracketed-paste accumulation, factored out of the TUI key handler so the\n// (fiddly) marker logic can be unit-tested in isolation.\n//\n// A terminal in bracketed-paste mode wraps pasted text as\n// `\\x1b[200~<content>\\x1b[201~`. The OS/terminal can split that across\n// several stdin reads, and Ink's keypress parser sometimes strips the ESC\n// byte — leaving a bare `[200~` / `[201~`. So we:\n// - detect both the ESC-prefixed and bare marker forms,\n// - buffer fragments across calls until the closing marker arrives,\n// - hand back the fully-assembled payload exactly once.\n\nconst BEGIN = '[200~';\nconst END = '[201~';\n// biome-ignore lint/suspicious/noControlCharactersInRegex: paste markers carry a literal ESC\nconst BEGIN_RE = /\\x1b?\\[200~/g;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: paste markers carry a literal ESC\nconst END_RE = /\\x1b?\\[201~/g;\n// Partial ANSI CSI without the ESC prefix — Ink strips ESC from sequences\n// like \\x1b[0m, leaving [0m which would otherwise appear as literal text.\nconst PARTIAL_ANSI_RE = /^\\[[\\x30-\\x3f]*[\\x20-\\x2f]*[\\x40-\\x7e]/;\nconst ANSI_RE = new RegExp(\n [\n // CSI: ESC [ params* intermediates* final\n // params 0x30-0x3f (digits, ; : < = > ?)\n // intermediates 0x20-0x2f (space … /)\n // final 0x40-0x7e (@ … ~)\n '\\\\x1b\\\\[[\\\\x30-\\\\x3f]*[\\\\x20-\\\\x2f]*[\\\\x40-\\\\x7e]',\n // OSC: ESC ] … BEL (\\x07) or ST (\\x1b\\\\)\n '\\\\x1b\\\\][^\\\\x07\\\\x1b]*(?:\\\\x07|\\\\x1b\\\\\\\\)',\n // DCS: ESC P … ST (\\x1b\\\\)\n '\\\\x1bP[^\\\\x1b]*(?:\\\\x1b\\\\\\\\)',\n // SOS / PM: ESC X / ESC ^\n '\\\\x1b[XP][^\\\\x1b]*(?:\\\\x1b\\\\\\\\)',\n // Standalone ESC — guard only\n '\\\\x1b',\n ].join('|'),\n 'g',\n);\n\nexport interface PasteFeedResult {\n /** New accumulator state: a string while mid-paste, `null` when idle. */\n accum: string | null;\n /**\n * The fully-assembled paste payload when an end marker closed it, else\n * `null` (still buffering).\n */\n complete: string | null;\n}\n\n/**\n * Feed one keypress fragment into the paste accumulator.\n *\n * @param accum current accumulator (`null` when not inside a paste)\n * @param input the raw keypress string for this event\n * @returns `null` when `input` is not part of a paste (the caller should\n * handle it as normal input); otherwise the updated accumulation state.\n */\nexport function feedPaste(accum: string | null, input: string): PasteFeedResult | null {\n if (accum === null && !input.includes(BEGIN)) {\n // If input starts with '[' but is not a paste marker, it may be a partial\n // ANSI CSI sequence whose ESC was stripped by Ink. Guard against it\n // appearing as literal text in the input buffer.\n if (input.startsWith('[') && !input.startsWith(BEGIN) && !input.startsWith(END)) {\n // Treat partial ANSI sequences (ESC stripped) as mid-paste content\n // so [0m doesn't leak into the buffer as literal text.\n if (PARTIAL_ANSI_RE.test(input)) {\n return { accum: '', complete: null };\n }\n // Bare '[' is not a paste marker and not a known partial ANSI\n // sequence — let it through as ordinary input.\n return null;\n }\n return null;\n }\n // Strip paste markers AND all ANSI sequences before accumulating.\n const piece = input.replace(BEGIN_RE, '').replace(END_RE, '').replace(ANSI_RE, '');\n const next = (accum ?? '') + piece;\n if (input.includes(END)) return { accum: null, complete: next };\n return { accum: next, complete: null };\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}\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 * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n Agent,\n AttachmentStore,\n ContentBlock,\n Director,\n EventBus,\n FleetEvent,\n QueueStore,\n SlashCommandRegistry,\n TokenCounter,\n} from '@wrongstack/core';\nimport { DefaultSessionRewinder } from '@wrongstack/core';\nimport { InputBuilder, buildGoalPreamble, formatTodosList, writeOut } from '@wrongstack/core';\nimport { type VisionAdapters, routeImagesForModel } from '@wrongstack/runtime/vision';\nimport { getProcessRegistry } from '@wrongstack/tools';\nimport { Box, type DOMElement, Text, measureElement, useApp, useStdout } from 'ink';\nimport React, { useCallback, useEffect, useMemo, useReducer, useRef, useState } from 'react';\nimport { readClipboardImage } from './clipboard.js';\nimport { AgentsMonitor } from './components/agents-monitor.js';\nimport {\n AUTONOMY_OPTIONS,\n type AutonomyOption,\n AutonomyPicker,\n} from './components/autonomy-picker.js';\nimport { BrainDecisionPrompt } from './components/brain-decision-prompt.js';\nimport { CheckpointTimeline } from './components/checkpoint-timeline.js';\nimport {\n type ConfirmDecision,\n ConfirmPrompt,\n confirmButtonSegments,\n} from './components/confirm-prompt.js';\nimport { FilePicker } from './components/file-picker.js';\nimport { FleetMonitor } from './components/fleet-monitor.js';\nimport { FleetPanel } from './components/fleet-panel.js';\nimport { HelpOverlay } from './components/help-overlay.js';\nimport { History, type HistoryEntry } from './components/history.js';\nimport { EMPTY_KEY, Input, type KeyEvent } from './components/input.js';\nimport { KeyHintBar } from './components/key-hint-bar.js';\nimport { LiveActivityStrip } from './components/live-activity-strip.js';\nimport { ModelPicker, type ProviderOption } from './components/model-picker.js';\nimport { PhaseMonitor } from './components/phase-monitor.js';\nimport { PhasePanel } from './components/phase-panel.js';\nimport { ScrollableHistory, scrollOffsetForTrackRow } from './components/scrollable-history.js';\nimport {\n DELAY_PRESETS_MS,\n SETTINGS_MODES,\n type SettingsMode,\n SettingsPicker,\n} from './components/settings-picker.js';\nimport { SlashMenu } from './components/slash-menu.js';\nimport { StatusBar, statusBarAutonomySpan, statusBarModelSpan } from './components/status-bar.js';\nimport { WorktreeMonitor } from './components/worktree-monitor.js';\nimport { WorktreePanel, type WorktreeRow } from './components/worktree-panel.js';\nimport { searchFiles } from './file-search.js';\nimport { type GitInfo, readGitInfo } from './git-info.js';\nimport {\n INLINE_TOKEN_SRC,\n deleteTokenBackward,\n inputIndexAtRowCol,\n layoutInputRows,\n tokenLengthForward,\n} from './input-tokens.js';\nimport { createKillSlashCommand } from './kill-slash.js';\nimport type { MouseEvent as TuiMouseEvent } from './mouse.js';\nimport { feedPaste } from './paste-accumulator.js';\nimport { createPsSlashCommand } from './ps-slash.js';\nimport { createQueueSlashCommand } from './queue-slash.js';\n\nexport interface QueueItem {\n id: number;\n displayText: string;\n blocks: ContentBlock[];\n}\n\n/** Rows the chat-history viewport scrolls per wheel tick (mouse mode). */\nconst WHEEL_STEP = 3;\n/** Floor for the scroll viewport so it never collapses to nothing when the\n * bottom region (overlays, wrapped input) is tall. */\nconst MIN_VIEWPORT = 3;\n/** Input prompt — mirrors the <Input> default so click-to-position-cursor maps\n * columns the same way the input renders them. */\nconst INPUT_PROMPT = '› ';\n\ntype SerialAutonomyStage =\n | { phase: 'idle' }\n | { phase: 'decide'; reason: string }\n | { phase: 'execute'; task: string }\n | { phase: 'reflect'; status: 'success' | 'failure' | 'aborted' | 'skipped'; note?: string }\n | { phase: 'sleep'; ms: number }\n | { phase: 'paused' }\n | { phase: 'stopped' }\n | { phase: 'error'; message: string };\n\ntype ParallelAutonomyStage =\n | { phase: 'idle' }\n | { phase: 'decompose' }\n | { phase: 'fanout'; slots: number }\n | { phase: 'await'; taskIds: string[] }\n | { phase: 'aggregate'; successCount: number; total: number; goalComplete: boolean }\n | { phase: 'sleep'; ms: number }\n | { phase: 'stopped' }\n | { phase: 'error'; message: string };\n\ntype AutonomyStage = SerialAutonomyStage | ParallelAutonomyStage;\n\n/** Per-subagent state tracked live from the FleetBus. */\nexport interface FleetEntry {\n id: string;\n name: string;\n provider?: string;\n model?: string;\n status: 'idle' | 'running' | 'success' | 'failed' | 'timeout' | 'stopped';\n streamingText: string;\n iterations: number;\n toolCalls: number;\n recentTools: Array<{\n name: string;\n ok?: boolean;\n durationMs?: number;\n outputBytes?: number;\n outputLines?: number;\n at: number;\n }>;\n recentMessages: Array<{ text: string; at: number }>;\n cost: number;\n startedAt: number;\n lastEventAt: number;\n /**\n * Tool the subagent is currently inside, set on `tool.started` and\n * cleared on `tool.executed`. Lets the FleetPanel render \"running →\n * bash\" instead of an opaque \"running\". Undefined when no tool is\n * mid-flight (between iterations, before the first tool, or after\n * the last tool of a run).\n */\n currentTool?: { name: string; startedAt: number };\n /**\n * Absolute path to the per-subagent JSONL transcript on disk, when\n * one was created. Surfaced so the FleetPanel can render `path:`\n * dim under the entry — users grep / tail the file for full\n * visibility into the subagent's run.\n */\n transcriptPath?: string;\n /**\n * Most recent budget warning: subagent hit a soft limit and the\n * coordinator is auto-extending. Rendered in FleetPanel as:\n * \"⚡ hitting tool_calls limit (350/400) — extending\"\n * Cleared on the next fleetDone or fleetStart.\n */\n budgetWarning?: { kind: string; used: number; limit: number; at: number };\n /**\n * Cumulative auto-extension grants for this subagent. Surfaced as a\n * persistent \"⚡×N\" badge in the monitor and 4th status line so the user\n * can see how often never-die kept the agent alive. Survives across tasks\n * within the same subagent entry (unlike `budgetWarning`, which clears).\n */\n extensions?: number;\n /**\n * Latest context window fill percentage (0–1, can exceed 1 when over budget).\n * Emitted on every `iteration.completed` via `ctx.pct` event.\n * Rendered as a colored progress bar in the AgentsMonitor.\n */\n ctxPct?: number;\n /** Estimated total tokens in the context window (from ctx.pct event). */\n ctxTokens?: number;\n /** Provider's max context window in tokens (from ctx.pct event). */\n ctxMaxTokens?: number;\n /**\n * Human-readable reason for terminal failure, when known.\n * E.g. \"provider_auth\", \"rate_limit\", \"timeout\", \"budget_iterations\".\n * Shown in the Fleet timeline and the per-agent card in the agents monitor.\n */\n failureReason?: string;\n}\n\n/** A registered slash command matched against the user's current / query. */\nexport interface SlashCommandMatch {\n name: string;\n description: string;\n argsHint?: string;\n isBuiltin: boolean;\n}\n\nexport function selectedSlashCommandLine(picker: {\n open: boolean;\n matches: SlashCommandMatch[];\n selected: number;\n}): string | null {\n if (!picker.open || picker.matches.length === 0) return null;\n const picked = picker.matches[picker.selected];\n return picked ? `/${picked.name}` : null;\n}\n\nexport interface AppProps {\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 queue across crashes; rehydrated on mount, written on every mutation. */\n queueStore?: QueueStore;\n /** Reflects the policy's --yolo flag for the status bar's \"⚠ YOLO\" chip. */\n yolo?: boolean;\n /**\n * Query the live YOLO state from the permission policy. Called after\n * every slash-command dispatch so `/yolo off` (which mutates the\n * policy inside the CLI) is immediately reflected in the status bar.\n * Mirrors the `agent.ctx.model` → `setLiveModel` pattern used for\n * provider/model sync.\n */\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 goes to\n * 'eternal' the TUI drives `runOneIteration()` from a 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 goes to\n * 'eternal-parallel' the TUI drives `runOneIteration()` from a 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. The\n * TUI installs this on mount to render each iteration as a timeline\n * entry the moment it lands — strictly more responsive than reading\n * goal.json after the fact.\n */\n subscribeEternalIteration?: (\n fn: (entry: import('@wrongstack/core').JournalEntry) => void,\n ) => () => void;\n /**\n * Subscribe to per-iteration stage transitions from the autonomy engines.\n * Drives `state.eternalStage` used by the status bar to show the\n * engine's current location.\n */\n subscribeEternalStage?: (fn: (stage: AutonomyStage) => void) => () => void;\n /**\n * Subscribe to AutoPhase phase/task events from the PhaseOrchestrator.\n * Drives `state.autoPhase` used by the PhaseMonitor component.\n * Handlers receive the event name and payload from PhaseEventMap.\n */\n subscribeAutoPhase?: (handler: (event: string, payload: unknown) => void) => () => void;\n /**\n * Read the persisted autonomy settings (defaultMode, autoProceedDelayMs).\n * Used by the SettingsPicker in the TUI on mount and after Ctrl+S toggle.\n */\n getSettings?: () => { mode: 'off' | 'suggest' | 'auto'; delayMs: number };\n /**\n * Persist autonomy settings changes. Returns null on success, or an\n * error string on failure (so the TUI can display it as a hint).\n */\n saveSettings?: (s: { mode: 'off' | 'suggest' | 'auto'; delayMs: number }) =>\n | string\n | null\n | Promise<string | null>;\n /**\n * Predict likely next steps after a completed turn (/next). The CLI owns the\n * gating (toggle + autonomy off) and returns [] when disabled, so the App can\n * call it unconditionally on a done turn. Display-only — never executed.\n */\n predictNext?: (input: {\n userRequest: string;\n assistantSummary: string;\n }) => Promise<string[]>;\n /**\n * SDD session context getter. When an SDD session is active, returns\n * the AI prompt context to inject into user messages so the model\n * knows it's in a spec-building conversation.\n */\n getSDDContext?: () => string | null;\n /**\n * Process AI output for SDD auto-detection (spec, tasks, plan).\n * Called after every agent.run() completes. Returns displayable\n * status messages (e.g. \"✓ Spec detected and saved!\").\n */\n onSDDOutput?: (output: string) => Promise<string[]>;\n /** Surfaced in the startup banner. Falls back to \"dev\" when omitted. */\n appVersion?: string;\n /** Provider id shown in the banner (\"openai\", \"anthropic\", …). Defaults to \"agent\". */\n provider?: string;\n /** Wire family for the configured provider — rendered under provider in the banner. */\n family?: string;\n /** Last 3 chars of the active API key, shown in the banner for \"did I pick the right key?\" verification. */\n keyTail?: string;\n /**\n * Snapshot the keyed providers (and their model lists) for the\n * `/model` picker. Called every time the picker opens, so the result\n * stays in sync with config edits / new aliases. Async because the\n * host may need to load the models.dev catalog.\n */\n getPickableProviders?: () => Promise<ProviderOption[]>;\n /**\n * Apply a (provider, model) pair after the picker confirms. Returns\n * an error message on failure; null on success. The host owns the\n * actual Provider construction + Context mutation.\n */\n switchProviderAndModel?: (providerId: string, modelId: string) => string | null;\n /**\n * Apply an autonomy mode after the picker confirms. Returns\n * an error string on failure; null on success.\n */\n switchAutonomy?: (\n mode: 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel',\n ) => string | null;\n /**\n * Real max-context token budget for the *active model*, resolved by the\n * CLI via the ModelsRegistry. The provider object only knows its family\n * default (e.g. anthropic = 200k) which is wrong for variants like the\n * 1M-context Opus model. The status bar's context chip uses this when\n * provided and falls back to the provider baseline otherwise.\n */\n effectiveMaxContext?: number;\n /** Absolute project root for goal.json loading. */\n projectRoot?: string;\n onExit: (code: number) => void;\n /** Called when /clear is dispatched — the TUI should wipe its history entries (but keep the banner). */\n onClearHistory?: (\n dispatch: React.Dispatch<{ type: 'clearHistory' } | { type: 'resetContextChip' }>,\n ) => void;\n\n /**\n * Goal text passed from `--goal \"...\"` on the command line. When set,\n * the App mounts, renders the banner, then automatically dispatches\n * a synthetic `/goal <text>` so the user lands in goal mode without\n * having to type the slash command. Mutually advisory with `initialSteer`\n * — `initialGoal` wins if both are present.\n */\n initialGoal?: string;\n /**\n * Initial user message passed from `--ask \"...\"` on the command line.\n * Submitted verbatim as the first turn (no preamble) so users can\n * launch the TUI and pre-populate one turn from a shell alias / script.\n */\n initialAsk?: string;\n /** Directory for session JSONL files. Passed to App for /rewind. */\n sessionsDir?: string;\n /**\n * True when full mouse mode is active (clickable pickers + in-app wheel\n * scrolling). Implies alt-screen. Switches History to the scrollable\n * viewport and enables the mouse event handlers.\n */\n mouse?: boolean;\n /**\n * Subscribe to decoded mouse events (press/release/wheel with 1-based\n * col/row). Installed by run-tui only when mouse mode is on; the App wires\n * it on mount and tears it down on unmount. Returns an unsubscribe fn.\n */\n subscribeMouse?: (fn: (ev: import('./mouse.js').MouseEvent) => void) => () => void;\n /**\n * True when the managed full-screen viewport is the surface (alt-screen on).\n * Drives ScrollableHistory + in-app scroll + collapsibility, independent of\n * mouse. When false the app uses History + Ink <Static> (native scrollback).\n */\n managed?: boolean;\n\n // --- Fleet ---\n /** Live director for fleet panel rendering. Null when director mode is off. */\n director: Director | null;\n /** Optional roster for human-readable subagent names. */\n fleetRoster?: Record<string, { name: string }>;\n /**\n * Shared controller for the `/fleet stream on|off` slash command. The\n * App installs a dispatch-backed setter on mount so the slash command\n * can flip the reducer's `streamFleet` flag from the CLI surface.\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: (\n items: Array<'todos' | 'plan' | 'fleet' | 'git' | 'elapsed' | 'context' | 'cost'>,\n ) => void;\n /**\n * Controller for the agents monitor overlay. App installs a dispatch-backed\n * setter on mount so the `/agents on|off` slash command can toggle the\n * overlay without a round-trip.\n */\n agentsMonitorController?: {\n visible: boolean;\n setVisible: (visible: boolean) => void;\n };\n}\n\ntype DraftEntry = HistoryEntry extends infer T\n ? T extends { id: number }\n ? Omit<T, 'id'>\n : never\n : never;\n\ntype GoalSummary = {\n goal: string;\n goalState: 'active' | 'paused' | 'completed' | 'abandoned';\n iterations: number;\n lastTask?: string;\n lastStatus?: string;\n} | null;\n\ntype State = {\n entries: HistoryEntry[];\n buffer: string;\n cursor: number;\n streamingText: string;\n /**\n * Live tail of the currently streaming tool's stdout/progress text. Mirrors\n * the assistant `streamingText` pattern but is keyed by tool_use id so the\n * tail is cleared automatically when that tool finishes. Only one tool's\n * stream is shown at a time — multi-tool streaming is rare and stacking\n * tails fights for the same screen space.\n */\n toolStream: { toolUseId: string; name: string; text: string; startedAt: number } | null;\n status: 'idle' | 'running' | 'streaming' | 'aborting';\n interrupts: number;\n /**\n * Set when the user pressed Esc mid-iteration to interrupt the agent.\n * The NEXT submitted user message gets a STEERING prefix block prepended\n * so the model sees \"I interrupted you on purpose — focus on this\n * instead of resuming the prior task\". Cleared once that message\n * lands. Distinct from `interrupts` (which is the Ctrl+C exit ladder).\n */\n steeringPending: boolean;\n /**\n * Context snapshot captured at Esc time, replayed into the STEERING\n * preamble so the model sees exactly what it was mid-doing when the\n * user pulled the cord. Cleared together with `steeringPending`.\n * Without this the model has to guess from chat scrollback which\n * tools were live — and it can't see subagent state at all.\n */\n steerSnapshot: {\n runningTools: string[];\n subagents: Array<{ label: string; status: string; tool?: string }>;\n subagentsTerminated: number;\n partialAssistantText: string;\n } | null;\n hint: string;\n brain: {\n state: 'idle' | 'deciding' | 'answered' | 'ask_human' | 'denied';\n source?: string;\n risk?: 'low' | 'medium' | 'high' | 'critical';\n summary?: string;\n updatedAt?: number;\n };\n brainPrompt: {\n requestId: string;\n source: string;\n risk: 'low' | 'medium' | 'high' | 'critical';\n question: string;\n context?: string;\n options?: Array<{\n id: string;\n label: string;\n risk?: string;\n consequence?: string;\n recommended?: boolean;\n }>;\n } | null;\n nextId: number;\n picker: { open: boolean; query: string; matches: string[]; selected: number };\n /** Slash command picker — open while typing a / command. */\n slashPicker: { open: boolean; query: string; matches: SlashCommandMatch[]; selected: number };\n /** Tool calls currently in-flight, by tool_use id. Surface in the status bar. */\n runningTools: Map<string, { name: string; startedAt: number }>;\n /** FIFO of user messages typed while the agent was running. Drained when idle. */\n queue: QueueItem[];\n nextQueueId: number;\n /** Previous input strings for up/down navigation. */\n inputHistory: string[];\n /** 0 = current buffer (not in history), 1 = most recent, n = nth most recent. */\n historyIndex: number;\n /** Two-step model picker (provider → model) — opened by `/model`. */\n modelPicker: {\n open: boolean;\n step: 'provider' | 'model';\n providerOptions: ProviderOption[];\n modelOptions: string[];\n selected: number;\n pickedProviderId?: string;\n hint?: string;\n };\n /** Single-step autonomy mode picker — opened by `/autonomy`. */\n autonomyPicker: {\n open: boolean;\n options: AutonomyOption[];\n selected: number;\n hint?: string;\n };\n /** Autonomy settings editor — opened by `/settings` or Ctrl+S. */\n settingsPicker: {\n open: boolean;\n /** Focused row: 0 = mode, 1 = delay. */\n field: number;\n mode: SettingsMode;\n delayMs: number;\n hint?: string;\n };\n /** Pending tool confirmations — queue to handle multiple tools requesting confirmation. */\n confirmQueue: {\n toolUseId: string;\n toolName: string;\n input: unknown;\n suggestedPattern: string;\n resolve: (decision: 'yes' | 'no' | 'always' | 'deny') => void;\n }[];\n /** Incremented on /clear so the context chip re-reads from agent.ctx tokens. */\n contextChipVersion: number;\n /** Live fleet state: per-subagent entries from FleetBus events. Keyed by subagentId. */\n fleet: Record<string, FleetEntry>;\n /**\n * Leader-loop activity, synthesized for the AgentsMonitor overlay so the\n * user can see leader iteration / tool counts alongside subagent rows.\n * Driven by EventBus `iteration.started`/`iteration.completed`/`tool.started`/`tool.executed`.\n * Always present; renders as AGENT#0 LEADER in the monitor regardless of\n * whether any subagents exist.\n */\n leader: {\n iterations: number;\n toolCalls: number;\n recentTools: Array<{ name: string; ok?: boolean; durationMs?: number; at: number }>;\n currentTool?: { name: string; startedAt: number };\n startedAt: number;\n lastEventAt: number;\n /** True while inside an iteration (between iteration.started and iteration.completed). */\n iterating: boolean;\n /** Latest context window fill fraction (from ctx.pct event). */\n ctxPct?: number;\n /** Estimated total tokens in context window. */\n ctxTokens?: number;\n /** Provider max context in tokens. */\n ctxMaxTokens?: number;\n };\n /** Fleet-wide accumulated cost. */\n fleetCost: number;\n /** Fleet-wide token totals from the usage aggregator, for the monitor gauge. */\n fleetTokens: { input: number; output: number };\n /**\n * When true, subagent text activity is\n * streamed into the main history with an `AGENT#N` prefix. Toggled\n * with `/fleet stream on|off`. Tool calls stay in the live fleet\n * surfaces so chat history remains readable during multi-agent runs.\n */\n streamFleet: boolean;\n /** When true, the full graphical fleet monitor overlay is shown (Ctrl+F). */\n monitorOpen: boolean;\n /** When true, the agents monitor overlay is shown (Ctrl+G). */\n agentsMonitorOpen: boolean;\n /** When true, the keys-&-commands help overlay is shown (`?` on an empty prompt). */\n helpOpen: boolean;\n /**\n * Active or completed collaborative debugging session state.\n * Null when no collab session has run. Tracks counts + the event timeline\n * so FleetMonitor can render a live \"COLLAB SESSION\" banner and per-event\n * entries (bug.found / refactor.plan / critic.evaluation) as they arrive.\n */\n collabSession: {\n /** Null until the first collab subagent spawns; set on first bug.found. */\n sessionId: string | null;\n bugCount: number;\n planCount: number;\n evalCount: number;\n /** Most recent overall verdict when the session completes. */\n overallVerdict: 'approve' | 'needs_revision' | 'reject' | null;\n /** Timeline of collab events for the FleetMonitor overlay. */\n timeline: Array<{ at: number; icon: string; color: string; text: string }>;\n startedAt: number | null;\n } | null;\n /** Session checkpoints recorded by SessionWriter.writeCheckpoint() events. */\n checkpoints: Array<{\n promptIndex: number;\n promptPreview: string;\n ts: string;\n fileCount: number;\n }>;\n /** Checkpoint timeline overlay — null when closed. */\n rewindOverlay: {\n checkpoints: Array<{\n promptIndex: number;\n promptPreview: string;\n ts: string;\n fileCount: number;\n }>;\n selected: number;\n } | null;\n /** Live iteration-stage of the active autonomy engine. */\n eternalStage: AutonomyStage | null;\n /** Loaded from .wrongstack/goal.json on mount for startup banner. */\n goalSummary: GoalSummary;\n /** AutoPhase orchestrator state — rendered by PhaseMonitor. */\n autoPhase: {\n /** AutoPhase graph title. */\n title: string;\n /** Per-phase task summary, keyed by phaseId. */\n phases: Record<\n string,\n {\n name: string;\n status: string;\n completedTasks: number;\n totalTasks: number;\n startedAt?: number;\n }\n >;\n /** Active phase IDs (running phases). */\n runningPhaseIds: string[];\n /** Elapsed ms since graph start — drives the elapsed counter. */\n elapsedMs: number;\n /** True while the monitor overlay is open (Ctrl+P). */\n monitorOpen: boolean;\n } | null;\n /** Git-worktree isolation state — rendered by WorktreePanel/WorktreeMonitor. */\n worktrees: Record<string, WorktreeRow & { baseBranch?: string }>;\n /** Base branch worktrees fork from (for the monitor header). */\n worktreeBase?: string;\n /** True while the worktree monitor overlay is open (Ctrl+T). */\n worktreeMonitorOpen: boolean;\n /**\n * In-app chat scroll state, used only in mouse mode (the scrollable\n * viewport). In the default `<Static>` path these are inert.\n * scrollOffset — rows scrolled up from the bottom; 0 = pinned to newest.\n * totalLines — last measured content height (rows), from onMeasure.\n * viewportRows — last computed viewport height (rows).\n * pendingNewLines — rows added while scrolled up; drives the \"↓ N new\" hint.\n */\n scrollOffset: number;\n totalLines: number;\n viewportRows: number;\n pendingNewLines: number;\n};\n\ntype Action =\n | { type: 'addEntry'; entry: DraftEntry }\n | { type: 'setBuffer'; buffer: string; cursor: number }\n | { type: 'clearInput' }\n | { type: 'clearHistory' }\n | { type: 'streamDelta'; delta: string }\n | { type: 'streamReset' }\n | { type: 'status'; status: State['status'] }\n | { type: 'interrupt' }\n | { type: 'resetInterrupts' }\n /**\n * User pressed Esc mid-iteration — flag the next message for steering\n * AND stash a context snapshot so the preamble can tell the model\n * exactly what it was doing.\n */\n | { type: 'steerStart'; snapshot: State['steerSnapshot'] }\n /** Submit handler consumed the steering flag; reset. */\n | { type: 'steerConsume' }\n | { type: 'hint'; text: string }\n | {\n type: 'brainStatus';\n state: State['brain']['state'];\n source?: string;\n risk?: State['brain']['risk'];\n summary?: string;\n }\n | { type: 'brainPromptSet'; prompt: NonNullable<State['brainPrompt']> }\n | { type: 'brainPromptClear' }\n | { type: 'pickerOpen'; query: string }\n | { type: 'pickerClose' }\n | { type: 'pickerSetMatches'; query: string; matches: string[] }\n | { type: 'pickerMove'; delta: number }\n | { type: 'toolStarted'; id: string; name: string }\n | { type: 'toolEnded'; id?: string; name?: string }\n | { type: 'toolStreamAppend'; toolUseId: string; name: string; text: string; startedAt: number }\n | { type: 'toolStreamClear'; toolUseId?: string; name?: string }\n | { type: 'enqueue'; item: Omit<QueueItem, 'id'> }\n | { type: 'dequeueFirst' }\n | { type: 'queueClear' }\n | { type: 'queueDelete'; positions: number[] }\n | { type: 'slashPickerOpen'; query: string; matches: SlashCommandMatch[] }\n | { type: 'slashPickerClose' }\n | { type: 'slashPickerMove'; delta: number }\n | { type: 'modelPickerOpen'; providers: ProviderOption[] }\n | { type: 'modelPickerClose' }\n | { type: 'modelPickerMove'; delta: number }\n | { type: 'modelPickerPickProvider'; providerId: string; models: string[] }\n | { type: 'modelPickerBack' }\n | { type: 'modelPickerHint'; text?: string }\n | { type: 'autonomyPickerOpen'; options: AutonomyOption[] }\n | { type: 'autonomyPickerClose' }\n | { type: 'autonomyPickerMove'; delta: number }\n | { type: 'autonomyPickerHint'; text?: string }\n | { type: 'settingsOpen'; mode: SettingsMode; delayMs: number }\n | { type: 'settingsClose' }\n | { type: 'settingsFieldMove'; delta: number }\n | { type: 'settingsFieldSet'; field: number }\n | { type: 'settingsValueChange'; delta: number }\n | { type: 'settingsHint'; text?: string }\n | { type: 'historyPush'; text: string }\n | { type: 'historyUp' }\n | { type: 'historyDown' }\n | { type: 'confirmOpen'; info: State['confirmQueue'][0] }\n | { type: 'confirmClose' }\n | { type: 'resetContextChip' }\n // Fleet actions\n | { type: 'fleetSeed'; entries: FleetEntry[]; cost: number }\n | {\n type: 'fleetSpawn';\n id: string;\n name?: string;\n provider?: string;\n model?: string;\n transcriptPath?: string;\n }\n | { type: 'fleetStart'; id: string; taskId?: string }\n | { type: 'fleetDelta'; id: string; text: string }\n | { type: 'fleetMessage'; id: string; text: string }\n | {\n type: 'fleetTool';\n id: string;\n name?: string;\n ok?: boolean;\n durationMs?: number;\n outputBytes?: number;\n outputLines?: number;\n }\n /** tool.started: pin the current tool name for status display. */\n | { type: 'fleetToolStart'; id: string; name: string }\n /** tool.executed: clear the current tool (paired with fleetTool). */\n | { type: 'fleetToolEnd'; id: string }\n | {\n type: 'fleetUsage';\n id: string;\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n }\n | {\n type: 'fleetDone';\n id: string;\n status: FleetEntry['status'];\n iterations: number;\n toolCalls: number;\n /** Human-readable failure reason, e.g. \"provider_auth\", \"rate_limit\", \"timeout\". */\n failureReason?: string;\n }\n | {\n type: 'fleetBudgetWarning';\n id: string;\n kind: string;\n used: number;\n limit: number;\n }\n | {\n type: 'fleetBudgetExtended';\n id: string;\n totalExtensions: number;\n }\n | {\n type: 'fleetCtxPct';\n id: string;\n load: number;\n tokens: number;\n maxContext: number;\n }\n | { type: 'fleetCost'; cost: number; input?: number; output?: number }\n | { type: 'leaderIterStart' }\n | { type: 'leaderIterEnd' }\n | { type: 'leaderToolStart'; name: string }\n | { type: 'leaderToolEnd'; name: string; ok?: boolean; durationMs?: number }\n | { type: 'leaderCtxPct'; load: number; tokens: number; maxContext: number }\n | { type: 'setStreamFleet'; enabled: boolean }\n | { type: 'toggleMonitor' }\n | { type: 'toggleAgentsMonitor' }\n | { type: 'toggleHelp' }\n | { type: 'checkpointReceived'; cp: State['checkpoints'][0] }\n | { type: 'rewindOverlayOpen' }\n | { type: 'rewindOverlayClose' }\n | { type: 'rewindOverlayMove'; delta: number }\n | { type: 'sessionRewound'; toPromptIndex: number }\n | {\n type: 'eternalStage';\n stage: AutonomyStage;\n }\n | { type: 'goalSummary'; summary: GoalSummary }\n | { type: 'autoPhaseInit'; title: string }\n | {\n type: 'autoPhasePhaseUpdate';\n phaseId: string;\n name: string;\n status: string;\n completedTasks: number;\n totalTasks: number;\n startedAt?: number;\n }\n | { type: 'autoPhaseRunningPhases'; phaseIds: string[] }\n | { type: 'autoPhaseElapsed'; ms: number }\n | { type: 'autoPhaseMonitorToggle' }\n | { type: 'autoPhaseReset' }\n | {\n type: 'worktreeUpsert';\n handleId: string;\n row: Partial<WorktreeRow & { baseBranch?: string }>;\n baseBranch?: string;\n }\n | { type: 'worktreeRemove'; handleId: string }\n | { type: 'worktreeMonitorToggle' }\n // --- In-app chat scroll (mouse mode) ---\n /** Scroll by `delta` rows: +up (older), -down (newer). Clamped. */\n | { type: 'scrollBy'; delta: number }\n | { type: 'scrollTo'; offset: number }\n /** Scroll by a viewport page in `dir`. */\n | { type: 'scrollPage'; dir: 'up' | 'down' }\n /** Jump to the newest output (pinned). */\n | { type: 'scrollToBottom' }\n /** Jump to the oldest output. */\n | { type: 'scrollToTop' }\n /** Report the measured content height; re-clamps offset + tracks new lines. */\n | { type: 'setMeasuredLines'; totalLines: number }\n /** Report the computed viewport height; re-clamps offset. */\n | { type: 'setViewportRows'; rows: number }\n /**\n * Fold a batch of fleet/display actions through the reducer in ONE pass so\n * a 150ms burst of subagent events produces a single React render instead\n * of one per event. Order-preserving; only high-frequency display events\n * are batched (correctness-sensitive events stay immediate).\n */\n | { type: 'fleetBatch'; actions: Action[] }\n /** BugHunter emitted a bug.found event on the FleetBus. */\n | {\n type: 'collabBugFound';\n sessionId: string;\n bugId: string;\n severity: string;\n description: string;\n }\n /** RefactorPlanner emitted a refactor.plan event on the FleetBus. */\n | {\n type: 'collabPlanEmitted';\n sessionId: string;\n planId: string;\n riskScore: string;\n phaseCount: number;\n }\n /** Critic emitted a critic.evaluation event on the FleetBus. */\n | {\n type: 'collabEvalComplete';\n sessionId: string;\n evalId: string;\n verdict: string;\n score: number;\n }\n /** Collab session completed — overall verdict is available. */\n | {\n type: 'collabSessionDone';\n sessionId: string;\n verdict: 'approve' | 'needs_revision' | 'reject';\n }\n /** A collab subagent (bug-hunter / refactor-planner / critic) was spawned. */\n | { type: 'collabSubagentSpawned'; subagentId: string; role: string };\n\nexport function reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'addEntry': {\n // Append-only. We render finalized entries via Ink's <Static>,\n // which forbids removals or reordering — old items live on in the\n // terminal's native scrollback. Memory growth is bounded by the\n // terminal's own scrollback limits in practice.\n const appended = [...state.entries, { ...action.entry, id: state.nextId } as HistoryEntry];\n return { ...state, entries: appended, nextId: state.nextId + 1 };\n }\n case 'setBuffer':\n return { ...state, buffer: action.buffer, cursor: action.cursor };\n case 'clearInput':\n return {\n ...state,\n buffer: '',\n cursor: 0,\n historyIndex: 0,\n picker: { open: false, query: '', matches: [], selected: 0 },\n slashPicker: { open: false, query: '', matches: [], selected: 0 },\n };\n case 'clearHistory': {\n // Keep only the banner entry (always first, id=0). Any other entries\n // (user messages, assistant responses, slash results) are discarded so\n // the TUI starts fresh after /clear.\n const banner = state.entries.find((e) => e.kind === 'banner');\n return {\n ...state,\n entries: banner ? [banner] : state.entries,\n queue: [],\n nextQueueId: 1,\n scrollOffset: 0,\n pendingNewLines: 0,\n };\n }\n case 'streamDelta':\n return { ...state, streamingText: state.streamingText + action.delta };\n case 'streamReset':\n return { ...state, streamingText: '' };\n case 'status':\n return { ...state, status: action.status };\n case 'interrupt':\n return { ...state, interrupts: state.interrupts + 1 };\n case 'steerStart':\n return { ...state, steeringPending: true, steerSnapshot: action.snapshot };\n case 'steerConsume':\n return { ...state, steeringPending: false, steerSnapshot: null, interrupts: 0 };\n case 'resetInterrupts':\n return { ...state, interrupts: 0 };\n case 'hint':\n return { ...state, hint: action.text };\n case 'brainStatus':\n return {\n ...state,\n brain: {\n state: action.state,\n source: action.source,\n risk: action.risk,\n summary: action.summary,\n updatedAt: Date.now(),\n },\n };\n case 'brainPromptSet':\n return { ...state, brainPrompt: action.prompt };\n case 'brainPromptClear':\n return { ...state, brainPrompt: null };\n case 'pickerOpen':\n return {\n ...state,\n picker: { open: true, query: action.query, matches: state.picker.matches, selected: 0 },\n };\n case 'pickerClose':\n return {\n ...state,\n picker: { open: false, query: '', matches: [], selected: 0 },\n };\n case 'pickerSetMatches':\n // Guard against stale async results — only apply if query still matches.\n if (!state.picker.open || state.picker.query !== action.query) return state;\n return {\n ...state,\n picker: {\n ...state.picker,\n matches: action.matches,\n selected: Math.min(state.picker.selected, Math.max(0, action.matches.length - 1)),\n },\n };\n case 'pickerMove': {\n const n = state.picker.matches.length;\n if (n === 0) return state;\n const next = (state.picker.selected + action.delta + n) % n;\n return { ...state, picker: { ...state.picker, selected: next } };\n }\n case 'toolStarted': {\n const next = new Map(state.runningTools);\n next.set(action.id, { name: action.name, startedAt: Date.now() });\n return { ...state, runningTools: next };\n }\n case 'toolEnded': {\n const next = new Map(state.runningTools);\n if (action.id !== undefined && next.has(action.id)) {\n next.delete(action.id);\n return { ...state, runningTools: next };\n }\n if (action.name !== undefined) {\n // Fall back to clearing the oldest running entry with this name —\n // `tool.executed` doesn't carry the tool_use id, so we approximate.\n for (const [id, info] of next) {\n if (info.name === action.name) {\n next.delete(id);\n return { ...state, runningTools: next };\n }\n }\n }\n return state;\n }\n case 'toolStreamAppend': {\n // Only one tool's stream is shown at a time. If a different tool is\n // currently streaming, switch — last writer wins. Streams from\n // not-yet-acknowledged tools take over as soon as data arrives, which\n // matches user intuition (whatever just produced output is what's\n // visible).\n const cur = state.toolStream;\n if (cur && cur.toolUseId === action.toolUseId) {\n return {\n ...state,\n toolStream: { ...cur, text: cur.text + action.text },\n };\n }\n return {\n ...state,\n toolStream: {\n toolUseId: action.toolUseId,\n name: action.name,\n text: action.text,\n startedAt: action.startedAt,\n },\n };\n }\n case 'toolStreamClear': {\n if (state.toolStream === null) return state;\n // Clear only when the finishing tool matches the streaming one. A\n // stale `tool.executed` for a different tool must not blank the\n // currently-visible stream.\n const t = state.toolStream;\n if (action.toolUseId !== undefined && action.toolUseId !== t.toolUseId) return state;\n if (action.name !== undefined && action.toolUseId === undefined && action.name !== t.name)\n return state;\n return { ...state, toolStream: null };\n }\n case 'enqueue': {\n const item: QueueItem = { ...action.item, id: state.nextQueueId };\n return {\n ...state,\n queue: [...state.queue, item],\n nextQueueId: state.nextQueueId + 1,\n };\n }\n case 'dequeueFirst': {\n if (state.queue.length === 0) return state;\n return { ...state, queue: state.queue.slice(1) };\n }\n case 'queueClear': {\n if (state.queue.length === 0) return state;\n return { ...state, queue: [] };\n }\n case 'queueDelete': {\n if (state.queue.length === 0 || action.positions.length === 0) return state;\n // Positions are 1-based; convert to 0-based set for fast filtering.\n const drop = new Set(action.positions.map((p) => p - 1).filter((i) => i >= 0));\n const filtered = state.queue.filter((_, i) => !drop.has(i));\n if (filtered.length === state.queue.length) return state;\n return { ...state, queue: filtered };\n }\n case 'slashPickerOpen':\n return {\n ...state,\n slashPicker: { open: true, query: action.query, matches: action.matches, selected: 0 },\n };\n case 'slashPickerClose':\n return {\n ...state,\n slashPicker: { open: false, query: '', matches: [], selected: 0 },\n };\n case 'slashPickerMove': {\n const n = state.slashPicker.matches.length;\n if (n === 0) return state;\n const next = (state.slashPicker.selected + action.delta + n) % n;\n return { ...state, slashPicker: { ...state.slashPicker, selected: next } };\n }\n case 'historyPush': {\n if (action.text === '' || action.text === state.inputHistory[0]) return state;\n return { ...state, inputHistory: [action.text, ...state.inputHistory].slice(0, 100) };\n }\n case 'historyUp': {\n if (state.inputHistory.length === 0) return state;\n const next = Math.min(state.historyIndex + 1, state.inputHistory.length);\n const entry = state.inputHistory[next - 1] ?? '';\n return { ...state, historyIndex: next, buffer: entry, cursor: entry.length };\n }\n case 'historyDown': {\n if (state.historyIndex === 0) return state;\n const next = state.historyIndex - 1;\n const entry = next === 0 ? '' : (state.inputHistory[next - 1] ?? '');\n return { ...state, historyIndex: next, buffer: entry, cursor: entry.length };\n }\n case 'modelPickerOpen':\n return {\n ...state,\n modelPicker: {\n open: true,\n step: 'provider',\n providerOptions: action.providers,\n modelOptions: [],\n selected: 0,\n hint: undefined,\n },\n };\n case 'modelPickerClose':\n return {\n ...state,\n modelPicker: {\n open: false,\n step: 'provider',\n providerOptions: [],\n modelOptions: [],\n selected: 0,\n },\n };\n case 'modelPickerMove': {\n if (!state.modelPicker.open) return state;\n const len =\n state.modelPicker.step === 'provider'\n ? state.modelPicker.providerOptions.length\n : state.modelPicker.modelOptions.length;\n if (len === 0) return state;\n const next = (state.modelPicker.selected + action.delta + len) % len;\n return {\n ...state,\n modelPicker: { ...state.modelPicker, selected: next },\n };\n }\n case 'modelPickerPickProvider':\n return {\n ...state,\n modelPicker: {\n ...state.modelPicker,\n step: 'model',\n modelOptions: action.models,\n selected: 0,\n pickedProviderId: action.providerId,\n hint: undefined,\n },\n };\n case 'modelPickerBack':\n return {\n ...state,\n modelPicker: {\n ...state.modelPicker,\n step: 'provider',\n modelOptions: [],\n selected: 0,\n pickedProviderId: undefined,\n hint: undefined,\n },\n };\n case 'modelPickerHint':\n return {\n ...state,\n modelPicker: { ...state.modelPicker, hint: action.text },\n };\n case 'autonomyPickerOpen':\n return {\n ...state,\n autonomyPicker: { open: true, options: action.options, selected: 0, hint: undefined },\n };\n case 'autonomyPickerClose':\n return {\n ...state,\n autonomyPicker: { open: false, options: [], selected: 0 },\n };\n case 'autonomyPickerMove': {\n const n = state.autonomyPicker.options.length;\n if (n === 0) return state;\n const next = (state.autonomyPicker.selected + action.delta + n) % n;\n return {\n ...state,\n autonomyPicker: { ...state.autonomyPicker, selected: next },\n };\n }\n case 'autonomyPickerHint':\n return {\n ...state,\n autonomyPicker: { ...state.autonomyPicker, hint: action.text },\n };\n case 'settingsOpen':\n return {\n ...state,\n settingsPicker: {\n open: true,\n field: 0,\n mode: action.mode,\n delayMs: action.delayMs,\n hint: undefined,\n },\n };\n case 'settingsClose':\n return {\n ...state,\n settingsPicker: { ...state.settingsPicker, open: false, hint: undefined },\n };\n case 'settingsFieldMove': {\n // Two fields (mode / delay); wrap around.\n const next = (state.settingsPicker.field + action.delta + 2) % 2;\n return {\n ...state,\n settingsPicker: { ...state.settingsPicker, field: next, hint: undefined },\n };\n }\n case 'settingsFieldSet': {\n const field = action.field === 1 ? 1 : 0;\n return { ...state, settingsPicker: { ...state.settingsPicker, field, hint: undefined } };\n }\n case 'settingsValueChange': {\n if (state.settingsPicker.field === 0) {\n const i = SETTINGS_MODES.indexOf(state.settingsPicker.mode);\n const base = i < 0 ? 0 : i;\n const next = (base + action.delta + SETTINGS_MODES.length) % SETTINGS_MODES.length;\n return {\n ...state,\n settingsPicker: { ...state.settingsPicker, mode: SETTINGS_MODES[next]!, hint: undefined },\n };\n }\n const j = DELAY_PRESETS_MS.indexOf(state.settingsPicker.delayMs);\n // Snap an off-preset value onto the nearest step before moving.\n const base = j < 0 ? 0 : j;\n const next = (base + action.delta + DELAY_PRESETS_MS.length) % DELAY_PRESETS_MS.length;\n return {\n ...state,\n settingsPicker: {\n ...state.settingsPicker,\n delayMs: DELAY_PRESETS_MS[next]!,\n hint: undefined,\n },\n };\n }\n case 'settingsHint':\n return { ...state, settingsPicker: { ...state.settingsPicker, hint: action.text } };\n case 'confirmOpen':\n return { ...state, confirmQueue: [...state.confirmQueue, action.info] };\n case 'confirmClose':\n return { ...state, confirmQueue: state.confirmQueue.slice(1) };\n case 'resetContextChip':\n return { ...state, contextChipVersion: state.contextChipVersion + 1 };\n // --- Fleet ---\n case 'fleetSeed': {\n const seeded: Record<string, FleetEntry> = {};\n for (const e of action.entries) {\n seeded[e.id] = {\n ...e,\n recentTools: e.recentTools ?? [],\n recentMessages: e.recentMessages ?? [],\n };\n }\n return { ...state, fleet: seeded, fleetCost: action.cost };\n }\n case 'fleetSpawn': {\n const existing = state.fleet[action.id];\n const incomingName = action.name ?? action.id.slice(0, 8);\n // Placeholder names that should be overwritten when a better name arrives.\n // \"adhoc\" is what MultiAgentHost.spawn() seeds before Director.spawn()\n // assigns the real nickname. id-prefix fallbacks also count as placeholders.\n const isPlaceholderName = (name: string) =>\n name === 'adhoc' ||\n name === 'subagent' ||\n name === 'generic' ||\n name.startsWith('slot-') ||\n name === action.id.slice(0, 8);\n\n if (existing) {\n // If we already have an entry but it has a placeholder name and the\n // incoming name is a real improvement, update the name. This handles\n // the race between EventBus's \"subagent.spawned\" (which fires before\n // Director.spawn() assigns the nickname) and FleetBus's\n // \"subagent.assigned\" (which fires after the manifest is updated).\n if (\n isPlaceholderName(existing.name) &&\n !isPlaceholderName(incomingName) &&\n incomingName !== existing.name\n ) {\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: { ...existing, name: incomingName },\n },\n };\n }\n return state;\n }\n const entry: FleetEntry = {\n id: action.id,\n name: incomingName,\n provider: action.provider,\n model: action.model,\n status: 'idle',\n streamingText: '',\n iterations: 0,\n toolCalls: 0,\n recentTools: [],\n recentMessages: [],\n cost: 0,\n startedAt: Date.now(),\n lastEventAt: Date.now(),\n transcriptPath: action.transcriptPath,\n };\n return { ...state, fleet: { ...state.fleet, [action.id]: entry } };\n }\n case 'fleetToolStart': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: {\n ...cur,\n currentTool: { name: action.name, startedAt: Date.now() },\n lastEventAt: Date.now(),\n },\n },\n };\n }\n case 'fleetToolEnd': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: { ...cur, currentTool: undefined, lastEventAt: Date.now() },\n },\n };\n }\n case 'fleetStart': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: {\n ...cur,\n status: 'running' as const,\n streamingText: '',\n budgetWarning: undefined, // clear on restart\n startedAt: Date.now(),\n },\n },\n };\n }\n case 'fleetDelta': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n // Keep last 500 chars of streaming text for display (refactor plans are verbose)\n const appended = (cur.streamingText + action.text).slice(-500);\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: { ...cur, streamingText: appended, lastEventAt: Date.now() },\n },\n };\n }\n case 'fleetMessage': {\n const cur = state.fleet[action.id];\n const text = action.text.trim().replace(/\\s+/g, ' ');\n if (!cur || !text) return state;\n const now = Date.now();\n const recentMessages = [...(cur.recentMessages ?? []), { text, at: now }].slice(-2);\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: { ...cur, recentMessages, lastEventAt: now },\n },\n };\n }\n case 'fleetTool': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n const now = Date.now();\n const recentTools =\n action.name !== undefined\n ? [\n ...(cur.recentTools ?? []),\n {\n name: action.name,\n ok: action.ok,\n durationMs: action.durationMs,\n outputBytes: action.outputBytes,\n outputLines: action.outputLines,\n at: now,\n },\n ].slice(-2)\n : (cur.recentTools ?? []);\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: {\n ...cur,\n toolCalls: cur.toolCalls + 1,\n recentTools,\n lastEventAt: now,\n },\n },\n };\n }\n case 'fleetUsage': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: { ...state.fleet, [action.id]: { ...cur, lastEventAt: Date.now() } },\n };\n }\n case 'fleetDone': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: {\n ...cur,\n status: action.status,\n iterations: action.iterations,\n toolCalls: action.toolCalls,\n streamingText: '',\n currentTool: undefined,\n budgetWarning: undefined, // clear on done/restart\n lastEventAt: Date.now(),\n failureReason: action.failureReason,\n },\n },\n };\n }\n case 'fleetBudgetWarning': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: {\n ...cur,\n budgetWarning: {\n kind: action.kind,\n used: action.used,\n limit: action.limit,\n at: Date.now(),\n },\n lastEventAt: Date.now(),\n },\n },\n };\n }\n case 'fleetBudgetExtended': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: {\n ...cur,\n // The director sends the authoritative cumulative count; trust it\n // over a local increment so a dropped event can't desync the badge.\n extensions: action.totalExtensions,\n lastEventAt: Date.now(),\n },\n },\n };\n }\n case 'fleetCtxPct': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: {\n ...cur,\n ctxPct: action.load,\n ctxTokens: action.tokens,\n ctxMaxTokens: action.maxContext,\n lastEventAt: Date.now(),\n },\n },\n };\n }\n case 'fleetCost': {\n return {\n ...state,\n fleetCost: action.cost,\n fleetTokens:\n action.input !== undefined || action.output !== undefined\n ? {\n input: action.input ?? state.fleetTokens.input,\n output: action.output ?? state.fleetTokens.output,\n }\n : state.fleetTokens,\n };\n }\n case 'leaderIterStart': {\n return {\n ...state,\n leader: {\n ...state.leader,\n iterations: state.leader.iterations + 1,\n iterating: true,\n lastEventAt: Date.now(),\n },\n };\n }\n case 'leaderIterEnd': {\n return {\n ...state,\n leader: { ...state.leader, iterating: false, lastEventAt: Date.now() },\n };\n }\n case 'leaderToolStart': {\n return {\n ...state,\n leader: {\n ...state.leader,\n currentTool: { name: action.name, startedAt: Date.now() },\n lastEventAt: Date.now(),\n },\n };\n }\n case 'leaderToolEnd': {\n const now = Date.now();\n const recentTools = [\n ...state.leader.recentTools,\n { name: action.name, ok: action.ok, durationMs: action.durationMs, at: now },\n ].slice(-8);\n return {\n ...state,\n leader: {\n ...state.leader,\n toolCalls: state.leader.toolCalls + 1,\n currentTool: undefined,\n recentTools,\n lastEventAt: now,\n },\n };\n }\n case 'leaderCtxPct': {\n return {\n ...state,\n leader: {\n ...state.leader,\n ctxPct: action.load,\n ctxTokens: action.tokens,\n ctxMaxTokens: action.maxContext,\n lastEventAt: Date.now(),\n },\n };\n }\n case 'setStreamFleet': {\n return { ...state, streamFleet: action.enabled };\n }\n case 'toggleMonitor': {\n return { ...state, monitorOpen: !state.monitorOpen };\n }\n case 'toggleAgentsMonitor': {\n return { ...state, agentsMonitorOpen: !state.agentsMonitorOpen };\n }\n case 'toggleHelp': {\n return { ...state, helpOpen: !state.helpOpen };\n }\n case 'checkpointReceived': {\n const existing = state.checkpoints.find((c) => c.promptIndex === action.cp.promptIndex);\n if (existing) return state;\n return { ...state, checkpoints: [...state.checkpoints, action.cp] };\n }\n case 'rewindOverlayOpen': {\n return {\n ...state,\n rewindOverlay: { checkpoints: state.checkpoints, selected: state.checkpoints.length - 1 },\n };\n }\n case 'rewindOverlayClose': {\n return { ...state, rewindOverlay: null };\n }\n case 'rewindOverlayMove': {\n if (!state.rewindOverlay) return state;\n const len = state.rewindOverlay.checkpoints.length;\n if (len === 0) return { ...state, rewindOverlay: null };\n const selected = Math.max(0, Math.min(len - 1, state.rewindOverlay.selected + action.delta));\n return { ...state, rewindOverlay: { ...state.rewindOverlay, selected } };\n }\n case 'sessionRewound': {\n return {\n ...state,\n checkpoints: state.checkpoints.filter((c) => c.promptIndex <= action.toPromptIndex),\n rewindOverlay: null,\n };\n }\n case 'eternalStage': {\n return { ...state, eternalStage: action.stage };\n }\n case 'goalSummary': {\n return { ...state, goalSummary: action.summary };\n }\n case 'autoPhaseInit': {\n return {\n ...state,\n autoPhase: {\n title: action.title,\n phases: {},\n runningPhaseIds: [],\n elapsedMs: 0,\n monitorOpen: false,\n },\n };\n }\n case 'autoPhasePhaseUpdate': {\n // Lazily initialize autoPhase state on first phase event — the title\n // is not shown in the PhaseMonitor so a placeholder is fine here.\n const existing = state.autoPhase ?? {\n title: 'AutoPhase',\n phases: {},\n runningPhaseIds: [],\n elapsedMs: 0,\n monitorOpen: false,\n };\n return {\n ...state,\n autoPhase: {\n ...existing,\n phases: {\n ...existing.phases,\n [action.phaseId]: {\n name: action.name,\n status: action.status,\n completedTasks: action.completedTasks,\n totalTasks: action.totalTasks,\n startedAt: action.startedAt,\n },\n },\n },\n };\n }\n case 'autoPhaseRunningPhases': {\n if (!state.autoPhase) return state;\n return {\n ...state,\n autoPhase: { ...state.autoPhase, runningPhaseIds: action.phaseIds },\n };\n }\n case 'autoPhaseElapsed': {\n if (!state.autoPhase) return state;\n return { ...state, autoPhase: { ...state.autoPhase, elapsedMs: action.ms } };\n }\n case 'autoPhaseMonitorToggle': {\n if (!state.autoPhase) return state;\n return {\n ...state,\n autoPhase: { ...state.autoPhase, monitorOpen: !state.autoPhase.monitorOpen },\n };\n }\n case 'autoPhaseReset': {\n return { ...state, autoPhase: null };\n }\n case 'worktreeUpsert': {\n const prev = state.worktrees[action.handleId];\n const merged: WorktreeRow & { baseBranch?: string } = {\n branch: '',\n ownerLabel: '',\n status: 'active',\n insertions: 0,\n deletions: 0,\n files: 0,\n allocatedAt: Date.now(),\n ...prev,\n ...action.row,\n };\n return {\n ...state,\n worktrees: { ...state.worktrees, [action.handleId]: merged },\n worktreeBase: action.baseBranch ?? state.worktreeBase,\n };\n }\n case 'worktreeRemove': {\n if (!state.worktrees[action.handleId]) return state;\n const next = { ...state.worktrees };\n delete next[action.handleId];\n return { ...state, worktrees: next };\n }\n case 'worktreeMonitorToggle': {\n return { ...state, worktreeMonitorOpen: !state.worktreeMonitorOpen };\n }\n // --- In-app chat scroll (mouse mode) ---\n case 'scrollBy': {\n const maxOffset = Math.max(0, state.totalLines - state.viewportRows);\n const next = Math.max(0, Math.min(maxOffset, state.scrollOffset + action.delta));\n return {\n ...state,\n scrollOffset: next,\n pendingNewLines: next === 0 ? 0 : state.pendingNewLines,\n };\n }\n case 'scrollPage': {\n const page = Math.max(1, state.viewportRows - 1);\n const delta = action.dir === 'up' ? page : -page;\n const maxOffset = Math.max(0, state.totalLines - state.viewportRows);\n const next = Math.max(0, Math.min(maxOffset, state.scrollOffset + delta));\n return {\n ...state,\n scrollOffset: next,\n pendingNewLines: next === 0 ? 0 : state.pendingNewLines,\n };\n }\n case 'scrollTo': {\n const maxOffset = Math.max(0, state.totalLines - state.viewportRows);\n const next = Math.max(0, Math.min(maxOffset, action.offset));\n return {\n ...state,\n scrollOffset: next,\n pendingNewLines: next === 0 ? 0 : state.pendingNewLines,\n };\n }\n case 'scrollToBottom':\n return { ...state, scrollOffset: 0, pendingNewLines: 0 };\n case 'scrollToTop': {\n const maxOffset = Math.max(0, state.totalLines - state.viewportRows);\n return { ...state, scrollOffset: maxOffset };\n }\n case 'setMeasuredLines': {\n const newTotal = action.totalLines;\n const oldTotal = state.totalLines;\n const maxOffset = Math.max(0, newTotal - state.viewportRows);\n // Content grew while the user is scrolled up → keep the visible window\n // anchored on the same older rows by pushing the offset along with the\n // growth, and surface the new-line count for the \"jump to bottom\" hint.\n if (state.scrollOffset > 0 && newTotal > oldTotal) {\n const grew = newTotal - oldTotal;\n return {\n ...state,\n totalLines: newTotal,\n scrollOffset: Math.min(maxOffset, state.scrollOffset + grew),\n pendingNewLines: state.pendingNewLines + grew,\n };\n }\n // Pinned, or content shrank (e.g. /clear): re-clamp and keep following.\n return {\n ...state,\n totalLines: newTotal,\n scrollOffset: Math.min(state.scrollOffset, maxOffset),\n };\n }\n case 'setViewportRows': {\n const maxOffset = Math.max(0, state.totalLines - action.rows);\n return {\n ...state,\n viewportRows: action.rows,\n scrollOffset: Math.min(state.scrollOffset, maxOffset),\n };\n }\n case 'fleetBatch':\n // Fold each batched action through the reducer; one new state, one render.\n return action.actions.reduce((s, a) => reducer(s, a), state);\n // --- Collab session ---\n case 'collabSubagentSpawned': {\n // Lazily initialize collab state on the first subagent spawn.\n if (state.collabSession) return state;\n return {\n ...state,\n collabSession: {\n sessionId: null,\n bugCount: 0,\n planCount: 0,\n evalCount: 0,\n overallVerdict: null,\n timeline: [{ at: Date.now(), icon: '⚡', color: 'cyan', text: `${action.role} spawned` }],\n startedAt: Date.now(),\n },\n };\n }\n case 'collabBugFound': {\n const cs = state.collabSession;\n if (!cs) {\n // Lazily bootstrap collab state on first event.\n return {\n ...state,\n collabSession: {\n sessionId: action.sessionId,\n bugCount: 1,\n planCount: 0,\n evalCount: 0,\n overallVerdict: null,\n timeline: [\n {\n at: Date.now(),\n icon: '🐛',\n color: 'red',\n text: `bug: ${action.description.slice(0, 60)}…`,\n },\n ],\n startedAt: Date.now(),\n },\n };\n }\n const entry = {\n at: Date.now(),\n icon: '🐛',\n color: 'red',\n text: `bug [${action.severity}]: ${action.description.slice(0, 55)}…`,\n };\n return {\n ...state,\n collabSession: {\n ...cs,\n sessionId: action.sessionId,\n bugCount: cs.bugCount + 1,\n timeline: [entry, ...cs.timeline].slice(0, 30),\n },\n };\n }\n case 'collabPlanEmitted': {\n const cs = state.collabSession;\n if (!cs) return state;\n const entry = {\n at: Date.now(),\n icon: '📐',\n color: 'yellow',\n text: `plan [${action.riskScore}]: ${action.phaseCount} phases`,\n };\n return {\n ...state,\n collabSession: {\n ...cs,\n sessionId: action.sessionId,\n planCount: cs.planCount + 1,\n timeline: [entry, ...cs.timeline].slice(0, 30),\n },\n };\n }\n case 'collabEvalComplete': {\n const cs = state.collabSession;\n if (!cs) return state;\n const entry = {\n at: Date.now(),\n icon: '⚖️',\n color:\n action.verdict === 'approve' ? 'green' : action.verdict === 'reject' ? 'red' : 'yellow',\n text: `eval ${action.score}/10 → ${action.verdict}`,\n };\n return {\n ...state,\n collabSession: {\n ...cs,\n sessionId: action.sessionId,\n evalCount: cs.evalCount + 1,\n timeline: [entry, ...cs.timeline].slice(0, 30),\n },\n };\n }\n case 'collabSessionDone': {\n const cs = state.collabSession;\n if (!cs) return state;\n const entry = {\n at: Date.now(),\n icon: '🏁',\n color: 'green',\n text: `session done — ${action.verdict}`,\n };\n return {\n ...state,\n collabSession: {\n ...cs,\n overallVerdict: action.verdict,\n timeline: [entry, ...cs.timeline].slice(0, 30),\n },\n };\n }\n }\n}\n\nconst PASTE_THRESHOLD_CHARS = 200;\n\n/**\n * Build the steering preamble that gets prepended to a user's message\n * after they pressed Esc to interrupt the agent. The preamble carries\n * three things the model would otherwise have to infer:\n *\n * 1. Context — exactly what was in flight (tool calls, subagents,\n * partial assistant text). Without this the model rationalizes\n * from chat scrollback and often resumes the prior task by\n * accident.\n * 2. Authority — a short, explicit list of what the model is\n * allowed to do (abandon the prior plan, respawn fresh\n * subagents, ask for clarification). Models hedge unless they\n * believe they have permission to pivot hard.\n * 3. New direction — the user's actual instruction, fenced off.\n *\n * The block is user-role plain text. We deliberately don't use a\n * system role here — the human triggered this, so accountability\n * stays with their turn and the model can challenge / clarify\n * without violating role separation.\n *\n * Exported for the steering test that pins the contract.\n */\nexport function buildSteeringPreamble(\n snapshot: State['steerSnapshot'],\n newDirection: string,\n): string {\n const lines: string[] = ['[STEERING — I pressed Esc to interrupt you mid-task on purpose.', ''];\n\n // Section 1: what was running. Even an empty list is useful —\n // tells the model \"you weren't doing much yet, no work to mourn\".\n const ctx: string[] = [];\n if (snapshot?.runningTools && snapshot.runningTools.length > 0) {\n ctx.push(`- in-flight tools (now cancelled): ${snapshot.runningTools.join(', ')}`);\n }\n if (snapshot?.subagentsTerminated && snapshot.subagentsTerminated > 0) {\n const subDetails = snapshot.subagents\n .map((s) => `${s.label}${s.tool ? ` (was running: ${s.tool})` : ''}`)\n .join(', ');\n ctx.push(\n `- subagents (${snapshot.subagentsTerminated} terminated by me, do NOT await them): ${subDetails}`,\n );\n }\n if (snapshot?.partialAssistantText && snapshot.partialAssistantText.trim().length > 0) {\n const tail = snapshot.partialAssistantText.trim().slice(-300);\n ctx.push(`- your last partial output (truncated, for context only): \"${tail}\"`);\n }\n if (ctx.length > 0) {\n lines.push('What was happening when I cut you off:');\n lines.push(...ctx);\n lines.push('');\n }\n\n // Section 2: authority. Explicit grant so the model doesn't hedge.\n lines.push('You have authority to:');\n lines.push('- Abandon the prior plan entirely if the new direction makes it stale.');\n lines.push('- Re-spawn fresh subagents (with different roles or tasks) if needed.');\n lines.push('- Skip a polite \"should I continue?\" — just pivot.');\n lines.push('- Ask me to clarify if the new direction is genuinely ambiguous.');\n lines.push('');\n\n // Section 3: the user's instruction, fenced so the model can't\n // mistake it for part of the preamble.\n lines.push('New direction:');\n lines.push('---');\n lines.push(newDirection);\n lines.push('---');\n lines.push(']');\n\n return lines.join('\\n');\n}\n\n// `buildGoalPreamble` was relocated to @wrongstack/core so headless and\n// WebUI callers (which depend on @wrongstack/cli but not @wrongstack/tui)\n// can issue `/goal set` without dragging the TUI package in. Re-exported\n// from this module for backward compatibility with consumers still\n// importing from @wrongstack/tui; also used locally within this file\n// where `/goal …` is wired into the chat-input handler.\nexport { buildGoalPreamble } from '@wrongstack/core';\n\nexport function App({\n agent,\n slashRegistry,\n attachments,\n events,\n tokenCounter,\n visionAdapters = [],\n supportsVision,\n model,\n banner = true,\n queueStore,\n yolo = false,\n getYolo,\n getAutonomy,\n getEternalEngine,\n getParallelEngine,\n subscribeEternalIteration,\n subscribeEternalStage,\n subscribeAutoPhase,\n getSDDContext,\n onSDDOutput,\n appVersion,\n provider,\n family,\n keyTail,\n getPickableProviders,\n switchProviderAndModel,\n getSettings,\n saveSettings,\n predictNext,\n switchAutonomy,\n effectiveMaxContext,\n onExit,\n director,\n fleetRoster,\n onClearHistory,\n fleetStreamController,\n statuslineHiddenItems,\n setStatuslineHiddenItems,\n agentsMonitorController,\n initialGoal,\n initialAsk,\n sessionsDir,\n mouse = false,\n subscribeMouse,\n managed = false,\n}: AppProps): React.ReactElement {\n const { exit } = useApp();\n // Reactive mirrors of agent.ctx.{model,provider.id} so the status bar\n // re-renders when /model or /use mutate them. The banner is `Static`\n // and never re-renders — the user gets the textual confirmation from\n // the slash command's message in history instead.\n const [liveModel, setLiveModel] = useState<string>(model);\n const [liveProvider, setLiveProvider] = useState<string>(provider ?? 'agent');\n // CLI resolves the startup model's catalog limit, but /model can switch to a\n // different model without remounting App. Keep the denominator mutable so the\n // status bar follows the active model instead of a stale launch-time prop.\n const [activeMaxContext, setActiveMaxContext] = useState<number | undefined>(effectiveMaxContext);\n const [yoloLive, setYoloLive] = useState<boolean>(yolo);\n const [autonomyLive, setAutonomyLive] = useState<\n 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel'\n >(getAutonomy?.() ?? 'off');\n const [hiddenItems, setHiddenItems] = useState(statuslineHiddenItems);\n\n // Terminal row count, tracked reactively so the mouse-mode scroll viewport\n // can size itself against the live screen height. Only consumed in mouse\n // mode; harmless to track otherwise.\n const { stdout } = useStdout();\n const [termRows, setTermRows] = useState(stdout?.rows ?? 24);\n const [termCols, setTermCols] = useState(stdout?.columns ?? 80);\n useEffect(() => {\n const onResize = () => {\n setTermRows(process.stdout.rows ?? 24);\n setTermCols(process.stdout.columns ?? 80);\n };\n process.stdout.on('resize', onResize);\n return () => {\n process.stdout.off('resize', onResize);\n };\n }, []);\n\n // `mouse` (prop) is the launch-time CAPABILITY: it's only true when run-tui\n // set up the stdin proxy + mouse-event subscription, which only happens with\n // --mouse. `mouseLive` is the runtime ON/OFF, toggled by `/mouse`. Tracking\n // can only be enabled when the capability exists (otherwise mouse bytes would\n // pollute Ink), so /mouse refuses to turn on without --mouse.\n const [mouseLive, setMouseLive] = useState(mouse);\n // Whether the managed viewport (ScrollableHistory + in-app scroll) is the\n // active surface. Mirrors alt-screen; toggled by /altscreen and /mouse.\n const [managedLive, setManagedLive] = useState(managed);\n\n // Sync when parent re-loads from config file (e.g., after /statusline reset)\n useEffect(() => {\n setHiddenItems(statuslineHiddenItems);\n }, [statuslineHiddenItems]);\n\n // Push local changes back to the parent controller so /statusline sees them\n useEffect(() => {\n setStatuslineHiddenItems(hiddenItems);\n }, [setStatuslineHiddenItems, hiddenItems]);\n\n const projectRoot = agent.ctx.projectRoot;\n\n // Load goal.json on mount to show startup banner with goal state\n useEffect(() => {\n if (!projectRoot) return;\n const goalPath = path.join(projectRoot, '.wrongstack', 'goal.json');\n fs.readFile(goalPath, 'utf8')\n .then((raw) => {\n const goal = JSON.parse(raw);\n if (goal?.goal && typeof goal.iterations === 'number') {\n const lastEntry = goal.journal?.[goal.journal.length - 1];\n dispatch({\n type: 'goalSummary',\n summary: {\n goal: goal.goal,\n goalState: goal.goalState ?? 'active',\n iterations: goal.iterations,\n lastTask: lastEntry?.task,\n lastStatus: lastEntry?.status,\n },\n });\n }\n })\n .catch(() => {\n // No goal file yet — that's fine\n });\n }, [projectRoot]);\n\n const [state, dispatch] = useReducer(reducer, {\n entries: banner\n ? [\n {\n id: 0,\n kind: 'banner' as const,\n version: appVersion ?? 'dev',\n provider: provider ?? 'agent',\n model,\n cwd: agent.ctx.cwd,\n family,\n keyTail,\n },\n ]\n : [],\n buffer: '',\n cursor: 0,\n streamingText: '',\n toolStream: null,\n status: 'idle' as const,\n interrupts: 0,\n steeringPending: false,\n steerSnapshot: null,\n hint: '',\n brain: { state: 'idle' as const },\n brainPrompt: null,\n nextId: 1,\n picker: { open: false, query: '', matches: [], selected: 0 },\n slashPicker: { open: false, query: '', matches: [], selected: 0 },\n runningTools: new Map(),\n queue: [],\n nextQueueId: 1,\n inputHistory: [],\n historyIndex: 0,\n modelPicker: {\n open: false,\n step: 'provider' as const,\n providerOptions: [],\n modelOptions: [],\n selected: 0,\n },\n autonomyPicker: { open: false, options: [], selected: 0 },\n settingsPicker: { open: false, field: 0, mode: 'off', delayMs: 0 },\n confirmQueue: [],\n contextChipVersion: 0,\n fleet: {},\n leader: {\n iterations: 0,\n toolCalls: 0,\n recentTools: [],\n currentTool: undefined,\n startedAt: Date.now(),\n lastEventAt: Date.now(),\n iterating: false,\n },\n fleetCost: 0,\n fleetTokens: { input: 0, output: 0 },\n streamFleet: true,\n monitorOpen: false,\n agentsMonitorOpen: false,\n helpOpen: false,\n collabSession: null,\n checkpoints: [],\n rewindOverlay: null,\n eternalStage: null,\n goalSummary: null,\n autoPhase: null,\n worktrees: {},\n worktreeMonitorOpen: false,\n scrollOffset: 0,\n totalLines: 0,\n viewportRows: 0,\n pendingNewLines: 0,\n });\n\n const builderRef = useRef<InputBuilder | null>(null);\n if (builderRef.current === null) {\n builderRef.current = new InputBuilder({ store: attachments });\n }\n\n // Bracketed-paste accumulator. A single paste can be delivered across\n // several stdin/keypress events: only the first carries the \\x1b[200~\n // begin marker and only the last carries \\x1b[201~. We buffer every\n // fragment here between those markers and finalize once, so a paste never\n // fragments into multiple placeholders or leaks newlines into the buffer.\n // `null` means \"not currently inside a paste\".\n const pasteAccumRef = useRef<string | null>(null);\n // Safety net: if the closing \\x1b[201~ marker never arrives (a terminal\n // dropped it, or Ink split the escape across chunks), flush the buffered\n // payload after a short idle period so accumulation can't swallow input\n // indefinitely. Real pastes deliver all fragments back-to-back, well\n // inside this window.\n const pasteFlushTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const activeCtrlRef = useRef<AbortController | null>(null);\n // Set once we've asked Ink to unmount on a Ctrl+C exit. A synchronous ref\n // (not React state) because consecutive SIGINTs can fire faster than a\n // re-render — without it, `stateRef.current.interrupts` reads stale and a\n // wedged unmount could never escalate to a hard exit.\n const exitRequestedRef = useRef(false);\n // Prevent re-entrant handleKey: some terminals emit \\r\\n as two separate\n // stdin events for Enter. While the first event is being processed (submit\n // or picker accept), the second arrives with stale state and would trigger\n // a duplicate action. The gate blocks the stale-second event entirely.\n const inputGateRef = useRef(false);\n // Separate guard JUST for the submit path. The full `inputGateRef`\n // is held across `await foo()` blocks (picker accept, model picker\n // commit) — that's fine because those resolve in milliseconds. But\n // `await submit()` resolves only when `agent.run()` finishes, which\n // can be minutes for a delegated subagent task. Using the same gate\n // would lock ALL keystrokes (typing, backspace, slash menu) for the\n // entire agent run. This timestamp-based guard fires for the few\n // milliseconds needed to debounce a terminal-side `\\r\\n` double-event\n // and then auto-releases — leaving the input live for the user.\n const lastEnterAtRef = useRef(0);\n // Maps an inline attachment token (e.g. `[pasted #1, 123 lines]`) to a short\n // preview of its content, so the chat-history entry can show the collapsed\n // text below the message. Append-only for the lifetime of the session; the\n // token strings are unique per attachment seq, so stale entries are inert.\n const tokenPreviewsRef = useRef<Map<string, string>>(new Map());\n // The status-bar chip surfaces the basename so multiple WrongStack\n // windows running against different repos are immediately distinguishable.\n // Empty / root fallback to undefined so the chip just hides itself.\n const projectName = React.useMemo(() => {\n const base = path.basename(projectRoot);\n return base && base !== path.sep ? base : undefined;\n }, [projectRoot]);\n\n // Source of truth for the streamed assistant text — kept here, not in\n // React state, because we need to read it synchronously when `agent.run`\n // returns. The React `streamingText` shown in the live tail is throttled\n // (~10fps) for redraw cost, so it can lag the actual stream by up to\n // FLUSH_MS. Reading from this ref instead removes the race where the\n // final chunk lands in pending after run() returns and ends up flashing\n // into the next frame's tail (leaking into scrollback).\n const streamingTextRef = useRef('');\n const pendingDeltaRef = useRef('');\n const flushTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Latest state snapshot — async callbacks (the queue drainer, slash command\n // closures) read this instead of capturing `state` to avoid stale closures.\n const stateRef = useRef<State>(state);\n stateRef.current = state;\n const draftRef = useRef({ buffer: state.buffer, cursor: state.cursor });\n draftRef.current = { buffer: state.buffer, cursor: state.cursor };\n\n // ── Mouse mode: viewport geometry + event routing ─────────────────────\n // Measures the bottom region (everything below the scroll viewport) so the\n // viewport height can be derived as termRows − bottomHeight. One ref over the\n // whole region instead of per-block bookkeeping. Mouse mode only.\n const bottomRef = useRef<DOMElement | null>(null);\n // Wraps the rows ABOVE any open picker (live strip + input). Its measured\n // height tells the click handler the absolute screen row where a picker's\n // items begin, so a click can be mapped to a list index.\n const prePickerRef = useRef<DOMElement | null>(null);\n const preRowsRef = useRef(0);\n // Wraps just the LiveActivityStrip (the rows ABOVE the input). Its measured\n // height locates the input's first screen row for click-to-position-cursor.\n const liveStripRef = useRef<DOMElement | null>(null);\n const liveStripRowsRef = useRef(0);\n // useLayoutEffect (not useEffect) so the viewport is sized BEFORE paint — no\n // one-frame flash. measureElement here only READS the already-computed Yoga\n // height (cheap), and the dispatch is guarded to fire only when the height\n // actually changed, so this stays a stable measure-and-set (no churn loop,\n // and streaming tokens never trigger a setViewportRows because the bottom\n // region's height doesn't change while the chat viewport streams).\n React.useLayoutEffect(() => {\n if (!managedLive) return;\n const node = bottomRef.current;\n if (!node) return;\n const { height } = measureElement(node);\n if (prePickerRef.current) {\n preRowsRef.current = measureElement(prePickerRef.current).height;\n }\n if (liveStripRef.current) {\n liveStripRowsRef.current = measureElement(liveStripRef.current).height;\n }\n const s = stateRef.current;\n const affordance = s.scrollOffset > 0 && s.pendingNewLines > 0 ? 1 : 0;\n // Bias the viewport DOWN by one row: an extra blank chat row is invisible,\n // but a status bar pushed off-screen is not.\n const vp = Math.max(MIN_VIEWPORT, termRows - height - affordance - 1);\n if (vp !== s.viewportRows) {\n dispatch({ type: 'setViewportRows', rows: vp });\n }\n // stable deps: stateRef (ref), dispatch (stable from useReducer),\n // termRows is a prop of the effect scope.\n }, [managedLive, termRows]);\n\n // Latest handleKey, so click-to-activate can replay an Enter through the\n // normal input pipeline (handleKey is defined far below; the ref is filled\n // after it). handleMouse only ever runs post-mount, so the ref is populated.\n const handleKeyRef = useRef<((input: string, key: KeyEvent) => void) | null>(null);\n // Set to the row index a mouse click selected; the effect below replays Enter\n // once that row is the live selection, giving single-click confirm.\n const pendingClickConfirmRef = useRef<number | null>(null);\n // Latest open-routines + rewind handler + confirm decision, so the\n // empty-dep mouse handler can drive surfaces defined further down without\n // re-subscribing. Populated each render (see assignments below their defs).\n const openModelPickerRef = useRef<(() => void) | null>(null);\n const openAutonomyPickerRef = useRef<(() => void) | null>(null);\n const handleRewindToRef = useRef<((promptIndex: number) => void) | null>(null);\n // The bordered ConfirmPrompt's wrapper Box + the live decision callback, so\n // a click on the button row can be located (measured height) and fired.\n const confirmRef = useRef<DOMElement | null>(null);\n const confirmDecisionRef = useRef<((d: ConfirmDecision) => void) | null>(null);\n // True while the left button is held after pressing on the scrollbar, so\n // subsequent motion events scrub the chat viewport (thumb drag).\n const scrollbarDragRef = useRef(false);\n // Multi-click detection: tracks the timestamp and position of the last left\n // click to identify double/triple clicks. SGR 1006 doesn't emit native\n // multi-click events, so we track them ourselves.\n const lastLeftClickRef = useRef<{ x: number; y: number; ts: number; count: number } | null>(null);\n const DOUBLE_CLICK_MS = 500;\n const DOUBLE_CLICK_DIST = 5; // max pixels between clicks to count as multi-click\n // Live status-bar chip inputs, so the empty-dep mouse handler can hit-test\n // the model / autonomy chips against their current values (not stale ones).\n const statusChipRef = useRef<{\n version?: string;\n model: string;\n fleetRunning: number;\n yolo: boolean;\n autonomy: 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel';\n }>({ version: appVersion, model, fleetRunning: 0, yolo, autonomy: 'off' });\n\n // Mouse routing. Wheel scrolls history (or drives an open picker's\n // selection); a left click on a picker item selects + activates it; a click\n // on the \"N new lines\" affordance jumps to the bottom. Registered once;\n // reads live state via stateRef + measured geometry via preRowsRef.\n const handleMouse = React.useCallback(\n (ev: TuiMouseEvent) => {\n const s = stateRef.current;\n if (ev.type === 'wheel') {\n const up = ev.button === 'wheelUp';\n const step = up ? -1 : 1;\n // An open list overlay claims the wheel for its own selection.\n if (s.slashPicker.open) return dispatch({ type: 'slashPickerMove', delta: step });\n if (s.modelPicker.open) return dispatch({ type: 'modelPickerMove', delta: step });\n if (s.autonomyPicker.open) return dispatch({ type: 'autonomyPickerMove', delta: step });\n if (s.settingsPicker.open) return dispatch({ type: 'settingsFieldMove', delta: step });\n if (s.picker.open) return dispatch({ type: 'pickerMove', delta: step });\n if (s.rewindOverlay) return dispatch({ type: 'rewindOverlayMove', delta: step });\n // Otherwise scroll the chat history viewport.\n return dispatch({ type: 'scrollBy', delta: up ? WHEEL_STEP : -WHEEL_STEP });\n }\n // Button release ends any in-progress scrollbar drag.\n if (ev.type === 'release') {\n scrollbarDragRef.current = false;\n return;\n }\n if (ev.button !== 'left') return;\n\n // Multi-click detection: tracks consecutive clicks within DOUBLE_CLICK_MS\n // and DOUBLE_CLICK_DIST to identify double/triple clicks. Note: terminal\n // text selection is managed by the terminal emulator, not the app, so\n // clickCount is tracked here for future use (e.g., terminal selection API).\n const now = Date.now();\n const lastClick = lastLeftClickRef.current;\n const isMultiClick =\n lastClick !== null &&\n now - lastClick.ts < DOUBLE_CLICK_MS &&\n Math.abs(ev.x - lastClick.x) <= DOUBLE_CLICK_DIST &&\n Math.abs(ev.y - lastClick.y) <= DOUBLE_CLICK_DIST;\n const clickCount = isMultiClick ? lastClick.count + 1 : 1;\n lastLeftClickRef.current = { x: ev.x, y: ev.y, ts: now, count: clickCount };\n void clickCount; // tracked for future terminal selection API use\n\n // Scrollbar (right edge, rows 1..viewportRows): a press on it jumps the\n // viewport to that position and arms a drag; subsequent held-motion\n // events scrub. The bar is the terminal's last column — accept it plus\n // its 1-col left margin so near-misses still grab. Motion events never\n // fall through to click handling.\n {\n const rows = s.viewportRows;\n if (ev.drag) {\n if (scrollbarDragRef.current && s.totalLines > rows) {\n dispatch({\n type: 'scrollTo',\n offset: scrollOffsetForTrackRow(rows, s.totalLines, ev.y - 1),\n });\n }\n return;\n }\n const cols = termCols || 80;\n // Accept the scrollbar column plus 1-col left margin so near-misses still grab.\n const onScrollbar = cols > 0 && ev.x >= cols - 2 && ev.y >= 1 && ev.y <= rows;\n if (onScrollbar && s.totalLines > rows) {\n scrollbarDragRef.current = true;\n dispatch({\n type: 'scrollTo',\n offset: scrollOffsetForTrackRow(rows, s.totalLines, ev.y - 1),\n });\n return;\n }\n }\n\n // A click in the bottom region (where they render) dismisses an open\n // informational overlay — mouse parity with Esc. These can't coexist\n // with pickers/confirm (handleKey guards that), so this never eats a\n // picker click. Clicks up in the chat viewport are left alone.\n if (ev.y > s.viewportRows) {\n if (s.helpOpen) return dispatch({ type: 'toggleHelp' });\n if (s.agentsMonitorOpen) return dispatch({ type: 'toggleAgentsMonitor' });\n if (s.monitorOpen) return dispatch({ type: 'toggleMonitor' });\n if (s.worktreeMonitorOpen) return dispatch({ type: 'worktreeMonitorToggle' });\n if (s.autoPhase?.monitorOpen) return dispatch({ type: 'autoPhaseMonitorToggle' });\n }\n\n const affordance = s.scrollOffset > 0 && s.pendingNewLines > 0 ? 1 : 0;\n // The affordance occupies the row just below the viewport (1-based).\n if (affordance && ev.y === s.viewportRows + 1) {\n return dispatch({ type: 'scrollToBottom' });\n }\n\n // Permission dialog: map a click on the button row to a decision. The\n // dialog is the only thing between the input region and the status bar\n // while a confirm is pending, so its top row is deterministic. We\n // measure its box height to find the button row (the line just above the\n // bottom border).\n if (s.confirmQueue.length > 0) {\n const node = confirmRef.current;\n const head = s.confirmQueue[0];\n if (node && head) {\n const { height } = measureElement(node);\n const top = s.viewportRows + affordance + preRowsRef.current + 1;\n const buttonsRow = top + height - 2; // -1 bottom border, -1 to land on buttons\n if (ev.y === buttonsRow) {\n // round border (1) + paddingX (1) before the first content column.\n const contentX = ev.x - 1 - 2;\n for (const seg of confirmButtonSegments(head.suggestedPattern)) {\n if (contentX >= seg.start && contentX < seg.start + seg.len) {\n confirmDecisionRef.current?.(seg.decision);\n return;\n }\n }\n }\n }\n return; // a confirm is modal — swallow other clicks\n }\n\n // Checkpoint timeline (/rewind): click selects; click on the already\n // selected row rewinds. Layout: outer padding(1) + header(1) +\n // marginBottom(1) = 3 rows before the first checkpoint.\n if (s.rewindOverlay) {\n const cps = s.rewindOverlay.checkpoints;\n const firstItemRow = s.viewportRows + affordance + preRowsRef.current + 3 + 1;\n const index = ev.y - firstItemRow;\n if (index < 0 || index >= cps.length) return;\n if (index === s.rewindOverlay.selected) {\n handleRewindToRef.current?.(cps[index]!.promptIndex);\n } else {\n dispatch({ type: 'rewindOverlayMove', delta: index - s.rewindOverlay.selected });\n }\n return;\n }\n\n // Settings editor: click focuses a field; clicking the already-focused\n // field cycles its value. Header: title(1) + hint(1) = 2 rows.\n if (s.settingsPicker.open) {\n const firstRow = s.viewportRows + affordance + preRowsRef.current + 2 + 1;\n const field = ev.y - firstRow;\n if (field < 0 || field > 1) return;\n if (field === s.settingsPicker.field) {\n dispatch({ type: 'settingsValueChange', delta: 1 });\n } else {\n dispatch({ type: 'settingsFieldSet', field });\n }\n return;\n }\n\n // Identify the open picker, its header height (rows before the first\n // item) and how to move/confirm it. Only the bottom-anchored list\n // pickers participate; the full-screen rewind overlay does not.\n const picker = s.modelPicker.open\n ? {\n header: 2,\n count:\n s.modelPicker.step === 'provider'\n ? s.modelPicker.providerOptions.length\n : s.modelPicker.modelOptions.length,\n selected: s.modelPicker.selected,\n move: (delta: number) => dispatch({ type: 'modelPickerMove', delta }),\n }\n : s.autonomyPicker.open\n ? {\n header: 2,\n count: s.autonomyPicker.options.length,\n selected: s.autonomyPicker.selected,\n move: (delta: number) => dispatch({ type: 'autonomyPickerMove', delta }),\n }\n : s.slashPicker.open\n ? {\n header: 1,\n count: s.slashPicker.matches.length,\n selected: s.slashPicker.selected,\n move: (delta: number) => dispatch({ type: 'slashPickerMove', delta }),\n }\n : s.picker.open\n ? {\n header: 1,\n count: s.picker.matches.length,\n selected: s.picker.selected,\n move: (delta: number) => dispatch({ type: 'pickerMove', delta }),\n }\n : null;\n if (!picker || picker.count === 0) {\n // Click inside the editable input → reposition the caret. The input\n // sits just below the live-activity strip; its first row and wrapped\n // height are deterministic from the measured strip height + the same\n // layout the component renders. Skipped while the input is disabled.\n const inputDisabled = s.status === 'aborting' && !s.steeringPending;\n if (!inputDisabled) {\n const cols = termCols || 80;\n const inputTop = s.viewportRows + affordance + liveStripRowsRef.current + 1;\n const inputRows = layoutInputRows(INPUT_PROMPT, s.buffer, s.cursor, cols).length;\n const rowIdx = ev.y - inputTop;\n if (rowIdx >= 0 && rowIdx < inputRows) {\n const next = inputIndexAtRowCol(INPUT_PROMPT, s.buffer, cols, rowIdx, ev.x - 1);\n return dispatch({ type: 'setBuffer', buffer: s.buffer, cursor: next });\n }\n }\n\n // No list picker open → the status bar is at a deterministic row.\n // Make its model chip (line 1) and autonomy chip (line 2) clickable.\n if (\n !s.helpOpen &&\n !s.agentsMonitorOpen &&\n !s.monitorOpen &&\n !s.worktreeMonitorOpen &&\n !s.autoPhase?.monitorOpen\n ) {\n const chip = statusChipRef.current;\n const statusTop = s.viewportRows + affordance + preRowsRef.current + 1;\n const contentX = ev.x - 1; // status bar has no left border; paddingX folded into spans\n if (ev.y === statusTop + 1) {\n const span = statusBarModelSpan({\n version: chip.version,\n state: s.status,\n fleetRunning: chip.fleetRunning,\n model: chip.model,\n });\n if (contentX >= span.start && contentX < span.start + span.len) {\n openModelPickerRef.current?.();\n }\n } else if (ev.y === statusTop + 2) {\n const span = statusBarAutonomySpan({ yolo: chip.yolo, autonomy: chip.autonomy });\n if (span && contentX >= span.start && contentX < span.start + span.len) {\n openAutonomyPickerRef.current?.();\n }\n }\n }\n return;\n }\n\n // Absolute (1-based) row of the picker's first item:\n // viewport rows + affordance + (live strip + input) + header.\n const firstItemRow = s.viewportRows + affordance + preRowsRef.current + picker.header + 1;\n const index = ev.y - firstItemRow;\n if (index < 0 || index >= picker.count) return;\n // Single-click select + confirm. handleKey's Enter path confirms whatever\n // is selected at RENDER time, so we can't move + confirm in one event.\n // Instead: if the row is already selected, confirm now; otherwise move to\n // it and arm pendingClickConfirm — an effect replays Enter on the next\n // render (when handleKey closes over the updated selection). If anything\n // is off, it degrades gracefully to a second click confirming.\n if (index === picker.selected) {\n handleKeyRef.current?.('', { ...EMPTY_KEY, return: true });\n } else {\n pendingClickConfirmRef.current = index;\n picker.move(index - picker.selected);\n }\n },\n // dispatch is stable (useReducer); refs are mutable — no reactive deps.\n // termCols is stable (useState + resize effect).\n [termCols],\n );\n useEffect(() => {\n if (!subscribeMouse) return;\n return subscribeMouse(handleMouse);\n }, [subscribeMouse, handleMouse]);\n\n // Single-click confirm: after a click moved the selection, replay Enter once\n // the clicked row is the live selection (handleKey then closes over the\n // updated state, so it confirms the RIGHT item). Cleared if the picker closes.\n useEffect(() => {\n const target = pendingClickConfirmRef.current;\n if (target === null) return;\n const open =\n state.slashPicker.open ||\n state.modelPicker.open ||\n state.autonomyPicker.open ||\n state.picker.open;\n if (!open) {\n pendingClickConfirmRef.current = null;\n return;\n }\n const sel = state.slashPicker.open\n ? state.slashPicker.selected\n : state.modelPicker.open\n ? state.modelPicker.selected\n : state.autonomyPicker.open\n ? state.autonomyPicker.selected\n : state.picker.selected;\n if (sel === target) {\n pendingClickConfirmRef.current = null;\n handleKeyRef.current?.('', { ...EMPTY_KEY, return: true });\n }\n }, [\n state.slashPicker.open,\n state.slashPicker.selected,\n state.modelPicker.open,\n state.modelPicker.selected,\n state.autonomyPicker.open,\n state.autonomyPicker.selected,\n state.picker.open,\n state.picker.selected,\n ]);\n\n // handleRewindTo must be declared before the /rewind useEffect (line 1803)\n // so the closure can capture it. It is intentionally NOT in useCallback\n // — each call needs a fresh rewinder referencing the current sessionsDir.\n const handleRewindTo = React.useCallback(\n async (checkpointIndex: number) => {\n const sessionId = agent.ctx.session.id;\n if (!sessionId) return;\n const rewinder = new DefaultSessionRewinder(sessionsDir ?? '', projectRoot ?? agent.ctx.cwd);\n // Revert file system changes first (read-only, safe to do eagerly).\n await rewinder.rewindToCheckpoint(sessionId, checkpointIndex);\n // Then truncate the conversation history — this fires session.rewound\n // on the EventBus, which the useEffect at line 2212 listens to and\n // dispatches sessionRewound + clearHistory.\n await agent.ctx.session.truncateToCheckpoint(checkpointIndex);\n },\n [agent.ctx.session, sessionsDir, projectRoot, agent.ctx.cwd],\n );\n\n const setDraft = (buffer: string, cursor: number): void => {\n draftRef.current = { buffer, cursor };\n dispatch({ type: 'setBuffer', buffer, cursor });\n };\n\n const clearDraft = (): void => {\n draftRef.current = { buffer: '', cursor: 0 };\n dispatch({ type: 'clearInput' });\n };\n\n // Session-elapsed clock. Mount time is fixed; we re-render once per\n // second to refresh the \"⏱ 12:34\" chip. The interval is cheap — one\n // dispatch per tick into the same `tick` action — and stops cleanly\n // on unmount.\n const startedAtRef = useRef<number>(Date.now());\n const [nowTick, setNowTick] = React.useState<number>(Date.now());\n useEffect(() => {\n const t = setInterval(() => setNowTick(Date.now()), 1000);\n return () => clearInterval(t);\n }, []);\n const elapsedMs = nowTick - startedAtRef.current;\n\n // Git branch + change counts. Polled every 5s (cheap, two short-lived\n // `git` subprocesses). Skipped silently when the cwd isn't a repo or\n // git isn't installed — the chip just doesn't render.\n const [gitInfo, setGitInfo] = React.useState<GitInfo | null>(null);\n useEffect(() => {\n let cancelled = false;\n const refresh = () => {\n readGitInfo(agent.ctx.cwd)\n .then((info) => {\n if (!cancelled) setGitInfo(info);\n })\n .catch(() => undefined);\n };\n refresh();\n const t = setInterval(refresh, 5000);\n return () => {\n cancelled = true;\n clearInterval(t);\n };\n }, [agent.ctx.cwd]);\n\n // Latest provider request's input-token count. Tracked separately\n // from `tokenCounter` (which is cumulative) because for the context\n // fullness bar we want the live size of the conversation as it sat\n // on the wire — that's what determines how close we are to the\n // model's max context window.\n //\n // We sum input + cacheRead + cacheWrite so the chip reflects the TRUE\n // total context the model loaded (Usage is disjoint by design — see the\n // doc on Usage). Without this, prompt-cached turns would show only the\n // fresh-token delta and the chip would read 0% even when the context\n // was near the limit.\n // Cumulative \"effective context\" from tokenCounter: fresh input tokens\n // PLUS cached tokens that were sent as part of this prompt. All three\n // contribute to context-window pressure — cache tokens are still tokens\n // the model must process. (usage.input is disjoint from cacheRead/\n // cacheWrite, so simple sum is correct.)\n\n // Per-model maxContext. CLI passes the startup value, then model-switch and\n // ctx.pct events keep activeMaxContext in sync with the live agent context.\n const maxContext = activeMaxContext ?? agent.ctx.provider.capabilities.maxContext;\n\n // Per-request context pressure: current prompt tokens (input + cacheRead).\n // Unlike the cumulative tokenCounter.total() which grows across all turns,\n // this tracks the live request's context weight — what actually determines\n // how close we are to the maxContext ceiling.\n // Cached tokens (cacheWrite) are excluded because they are an accounting\n // artifact of THIS request (provider charges for them separately); they\n // are already counted in usage.input as part of the prompt the model sees.\n const currentContextTokens =\n (tokenCounter?.currentRequestTokens()?.input ?? 0) +\n (tokenCounter?.currentRequestTokens()?.cacheRead ?? 0);\n\n const contextWindow = useMemo(() => {\n void state.contextChipVersion;\n return currentContextTokens > 0 && maxContext > 0\n ? { used: currentContextTokens, max: maxContext }\n : undefined;\n }, [currentContextTokens, maxContext, state.contextChipVersion]);\n\n // Todo counts come from the agent's context, which is mutated by\n // the `todo` tool. Re-read on each render — array access is O(N) on\n // a list that's typically < 20 items.\n // biome-ignore lint/correctness/useExhaustiveDependencies: nowTick intentionally triggers re-render; ctx.todos is not React state\n const todos = useMemo(() => {\n const counts = { pending: 0, inProgress: 0, completed: 0 };\n for (const t of agent.ctx.todos) {\n if (t.status === 'pending') counts.pending++;\n else if (t.status === 'in_progress') counts.inProgress++;\n else if (t.status === 'completed') counts.completed++;\n }\n return counts;\n // Tick on `nowTick` so we pick up todo changes even though\n // agent.ctx.todos isn't React state — the 1s clock doubles as a\n // poll for ctx-side state.\n }, [nowTick, agent.ctx.todos]);\n\n // Fleet breakdown for the status-bar chip. Derived from `state.fleet`,\n // which the FleetBus event listeners already maintain — re-bucket\n // into running / idle / pending / completed because that's the slice\n // the user cares about at a glance. Recomputes on every state.fleet\n // change (cheap — fleet usually has <10 entries).\n const fleetCounts = useMemo(() => {\n const entries = Object.values(state.fleet);\n if (entries.length === 0) return undefined;\n let running = 0;\n let idle = 0;\n let completed = 0;\n for (const e of entries) {\n if (e.status === 'running') running += 1;\n else if (e.status === 'idle') idle += 1;\n else completed += 1; // success/failed/timeout/stopped all count as \"done\"\n }\n return { running, idle, pending: 0, completed };\n }, [state.fleet]);\n\n // Synthesize LEADER as AGENT#0 and prepend to the live fleet so the\n // monitor / FleetPanel are never empty even when no subagents have been\n // spawned. The 'leader' key can't collide with subagent IDs (those are\n // ULIDs). status maps from the high-level run state — streaming/running/\n // iterating → 'running', else 'idle'.\n const entriesWithLeader = useMemo<Record<string, FleetEntry>>(() => {\n const leaderEntry: FleetEntry = {\n id: 'leader',\n name: 'LEADER',\n provider,\n model,\n status:\n state.status === 'running' || state.status === 'streaming' || state.leader.iterating\n ? 'running'\n : 'idle',\n streamingText: '',\n iterations: state.leader.iterations,\n toolCalls: state.leader.toolCalls,\n recentTools: state.leader.recentTools,\n recentMessages: [],\n cost: 0,\n startedAt: state.leader.startedAt,\n lastEventAt: state.leader.lastEventAt,\n currentTool: state.leader.currentTool,\n ctxPct: state.leader.ctxPct,\n ctxTokens: state.leader.ctxTokens,\n ctxMaxTokens: state.leader.ctxMaxTokens ?? effectiveMaxContext,\n };\n return { leader: leaderEntry, ...state.fleet };\n }, [state.fleet, state.leader, state.status, provider, model, effectiveMaxContext]);\n\n // Stable per-subagent label + color assigned on first sighting.\n const STREAM_COLORS = ['cyan', 'magenta', 'yellow', 'green', 'blue'];\n const labelsRef = useRef<Map<string, { label: string; color: string }>>(new Map());\n const labelFor = (id: string, name?: string): { label: string; color: string } => {\n const m = labelsRef.current;\n const existing = m.get(id);\n if (existing) return existing;\n const n = m.size + 1;\n // Nickname wins: show \"Einstein (Bug Hunter)\" rather than \"AGENT#1 Einstein (Bug Hunter)\".\n const v = {\n label: name && name !== id ? name : `AGENT#${n}`,\n color: STREAM_COLORS[(n - 1) % STREAM_COLORS.length]!,\n };\n m.set(id, v);\n return v;\n };\n\n // Plan counts come from `<sessionId>.plan.json` on disk, not React\n // state. We poll lazily every few ticks so the chip stays current\n // without slamming the FS — plans change at human pace (a few times\n // per session at most), so 3s granularity is plenty.\n const [planCounts, setPlanCounts] = useState<{\n open: number;\n inProgress: number;\n done: number;\n } | null>(null);\n useEffect(() => {\n const planPath = (agent.ctx.meta as Record<string, unknown>)['plan.path'];\n if (typeof planPath !== 'string' || !planPath) return;\n let cancelled = false;\n const poll = async () => {\n try {\n const data = await fs.readFile(planPath, 'utf8');\n const parsed = JSON.parse(data) as {\n items?: Array<{ status?: string }>;\n };\n if (cancelled) return;\n if (!Array.isArray(parsed.items)) {\n setPlanCounts(null);\n return;\n }\n let open = 0;\n let inProgress = 0;\n let done = 0;\n for (const it of parsed.items) {\n if (it?.status === 'done') done++;\n else if (it?.status === 'in_progress') inProgress++;\n else open++;\n }\n setPlanCounts(open + inProgress + done > 0 ? { open, inProgress, done } : null);\n } catch {\n // Missing or corrupt — clear the chip.\n if (!cancelled) setPlanCounts(null);\n }\n };\n void poll();\n const id = setInterval(poll, 3000);\n return () => {\n cancelled = true;\n clearInterval(id);\n };\n }, [agent.ctx.meta]);\n\n // Live-region shrink mitigation. Ink's log-update tracks the previous\n // render's logical line count; when content visually wraps past the\n // terminal width, the visual-row count exceeds the logical count and\n // log-update's clear-and-rewrite leaves the extra visual rows behind.\n // Those extras then slide into native scrollback as the next render\n // commits new Static items above the live region — looking to the user\n // like an extra echo of the input (\"Enter ile boş input da history'e\n // sıyrılıyor\").\n //\n // We can't reach log-update directly, but we can issue an erase-below-\n // cursor (\\x1b[J) at the moments most likely to leak: when a picker /\n // dialog transitions from open → closed (the live region's height\n // drops sharply), when a fresh history entry was just committed, and\n // when the terminal resizes (Ink re-renders the live region but the\n // cleanup logic above doesn't fire since none of its deps changed).\n // \\x1b[J only touches what's below the cursor, so committed Static\n // history above is preserved. For users in heavy resize / picker\n // workflows the bullet-proof alternative is still `--alt-screen`.\n const prevAnyOverlayOpen = useRef(false);\n const prevEntriesCount = useRef(0);\n // Stable erase function — only calls process.stdout.write which is a stable global.\n const eraseLiveRegion = useCallback(() => {\n try {\n // \\x1b[J = erase from cursor to end of screen. The cursor sits at the\n // top of log-update's live region, so this clears the stale live\n // region only and leaves committed Static history (in scrollback)\n // untouched. Do NOT prefix with \\x1b[H: homing to (0,0) wipes the\n // visible committed output and forces the input/status bar to redraw\n // at the top of the viewport instead of staying pinned to the bottom.\n writeOut('\\x1b[J');\n } catch {\n // stdout might be detached during shutdown — ignore.\n }\n }, []);\n useEffect(() => {\n const anyOpenNow =\n state.picker.open ||\n state.slashPicker.open ||\n state.modelPicker.open ||\n state.autonomyPicker.open ||\n state.settingsPicker.open ||\n state.confirmQueue.length > 0;\n const overlayClosed = prevAnyOverlayOpen.current && !anyOpenNow;\n const newEntryCommitted = state.entries.length > prevEntriesCount.current;\n prevAnyOverlayOpen.current = anyOpenNow;\n prevEntriesCount.current = state.entries.length;\n if (overlayClosed || newEntryCommitted) {\n eraseLiveRegion();\n }\n }, [\n state.picker.open,\n state.slashPicker.open,\n state.modelPicker.open,\n state.autonomyPicker.open,\n state.settingsPicker.open,\n state.confirmQueue.length,\n state.entries.length,\n eraseLiveRegion,\n ]);\n\n // Erase stale live-region content on terminal resize. Without this, Ink\n // re-renders the live region at the new dimensions but leaves visual\n // artifacts from the previous size that bleed into scrollback.\n useEffect(() => {\n const handleResize = () => eraseLiveRegion();\n process.stdout.on('resize', handleResize);\n return () => {\n process.stdout.off('resize', handleResize);\n };\n }, [eraseLiveRegion]);\n\n // Detect an active `@<query>` token at the cursor and drive the picker.\n // Reruns whenever buffer/cursor changes — guards against stale results.\n // biome-ignore lint/correctness/useExhaustiveDependencies: picker state reads are intentional — dispatching based on stale picker state is harmless\n useEffect(() => {\n const detected = detectAtToken(state.buffer, state.cursor);\n if (!detected) {\n if (state.picker.open) dispatch({ type: 'pickerClose' });\n return;\n }\n if (!state.picker.open || state.picker.query !== detected.query) {\n dispatch({ type: 'pickerOpen', query: detected.query });\n }\n let cancelled = false;\n searchFiles(projectRoot, detected.query, 8)\n .then((matches) => {\n if (!cancelled) {\n dispatch({ type: 'pickerSetMatches', query: detected.query, matches });\n }\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.buffer, state.cursor, projectRoot]);\n\n // Detect an active `/<query>` token at the cursor and drive the slash picker.\n // biome-ignore lint/correctness/useExhaustiveDependencies: slashPicker state reads are intentional — same pattern as @ picker above\n useEffect(() => {\n const trimmed = state.buffer.trimStart();\n if (!trimmed.startsWith('/')) {\n if (state.slashPicker.open) dispatch({ type: 'slashPickerClose' });\n return;\n }\n // Once any whitespace appears after the leading '/', the user has moved\n // past the command name into argument territory (e.g. `/model glm-5.1`).\n // Keeping the picker open here is actively harmful: arrow keys would\n // still target the command menu even though the user is typing args.\n // Close it so Enter submits the full line.\n if (/\\s/.test(trimmed)) {\n if (state.slashPicker.open) dispatch({ type: 'slashPickerClose' });\n return;\n }\n const query = trimmed.slice(1).toLowerCase();\n const allCommands = slashRegistry.listWithOwner();\n const matches: SlashCommandMatch[] = allCommands\n .filter(({ cmd }) => {\n const name = cmd.name.toLowerCase();\n const aliases = cmd.aliases ?? [];\n return name.includes(query) || aliases.some((a) => a.toLowerCase().includes(query));\n })\n .slice(0, 12)\n .map(({ cmd, owner }) => ({\n name: cmd.name,\n description: cmd.description,\n argsHint: cmd.argsHint,\n isBuiltin: owner === 'core',\n }));\n\n if (!state.slashPicker.open) {\n dispatch({ type: 'slashPickerOpen', query, matches });\n } else if (state.slashPicker.query !== query) {\n dispatch({ type: 'slashPickerOpen', query, matches });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.buffer, slashRegistry]);\n\n const pasteClipboardImage = async (): Promise<void> => {\n const builder = builderRef.current;\n if (!builder) return;\n try {\n const img = await readClipboardImage();\n if (!img) {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'info', text: 'No image on the clipboard.' },\n });\n return;\n }\n // Register-only: the token goes inline into the editable buffer (like a\n // pasted block) so it renders as a chip and expands from the buffer at\n // submit — not into a separate pill above the input.\n const token = await builder.registerImage(img.base64, img.mediaType);\n const kb = (img.bytes / 1024).toFixed(0);\n tokenPreviewsRef.current.set(token, `image, ${kb} KB`);\n const { buffer, cursor } = draftRef.current;\n const next = buffer.slice(0, cursor) + token + buffer.slice(cursor);\n setDraft(next, cursor + token.length);\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'error',\n text: `Clipboard image error: ${err instanceof Error ? err.message : String(err)}`,\n },\n });\n }\n };\n\n const acceptPickerSelection = async (): Promise<void> => {\n const { open, matches, selected } = state.picker;\n if (!open || matches.length === 0) return;\n const picked = matches[selected];\n if (!picked) return;\n const builder = builderRef.current;\n if (!builder) return;\n\n // Find the @-token span we're replacing.\n const draft = draftRef.current;\n const tok = detectAtToken(draft.buffer, draft.cursor);\n if (!tok) {\n dispatch({ type: 'pickerClose' });\n return;\n }\n\n // Register the file (no builder display mutation) and put a path-keyed\n // `[file:<path>]` token inline in the visible buffer (replacing @query).\n // The buffer is the single source of truth — the token expands back to the\n // file content at submit via the store's path lookup.\n const absPath = path.isAbsolute(picked) ? picked : path.join(projectRoot, picked);\n try {\n const data = await fs.readFile(absPath, 'utf8');\n const token = await builder.registerFile({\n kind: 'file',\n data,\n meta: { filename: picked, label: picked },\n });\n const before = draft.buffer.slice(0, tok.start);\n const after = draft.buffer.slice(tok.end);\n const next = `${before}${token}${after}`;\n setDraft(next, tok.start + token.length);\n dispatch({ type: 'pickerClose' });\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'error',\n text: `Attach failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n });\n dispatch({ type: 'pickerClose' });\n }\n };\n\n /** Fill the buffer with the selected slash command and close the picker. */\n const acceptSlashPickerSelection = (): void => {\n const { open, matches, selected } = state.slashPicker;\n if (!open || matches.length === 0) return;\n const picked = matches[selected];\n if (!picked) return;\n const cmd = picked.argsHint !== undefined ? `/${picked.name} ` : `/${picked.name}`;\n setDraft(cmd, cmd.length);\n dispatch({ type: 'slashPickerClose' });\n };\n\n // Rehydrate any queue items persisted by a previous (crashed) run.\n // Fires once at mount; the persist effect below picks up afterwards.\n // We dispatch one enqueue per item so the reducer's id allocation\n // stays the single source of truth — no need to import its internals.\n useEffect(() => {\n if (!queueStore) return;\n let cancelled = false;\n queueStore\n .read()\n .then((items) => {\n if (cancelled || items.length === 0) return;\n for (const item of items) {\n dispatch({\n type: 'enqueue',\n item: { displayText: item.displayText, blocks: item.blocks },\n });\n }\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'info',\n text: `Restored ${items.length} queued message${items.length === 1 ? '' : 's'} from a previous run.`,\n },\n });\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [queueStore]);\n\n // Persist the queue snapshot on every change. Strip the in-memory id\n // before writing — it's render bookkeeping, not part of the message.\n // Errors are swallowed: the queue lives in memory regardless, so a\n // persistence failure only loses crash-recovery, not the queue itself.\n useEffect(() => {\n if (!queueStore) return;\n queueStore\n .write(state.queue.map(({ displayText, blocks }) => ({ displayText, blocks })))\n .catch(() => undefined);\n }, [state.queue, queueStore]);\n\n // Register the TUI-only /queue command for the lifetime of this App.\n useEffect(() => {\n const cmd = createQueueSlashCommand({\n getQueue: () => stateRef.current.queue,\n clear: () => dispatch({ type: 'queueClear' }),\n deleteAt: (positions) => dispatch({ type: 'queueDelete', positions }),\n });\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('queue');\n };\n }, [slashRegistry]);\n\n // Register /kill (list/kill tracked bash/exec processes) and /ps (list only).\n useEffect(() => {\n slashRegistry.register(createKillSlashCommand());\n slashRegistry.register(createPsSlashCommand());\n return () => {\n slashRegistry.unregister('kill');\n slashRegistry.unregister('ps');\n };\n }, [slashRegistry]);\n\n // Kill all tracked bash/exec processes when the TUI unmounts.\n // This fires on natural exit, Ctrl+C, and any other unmount path,\n // ensuring no orphaned child processes survive after the session ends.\n useEffect(() => {\n return () => {\n getProcessRegistry().killAll();\n };\n }, []);\n\n // Register `/altscreen on|off` — runtime escape valve for the\n // alt-screen scrollback limitation. In alt-screen mode the terminal's\n // native scrollback is disabled, so users can't review old chat\n // entries. `off` writes the alt-screen-exit escape so subsequent\n // entries land in the normal scroll region and the mouse wheel /\n // shift+pgup work again. The trade-off (lost on-screen history,\n // resize artifacts) is spelled out in the response message so the\n // user can decide whether to keep it.\n useEffect(() => {\n const ALT_OFF = '\\x1b[?1049l';\n const ALT_ON = '\\x1b[?1049h';\n const cmd = {\n name: 'altscreen',\n description:\n 'Toggle the alt-screen buffer. Default is OFF (native scroll); /altscreen on for full-screen mode.',\n async run(args: string) {\n const arg = args.trim().toLowerCase();\n if (arg === 'off') {\n try {\n writeOut(ALT_OFF);\n } catch {\n return { message: 'Failed to exit alt-screen.' };\n }\n // Leaving alt-screen drops the managed viewport back to <Static>.\n setManagedLive(false);\n return {\n message:\n 'Alt-screen disabled. New entries will land in normal scrollback (mouse wheel / Shift+PgUp work). ' +\n 'On-screen history rendered before this command is no longer reachable via terminal scroll. ' +\n 'Resize may now leak the live region — `/altscreen on` to re-enable.',\n };\n }\n if (arg === 'on') {\n try {\n writeOut(ALT_ON);\n } catch {\n return { message: 'Failed to re-enter alt-screen.' };\n }\n // Entering alt-screen turns on the managed viewport (in-app scroll +\n // PgUp/PgDn + collapsibility), no mouse required.\n setManagedLive(true);\n return {\n message:\n 'Alt-screen re-enabled. Managed scroll (PgUp/PgDn) is now active; native scroll is off.',\n };\n }\n return { message: 'Usage: /altscreen on|off' };\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('altscreen');\n };\n }, [slashRegistry]);\n\n // Register `/mouse on|off` — runtime toggle for full mouse mode (clickable\n // pickers + in-app wheel scroll). Enabling REQUIRES launching with --mouse:\n // that's when run-tui installs the stdin proxy that keeps mouse bytes out of\n // Ink's keypress parser. Without it, turning tracking on would spray\n // `<0;..M` junk into the input — so we refuse and tell the user to relaunch.\n const mouseLiveRef = useRef(mouseLive);\n mouseLiveRef.current = mouseLive;\n useEffect(() => {\n const MOUSE_ON_SEQ = '\\x1b[?1000h\\x1b[?1006h';\n const MOUSE_OFF_SEQ = '\\x1b[?1006l\\x1b[?1000l';\n const ALT_ON = '\\x1b[?1049h';\n const ALT_OFF = '\\x1b[?1049l';\n const cmd = {\n name: 'mouse',\n description:\n 'Toggle mouse mode (clickable menus + wheel-scroll chat). Needs launch with --mouse to enable.',\n async run(args: string) {\n const arg = args.trim().toLowerCase();\n if (arg !== 'on' && arg !== 'off') {\n return {\n message: `Mouse mode is ${mouseLiveRef.current ? 'ON' : 'OFF'}. Usage: /mouse on|off`,\n };\n }\n if (arg === 'on') {\n if (!mouse) {\n return {\n message:\n 'Mouse mode needs the --mouse launch flag (it rewires stdin so mouse ' +\n 'bytes never reach the input). Restart with `wstack --tui --mouse`.',\n };\n }\n try {\n writeOut(ALT_ON);\n writeOut('\\x1b[H');\n writeOut(MOUSE_ON_SEQ);\n } catch {\n return { message: 'Failed to enable mouse mode.' };\n }\n setMouseLive(true);\n setManagedLive(true);\n return {\n message:\n 'Mouse mode ON. Click menu items, wheel-scroll the chat (PgUp/PgDn too). ' +\n 'Native terminal copy/scroll are suspended until `/mouse off`.',\n };\n }\n // off\n try {\n writeOut(MOUSE_OFF_SEQ);\n writeOut(ALT_OFF);\n } catch {\n return { message: 'Failed to disable mouse mode.' };\n }\n setMouseLive(false);\n // /mouse off also exits alt-screen (above), so drop the managed\n // viewport back to native scrollback.\n setManagedLive(false);\n return {\n message:\n 'Mouse mode OFF. Native terminal scroll/copy restored; chat history flows ' +\n 'into native scrollback again.',\n };\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('mouse');\n };\n }, [slashRegistry, mouse]);\n\n // `/steer <message>` — slash-command equivalent of Esc-to-steer.\n // Useful when Esc is consumed by an outer terminal multiplexer, or\n // when the user wants a single-shot redirect without the typed\n // follow-up (the message is the new direction). Performs the same\n // sequence the Esc handler does: snapshot context, abort the active\n // run, terminate the fleet, drop the queue, then sets steeringPending\n // so the message — submitted as the slash command's return — picks\n // up the rich STEERING preamble in the normal submit path.\n //\n // Unlike Esc, this slash command can be invoked at any state. When\n // the agent is idle the abort and fleet-termination are no-ops; the\n // steering preamble still gets prepended, which is harmless extra\n // context (\"nothing was running\") for the next turn.\n useEffect(() => {\n const cmd = {\n name: 'steer',\n description: 'Interrupt the running agent (incl. fleet) and redirect: /steer <new direction>',\n help: [\n 'Usage: /steer <new direction>',\n '',\n 'Aborts the active iteration, terminates any running subagents,',\n 'drops queued messages, and sends your text to the model with a',\n 'STEERING preamble explaining what was in flight and what the',\n 'model is authorised to do (pivot hard, respawn subagents, ask',\n 'for clarification). Equivalent to pressing Esc then typing.',\n ].join('\\n'),\n async run(args: string) {\n const text = args.trim();\n if (!text) {\n return { message: 'Usage: /steer <new direction>' };\n }\n // Capture BEFORE mutating — same as the Esc handler.\n const s = stateRef.current;\n const runningTools = Array.from(s.runningTools.values()).map((t) => t.name);\n const subagents = Object.values(s.fleet)\n .filter((e) => e.status === 'running')\n .map((e) => ({ label: e.name, status: e.status, tool: e.currentTool?.name }));\n const subagentsTerminated = subagents.length;\n const partialAssistantText = streamingTextRef.current.slice(-1500);\n\n activeCtrlRef.current?.abort();\n dispatch({\n type: 'steerStart',\n snapshot: { runningTools, subagents, subagentsTerminated, partialAssistantText },\n });\n const droppedCount = s.queue.length;\n if (droppedCount > 0) dispatch({ type: 'queueClear' });\n if (director && subagentsTerminated > 0) {\n const cap = new Promise<void>((resolve) => {\n const t = setTimeout(resolve, 1500);\n t.unref?.();\n });\n void Promise.race([director.terminateAll().catch(() => undefined), cap]);\n }\n\n // Build the full preamble + direction here, return it as the\n // slash command output's `runText` so the submit pipeline\n // sends THIS to the model instead of \"/steer …\".\n const preamble = buildSteeringPreamble(\n { runningTools, subagents, subagentsTerminated, partialAssistantText },\n text,\n );\n // Consume immediately — the runText below already carries the\n // preamble; the steeringPending flag would otherwise double up.\n dispatch({ type: 'steerConsume' });\n\n const droppedTag = droppedCount > 0 ? ` · dropped ${droppedCount} queued` : '';\n const fleetTag =\n subagentsTerminated > 0\n ? ` · stopped ${subagentsTerminated} subagent${subagentsTerminated === 1 ? '' : 's'}`\n : '';\n return {\n message: `↯ Steering${droppedTag}${fleetTag}.`,\n runText: preamble,\n };\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('steer');\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [slashRegistry, director]);\n\n // `/rewind` — open the checkpoint timeline overlay. If a checkpoint\n // index is provided as argument, rewinds directly to it.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- handleRewindTo is stable via useCallback\n useEffect(() => {\n const cmd = {\n name: 'rewind',\n description: 'Open checkpoint timeline to rewind session: /rewind [checkpoint-index]',\n help: [\n 'Usage: /rewind [checkpoint-index]',\n '',\n 'Opens a checkpoint timeline. Use ↑/↓ to navigate, Enter to rewind,',\n 'Esc to cancel. The session is reverted to the selected checkpoint',\n 'and conversation history is truncated — LLM continues fresh.',\n '',\n 'If a checkpoint index is provided the timeline is skipped and',\n 'rewind happens immediately.',\n ].join('\\n'),\n async run(args: string) {\n const idx = Number.parseInt(args.trim(), 10);\n if (!Number.isNaN(idx) && idx >= 0) {\n handleRewindTo(idx);\n return {};\n }\n // No arg — open the timeline overlay\n const s = stateRef.current;\n if (s.checkpoints.length === 0) {\n return { message: 'No checkpoints in this session yet.' };\n }\n dispatch({ type: 'rewindOverlayOpen' });\n return {};\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('rewind');\n };\n }, [slashRegistry, handleRewindTo]);\n\n // `/agents` — bare `/agents` and `/agents monitor` toggle the overlay.\n // `/agents <id>` falls through to the CLI builtin (same-name registration\n // from the same 'core' owner is a no-op per SlashCommandRegistry semantics,\n // so we own the bare/monitor forms here and let the builtin handle IDs).\n useEffect(() => {\n const cmd = {\n name: 'agents',\n description: 'Toggle the agents monitor overlay.',\n async run(args: string) {\n const arg = args.trim().toLowerCase();\n if (!arg || arg === 'monitor') {\n dispatch({ type: 'toggleAgentsMonitor' });\n return { message: undefined };\n }\n // Any other arg falls through to the CLI builtin (same owner\n // 'core' re-registration = silently ignored). The builtin handles\n // onAgents UUID lookups and /agents on|off.\n return { message: undefined };\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('agents');\n };\n }, [slashRegistry]);\n\n // `/goal` is registered as a CLI builtin (packages/cli/src/slash-commands/\n // goal.ts) which handles both the preamble lock-in (the former TUI\n // behavior) and goal.json persistence for /autonomy eternal. The TUI\n // does NOT register its own /goal here — that would collide with the\n // builtin and throw \"already registered\" on mount.\n\n // Open routines shared by their slash command AND a mouse click on the\n // matching status-bar chip. Kept in refs (below) so the empty-dep mouse\n // handler can fire the latest version without re-subscribing.\n const openModelPicker = React.useCallback(async () => {\n if (!getPickableProviders) return;\n const providers = await getPickableProviders();\n dispatch({ type: 'modelPickerOpen', providers });\n }, [getPickableProviders]);\n const openAutonomyPicker = React.useCallback(() => {\n if (!switchAutonomy) return;\n dispatch({ type: 'autonomyPickerOpen', options: AUTONOMY_OPTIONS });\n }, [switchAutonomy]);\n const openSettings = React.useCallback(() => {\n if (!getSettings) return;\n const s = getSettings();\n dispatch({ type: 'settingsOpen', mode: s.mode, delayMs: s.delayMs });\n }, [getSettings]);\n\n // Register the TUI-only `/model` command — opens a two-step picker\n // (provider → model). All work is local state mutation; the actual\n // switch fires only after the user confirms a model in step 2.\n useEffect(() => {\n if (!getPickableProviders || !switchProviderAndModel) return;\n const cmd = {\n name: 'model',\n aliases: ['provider', 'switch'],\n description: 'Pick a provider + model interactively (two-step).',\n async run() {\n await openModelPicker();\n return { message: undefined };\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('model');\n };\n }, [slashRegistry, getPickableProviders, switchProviderAndModel, openModelPicker]);\n\n // Register the TUI-only `/settings` command — opens the autonomy settings\n // editor (default mode + auto-proceed delay). Gated on the settings\n // accessors being wired by the host (CLI passes them in).\n useEffect(() => {\n if (!getSettings || !saveSettings) return;\n const cmd = {\n name: 'settings',\n aliases: ['config', 'prefs'],\n description: 'Edit autonomy defaults (mode + auto-proceed delay).',\n async run() {\n openSettings();\n return { message: undefined };\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('settings');\n };\n }, [slashRegistry, getSettings, saveSettings, openSettings]);\n\n // Register the TUI-only `/autonomy` command — opens a single-step picker.\n // When the user types `/autonomy` with no arg, the picker appears.\n // If they type `/autonomy off` etc. with an arg, the CLI builtin handles it.\n useEffect(() => {\n if (!switchAutonomy) return;\n const cmd = {\n name: 'autonomy',\n aliases: ['auto'],\n description: 'Pick an autonomy mode interactively (picker).',\n async run() {\n dispatch({ type: 'autonomyPickerOpen', options: AUTONOMY_OPTIONS });\n return { message: undefined };\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('autonomy');\n };\n }, [slashRegistry, switchAutonomy]);\n\n // Subscribe to provider streaming events.\n useEffect(() => {\n // Throttle stream delta DISPATCHES to reduce flicker — we batch into\n // React state at ~10fps. The full text is also written into\n // streamingTextRef synchronously on every delta, so `runBlocks` can\n // read the complete stream when `agent.run` returns without racing\n // the throttle's last unflushed batch.\n const FLUSH_MS = 100;\n const flush = () => {\n if (pendingDeltaRef.current) {\n dispatch({ type: 'streamDelta', delta: pendingDeltaRef.current });\n pendingDeltaRef.current = '';\n }\n flushTimerRef.current = null;\n };\n const offDelta = events.on('provider.text_delta', (e) => {\n // Strip any bracketed-paste DCS sequences that some providers echo\n // into the stream. They are invisible in a real terminal but appear as\n // junk text if Ink's raw rendering catches them. The ESC byte is\n // matched optionally — a stripped/split ESC would otherwise leave a\n // bare `[200~` in the rendered text (same failure as the input path).\n // biome-ignore lint/suspicious/noControlCharactersInRegex: bracketed paste escape sequences are intentional\n const text = e.text.replace(/\\x1b?\\[200~|\\x1b?\\[201~/g, '');\n streamingTextRef.current += text;\n pendingDeltaRef.current += text;\n if (!flushTimerRef.current) flushTimerRef.current = setTimeout(flush, FLUSH_MS);\n });\n const offToolStart = events.on('tool.started', (e) => {\n dispatch({ type: 'toolStarted', id: e.id, name: e.name });\n dispatch({ type: 'leaderToolStart', name: e.name });\n });\n const offIterStart = events.on('iteration.started', () => {\n dispatch({ type: 'leaderIterStart' });\n });\n const offIterEnd = events.on('iteration.completed', () => {\n dispatch({ type: 'leaderIterEnd' });\n });\n const offToolProgress = events.on('tool.progress', (e) => {\n // Only `partial_output` becomes the live tail. Other event kinds\n // (`log`, `warning`, `metric`, `file_changed`) are deliberately not\n // rendered here — they pile up too fast and would steal screen real\n // estate from the assistant text. They still flow through EventBus\n // for observability/metrics consumers.\n if (e.event.type !== 'partial_output' || !e.event.text) return;\n dispatch({\n type: 'toolStreamAppend',\n toolUseId: e.id,\n name: e.name,\n text: e.event.text,\n startedAt: Date.now(),\n });\n });\n const offTool = events.on('tool.executed', (e) => {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'tool',\n name: e.name,\n durationMs: e.durationMs,\n ok: e.ok,\n input: e.input,\n output: e.output,\n // Real model-visible sizes — forwarded so the size chip beside\n // the tool header can show what the model paid for instead of\n // the misleading preview-byte count we used to surface.\n outputBytes: e.outputBytes,\n outputTokens: e.outputTokens,\n outputLines: e.outputLines,\n },\n });\n // `tool.executed` has no tool_use id; the reducer falls back to\n // clearing the oldest running entry that matches this name.\n dispatch({ type: 'toolEnded', name: e.name });\n // Clear the live tail for this tool — the final entry is now in\n // <Static>, no need to keep mirroring it below.\n dispatch({ type: 'toolStreamClear', name: e.name });\n // Mirror into the leader-only counter so the AgentsMonitor's LEADER\n // row stays live even when no subagents exist.\n dispatch({ type: 'leaderToolEnd', name: e.name, ok: e.ok, durationMs: e.durationMs });\n // Echo the current todo list into chat whenever the `todo` tool\n // mutates ctx.todos — same format as `/todos list`. Snapshotted from\n // agent.ctx.todos at this point (the tool executor has already\n // applied the mutation by the time tool.executed fires).\n if (e.ok && e.name === 'todo') {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'info', text: formatTodosList(agent.ctx.todos) },\n });\n }\n });\n const offRetry = events.on('provider.retry', (e) => {\n const secs = (e.delayMs / 1000).toFixed(e.delayMs >= 1000 ? 1 : 2);\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: `⟳ retry ${e.attempt} in ${secs}s — ${e.description}` },\n });\n });\n const offProvErr = events.on('provider.error', (e) => {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'error', text: e.description },\n });\n });\n // Per-iteration text flush. Without this, the entire run buffers all text\n // deltas in the live tail box and dumps them into history as ONE assistant\n // entry only after `agent.run()` returns. Tool results, in contrast, land\n // in history immediately via `tool.executed` — so a multi-iteration turn\n // renders as \"all tools, then a wall of text\" instead of the natural\n // text → tool → text → tool interleaving that matches the actual stream.\n //\n // We hook `provider.response` (fires once per LLM call, both for\n // intermediate `tool_use` stops and the final `end_turn`) and commit\n // whatever has accumulated in `streamingTextRef` as an assistant history\n // entry. The next iteration's deltas start a fresh buffer. `runBlocks`\n // becomes purely the loop driver — it no longer adds the assistant entry,\n // since the per-iteration flushes have already done so.\n const offProvResp = events.on('provider.response', () => {\n const text = streamingTextRef.current;\n streamingTextRef.current = '';\n pendingDeltaRef.current = '';\n if (flushTimerRef.current) {\n clearTimeout(flushTimerRef.current);\n flushTimerRef.current = null;\n }\n dispatch({ type: 'streamReset' });\n if (text.trim()) {\n dispatch({ type: 'addEntry', entry: { kind: 'assistant', text } });\n }\n });\n const offConfirmNeeded = events.on('tool.confirm_needed', (e) => {\n // Only show the ConfirmPrompt component — no duplicate history entry needed.\n // The full ConfirmPrompt with y/n/a/d keys is rendered below;\n // the history placeholder was redundant.\n dispatch({\n type: 'confirmOpen',\n info: {\n toolUseId: e.toolUseId,\n toolName: e.tool.name,\n input: e.input,\n suggestedPattern: e.suggestedPattern,\n resolve: e.resolve,\n },\n });\n });\n const offTrustPersisted = events.on('trust.persisted', (e) => {\n const icon = e.decision === 'always' ? '✓' : '✗';\n const label = e.decision === 'always' ? 'always allowed' : 'denied';\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'info',\n text: `${icon} ${label}: ${e.tool}(${e.pattern})`,\n },\n });\n });\n return () => {\n offDelta();\n offToolStart();\n offIterStart();\n offIterEnd();\n offToolProgress();\n offTool();\n offRetry();\n offProvErr();\n offProvResp();\n offConfirmNeeded();\n offTrustPersisted();\n if (flushTimerRef.current) clearTimeout(flushTimerRef.current);\n };\n }, [events, agent.ctx.todos]);\n\n // Live mirror of `streamFleet` for the FleetBus listener below. The\n // listener is wired in a single mount-time effect so it doesn't tear\n // down per-state-change; a ref lets it read the current toggle value\n // on every event without re-subscribing.\n const streamFleetRef = useRef(state.streamFleet);\n useEffect(() => {\n streamFleetRef.current = state.streamFleet;\n }, [state.streamFleet]);\n\n // --- Subagent lifecycle entries (uniform for director + non-director) ---\n // Wired to EventBus, not FleetBus, so /spawn-agent runs (which don't\n // build a Director) also surface in the chat. The director path emits\n // the same events through `MultiAgentHost`, so this single listener\n // covers both modes and replaces the per-status history entry that\n // previously lived inside the director.on('task.completed') hook.\n // biome-ignore lint/correctness/useExhaustiveDependencies: labelFor is ref-stable (uses useRef)\n useEffect(() => {\n const offSpawned = events.on('subagent.spawned', (e) => {\n const lbl = labelFor(e.subagentId, e.name);\n dispatch({\n type: 'fleetSpawn',\n id: e.subagentId,\n name: e.name,\n provider: e.provider,\n model: e.model,\n transcriptPath: e.transcriptPath,\n });\n const where = e.provider && e.model ? `${e.provider}/${e.model}` : 'spawned';\n const desc = e.description ? ` — ${e.description.slice(0, 80)}` : '';\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '▶',\n text: `${where}${desc}`,\n },\n });\n });\n const offStarted = events.on('subagent.task_started', (e) => {\n const lbl = labelFor(e.subagentId);\n dispatch({ type: 'fleetStart', id: e.subagentId, taskId: e.taskId });\n const desc = e.description ? ` — ${e.description.slice(0, 80)}` : '';\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '●',\n text: `task started${desc}`,\n },\n });\n });\n const offCompleted = events.on('subagent.task_completed', (e) => {\n const lbl = labelFor(e.subagentId);\n const errKind = e.error?.kind;\n dispatch({\n type: 'fleetDone',\n id: e.subagentId,\n status: e.status,\n iterations: e.iterations,\n toolCalls: e.toolCalls,\n failureReason: errKind,\n });\n // Status-specific icon so timeout/stopped/failed are visually\n // distinct from a plain success. We now have a structured error\n // envelope with `kind` (e.g. `provider_rate_limit`,\n // `tool_failed`) — prefix the tail with `[kind]` so the user\n // sees the actual failure mode, not just \"✗ failed\" for every\n // breed of failure.\n const icon =\n e.status === 'success'\n ? '✓'\n : e.status === 'timeout'\n ? '⏱'\n : e.status === 'stopped'\n ? '⊘'\n : '✗';\n const errMsg = e.error?.message;\n const errMsgTail = errMsg\n ? ` — ${errMsg.replace(/\\s+/g, ' ').slice(0, 100)}${errMsg.length > 100 ? '…' : ''}`\n : '';\n const errChip = errKind ? ` [${errKind}]` : '';\n const secs = (e.durationMs / 1000).toFixed(e.durationMs < 10_000 ? 1 : 0);\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon,\n text: `${e.status} (${e.iterations} iter · ${e.toolCalls} tools · ${secs}s)${errChip}${errMsgTail}`,\n },\n });\n });\n // Budget pressure: subagent hit a soft limit and the coordinator\n // is auto-extending. Surface as a fleet warning so the user can see\n // \"⚡ agent#bug-hunter hitting tool_calls limit (350/400) — extending\".\n // Timeout-specific: never says \"extending\" since timeout is a pure\n // warning — the subagent just keeps running until it finishes.\n const offBudgetWarning = events.on('subagent.budget_warning', (e) => {\n const lbl = labelFor(e.subagentId);\n dispatch({\n type: 'fleetBudgetWarning',\n id: e.subagentId,\n kind: e.kind,\n used: e.used,\n limit: e.limit,\n });\n const timeoutSuffix = e.kind === 'timeout' ? ' (subagent continues running)' : ' — extending';\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '⚡',\n text: `hitting ${e.kind} limit (${e.used}/${e.limit})${timeoutSuffix}`,\n },\n });\n });\n // Granted extension — bump the persistent ⚡×N badge and log the grant\n // so the chat history shows the never-die handshake completing.\n const offBudgetExtended = events.on('subagent.budget_extended', (e) => {\n const lbl = labelFor(e.subagentId);\n dispatch({\n type: 'fleetBudgetExtended',\n id: e.subagentId,\n totalExtensions: e.totalExtensions,\n });\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '⚡',\n text: `extended ${e.kind} → ${e.newLimit} (×${e.totalExtensions})`,\n },\n });\n });\n // Periodic progress snapshot so the user can see what each subagent\n // is doing in the main chat history without opening the FleetPanel.\n // Format: \"AGENT#2 💬 L25 · 47 tools · $0.023 · doing bash...\"\n const offIterationSummary = events.on('subagent.iteration_summary', (e) => {\n const lbl = labelFor(e.subagentId);\n const costStr = e.costUsd > 0 ? ` · ${e.costUsd.toFixed(3)}` : '';\n const toolStr = e.currentTool ? ` · doing ${e.currentTool}` : '';\n const partial = e.partialText\n ? ` · \"${e.partialText.slice(0, 60)}${e.partialText.length > 60 ? '…' : ''}\"`\n : '';\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '💬',\n text: `L${e.iteration} · ${e.toolCalls} tools${costStr}${toolStr}${partial}`,\n },\n });\n });\n // Live context window fill: update ctxPct on the fleet entry so the\n // AgentsMonitor (Ctrl+G) can render a per-agent progress bar.\n // In director mode, MultiAgentHost forwards subagent ctx.pct events as\n // 'subagent.ctx_pct' with subagentId. The leader agent emits ctx.pct\n // directly (handled by a separate listener below for non-director mode).\n const offCtxPct = events.on('subagent.ctx_pct', (e) => {\n dispatch({\n type: 'fleetCtxPct',\n id: e.subagentId,\n load: e.load,\n tokens: e.tokens,\n maxContext: e.maxContext,\n });\n });\n // Leader agent ctx.pct: emitted directly on the host EventBus (not forwarded\n // by MultiAgentHost). Updates the dedicated leader state for the monitor.\n const offLeaderCtxPct = events.on('ctx.pct', (e) => {\n setActiveMaxContext(e.maxContext);\n dispatch({\n type: 'leaderCtxPct',\n load: e.load,\n tokens: e.tokens,\n maxContext: e.maxContext,\n });\n });\n const offLeaderMaxContext = events.on('ctx.max_context', (e) => {\n if (e.maxContext > 0) setActiveMaxContext(e.maxContext);\n });\n // Always-on per-tool state surface. Now fires in both director and\n // non-director modes, so the leader's chat history shows subagent\n // tool calls regardless of mode. Director mode also gets FleetBus\n // path for richer FleetPanel streaming.\n const offTool = events.on('subagent.tool_executed', (e) => {\n dispatch({\n type: 'fleetTool',\n id: e.subagentId,\n name: e.name,\n ok: e.ok,\n durationMs: e.durationMs,\n outputBytes: e.outputBytes,\n });\n dispatch({ type: 'fleetToolEnd', id: e.subagentId });\n });\n return () => {\n offSpawned();\n offStarted();\n offCompleted();\n offBudgetWarning();\n offBudgetExtended();\n offIterationSummary();\n offCtxPct();\n offLeaderCtxPct();\n offLeaderMaxContext();\n offTool();\n };\n }, [events, director]);\n\n // Checkpoint and session rewind event listeners — no director required.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- onClearHistory is stable\n useEffect(() => {\n const offCheckpoint = events.on('checkpoint.written', (e) => {\n dispatch({\n type: 'checkpointReceived',\n cp: {\n promptIndex: e.promptIndex,\n promptPreview: e.promptPreview,\n ts: e.ts,\n fileCount: e.fileCount,\n },\n });\n });\n const offRewound = events.on('session.rewound', (_e) => {\n dispatch({ type: 'sessionRewound', toPromptIndex: 0 });\n dispatch({ type: 'clearHistory' });\n if (onClearHistory) {\n onClearHistory(dispatch);\n }\n });\n return () => {\n offCheckpoint();\n offRewound();\n };\n }, [events, onClearHistory]);\n\n // --- Brain decision events → chat history/status bar ---\n useEffect(() => {\n const requestSummary = (request: { source: string; question: string }) =>\n `${request.source}: ${request.question}`.slice(0, 80);\n\n const addBrainEntry = (\n status: Exclude<Extract<HistoryEntry, { kind: 'brain' }>['status'], 'thinking'>,\n payload: unknown,\n ) => {\n const p = payload as {\n request: {\n id: string;\n source: string;\n risk: Extract<HistoryEntry, { kind: 'brain' }>['risk'];\n question: string;\n context?: string;\n options?: NonNullable<State['brainPrompt']>['options'];\n };\n decision: {\n type: string;\n optionId?: string;\n text?: string;\n prompt?: string;\n reason?: string;\n rationale?: string;\n };\n };\n const decision =\n p.decision.optionId ??\n p.decision.text ??\n p.decision.reason ??\n p.decision.prompt ??\n p.decision.type;\n dispatch({\n type: 'brainStatus',\n state: status,\n source: p.request.source,\n risk: p.request.risk,\n summary: decision,\n });\n if (status === 'ask_human') {\n dispatch({\n type: 'brainPromptSet',\n prompt: {\n requestId: p.request.id,\n source: p.request.source,\n risk: p.request.risk,\n question: p.request.question,\n context: p.request.context,\n options: p.request.options,\n },\n });\n } else {\n dispatch({ type: 'brainPromptClear' });\n }\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'brain',\n status,\n source: p.request.source,\n risk: p.request.risk,\n question: p.request.question,\n decision,\n rationale: p.decision.rationale,\n },\n });\n };\n\n const offRequested = events.on('brain.decision_requested', ({ request }) => {\n dispatch({\n type: 'brainStatus',\n state: 'deciding',\n source: request.source,\n risk: request.risk,\n summary: requestSummary(request),\n });\n });\n const offAnswered = events.on('brain.decision_answered', (payload) => {\n addBrainEntry('answered', payload);\n });\n const offAskHuman = events.on('brain.decision_ask_human', (payload) => {\n addBrainEntry('ask_human', payload);\n });\n const offDenied = events.on('brain.decision_denied', (payload) => {\n addBrainEntry('denied', payload);\n });\n return () => {\n offRequested();\n offAnswered();\n offAskHuman();\n offDenied();\n };\n }, [events]);\n\n // --- AutoPhase phase/task events → PhaseMonitor ---\n useEffect(() => {\n if (!subscribeAutoPhase) return;\n\n const handler = (event: string, payload: unknown) => {\n switch (event) {\n case 'phase.started': {\n const p = payload as { phaseId: string; name: string };\n dispatch({\n type: 'autoPhasePhaseUpdate',\n phaseId: p.phaseId,\n name: p.name,\n status: 'running',\n completedTasks: 0,\n totalTasks: 0,\n startedAt: Date.now(),\n });\n break;\n }\n case 'phase.completed': {\n const p = payload as { phaseId: string; name: string; durationMs: number };\n dispatch({\n type: 'autoPhasePhaseUpdate',\n phaseId: p.phaseId,\n name: p.name,\n status: 'completed',\n completedTasks: 0,\n totalTasks: 0,\n });\n break;\n }\n case 'phase.failed': {\n const p = payload as { phaseId: string; name: string; error?: string };\n dispatch({\n type: 'autoPhasePhaseUpdate',\n phaseId: p.phaseId,\n name: p.name,\n status: 'failed',\n completedTasks: 0,\n totalTasks: 0,\n });\n break;\n }\n case 'phase.statusChange': {\n const p = payload as { phaseId: string; name: string; from: string; to: string };\n const status = p.to === 'running' ? 'running' : p.to;\n dispatch({\n type: 'autoPhasePhaseUpdate',\n phaseId: p.phaseId,\n name: p.name,\n status,\n completedTasks: 0,\n totalTasks: 0,\n });\n break;\n }\n case 'phase.taskCompleted': {\n const p = payload as { phaseId: string; taskId: string; taskTitle: string };\n const existing = stateRef.current.autoPhase?.phases[p.phaseId];\n if (existing) {\n dispatch({\n type: 'autoPhasePhaseUpdate',\n phaseId: p.phaseId,\n name: existing.name,\n status: existing.status,\n completedTasks: existing.completedTasks + 1,\n totalTasks: existing.totalTasks,\n });\n }\n break;\n }\n case 'autonomous.tick': {\n const p = payload as {\n activePhases: Array<{ id: string }>;\n queuedPhases: Array<{ id: string }>;\n };\n dispatch({ type: 'autoPhaseRunningPhases', phaseIds: p.activePhases.map((ph) => ph.id) });\n // Update elapsed time\n const ap = stateRef.current.autoPhase;\n if (ap) {\n const firstPhase = ap.phases[Object.keys(ap.phases)[0] ?? ''];\n const elapsed =\n ap.elapsedMs > 0\n ? ap.elapsedMs + 1000\n : Date.now() - (firstPhase?.startedAt ?? Date.now());\n dispatch({ type: 'autoPhaseElapsed', ms: elapsed });\n }\n break;\n }\n case 'graph.completed': {\n dispatch({ type: 'autoPhaseReset' });\n break;\n }\n case 'graph.failed': {\n dispatch({ type: 'autoPhaseReset' });\n break;\n }\n case 'worktree.allocated': {\n const p = payload as {\n handleId: string;\n ownerLabel: string;\n branch: string;\n baseBranch: string;\n };\n dispatch({\n type: 'worktreeUpsert',\n handleId: p.handleId,\n baseBranch: p.baseBranch,\n row: {\n branch: p.branch,\n ownerLabel: p.ownerLabel,\n baseBranch: p.baseBranch,\n status: 'active',\n allocatedAt: Date.now(),\n },\n });\n break;\n }\n case 'worktree.committed': {\n const p = payload as {\n handleId: string;\n insertions: number;\n deletions: number;\n files: number;\n };\n dispatch({\n type: 'worktreeUpsert',\n handleId: p.handleId,\n row: {\n insertions: p.insertions,\n deletions: p.deletions,\n files: p.files,\n status: 'committing',\n },\n });\n break;\n }\n case 'worktree.merged': {\n const p = payload as { handleId: string };\n dispatch({ type: 'worktreeUpsert', handleId: p.handleId, row: { status: 'merged' } });\n break;\n }\n case 'worktree.conflict': {\n const p = payload as { handleId: string; conflictFiles: string[] };\n dispatch({\n type: 'worktreeUpsert',\n handleId: p.handleId,\n row: { status: 'needs-review', conflictFiles: p.conflictFiles },\n });\n break;\n }\n case 'worktree.failed': {\n const p = payload as { handleId: string };\n dispatch({ type: 'worktreeUpsert', handleId: p.handleId, row: { status: 'failed' } });\n break;\n }\n case 'worktree.released': {\n const p = payload as { handleId: string; kept: boolean };\n // Keep conflicted/failed (kept) worktrees visible; drop clean ones.\n if (!p.kept) dispatch({ type: 'worktreeRemove', handleId: p.handleId });\n break;\n }\n }\n };\n\n return subscribeAutoPhase(handler);\n }, [subscribeAutoPhase]);\n\n // --- Leader agent compaction events → chat history ---\n useEffect(() => {\n const offFired = events.on('compaction.fired', (e) => {\n const { level, tokens, load, maxContext, report } = e as {\n level: string;\n tokens: number;\n load: number;\n maxContext: number;\n report: { before: number; after: number; reductions: { phase: string; saved: number }[] };\n aggressive: boolean;\n };\n const pct = (load * 100).toFixed(0);\n const before = report.before;\n const after = report.after;\n const saved = before - after;\n // `tokens` / `load` come from the middleware's full-request estimator\n // (messages + system + tools); `report.before` is the compactor's\n // message-only count. They are different views of the same moment, so\n // label them explicitly to avoid the \"98k tokens but 73% load?\" confusion.\n if (saved <= 0) {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'info',\n text: `▸ compaction skipped at ${level} — load ${pct}% (${tokens.toLocaleString()} of ${maxContext.toLocaleString()} tok). preserveK protects recent turns; nothing to elide.`,\n },\n });\n return;\n }\n const table = [\n `▸ context compacted at ${level} — load ${pct}% (${tokens.toLocaleString()} of ${maxContext.toLocaleString()} tok, full request)`,\n ` msg tokens before ${before.toLocaleString().padStart(8)}`,\n ` msg tokens after ${after.toLocaleString().padStart(8)}`,\n ` saved ${saved.toLocaleString().padStart(8)} (${((saved / before) * 100).toFixed(1)}%)`,\n ];\n for (const line of table) {\n dispatch({ type: 'addEntry', entry: { kind: 'info', text: line } });\n }\n });\n const offFailed = events.on('compaction.failed', (e) => {\n const { level, load, maxContext, fatal } = e as {\n level: string;\n load: number;\n maxContext: number;\n fatal: boolean;\n };\n const pct = (load * 100).toFixed(0);\n const text = fatal\n ? `✗ compaction failed at ${level} — load ${pct}% of ${maxContext.toLocaleString()} tok — FATAL`\n : `⚠ compaction failed at ${level} — load ${pct}% of ${maxContext.toLocaleString()} tok — continuing`;\n dispatch({ type: 'addEntry', entry: { kind: fatal ? 'error' : 'warn', text } });\n });\n return () => {\n offFired();\n offFailed();\n };\n }, [events]);\n\n // Install a dispatch-backed setter into the shared controller so the\n // `/fleet stream on|off` slash command can flip our reducer flag.\n // Restored to a noop on unmount so a late-arriving slash callback\n // doesn't dispatch into a torn-down React tree.\n useEffect(() => {\n if (!fleetStreamController) return;\n fleetStreamController.enabled = state.streamFleet;\n fleetStreamController.setEnabled = (enabled: boolean) => {\n dispatch({ type: 'setStreamFleet', enabled });\n };\n return () => {\n fleetStreamController.setEnabled = (enabled: boolean) => {\n fleetStreamController.enabled = enabled;\n };\n };\n }, [fleetStreamController, state.streamFleet]);\n\n // Keep the controller's mirror of `enabled` in sync when the toggle is\n // flipped from a TUI-side path (not the slash command).\n useEffect(() => {\n if (fleetStreamController) fleetStreamController.enabled = state.streamFleet;\n }, [state.streamFleet, fleetStreamController]);\n\n // Install a dispatch-backed setter into the shared controller so the\n // `/agents on|off` slash command can toggle our overlay flag.\n // Restored to a noop on unmount so a late-arriving slash callback\n // doesn't dispatch into a torn-down React tree.\n useEffect(() => {\n if (!agentsMonitorController) return;\n agentsMonitorController.visible = state.agentsMonitorOpen;\n agentsMonitorController.setVisible = (visible: boolean) => {\n if (visible !== state.agentsMonitorOpen) {\n dispatch({ type: 'toggleAgentsMonitor' });\n }\n };\n return () => {\n agentsMonitorController.setVisible = (visible: boolean) => {\n agentsMonitorController.visible = visible;\n };\n };\n }, [agentsMonitorController, state.agentsMonitorOpen]);\n\n // Keep the controller's mirror of `visible` in sync when the toggle is\n // flipped from a TUI-side path (not the slash command).\n useEffect(() => {\n if (agentsMonitorController) agentsMonitorController.visible = state.agentsMonitorOpen;\n }, [state.agentsMonitorOpen, agentsMonitorController]);\n\n // Track double-Esc for input buffer clearing.\n const lastEscAtRef = useRef(0);\n const ESC_DOUBLE_PRESS_MS = 1000;\n\n // --- FleetBus → TUI dispatch bridge ---\n // Subscribes to every event on the director's FleetBus and dispatches\n // fleet state actions. Text deltas are throttled (FLUSH_MS) to avoid\n // flooding React re-renders; other events dispatch immediately.\n // Seeds initial fleet state from director.status() on mount so the\n // panel reflects subagents spawned before the TUI attached.\n // biome-ignore lint/correctness/useExhaustiveDependencies: labelFor is ref-stable\n useEffect(() => {\n const d = director;\n if (!d) return;\n const FLUSH_MS = 150;\n\n // Coalesce high-frequency subagent display events. Instead of dispatching\n // (and re-rendering) once per event, queue them and flush as ONE\n // `fleetBatch` every ~150ms. During a multi-agent run this turns hundreds\n // of renders/sec into ~6/sec. Correctness-sensitive events (task.completed\n // on offDone, and the one-time mount seed) keep the real `dispatch`.\n const batch: Action[] = [];\n let batchTimer: ReturnType<typeof setTimeout> | null = null;\n const flushBatch = () => {\n batchTimer = null;\n if (batch.length === 0) return;\n dispatch({ type: 'fleetBatch', actions: batch.splice(0, batch.length) });\n };\n const enq = (a: Action) => {\n batch.push(a);\n // Cap so a 20-agent burst can't grow an unbounded array before the timer.\n if (batch.length >= 256) {\n if (batchTimer) clearTimeout(batchTimer);\n flushBatch();\n return;\n }\n if (!batchTimer) batchTimer = setTimeout(flushBatch, FLUSH_MS);\n };\n\n // Per-agent buffered assistant text. Flushed as one `subagent`\n // history entry when the agent stops emitting deltas for FLUSH_MS,\n // so we don't fire a fresh history entry on every token.\n const streamBuf = new Map<string, string>();\n let streamFlushTimer: ReturnType<typeof setTimeout> | null = null;\n const flushStreamBufs = () => {\n for (const [id, text] of streamBuf) {\n const trimmed = text.trim();\n if (!trimmed) continue;\n const lbl = labelFor(id);\n enq({ type: 'fleetMessage', id, text: trimmed });\n if (streamFleetRef.current) {\n enq({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '💬',\n text: trimmed,\n },\n });\n }\n }\n streamBuf.clear();\n streamFlushTimer = null;\n };\n\n // Seed: discover already-spawned subagents from the coordinator.\n const status = d.status();\n for (const s of status.subagents) {\n const meta = d.getSubagentMeta(s.id);\n dispatch({\n type: 'fleetSpawn',\n id: s.id,\n name: meta?.name ?? s.name,\n provider: meta?.provider,\n model: meta?.model,\n });\n // Seed a stable label so subagents spawned before TUI mount still\n // show up by name in the status bar's per-agent detail line.\n labelFor(s.id, meta?.name ?? s.name);\n }\n // Also seed cost from the usage aggregator.\n dispatch({\n type: 'fleetCost',\n cost: d.snapshot().total.cost,\n input: d.snapshot().total.input,\n output: d.snapshot().total.output,\n });\n\n // Discover new subagents on first FleetBus event for an unknown id.\n const seen = new Set(Object.keys(status.subagents));\n\n // Throttled delta accumulator per subagent.\n const pending = new Map<string, string>();\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n const doFlush = () => {\n for (const [id, text] of pending) {\n if (text) enq({ type: 'fleetDelta', id, text });\n }\n pending.clear();\n flushTimer = null;\n };\n\n const offFleet = d.fleet.onAny((e: FleetEvent) => {\n // All dispatches in this handler go through the 150ms batch: shadow\n // `dispatch` with `enq` for the whole callback so every switch case\n // below queues instead of rendering immediately.\n const dispatch = enq;\n // Discover new subagents.\n const fresh = !seen.has(e.subagentId);\n if (fresh) {\n seen.add(e.subagentId);\n const meta = d.getSubagentMeta(e.subagentId);\n dispatch({\n type: 'fleetSpawn',\n id: e.subagentId,\n name: meta?.name,\n provider: meta?.provider,\n model: meta?.model,\n });\n // Always assign a label on first sighting so the status bar's\n // 4th line has stable AGENT#N names even when history streaming\n // is disabled. The history `spawned` entry below is gated on\n // streamFleet; label assignment itself is unconditional.\n const lbl = labelFor(e.subagentId, meta?.name);\n if (streamFleetRef.current) {\n const where =\n meta?.provider && meta?.model ? `${meta.provider}/${meta.model}` : 'spawned';\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '▶',\n text: where,\n },\n });\n }\n }\n\n switch (e.type) {\n case 'iteration.started':\n dispatch({ type: 'fleetStart', id: e.subagentId });\n break;\n case 'session.started':\n // First event a subagent emits — treat as start so the fleet\n // panel is populated even if no iteration.started fires yet.\n dispatch({ type: 'fleetStart', id: e.subagentId });\n break;\n case 'provider.text_delta': {\n const p = e.payload as { text?: string };\n if (p?.text) {\n const cur = pending.get(e.subagentId) ?? '';\n pending.set(e.subagentId, cur + p.text);\n if (!flushTimer) flushTimer = setTimeout(doFlush, FLUSH_MS);\n streamBuf.set(e.subagentId, (streamBuf.get(e.subagentId) ?? '') + p.text);\n if (streamFlushTimer) clearTimeout(streamFlushTimer);\n streamFlushTimer = setTimeout(flushStreamBufs, FLUSH_MS * 4);\n }\n break;\n }\n case 'provider.thinking_delta': {\n // Extended thinking output — same buffering as text_delta so\n // it gets flushed into recentMessages and (when streaming is\n // on) injected into leader history.\n const p = e.payload as { text?: string };\n if (p?.text) {\n streamBuf.set(e.subagentId, (streamBuf.get(e.subagentId) ?? '') + p.text);\n if (streamFlushTimer) clearTimeout(streamFlushTimer);\n streamFlushTimer = setTimeout(flushStreamBufs, FLUSH_MS * 4);\n }\n break;\n }\n case 'provider.retry': {\n const p = e.payload as { attempt?: number; delayMs?: number };\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'warn',\n text: `subagent retry ${p?.attempt ?? '?'}${p?.delayMs ? ` (${p.delayMs}ms)` : ''}`,\n },\n });\n break;\n }\n case 'provider.error': {\n const p = e.payload as { description?: string };\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'error',\n text: `subagent error${p?.description ? `: ${p.description}` : ''}`,\n },\n });\n break;\n }\n case 'tool.started': {\n const p = e.payload as { name?: string };\n if (p?.name) {\n dispatch({ type: 'fleetToolStart', id: e.subagentId, name: p.name });\n }\n break;\n }\n case 'tool.executed': {\n const p = e.payload as {\n name?: string;\n ok?: boolean;\n durationMs?: number;\n outputBytes?: number;\n outputLines?: number;\n };\n dispatch({\n type: 'fleetTool',\n id: e.subagentId,\n name: p?.name,\n ok: p?.ok,\n durationMs: p?.durationMs,\n outputBytes: p?.outputBytes,\n outputLines: p?.outputLines,\n });\n dispatch({ type: 'fleetToolEnd', id: e.subagentId });\n // Also inject into leader chat history when stream is enabled.\n if (streamFleetRef.current && p?.name) {\n const lbl = labelFor(e.subagentId);\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '🔧',\n text: `→ ${p.name} ${p.ok === false ? '✗' : '✓'}${p.durationMs != null ? ` (${p.durationMs}ms)` : ''}`,\n },\n });\n }\n break;\n }\n case 'provider.response': {\n // Surface live cost from the aggregator (already computed with\n // per-model pricing).\n dispatch({\n type: 'fleetCost',\n cost: d.snapshot().total.cost,\n input: d.snapshot().total.input,\n output: d.snapshot().total.output,\n });\n break;\n }\n case 'session.ended':\n // Subagent finished — leave status update to task.completed.\n break;\n case 'compaction.fired':\n dispatch({\n type: 'addEntry',\n entry: { kind: 'info', text: 'subagent compaction triggered' },\n });\n break;\n case 'compaction.failed':\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: 'subagent compaction failed' },\n });\n break;\n case 'token.threshold':\n dispatch({\n type: 'addEntry',\n entry: { kind: 'info', text: 'subagent token threshold reached' },\n });\n break;\n case 'budget.threshold_reached': {\n const p = e.payload as { kind?: string; used?: number; limit?: number };\n dispatch({\n type: 'fleetBudgetWarning',\n id: e.subagentId,\n kind: p?.kind ?? 'unknown',\n used: p?.used ?? 0,\n limit: p?.limit ?? 0,\n });\n break;\n }\n case 'budget.extended': {\n const p = e.payload as { totalExtensions?: number };\n if (p?.totalExtensions !== undefined) {\n dispatch({\n type: 'fleetBudgetExtended',\n id: e.subagentId,\n totalExtensions: p.totalExtensions,\n });\n }\n break;\n }\n // --- Collab session events ---\n case 'bug.found': {\n // Detect collab subagent role from subagentId: bug-hunter-<sid>,\n // refactor-planner-<sid>, critic-<sid>\n const role = e.subagentId.includes('bug-hunter')\n ? 'bug-hunter'\n : e.subagentId.includes('refactor-planner')\n ? 'refactor-planner'\n : e.subagentId.includes('critic')\n ? 'critic'\n : null;\n if (!role && !state.collabSession) {\n // Not a collab subagent — ignore.\n break;\n }\n if (!state.collabSession) {\n // First collab event we've seen — bootstrap state lazily.\n dispatch({\n type: 'collabSubagentSpawned',\n subagentId: e.subagentId,\n role: role ?? 'unknown',\n });\n }\n const bp = e.payload as {\n finding?: { id?: string; severity?: string; description?: string };\n };\n if (bp?.finding) {\n const sessionId = e.subagentId.split('-').slice(1).join('-') || e.subagentId;\n dispatch({\n type: 'collabBugFound',\n sessionId,\n bugId: bp.finding.id ?? 'unknown',\n severity: bp.finding.severity ?? 'unknown',\n description: bp.finding.description ?? '',\n });\n }\n break;\n }\n case 'refactor.plan': {\n if (!state.collabSession) break;\n const pp = e.payload as {\n plan?: { id?: string; riskScore?: string; phases?: unknown[] };\n };\n if (pp?.plan) {\n const sessionId = e.subagentId.split('-').slice(1).join('-') || e.subagentId;\n dispatch({\n type: 'collabPlanEmitted',\n sessionId,\n planId: pp.plan.id ?? 'unknown',\n riskScore: pp.plan.riskScore ?? 'unknown',\n phaseCount: pp.plan.phases?.length ?? 0,\n });\n }\n break;\n }\n case 'critic.evaluation': {\n if (!state.collabSession) break;\n const ep = e.payload as {\n evaluation?: { id?: string; verdict?: string; score?: number };\n };\n if (ep?.evaluation) {\n const sessionId = e.subagentId.split('-').slice(1).join('-') || e.subagentId;\n dispatch({\n type: 'collabEvalComplete',\n sessionId,\n evalId: ep.evaluation.id ?? 'unknown',\n verdict: ep.evaluation.verdict ?? 'unknown',\n score: ep.evaluation.score ?? 0,\n });\n }\n break;\n }\n case 'collab.session_done': {\n // Emitted by the CollabSession itself (EventEmitter 'session.done').\n if (!state.collabSession) break;\n const dp = e.payload as {\n report?: {\n sessionId?: string;\n overallVerdict?: 'approve' | 'needs_revision' | 'reject';\n };\n };\n if (dp?.report) {\n dispatch({\n type: 'collabSessionDone',\n sessionId: dp.report.sessionId ?? state.collabSession.sessionId ?? 'unknown',\n verdict: dp.report.overallVerdict ?? 'needs_revision',\n });\n }\n break;\n }\n }\n });\n\n // Task completions arrive on the director's bus too, but the\n // history entry is now produced by the `subagent.task_completed`\n // EventBus listener (which fires uniformly for director and\n // non-director paths). Here we only update fleet panel state +\n // running cost — the chat-side entry would otherwise duplicate.\n const offDone = d.on('task.completed', (payload) => {\n dispatch({\n type: 'fleetDone',\n id: payload.result.subagentId,\n status: payload.result.status,\n iterations: payload.result.iterations,\n toolCalls: payload.result.toolCalls,\n });\n dispatch({\n type: 'fleetCost',\n cost: d.snapshot().total.cost,\n input: d.snapshot().total.input,\n output: d.snapshot().total.output,\n });\n // Drain any pending streaming text right before the completion\n // entry is committed by the EventBus listener so the order\n // \"chat → done line\" stays correct. flushStreamBufs queues into the\n // batch, so flush the batch synchronously here to commit those chat\n // lines before the done entry lands.\n if (streamFlushTimer) {\n clearTimeout(streamFlushTimer);\n flushStreamBufs();\n }\n if (batchTimer) clearTimeout(batchTimer);\n flushBatch();\n });\n\n return () => {\n offFleet();\n offDone();\n if (flushTimer) clearTimeout(flushTimer);\n doFlush(); // queues any pending deltas\n if (streamFlushTimer) clearTimeout(streamFlushTimer);\n flushStreamBufs(); // queues any pending messages\n if (batchTimer) clearTimeout(batchTimer);\n flushBatch(); // commit the queued batch before teardown\n };\n }, [director]);\n\n // Handle SIGINT as a three-stage escalation:\n // 1st press — stop work and stay at the prompt: cancel the foreground\n // run + kill the fleet, OR (in autonomy / background-only mode) halt\n // the engines + terminate the fleet. Pickers cancel instead.\n // 2nd press — exit: graceful Ink unmount (restores the terminal) with a\n // hard-exit fallback timer in case the React tree is wedged.\n // 3rd press — immediate process.exit, so a wedged Ink loop can't trap\n // the user.\n useEffect(() => {\n const onSigint = () => {\n const current = stateRef.current;\n // Second (or later) Ctrl+C — exit no matter what. Status may be\n // 'aborting', 'running', or 'streaming'; the user has clearly\n // decided they want out. Try Ink's graceful exit first, then\n // hard-exit on a short timer in case the React tree is wedged.\n if (current.interrupts >= 1) {\n // Second (or later) Ctrl+C — the user wants out. Force-kill tracked\n // processes regardless of state.\n getProcessRegistry().killAll({ force: true });\n // If we already asked Ink to unmount and the user pressed again, the\n // React tree is wedged — hard-exit immediately.\n if (exitRequestedRef.current) {\n process.exit(130);\n }\n exitRequestedRef.current = true;\n dispatch({ type: 'interrupt' });\n // Terminate any lingering fleet so subagents don't outlive the TUI.\n if (director) void director.terminateAll().catch(() => undefined);\n // Graceful Ink unmount first: it restores the terminal (raw mode off,\n // cursor shown, alt-screen dismantled) and routes the 130 exit code\n // through run-tui's settle(). A bare process.exit() here would skip\n // that and can leave the terminal in raw mode — the \"exit feels\n // broken\" symptom. Fall back to a hard exit if Ink never unmounts.\n onExit(130);\n exit();\n const hardExit = setTimeout(() => process.exit(130), 400);\n hardExit.unref?.();\n return;\n }\n dispatch({ type: 'interrupt' });\n\n // Pickers are safe to cancel outright — closing the overlay\n // restores the previous state cleanly with no side-effects.\n // Do this first so a single Ctrl+C from the model picker or\n // slash picker exits gracefully instead of doing nothing.\n if (current.modelPicker.open) {\n dispatch({ type: 'modelPickerClose' });\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: 'Model picker cancelled.' },\n });\n return;\n }\n if (current.settingsPicker.open) {\n dispatch({ type: 'settingsClose' });\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: 'Settings cancelled.' },\n });\n return;\n }\n if (current.slashPicker.open) {\n dispatch({ type: 'slashPickerClose' });\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: 'Cancelled.' },\n });\n return;\n }\n\n if (activeCtrlRef.current) {\n activeCtrlRef.current.abort();\n dispatch({ type: 'status', status: 'aborting' });\n // Kill every running subagent on the first interrupt — without\n // this the parent agent.run() stays parked in `await delegate\n // → director.awaitTasks` forever and the \"press again to exit\"\n // hint becomes a lie.\n //\n // We `await` terminateAll AND race a 1500ms cap so a stuck\n // bridge or hung tool can't trap us in cleanup — the user\n // pressed Ctrl+C; their patience is finite. The second\n // Ctrl+C still forces exit immediately via the path above,\n // so this race only matters for the polite-shutdown window.\n if (director) {\n const cap = new Promise<void>((resolve) => {\n const t = setTimeout(resolve, 1500);\n t.unref?.();\n });\n void Promise.race([director.terminateAll().catch(() => undefined), cap]);\n }\n // Kill all tracked bash/exec processes from the process registry.\n // This ensures runaway child processes (including background bashes\n // that outlive the agent iteration) are cleaned up on Ctrl+C.\n const killed = getProcessRegistry().killAll();\n const procTag =\n killed.length > 0\n ? ` + killed ${killed.length} process${killed.length === 1 ? '' : 'es'}`\n : '';\n const droppedCount = stateRef.current.queue.length;\n if (droppedCount > 0) {\n dispatch({ type: 'queueClear' });\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'warn',\n text: `Iteration cancelled${director ? ' + fleet terminated' : ''}${procTag}. Dropped ${droppedCount} queued message${droppedCount === 1 ? '' : 's'}. Press Ctrl+C again to exit.`,\n },\n });\n } else {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'warn',\n text: `Iteration cancelled${director ? ' + fleet terminated' : ''}${procTag}. Press Ctrl+C again to exit.`,\n },\n });\n }\n } else {\n // No foreground (runBlocks) controller. We may still have background\n // work with no AbortController of its own: an autonomy engine driving\n // iterations, or a fleet of subagents. Eternal/parallel loops never\n // set activeCtrlRef, so this branch is the ONLY place their Ctrl+C is\n // handled — the first press must actually stop that work (and return\n // to the prompt), not merely announce \"press again to exit\".\n const fleetRunning = Object.values(current.fleet).filter(\n (e) => e.status === 'running',\n ).length;\n const autonomyRunning =\n eternalLoopRunningRef.current ||\n parallelLoopRunningRef.current ||\n getEternalEngine?.()?.currentState === 'running' ||\n getParallelEngine?.()?.currentState === 'running';\n if (autonomyRunning || fleetRunning > 0) {\n // Halt the engines first — eternal's stop() aborts the in-flight\n // iteration; both flip their persisted state to 'stopped'. Then\n // flip autonomy off so the driver loop won't start another\n // iteration, and terminate the fleet + tracked processes.\n getEternalEngine?.()?.stop();\n getParallelEngine?.()?.stop();\n if (autonomyRunning) switchAutonomy?.('off');\n if (director) {\n const cap = new Promise<void>((resolve) => {\n const t = setTimeout(resolve, 1500);\n t.unref?.();\n });\n void Promise.race([director.terminateAll().catch(() => undefined), cap]);\n }\n const killed = getProcessRegistry().killAll();\n const bits: string[] = [];\n if (autonomyRunning) bits.push('autonomy stopped');\n if (fleetRunning > 0)\n bits.push(`${fleetRunning} agent${fleetRunning === 1 ? '' : 's'} terminated`);\n if (killed.length > 0)\n bits.push(`${killed.length} process${killed.length === 1 ? '' : 'es'} killed`);\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'warn',\n text: `${bits.join(' + ') || 'Background work stopped'}. Press Ctrl+C again to exit.`,\n },\n });\n return;\n }\n // Truly idle — nothing running. Kill any lingering processes and arm\n // the second-press exit.\n const killed = getProcessRegistry().killAll();\n const procTag =\n killed.length > 0\n ? ` Killed ${killed.length} process${killed.length === 1 ? '' : 'es'}.`\n : '';\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: `Press Ctrl+C again to exit.${procTag}` },\n });\n }\n };\n process.on('SIGINT', onSigint);\n return () => {\n process.off('SIGINT', onSigint);\n };\n }, [director, getEternalEngine, getParallelEngine, switchAutonomy, onExit, exit]);\n\n /** Truncate pasted content for history preview: first `lines` lines + \"...\" line if truncated. */\n const truncatePastePreview = (text: string, lines: number): string => {\n const all = text.split('\\n');\n if (all.length <= lines) return text;\n const head = all.slice(0, lines).join('\\n');\n return `${head}\\n... (${all.length - lines} more lines)`;\n };\n\n // Finalize a fully-assembled paste payload. A collapse-worthy paste (long\n // or many-lined) or any multi-line paste becomes an inline `[pasted #N, L\n // lines]` chip in the editable row — the content lives in the AttachmentStore\n // and is expanded from the buffer at submit. A short single-line paste is\n // inserted straight into the row as raw text so the user can see and edit it.\n const commitPaste = async (full: string): Promise<void> => {\n const builder = builderRef.current;\n if (!builder || !full) return;\n if (builder.wouldCollapse(full) || full.includes('\\n')) {\n // Register-only: store the paste, get back the inline token. The token\n // goes into the buffer (single source of truth); nothing is appended to\n // the builder's own display, so there's no double-expansion at submit.\n const token = await builder.registerPaste(full);\n tokenPreviewsRef.current.set(token, truncatePastePreview(full, 6));\n const { buffer, cursor } = draftRef.current;\n const next = buffer.slice(0, cursor) + token + buffer.slice(cursor);\n setDraft(next, cursor + token.length);\n return;\n }\n const { buffer, cursor } = draftRef.current;\n const next = buffer.slice(0, cursor) + full + buffer.slice(cursor);\n setDraft(next, cursor + full.length);\n };\n\n const handleKey = async (input: string, key: KeyEvent) => {\n // Note: we no longer block input while the agent is running. Enter\n // routes through the queue when busy (see submit()), but typing,\n // backspace, paste, and clipboard-image all stay live.\n // Exception: when status is 'aborting', all input is blocked — except\n // Ctrl+C which the SIGINT handler processes directly (not through handleKey).\n // We check interrupts here so the second Ctrl+C can still reach the handler\n // even though status is 'aborting'.\n // Block input while aborting — unless the user is mid-steering\n // (they need to type their new direction) or already pressed Ctrl+C\n // twice (exit ladder takes priority). Ctrl+C SIGINT handler bypasses\n // handleKey entirely so it always fires regardless of this guard.\n if (state.status === 'aborting' && !state.steeringPending && state.interrupts === 0) return;\n // Block all input while confirmation prompt is shown — the ConfirmPrompt\n // component handles y/n/a/d/escape/enter itself and Input's disabled prop\n // is not reliable when multiple useInput hooks are active.\n if (state.confirmQueue.length > 0) return;\n\n // The help overlay is modal: Esc / `?` / `q` dismiss it; every other key is\n // swallowed so nothing leaks into the editor or chat behind it.\n if (state.helpOpen) {\n if (key.escape || input === '?' || input === 'q') dispatch({ type: 'toggleHelp' });\n return;\n }\n\n // Re-entrancy guard: block stale-second events from \\r\\n terminals.\n if (inputGateRef.current) return;\n\n // ── Managed-viewport scroll keys (PageUp/PageDown + Ctrl+Home/End) ─\n // Keyboard parity with the wheel: page the chat viewport. Active whenever\n // the managed viewport is the surface (alt-screen), mouse or not.\n // Home/End (when buffer empty) are handled separately below.\n if (managedLive) {\n if (key.pageUp) {\n dispatch({ type: 'scrollPage', dir: 'up' });\n return;\n }\n if (key.pageDown) {\n dispatch({ type: 'scrollPage', dir: 'down' });\n return;\n }\n // Ctrl+Home/End: jump to top/bottom of chat history.\n if (key.ctrl && key.home) {\n dispatch({ type: 'scrollToTop' });\n return;\n }\n if (key.ctrl && key.end) {\n dispatch({ type: 'scrollToBottom' });\n return;\n }\n }\n\n // ── Double-Esc clears input buffer ────────────────────────────────\n // When the user presses Esc twice within ESC_DOUBLE_PRESS_MS ms while\n // the buffer is non-empty, clear it. This mirrors the behaviour of bash's\n // Ctrl+C double-press clearing the line, adapted for Esc (no Ctrl needed).\n if (key.escape) {\n const now = Date.now();\n if (state.buffer.length > 0 && now - lastEscAtRef.current < ESC_DOUBLE_PRESS_MS) {\n dispatch({ type: 'clearInput' });\n lastEscAtRef.current = 0;\n return;\n }\n lastEscAtRef.current = now;\n }\n\n // ── Bracketed-paste accumulation ──────────────────────────────────\n // Must run before the Enter/key handling below: a paste split across\n // events can land a fragment that is exactly \"\\n\", which would\n // otherwise be read as Enter and submit mid-paste. The begin marker\n // (\\x1b[200~, or a bare [200~ when Ink ate the ESC) opens accumulation;\n // we swallow every fragment until the end marker (\\x1b[201~ / [201~),\n // then finalize the whole payload at once.\n if (input) {\n const paste = feedPaste(pasteAccumRef.current, input);\n if (paste) {\n pasteAccumRef.current = paste.accum;\n if (pasteFlushTimerRef.current) clearTimeout(pasteFlushTimerRef.current);\n if (paste.complete !== null) {\n pasteFlushTimerRef.current = null;\n await commitPaste(paste.complete);\n return;\n }\n pasteFlushTimerRef.current = setTimeout(() => {\n pasteFlushTimerRef.current = null;\n const full = pasteAccumRef.current;\n pasteAccumRef.current = null;\n if (full) void commitPaste(full);\n }, 250);\n return;\n }\n }\n\n // Some terminals emit \\r\\n for Enter as two separate stdin events.\n // \\r arrives with key.return=true (handled below); \\n may arrive as\n // a stray character with key.return=false. Normalize both to Enter\n // and prevent them from polluting the buffer as literal text.\n const isEnter = key.return || input === '\\r' || input === '\\n';\n\n // IMPORTANT: do NOT bail on `!input` here. Special keys (arrows,\n // Enter, Escape, Tab, Backspace) arrive with an empty `input`\n // string, and the slash/file pickers + cursor movement below all\n // depend on receiving those events. The late guard before text\n // insertion handles the empty-input case correctly.\n\n // Model picker takes absolute precedence: nothing else is meaningful\n // while the two-step overlay is open. Esc cancels (or backs out of\n // step 2 to step 1); Enter advances to the next step or confirms.\n if (state.modelPicker.open) {\n if (key.escape) {\n if (state.modelPicker.step === 'model') {\n dispatch({ type: 'modelPickerBack' });\n } else {\n dispatch({ type: 'modelPickerClose' });\n }\n return;\n }\n if (key.upArrow) {\n dispatch({ type: 'modelPickerMove', delta: -1 });\n return;\n }\n if (key.downArrow) {\n dispatch({ type: 'modelPickerMove', delta: 1 });\n return;\n }\n if (isEnter) {\n inputGateRef.current = true;\n try {\n if (state.modelPicker.step === 'provider') {\n const opt = state.modelPicker.providerOptions[state.modelPicker.selected];\n if (!opt) return;\n dispatch({\n type: 'modelPickerPickProvider',\n providerId: opt.id,\n models: opt.models,\n });\n return;\n }\n // step === 'model' → commit the switch\n const providerId = state.modelPicker.pickedProviderId;\n const modelId = state.modelPicker.modelOptions[state.modelPicker.selected];\n if (!providerId || !modelId) return;\n const err = switchProviderAndModel?.(providerId, modelId);\n if (err) {\n dispatch({ type: 'modelPickerHint', text: err });\n return;\n }\n setLiveProvider(providerId);\n setLiveModel(modelId);\n setActiveMaxContext(agent.ctx.provider.capabilities.maxContext);\n dispatch({\n type: 'addEntry',\n entry: { kind: 'info', text: `Switched to ${providerId} / ${modelId}.` },\n });\n dispatch({ type: 'modelPickerClose' });\n return;\n } finally {\n inputGateRef.current = false;\n }\n }\n // Any other key while picker is open: ignore.\n return;\n }\n\n // Autonomy picker takes absolute precedence while open.\n if (state.autonomyPicker.open) {\n if (key.escape) {\n dispatch({ type: 'autonomyPickerClose' });\n return;\n }\n if (key.upArrow) {\n dispatch({ type: 'autonomyPickerMove', delta: -1 });\n return;\n }\n if (key.downArrow) {\n dispatch({ type: 'autonomyPickerMove', delta: 1 });\n return;\n }\n if (isEnter) {\n const opt = state.autonomyPicker.options[state.autonomyPicker.selected];\n if (!opt) return;\n const err = switchAutonomy?.(opt.mode);\n if (err) {\n dispatch({ type: 'autonomyPickerHint', text: err });\n return;\n }\n dispatch({ type: 'autonomyPickerClose' });\n return;\n }\n return;\n }\n\n if (state.settingsPicker.open) {\n if (key.escape || (key.ctrl && input === 's')) {\n dispatch({ type: 'settingsClose' });\n return;\n }\n if (key.upArrow) {\n dispatch({ type: 'settingsFieldMove', delta: -1 });\n return;\n }\n if (key.downArrow) {\n dispatch({ type: 'settingsFieldMove', delta: 1 });\n return;\n }\n if (key.leftArrow) {\n dispatch({ type: 'settingsValueChange', delta: -1 });\n return;\n }\n if (key.rightArrow) {\n dispatch({ type: 'settingsValueChange', delta: 1 });\n return;\n }\n if (isEnter) {\n const { mode, delayMs } = state.settingsPicker;\n const err = await saveSettings?.({ mode, delayMs });\n if (err) {\n dispatch({ type: 'settingsHint', text: err });\n return;\n }\n dispatch({ type: 'settingsClose' });\n return;\n }\n return;\n }\n\n if (state.slashPicker.open) {\n if (key.escape) {\n dispatch({ type: 'slashPickerClose' });\n return;\n }\n if (key.upArrow) {\n dispatch({ type: 'slashPickerMove', delta: -1 });\n return;\n }\n if (key.downArrow) {\n dispatch({ type: 'slashPickerMove', delta: 1 });\n return;\n }\n if (isEnter) {\n const now = Date.now();\n if (now - lastEnterAtRef.current < 50) return;\n lastEnterAtRef.current = now;\n inputGateRef.current = true;\n const line = selectedSlashCommandLine(state.slashPicker);\n if (line) {\n void submit(line);\n } else {\n acceptSlashPickerSelection();\n }\n inputGateRef.current = false;\n return;\n }\n // Tab → autocomplete with selected command\n if (key.tab && state.slashPicker.matches.length > 0) {\n const sel = state.slashPicker.matches[state.slashPicker.selected];\n if (sel) {\n setDraft(`/${sel.name} `, sel.name.length + 2);\n dispatch({ type: 'slashPickerClose' });\n }\n return;\n }\n // Any other key falls through to normal text handling.\n }\n\n // Picker takes precedence over normal input handling when open.\n if (state.picker.open) {\n if (key.escape) {\n dispatch({ type: 'pickerClose' });\n return;\n }\n if (key.upArrow) {\n dispatch({ type: 'pickerMove', delta: -1 });\n return;\n }\n if (key.downArrow) {\n dispatch({ type: 'pickerMove', delta: 1 });\n return;\n }\n if (isEnter) {\n inputGateRef.current = true;\n try {\n await acceptPickerSelection();\n } finally {\n inputGateRef.current = false;\n }\n return;\n }\n // Any other key falls through to normal text handling, which will\n // either extend the @-query (e.g. typing more chars) or break it\n // (e.g. typing a space) — handled below.\n }\n\n // Esc when the agent is busy = \"drop what you're doing, I want to\n // steer\". Aborts the current iteration, terminates any running\n // subagents (otherwise they keep burning tokens on now-stale work),\n // and stashes a context snapshot so the STEERING preamble can tell\n // the model exactly what it was mid-doing. Does NOT consume the\n // Ctrl+C exit ladder (interrupts counter untouched). When no run\n // is active, Esc falls through to normal text handling.\n if (key.escape && state.status !== 'idle' && state.confirmQueue.length === 0) {\n // Snapshot context BEFORE we mutate anything. The submit handler\n // replays this into the model prompt so the model isn't guessing.\n const runningTools = Array.from(state.runningTools.values()).map((t) => t.name);\n const subagents = Object.values(state.fleet)\n .filter((e) => e.status === 'running')\n .map((e) => ({\n label: e.name,\n status: e.status,\n tool: e.currentTool?.name,\n }));\n const subagentsTerminated = subagents.length;\n const partialAssistantText = streamingTextRef.current.slice(-1500);\n\n activeCtrlRef.current?.abort();\n dispatch({ type: 'status', status: 'aborting' });\n dispatch({\n type: 'steerStart',\n snapshot: {\n runningTools,\n subagents,\n subagentsTerminated,\n partialAssistantText,\n },\n });\n\n // Kill the fleet too. Without this the subagents keep running\n // on the old direction, finish minutes later, and pollute the\n // chat with task.completed events the model doesn't care about\n // anymore. Cap at 1.5s so a wedged bridge can't hang the steer.\n if (director && subagentsTerminated > 0) {\n const cap = new Promise<void>((resolve) => {\n const t = setTimeout(resolve, 1500);\n t.unref?.();\n });\n void Promise.race([director.terminateAll().catch(() => undefined), cap]);\n }\n\n // Drop anything queued — steering means the user is redirecting,\n // not adding to the backlog. Without this the queued items would\n // run *before* the steering message, which contradicts the UX.\n const droppedCount = state.queue.length;\n if (droppedCount > 0) dispatch({ type: 'queueClear' });\n const droppedTag = droppedCount > 0 ? ` · dropped ${droppedCount} queued` : '';\n const fleetTag =\n subagentsTerminated > 0\n ? ` · stopped ${subagentsTerminated} subagent${subagentsTerminated === 1 ? '' : 's'}`\n : '';\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'warn',\n text: `↯ Interrupted${droppedTag}${fleetTag}. Type your new direction.`,\n },\n });\n return;\n }\n\n // Monitor overlays. Ctrl+F/G/T are the primary chords; F2/F3/F4 are\n // terminal-safe aliases because some terminals intercept the chord before\n // it reaches the app (notably Windows Terminal eats Ctrl+F for \"Find\").\n // F11 is deliberately unused — most terminals reserve it for fullscreen.\n // All toggles are allowed even while aborting, so the user can check\n // subagent state mid-steer.\n const toggleFleetOverlay = () => {\n if (state.agentsMonitorOpen) {\n // Switch: close AgentsMonitor, open FleetMonitor\n dispatch({ type: 'toggleAgentsMonitor' });\n dispatch({ type: 'toggleMonitor' });\n } else {\n dispatch({ type: 'toggleMonitor' });\n }\n };\n const toggleAgentsOverlay = () => {\n if (state.monitorOpen) {\n // Switch: close FleetMonitor, open AgentsMonitor\n dispatch({ type: 'toggleMonitor' });\n dispatch({ type: 'toggleAgentsMonitor' });\n } else {\n dispatch({ type: 'toggleAgentsMonitor' });\n }\n };\n const toggleWorktreeOverlay = () => {\n if (state.worktreeMonitorOpen) {\n dispatch({ type: 'worktreeMonitorToggle' });\n return;\n }\n // Opening closes any other overlay first so only one dashboard shows.\n if (state.agentsMonitorOpen) dispatch({ type: 'toggleAgentsMonitor' });\n if (state.monitorOpen) dispatch({ type: 'toggleMonitor' });\n if (state.autoPhase?.monitorOpen) dispatch({ type: 'autoPhaseMonitorToggle' });\n dispatch({ type: 'worktreeMonitorToggle' });\n };\n // Ctrl+F / F2 → fleet orchestration monitor.\n if ((key.ctrl && input === 'f') || key.fn === 2) {\n toggleFleetOverlay();\n return;\n }\n // Ctrl+G / F3 → agents live monitor.\n if ((key.ctrl && input === 'g') || key.fn === 3) {\n toggleAgentsOverlay();\n return;\n }\n // Ctrl+T / F4 → worktree monitor. (Word-delete that used to live on Ctrl+T\n // is covered by Ctrl+Backspace.)\n if ((key.ctrl && input === 't') || key.fn === 4) {\n toggleWorktreeOverlay();\n return;\n }\n // Ctrl+S toggles the autonomy settings editor (also openable via\n // `/settings`). Only when the host wired the settings accessors.\n if (key.ctrl && input === 's') {\n if (state.settingsPicker.open) {\n dispatch({ type: 'settingsClose' });\n } else if (getSettings && saveSettings) {\n const cfg = getSettings();\n dispatch({ type: 'settingsOpen', mode: cfg.mode, delayMs: cfg.delayMs });\n }\n return;\n }\n // Esc closes whichever monitor is open. When both are closed the busy-state\n // Esc handler above already returned when a run was active.\n if (key.escape) {\n if (state.agentsMonitorOpen) {\n dispatch({ type: 'toggleAgentsMonitor' });\n return;\n }\n if (state.monitorOpen) {\n dispatch({ type: 'toggleMonitor' });\n return;\n }\n if (state.worktreeMonitorOpen) {\n dispatch({ type: 'worktreeMonitorToggle' });\n return;\n }\n }\n\n // `?` on an empty prompt opens the keys-&-commands help overlay (lazygit\n // style). With any draft text it types normally, so a literal `?` mid-\n // message is never swallowed. Guarded against every other overlay/picker so\n // it never steals their `?`.\n if (\n input === '?' &&\n !key.ctrl &&\n !key.meta &&\n draftRef.current.buffer === '' &&\n !state.slashPicker.open &&\n !state.picker.open &&\n !state.modelPicker.open &&\n !state.autonomyPicker.open &&\n !state.settingsPicker.open &&\n !state.rewindOverlay &&\n !state.monitorOpen &&\n !state.agentsMonitorOpen &&\n !state.worktreeMonitorOpen &&\n !state.autoPhase?.monitorOpen\n ) {\n dispatch({ type: 'toggleHelp' });\n return;\n }\n\n if (isEnter) {\n // Re-entrancy protection for terminals that emit `\\r\\n` as two\n // separate stdin events: ignore Enter pressed within 50ms of the\n // last one. The 50ms window catches the double-event reliably\n // (the second `\\n` arrives within microseconds of the `\\r`) while\n // staying well below human double-tap speed.\n //\n // We intentionally do NOT await submit() here — it kicks off\n // agent.run() which can stay pending for minutes when a delegate\n // call is in flight. Awaiting would block this handler frame for\n // the full duration, which means every subsequent keystroke would\n // miss its dispatch (including the slash key — the user reported\n // the input feeling dead during delegated work). submit() handles\n // its own re-entrancy via state.status: when the agent is busy,\n // the message is queued instead of re-running concurrently.\n const now = Date.now();\n if (now - lastEnterAtRef.current < 50) return;\n lastEnterAtRef.current = now;\n void submit();\n return;\n }\n\n const { buffer, cursor } = draftRef.current;\n\n if (key.backspace || key.delete) {\n if (key.ctrl) {\n if (key.backspace) {\n if (cursor === 0) return;\n const beforeCursor = buffer.slice(0, cursor);\n const lastWordStart = beforeCursor.lastIndexOf(' ') + 1;\n const next = beforeCursor.slice(0, lastWordStart) + buffer.slice(cursor);\n setDraft(next, lastWordStart);\n } else {\n if (cursor >= buffer.length) return;\n const afterCursor = buffer.slice(cursor);\n const nextWordStart = afterCursor.indexOf(' ');\n const end = nextWordStart === -1 ? buffer.length : cursor + nextWordStart + 1;\n const next = buffer.slice(0, cursor) + buffer.slice(end);\n setDraft(next, cursor);\n }\n return;\n }\n\n // Token-aware backspace: if the text immediately before the cursor ends\n // with a whole attachment chip (`[pasted …]` / `[file:…]` / `[image …]`),\n // delete the entire token in one keystroke — anywhere in the line, not\n // just at the end.\n if (key.backspace) {\n const tokenDel = deleteTokenBackward(buffer, cursor);\n if (tokenDel) {\n setDraft(tokenDel.buffer, tokenDel.cursor);\n return;\n }\n }\n\n if (cursor === 0) return;\n const next = buffer.slice(0, cursor - 1) + buffer.slice(cursor);\n setDraft(next, cursor - 1);\n return;\n }\n\n if (key.leftArrow) {\n if (key.ctrl) {\n if (cursor === 0) return;\n const beforeCursor = buffer.slice(0, cursor);\n const prevWordStart = beforeCursor.lastIndexOf(' ');\n const target = prevWordStart === -1 ? 0 : prevWordStart + 1;\n setDraft(buffer, target);\n return;\n }\n if (cursor > 0) setDraft(buffer, cursor - 1);\n return;\n }\n if (key.rightArrow) {\n if (key.ctrl) {\n if (cursor >= buffer.length) return;\n const afterCursor = buffer.slice(cursor);\n const nextWordStart = afterCursor.indexOf(' ');\n const target = nextWordStart === -1 ? buffer.length : cursor + nextWordStart + 1;\n setDraft(buffer, target);\n return;\n }\n if (cursor < buffer.length) setDraft(buffer, cursor + 1);\n return;\n }\n // In managed (scroll) mode: Home/End scroll the chat viewport to top/bottom\n // when the input buffer is empty, mirroring the wheel and PgUp/PgDn.\n // When there is text in the buffer, Home/End position the cursor.\n if (key.home) {\n if (managedLive && buffer.length === 0) {\n dispatch({ type: 'scrollToTop' });\n } else {\n setDraft(buffer, 0);\n }\n return;\n }\n if (key.end) {\n if (managedLive && buffer.length === 0) {\n dispatch({ type: 'scrollToBottom' });\n } else {\n setDraft(buffer, buffer.length);\n }\n return;\n }\n\n // History scrolling is delegated to the terminal's native scrollback\n // (mouse wheel, Shift+PgUp in Windows Terminal, etc.) — Ink's <Static>\n // emits each finalized entry once and never repaints over it.\n if (key.upArrow) {\n if (state.inputHistory.length > 0) dispatch({ type: 'historyUp' });\n return;\n }\n if (key.downArrow) {\n if (state.historyIndex > 0) dispatch({ type: 'historyDown' });\n return;\n }\n // Ctrl+P → toggle PhaseMonitor overlay when AutoPhase is active.\n if (key.ctrl && input === 'p') {\n if (state.autoPhase) dispatch({ type: 'autoPhaseMonitorToggle' });\n else {\n // No active AutoPhase — treat as a command alias for /autophase status\n slashRegistry.dispatch('/autophase', agent.ctx).then((res) => {\n if (res?.message)\n dispatch({ type: 'addEntry', entry: { kind: 'info', text: res.message } });\n });\n }\n return;\n }\n if (key.ctrl && input === 'a') {\n setDraft(buffer, 0);\n return;\n }\n if (key.ctrl && input === 'e') {\n setDraft(buffer, buffer.length);\n return;\n }\n if (key.ctrl && input === 'u') {\n setDraft('', 0);\n return;\n }\n // Delete key and Ctrl+D → delete character at cursor (forward delete).\n // Ctrl+D also doubles as \"EOF\" in some shells — here it's just convenient\n // forward-delete when the user isn't at the terminal's physical Delete key.\n if (key.delete || (key.ctrl && input === 'd')) {\n if (cursor >= buffer.length) return;\n // Token-aware forward delete: drop a whole chip if one starts at cursor.\n const span = tokenLengthForward(buffer, cursor) || 1;\n const next = buffer.slice(0, cursor) + buffer.slice(cursor + span);\n setDraft(next, cursor);\n return;\n }\n\n // Ctrl+K → kill: delete from cursor to end of line.\n if (key.ctrl && input === 'k') {\n if (cursor >= buffer.length) return;\n const next = buffer.slice(0, cursor);\n setDraft(next, cursor);\n return;\n }\n\n // Alt+V → read image from clipboard and attach as [image #N].\n if (key.meta && input === 'v') {\n await pasteClipboardImage();\n return;\n }\n\n if (!input || key.ctrl || key.meta) return;\n\n // Never insert a raw escape sequence as text. An unrecognized F-key or CSI\n // sequence that Ink forwards as `input` would otherwise leak bytes into the\n // row (the F2/F3/F4 overlays are handled above via key.fn from raw stdin).\n if (input.charCodeAt(0) === 0x1b) return;\n\n // Non-bracketed large paste: some terminals (notably older Windows\n // consoles) don't emit \\x1b[200~ markers, so a paste arrives as one big\n // text chunk. Bracketed pastes are already handled by the accumulation\n // guard near the top of handleKey; route big unmarked chunks through the\n // same finalizer so they collapse to a pill consistently.\n if (input.length > PASTE_THRESHOLD_CHARS) {\n await commitPaste(input);\n return;\n }\n\n // Any multi-line chunk is a paste (Enter was already handled above), even\n // a short non-bracketed one. Route it through the same finalizer so it\n // collapses to an inline `[pasted #N, L lines]` chip instead of leaking\n // newlines (or being flattened to spaces) into the row.\n if (input.includes('\\n')) {\n await commitPaste(input);\n return;\n }\n\n const next = buffer.slice(0, cursor) + input + buffer.slice(cursor);\n setDraft(next, cursor + input.length);\n };\n\n /**\n * Drive a single iteration: run the agent against `blocks`, render the\n * result into history, then if any messages were typed while we were\n * busy, pull the head of the queue and recurse. Recursion terminates\n * when the queue is empty (status stays idle).\n */\n const runBlocks = async (blocks: ContentBlock[]): Promise<void> => {\n const ctrl = new AbortController();\n activeCtrlRef.current = ctrl;\n // Each run starts a fresh interrupt cycle: 1st Ctrl+C aborts, 2nd exits.\n // submit() already resets, but queue-drain / runText / autonomy paths\n // re-enter runBlocks without going through submit — without this reset a\n // stale counter from a prior abort would make the next run's first\n // Ctrl+C force-exit instead of aborting.\n dispatch({ type: 'resetInterrupts' });\n dispatch({ type: 'status', status: 'running' });\n\n try {\n const startedAt = Date.now();\n const before = tokenCounter?.total();\n const costBefore = tokenCounter?.estimateCost().total ?? 0;\n const routed = blocks.some((block) => block.type === 'image')\n ? await routeImagesForModel(blocks, {\n supportsVision: supportsVision\n ? await supportsVision()\n : agent.ctx.provider.capabilities.vision,\n adapters: visionAdapters,\n ctx: agent.ctx,\n signal: ctrl.signal,\n providerId: agent.ctx.provider.id,\n model: agent.ctx.model,\n })\n : { blocks, route: 'none' as const, convertedImages: 0 };\n if (routed.route === 'adapter') {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'info',\n text: `Image input analyzed via ${routed.adapterName ?? 'vision adapter'} (${routed.convertedImages} image${routed.convertedImages === 1 ? '' : 's'}).`,\n },\n });\n }\n const result = await agent.run(routed.blocks, { signal: ctrl.signal });\n\n // Per-iteration assistant text was already committed by the\n // `provider.response` listener as each LLM call finished. Safety net:\n // if anything is still lingering in the synchronous ref (e.g. an\n // aborted run that never received a final provider.response), commit\n // it now so partial output is preserved rather than silently dropped.\n const lingering = streamingTextRef.current;\n if (lingering.trim()) {\n dispatch({ type: 'addEntry', entry: { kind: 'assistant', text: lingering } });\n }\n streamingTextRef.current = '';\n pendingDeltaRef.current = '';\n if (flushTimerRef.current) {\n clearTimeout(flushTimerRef.current);\n flushTimerRef.current = null;\n }\n dispatch({ type: 'streamReset' });\n\n if (result.status === 'aborted') {\n dispatch({ type: 'addEntry', entry: { kind: 'warn', text: 'Aborted.' } });\n } else if (result.status === 'failed') {\n const err = result.error;\n const text = err\n ? `Failed [${err.severity}${err.recoverable ? ', recoverable' : ''}]: ${err.describe()}`\n : 'Failed.';\n dispatch({\n type: 'addEntry',\n entry: { kind: 'error', text },\n });\n } else if (result.status === 'max_iterations') {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: `Hit max iterations (${result.iterations}).` },\n });\n }\n\n // ── SDD Auto-Detection ──────────────────────────────────────────\n // Process AI output for spec, implementation plan, and task detection.\n if (result.status === 'done' && result.finalText && onSDDOutput) {\n try {\n const sddMessages = await onSDDOutput(result.finalText);\n for (const msg of sddMessages) {\n dispatch({ type: 'addEntry', entry: { kind: 'info', text: msg } });\n }\n } catch {\n // Non-fatal — SDD detection is best-effort\n }\n }\n\n if (tokenCounter && before) {\n const after = tokenCounter.total();\n const costAfter = tokenCounter.estimateCost().total;\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'turn-summary',\n text: `[in: ${fmtTok(after.input - before.input)} out: ${fmtTok(after.output - before.output)} iters: ${result.iterations} cost: ${(costAfter - costBefore).toFixed(4)} ${((Date.now() - startedAt) / 1000).toFixed(1)}s]`,\n },\n });\n }\n\n // ── Next-task prediction (/next) ─────────────────────────────────\n // Opt-in. The CLI gates on the toggle + autonomy-off and returns []\n // when disabled, so calling unconditionally here is safe. Best-effort:\n // any failure is swallowed so prediction can never break the turn.\n if (result.status === 'done' && predictNext) {\n try {\n const userRequest = blocks\n .filter((b) => b.type === 'text')\n .map((b) => (b as { text: string }).text)\n .join(' ')\n .trim();\n const predictions = await predictNext({\n userRequest,\n assistantSummary: result.finalText ?? '',\n });\n if (predictions.length > 0) {\n const text = ['↳ likely next:', ...predictions.map((p, i) => ` ${i + 1}. ${p}`)].join(\n '\\n',\n );\n dispatch({ type: 'addEntry', entry: { kind: 'turn-summary', text } });\n }\n } catch {\n // Best-effort — never let prediction break the turn.\n }\n }\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'error', text: err instanceof Error ? err.message : String(err) },\n });\n } finally {\n activeCtrlRef.current = null;\n dispatch({ type: 'status', status: 'idle' });\n }\n\n // Drain the queue. If the run was aborted, the SIGINT handler has\n // already cleared the queue, so the head will be undefined.\n const head = stateRef.current.queue[0];\n if (head) {\n dispatch({ type: 'dequeueFirst' });\n await runBlocks(head.blocks);\n }\n };\n const runBlocksRef = useRef(runBlocks);\n runBlocksRef.current = runBlocks;\n\n /**\n * Eternal-mode driver. Loops `engine.runOneIteration()` until autonomy\n * flips away from 'eternal' or the engine reports stopped state. Each\n * iteration appends an info entry summarizing what happened so the TUI\n * timeline shows the engine's activity. Runs as a single sequential\n * consumer of `agent.run` — no race with user submissions because user\n * input is gated by `state.status` (a running iteration keeps status\n * at 'running' until the agent.run inside the engine returns).\n */\n const runEternalLoop = async (): Promise<void> => {\n const engine = getEternalEngine?.();\n if (!engine) return;\n // Avoid double-driving if the loop is already running. Status will\n // bounce idle↔running per iteration; the autonomy flag is the source\n // of truth for \"should we keep going\".\n if (eternalLoopRunningRef.current) return;\n eternalLoopRunningRef.current = true;\n try {\n while (true) {\n // Re-check the live state every iteration — /autonomy stop, SIGINT,\n // or /goal clear could have flipped it during the prior iteration.\n const liveMode = getAutonomy?.() ?? 'off';\n if (liveMode !== 'eternal') break;\n if (engine.currentState === 'stopped') break;\n dispatch({ type: 'status', status: 'running' });\n try {\n // Per-iteration entries land via the subscribeEternalIteration\n // useEffect below — we don't need to log here. Only surface\n // *errors* the engine catches but doesn't journal.\n await engine.runOneIteration();\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'error',\n text: `[eternal] ${err instanceof Error ? err.message : String(err)}`,\n },\n });\n }\n dispatch({ type: 'status', status: 'idle' });\n // Yield so a slash command submitted between iterations (e.g.\n // /autonomy stop) actually lands before we kick the next one.\n await new Promise((r) => setTimeout(r, 200));\n }\n } finally {\n eternalLoopRunningRef.current = false;\n // Sync the displayed autonomy state with reality. The loop only exits\n // when getAutonomy() !== 'eternal' or engine.currentState === 'stopped',\n // both of which mean the mode is effectively off/idle. Refreshing here\n // stops the status bar from oscillating between \"● thinking…\" and\n // \"● idle\" forever after the goal is done.\n if (getAutonomy) {\n const finalMode = getAutonomy();\n if (finalMode !== autonomyLive) setAutonomyLive(finalMode);\n }\n }\n };\n const eternalLoopRunningRef = useRef(false);\n const runEternalLoopRef = useRef(runEternalLoop);\n runEternalLoopRef.current = runEternalLoop;\n\n /** Parallel-eternal driver — fan-out loop for the ParallelEternalEngine. */\n const runParallelLoop = async (): Promise<void> => {\n const engine = getParallelEngine?.();\n if (!engine) return;\n if (parallelLoopRunningRef.current) return;\n parallelLoopRunningRef.current = true;\n try {\n while (true) {\n const liveMode = getAutonomy?.() ?? 'off';\n if (liveMode !== 'eternal-parallel') break;\n if (engine.currentState === 'stopped') break;\n dispatch({ type: 'status', status: 'running' });\n try {\n await engine.runOneIteration();\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'error',\n text: `[parallel] ${err instanceof Error ? err.message : String(err)}`,\n },\n });\n }\n dispatch({ type: 'status', status: 'idle' });\n await new Promise((r) => setTimeout(r, 200));\n }\n } finally {\n parallelLoopRunningRef.current = false;\n if (getAutonomy) {\n const finalMode = getAutonomy();\n if (finalMode !== autonomyLive) setAutonomyLive(finalMode);\n }\n }\n };\n const parallelLoopRunningRef = useRef(false);\n const runParallelLoopRef = useRef(runParallelLoop);\n runParallelLoopRef.current = runParallelLoop;\n\n // Subscribe to live per-iteration events from the eternal engine. The\n // engine's loop drive (runEternalLoop above) emits \"iteration completed\"\n // info entries, but those are coarse — this subscription surfaces the\n // *actual* journal entry per iteration with source, status, and cost.\n // Without it the TUI timeline only shows one-line summaries; with it the\n // user sees `#42 ✓ [todo] refactor parser ($0.0034)`.\n useEffect(() => {\n if (!subscribeEternalIteration) return;\n const unsub = subscribeEternalIteration((entry) => {\n const mark =\n entry.status === 'success'\n ? '✓'\n : entry.status === 'failure'\n ? '✗'\n : entry.status === 'aborted'\n ? '⊘'\n : '·';\n const cost = typeof entry.costUsd === 'number' ? ` ($${entry.costUsd.toFixed(4)})` : '';\n const note = entry.note ? ` — ${entry.note.slice(0, 80)}` : '';\n const text = `#${entry.iteration} ${mark} [${entry.source}] ${entry.task}${cost}${note}`;\n dispatch({ type: 'addEntry', entry: { kind: 'info', text } });\n });\n return unsub;\n }, [subscribeEternalIteration]);\n\n // Subscribe to live stage-transition events from the eternal engine.\n // Drives `state.eternalStage` used by the status bar to show the\n // engine's current location (decide → execute → reflect → sleep/paused).\n useEffect(() => {\n if (!subscribeEternalStage) return;\n const unsub = subscribeEternalStage((stage) => {\n dispatch({ type: 'eternalStage', stage });\n });\n return unsub;\n }, [subscribeEternalStage]);\n\n const submit = async (overrideRaw?: string) => {\n const raw = overrideRaw ?? draftRef.current.buffer;\n const trimmed = raw.trim();\n // Attachment chips live inline in the buffer now, so a paste/file-only\n // message is already non-empty here — a single `!trimmed` guard suffices.\n if (!trimmed) return;\n\n dispatch({ type: 'resetInterrupts' });\n const pushSubmittedHistory = () => {\n if (trimmed) dispatch({ type: 'historyPush', text: trimmed });\n };\n if (trimmed === '/image' || trimmed === '/paste-image') {\n pushSubmittedHistory();\n clearDraft();\n await pasteClipboardImage();\n return;\n }\n\n // Slash commands always dispatch immediately, even mid-iteration —\n // they don't conflict with a running agent.\n if (trimmed.startsWith('/')) {\n dispatch({ type: 'addEntry', entry: { kind: 'user', text: trimmed } });\n pushSubmittedHistory();\n clearDraft();\n try {\n const res = await slashRegistry.dispatch(trimmed, agent.ctx);\n if (res?.message) {\n dispatch({ type: 'addEntry', entry: { kind: 'info', text: res.message } });\n }\n // autoPhaseInit: when /autophase start succeeds, the graph title is\n // embedded in metadata so the TUI can show the PhasePanel immediately\n // even before the first orchestrator event fires.\n if (res?.metadata?.autoPhaseInit) {\n const m = res.metadata.autoPhaseInit as { title: string };\n dispatch({ type: 'autoPhaseInit', title: m.title });\n }\n // Slash commands like /model and /use mutate agent.ctx directly.\n // Re-sync the visible status bar so the user sees the switch\n // landed; otherwise the bar keeps the startup-time values and\n // /model \"feels\" broken even when subsequent requests use the\n // new model.\n const ctxModel = agent.ctx.model;\n if (ctxModel && ctxModel !== liveModel) setLiveModel(ctxModel);\n const ctxProviderId = (agent.ctx.provider as { id?: string } | undefined)?.id;\n if (ctxProviderId && ctxProviderId !== liveProvider) setLiveProvider(ctxProviderId);\n const ctxMaxContext = agent.ctx.provider.capabilities.maxContext;\n if (ctxMaxContext > 0 && ctxMaxContext !== activeMaxContext) {\n setActiveMaxContext(ctxMaxContext);\n }\n if (getYolo) {\n const currentYolo = getYolo();\n if (currentYolo !== yoloLive) setYoloLive(currentYolo);\n }\n if (getAutonomy) {\n const currentAutonomy = getAutonomy();\n if (currentAutonomy !== autonomyLive) setAutonomyLive(currentAutonomy);\n // When /autonomy eternal lands, kick off the engine-driven loop.\n // Fire-and-forget — the loop runs until autonomy flips away from\n // 'eternal' or the engine's currentState goes !== 'running'.\n // Without this, the slash command would set the flag but the\n // TUI would just sit at the prompt waiting for user input.\n if (currentAutonomy === 'eternal' && getEternalEngine) {\n void runEternalLoopRef.current();\n }\n if (currentAutonomy === 'eternal-parallel' && getParallelEngine) {\n void runParallelLoopRef.current();\n }\n }\n if (res?.exit) {\n exit();\n onExit(0);\n }\n // `runText` lets a slash command queue a follow-up user-role\n // message (used by `/steer <text>` to send the STEERING\n // preamble + new direction as if the user had typed it).\n // Run AFTER the message is rendered so the user sees the\n // slash result before the model's response streams.\n if (res?.runText) {\n const b = builderRef.current;\n if (b) {\n b.appendText(res.runText);\n const blocks = await b.submit();\n // Wait briefly for any in-flight abort to settle into\n // 'idle' before kicking the next iteration — otherwise\n // runBlocks would early-return on the busy guard.\n const start = Date.now();\n while (stateRef.current.status !== 'idle' && Date.now() - start < 1500) {\n await new Promise((r) => setTimeout(r, 25));\n }\n await runBlocks(blocks);\n }\n }\n // Only fire onClearHistory for `/clear` — without this gate every\n // slash command (`/model`, `/use`, `/help`, …) would wipe the\n // conversation. Match the command name segment, not just the\n // prefix, so `/clearfoo` doesn't trigger.\n const cmd = trimmed.slice(1).split(/\\s+/, 1)[0];\n if (cmd === 'clear') {\n onClearHistory?.(dispatch);\n }\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'error', text: err instanceof Error ? err.message : String(err) },\n });\n }\n return;\n }\n\n const builder = builderRef.current;\n if (!builder) return;\n // Steering inject: if the user pressed Esc on the prior iteration,\n // prepend a STEERING preamble so the model sees this isn't a\n // follow-up — it's an interrupt redirecting the work. The preamble\n // carries (a) context the model would otherwise have to guess\n // (what tools were running, what subagents were live) and (b)\n // explicit authority — \"drop the prior plan, respawn subagents\n // if useful, ask for clarification if needed\". Plain user-role\n // text so accountability stays with the human who triggered it.\n const steering = state.steeringPending;\n\n // ── SDD Context Injection ──────────────────────────────────────────\n // When an SDD session is active, prepend the session context so the\n // model knows it's in a spec-building conversation.\n const sddContext = getSDDContext?.();\n if (sddContext && trimmed) {\n builder.appendText(`[SDD SESSION ACTIVE]\\n${sddContext}\\n\\n---\\nUser message:\\n`);\n }\n\n if (trimmed) {\n const toAppend = steering ? buildSteeringPreamble(state.steerSnapshot, trimmed) : trimmed;\n builder.appendText(toAppend);\n }\n if (steering) dispatch({ type: 'steerConsume' });\n // The user sees their original text + a visual ↯ marker when\n // steering, not the full preamble — keeps the chat readable while\n // the model still gets the explicit instruction.\n const displayText = trimmed ? (steering ? `↯ ${trimmed}` : trimmed) : '(attachments only)';\n // Build the history preview by scanning the message for inline chip tokens\n // and pulling each one's stored preview. Each chip becomes a label line\n // followed by an indented snippet of its collapsed content.\n const pasteParts: string[] = [];\n for (const m of trimmed.matchAll(new RegExp(INLINE_TOKEN_SRC, 'g'))) {\n const token = m[0];\n const content = tokenPreviewsRef.current.get(token);\n pasteParts.push(token);\n if (content) pasteParts.push(` ${content.split('\\n').slice(0, 6).join('\\n ')}`);\n }\n const pasteContent = pasteParts.length > 0 ? pasteParts.join('\\n') : undefined;\n pushSubmittedHistory();\n clearDraft();\n const blocks = await builder.submit();\n\n if (state.status !== 'idle') {\n // Agent is busy — queue this message for the drainer to pick up.\n dispatch({\n type: 'addEntry',\n entry: { kind: 'user', text: displayText, queued: true, pasteContent },\n });\n dispatch({ type: 'enqueue', item: { displayText, blocks } });\n return;\n }\n\n dispatch({ type: 'addEntry', entry: { kind: 'user', text: displayText, pasteContent } });\n await runBlocks(blocks);\n };\n\n // ─── --goal / --ask boot inject ─────────────────────────────────────\n // The CLI may pass `--goal \"...\"` or `--ask \"...\"` to pre-populate the\n // very first turn. `initialGoal` wraps the text in the GOAL preamble so\n // the model lands in autonomous goal mode; `initialAsk` submits the text\n // verbatim (handy for scripted shell aliases). Both fire one-shot via a\n // mount-time ref guard so a re-render can't double-submit. We wait a tick\n // for the input builder to settle, then push directly into runBlocks —\n // bypassing the slash registry / submit() path keeps the boot path\n // self-contained even if user-installed slash commands haven't mounted\n // their effects yet.\n const bootInjectedRef = useRef(false);\n useEffect(() => {\n if (bootInjectedRef.current) return;\n bootInjectedRef.current = true;\n const goal = initialGoal?.trim();\n const ask = initialAsk?.trim();\n if (!goal && !ask) return;\n void (async () => {\n // Give the banner a frame to render first so the user sees the\n // greeting before the first turn streams over the top of it.\n await new Promise((r) => setTimeout(r, 50));\n const b = builderRef.current;\n if (!b) return;\n if (goal) {\n const shortGoal = goal.length > 80 ? `${goal.slice(0, 80)}…` : goal;\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'info',\n text: `🎯 Goal locked: ${shortGoal}\\n Agent will work until verifiably complete. Esc / /steer to redirect, Ctrl+C to stop.`,\n },\n });\n b.appendText(buildGoalPreamble(goal));\n } else if (ask) {\n dispatch({ type: 'addEntry', entry: { kind: 'user', text: ask } });\n b.appendText(ask);\n }\n const blocks = await b.submit();\n await runBlocksRef.current(blocks);\n })();\n }, [initialAsk, initialGoal]);\n\n // Expose the latest handleKey to the mouse handler (click-to-confirm).\n handleKeyRef.current = handleKey;\n // Expose the latest open-routines / rewind handler / status chip values to\n // the empty-dep mouse handler so clicks drive the live state.\n openModelPickerRef.current = () => {\n void openModelPicker();\n };\n openAutonomyPickerRef.current = openAutonomyPicker;\n handleRewindToRef.current = (promptIndex: number) => {\n void handleRewindTo(promptIndex);\n };\n statusChipRef.current = {\n version: appVersion,\n model: `${liveProvider}/${liveModel}`,\n fleetRunning: fleetCounts?.running ?? 0,\n yolo: yoloLive,\n autonomy: autonomyLive,\n };\n\n const inputHint = useMemo(() => {\n if (state.status !== 'idle') return '';\n if (state.buffer.startsWith('/')) return 'slash command — Enter to dispatch';\n if (state.picker.open) return '';\n return '';\n }, [state.buffer, state.status, state.picker.open]);\n\n const affordanceShown = managedLive && state.scrollOffset > 0 && state.pendingNewLines > 0;\n return (\n <Box flexDirection=\"column\" height={managedLive ? termRows : undefined}>\n {managedLive ? (\n <ScrollableHistory\n entries={state.entries}\n streamingText={state.streamingText}\n toolStream={state.toolStream}\n scrollOffset={state.scrollOffset}\n viewportRows={state.viewportRows || Math.max(MIN_VIEWPORT, termRows - 8)}\n totalLines={state.totalLines}\n onMeasure={(total) => dispatch({ type: 'setMeasuredLines', totalLines: total })}\n />\n ) : (\n <History\n entries={state.entries}\n streamingText={state.streamingText}\n toolStream={state.toolStream}\n />\n )}\n {affordanceShown ? (\n <Text dimColor>\n {` ↓ ${state.pendingNewLines} new line${state.pendingNewLines === 1 ? '' : 's'} — PgDn or click to jump to bottom`}\n </Text>\n ) : null}\n {/* In mouse mode the whole live region below the scroll viewport is\n wrapped in one measured Box so its height feeds the viewport-size\n computation. In the default path it's a layout-neutral column. */}\n <Box ref={managedLive ? bottomRef : undefined} flexDirection=\"column\" flexShrink={0}>\n {/* Live activity strip + input. Wrapped so its height locates where an\n open picker's items start on screen (click-to-select geometry). */}\n <Box ref={managedLive ? prePickerRef : undefined} flexDirection=\"column\" flexShrink={0}>\n <Box ref={managedLive ? liveStripRef : undefined} flexDirection=\"column\" flexShrink={0}>\n <LiveActivityStrip entries={state.fleet} nowTick={nowTick} />\n </Box>\n <Input\n prompt={INPUT_PROMPT}\n value={state.buffer}\n cursor={state.cursor}\n disabled={\n (state.status === 'aborting' && !state.steeringPending) ||\n state.confirmQueue.length > 0\n }\n hint={inputHint}\n onKey={handleKey}\n />\n </Box>\n {state.picker.open ? (\n <FilePicker\n query={state.picker.query}\n matches={state.picker.matches}\n selected={state.picker.selected}\n />\n ) : null}\n {state.slashPicker.open ? (\n <SlashMenu\n query={state.slashPicker.query}\n matches={state.slashPicker.matches}\n selected={state.slashPicker.selected}\n />\n ) : null}\n {state.modelPicker.open ? (\n <ModelPicker\n step={state.modelPicker.step}\n providerOptions={state.modelPicker.providerOptions}\n modelOptions={state.modelPicker.modelOptions}\n selected={state.modelPicker.selected}\n pickedProviderId={state.modelPicker.pickedProviderId}\n hint={state.modelPicker.hint}\n />\n ) : null}\n {state.autonomyPicker.open ? (\n <AutonomyPicker\n options={state.autonomyPicker.options}\n selected={state.autonomyPicker.selected}\n hint={state.autonomyPicker.hint}\n />\n ) : null}\n {state.settingsPicker.open ? (\n <SettingsPicker\n field={state.settingsPicker.field}\n mode={state.settingsPicker.mode}\n delayMs={state.settingsPicker.delayMs}\n hint={state.settingsPicker.hint}\n />\n ) : null}\n {state.rewindOverlay ? (\n <CheckpointTimeline\n checkpoints={state.rewindOverlay.checkpoints}\n selected={state.rewindOverlay.selected}\n onSelect={(i) =>\n dispatch({ type: 'rewindOverlayMove', delta: i - state.rewindOverlay!.selected })\n }\n onConfirm={(i) => handleRewindTo(state.rewindOverlay!.checkpoints[i]!.promptIndex)}\n onClose={() => dispatch({ type: 'rewindOverlayClose' })}\n />\n ) : null}\n {state.brainPrompt ? (\n <Box flexDirection=\"column\" marginY={1} flexShrink={0}>\n <BrainDecisionPrompt\n {...state.brainPrompt}\n onAnswer={(answer) => {\n events.emit('brain.human_answered', { ...answer, at: Date.now() });\n dispatch({ type: 'brainPromptClear' });\n }}\n />\n </Box>\n ) : null}\n {state.confirmQueue.length > 0 &&\n (() => {\n const head = state.confirmQueue[0]!;\n let resolved = false;\n const onDecision = (decision: ConfirmDecision) => {\n if (resolved) return;\n resolved = true;\n head.resolve(decision);\n dispatch({ type: 'confirmClose' });\n };\n // Expose the live decision callback so a mouse click on the button\n // row can fire it (see handleMouse). The wrapper Box owns marginY\n // and carries the ref so measureElement returns the exact box\n // height the hit-test uses to locate the button row.\n confirmDecisionRef.current = onDecision;\n return (\n <Box ref={confirmRef} flexDirection=\"column\" marginY={1} flexShrink={0}>\n <ConfirmPrompt\n toolName={head.toolName}\n input={head.input}\n suggestedPattern={head.suggestedPattern}\n onDecision={onDecision}\n />\n </Box>\n );\n })()}\n <StatusBar\n model={`${liveProvider}/${liveModel}`}\n version={appVersion}\n state={state.status}\n tokenCounter={tokenCounter}\n hint={renderRunningTools(state.runningTools) || state.hint}\n queueCount={state.queue.length}\n yolo={yoloLive}\n autonomy={autonomyLive}\n elapsedMs={elapsedMs}\n todos={todos}\n plan={planCounts ?? undefined}\n fleet={fleetCounts}\n git={gitInfo}\n context={contextWindow}\n brain={state.brain}\n projectName={projectName}\n subagentCount={Object.keys(state.fleet).length}\n processCount={getProcessRegistry().activeCount}\n hiddenItems={hiddenItems}\n eternalStage={state.eternalStage}\n goalSummary={state.goalSummary}\n />\n {/* Only render the persistent hint bar in the managed (alt-screen)\n viewport. In the default inline-redraw mode it would add a row to the\n fragile live region and collide with monitor panels rendered below it\n (interleaving their counts into the hints). */}\n {managedLive ? (\n <KeyHintBar\n context={{\n confirm: state.confirmQueue.length > 0,\n picker:\n state.picker.open ||\n state.slashPicker.open ||\n state.modelPicker.open ||\n state.autonomyPicker.open ||\n state.settingsPicker.open ||\n !!state.rewindOverlay,\n monitor:\n state.agentsMonitorOpen ||\n state.monitorOpen ||\n state.worktreeMonitorOpen ||\n !!state.autoPhase?.monitorOpen,\n managed: managedLive,\n mouse: mouseLive,\n }}\n />\n ) : null}\n {/* Keys-&-commands help overlay (`?` on an empty prompt). Modal: while\n open, handleKey swallows everything but Esc/?/q, so it never coexists\n with a monitor. */}\n {state.helpOpen ? <HelpOverlay managed={managedLive} mouse={mouseLive} /> : null}\n {/* Agents monitor overlay (Ctrl+G) and fleet monitor overlay (Ctrl+F)\n take up the lower region — hide FleetPanel while any overlay is open. */}\n {state.agentsMonitorOpen ? (\n <AgentsMonitor\n entries={entriesWithLeader}\n totalCost={state.fleetCost}\n totalTokens={state.fleetTokens}\n nowTick={nowTick}\n />\n ) : state.autoPhase?.monitorOpen ? (\n <PhaseMonitor\n phases={state.autoPhase.phases}\n runningPhaseIds={state.autoPhase.runningPhaseIds}\n elapsedMs={state.autoPhase.elapsedMs}\n nowTick={nowTick}\n onClose={() => dispatch({ type: 'autoPhaseMonitorToggle' })}\n />\n ) : state.worktreeMonitorOpen ? (\n <WorktreeMonitor\n worktrees={state.worktrees}\n baseBranch={state.worktreeBase}\n nowTick={nowTick}\n onClose={() => dispatch({ type: 'worktreeMonitorToggle' })}\n />\n ) : state.monitorOpen ? (\n <FleetMonitor\n entries={state.fleet}\n totalCost={state.fleetCost}\n totalTokens={state.fleetTokens}\n nowTick={nowTick}\n collabSession={state.collabSession}\n />\n ) : director ? (\n <FleetPanel\n entries={entriesWithLeader}\n totalCost={state.fleetCost}\n roster={fleetRoster}\n collabSession={state.collabSession}\n />\n ) : null}\n {state.autoPhase && !state.autoPhase.monitorOpen ? (\n <PhasePanel\n phases={state.autoPhase.phases}\n runningPhaseIds={state.autoPhase.runningPhaseIds}\n nowTick={nowTick}\n />\n ) : null}\n {Object.keys(state.worktrees).length > 0 &&\n !state.worktreeMonitorOpen &&\n !state.monitorOpen ? (\n <WorktreePanel worktrees={state.worktrees} nowTick={nowTick} />\n ) : null}\n </Box>\n </Box>\n );\n}\n\n/**\n * Render an at-a-glance \"running: …\" hint for the status bar. Shows the\n * oldest in-flight tool by name; if more than one, appends \"(+N)\".\n */\nexport function renderRunningTools(\n running: ReadonlyMap<string, { name: string; startedAt: number }>,\n): string {\n if (running.size === 0) return '';\n let oldest: { name: string; startedAt: number } | null = null;\n for (const info of running.values()) {\n if (!oldest || info.startedAt < oldest.startedAt) oldest = info;\n }\n if (!oldest) return '';\n const elapsedSec = ((Date.now() - oldest.startedAt) / 1000).toFixed(1);\n const more = running.size > 1 ? ` (+${running.size - 1})` : '';\n return `running: ${oldest.name} ${elapsedSec}s${more}`;\n}\n\n/**\n * Find an active `@<query>` token at the cursor. The token starts at the\n * last `@` not preceded by a non-whitespace char, and runs up to the cursor\n * (no whitespace allowed inside). Returns null if no active token.\n */\nexport function detectAtToken(\n buffer: string,\n cursor: number,\n): { start: number; end: number; query: string } | null {\n let i = cursor - 1;\n while (i >= 0) {\n const ch = buffer.charCodeAt(i);\n if (ch === 64 /* @ */) {\n // Must be at the start of buffer or preceded by whitespace.\n if (i === 0 || /\\s/.test(buffer[i - 1] ?? '')) {\n return { start: i, end: cursor, query: buffer.slice(i + 1, cursor) };\n }\n return null;\n }\n if (ch === 32 /* space */ || ch === 9 /* tab */ || ch === 10 /* nl */) return null;\n i--;\n }\n return null;\n}\n\nfunction fmtTok(n: number): string {\n if (n < 1000) return String(n);\n if (n < 1_000_000) return `${(n / 1000).toFixed(n < 10_000 ? 1 : 0)}k`;\n return `${(n / 1_000_000).toFixed(1)}M`;\n}\n","// SGR (1006) mouse-sequence parser, factored out of the TUI input path so the\n// (fiddly) byte decoding can be unit-tested in isolation.\n//\n// With mouse tracking enabled (DECSET ?1000h ?1006h) the terminal emits, for\n// every press / release / wheel tick:\n//\n// ESC [ < Cb ; Cx ; Cy M (press / wheel / motion)\n// ESC [ < Cb ; Cx ; Cy m (release)\n//\n// Cx / Cy are 1-based column / row. Cb packs the button in its low bits plus\n// modifier and event-class flags:\n//\n// bits 0-1 button 0 = left, 1 = middle, 2 = right, 3 = none/release\n// bit 2 (4) shift\n// bit 3 (8) alt / meta\n// bit 4 (16) ctrl\n// bit 5 (32) motion (drag) — set while a button is held and the pointer moves\n// bit 6 (64) wheel — 64 = wheel up, 65 = wheel down, 66/67 = wheel left/right\n//\n// Like bracketed-paste markers, Ink's keypress parser can strip the leading\n// ESC byte, leaving a bare `[<…`. We match the ESC optionally so both forms\n// decode. A single stdin chunk can carry several sequences (fast wheel\n// spins) — parseSgrMouse returns every event it finds, in order.\n\nexport type MouseButton = 'left' | 'middle' | 'right' | 'wheelUp' | 'wheelDown' | 'other';\n\nexport interface MouseEvent {\n /** press = button down (or wheel tick), release = button up, wheel = scroll. */\n type: 'press' | 'release' | 'wheel';\n button: MouseButton;\n /** 1-based terminal column. */\n x: number;\n /** 1-based terminal row. */\n y: number;\n shift: boolean;\n alt: boolean;\n ctrl: boolean;\n /** Pointer moved with a button held (motion flag, bit 5). */\n drag: boolean;\n}\n\n// ESC is optional: Ink sometimes strips it from CSI sequences (same reason the\n// paste accumulator matches a bare `[200~`). Global flag so matchAll yields\n// every sequence in a chunk.\n// biome-ignore lint/suspicious/noControlCharactersInRegex: SGR mouse sequences carry a literal ESC\nconst SGR_MOUSE_RE = /\\x1b?\\[<(\\d+);(\\d+);(\\d+)([Mm])/g;\n\n/** True when the chunk contains at least one SGR mouse sequence. Cheap guard\n * used to drop mouse bytes before they reach a text input. */\nexport function hasSgrMouse(s: string): boolean {\n // Build a fresh non-stateful matcher so repeated calls are independent.\n return new RegExp(SGR_MOUSE_RE.source).test(s);\n}\n\n/** Strip every SGR mouse sequence out of a chunk, returning the remaining\n * (keyboard) bytes. Used by the stdin proxy so Ink never sees mouse data. */\nexport function stripSgrMouse(s: string): string {\n return s.replace(SGR_MOUSE_RE, '');\n}\n\n/** Decode every SGR mouse sequence in `s`, in order. Non-mouse bytes are\n * ignored. Returns [] when there are none. */\nexport function parseSgrMouse(s: string): MouseEvent[] {\n const events: MouseEvent[] = [];\n for (const m of s.matchAll(SGR_MOUSE_RE)) {\n const cb = Number.parseInt(m[1] ?? '', 10);\n const x = Number.parseInt(m[2] ?? '', 10);\n const y = Number.parseInt(m[3] ?? '', 10);\n const final = m[4];\n if (!Number.isFinite(cb) || !Number.isFinite(x) || !Number.isFinite(y)) continue;\n const isWheel = (cb & 64) !== 0;\n const drag = (cb & 32) !== 0;\n const low = cb & 3;\n let button: MouseButton;\n let type: MouseEvent['type'];\n if (isWheel) {\n type = 'wheel';\n button = low === 0 ? 'wheelUp' : low === 1 ? 'wheelDown' : 'other';\n } else if (final === 'm') {\n // Lowercase terminator = button release.\n type = 'release';\n button = low === 0 ? 'left' : low === 1 ? 'middle' : low === 2 ? 'right' : 'other';\n } else {\n type = 'press';\n button = low === 0 ? 'left' : low === 1 ? 'middle' : low === 2 ? 'right' : 'other';\n }\n events.push({\n type,\n button,\n x,\n y,\n shift: (cb & 4) !== 0,\n alt: (cb & 8) !== 0,\n ctrl: (cb & 16) !== 0,\n drag,\n });\n }\n return events;\n}\n","import type { EventBus } from '@wrongstack/core';\n\n/**\n * Animated terminal/tab title for the TUI.\n *\n * Writes an OSC-0 sequence (`ESC ] 0 ; <text> BEL`) — an out-of-band terminal\n * command that sets the window/tab title without touching the screen, so it\n * never corrupts Ink's render. The title animates: a braille spinner plus a\n * live status derived from the agent's EventBus (thinking / running a tool),\n * and a gentle scrolling marquee when idle. Reset to a static title on stop.\n *\n * Disable with WRONGSTACK_NO_TITLE=1.\n */\n\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\nconst setTitle = (s: string): string => `\\x1b]0;${s}\\x07`;\n\n/** A marquee window over `text`, advancing by `offset`. */\nfunction marquee(text: string, offset: number, width: number): string {\n const padded = `${text} `;\n const start = offset % padded.length;\n return (padded + padded).slice(start, start + width);\n}\n\nexport interface TerminalTitleOptions {\n stdout: NodeJS.WriteStream;\n events: EventBus;\n model?: string;\n appName?: string;\n intervalMs?: number;\n /** ms of silence before the title falls back to the idle marquee. */\n idleAfterMs?: number;\n}\n\nexport function startTerminalTitle(opts: TerminalTitleOptions): () => void {\n const { stdout, events } = opts;\n if (process.env['WRONGSTACK_NO_TITLE'] === '1' || !stdout.isTTY) {\n return () => {};\n }\n\n const app = opts.appName ?? 'WrongStack';\n const idleAfter = opts.idleAfterMs ?? 3500;\n const suffix = ` · ${app}`;\n\n let frame = 0;\n let scroll = 0;\n let phase: 'idle' | 'thinking' | 'tool' = 'idle';\n let toolName = '';\n let lastActivity = 0; // 0 → never active yet, start idle\n\n const touch = (next: 'thinking' | 'tool', tool?: string) => {\n phase = next;\n if (tool) toolName = tool;\n lastActivity = Date.now();\n };\n\n const offs: Array<() => void> = [\n events.on('iteration.started', () => touch('thinking')),\n events.on('provider.text_delta', () => touch('thinking')),\n events.on('provider.thinking_delta', () => touch('thinking')),\n events.on('tool.started', (e) => touch('tool', (e as { name?: string }).name ?? 'tool')),\n events.on('tool.executed', () => touch('thinking')),\n ];\n\n const write = (s: string) => {\n try {\n stdout.write(s);\n } catch {\n /* stdout closed during shutdown */\n }\n };\n\n const timer = setInterval(() => {\n frame = (frame + 1) % SPINNER.length;\n scroll += 1;\n if (lastActivity && Date.now() - lastActivity > idleAfter) phase = 'idle';\n\n const sp = SPINNER[frame];\n let title: string;\n if (phase === 'tool') {\n title = `${sp} ▸ ${toolName}${suffix}`;\n } else if (phase === 'thinking') {\n title = `${sp} thinking…${suffix}`;\n } else {\n // Idle: scroll the app name + model so the tab still feels alive.\n title = marquee(`✦ ${app}${suffix}`, scroll >> 1, 22);\n }\n write(setTitle(title));\n }, opts.intervalMs ?? 130);\n // Don't keep the event loop alive just for the title animation.\n timer.unref?.();\n\n return () => {\n clearInterval(timer);\n for (const off of offs) off();\n write(setTitle(app));\n };\n}\n","import { Readable } from 'node:stream';\nimport type {\n Agent,\n AttachmentStore,\n Director,\n EventBus,\n QueueStore,\n SlashCommandRegistry,\n TokenCounter,\n} from '@wrongstack/core';\nimport { writeErr } from '@wrongstack/core';\nimport type { VisionAdapters } from '@wrongstack/runtime/vision';\nimport { render } from 'ink';\nimport React from 'react';\nimport { App } from './app.js';\nimport { type MouseEvent, parseSgrMouse, stripSgrMouse } from './mouse.js';\nimport { startTerminalTitle } from './terminal-title.js';\n\nexport type SerialAutonomyStage =\n | { phase: 'idle' }\n | { phase: 'decide'; reason: string }\n | { phase: 'execute'; task: string }\n | { phase: 'reflect'; status: 'success' | 'failure' | 'aborted' | 'skipped'; note?: string }\n | { phase: 'sleep'; ms: number }\n | { phase: 'paused' }\n | { phase: 'stopped' }\n | { phase: 'error'; message: string };\n\nexport type ParallelAutonomyStage =\n | { phase: 'idle' }\n | { phase: 'decompose' }\n | { phase: 'fanout'; slots: number }\n | { phase: 'await'; taskIds: string[] }\n | { phase: 'aggregate'; successCount: number; total: number; goalComplete: boolean }\n | { phase: 'sleep'; ms: number }\n | { phase: 'stopped' }\n | { phase: 'error'; message: string };\n\nexport type AutonomyStage = SerialAutonomyStage | ParallelAutonomyStage;\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 /**\n * Subscribe to per-iteration stage transitions from the autonomy engines.\n * TUI uses this to render live status in the status bar.\n */\n subscribeEternalStage?: (fn: (stage: AutonomyStage) => void) => () => 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 /** Apply an autonomy mode after the picker confirms. Returns an error string on failure. */\n switchAutonomy?: (\n mode: 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel',\n ) => 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 /** Absolute project root for goal.json loading. */\n projectRoot?: string;\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 * Enable full mouse support: clickable list items in menus/pickers and\n * in-app mouse-wheel scrolling of the chat history. Opt-in (default false)\n * because enabling terminal mouse tracking disables the terminal's own\n * wheel-scroll and text-selection/copy. When true this FORCES alt-screen\n * on (the app must own the screen to render its scroll viewport).\n */\n mouse?: 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: (\n items: Array<'todos' | 'plan' | 'fleet' | 'git' | 'elapsed' | 'context' | 'cost'>,\n ) => void;\n /**\n * Controller for the agents monitor overlay. App installs a dispatch-backed\n * setter on mount so the `/agents on|off` slash command can toggle the\n * overlay without a round-trip.\n */\n agentsMonitorController?: {\n visible: boolean;\n setVisible: (visible: boolean) => void;\n };\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 * Subscribe to AutoPhase phase/graph events from the PhaseOrchestrator.\n * Returns an unsubscribe function. The TUI uses this to drive the\n * PhaseMonitor and PhasePanel live views via dispatch actions.\n */\n subscribeAutoPhase?: (handler: (event: string, payload: unknown) => void) => () => void;\n /**\n * Read the persisted autonomy settings (defaultMode, autoProceedDelayMs).\n * Used by the SettingsPicker in the TUI on mount and after Ctrl+S toggle.\n */\n getSettings?: () => { mode: 'off' | 'suggest' | 'auto'; delayMs: number };\n /**\n * Persist autonomy settings changes. Returns null on success, or an\n * error string on failure (so the TUI can display it as a hint).\n */\n saveSettings?: (s: { mode: 'off' | 'suggest' | 'auto'; delayMs: number }) =>\n | string\n | null\n | Promise<string | null>;\n /**\n * Predict likely next steps after a completed turn. The CLI wires this from\n * the session provider and the `/next` toggle; it returns [] when prediction\n * is disabled or autonomy isn't 'off'. Display-only — never executed.\n */\n predictNext?: (input: {\n userRequest: string;\n assistantSummary: string;\n }) => 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\n// Mouse tracking: DECSET 1000 (button press/release) + 1002 (button-event\n// tracking: motion reported only WHILE a button is held) + 1006 (SGR extended\n// coordinates, so columns/rows beyond 223 are reported as decimal). Enabling\n// these takes the mouse away from the terminal's native wheel-scroll and\n// text-selection — which is why mouse mode is opt-in and forces alt-screen so\n// the app owns the screen and can render its own scroll viewport. 1002 (not\n// 1003 any-motion) keeps idle moves quiet while still enabling scrollbar\n// thumb drags; the SGR parser flags held-motion via the drag bit.\nconst MOUSE_ON = '\\x1b[?1000h\\x1b[?1002h\\x1b[?1006h';\nconst MOUSE_OFF = '\\x1b[?1006l\\x1b[?1002l\\x1b[?1000l';\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 writeErr(\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 useMouse = opts.mouse === true;\n // Mouse mode forces alt-screen: in-app scroll needs the app to own the\n // whole screen (no native-scrollback leak), which is exactly what\n // alt-screen guarantees.\n const useAltScreen = opts.altScreen === true || useMouse;\n if (useAltScreen) {\n stdout.write(ALT_SCREEN_ON);\n stdout.write(CURSOR_HOME);\n }\n stdout.write(BRACKETED_PASTE_ON);\n if (useMouse) {\n stdout.write(MOUSE_ON);\n }\n\n // When mouse mode is on we intercept stdin: the real TTY is consumed here,\n // SGR mouse sequences are decoded and fanned out to subscribers, and only\n // the remaining keyboard bytes are forwarded to a PassThrough that Ink\n // reads instead of process.stdin. This keeps mouse bytes from ever\n // polluting Ink's keypress parser (which would otherwise insert `<0;..M`\n // junk into the input). When mouse mode is off, Ink reads process.stdin\n // directly and nothing below runs — zero behavior change for the default.\n const mouseListeners = new Set<(ev: MouseEvent) => void>();\n let inkStdin: NodeJS.ReadStream = stdin;\n let detachMouse: (() => void) | null = null;\n if (useMouse) {\n /**\n * Keyboard-only readable stream that fans out SGR mouse bytes to subscribers\n * and forwards the remaining keyboard bytes to Ink's stdin.\n *\n * PassThrough was tried first but its _read(0) override destabilises the\n * internal `needReadable` state machine: _read(0) calls this.read(0) which\n * returns null when the buffer is empty, preventing PassThrough from ever\n * emitting the 'readable' event that Ink's handleReadable waits on — classic\n * deadlock (mouse AND keyboard freeze). A minimal custom Readable avoids\n * this by properly implementing _read() to NEVER block — it just returns\n * and lets push() from the stdin data handler signal availability.\n */\n class KeyboardReadable extends Readable {\n private pendingChunks: string[] = [];\n\n // eslint-disable-next-line no-useless-constructor\n constructor() {\n super({ encoding: 'utf8', highWaterMark: 64 * 1024 }); // 64KB buffer\n }\n\n override _read(_size: number): void {\n // Pull any pending chunks through. This is called when the buffer is\n // drained enough to drop below the high-water mark. We don't block —\n // we push whatever we have (which may be nothing if stdin hasn't\n // delivered yet). The 'readable' event will fire when push() adds\n // data to an empty buffer.\n void _size;\n this.flushPending();\n }\n\n private flushPending(): void {\n while (this.pendingChunks.length > 0) {\n const chunk = this.pendingChunks[0]!;\n const ok = this.push(chunk);\n this.pendingChunks.shift();\n if (!ok) {\n // Buffer is full again — stop flushing, wait for _read to be\n // called when the buffer drains. Store remaining chunks.\n break;\n }\n }\n }\n\n /** Called by the stdin data handler when keyboard bytes are available. */\n doPush(chunk: string): void {\n if (chunk.length === 0) return;\n // push() returns false when the internal buffer exceeds high-water mark.\n // When that happens, queue the chunk so it's not lost. The _read()\n // method will drain the queue when the buffer drains.\n const ok = this.push(chunk);\n if (ok) {\n // Successfully buffered — if we had pending chunks, try to flush more.\n if (this.pendingChunks.length > 0) {\n this.flushPending();\n }\n } else {\n // Buffer full — queue for when _read is called after buffer drains.\n // Cap the queue to prevent unbounded memory growth (drop oldest if needed).\n if (this.pendingChunks.length >= 100) {\n this.pendingChunks.shift(); // drop oldest\n }\n this.pendingChunks.push(chunk);\n }\n }\n\n /** Called on shutdown so the stream closes cleanly. */\n doEnd(): void {\n this.pendingChunks = [];\n this.push(null); // null = EOF\n }\n }\n const keyboardStream = new KeyboardReadable();\n const p = keyboardStream as unknown as NodeJS.ReadStream;\n // Ink probes isTTY and drives raw mode / ref bookkeeping on its stdin;\n // delegate those to the real terminal so its behavior is unchanged.\n p.isTTY = true;\n p.setRawMode = (mode: boolean): NodeJS.ReadStream => {\n try {\n stdin.setRawMode?.(mode);\n } catch {\n // real stdin may not support raw mode in some shells — ignore.\n }\n return p;\n };\n const realRef = stdin.ref?.bind(stdin);\n const realUnref = stdin.unref?.bind(stdin);\n p.ref = (): NodeJS.ReadStream => {\n realRef?.();\n return p;\n };\n p.unref = (): NodeJS.ReadStream => {\n realUnref?.();\n return p;\n };\n stdin.setEncoding('utf8');\n const onData = (chunk: string) => {\n const evs = parseSgrMouse(chunk);\n for (const ev of evs) {\n for (const fn of mouseListeners) {\n try {\n fn(ev);\n } catch {\n // a listener throwing must not break input routing — ignore.\n }\n }\n }\n const rest = stripSgrMouse(chunk);\n keyboardStream.doPush(rest);\n };\n stdin.on('data', onData);\n detachMouse = () => {\n stdin.off('data', onData);\n keyboardStream.doEnd();\n };\n inkStdin = p;\n }\n const subscribeMouse = useMouse\n ? (fn: (ev: MouseEvent) => void): (() => void) => {\n mouseListeners.add(fn);\n return () => {\n mouseListeners.delete(fn);\n };\n }\n : undefined;\n\n // Animated window/tab title: a braille spinner + live status (thinking /\n // running a tool) driven by the EventBus, scrolling the app name when idle.\n // Out-of-band OSC sequence, so it never touches Ink's render. Reset on\n // cleanup(). Self-disables on a non-TTY or WRONGSTACK_NO_TITLE=1.\n const stopTitle = startTerminalTitle({ stdout, events: opts.events, model: opts.model });\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 stopTitle();\n } catch {\n // title controller already torn down — ignore.\n }\n try {\n detachMouse?.();\n } catch {\n // listener already detached — ignore.\n }\n try {\n stdout.write(BRACKETED_PASTE_OFF);\n // Mouse off before alt-screen off: disable tracking while we still own\n // the screen, then restore the user's previous terminal contents.\n if (useMouse) {\n stdout.write(MOUSE_OFF);\n }\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 subscribeEternalStage: opts.subscribeEternalStage,\n subscribeAutoPhase: opts.subscribeAutoPhase,\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 switchAutonomy: opts.switchAutonomy,\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 agentsMonitorController: opts.agentsMonitorController,\n initialGoal: opts.initialGoal,\n initialAsk: opts.initialAsk,\n getSDDContext: opts.getSDDContext,\n onSDDOutput: opts.onSDDOutput,\n sessionsDir: opts.sessionsDir,\n projectRoot: opts.projectRoot,\n getSettings: opts.getSettings,\n saveSettings: opts.saveSettings,\n predictNext: opts.predictNext,\n mouse: useMouse,\n subscribeMouse,\n // Managed viewport (in-app scroll + collapsibility) follows\n // alt-screen: it owns the screen, so there's no native-scrollback\n // leak. Decoupled from mouse so --alt-screen alone gets it.\n managed: useAltScreen,\n }),\n { exitOnCtrlC: false, stdin: inkStdin },\n );\n } catch (err) {\n writeErr(\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.\n // Do NOT prefix with \\x1b[H: homing to (0,0) erases the visible\n // committed output and repositions the live region (input + status\n // bar) at the top of the viewport instead of the bottom.\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/theme.ts","../src/components/status-bar.tsx","../src/components/fleet-monitor.tsx","../src/components/agents-monitor.tsx","../src/components/autonomy-picker.tsx","../src/components/brain-decision-prompt.tsx","../src/components/checkpoint-timeline.tsx","../src/components/confirm-prompt.tsx","../src/components/file-picker.tsx","../src/components/fleet-panel.tsx","../src/components/help-overlay.tsx","../src/highlight.ts","../src/markdown-table.ts","../src/markdown.tsx","../src/components/history.tsx","../src/fn-keys.ts","../src/input-tokens.ts","../src/components/input.tsx","../src/components/key-hint-bar.tsx","../src/components/live-activity-strip.tsx","../src/components/model-picker.tsx","../src/components/phase-monitor.tsx","../src/components/phase-panel.tsx","../src/components/scrollable-history.tsx","../src/components/settings-picker.tsx","../src/components/slash-menu.tsx","../src/components/worktree-monitor.tsx","../src/components/worktree-panel.tsx","../src/file-search.ts","../src/git-info.ts","../src/kill-slash.ts","../src/paste-accumulator.ts","../src/ps-slash.ts","../src/queue-slash.ts","../src/app.tsx","../src/mouse.ts","../src/terminal-title.ts","../src/run-tui.ts"],"names":["cache","s","jsxs","Box","jsx","Text","Fragment","STATUS","fmtTokens","oneLine","useInput","React","input","path","useStdout","useState","useEffect","sep","ToolStreamBox","Entry","fmtTok","riskColor","snippet","renderRow","fmtElapsed","fmtBytes","LiveActivityStrip","st","fs","renderList","getProcessRegistry","USAGE","parts","base","next","useRef","measureElement","firstItemRow","index","writeOut","maxContext","dispatch","killed","buffer","cursor","blocks"],"mappings":"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","file":"index.js","sourcesContent":["// Central TUI palette. Until now colors were hardcoded as Ink color names\n// (`color=\"cyan\"`, `borderColor=\"magenta\"`, …) scattered across ~18\n// components, so there was no single place to tune the look. This module is\n// that place: semantic tokens whose *values* are the Ink color names already\n// in use, so adopting it is a pure rename with zero visual change. Re-skinning\n// later is then a one-line edit here that propagates everywhere.\n//\n// Values are Ink color names (https://github.com/vadimdemedes/ink#color) — any\n// of the 16 ANSI names, `gray`, the *Bright variants, or a hex/rgb string.\n\nexport interface Theme {\n /** Primary accent — prompts, links, tool names, assistant label. */\n accent: string;\n /** USER: label + the user's own message text marker. */\n user: string;\n /** ASSISTANT: label. */\n assistant: string;\n /** Tool name / tool activity. */\n tool: string;\n /** Success states (✓, passing, added diff lines). */\n success: string;\n /** Warnings, queued items, the user-input label. */\n warn: string;\n /** Errors, failures, deleted diff lines, danger chips. */\n error: string;\n /** Muted/secondary text. `true` maps to Ink's `dimColor`; a color name also works. */\n dim: true | string;\n /** Default (quiet) border color for panels. */\n borderDefault: string;\n /** Active/attention border (confirm prompts, focused frames). */\n borderActive: string;\n /** Banner / brand accent. */\n brand: string;\n /** Per-monitor accent borders so each overlay has a distinct identity. */\n monitor: {\n fleet: string;\n agents: string;\n worktree: string;\n phase: string;\n };\n /** Diff add/delete background blocks (content highlight). */\n diffAddBg: string;\n diffDelBg: string;\n}\n\n// Single tuned dark palette. The values intentionally mirror the colors already\n// hardcoded today (cyan/yellow/green/red/magenta), so the first adoption pass is\n// visually identical. A second palette can be added later as a drop-in; we keep\n// the shape (a `Theme`) ready for that without paying the tuning cost now.\nexport const theme: Theme = Object.freeze({\n accent: 'cyan',\n user: 'yellow',\n assistant: 'cyan',\n tool: 'cyan',\n success: 'green',\n warn: 'yellow',\n error: 'red',\n dim: true,\n borderDefault: 'gray',\n borderActive: 'yellow',\n brand: 'magenta',\n monitor: {\n fleet: 'cyan',\n agents: 'magenta',\n worktree: 'green',\n phase: 'cyan',\n },\n diffAddBg: 'greenBright',\n diffDelBg: 'redBright',\n});\n","import type { TokenCounter } from '@wrongstack/core';\nimport { Box, Text, useStdout } from 'ink';\nimport type React from 'react';\nimport { useEffect, useState } from 'react';\nimport type { GitInfo } from '../git-info.js';\nimport { theme } from '../theme.js';\n\n/** Minimum terminal width before we switch to ultra-compact mode. */\nconst COMPACT_THRESHOLD = 50;\n/** Above this width, show most available information. */\nconst COMFORTABLE_THRESHOLD = 90;\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 /** Current/last tool the subagent invoked, shown as its live action. */\n tool?: string;\n /** Cumulative budget auto-extensions granted — rendered as \"⚡×N\". */\n extensions?: number;\n}\n\nexport interface BrainStatusChip {\n state: 'idle' | 'deciding' | 'answered' | 'ask_human' | 'denied';\n source?: string;\n risk?: 'low' | 'medium' | 'high' | 'critical';\n summary?: string;\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\ntype SerialAutonomyStage =\n | { phase: 'idle' }\n | { phase: 'decide'; reason: string }\n | { phase: 'execute'; task: string }\n | { phase: 'reflect'; status: 'success' | 'failure' | 'aborted' | 'skipped'; note?: string }\n | { phase: 'sleep'; ms: number }\n | { phase: 'paused' }\n | { phase: 'stopped' }\n | { phase: 'error'; message: string };\n\ntype ParallelAutonomyStage =\n | { phase: 'idle' }\n | { phase: 'decompose' }\n | { phase: 'fanout'; slots: number }\n | { phase: 'await'; taskIds: string[] }\n | { phase: 'aggregate'; successCount: number; total: number; goalComplete: boolean }\n | { phase: 'sleep'; ms: number }\n | { phase: 'stopped' }\n | { phase: 'error'; message: string };\n\ntype AutonomyStage = SerialAutonomyStage | ParallelAutonomyStage;\n\nexport interface StatusBarProps {\n model: string;\n /**\n * App version string (e.g. \"0.7.0\"). When set, renders a compact\n * `WS v0.7.0` chip at the head of line 1 so the running build is always\n * visible, not just in the startup banner.\n */\n version?: 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 /** Live Brain arbiter state, shown as a compact work chip when active/recent. */\n brain?: BrainStatusChip;\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 * Live iteration stage from the active autonomy engine. When set, renders\n * a chip like `⏸ decide` or `▶ execute(todo:fix-auth)` next to the\n * autonomy chip on line 2.\n */\n eternalStage?: AutonomyStage | null;\n /** Active goal summary for startup banner display. */\n goalSummary?: {\n goal: string;\n goalState: 'active' | 'paused' | 'completed' | 'abandoned';\n iterations: number;\n lastTask?: string;\n lastStatus?: string;\n } | null;\n /**\n * Seconds remaining in the auto-proceed countdown. null = not counting.\n * Rendered as a chip on line 2 when non-null.\n */\n autoProceedCountdown?: number | null;\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 version,\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 brain,\n projectName,\n processCount,\n hiddenItems,\n eternalStage,\n goalSummary,\n}: StatusBarProps): React.ReactElement {\n // Track terminal width so we can adapt layout on narrow terminals.\n // We snapshot into state so that renders are stable — we don't want\n // the live-region to churn on every resize event during active streaming.\n const { stdout } = useStdout();\n const [termWidth, setTermWidth] = useState(stdout?.columns ?? 90);\n useEffect(() => {\n const handleResize = () => setTermWidth(stdout?.columns ?? 90);\n handleResize(); // snapshot immediately\n process.stdout.on('resize', handleResize);\n return () => {\n process.stdout.off('resize', handleResize);\n };\n }, [stdout]);\n\n const isCompact = termWidth < COMPACT_THRESHOLD;\n const isComfortable = termWidth >= COMFORTABLE_THRESHOLD;\n const hiddenSet = new Set(hiddenItems);\n const usage = tokenCounter?.total();\n const cost = tokenCounter?.estimateCost();\n const cache = tokenCounter?.cacheStats();\n const { label: stateLabel, color: stateColor } = stateChip(state, fleet?.running ?? 0);\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 (goalSummary !== null && goalSummary !== undefined);\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 && (fleet.running > 0 || fleet.idle > 0 || fleet.pending > 0 || fleet.completed > 0)) ||\n subagentCount > 0;\n const hasBrainActivity = !!brain && brain.state !== 'idle';\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 hasBrainActivity;\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 {/* Line 1: Essential runtime info. Compact mode shows only state + model. */}\n <Box flexDirection=\"row\" gap={2}>\n {isCompact ? (\n // Ultra-compact: state · model\n <>\n <Text color={stateColor}>●{stateLabel}</Text>\n <Text dimColor>·</Text>\n <Text color=\"magenta\">{model}</Text>\n </>\n ) : (\n // Full mode: version · state · model · context · tokens · cost · queue · processes · hint\n <>\n {version ? (\n <>\n <Text>\n <Text color=\"blue\" bold>\n WS\n </Text>\n <Text dimColor> v{version}</Text>\n </Text>\n <Text dimColor>│</Text>\n </>\n ) : null}\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 && isComfortable ? (\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 && isComfortable ? (\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\">\n ⚡ {processCount} process{processCount === 1 ? '' : 'es'}\n </Text>\n </>\n ) : null}\n {hint ? (\n <>\n <Text dimColor>│</Text>\n <Text dimColor>{hint}</Text>\n </>\n ) : null}\n </>\n )}\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={autonomy === 'eternal' ? 'red' : autonomy === 'auto' ? 'yellow' : 'cyan'}\n bold\n >\n ∞ {autonomy.toUpperCase()}\n </Text>\n </>\n ) : null}\n {eternalStage ? (\n <>\n {yolo || (autonomy && autonomy !== 'off') ? <Text dimColor>│</Text> : null}\n <EternalStageChip stage={eternalStage} />\n </>\n ) : null}\n {elapsedMs !== undefined && !hiddenSet.has('elapsed') ? (\n <>\n {yolo || (autonomy && autonomy !== 'off') || eternalStage ? (\n <Text dimColor>│</Text>\n ) : 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 {goalSummary ? (\n <>\n {yolo || elapsedMs !== undefined || projectName ? <Text dimColor>│</Text> : null}\n <Text\n color={\n goalSummary.goalState === 'active'\n ? 'green'\n : goalSummary.goalState === 'paused'\n ? 'yellow'\n : goalSummary.goalState === 'completed'\n ? 'green'\n : 'dim'\n }\n >\n 🎯{' '}\n {goalSummary.goal.length > 40\n ? `${goalSummary.goal.slice(0, 37)}…`\n : goalSummary.goal}{' '}\n [{goalSummary.goalState}] (iter {goalSummary.iterations})\n </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 {hasBrainActivity && brain ? (\n <>\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 <Text dimColor>│</Text>\n ) : null}\n <BrainChip brain={brain} />\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 {a.tool ? (\n <>\n <Text dimColor>{' · '}</Text>\n <Text color=\"cyan\">{a.tool}</Text>\n </>\n ) : null}\n {a.extensions && a.extensions > 0 ? (\n <>\n <Text dimColor>{' · '}</Text>\n <Text color=\"yellow\">⚡×{a.extensions}</Text>\n </>\n ) : null}\n </Text>\n ))}\n </Box>\n ) : null}\n </Box>\n );\n}\n\nfunction BrainChip({ brain }: { brain: BrainStatusChip }): React.ReactElement {\n const color =\n brain.state === 'denied'\n ? 'red'\n : brain.state === 'ask_human'\n ? 'yellow'\n : brain.state === 'deciding'\n ? 'magenta'\n : 'cyan';\n const label =\n brain.state === 'deciding' ? 'deciding' : brain.state === 'ask_human' ? 'human' : brain.state;\n const scope = brain.source ? ` ${brain.source}` : '';\n const summary = brain.summary ? ` · ${brain.summary.slice(0, 40)}` : '';\n return (\n <Text color={color}>\n 🧠 {label}\n <Text dimColor>{scope}</Text>\n <Text dimColor>{summary}</Text>\n </Text>\n );\n}\n\nfunction EternalStageChip({\n stage,\n}: {\n stage: NonNullable<StatusBarProps['eternalStage']>;\n}): React.ReactElement {\n switch (stage.phase) {\n case 'idle':\n return <Text dimColor>⬜ idle</Text>;\n case 'decide':\n return <Text color=\"cyan\">⬇ decide: {stage.reason}</Text>;\n case 'execute':\n return (\n <Text color=\"green\">\n ▶ <Text bold>execute</Text>\n {stage.task ? `(${stage.task})` : ''}\n </Text>\n );\n case 'reflect':\n return (\n <Text\n color={\n stage.status === 'success' ? 'green' : stage.status === 'failure' ? 'red' : 'yellow'\n }\n >\n ↩ reflect: {stage.status}\n </Text>\n );\n case 'decompose':\n return <Text color=\"cyan\">⬇ decompose</Text>;\n case 'fanout':\n return <Text color=\"magenta\">⇄ fanout: {stage.slots}</Text>;\n case 'await':\n return <Text color=\"magenta\">⏳ await: {stage.taskIds.length}</Text>;\n case 'aggregate':\n return (\n <Text color={stage.goalComplete ? 'green' : 'magenta'}>\n ↩ aggregate: {stage.successCount}/{stage.total}\n </Text>\n );\n case 'sleep':\n return <Text dimColor>💤 sleep {Math.round(stage.ms / 1000)}s</Text>;\n case 'paused':\n return <Text color=\"yellow\">⏸ paused</Text>;\n case 'stopped':\n return <Text dimColor>■ stopped</Text>;\n case 'error':\n return <Text color=\"red\">⚠ error: {stage.message}</Text>;\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 ? theme.error : ratio >= 0.65 ? theme.warn : theme.accent;\n return (\n <Text>\n <Text dimColor>ctx </Text>\n <Text color={color}>{renderMeter(ratio, 12)}</Text>\n <Text color={color} bold>\n {' '}\n {pct}%\n </Text>\n <Text dimColor>\n {' '}\n {fmtTok(ctx.used)}/{fmtTok(ctx.max)}\n </Text>\n </Text>\n );\n}\n\n/**\n * Compute the leading state chip (label + Ink color) for the status bar.\n *\n * The foreground loop reports 'idle' between turns, but background subagents\n * can still be running — e.g. between eternal/parallel autonomy iterations,\n * or a fleet spawned outside a foreground run. Showing plain \"idle\" then is\n * misleading, so when `fleetRunning > 0` and the foreground is idle we surface\n * the live agent count (`agents ▶N`) in a distinct color instead.\n */\n// Layout constants shared by the status-bar span helpers below — they MUST\n// mirror the `<Box gap={2} paddingX={1}>` rows rendered above so the TUI mouse\n// hit-test lands on the right chip.\nconst SB_GAP = 2;\nconst SB_PADX = 1;\n\n/**\n * 0-based column span (offset from the box's left edge, including the left\n * paddingX) of the `{provider}/{model}` chip on status-bar line 1. The TUI\n * mouse handler uses it to make the model chip clickable (→ open model\n * picker). Mirrors the line-1 flex layout: optional `WS v…` chip + `│`, then\n * `● {stateLabel}` + `│`, then the model.\n */\nexport function statusBarModelSpan(opts: {\n version?: string;\n state: 'idle' | 'running' | 'streaming' | 'aborting';\n fleetRunning?: number;\n model: string;\n}): { start: number; len: number } {\n let col = SB_PADX;\n if (opts.version) {\n col += `WS v${opts.version}`.length + SB_GAP; // WS chip\n col += 1 + SB_GAP; // │ separator\n }\n const { label } = stateChip(opts.state, opts.fleetRunning ?? 0);\n col += 2 + label.length + SB_GAP; // \"● \" + label\n col += 1 + SB_GAP; // │ separator\n return { start: col, len: opts.model.length };\n}\n\n/**\n * 0-based column span of the `∞ MODE` autonomy chip on status-bar line 2, or\n * null when it isn't shown (autonomy off/unset). When YOLO is on it precedes\n * the autonomy chip (plus a `│` separator), so the span shifts right.\n */\nexport function statusBarAutonomySpan(opts: {\n yolo?: boolean;\n autonomy?: 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel';\n}): { start: number; len: number } | null {\n if (!opts.autonomy || opts.autonomy === 'off') return null;\n let col = SB_PADX;\n if (opts.yolo) {\n col += '⚠ YOLO'.length + SB_GAP;\n col += 1 + SB_GAP; // │ separator\n }\n return { start: col, len: 2 + opts.autonomy.toUpperCase().length }; // \"∞ \" + MODE\n}\n\nexport function stateChip(\n state: 'idle' | 'running' | 'streaming' | 'aborting',\n fleetRunning: number,\n): { label: string; color: string } {\n if (state === 'idle' && fleetRunning > 0) {\n return { label: `agents ▶${fleetRunning}`, color: 'magenta' };\n }\n if (state === 'idle') return { label: 'idle', color: 'cyan' };\n if (state === 'aborting') return { label: 'aborting…', color: 'yellow' };\n return { label: 'thinking…', color: 'green' };\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\n// Sub-cell-precise meter: each cell is 1/8 resolution via Unicode block\n// fractions, so the bar grows smoothly token-by-token instead of jumping a\n// whole cell. Empty track stays '░'. Total width is always `width` chars.\nconst EIGHTHS = ['', '▏', '▎', '▍', '▌', '▋', '▊', '▉'];\n\nexport function renderMeter(ratio: number, width: number): string {\n const clamped = Math.max(0, Math.min(1, ratio));\n let remaining = Math.round(clamped * width * 8);\n let out = '';\n for (let i = 0; i < width; i++) {\n if (remaining >= 8) {\n out += FILLED;\n remaining -= 8;\n } else if (remaining > 0) {\n out += EIGHTHS[remaining];\n remaining = 0;\n } else {\n out += EMPTY;\n }\n }\n return out;\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 { Box, Text } from 'ink';\nimport type React from 'react';\nimport type { FleetEntry } from '../app.js';\nimport { fmtElapsed, renderProgress } from './status-bar.js';\n\nexport interface FleetMonitorProps {\n entries: Record<string, FleetEntry>;\n /** Fleet-wide accumulated cost. */\n totalCost: number;\n /** Fleet-wide token totals, when available. */\n totalTokens?: { input: number; output: number };\n /** Concurrency ceiling for the gauge. */\n maxConcurrent?: number;\n /** 1s clock tick so elapsed times + sparklines stay live. */\n nowTick: number;\n /** Active or completed collaborative debugging session. */\n collabSession?: {\n sessionId: string | null;\n bugCount: number;\n planCount: number;\n evalCount: number;\n overallVerdict: 'approve' | 'needs_revision' | 'reject' | null;\n timeline: Array<{ at: number; icon: string; color: string; text: string }>;\n startedAt: number | null;\n } | null;\n}\n\nconst STATUS: Record<FleetEntry['status'], { icon: string; color: string }> = {\n idle: { icon: '○', color: 'gray' },\n running: { icon: '▶', color: 'yellow' },\n success: { icon: '✓', color: 'green' },\n failed: { icon: '✗', color: 'red' },\n timeout: { icon: '⏱', color: 'yellow' },\n stopped: { icon: '⊘', color: 'gray' },\n};\n\nconst SPARK = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];\n\n/**\n * Bucket recent tool executions into a fixed number of time bins ending at\n * `now`, returning a per-bin count. Drives the per-agent activity sparkline\n * in the Agents (live) monitor; exported here because it was historically\n * defined alongside the fleet monitor.\n */\nexport function bucketActivity(\n recentTools: ReadonlyArray<{ at: number }>,\n now: number,\n bins = 12,\n binMs = 2000,\n): number[] {\n const out = new Array<number>(bins).fill(0);\n const windowStart = now - bins * binMs;\n for (const t of recentTools) {\n if (t.at < windowStart || t.at > now) continue;\n let idx = Math.floor((t.at - windowStart) / binMs);\n if (idx < 0) idx = 0;\n if (idx >= bins) idx = bins - 1;\n out[idx]!++;\n }\n return out;\n}\n\n/** Render a numeric series as a unicode sparkline. */\nexport function sparkline(values: number[]): string {\n if (values.length === 0) return '';\n const max = Math.max(1, ...values);\n return values\n .map((v) => {\n if (v <= 0) return SPARK[0];\n const idx = Math.min(SPARK.length - 1, Math.ceil((v / max) * (SPARK.length - 1)));\n return SPARK[idx];\n })\n .join('');\n}\n\nfunction fmtTokens(n: number): string {\n if (n < 1000) return String(n);\n if (n < 1_000_000) return `${(n / 1000).toFixed(1)}k`;\n return `${(n / 1_000_000).toFixed(1)}M`;\n}\n\nfunction fmtCost(n: number): string {\n if (n === 0) return '—';\n return `$${n.toFixed(3)}`;\n}\n\n/**\n * Compact `provider:model` label for the monitors. Strips any `provider/`\n * prefix from the model id and keeps it terminal-friendly. Returns '' when\n * neither is known (e.g. a leader entry before the first request resolves).\n * Shared by the Agents (Ctrl+G) and Fleet (Ctrl+F) monitors.\n */\nexport function fmtModelLabel(provider?: string, model?: string): string {\n if (!model && !provider) return '';\n const short = model\n ? model.includes('/')\n ? model.slice(model.lastIndexOf('/') + 1)\n : model\n : '?';\n return provider ? `${provider}:${short}` : short;\n}\n\n/**\n * Fleet orchestration dashboard (Ctrl+F). Concurrency gauge, fleet totals,\n * a compact one-line-per-agent table, and a recent-events timeline. Live\n * per-agent context (current tool / streaming tail) lives in the Agents\n * monitor (Ctrl+G) — this view is for \"how the fleet is doing overall\".\n */\nexport function FleetMonitor({\n entries,\n totalCost,\n totalTokens,\n maxConcurrent = 4,\n nowTick,\n collabSession,\n}: FleetMonitorProps): React.ReactElement {\n const all = Object.values(entries);\n const running = all.filter((e) => e.status === 'running');\n const idle = all.filter((e) => e.status === 'idle').length;\n const done = all.filter((e) => e.status === 'success').length;\n const failed = all.filter((e) => e.status === 'failed' || e.status === 'timeout').length;\n\n const concurrencyRatio = maxConcurrent > 0 ? running.length / maxConcurrent : 0;\n\n // Sort: running → idle → recently-finished (newest first).\n const ordered = [...all].sort((a, b) => {\n const ra = a.status === 'running' ? 0 : a.status === 'idle' ? 1 : 2;\n const rb = b.status === 'running' ? 0 : b.status === 'idle' ? 1 : 2;\n if (ra !== rb) return ra - rb;\n if (ra === 2) return b.lastEventAt - a.lastEventAt;\n return a.startedAt - b.startedAt;\n });\n const shown = ordered.slice(0, 12);\n const overflow = all.length - shown.length;\n\n // Timeline: spawn + terminal-status events across all agents + collab session events, newest first.\n const events: Array<{ at: number; icon: string; color: string; text: string }> = [];\n for (const e of all) {\n events.push({ at: e.startedAt, icon: '●', color: 'cyan', text: `${e.name} spawned` });\n if (e.status !== 'running' && e.status !== 'idle') {\n const s = STATUS[e.status];\n const reason = e.failureReason ? ` [${e.failureReason}]` : '';\n events.push({\n at: e.lastEventAt,\n icon: s.icon,\n color: s.color,\n text: `${e.name} ${e.status} (${e.toolCalls}t)${reason}`,\n });\n }\n if (e.budgetWarning) {\n events.push({\n at: e.budgetWarning.at,\n icon: '⚡',\n color: 'yellow',\n text: `${e.name} ${e.budgetWarning.kind} ${e.budgetWarning.used}/${e.budgetWarning.limit} — extending`,\n });\n }\n }\n events.sort((a, b) => b.at - a.at);\n const timeline = events.slice(0, 20);\n\n // Collab verdict chip color\n const VERDICT_COLOR: Record<string, string> = {\n approve: 'green',\n needs_revision: 'yellow',\n reject: 'red',\n };\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n {/* Header — orchestration identity, distinct from AGENTS · LIVE */}\n <Box flexDirection=\"row\" gap={1}>\n <Text bold color=\"cyan\">\n FLEET · ORCHESTRATION\n </Text>\n <Text dimColor>│</Text>\n <Text color=\"yellow\">▶{running.length}</Text>\n <Text dimColor>○{idle}</Text>\n <Text color=\"green\">✓{done}</Text>\n {failed > 0 ? <Text color=\"red\">✗{failed}</Text> : null}\n <Text dimColor>· Ctrl+F / F2 to close</Text>\n </Box>\n\n {/* Collab session banner — shown when a session is active or completed */}\n {collabSession ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"row\" gap={1}>\n <Text bold color=\"magenta\">\n ⚡ COLLAB SESSION\n </Text>\n {collabSession.sessionId ? (\n <Text dimColor>{collabSession.sessionId.slice(0, 8)}</Text>\n ) : null}\n <Text dimColor>│</Text>\n <Text color=\"red\">🐛{collabSession.bugCount}</Text>\n <Text dimColor>│</Text>\n <Text color=\"yellow\">📐{collabSession.planCount}</Text>\n <Text dimColor>│</Text>\n <Text color=\"blue\">⚖️{collabSession.evalCount}</Text>\n {collabSession.overallVerdict ? (\n <>\n <Text dimColor>│</Text>\n <Text bold color={VERDICT_COLOR[collabSession.overallVerdict]}>\n {collabSession.overallVerdict}\n </Text>\n </>\n ) : null}\n </Box>\n {/* Inline collab timeline — first 6 entries */}\n {collabSession.timeline.length > 0 ? (\n <Box flexDirection=\"column\" marginTop={0}>\n {collabSession.timeline.slice(0, 6).map((ev, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: timeline is rebuilt per render\n <Box key={i} flexDirection=\"row\" gap={1}>\n <Text dimColor>\n {`${fmtElapsed(Math.max(0, nowTick - ev.at))} ago`.padEnd(10)}\n </Text>\n <Text color={ev.color}>{ev.icon}</Text>\n <Text dimColor>{ev.text}</Text>\n </Box>\n ))}\n </Box>\n ) : null}\n </Box>\n ) : null}\n\n {/* Concurrency + totals gauge */}\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>concurrency</Text>\n <Text color=\"cyan\">[{renderProgress(concurrencyRatio, 12)}]</Text>\n <Text dimColor>\n {running.length}/{maxConcurrent}\n </Text>\n {totalTokens ? (\n <Text dimColor>\n {' '}\n {fmtTokens(totalTokens.input)}↑ {fmtTokens(totalTokens.output)}↓\n </Text>\n ) : null}\n <Text color=\"green\">{` $${totalCost.toFixed(3)}`}</Text>\n </Box>\n\n {shown.length === 0 ? (\n <Text dimColor>No subagents yet — spawn with /fleet spawn or /fleet dispatch.</Text>\n ) : null}\n\n {/* Compact one-line-per-agent table */}\n {shown.length > 0 ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>{' '}</Text>\n <Text dimColor>{'name'.padEnd(14)}</Text>\n <Text dimColor>{'model'.padEnd(18)}</Text>\n <Text dimColor>{'status'.padEnd(9)}</Text>\n <Text dimColor>{'L/t·ctx'.padEnd(12)}</Text>\n <Text dimColor>{'elapsed'.padEnd(8)}</Text>\n <Text dimColor>cost</Text>\n </Box>\n {shown.map((e) => {\n const s = STATUS[e.status];\n const elapsed =\n e.status === 'running'\n ? fmtElapsed(Math.max(0, nowTick - e.startedAt))\n : fmtElapsed(Math.max(0, nowTick - e.lastEventAt)) + ' ago';\n const model = fmtModelLabel(e.provider, e.model) || '—';\n const ltCtx =\n e.ctxPct !== undefined\n ? `L${e.iterations} ${e.toolCalls}t ${Math.round(e.ctxPct * 100)}%`\n : `L${e.iterations} ${e.toolCalls}t`;\n return (\n <Box key={e.id} flexDirection=\"row\" gap={1}>\n <Text color={s.color}>{s.icon}</Text>\n <Text>{e.name.padEnd(14).slice(0, 14)}</Text>\n <Text dimColor>{model.padEnd(18).slice(0, 18)}</Text>\n <Text color={s.color}>{e.status.padEnd(9)}</Text>\n <Text dimColor>{ltCtx.padEnd(12).slice(0, 12)}</Text>\n <Text dimColor>{elapsed.padEnd(8).slice(0, 8)}</Text>\n <Text color=\"yellow\">{fmtCost(e.cost)}</Text>\n {e.extensions && e.extensions > 0 ? (\n <Text color=\"yellow\"> ⚡×{e.extensions}</Text>\n ) : null}\n </Box>\n );\n })}\n {overflow > 0 ? <Text dimColor>{` … +${overflow} more`}</Text> : null}\n </Box>\n ) : null}\n\n {/* Timeline */}\n {timeline.length > 0 ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>timeline</Text>\n {timeline.map((ev, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: timeline is rebuilt per render\n <Box key={i} flexDirection=\"row\" gap={1}>\n <Text dimColor>{`${fmtElapsed(Math.max(0, nowTick - ev.at))} ago`.padEnd(10)}</Text>\n <Text color={ev.color}>{ev.icon}</Text>\n <Text dimColor>{ev.text}</Text>\n </Box>\n ))}\n </Box>\n ) : null}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\nimport type { FleetEntry } from '../app.js';\nimport { bucketActivity, fmtModelLabel, sparkline } from './fleet-monitor.js';\nimport { fmtElapsed } from './status-bar.js';\n\nexport interface AgentsMonitorProps {\n entries: Record<string, FleetEntry>;\n /** Fleet-wide accumulated cost. */\n totalCost: number;\n /** Fleet-wide token totals, when available. */\n totalTokens?: { input: number; output: number };\n /** 1s clock tick so elapsed times + sparklines stay live. */\n nowTick: number;\n}\n\nconst STATUS: Record<FleetEntry['status'], { icon: string; color: string }> = {\n idle: { icon: '○', color: 'gray' },\n running: { icon: '▶', color: 'yellow' },\n success: { icon: '✓', color: 'green' },\n failed: { icon: '✗', color: 'red' },\n timeout: { icon: '⏱', color: 'yellow' },\n stopped: { icon: '⊘', color: 'gray' },\n};\n\nfunction isTerminal(status: FleetEntry['status']): boolean {\n return (\n status === 'success' || status === 'failed' || status === 'timeout' || status === 'stopped'\n );\n}\n\n/**\n * An idle agent that hasn't produced any event for this long is considered\n * stale and dropped from the live view — a running agent is never hidden.\n * `lastEventAt` is bumped on every tool / message / stream event.\n */\nexport const IDLE_HIDE_MS = 60_000;\n\n/**\n * Select the agents the live monitor should render: never-terminal agents,\n * with idle agents pruned once they've been silent longer than `idleHideMs`.\n * Running agents come first (oldest first), then surviving idle agents\n * (most-recently-active first). Pure + exported for unit testing.\n */\nexport function selectLiveAgents(\n all: FleetEntry[],\n now: number,\n idleHideMs: number = IDLE_HIDE_MS,\n): FleetEntry[] {\n const visible = all.filter((e) => {\n if (isTerminal(e.status)) return false;\n if (e.status === 'running') return true;\n // idle: keep only while it's been recently active\n return now - e.lastEventAt < idleHideMs;\n });\n return visible.sort((a, b) => {\n if (a.status === 'running' && b.status !== 'running') return -1;\n if (a.status !== 'running' && b.status === 'running') return 1;\n if (a.status === 'running') return a.startedAt - b.startedAt; // oldest run first\n return b.lastEventAt - a.lastEventAt; // freshest idle first\n });\n}\n\nfunction fmtTokens(n: number): string {\n if (n < 1000) return String(n);\n if (n < 1_000_000) return `${(n / 1000).toFixed(1)}k`;\n return `${(n / 1_000_000).toFixed(1)}M`;\n}\n\nexport function fmtExactTokens(n: number): string {\n return `${Math.round(n).toLocaleString('en-US')} tok`;\n}\n\nfunction snippet(s: string, max = 72): string {\n const oneLine = s.replace(/\\s+/g, ' ').trim();\n if (oneLine.length <= max) return oneLine;\n return `${oneLine.slice(0, max - 1)}…`;\n}\n\n/** Colored context-window fill bar: ████░░░░░░ 67% */\nfunction ContextBar({\n pct,\n tokens,\n maxTokens,\n}: {\n pct: number;\n tokens?: number;\n maxTokens?: number;\n}): React.ReactElement {\n const clamped = Math.max(0, Math.min(2, pct)); // cap visual at 200%\n const totalBars = 10;\n const filled = Math.round(clamped * totalBars);\n const empty = totalBars - filled;\n const color = pct < 0.6 ? 'green' : pct < 0.75 ? 'yellow' : 'red';\n const pctText = pct >= 1 ? `${Math.round(pct * 100)}%+` : `${Math.round(pct * 100)}%`;\n const tokenText = tokens ? ` ${fmtTokens(tokens)}/${fmtTokens(maxTokens ?? 200_000)}` : '';\n return (\n <Text color={color}>\n {'█'.repeat(filled)}\n {'░'.repeat(Math.max(0, empty))} {pctText}\n {tokenText}\n </Text>\n );\n}\n\n/**\n * Live per-agent context view (Ctrl+G). Each active agent gets a card with\n * its current tool, the last tool result, the most recent streaming /\n * message text, an activity sparkline, and budget pressure. Terminal\n * agents are excluded so the monitor reflects only what's actually live.\n */\nexport function AgentsMonitor({\n entries,\n totalCost,\n totalTokens,\n nowTick,\n}: AgentsMonitorProps): React.ReactElement {\n const all = Object.values(entries);\n\n // Terminal agents are excluded, and idle agents that have been silent for\n // longer than IDLE_HIDE_MS are pruned — the FleetPanel + history still hold\n // the full record; this view shows only what's actually live right now.\n const live = selectLiveAgents(all, nowTick);\n\n const running = live.filter((e) => e.status === 'running').length;\n const totalDone = all.filter((e) => e.status === 'success').length;\n const totalFailed = all.filter((e) => e.status === 'failed' || e.status === 'timeout').length;\n // Idle agents pruned for being stale (live but not in the visible set).\n const hiddenIdle = all.filter(\n (e) => e.status === 'idle' && nowTick - e.lastEventAt >= IDLE_HIDE_MS,\n ).length;\n\n const ordered = live;\n const shown = ordered.slice(0, 8);\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"magenta\" paddingX={1}>\n {/* Header — live identity, distinct from FLEET MONITOR */}\n <Box flexDirection=\"row\" gap={1}>\n <Text bold color=\"magenta\">\n AGENTS · LIVE\n </Text>\n <Text dimColor>│</Text>\n <Text color=\"yellow\">▶{running}</Text>\n <Text dimColor>─────────────────</Text>\n <Text dimColor>done</Text>\n <Text color=\"green\">✓{totalDone}</Text>\n <Text dimColor>·</Text>\n <Text dimColor>failed</Text>\n {totalFailed > 0 ? <Text color=\"red\">✗{totalFailed}</Text> : null}\n <Text dimColor>· Ctrl+G / F3 to close</Text>\n </Box>\n\n {/* Token + cost row */}\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>shown</Text>\n <Text color=\"magenta\">{live.length}</Text>\n {totalTokens ? (\n <Text dimColor>\n {' '}\n {fmtTokens(totalTokens.input)}↑ {fmtTokens(totalTokens.output)}↓\n </Text>\n ) : null}\n <Text color=\"green\">${totalCost.toFixed(3)}</Text>\n {hiddenIdle > 0 ? <Text dimColor>· {hiddenIdle} idle hidden</Text> : null}\n </Box>\n\n {shown.length === 0 ? (\n <Text dimColor>No live agents — spawn with /spawn or /fleet dispatch.</Text>\n ) : null}\n\n {/* Per-agent live cards */}\n {shown.map((e) => {\n const s = STATUS[e.status];\n const elapsed =\n e.status === 'running' ? fmtElapsed(Math.max(0, nowTick - e.startedAt)) : e.status;\n const spark = sparkline(bucketActivity(e.recentTools, nowTick));\n const lastTool = e.recentTools[e.recentTools.length - 1];\n const lastMessage = e.recentMessages[e.recentMessages.length - 1];\n const streamTail = e.streamingText ? snippet(e.streamingText.slice(-160)) : '';\n const toolElapsed = e.currentTool ? Math.max(0, nowTick - e.currentTool.startedAt) : 0;\n\n return (\n <Box key={e.id} flexDirection=\"column\" marginTop={1}>\n {/* Identity line: icon · name · model · elapsed · iter/tools · ctx · extensions\n — ctx bar lives here (not its own line) to save vertical space. */}\n <Box flexDirection=\"row\" gap={1}>\n <Text color={s.color} bold>\n {s.icon}\n </Text>\n <Text bold>{e.name}</Text>\n {fmtModelLabel(e.provider, e.model) ? (\n <Text dimColor>{fmtModelLabel(e.provider, e.model)}</Text>\n ) : null}\n {e.ctxMaxTokens && e.ctxMaxTokens > 0 ? (\n <Text color=\"blue\">ctx max {fmtExactTokens(e.ctxMaxTokens)}</Text>\n ) : null}\n <Text dimColor>·</Text>\n <Text dimColor>{elapsed}</Text>\n <Text dimColor>·</Text>\n <Text dimColor>\n L{e.iterations} {e.toolCalls}t\n </Text>\n {e.ctxPct !== undefined ? (\n <>\n <Text dimColor>·</Text>\n <ContextBar pct={e.ctxPct} tokens={e.ctxTokens} maxTokens={e.ctxMaxTokens} />\n </>\n ) : null}\n {e.extensions && e.extensions > 0 ? (\n <Text color=\"yellow\">⚡×{e.extensions}</Text>\n ) : null}\n </Box>\n\n {/* Current tool (live, ms-precision) — only while inside a tool */}\n {e.status === 'running' && e.currentTool ? (\n <Box flexDirection=\"row\" gap={1} paddingLeft={2}>\n <Text color=\"cyan\">→ {e.currentTool.name}</Text>\n <Text dimColor>({toolElapsed}ms)</Text>\n </Box>\n ) : null}\n\n {/* Activity sparkline + last completed tool summary */}\n {spark || lastTool ? (\n <Box flexDirection=\"row\" gap={1} paddingLeft={2}>\n <Text color=\"green\">{spark || ''}</Text>\n {lastTool ? (\n <Text dimColor>\n last: {lastTool.name}\n {typeof lastTool.durationMs === 'number' ? ` ${lastTool.durationMs}ms` : ''}\n {lastTool.ok === false ? ' ✗' : ''}\n </Text>\n ) : null}\n </Box>\n ) : null}\n\n {/* Live streaming tail (for running agents) */}\n {e.status === 'running' && streamTail ? (\n <Box paddingLeft={2}>\n <Text dimColor>\n {'>'} {streamTail}\n </Text>\n </Box>\n ) : null}\n\n {/* Latest finished-message snippet (when nothing streaming) */}\n {(e.status !== 'running' || !streamTail) && lastMessage ? (\n <Box paddingLeft={2}>\n <Text dimColor>msg: {snippet(lastMessage.text)}</Text>\n </Box>\n ) : null}\n\n {/* Budget pressure */}\n {e.budgetWarning ? (\n <Box paddingLeft={2}>\n <Text color=\"yellow\">\n ⚡ {e.budgetWarning.kind} {e.budgetWarning.used}/{e.budgetWarning.limit} —\n extending\n </Text>\n </Box>\n ) : null}\n\n {/* Failure reason (shown for failed/timeout/stopped agents) */}\n {e.failureReason && e.status !== 'success' ? (\n <Box paddingLeft={2}>\n <Text color=\"red\">✗ {e.failureReason}</Text>\n </Box>\n ) : null}\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\n\nexport interface AutonomyOption {\n mode: 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel';\n label: string;\n description: string;\n color: string;\n}\n\nexport interface AutonomyPickerProps {\n options: AutonomyOption[];\n selected: number;\n hint?: string;\n}\n\nexport const AUTONOMY_OPTIONS: AutonomyOption[] = [\n {\n mode: 'off',\n label: 'OFF',\n description: 'Agent stops after each turn (normal interactive mode)',\n color: 'green',\n },\n {\n mode: 'suggest',\n label: 'SUGGEST',\n description: 'Shows next-step suggestions after each turn',\n color: 'cyan',\n },\n {\n mode: 'auto',\n label: 'AUTO',\n description: 'Self-driving — agent picks next step and continues',\n color: 'yellow',\n },\n {\n mode: 'eternal',\n label: 'ETERNAL',\n description: 'Goal-driven loop — requires /goal set first',\n color: 'red',\n },\n {\n mode: 'eternal-parallel',\n label: 'PARALLEL',\n description: 'Fan-out 4–8 subagents per tick — requires /goal',\n color: 'magenta',\n },\n];\n\nexport function AutonomyPicker({\n options,\n selected,\n hint,\n}: AutonomyPickerProps): React.ReactElement {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text color=\"cyan\" bold>\n ━━ Autonomy Mode ━━\n </Text>\n <Text dimColor>↑/↓ navigate · Enter select · Esc cancel · Ctrl+C exit</Text>\n {options.map((opt, i) => (\n <Text\n key={opt.mode}\n color={i === selected ? opt.color : undefined}\n inverse={i === selected}\n >\n {i === selected ? '› ' : ' '}\n <Text bold>{opt.label.padEnd(12)}</Text>\n <Text dimColor>{opt.description}</Text>\n </Text>\n ))}\n {hint ? <Text color=\"yellow\">{hint}</Text> : null}\n </Box>\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport type React from 'react';\n\nexport interface BrainDecisionPromptOption {\n id: string;\n label: string;\n risk?: 'low' | 'medium' | 'high' | 'critical' | string;\n consequence?: string;\n recommended?: boolean;\n}\n\nexport interface BrainDecisionPromptProps {\n requestId: string;\n source: string;\n risk: 'low' | 'medium' | 'high' | 'critical' | string;\n question: string;\n context?: string;\n options?: BrainDecisionPromptOption[];\n onAnswer?: (answer: { id: string; optionId?: string; deny?: boolean; text?: string }) => void;\n}\n\nfunction riskColor(risk: string): string {\n switch (risk) {\n case 'low':\n return 'green';\n case 'medium':\n return 'cyan';\n case 'high':\n return 'yellow';\n case 'critical':\n return 'red';\n default:\n return 'white';\n }\n}\n\nfunction optionKey(index: number): string {\n return String.fromCharCode('A'.charCodeAt(0) + index);\n}\n\nfunction contextLines(context?: string): string[] {\n if (!context?.trim()) return [];\n return context.trim().split('\\n').slice(0, 5);\n}\n\n/**\n * Brain escalation panel. It renders the options and, when `onAnswer` is wired,\n * maps A/B/C (or 1/2/3) to the matching option and Esc/D to a safe denial.\n */\nexport function BrainDecisionPrompt({\n requestId,\n source,\n risk,\n question,\n context,\n options = [],\n onAnswer,\n}: BrainDecisionPromptProps): React.ReactElement {\n const color = riskColor(risk);\n const ctx = contextLines(context);\n\n useInput((input, key) => {\n if (!onAnswer) return;\n if (key.escape || input.toLowerCase() === 'd') {\n onAnswer({ id: requestId, deny: true, text: 'Denied by human from TUI.' });\n return;\n }\n const ch = input.toLowerCase();\n const index = ch >= 'a' && ch <= 'z' ? ch.charCodeAt(0) - 'a'.charCodeAt(0) : Number(ch) - 1;\n const option = Number.isInteger(index) && index >= 0 ? options[index] : undefined;\n if (option) onAnswer({ id: requestId, optionId: option.id, text: option.label });\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"magenta\" paddingX={1}>\n <Box flexDirection=\"row\">\n <Text bold color=\"magenta\">\n 🧠 BRAIN REQUIRES HUMAN DECISION\n </Text>\n </Box>\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>Source:</Text>\n <Text>{source}</Text>\n <Text dimColor>Risk:</Text>\n <Text color={color}>{risk}</Text>\n </Box>\n <Text color=\"white\">{question}</Text>\n {ctx.length > 0 ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>Context:</Text>\n {ctx.map((line, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: context lines are static for this prompt render\n <Text key={index} dimColor>\n {line}\n </Text>\n ))}\n </Box>\n ) : null}\n {options.length > 0 ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>Options:</Text>\n {options.slice(0, 6).map((option, index) => {\n const key = optionKey(index);\n const optionColor = riskColor(String(option.risk ?? risk));\n return (\n <Box key={option.id} flexDirection=\"column\">\n <Text>\n <Text bold color=\"yellow\">\n [{key}]\n </Text>{' '}\n <Text color={optionColor}>{option.label}</Text>\n {option.recommended ? <Text color=\"green\"> recommended</Text> : null}\n </Text>\n {option.consequence ? <Text dimColor> {option.consequence}</Text> : null}\n </Box>\n );\n })}\n </Box>\n ) : null}\n <Text dimColor>─────────────────</Text>\n <Text dimColor>Press A/B/C or 1/2/3 to answer; Esc or D denies with the safe default.</Text>\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>\n {' '}\n · {cp.fileCount} file{cp.fileCount !== 1 ? 's' : ''}\n </Text>\n )}\n </Box>\n );\n })\n )}\n </Box>\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport { writeOut } from '@wrongstack/core';\nimport React from 'react';\n\nexport type ConfirmDecision = 'yes' | 'no' | 'always' | 'deny';\n\nexport interface ConfirmPromptProps {\n toolName: string;\n input: unknown;\n suggestedPattern: string;\n onDecision: (decision: ConfirmDecision) => void;\n}\n\n/** Ink color for each button's bracketed key. */\nconst BUTTON_COLOR: Record<ConfirmDecision, string> = {\n yes: 'green',\n no: 'red',\n always: 'cyan',\n deny: 'red',\n};\n\n/**\n * The button row as a list of {bracket, rest} segments. Single source of\n * truth for BOTH the rendered row and the mouse hit-test geometry\n * (`confirmButtonSegments`), so they can never drift. `rest` carries the\n * trailing space that separates one button from the next.\n */\nfunction buttonLabels(suggestedPattern: string): Array<{\n decision: ConfirmDecision;\n bracket: string;\n rest: string;\n}> {\n return [\n { decision: 'yes', bracket: '[y]', rest: 'es ' },\n { decision: 'no', bracket: '[n]', rest: 'o ' },\n { decision: 'always', bracket: '[a]', rest: `lways (${suggestedPattern}) ` },\n { decision: 'deny', bracket: '[d]', rest: 'eny' },\n ];\n}\n\n/**\n * 0-based column spans of each button WITHIN the dialog's content area (i.e.\n * relative to the first printable column inside the border + paddingX). Used\n * by the TUI mouse handler to map a click on the button row to a decision.\n * Derived from the same `buttonLabels` the component renders, so the offsets\n * always match what's on screen.\n */\nexport function confirmButtonSegments(\n suggestedPattern: string,\n): Array<{ decision: ConfirmDecision; start: number; len: number }> {\n const out: Array<{ decision: ConfirmDecision; start: number; len: number }> = [];\n let col = 0;\n for (const l of buttonLabels(suggestedPattern)) {\n const len = l.bracket.length + l.rest.length;\n out.push({ decision: l.decision, start: col, len });\n col += len;\n }\n return out;\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 writeOut('\\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 // NOTE: no marginY here — the call site wraps this in a measured Box that\n // owns the vertical margin, so `measureElement` on the wrapper reports the\n // exact box height (top border + content + bottom border) the mouse\n // hit-test relies on to locate the button row.\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"yellow\" paddingX={1}>\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 {buttonLabels(suggestedPattern).map((l) => (\n <React.Fragment key={l.decision}>\n <Text bold color={BUTTON_COLOR[l.decision]}>\n {l.bracket}\n </Text>\n <Text dimColor>{l.rest}</Text>\n </React.Fragment>\n ))}\n </Text>\n </Box>\n </Box>\n );\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, useStdout } from 'ink';\nimport type React from 'react';\nimport { useEffect, useState } from 'react';\nimport type { FleetEntry } from '../app.js';\n\nexport interface FleetPanelProps {\n /** Per-subagent state, keyed by subagentId. */\n entries: Record<string, FleetEntry>;\n /** Fleet-wide accumulated cost (from FleetUsageAggregator). */\n totalCost: number;\n /** Optional roster for resolving role ids to display names. */\n roster?: Record<string, { name: string }>;\n /** When set, the LEADER row is always shown (even when idle) with a collab session indicator. */\n collabSession?: {\n sessionId: string | null;\n bugCount: number;\n planCount: number;\n evalCount: number;\n } | null;\n}\n\n/**\n * Compact fleet summary rendered below the status bar when director mode is\n * active. Max 6 lines: fleet summary + up to 5 running agents with only\n * name and current tool. Idle/finished agents are excluded unless a collab\n * session is active (LEADER always shows as \"waiting\" in that case).\n */\nexport function FleetPanel({\n entries,\n totalCost,\n collabSession,\n}: FleetPanelProps): React.ReactElement | null {\n // Track terminal width to adapt name truncation.\n const { stdout } = useStdout();\n const [termWidth, setTermWidth] = useState(stdout?.columns ?? 90);\n useEffect(() => {\n const handleResize = () => setTermWidth(stdout?.columns ?? 90);\n handleResize();\n process.stdout.on('resize', handleResize);\n return () => {\n process.stdout.off('resize', handleResize);\n };\n }, [stdout]);\n\n const list = Object.values(entries);\n if (list.length === 0 && !collabSession) return null;\n\n // Adapt name truncation based on terminal width.\n const nameMaxLen = Math.max(6, Math.min(14, termWidth - 30));\n\n // Always extract the leader entry separately — it gets special treatment.\n const leader = list.find((e) => e.id === 'leader');\n const subagents = list.filter((e) => e.id !== 'leader');\n\n // Only running agents — idle and finished agents are not shown.\n // But when a collab session is active, the leader is always shown with its\n // collab-specific status so the user can see the director is still alive.\n const running = subagents.filter((e) => e.status === 'running');\n const runningCount = running.length;\n const hasCollab = !!collabSession;\n\n // Fleet summary line\n const costLabel = totalCost > 0 ? ` · ${totalCost.toFixed(3)}` : '';\n const collabLabel =\n hasCollab && collabSession.sessionId\n ? ` · collab(${collabSession.bugCount}b/${collabSession.planCount}p/${collabSession.evalCount}e)`\n : '';\n const summaryLine =\n runningCount > 0\n ? `${runningCount} running${costLabel}${collabLabel}`\n : `idle${costLabel}${collabLabel}`;\n\n // Show up to 5 running agents (collab agents or regular subagents).\n const shown = running.slice(0, 5);\n const overflow = running.length > 5 ? running.length - 5 : 0;\n\n // Leader status label: when collab is active show \"waiting for agents\",\n // otherwise show its current tool or a dash.\n const leaderTool = hasCollab\n ? 'waiting for agents'\n : (leader?.currentTool?.name ?? (leader?.status === 'running' ? 'running' : '—'));\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n {/* Fleet summary */}\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>⚡ Fleet</Text>\n <Text dimColor>│</Text>\n <Text>{summaryLine}</Text>\n </Box>\n\n {/* Leader row — always shown when collab session is active, regardless of idle/running */}\n {hasCollab && leader ? (\n <Box flexDirection=\"row\" gap={1}>\n <Text color=\"yellow\">●</Text>\n <Text>{leader.name.slice(0, nameMaxLen)}</Text>\n <Text dimColor>→</Text>\n <Text color=\"yellow\">{leaderTool}</Text>\n </Box>\n ) : null}\n\n {/* Running agents: name + current tool only */}\n {shown.map((entry) => {\n // entry.name is the subagent's display name (nickname when assigned,\n // e.g. \"Einstein (Bug Hunter)\") — prefer it over the raw id.\n const name =\n entry.name && entry.name !== entry.id ? entry.name : entry.id.slice(0, nameMaxLen);\n const tool = entry.currentTool?.name ?? '—';\n return (\n <Box key={entry.id} flexDirection=\"row\" gap={1}>\n <Text color=\"green\">●</Text>\n <Text>{name.slice(0, nameMaxLen)}</Text>\n <Text dimColor>→</Text>\n <Text color=\"cyan\">{tool}</Text>\n </Box>\n );\n })}\n\n {/* Overflow indicator — show count and first 2 overflowed agent names */}\n {overflow > 0 ? (\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>+{overflow}:</Text>\n {running.slice(5, 7).map((e) => (\n <Text key={e.id} dimColor>\n {e.name?.split(' ')[0]?.slice(0, nameMaxLen - 2) ?? 'agent'},\n </Text>\n ))}\n <Text dimColor>…</Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\nimport { theme } from '../theme.js';\n\nexport interface HelpEntry {\n /** Key chord or command, e.g. `Ctrl+F` or `/model`. */\n keys: string;\n /** What it does. */\n desc: string;\n}\n\nexport interface HelpSection {\n title: string;\n entries: HelpEntry[];\n}\n\n/**\n * Static cheat-sheet content: keybindings + common slash commands, grouped by\n * area. Pure data (no JSX) so the exact set of entries is unit-testable and the\n * overlay renders identically everywhere. The Navigation section adapts to the\n * active surface — scroll keys only make sense in the managed viewport, wheel/\n * click only when full mouse mode is on.\n */\nexport function helpSections(opts: { managed: boolean; mouse: boolean }): HelpSection[] {\n const nav: HelpEntry[] = [];\n if (opts.managed) nav.push({ keys: 'PgUp/PgDn', desc: 'scroll chat history' });\n if (opts.mouse)\n nav.push(\n { keys: 'wheel', desc: 'scroll chat history' },\n { keys: 'drag scrollbar', desc: 'scrub to any position' },\n { keys: 'click input', desc: 'move the caret' },\n { keys: 'click', desc: 'select / confirm' },\n );\n nav.push(\n { keys: '↑/↓', desc: 'previous / next input (empty prompt)' },\n { keys: '?', desc: 'open this help (empty prompt)' },\n );\n\n return [\n { title: 'Navigation', entries: nav },\n {\n title: 'Monitors',\n entries: [\n { keys: 'Ctrl+F / F2', desc: 'fleet orchestration monitor' },\n { keys: 'Ctrl+G / F3', desc: 'agents live monitor' },\n { keys: 'Ctrl+T / F4', desc: 'worktree monitor' },\n { keys: 'Esc', desc: 'close the open monitor / overlay' },\n ],\n },\n {\n title: 'Editing',\n entries: [\n { keys: 'Enter', desc: 'send (queues while the agent is busy)' },\n { keys: 'Esc Esc', desc: 'clear the input buffer' },\n { keys: 'Ctrl+Backspace', desc: 'delete the previous word' },\n { keys: 'Ctrl+S', desc: 'edit autonomy settings' },\n { keys: 'Ctrl+C', desc: 'interrupt the run · twice to exit' },\n ],\n },\n {\n title: 'Commands',\n entries: [\n { keys: '/help', desc: 'list all slash commands' },\n { keys: '/model', desc: 'switch the active model' },\n { keys: '/fleet', desc: 'multi-agent fleet controls' },\n { keys: '/goal', desc: 'set an autonomous goal' },\n { keys: '/autonomy', desc: 'autonomy mode (eternal / off)' },\n { keys: '/settings', desc: 'autonomy defaults (also Ctrl+S)' },\n { keys: '/clear', desc: 'clear the conversation' },\n ],\n },\n ];\n}\n\n/**\n * Full-width modal cheat-sheet overlay (opened with `?` on an empty prompt,\n * closed with Esc / `?` / `q`). Mirrors the bordered-panel look of the monitor\n * overlays so it sits naturally in the bottom region. Two columns: the key\n * chord (accent) and its description (dim), with the key column padded to a\n * shared width so descriptions align.\n */\nexport function HelpOverlay({\n managed,\n mouse,\n}: {\n managed: boolean;\n mouse: boolean;\n}): React.ReactElement {\n const sections = helpSections({ managed, mouse });\n const keyWidth = Math.max(...sections.flatMap((s) => s.entries.map((e) => e.keys.length)), 0);\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.accent} paddingX={1}>\n <Box flexDirection=\"row\" gap={1}>\n <Text bold color={theme.accent}>\n WrongStack — keys & commands\n </Text>\n <Text dimColor>· Esc to close</Text>\n </Box>\n {sections.map((sec) => (\n <Box key={sec.title} flexDirection=\"column\" marginTop={1}>\n <Text bold color={theme.brand}>\n {sec.title}\n </Text>\n {sec.entries.map((e, i) => (\n <Box\n // biome-ignore lint/suspicious/noArrayIndexKey: positional, stable per section\n key={i}\n flexDirection=\"row\"\n >\n <Text color={theme.accent}>{e.keys.padEnd(keyWidth + 2)}</Text>\n <Text dimColor>{e.desc}</Text>\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n );\n}\n","// Lightweight, synchronous syntax highlighter that emits Ink <Text color>\n// SEGMENTS — never raw ANSI escape codes. This matters: Ink measures text by\n// the visible glyphs of the strings it is given, and embedded SGR escapes\n// inflate that measurement and corrupt the viewport's clip/scroll math. By\n// returning {text,color} tokens (the caller wraps each in <Text color>), Ink\n// owns the styling and width stays exact.\n//\n// It is deliberately a shallow regex/scan tokenizer, not a real parser —\n// approximate coloring reads fine in a terminal. The ONE invariant every\n// language path must keep: the concatenation of token texts equals the input\n// line (no glyph added or dropped), so measurement never drifts. A test\n// asserts `tokens.map(t=>t.text).join('') === line` across a corpus.\n\nexport interface Token {\n text: string;\n color?: string;\n dim?: boolean;\n bold?: boolean;\n}\n\nexport type Lang = 'ts' | 'js' | 'json' | 'bash' | 'python' | 'diff' | 'plain';\n\n/** Carry state for constructs that span lines (block comments, triple strings). */\nexport interface HLState {\n block?: boolean; // inside a /* … */ comment (ts/js)\n triple?: string | null; // inside a python triple-quoted string (\"\"\"/''')\n}\n\n// Conventional terminal syntax colors (Ink color names).\nconst C = {\n keyword: 'magenta',\n string: 'green',\n comment: 'gray',\n number: 'yellow',\n literal: 'yellow', // true/false/null\n property: 'cyan',\n variable: 'cyan',\n command: 'cyan',\n flag: 'yellow',\n decorator: 'magenta',\n diffAdd: 'green',\n diffDel: 'red',\n diffMeta: 'cyan',\n} as const;\n\nconst TS_KEYWORDS = new Set([\n 'const',\n 'let',\n 'var',\n 'function',\n 'return',\n 'if',\n 'else',\n 'for',\n 'while',\n 'do',\n 'switch',\n 'case',\n 'break',\n 'continue',\n 'new',\n 'class',\n 'extends',\n 'implements',\n 'interface',\n 'type',\n 'enum',\n 'import',\n 'export',\n 'from',\n 'as',\n 'default',\n 'async',\n 'await',\n 'yield',\n 'try',\n 'catch',\n 'finally',\n 'throw',\n 'typeof',\n 'instanceof',\n 'in',\n 'of',\n 'this',\n 'super',\n 'void',\n 'delete',\n 'public',\n 'private',\n 'protected',\n 'readonly',\n 'static',\n 'get',\n 'set',\n 'true',\n 'false',\n 'null',\n 'undefined',\n 'never',\n 'any',\n 'unknown',\n 'string',\n 'number',\n 'boolean',\n 'satisfies',\n]);\n\nconst PY_KEYWORDS = new Set([\n 'def',\n 'return',\n 'if',\n 'elif',\n 'else',\n 'for',\n 'while',\n 'break',\n 'continue',\n 'class',\n 'import',\n 'from',\n 'as',\n 'with',\n 'try',\n 'except',\n 'finally',\n 'raise',\n 'yield',\n 'lambda',\n 'pass',\n 'global',\n 'nonlocal',\n 'assert',\n 'del',\n 'and',\n 'or',\n 'not',\n 'in',\n 'is',\n 'None',\n 'True',\n 'False',\n 'async',\n 'await',\n 'self',\n 'print',\n]);\n\nconst BASH_KEYWORDS = new Set([\n 'if',\n 'then',\n 'else',\n 'elif',\n 'fi',\n 'for',\n 'while',\n 'do',\n 'done',\n 'case',\n 'esac',\n 'function',\n 'in',\n 'select',\n 'return',\n 'export',\n 'local',\n 'readonly',\n 'source',\n 'echo',\n 'cd',\n 'set',\n 'unset',\n]);\n\n// Anchored (^) so `.match` only matches at the START of the sliced remainder.\nconst IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*/;\nconst NUMBER = /^(?:0[xX][0-9a-fA-F]+|\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)/;\nconst WS = /^\\s+/;\nconst BASH_VAR = /^(?:\\$\\{[^}]*\\}|\\$[A-Za-z0-9_]+)/;\nconst BASH_FLAG = /^--?[A-Za-z0-9][A-Za-z0-9-]*/;\nconst BASH_WORD = /^[A-Za-z0-9_./-]+/;\nconst PY_DECORATOR = /^@[A-Za-z_][A-Za-z0-9_.]*/;\n\n/** Return the match of anchored `re` at position `i`, or null. */\nfunction matchAt(re: RegExp, s: string, i: number): string | null {\n const m = s.slice(i).match(re);\n return m ? m[0] : null;\n}\n\n/** Consume a quoted string starting at i (quote char = s[i]); returns the span\n * including both quotes (or to end of line if unterminated). Length-preserving. */\nfunction readString(s: string, i: number): string {\n const q = s[i];\n let j = i + 1;\n while (j < s.length) {\n if (s[j] === '\\\\') {\n j += 2;\n continue;\n }\n if (s[j] === q) {\n j += 1;\n break;\n }\n j += 1;\n }\n return s.slice(i, Math.min(j, s.length));\n}\n\nfunction tokenizeCLike(\n line: string,\n kw: Set<string>,\n carry: HLState,\n): { tokens: Token[]; carry: HLState } {\n const tokens: Token[] = [];\n let i = 0;\n const next: HLState = { ...carry };\n\n // Continue an open block comment from a previous line.\n if (next.block) {\n const end = line.indexOf('*/');\n if (end === -1) {\n tokens.push({ text: line, color: C.comment, dim: true });\n return { tokens, carry: { block: true } };\n }\n tokens.push({ text: line.slice(0, end + 2), color: C.comment, dim: true });\n i = end + 2;\n next.block = false;\n }\n\n while (i < line.length) {\n const ch = line[i] ?? '';\n const two = line.slice(i, i + 2);\n\n if (two === '//') {\n tokens.push({ text: line.slice(i), color: C.comment, dim: true });\n break;\n }\n if (two === '/*') {\n const end = line.indexOf('*/', i + 2);\n if (end === -1) {\n tokens.push({ text: line.slice(i), color: C.comment, dim: true });\n next.block = true;\n break;\n }\n tokens.push({ text: line.slice(i, end + 2), color: C.comment, dim: true });\n i = end + 2;\n continue;\n }\n if (ch === '\"' || ch === \"'\" || ch === '`') {\n const str = readString(line, i);\n tokens.push({ text: str, color: C.string });\n i += str.length;\n continue;\n }\n const ws = matchAt(WS, line, i);\n if (ws) {\n tokens.push({ text: ws });\n i += ws.length;\n continue;\n }\n const num = matchAt(NUMBER, line, i);\n if (num) {\n tokens.push({ text: num, color: C.number });\n i += num.length;\n continue;\n }\n const id = matchAt(IDENT, line, i);\n if (id) {\n tokens.push(kw.has(id) ? { text: id, color: C.keyword } : { text: id });\n i += id.length;\n continue;\n }\n // Punctuation / anything else — one char, uncolored. Always advances.\n tokens.push({ text: ch });\n i += 1;\n }\n return { tokens, carry: next };\n}\n\nfunction tokenizeJson(line: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n while (i < line.length) {\n const ch = line[i] ?? '';\n if (ch === '\"') {\n const str = readString(line, i);\n // Property key if the next non-space char is a colon.\n let k = i + str.length;\n while (k < line.length && (line[k] === ' ' || line[k] === '\\t')) k += 1;\n tokens.push({ text: str, color: line[k] === ':' ? C.property : C.string });\n i += str.length;\n continue;\n }\n const ws = matchAt(WS, line, i);\n if (ws) {\n tokens.push({ text: ws });\n i += ws.length;\n continue;\n }\n const num = matchAt(NUMBER, line, i);\n if (num) {\n tokens.push({ text: num, color: C.number });\n i += num.length;\n continue;\n }\n const id = matchAt(IDENT, line, i);\n if (id) {\n tokens.push(\n id === 'true' || id === 'false' || id === 'null'\n ? { text: id, color: C.literal }\n : { text: id },\n );\n i += id.length;\n continue;\n }\n tokens.push({ text: ch });\n i += 1;\n }\n return tokens;\n}\n\nfunction tokenizeBash(line: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n let firstWord = true;\n while (i < line.length) {\n const ch = line[i] ?? '';\n if (ch === '#') {\n tokens.push({ text: line.slice(i), color: C.comment, dim: true });\n break;\n }\n if (ch === '\"' || ch === \"'\") {\n const str = readString(line, i);\n tokens.push({ text: str, color: C.string });\n i += str.length;\n continue;\n }\n if (ch === '$') {\n const varMatch = matchAt(BASH_VAR, line, i);\n if (varMatch) {\n tokens.push({ text: varMatch, color: C.variable });\n i += varMatch.length;\n continue;\n }\n }\n const ws = matchAt(WS, line, i);\n if (ws) {\n tokens.push({ text: ws });\n i += ws.length;\n continue;\n }\n if (ch === '-' && firstWord === false) {\n const flag = matchAt(BASH_FLAG, line, i);\n if (flag) {\n tokens.push({ text: flag, color: C.flag });\n i += flag.length;\n continue;\n }\n }\n const id = matchAt(BASH_WORD, line, i);\n if (id) {\n const color = firstWord ? C.command : BASH_KEYWORDS.has(id) ? C.keyword : undefined;\n tokens.push(color ? { text: id, color } : { text: id });\n i += id.length;\n firstWord = false;\n continue;\n }\n tokens.push({ text: ch });\n i += 1;\n if (ch !== ' ' && ch !== '\\t') firstWord = false;\n }\n return tokens;\n}\n\nfunction tokenizePython(line: string, carry: HLState): { tokens: Token[]; carry: HLState } {\n const tokens: Token[] = [];\n const next: HLState = { ...carry };\n let i = 0;\n\n if (next.triple) {\n const close = line.indexOf(next.triple);\n if (close === -1) {\n tokens.push({ text: line, color: C.string });\n return { tokens, carry: next };\n }\n tokens.push({ text: line.slice(0, close + 3), color: C.string });\n i = close + 3;\n next.triple = null;\n }\n\n while (i < line.length) {\n const ch = line[i] ?? '';\n const three = line.slice(i, i + 3);\n if (ch === '#') {\n tokens.push({ text: line.slice(i), color: C.comment, dim: true });\n break;\n }\n if (three === '\"\"\"' || three === \"'''\") {\n const close = line.indexOf(three, i + 3);\n if (close === -1) {\n tokens.push({ text: line.slice(i), color: C.string });\n next.triple = three;\n break;\n }\n tokens.push({ text: line.slice(i, close + 3), color: C.string });\n i = close + 3;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n const str = readString(line, i);\n tokens.push({ text: str, color: C.string });\n i += str.length;\n continue;\n }\n if (ch === '@') {\n const dec = matchAt(PY_DECORATOR, line, i);\n if (dec) {\n tokens.push({ text: dec, color: C.decorator });\n i += dec.length;\n continue;\n }\n }\n const ws = matchAt(WS, line, i);\n if (ws) {\n tokens.push({ text: ws });\n i += ws.length;\n continue;\n }\n const num = matchAt(NUMBER, line, i);\n if (num) {\n tokens.push({ text: num, color: C.number });\n i += num.length;\n continue;\n }\n const id = matchAt(IDENT, line, i);\n if (id) {\n tokens.push(PY_KEYWORDS.has(id) ? { text: id, color: C.keyword } : { text: id });\n i += id.length;\n continue;\n }\n tokens.push({ text: ch });\n i += 1;\n }\n return { tokens, carry: next };\n}\n\nfunction tokenizeDiff(line: string): Token[] {\n // Whole-line classification — one token, length-preserving.\n if (line.startsWith('@@')) return [{ text: line, color: C.diffMeta }];\n if (line.startsWith('+++') || line.startsWith('---'))\n return [{ text: line, color: C.diffMeta, dim: true }];\n if (line.startsWith('+')) return [{ text: line, color: C.diffAdd }];\n if (line.startsWith('-')) return [{ text: line, color: C.diffDel }];\n return [{ text: line, dim: true }];\n}\n\n/**\n * Highlight ONE line. `carry` threads multi-line state (block comments, triple\n * strings) from the previous line; pass the returned `carry` into the next call.\n * Guarantees `result.tokens.map(t=>t.text).join('') === line`.\n */\nexport function highlightLine(\n line: string,\n lang: Lang,\n carry: HLState = {},\n): { tokens: Token[]; carry: HLState } {\n switch (lang) {\n case 'ts':\n case 'js':\n return tokenizeCLike(line, TS_KEYWORDS, carry);\n case 'json':\n return { tokens: tokenizeJson(line), carry: {} };\n case 'bash':\n return { tokens: tokenizeBash(line), carry: {} };\n case 'python':\n return tokenizePython(line, carry);\n case 'diff':\n return { tokens: tokenizeDiff(line), carry: {} };\n default:\n return { tokens: line.length > 0 ? [{ text: line }] : [], carry: {} };\n }\n}\n\nconst LANG_ALIASES: Record<string, Lang> = {\n ts: 'ts',\n tsx: 'ts',\n typescript: 'ts',\n js: 'js',\n jsx: 'js',\n javascript: 'js',\n mjs: 'js',\n cjs: 'js',\n json: 'json',\n json5: 'json',\n sh: 'bash',\n bash: 'bash',\n shell: 'bash',\n zsh: 'bash',\n console: 'bash',\n py: 'python',\n python: 'python',\n diff: 'diff',\n patch: 'diff',\n};\n\n/** Map a code-fence info string (```ts, ```bash, …) to a supported Lang. */\nexport function detectLang(fenceInfo: string): Lang {\n const tag = fenceInfo.trim().toLowerCase().split(/\\s+/)[0] ?? '';\n return LANG_ALIASES[tag] ?? 'plain';\n}\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\nexport function 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\n/**\n * Extract visual widths from a separator row (e.g., \"|------|--------|\").\n * Counts dash characters as the minimum width for each column.\n * Returns null for cells that don't look like valid separators.\n */\nfunction parseSeparatorWidths(sepCells: string[]): (number | null)[] {\n return sepCells.map((cell) => {\n const trimmed = cell.trim();\n // Must be dashes only (possibly with colons for alignment).\n const dashes = trimmed.replace(/:/g, '');\n if (/^-+$/.test(dashes)) return dashes.length;\n return null;\n });\n}\n\nexport function 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 // Parse separator widths to use as minimum column widths.\n const sepWidths = parseSeparatorWidths(sepCells);\n const widths = computeWidths([header, ...dataRows], cols, maxWidth, sepWidths);\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(\n allRows: string[][],\n cols: number,\n maxWidth: number,\n sepWidths?: (number | null)[],\n): 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); // visual width of the longest word in this cell\n const total = strWidth(cell); // visual width of the entire cell content\n // Ensure the column is at least wide enough for the longest word,\n // and at least wide enough for the full cell content.\n natural[c] = Math.max(natural[c]!, w, total);\n }\n }\n // Apply separator widths as minimums (markdown separator defines column widths).\n if (sepWidths) {\n for (let c = 0; c < cols && c < sepWidths.length; c++) {\n const sepW = sepWidths[c];\n if (sepW != null) {\n natural[c] = Math.max(natural[c]!, sepW);\n }\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\n/**\n * Return the number of terminal columns a string occupies.\n * Uses East Asian Width property to determine character widths:\n * - Emoji (U+1F000+ and various other emoji blocks) count as 2 columns.\n * - Full-width (F) and Wide (W) characters count as 2 columns.\n * - ASCII printable characters count as 1.\n * - Control characters count as 0.\n */\nexport function strWidth(s: string): number {\n let width = 0;\n for (const cp of s) {\n const code = cp.codePointAt(0)!;\n // Control characters: no width\n if (code < 0x20 || (code >= 0x7f && code < 0xa0)) {\n continue;\n }\n // Emoji: Most emoji render as double-width in terminals.\n // Modern emoji are in U+1F000+ or various other blocks.\n if (\n code >= 0x1f000 || // Supplementary Pictographs (U+1F000-U+1FFFF)\n (code >= 0x2600 && code <= 0x27bf) || // Miscellaneous Symbols, Dingbats\n (code >= 0x2300 && code <= 0x23ff) || // Miscellaneous Technical\n (code >= 0x2b50 && code <= 0x2b55) || // Stars and similar\n (code >= 0x2934 && code <= 0x2935) || // Arrow forms\n (code >= 0x2190 && code <= 0x21ff) || // Arrows\n (code >= 0x25a0 && code <= 0x25ff) || // Geometric Shapes\n (code >= 0x25c0 && code <= 0x25fe) || // More Geometric Shapes (includes ▶)\n (code >= 0x2700 && code <= 0x27bf) // Dingbats (includes ✅ ❌)\n ) {\n width += 2;\n continue;\n }\n // East Asian Width: Wide characters take 2 columns.\n // CJK Unified Ideographs, Hiragana, Katakana, Hangul, etc.\n if (\n (code >= 0x1100 && code <= 0x115f) || // Hangul Jamo\n code === 0x2329 || // LEFT-POINTING ANGLE BRACKET\n code === 0x232a || // RIGHT-POINTING ANGLE BRACKET\n (code >= 0x2e80 && code <= 0x303e) || // CJK Radicals Supplement\n (code >= 0x3040 && code <= 0xa4cf) || // Hiragana, Katakana, CJK\n (code >= 0xac00 && code <= 0xd7a3) || // Hangul Syllables\n (code >= 0xf900 && code <= 0xfaf9) || // CJK Compatibility Ideographs\n (code >= 0xfe10 && code <= 0xfe1f) || // Vertical forms\n (code >= 0xfe30 && code <= 0xfe6f) || // CJK Compatibility Forms\n (code >= 0xff00 && code <= 0xff60) || // Fullwidth Forms\n (code >= 0xffe0 && code <= 0xffe6) || // Halfwidth and Fullwidth Forms\n (code >= 0x20000 && code <= 0x2fffd) || // CJK Extension B+\n (code >= 0x30000 && code <= 0x3fffd) // CJK Extension F+\n ) {\n width += 2;\n continue;\n }\n // ASCII and most other printable characters: 1 column\n width += 1;\n }\n return width;\n}\n\nfunction longestWord(s: string): number {\n let max = 0;\n for (const w of s.split(/\\s+/)) {\n const visualWidth = strWidth(w);\n if (visualWidth > max) max = visualWidth;\n }\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 (strWidth(text) <= 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 let curWidth = 0;\n for (const word of words) {\n if (!word) continue;\n const wordWidth = strWidth(word);\n if (curWidth + wordWidth <= width) {\n cur += word;\n curWidth += wordWidth;\n continue;\n }\n if (cur) {\n out.push(padVisual(cur, width));\n cur = '';\n curWidth = 0;\n }\n if (wordWidth > width) {\n // Hard-break a word longer than the column — slice by visual width.\n let rest = word;\n let restWidth = wordWidth;\n while (restWidth > width) {\n // Collect characters until we reach `width` visual columns.\n let collected = '';\n let collectedWidth = 0;\n for (const cp of rest) {\n const cpWidth = strWidth(cp);\n if (collectedWidth + cpWidth > width) break;\n collected += cp;\n collectedWidth += cpWidth;\n }\n out.push(padVisual(collected, width));\n rest = rest.slice([...collected].join('').length);\n restWidth = strWidth(rest);\n }\n cur = rest;\n curWidth = strWidth(rest);\n } else if (!/^\\s+$/.test(word)) {\n cur = word;\n curWidth = wordWidth;\n }\n }\n if (cur) out.push(padVisual(cur, width));\n return out.length === 0 ? [''] : out;\n}\n\n/** Pad a string to a target visual width using spaces. */\nfunction padVisual(text: string, targetWidth: number): string {\n const w = strWidth(text);\n if (w >= targetWidth) {\n // Truncate to targetWidth visual columns, iterating code points.\n let taken = 0;\n let endIdx = 0;\n for (const cp of text) {\n const cpw = strWidth(cp);\n if (taken + cpw > targetWidth) break;\n taken += cpw;\n endIdx += [...cp].join('').length;\n }\n return text.slice(0, endIdx);\n }\n return text + ' '.repeat(targetWidth - w);\n}\n\nfunction padCell(text: string, width: number, align: Align): string {\n const visualLen = strWidth(text);\n // Pad (or truncate) text so its visual width equals `width`.\n // This matches how `border` creates `─`.repeat(width + 2) dashes,\n // which gives a visual content width of `width` columns.\n let displayText = text;\n if (visualLen > width) {\n // Truncate to visual width — iterate code points, stop when we'd exceed target.\n let takenWidth = 0;\n let endIdx = 0;\n for (const cp of text) {\n const cpWidth = strWidth(cp);\n if (takenWidth + cpWidth > width) break;\n takenWidth += cpWidth;\n endIdx += [...cp].join('').length;\n }\n displayText = text.slice(0, endIdx);\n }\n const pad = width - strWidth(displayText);\n if (align === 'right') return ' '.repeat(pad) + displayText;\n if (align === 'center') {\n const l = Math.floor(pad / 2);\n return ' '.repeat(l) + displayText + ' '.repeat(pad - l);\n }\n return displayText + ' '.repeat(pad);\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\nimport { detectTable, renderTable } from './markdown-table.js';\nimport { theme } from './theme.js';\n\n// Lightweight markdown renderer for assistant prose. Handles inline emphasis\n// (**bold**, *italic*, `code`, ~~strike~~) plus block constructs (ATX headings,\n// bullet / numbered lists, blockquotes) and defers GitHub tables to the\n// existing box-drawing table renderer. Fenced code blocks are handled upstream\n// by AssistantBody before this sees the text.\n//\n// Like the syntax highlighter, emphasis is expressed as Ink <Text> props\n// (bold/italic/color), never raw ANSI, so width measurement stays correct.\n\nexport interface InlineToken {\n text: string;\n bold?: boolean;\n italic?: boolean;\n code?: boolean;\n strike?: boolean;\n}\n\n/**\n * Parse one line of prose into inline-emphasis tokens. Markers are stripped\n * (this is display text, not length-preserving). `_..._` is intentionally NOT\n * treated as italic so snake_case / file_names aren't mangled. An unterminated\n * marker is emitted literally so no text is ever lost.\n */\nexport function parseInline(text: string): InlineToken[] {\n const tokens: InlineToken[] = [];\n let plain = '';\n let i = 0;\n const flush = () => {\n if (plain) {\n tokens.push({ text: plain });\n plain = '';\n }\n };\n while (i < text.length) {\n const ch = text[i] ?? '';\n const two = text.slice(i, i + 2);\n\n // `inline code` — highest precedence, no inner parsing.\n if (ch === '`') {\n const close = text.indexOf('`', i + 1);\n if (close > i) {\n flush();\n tokens.push({ text: text.slice(i + 1, close), code: true });\n i = close + 1;\n continue;\n }\n }\n // **bold**\n if (two === '**') {\n const close = text.indexOf('**', i + 2);\n if (close > i) {\n flush();\n tokens.push({ text: text.slice(i + 2, close), bold: true });\n i = close + 2;\n continue;\n }\n }\n // ~~strike~~\n if (two === '~~') {\n const close = text.indexOf('~~', i + 2);\n if (close > i) {\n flush();\n tokens.push({ text: text.slice(i + 2, close), strike: true });\n i = close + 2;\n continue;\n }\n }\n // *italic* — single asterisk only (the `**` case is handled above).\n if (ch === '*' && text[i + 1] !== '*') {\n const close = text.indexOf('*', i + 1);\n if (close > i + 1) {\n flush();\n tokens.push({ text: text.slice(i + 1, close), italic: true });\n i = close + 1;\n continue;\n }\n }\n plain += ch;\n i += 1;\n }\n flush();\n return tokens;\n}\n\nfunction InlineLine({ tokens, dim }: { tokens: InlineToken[]; dim?: boolean }): React.ReactElement {\n if (tokens.length === 0) return <Text> </Text>;\n return (\n <Text>\n {tokens.map((t, j) => (\n <Text\n // biome-ignore lint/suspicious/noArrayIndexKey: token order is stable per line\n key={j}\n color={t.code ? theme.accent : 'white'}\n bold={t.bold}\n italic={t.italic}\n strikethrough={t.strike}\n dimColor={dim}\n >\n {t.text}\n </Text>\n ))}\n </Text>\n );\n}\n\nconst HEADING_RE = /^(#{1,6})\\s+(.*)$/;\nconst BULLET_RE = /^(\\s*)[-*+]\\s+(.*)$/;\nconst NUMBERED_RE = /^(\\s*)(\\d+)\\.\\s+(.*)$/;\nconst QUOTE_RE = /^>\\s?(.*)$/;\n\n/**\n * Render assistant prose with markdown emphasis + block formatting. Tables are\n * routed through the existing box-drawing renderer; everything else is parsed\n * line-by-line.\n *\n * `contentWidth` is the real inner width of the panel that wraps this view\n * (the assistant entry's left-border + paddingLeft). When provided, tables\n * are sized against it so they don't overflow the panel; otherwise we fall\n * back to `termWidth`, which is correct for callers without a bordered\n * container. Non-table prose is unaffected — Ink handles its soft wrap.\n */\nexport function MarkdownView({\n text,\n termWidth,\n contentWidth,\n}: {\n text: string;\n termWidth: number;\n /** Real inner width of the surrounding panel. Defaults to `termWidth`. */\n contentWidth?: number;\n}): React.ReactElement {\n const lines = text.split('\\n');\n const rows: React.ReactNode[] = [];\n let i = 0;\n let key = 0;\n // Tables are the only width-sensitive path here; size them to the real\n // content area so a 2-col-chrome border (assistant panel) doesn't push\n // the last cell off the right edge and force an Ink wrap.\n const tableBudget = Math.max(20, contentWidth ?? termWidth);\n while (i < lines.length) {\n // GitHub table block → existing renderer.\n const tableEnd = detectTable(lines, i);\n if (tableEnd > i) {\n rows.push(\n <Text key={`t${key++}`}>{renderTable(lines.slice(i, tableEnd), tableBudget)}</Text>,\n );\n i = tableEnd;\n continue;\n }\n const line = lines[i] ?? '';\n i += 1;\n\n const heading = line.match(HEADING_RE);\n if (heading) {\n rows.push(\n <Text key={`h${key++}`} bold color={theme.accent}>\n {heading[2] ?? ''}\n </Text>,\n );\n continue;\n }\n const quote = line.match(QUOTE_RE);\n if (quote && line.startsWith('>')) {\n rows.push(\n <Box key={`q${key++}`} flexDirection=\"row\">\n <Text dimColor>{' '}</Text>\n <InlineLine tokens={parseInline(quote[1] ?? '')} dim />\n </Box>,\n );\n continue;\n }\n const bullet = line.match(BULLET_RE);\n if (bullet) {\n rows.push(\n <Box key={`b${key++}`} flexDirection=\"row\">\n <Text color={theme.accent}>{`${bullet[1] ?? ''}• `}</Text>\n <InlineLine tokens={parseInline(bullet[2] ?? '')} />\n </Box>,\n );\n continue;\n }\n const numbered = line.match(NUMBERED_RE);\n if (numbered) {\n rows.push(\n <Box key={`n${key++}`} flexDirection=\"row\">\n <Text color={theme.accent}>{`${numbered[1] ?? ''}${numbered[2]}. `}</Text>\n <InlineLine tokens={parseInline(numbered[3] ?? '')} />\n </Box>,\n );\n continue;\n }\n rows.push(<InlineLine key={`p${key++}`} tokens={parseInline(line)} />);\n }\n return <Box flexDirection=\"column\">{rows}</Box>;\n}\n","import { Box, Static, Text, useStdout } from 'ink';\nimport React, { useEffect, useState } from 'react';\nimport { type HLState, type Lang, detectLang, highlightLine } from '../highlight.js';\nimport { MarkdownView } from '../markdown.js';\nimport { theme } from '../theme.js';\n\nexport type HistoryEntry =\n | { id: number; kind: 'user'; text: string; queued?: boolean; pasteContent?: string }\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: 'brain';\n status: 'thinking' | 'answered' | 'ask_human' | 'denied';\n source: string;\n risk: 'low' | 'medium' | 'high' | 'critical';\n question: string;\n decision?: string;\n rationale?: string;\n }\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\n/**\n * Horizontal columns consumed by every bordered message panel in this\n * file (the user / assistant / warn / error cases below). 1 column for\n * the left-border glyph + 1 column for `paddingLeft={1}`. Width-sensitive\n * renderers in the panel body (notably the markdown table renderer) must\n * budget against `termWidth - MESSAGE_PANEL_CHROME_WIDTH`, otherwise they\n * lay out for the full terminal width and Ink wraps the last cell at the\n * right edge, producing a 2-column shift / extra row.\n *\n * Exported so the regression test can assert against the same number the\n * Entry uses — drift between the two would silently re-introduce the bug.\n */\nexport const MESSAGE_PANEL_CHROME_WIDTH = 2;\n\n/**\n * Compute the real inner content width of an assistant panel. Pulled out\n * as a named helper so the formula lives in exactly one place: both the\n * Entry render and the regression test import this, so a future change\n * to the chrome model (e.g. adding paddingRight) only has to be made\n * here and both sides stay in lockstep.\n */\nexport function assistantContentWidth(termWidth: number): number {\n return Math.max(20, termWidth - MESSAGE_PANEL_CHROME_WIDTH);\n}\n\nexport function History({ entries, streamingText, toolStream }: HistoryProps): React.ReactElement {\n const { stdout } = useStdout();\n // Track terminal dimensions imperatively so that every resize triggers a\n // re-render. We snapshot into state rather than deriving directly from\n // useStdout because Static children receive `termWidth` as a prop — if\n // the parent doesn't re-render on resize, the stale value gets baked\n // into committed scrollback entries. This ensures Entry components in\n // both Static (committed) and live-streaming regions use the current\n // width for table wrapping etc.\n const [termSize, setTermSize] = useState({\n columns: stdout?.columns ?? 80,\n rows: stdout?.rows ?? 24,\n });\n useEffect(() => {\n const handleResize = () => {\n setTermSize({ columns: stdout?.columns ?? 80, rows: stdout?.rows ?? 24 });\n };\n process.stdout.on('resize', handleResize);\n return () => {\n process.stdout.off('resize', handleResize);\n };\n }, [stdout]);\n const termWidth = termSize.columns;\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 ? <AssistantTail text={tail} /> : 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\n/**\n * The live \"ASSISTANT: (streaming...)\" tail shown below committed history\n * while a response streams in. Extracted so both the legacy `<Static>` History\n * and the scrollable viewport render an identical tail.\n */\nexport function AssistantTail({ text }: { text: string }): React.ReactElement {\n return (\n <Box\n flexDirection=\"column\"\n marginY={1}\n borderStyle=\"single\"\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderColor={theme.assistant}\n paddingLeft={1}\n >\n <Box flexDirection=\"row\">\n <Text bold color={theme.assistant}>\n {'ASSISTANT'}\n </Text>\n <Text dimColor>{' (streaming…)'}</Text>\n </Box>\n <Text color=\"white\">{text}</Text>\n </Box>\n );\n}\n\n/** Max code-block lines rendered before a \"+N more\" footer (mirrors ToolStreamBox). */\nconst MAX_CODE_LINES = 80;\n\nexport interface BodySegment {\n type: 'prose' | 'code';\n text: string;\n lang?: Lang;\n}\n\n/**\n * Split assistant text into prose and ```fenced``` code segments, in order.\n * Pure + testable. An unterminated fence treats the remainder as code.\n */\nexport function splitFencedBlocks(text: string): BodySegment[] {\n const lines = text.split('\\n');\n const segs: BodySegment[] = [];\n let prose: string[] = [];\n let code: string[] | null = null;\n let lang: Lang = 'plain';\n const flushProse = () => {\n if (prose.length > 0) {\n segs.push({ type: 'prose', text: prose.join('\\n') });\n prose = [];\n }\n };\n for (const line of lines) {\n const fence = line.match(/^\\s*```(.*)$/);\n if (fence) {\n if (code === null) {\n flushProse();\n code = [];\n lang = detectLang(fence[1] ?? '');\n } else {\n segs.push({ type: 'code', text: code.join('\\n'), lang });\n code = null;\n lang = 'plain';\n }\n continue;\n }\n if (code !== null) code.push(line);\n else prose.push(line);\n }\n if (code !== null) segs.push({ type: 'code', text: code.join('\\n'), lang });\n flushProse();\n return segs;\n}\n\n/** Syntax-highlighted, framed code block. Each line is a row of <Text color>\n * segments (never raw ANSI), so Ink measures width by visible glyphs. */\nfunction CodeBlock({\n code,\n lang,\n contentWidth,\n}: { code: string; lang: Lang; contentWidth: number }): React.ReactElement {\n let lines = code.replace(/\\n+$/, '').split('\\n');\n const hidden = Math.max(0, lines.length - MAX_CODE_LINES);\n if (hidden > 0) lines = lines.slice(0, MAX_CODE_LINES);\n const gutterW = String(lines.length).length;\n // Reserve room for the border (1+1), paddingX (1+1), and the line-number\n // gutter so long lines truncate instead of wrapping out of the frame.\n // CodeBlock is already inside a panel with marginLeft=2, so we only subtract\n // its own chrome (border+paddingX = 4 chars) + gutter + 1 space.\n const maxW = Math.max(20, Math.min(contentWidth - 6 - gutterW - 1, 120));\n let carry: HLState = {};\n const rows = lines.map((raw) => {\n const display = raw.length > maxW ? `${raw.slice(0, maxW - 1)}…` : raw;\n const r = highlightLine(display, lang, carry);\n carry = r.carry;\n return r.tokens;\n });\n return (\n <Box\n flexDirection=\"column\"\n marginLeft={2}\n marginY={0}\n borderStyle=\"round\"\n borderColor={theme.borderDefault}\n paddingX={1}\n >\n {lang !== 'plain' ? <Text dimColor>{lang}</Text> : null}\n {rows.map((tokens, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: code lines are positional\n <Text key={i}>\n <Text dimColor>{`${String(i + 1).padStart(gutterW, ' ')} `}</Text>\n {tokens.length === 0\n ? ' '\n : tokens.map((t, j) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: token order is stable per line\n <Text key={j} color={t.color} dimColor={t.dim} bold={t.bold}>\n {t.text}\n </Text>\n ))}\n </Text>\n ))}\n {hidden > 0 ? (\n <Text dimColor italic>{`… +${hidden} more line${hidden === 1 ? '' : 's'}`}</Text>\n ) : null}\n </Box>\n );\n}\n\n/** Assistant message body: prose (with markdown tables) interleaved with\n * highlighted code blocks.\n *\n * - `contentWidth` is the real inner width of the surrounding panel. It is\n * forwarded to both `MarkdownView` (for tables) and `CodeBlock` (for line\n * truncation) so neither overflows the panel and forces Ink to wrap the\n * last cell at the right edge — a 2-column shift / extra row.\n * Optional, defaults to `termWidth`, so `AssistantBody` is still safe to\n * call from contexts without a bordered panel.\n */\nexport function AssistantBody({\n text,\n termWidth,\n contentWidth,\n}: {\n text: string;\n termWidth: number;\n /** Real inner width of the surrounding panel. Defaults to `termWidth`. */\n contentWidth?: number;\n}): React.ReactElement {\n const segments = splitFencedBlocks(text);\n const inner = contentWidth ?? termWidth;\n return (\n <Box flexDirection=\"column\">\n {segments.map((seg, i) =>\n seg.type === 'code' ? (\n // biome-ignore lint/suspicious/noArrayIndexKey: segment order is stable\n <CodeBlock key={i} code={seg.text} lang={seg.lang ?? 'plain'} contentWidth={inner} />\n ) : (\n // biome-ignore lint/suspicious/noArrayIndexKey: segment order is stable\n <MarkdownView key={i} text={seg.text} termWidth={inner} />\n ),\n )}\n </Box>\n );\n}\n\nexport const 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 */\nexport const ToolStreamBox = React.memo(function 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={theme.warn}>◆ </Text>\n <Text bold color={theme.tool}>\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' ? theme.diffAddBg : theme.diffDelBg;\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 brainStatusStyle(status: Extract<HistoryEntry, { kind: 'brain' }>['status']): {\n icon: string;\n color: string;\n} {\n switch (status) {\n case 'thinking':\n return { icon: '…', color: 'magenta' };\n case 'answered':\n return { icon: '⚖', color: 'cyan' };\n case 'ask_human':\n return { icon: '?', color: 'yellow' };\n case 'denied':\n return { icon: '×', color: 'red' };\n }\n}\n\nfunction brainRiskColor(risk: Extract<HistoryEntry, { kind: 'brain' }>['risk']): string {\n switch (risk) {\n case 'low':\n return 'green';\n case 'medium':\n return 'cyan';\n case 'high':\n return 'yellow';\n case 'critical':\n return 'red';\n }\n}\n\nexport const Entry = React.memo(function Entry({\n entry,\n termWidth,\n}: { entry: HistoryEntry; termWidth: number }): React.ReactElement {\n switch (entry.kind) {\n case 'user':\n return (\n <Box\n borderStyle=\"single\"\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderColor={theme.user}\n paddingLeft={1}\n >\n <Text>\n <Text bold color={theme.user}>\n {'USER '}\n </Text>\n <Text color=\"white\">{entry.text}</Text>\n {entry.queued ? <Text dimColor>{' (queued)'}</Text> : null}\n {entry.pasteContent ? (\n <>\n {entry.text ? '\\n' : null}\n <Text dimColor>\n {' ↳ '}\n {entry.pasteContent}\n </Text>\n </>\n ) : null}\n </Text>\n </Box>\n );\n case 'assistant': {\n // Subtract the panel's left-border + paddingLeft chrome from the\n // terminal width so the body lays out inside the box, not against\n // the full terminal. Tables in particular will overflow otherwise\n // (see assistantContentWidth).\n const contentWidth = assistantContentWidth(termWidth);\n return (\n <Box\n flexDirection=\"column\"\n marginY={1}\n borderStyle=\"single\"\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderColor={theme.assistant}\n paddingLeft={1}\n >\n <Box flexDirection=\"row\">\n <Text bold color={theme.assistant}>\n {'ASSISTANT'}\n </Text>\n </Box>\n <AssistantBody text={entry.text} termWidth={termWidth} contentWidth={contentWidth} />\n </Box>\n );\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 ? theme.success : theme.error}>{entry.ok ? '●' : '✗'}</Text>{' '}\n <Text bold color={theme.tool}>\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 (\n <Box\n borderStyle=\"single\"\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderColor={theme.warn}\n paddingLeft={1}\n >\n <Text color={theme.warn}>{entry.text}</Text>\n </Box>\n );\n case 'error':\n return (\n <Box\n borderStyle=\"single\"\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderColor={theme.error}\n paddingLeft={1}\n >\n <Text color={theme.error}>{entry.text}</Text>\n </Box>\n );\n case 'turn-summary':\n return <Text dimColor>{entry.text}</Text>;\n case 'brain': {\n const statusStyle = brainStatusStyle(entry.status);\n const riskColor = brainRiskColor(entry.risk);\n return (\n <Box\n flexDirection=\"column\"\n marginY={1}\n borderStyle=\"single\"\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderColor=\"magenta\"\n paddingLeft={1}\n >\n <Box flexDirection=\"row\" gap={1}>\n <Text bold color=\"magenta\">\n BRAIN\n </Text>\n <Text color={statusStyle.color}>{statusStyle.icon}</Text>\n <Text dimColor>{entry.source}</Text>\n <Text dimColor>·</Text>\n <Text color={riskColor}>{entry.risk}</Text>\n </Box>\n <Text color=\"white\">{entry.question}</Text>\n {entry.decision ? (\n <Text>\n <Text dimColor>Decision: </Text>\n <Text color={statusStyle.color}>{entry.decision}</Text>\n </Text>\n ) : null}\n {entry.rationale ? <Text dimColor>{entry.rationale}</Text> : null}\n </Box>\n );\n }\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\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n marginY={1}\n >\n <Text bold color=\"yellow\">\n ⚠ Confirm: {entry.toolName}\n </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","/**\n * Function-key decoding for raw terminal input.\n *\n * Ink's `useInput` does not decode F1–F12, so the Input component catches the\n * raw escape sequences from stdin (the same mechanism it uses for Home/End)\n * and turns them into a `KeyEvent.fn` number. F-keys are terminal-safe aliases\n * for chords some terminals intercept before the app sees them — most notably\n * Windows Terminal, which binds Ctrl+F to \"Find\".\n *\n * Kept in its own pure, dependency-free module so it can be unit-tested without\n * importing the Ink/React component tree.\n */\n\n/**\n * Map a raw terminal escape sequence to a plain function-key number (1–12),\n * or null when it isn't a plain F-key. Covers both the SS3 form (xterm F1–F4,\n * `ESC O P..S`) and the CSI `~` form used by F1–F12 across most terminals.\n * Modifier-augmented variants (Shift+F2 = `ESC [ 1 ; 2 Q`, etc.) are ignored.\n */\nexport function fnKey(data: string): number | null {\n switch (data) {\n case '\\x1bOP':\n case '\\x1b[11~':\n return 1;\n case '\\x1bOQ':\n case '\\x1b[12~':\n return 2;\n case '\\x1bOR':\n case '\\x1b[13~':\n return 3;\n case '\\x1bOS':\n case '\\x1b[14~':\n return 4;\n case '\\x1b[15~':\n return 5;\n case '\\x1b[17~':\n return 6;\n case '\\x1b[18~':\n return 7;\n case '\\x1b[19~':\n return 8;\n case '\\x1b[20~':\n return 9;\n case '\\x1b[21~':\n return 10;\n case '\\x1b[23~':\n return 11;\n case '\\x1b[24~':\n return 12;\n default:\n return null;\n }\n}\n","/**\n * Inline attachment chip token grammar, shared by the editable input for chip\n * rendering and whole-token cursor deletion. Kept in sync with the\n * AttachmentStore placeholder regex in @wrongstack/core. Two shapes:\n * - seq-keyed `[pasted|image|file #N …]` (a cosmetic suffix after the seq,\n * e.g. `, 123 lines`, is tolerated; legacy `[file #N]` is included)\n * - path-keyed `[file:<path>]`\n */\nexport const INLINE_TOKEN_SRC = '\\\\[(?:pasted|image|file) #\\\\d+[^\\\\]]*\\\\]|\\\\[file:[^\\\\]]+\\\\]';\n\nconst AT_END = new RegExp(`(?:${INLINE_TOKEN_SRC})$`);\nconst AT_START = new RegExp(`^(?:${INLINE_TOKEN_SRC})`);\nconst GLOBAL = new RegExp(INLINE_TOKEN_SRC, 'g');\n\n/**\n * If a whole chip ends immediately before `cursor`, return the buffer and\n * cursor with that chip removed (so one backspace deletes the entire token,\n * anywhere in the line). Returns null when there's no chip there — the caller\n * falls back to a single-character delete.\n */\nexport function deleteTokenBackward(\n buffer: string,\n cursor: number,\n): { buffer: string; cursor: number } | null {\n const m = buffer.slice(0, cursor).match(AT_END);\n if (!m) return null;\n const start = cursor - m[0].length;\n return { buffer: buffer.slice(0, start) + buffer.slice(cursor), cursor: start };\n}\n\n/**\n * Length of a chip that starts exactly at `cursor`, or 0 if none — lets a\n * forward delete drop the whole token in one keystroke.\n */\nexport function tokenLengthForward(buffer: string, cursor: number): number {\n const m = buffer.slice(cursor).match(AT_START);\n return m ? m[0].length : 0;\n}\n\nexport interface ChipSpan {\n text: string;\n /** True for an attachment chip token, false for a plain run. */\n chip: boolean;\n}\n\n/** Split a string into chip / plain spans for styled rendering. */\nexport function splitChips(text: string): ChipSpan[] {\n if (!text) return [];\n const spans: ChipSpan[] = [];\n let last = 0;\n for (const m of text.matchAll(GLOBAL)) {\n const idx = m.index ?? 0;\n if (idx > last) spans.push({ text: text.slice(last, idx), chip: false });\n spans.push({ text: m[0], chip: true });\n last = idx + m[0].length;\n }\n if (last < text.length) spans.push({ text: text.slice(last), chip: false });\n return spans;\n}\n\n/** One rendered cell of the input row. Exactly one of chip/prompt/cursor may be true. */\nexport interface InputCell {\n ch: string;\n /** Inside an attachment chip token. */\n chip: boolean;\n /** Part of the leading prompt (e.g. \"› \"). */\n prompt: boolean;\n /** The single cursor cell (rendered inverse). */\n cursor: boolean;\n}\n\n/**\n * Lay out `prompt + value` into wrapped rows of at most `width` columns, so the\n * input area can grow to exactly the number of visual lines its content needs.\n * Char-wrap (not word-wrap) keeps every cell index aligned with the buffer, so\n * the cursor lands on the right row/column. A cursor at end-of-buffer gets a\n * virtual trailing space cell (which may spill onto a fresh row, exactly like a\n * terminal). Newlines in `value` start a new row.\n */\nexport function layoutInputRows(\n prompt: string,\n value: string,\n cursor: number,\n width: number,\n): InputCell[][] {\n const w = Math.max(1, Math.floor(width));\n // Mark which value-character offsets fall inside a chip token.\n const chipAt = new Array<boolean>(value.length).fill(false);\n let off = 0;\n for (const span of splitChips(value)) {\n if (span.chip) for (let i = 0; i < span.text.length; i++) chipAt[off + i] = true;\n off += span.text.length;\n }\n const cursorIdx = prompt.length + Math.max(0, Math.min(cursor, value.length));\n const cells: InputCell[] = [];\n for (let i = 0; i < prompt.length; i++) {\n cells.push({ ch: prompt[i] as string, chip: false, prompt: true, cursor: false });\n }\n for (let i = 0; i < value.length; i++) {\n cells.push({ ch: value[i] as string, chip: chipAt[i] === true, prompt: false, cursor: false });\n }\n if (cursorIdx >= cells.length) {\n cells.push({ ch: ' ', chip: false, prompt: false, cursor: true });\n } else {\n (cells[cursorIdx] as InputCell).cursor = true;\n }\n // Wrap into rows: break on explicit '\\n' (consumed) or when a row fills `w`.\n const rows: InputCell[][] = [];\n let row: InputCell[] = [];\n for (const cell of cells) {\n if (cell.ch === '\\n') {\n rows.push(row);\n row = [];\n continue;\n }\n row.push(cell);\n if (row.length >= w) {\n rows.push(row);\n row = [];\n }\n }\n if (row.length > 0 || rows.length === 0) rows.push(row);\n return rows;\n}\n\n/**\n * Inverse of {@link layoutInputRows} for mouse clicks: given a click at visual\n * `(row, col)` (both 0-based; col is the column WITHIN the input area, i.e. the\n * prompt occupies the first columns of row 0), return the buffer cursor index\n * to place the caret. Mirrors layoutInputRows' wrapping exactly so the mapping\n * matches what's on screen. Clicking the prompt → start of buffer; clicking\n * past a row's last character → just after it; clicking below all rows → end of\n * buffer. Exported for the TUI input-click handler and unit tests.\n */\nexport function inputIndexAtRowCol(\n prompt: string,\n value: string,\n width: number,\n row: number,\n col: number,\n): number {\n const w = Math.max(1, Math.floor(width));\n // Flat cells: prompt (buf = -1) then value (buf = its index). Newlines are\n // consumed as row breaks, exactly like layoutInputRows.\n const flat: Array<{ ch: string; buf: number }> = [];\n for (let i = 0; i < prompt.length; i++) flat.push({ ch: prompt[i] as string, buf: -1 });\n for (let i = 0; i < value.length; i++) flat.push({ ch: value[i] as string, buf: i });\n\n const rows: Array<{ buf: number }[]> = [];\n const starts: number[] = []; // value index where each row's content begins\n let cur: Array<{ buf: number }> = [];\n let curStart = 0;\n for (const cell of flat) {\n if (cell.ch === '\\n') {\n rows.push(cur);\n starts.push(curStart);\n cur = [];\n curStart = cell.buf + 1; // content after the newline\n continue;\n }\n if (cur.length === 0 && cell.buf >= 0) curStart = cell.buf;\n cur.push({ buf: cell.buf });\n if (cur.length >= w) {\n rows.push(cur);\n starts.push(curStart);\n cur = [];\n curStart = -1; // set by the next pushed cell (or stays for a trailing newline)\n }\n }\n if (cur.length > 0 || rows.length === 0) {\n rows.push(cur);\n starts.push(curStart);\n }\n\n const clamp = (n: number) => Math.max(0, Math.min(value.length, n));\n if (row < 0) return 0;\n if (row >= rows.length) return value.length;\n const r = rows[row] as { buf: number }[];\n const c = Math.max(0, col);\n if (c < r.length) {\n const b = (r[c] as { buf: number }).buf;\n return b < 0 ? 0 : clamp(b); // prompt cell → start of value\n }\n // Past the last visible cell: place after the row's last value char…\n for (let k = r.length - 1; k >= 0; k--) {\n const b = (r[k] as { buf: number }).buf;\n if (b >= 0) return clamp(b + 1);\n }\n // …or, for an empty / prompt-only row, at the row's start offset.\n const start = starts[row];\n return clamp(start !== undefined && start >= 0 ? start : value.length);\n}\n","import { Box, Text, useInput, useStdin, useStdout } from 'ink';\nimport type React from 'react';\nimport { useEffect, useState } from 'react';\nimport { fnKey } from '../fn-keys.js';\nimport { type InputCell, layoutInputRows } from '../input-tokens.js';\n\nexport interface InputProps {\n prompt?: string;\n value: string;\n cursor: number;\n disabled?: boolean;\n hint?: string;\n onKey: (input: string, key: KeyEvent) => void;\n}\n\n/**\n * Render one wrapped row of input cells into styled `<Text>` spans. Consecutive\n * cells with the same style are coalesced into a single span; the cursor cell is\n * always emitted on its own (inverse). `promptColor` styles the leading prompt.\n */\nfunction renderRow(cells: InputCell[], rowKey: string, promptColor: string): React.ReactNode[] {\n const out: React.ReactNode[] = [];\n let run = '';\n let runStart = 0;\n let runStyle: 'prompt' | 'chip' | 'plain' | null = null;\n const flush = (end: number) => {\n if (run === '' || runStyle === null) return;\n const key = `${rowKey}-${runStart}`;\n if (runStyle === 'prompt')\n out.push(\n <Text key={key} color={promptColor}>\n {run}\n </Text>,\n );\n else if (runStyle === 'chip')\n out.push(\n <Text key={key} color=\"cyan\" dimColor>\n {run}\n </Text>,\n );\n else out.push(<Text key={key}>{run}</Text>);\n run = '';\n runStart = end;\n };\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i] as InputCell;\n if (cell.cursor) {\n flush(i);\n out.push(\n <Text key={`${rowKey}-c${i}`} inverse>\n {cell.ch}\n </Text>,\n );\n runStart = i + 1;\n continue;\n }\n const style = cell.prompt ? 'prompt' : cell.chip ? 'chip' : 'plain';\n if (style !== runStyle) {\n flush(i);\n runStyle = style;\n runStart = i;\n }\n run += cell.ch;\n }\n flush(cells.length);\n return out;\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 /** Function-key number 1–12 when a plain F-key was pressed, else undefined.\n * Ink's useInput does not decode F-keys, so these are caught from raw stdin\n * (same mechanism as Home/End) and surfaced here. F-keys are terminal-safe\n * aliases for chords some terminals intercept (e.g. Windows Terminal eats\n * Ctrl+F for \"Find\"). */\n fn?: number;\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 (data === '\\x1b[H' || data === '\\x1b[1~' || data === '\\x1bOH' || data === '\\x1b[7~')\n return 'home';\n if (data === '\\x1b[F' || data === '\\x1b[4~' || data === '\\x1bOF' || data === '\\x1b[8~')\n return 'end';\n return null;\n}\n\nexport const 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 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 s = data.toString();\n const kind = isHomeEnd(s);\n if (kind === 'home') {\n onKey('', { ...EMPTY_KEY, home: true });\n return;\n }\n if (kind === 'end') {\n onKey('', { ...EMPTY_KEY, end: true });\n return;\n }\n const fn = fnKey(s);\n if (fn !== null) onKey('', { ...EMPTY_KEY, fn });\n };\n stdin.on('data', handleData);\n return () => {\n stdin.off('data', handleData);\n };\n }, [stdin, disabled, onKey]);\n\n // Track terminal width so the input wraps at the real column count and the\n // box grows to exactly the number of visual rows the content needs.\n const { stdout } = useStdout();\n const [cols, setCols] = useState(stdout?.columns ?? 80);\n useEffect(() => {\n if (!stdout) return;\n const onResize = () => setCols(stdout.columns ?? 80);\n onResize();\n stdout.on('resize', onResize);\n return () => {\n stdout.off('resize', onResize);\n };\n }, [stdout]);\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 // One <Text> per wrapped row: the column box's height becomes the row count,\n // so a long message that soft-wraps (or any embedded newlines) gives the\n // input area a correct, line-count-driven height instead of clipping or\n // overflowing. layoutInputRows keeps the cursor on the right row/column.\n const rows = layoutInputRows(prompt, value, cursor, cols);\n\n return (\n <Box flexDirection=\"column\">\n {rows.map((row, i) =>\n row.length === 0 ? (\n // biome-ignore lint/suspicious/noArrayIndexKey: rows are positional and re-laid out every render\n <Text key={i}> </Text> // keep blank lines one row tall\n ) : (\n // biome-ignore lint/suspicious/noArrayIndexKey: rows are positional and re-laid out every render\n <Text key={i}>{renderRow(row, `r${i}`, promptColor)}</Text>\n ),\n )}\n {hint ? <Text dimColor>{hint}</Text> : null}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\nimport { theme } from '../theme.js';\n\n/** Which interactive context is active — drives which shortcuts the bar shows.\n * Ordered by priority (a confirm prompt overrides a picker, etc.). */\nexport interface KeyHintContext {\n confirm?: boolean;\n picker?: boolean; // file / slash / model / autonomy picker, or rewind overlay\n monitor?: boolean; // any full-screen monitor overlay open\n managed?: boolean; // managed viewport active (in-app scroll)\n mouse?: boolean; // full mouse mode on\n}\n\nexport interface Hint {\n key: string;\n label: string;\n}\n\nexport function hintsFor(ctx: KeyHintContext): Hint[] {\n if (ctx.confirm) {\n return [\n { key: 'y', label: 'yes' },\n { key: 'n', label: 'no' },\n { key: 'a', label: 'always' },\n { key: 'd', label: 'deny' },\n ];\n }\n if (ctx.picker) {\n return [\n { key: '↑↓', label: 'move' },\n { key: '↵', label: 'select' },\n { key: 'Esc', label: 'cancel' },\n ...(ctx.mouse ? [{ key: 'click', label: 'pick' }] : []),\n ];\n }\n if (ctx.monitor) {\n return [\n { key: 'Esc', label: 'close' },\n { key: '^F', label: 'fleet' },\n { key: '^G', label: 'agents' },\n { key: '^T', label: 'worktrees' },\n ];\n }\n // Idle / chat.\n const base: Hint[] = [{ key: '?', label: 'help' }];\n if (ctx.managed) base.push({ key: 'PgUp/PgDn', label: 'scroll' });\n if (ctx.mouse) base.push({ key: 'wheel', label: 'scroll' }, { key: 'click', label: 'select' });\n base.push({ key: '^G', label: 'agents' }, { key: '^C', label: 'stop' });\n return base;\n}\n\n/**\n * Persistent one-line keybinding hint bar shown at the very bottom of the TUI,\n * like a status-line cheat sheet. Context-aware: surfaces the keys that matter\n * for whatever is on screen (confirm prompt → y/n/a/d, picker → ↑↓/↵, etc.).\n */\nexport function KeyHintBar({ context }: { context: KeyHintContext }): React.ReactElement {\n const hints = hintsFor(context);\n return (\n <Box flexDirection=\"row\" paddingX={1}>\n {hints.map((h, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: hints are positional + stable\n <Box key={i} flexDirection=\"row\" marginRight={2}>\n <Text color={theme.accent}>{h.key}</Text>\n <Text dimColor>{` ${h.label}`}</Text>\n </Box>\n ))}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport React from 'react';\nimport type { FleetEntry } from '../app.js';\nimport { theme } from '../theme.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)\n parts.push(fmtBytes(tool.outputBytes));\n if (typeof tool.outputLines === 'number' && tool.outputLines > 0)\n 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 const LiveActivityStrip = React.memo(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() ||\n (e.recentMessages ?? []).slice(-1).map(fmtRecentMessage).join('');\n return (\n <Box key={e.id} flexDirection=\"row\" gap={1}>\n <Text color={theme.accent}>●</Text>\n <Text>{e.name.slice(0, 14).padEnd(14)}</Text>\n <Text dimColor>·</Text>\n <Text color={e.currentTool ? theme.success : theme.warn}>{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 /** All model options for the current provider. */\n modelOptions: string[];\n /** Filtered/searched model options (may differ when searchQuery is active). */\n filteredOptions: string[];\n selected: number;\n pickedProviderId?: string;\n /** Current search query (step 2 only). */\n searchQuery?: string;\n /** Status hint (e.g. error from a failed switch attempt) shown at the bottom. */\n hint?: string;\n}\n\nconst MAX_VISIBLE = 10;\n\n/** Compute the visible window, keeping `selected` centered when possible. */\nfunction getVisibleWindow(selected: number, total: number): { start: number; end: number } {\n const half = Math.floor(MAX_VISIBLE / 2);\n let start = selected - half;\n let end = start + MAX_VISIBLE;\n if (start < 0) { start = 0; end = Math.min(total, MAX_VISIBLE); }\n if (end > total) { end = total; start = Math.max(0, end - MAX_VISIBLE); }\n return { start, end };\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 (type to filter).\n *\n * Driven entirely by props — App owns cursor state, key events, and search.\n */\nexport function ModelPicker({\n step,\n providerOptions,\n filteredOptions,\n selected,\n pickedProviderId,\n searchQuery,\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\n // ── Step 2: model picker with scroll window + search ───────────────────────\n const total = filteredOptions.length;\n const { start, end } = getVisibleWindow(selected, total);\n const visibleItems = filteredOptions.slice(start, end);\n\n const searchHint = searchQuery\n ? ` | filter:\"${searchQuery}\" → ${total} match${total === 1 ? '' : 'es'}`\n : total > MAX_VISIBLE\n ? ` (${total} models — type to filter)`\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 {searchHint}){' ━━'}\n </Text>\n <Text dimColor>↑/↓ navigate · Enter select · Esc back · Ctrl+C exit · type to filter</Text>\n {total === 0 ? (\n <Text dimColor>\n {searchQuery ? `(no models match \"${searchQuery}\")` : '(no models known for this provider)'}\n </Text>\n ) : (\n <>\n {start > 0 && (\n <Text dimColor>▲ {start} above</Text>\n )}\n {visibleItems.map((id, vi) => {\n const absoluteIndex = start + vi;\n return (\n <Text\n key={id}\n color={absoluteIndex === selected ? 'cyan' : undefined}\n inverse={absoluteIndex === selected}\n >\n {absoluteIndex === selected ? '› ' : ' '}\n {id}\n </Text>\n );\n })}\n {end < total && (\n <Text dimColor>▼ {total - end} below</Text>\n )}\n </>\n )}\n {hint ? <Text color=\"yellow\">{hint}</Text> : null}\n </Box>\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport type React from 'react';\n\nconst fmtElapsed = (ms: number): string => {\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n if (h > 0) return `${h}:${String(m % 60).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}`;\n if (m > 0) return `${m}:${String(s % 60).padStart(2, '0')}`;\n return `${s}s`;\n};\n\nexport interface PhaseMonitorProps {\n /** Per-phase state from the App reducer. */\n phases: Record<\n string,\n {\n name: string;\n status: string;\n completedTasks: number;\n totalTasks: number;\n startedAt?: number;\n }\n >;\n /** IDs of currently running phases. */\n runningPhaseIds: string[];\n /** Session-level elapsed ms. */\n elapsedMs: number;\n /** nowTick for elapsed time calculation. */\n nowTick: number;\n onClose: () => void;\n}\n\nconst PHASE_STATUS: Record<string, { icon: string; color: string; label: string }> = {\n pending: { icon: '⏳', color: 'gray', label: 'pending' },\n ready: { icon: '🔜', color: 'cyan', label: 'ready' },\n running: { icon: '▶', color: 'yellow', label: 'running' },\n paused: { icon: '⏸', color: 'magenta', label: 'paused' },\n completed: { icon: '✓', color: 'green', label: 'done' },\n failed: { icon: '✗', color: 'red', label: 'failed' },\n skipped: { icon: '⏭', color: 'gray', label: 'skipped' },\n};\n\nfunction fmtPhase(s: string): { icon: string; color: string; label: string } {\n return PHASE_STATUS[s] ?? { icon: '?', color: 'white', label: s };\n}\n\n/**\n * Full-screen PhaseMonitor overlay (Ctrl+P in TUI).\n *\n * Layout:\n * Header: project title + elapsed time + Ctrl+P to close\n * Per-phase rows:\n * · icon · name · status · (task progress) · started/elapsed\n * Bottom: keyboard hint\n */\nexport function PhaseMonitor({\n phases,\n runningPhaseIds,\n elapsedMs,\n nowTick,\n onClose,\n}: PhaseMonitorProps): React.ReactElement {\n useInput((_, key) => {\n if (key.escape) onClose();\n });\n\n const phaseList = Object.values(phases);\n const running = phaseList.filter((p) =>\n runningPhaseIds.includes(Object.keys(phases).find((k) => phases[k] === p) ?? ''),\n );\n const done = phaseList.filter((p) => p.status === 'completed' || p.status === 'skipped');\n const failed = phaseList.filter((p) => p.status === 'failed');\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n {/* Header */}\n <Box flexDirection=\"row\" gap={1} marginBottom={1}>\n <Text bold color=\"cyan\">\n PHASE MONITOR\n </Text>\n <Text dimColor>│</Text>\n <Text dimColor>⏱ {fmtElapsed(elapsedMs)}</Text>\n <Text dimColor>│</Text>\n <Text color=\"yellow\">▶{running.length}</Text>\n <Text dimColor>·</Text>\n <Text color=\"green\">✓{done.length}</Text>\n {failed.length > 0 ? (\n <>\n <Text dimColor>·</Text>\n <Text color=\"red\">✗{failed.length}</Text>\n </>\n ) : null}\n <Text dimColor>│ Ctrl+P / Esc to close</Text>\n </Box>\n\n {phaseList.length === 0 ? (\n <Text dimColor>No phases active. Use /autophase start [title] to begin.</Text>\n ) : (\n phaseList.map((phase, i) => {\n const s = fmtPhase(phase.status);\n const phaseKey = Object.keys(phases).find((k) => phases[k] === phase) ?? String(i);\n const isRunning = runningPhaseIds.includes(phaseKey);\n const elapsed = phase.startedAt ? fmtElapsed(nowTick - phase.startedAt) : '—';\n const progress =\n phase.totalTasks > 0 ? `${phase.completedTasks}/${phase.totalTasks}` : '—';\n\n return (\n <Box key={phaseKey} flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"row\" gap={1}>\n <Text color={s.color} bold>\n {s.icon}\n </Text>\n <Text bold>{phase.name}</Text>\n <Text dimColor>·</Text>\n <Text color={s.color}>{s.label}</Text>\n {isRunning ? (\n <>\n <Text dimColor>·</Text>\n <Text dimColor>elapsed {elapsed}</Text>\n </>\n ) : null}\n {phase.totalTasks > 0 && (\n <>\n <Text dimColor>·</Text>\n <Text dimColor>tasks {progress}</Text>\n </>\n )}\n </Box>\n </Box>\n );\n })\n )}\n\n {/* Keyboard hints */}\n <Box marginTop={1}>\n <Text dimColor>↑/↓ navigate phases · Esc close</Text>\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\n\nconst fmtElapsed = (ms: number): string => {\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n if (h > 0) return `${h}:${String(m % 60).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}`;\n if (m > 0) return `${m}:${String(s % 60).padStart(2, '0')}`;\n return `${s}s`;\n};\n\nexport interface PhasePanelProps {\n /** Per-phase state from the App reducer. */\n phases: Record<\n string,\n {\n name: string;\n status: string;\n completedTasks: number;\n totalTasks: number;\n startedAt?: number;\n }\n >;\n /** Active running phase IDs. */\n runningPhaseIds: string[];\n /** nowTick for elapsed time display. */\n nowTick: number;\n}\n\nconst STATUS: Record<string, { icon: string; color: string }> = {\n pending: { icon: '○', color: 'gray' },\n ready: { icon: '◐', color: 'cyan' },\n running: { icon: '●', color: 'yellow' },\n paused: { icon: '⏸', color: 'magenta' },\n completed: { icon: '✓', color: 'green' },\n failed: { icon: '✗', color: 'red' },\n skipped: { icon: '⊘', color: 'gray' },\n};\n\nfunction s(entry: string) {\n return STATUS[entry] ?? { icon: '?', color: 'white' };\n}\n\n/**\n * AutoPhase sidebar panel — shown below fleet panel when AutoPhase is active.\n * Compact 2-line-per-phase view optimized for the TUI layout.\n * Unlike PhaseMonitor (an overlay), PhasePanel is always visible while active.\n */\nexport function PhasePanel({ phases, nowTick }: PhasePanelProps): React.ReactElement | null {\n const list = Object.values(phases);\n if (list.length === 0) return null;\n\n const done = list.filter((p) => p.status === 'completed' || p.status === 'skipped').length;\n const running = list.filter((p) => p.status === 'running').length;\n const failed = list.filter((p) => p.status === 'failed').length;\n\n return (\n <Box\n flexDirection=\"column\"\n paddingX={1}\n borderStyle=\"single\"\n borderTop={false}\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n >\n {/* Header */}\n <Box flexDirection=\"row\" gap={2}>\n <Text dimColor>Phases</Text>\n <Text dimColor>│</Text>\n <Text color=\"yellow\">▶{running}</Text>\n <Text dimColor>✓{done}</Text>\n {failed > 0 ? <Text color=\"red\">✗{failed}</Text> : null}\n <Text dimColor>· {list.length} total</Text>\n <Text dimColor>· Ctrl+P for details</Text>\n </Box>\n\n {/* Per-phase compact rows */}\n {list.map((phase, i) => {\n const phaseKey = Object.keys(phases).find((k) => phases[k] === phase) ?? String(i);\n const st = s(phase.status);\n const progress = phase.totalTasks > 0 ? `${phase.completedTasks}/${phase.totalTasks}` : '';\n const elapsed = phase.startedAt ? fmtElapsed(nowTick - phase.startedAt) : '';\n\n return (\n <Box key={phaseKey} flexDirection=\"row\" gap={1}>\n <Text color={st.color}>{st.icon}</Text>\n <Text>{phase.name.slice(0, 14).padEnd(14)}</Text>\n <Text color={st.color} dimColor>\n {st.icon === '●' ? phase.status : ''}\n </Text>\n {progress ? <Text dimColor> {progress}</Text> : null}\n {elapsed && st.icon === '●' ? <Text dimColor> {elapsed}</Text> : null}\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { Box, type DOMElement, Text, measureElement, useStdout } from 'ink';\nimport type React from 'react';\nimport { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { theme } from '../theme.js';\nimport {\n AssistantTail,\n Entry,\n type HistoryEntry,\n type HistoryProps,\n MAX_STREAM_DISPLAY_CHARS,\n ToolStreamBox,\n tailForDisplay,\n} from './history.js';\n\n/** Max history entries laid out in the managed viewport at once. Generous\n * enough to cover a long session's in-app scrollback while bounding the\n * per-frame Yoga layout cost. */\nconst MAX_MOUNTED = 500;\n\nexport interface ScrollableHistoryProps extends HistoryProps {\n /** Lines scrolled up from the bottom. 0 = pinned to the newest output. */\n scrollOffset: number;\n /** Height of the viewport in rows, computed by App from the bottom region. */\n viewportRows: number;\n /** Last measured total content height (rows). Drives the scrollbar thumb. */\n totalLines: number;\n /** Reports the measured total content height (rows) after every layout so\n * App can clamp the scroll offset and drive the \"N new lines\" affordance. */\n onMeasure: (totalLines: number) => void;\n}\n\n/**\n * Right-edge scrollbar for the managed viewport. A 1-column track with a thumb\n * sized + positioned from (scrollOffset, totalLines, viewportRows). Always\n * reserves its column so toggling scrollability doesn't reflow the content.\n */\n/** Pure thumb geometry for the scrollbar: where the thumb starts and how many\n * cells it spans, given the track height, scroll offset, and total content\n * height. Exported for testing. */\nexport function scrollbarThumb(\n rows: number,\n offset: number,\n total: number,\n): { top: number; size: number; scrollable: boolean } {\n const scrollable = total > rows;\n if (!scrollable) return { top: 0, size: rows, scrollable: false };\n // Visible window top in content-line space; 0 = oldest, total = newest.\n const windowTop = Math.max(0, total - rows - offset);\n const size = Math.max(1, Math.round((rows / total) * rows));\n const rawTop = Math.round((windowTop / total) * rows);\n const top = Math.max(0, Math.min(rawTop, rows - size));\n return { top, size, scrollable: true };\n}\n\n/** Inverse of {@link scrollbarThumb}: given a clicked/dragged 0-based cell on a\n * track of `rows` height, return the scroll offset (rows up from the bottom)\n * that lands the visible window there. Cell 0 (top) → oldest content (max\n * offset); cell rows-1 (bottom) → newest (offset 0). Exported for testing and\n * the TUI scrollbar mouse handler. */\nexport function scrollOffsetForTrackRow(rows: number, total: number, cell: number): number {\n if (total <= rows) return 0;\n const maxOffset = total - rows;\n const clampedCell = Math.max(0, Math.min(rows - 1, cell));\n const windowTop = Math.round((clampedCell / Math.max(1, rows - 1)) * maxOffset);\n return Math.max(0, Math.min(maxOffset, maxOffset - windowTop));\n}\n\nfunction Scrollbar({\n rows,\n offset,\n total,\n}: { rows: number; offset: number; total: number }): React.ReactElement {\n const { top: thumbTop, size: thumbSize, scrollable } = scrollbarThumb(rows, offset, total);\n const cells: string[] = [];\n for (let i = 0; i < rows; i++) {\n cells.push(i >= thumbTop && i < thumbTop + thumbSize ? '█' : '│');\n }\n return (\n <Box flexDirection=\"column\" marginLeft={1} flexShrink={0}>\n {cells.map((c, i) => (\n <Text\n // biome-ignore lint/suspicious/noArrayIndexKey: fixed-height track, index is the row\n key={i}\n color={scrollable ? theme.accent : undefined}\n dimColor={!scrollable || c === '│'}\n >\n {c}\n </Text>\n ))}\n </Box>\n );\n}\n\n/**\n * Mouse-mode replacement for {@link History}. Instead of streaming each entry\n * into the terminal's native scrollback via `<Static>`, it renders all entries\n * into a fixed-height, `overflowY:'hidden'` viewport that the app scrolls\n * itself. The terminal's wheel is captured by mouse mode, so scrolling MUST be\n * managed here.\n *\n * Mechanism (Ink-5 verified): the parent Box is height-bounded with\n * `justifyContent:'flex-end'`, so when content overflows, its BOTTOM aligns to\n * the viewport bottom — newest output visible, oldest clipped off the top. That\n * is the pinned (offset 0) state for free, with no height math. Scrolling up is\n * a single `marginBottom={scrollOffset}` on the content box: it pushes the\n * content up, dropping `scrollOffset` rows off the bottom of the clip and\n * revealing that many older rows at the top. Ink's output clipper slices the\n * over/underflowing child at both edges while preserving ANSI styling.\n *\n * Streaming tails (assistant + tool) are the last children of the content box,\n * so they participate in the scrolled content and auto-follow when pinned.\n */\nexport function ScrollableHistory({\n entries,\n streamingText,\n toolStream,\n scrollOffset,\n viewportRows,\n totalLines,\n onMeasure,\n}: ScrollableHistoryProps): React.ReactElement {\n const { stdout } = useStdout();\n const [termWidth, setTermWidth] = useState(stdout?.columns ?? 80);\n useEffect(() => {\n const onResize = () => setTermWidth(stdout?.columns ?? 80);\n process.stdout.on('resize', onResize);\n return () => {\n process.stdout.off('resize', onResize);\n };\n }, [stdout]);\n\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 // Performance bound: the managed viewport re-lays-out every mounted entry\n // each frame (unlike the <Static> path, which prints once). Mounting only\n // the most recent MAX_MOUNTED keeps Yoga layout O(MAX_MOUNTED) regardless of\n // how long the session runs. Older entries stay in the reducer + on disk;\n // they're just not laid out. (True windowing — spacer boxes for measured\n // off-screen entries — is a later upgrade; this is the safe bound.)\n const hiddenCount = Math.max(0, entries.length - MAX_MOUNTED);\n const shown = hiddenCount > 0 ? entries.slice(-MAX_MOUNTED) : entries;\n\n // Measure the content box height after each commit and report it up only\n // when it changes. The content's own computed height does NOT depend on\n // viewportRows or marginBottom (margins/justify are layout-outside), so this\n // is stable — no measure → dispatch → re-measure feedback loop.\n const contentRef = useRef<DOMElement | null>(null);\n const lastReported = useRef(-1);\n useLayoutEffect(() => {\n const node = contentRef.current;\n if (!node) return;\n const { height } = measureElement(node);\n if (height !== lastReported.current) {\n lastReported.current = height;\n onMeasure(height);\n }\n // onMeasure is stable (dispatch from useReducer) and node is a ref.\n }, [onMeasure]);\n\n const vp = Math.max(1, viewportRows);\n return (\n <Box flexDirection=\"row\">\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n height={vp}\n overflowY=\"hidden\"\n justifyContent=\"flex-end\"\n >\n <Box\n ref={contentRef}\n flexDirection=\"column\"\n marginBottom={Math.max(0, scrollOffset)}\n flexShrink={0}\n >\n {hiddenCount > 0 ? (\n <Box flexShrink={0}>\n <Text dimColor italic>\n {` ↑ ${hiddenCount} earlier ${hiddenCount === 1 ? 'entry' : 'entries'} (scroll lives in this session; full log on disk)`}\n </Text>\n </Box>\n ) : null}\n {shown.map((entry) => (\n <Box key={entry.id} marginBottom={entry.kind === 'turn-summary' ? 1 : 0} flexShrink={0}>\n <Entry entry={entry} termWidth={termWidth} />\n </Box>\n ))}\n {tail ? <AssistantTail text={tail} /> : null}\n {toolTail ? (\n <ToolStreamBox\n name={toolStream!.name}\n text={toolTail}\n startedAt={toolStream!.startedAt}\n termWidth={termWidth}\n />\n ) : null}\n </Box>\n </Box>\n <Scrollbar rows={vp} offset={Math.max(0, scrollOffset)} total={totalLines} />\n </Box>\n );\n}\n\n// Re-exported for convenience so app.tsx can import both from one module.\nexport type { HistoryEntry };\n","import { Box, Text } from 'ink';\nimport type React from 'react';\n\n/** Selectable presets for the auto-proceed delay, so the field is fully\n * keyboard-cyclable (←/→) instead of needing typed numeric input. */\nexport const DELAY_PRESETS_MS = [0, 15_000, 30_000, 45_000, 60_000, 120_000];\nexport const SETTINGS_MODES = ['off', 'suggest', 'auto'] as const;\nexport type SettingsMode = (typeof SETTINGS_MODES)[number];\n\nexport function formatSettingsDelay(ms: number): string {\n if (ms === 0) return 'disabled';\n if (ms >= 60_000) return `${Math.round(ms / 60_000)}m`;\n return `${Math.round(ms / 1000)}s`;\n}\n\nconst MODE_DESC: Record<SettingsMode, string> = {\n off: 'Agent stops after each turn (normal)',\n suggest: 'Shows next-step suggestions after each turn',\n auto: 'Self-driving — agent continues automatically',\n};\n\nexport interface SettingsPickerProps {\n /** Focused row: 0 = mode, 1 = delay. */\n field: number;\n mode: SettingsMode;\n delayMs: number;\n hint?: string;\n}\n\nexport function SettingsPicker({\n field,\n mode,\n delayMs,\n hint,\n}: SettingsPickerProps): React.ReactElement {\n const rows = [\n { label: 'Default autonomy mode', value: mode, detail: MODE_DESC[mode] },\n {\n label: 'Auto-proceed delay',\n value: formatSettingsDelay(delayMs),\n detail: 'Wait before auto-continuing in auto mode',\n },\n ];\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text color=\"cyan\" bold>\n ━━ Settings ━━\n </Text>\n <Text dimColor>↑/↓ field · ←/→ change · Enter save · Esc cancel</Text>\n {rows.map((row, i) => (\n <Text key={row.label} color={i === field ? 'yellow' : undefined} inverse={i === field}>\n {i === field ? '› ' : ' '}\n <Text bold>{row.label.padEnd(22)}</Text>\n <Text color=\"cyan\">{String(row.value).padEnd(10)}</Text>\n <Text dimColor>{row.detail}</Text>\n </Text>\n ))}\n <Text dimColor>Persisted to ~/.wrongstack/config.json</Text>\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 { Box, Text, useInput } from 'ink';\nimport type React from 'react';\nimport type { WorktreeRow } from './worktree-panel.js';\n\nconst fmtElapsed = (ms: number): string => {\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n if (h > 0) return `${h}:${String(m % 60).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}`;\n if (m > 0) return `${m}:${String(s % 60).padStart(2, '0')}`;\n return `${s}s`;\n};\n\nconst WT_STATUS: Record<string, { icon: string; color: string; label: string }> = {\n allocating: { icon: '○', color: 'gray', label: 'allocating' },\n active: { icon: '●', color: 'yellow', label: 'active' },\n committing: { icon: '◐', color: 'cyan', label: 'committing' },\n merging: { icon: '⇡', color: 'blue', label: 'merging' },\n merged: { icon: '✓', color: 'green', label: 'merged' },\n 'needs-review': { icon: '⚠', color: 'magenta', label: 'needs-review' },\n failed: { icon: '✗', color: 'red', label: 'failed' },\n};\n\nfunction fmt(s: string) {\n return WT_STATUS[s] ?? { icon: '?', color: 'white', label: s };\n}\n\n/**\n * Full-screen Worktree monitor overlay (Ctrl+T to open, Ctrl+T/Esc to close).\n * Shows each AutoPhase worktree: branch, base→branch, owner phase, diff stats,\n * and conflict files for any worktree left in needs-review.\n */\nexport function WorktreeMonitor({\n worktrees,\n baseBranch,\n nowTick,\n onClose,\n}: {\n worktrees: Record<string, WorktreeRow & { baseBranch?: string }>;\n baseBranch?: string;\n nowTick: number;\n onClose: () => void;\n}): React.ReactElement {\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'w')) onClose();\n });\n\n const list = Object.values(worktrees);\n const active = list.filter((w) => ['active', 'committing', 'merging'].includes(w.status)).length;\n const merged = list.filter((w) => w.status === 'merged').length;\n const failed = list.filter((w) => w.status === 'failed' || w.status === 'needs-review').length;\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"green\" paddingX={1}>\n <Box flexDirection=\"row\" gap={1} marginBottom={1}>\n <Text bold color=\"green\">\n WORKTREE MONITOR\n </Text>\n <Text dimColor>│</Text>\n {baseBranch ? <Text dimColor>base {baseBranch}</Text> : null}\n <Text dimColor>│</Text>\n <Text color=\"yellow\">▶{active}</Text>\n <Text dimColor>·</Text>\n <Text color=\"green\">✓{merged}</Text>\n {failed > 0 ? (\n <>\n <Text dimColor>·</Text>\n <Text color=\"red\">✗{failed}</Text>\n </>\n ) : null}\n <Text dimColor>│ Ctrl+T / F4 / Esc to close</Text>\n </Box>\n\n {list.length === 0 ? (\n <Text dimColor>No worktrees. They appear when AutoPhase runs with isolation on.</Text>\n ) : (\n list.map((w) => {\n const s = fmt(w.status);\n const short = w.branch.replace(/^wstack\\/ap\\//, '');\n const elapsed = w.allocatedAt ? fmtElapsed(nowTick - w.allocatedAt) : '—';\n return (\n <Box key={w.branch} flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"row\" gap={1}>\n <Text color={s.color} bold>\n {s.icon}\n </Text>\n <Text bold>{short}</Text>\n <Text dimColor>·</Text>\n <Text color={s.color}>{s.label}</Text>\n <Text dimColor>· elapsed {elapsed}</Text>\n </Box>\n <Box flexDirection=\"row\" gap={1} marginLeft={2}>\n <Text dimColor>\n {w.baseBranch ?? baseBranch ?? 'base'} → {short}\n </Text>\n <Text dimColor>· owner: {w.ownerLabel}</Text>\n </Box>\n <Box flexDirection=\"row\" gap={1} marginLeft={2}>\n <Text color=\"green\">+{w.insertions}</Text>\n <Text color=\"red\">-{w.deletions}</Text>\n <Text dimColor>· {w.files} files</Text>\n </Box>\n {w.conflictFiles && w.conflictFiles.length > 0 ? (\n <Box marginLeft={2}>\n <Text color=\"magenta\">conflicts: {w.conflictFiles.join(', ')}</Text>\n </Box>\n ) : null}\n </Box>\n );\n })\n )}\n\n <Box marginTop={1}>\n <Text dimColor>Esc close · merge conflicts with /worktree merge <branch></Text>\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type React from 'react';\n\nconst fmtElapsed = (ms: number): string => {\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n if (h > 0) return `${h}:${String(m % 60).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}`;\n if (m > 0) return `${m}:${String(s % 60).padStart(2, '0')}`;\n return `${s}s`;\n};\n\nexport interface WorktreeRow {\n branch: string;\n ownerLabel: string;\n status: string;\n insertions: number;\n deletions: number;\n files: number;\n allocatedAt: number;\n conflictFiles?: string[];\n}\n\nconst STATUS: Record<string, { icon: string; color: string }> = {\n allocating: { icon: '○', color: 'gray' },\n active: { icon: '●', color: 'yellow' },\n committing: { icon: '◐', color: 'cyan' },\n merging: { icon: '⇡', color: 'blue' },\n merged: { icon: '✓', color: 'green' },\n 'needs-review': { icon: '⚠', color: 'magenta' },\n failed: { icon: '✗', color: 'red' },\n};\n\nfunction st(status: string) {\n return STATUS[status] ?? { icon: '?', color: 'white' };\n}\n\n/**\n * Worktree sidebar panel — shown beside the AutoPhase PhasePanel when git\n * worktree isolation is active. One compact row per worktree (branch, owner\n * phase, diff stats, status). Always visible while live; details on Ctrl+T.\n */\nexport function WorktreePanel({\n worktrees,\n nowTick,\n}: {\n worktrees: Record<string, WorktreeRow>;\n nowTick: number;\n}): React.ReactElement | null {\n const list = Object.values(worktrees);\n if (list.length === 0) return null;\n\n const active = list.filter(\n (w) => w.status === 'active' || w.status === 'committing' || w.status === 'merging',\n ).length;\n const merged = list.filter((w) => w.status === 'merged').length;\n const failed = list.filter((w) => w.status === 'failed' || w.status === 'needs-review').length;\n\n return (\n <Box\n flexDirection=\"column\"\n paddingX={1}\n borderStyle=\"single\"\n borderTop={false}\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n >\n <Box flexDirection=\"row\" gap={2}>\n <Text dimColor>Worktrees</Text>\n <Text dimColor>│</Text>\n <Text color=\"yellow\">▶{active}</Text>\n <Text color=\"green\">✓{merged}</Text>\n {failed > 0 ? <Text color=\"red\">✗{failed}</Text> : null}\n <Text dimColor>· {list.length} total · Ctrl+T for details</Text>\n </Box>\n\n {list.map((w) => {\n const s = st(w.status);\n const conflict = w.status === 'needs-review';\n const elapsed = w.allocatedAt ? fmtElapsed(nowTick - w.allocatedAt) : '';\n return (\n <Box key={w.branch} flexDirection=\"row\" gap={1}>\n <Text color={s.color}>{s.icon}</Text>\n <Text>\n {w.branch\n .replace(/^wstack\\/ap\\//, '')\n .slice(0, 18)\n .padEnd(18)}\n </Text>\n <Text dimColor>{w.ownerLabel.slice(0, 12)}</Text>\n {conflict ? (\n <Text color=\"magenta\"> CONFLICT</Text>\n ) : (\n <Text dimColor>\n {' '}\n +{w.insertions}/-{w.deletions} {w.files}f\n </Text>\n )}\n {elapsed && (w.status === 'active' || w.status === 'committing') ? (\n <Text dimColor> {elapsed}</Text>\n ) : null}\n </Box>\n );\n })}\n </Box>\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 { 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 {\n message: `Killed ${pids.length} process${pids.length === 1 ? '' : 'es'}: ${pids.join(', ')}`,\n };\n }\n\n if (sub === 'force') {\n getProcessRegistry().forceBreakerOpen();\n const pids = getProcessRegistry().killAll({ force: true });\n if (pids.length === 0)\n return { message: 'Circuit breaker forced open. No processes to kill.' };\n return {\n message: `Force-killed ${pids.length} process${pids.length === 1 ? '' : 'es'}: ${pids.join(', ')}`,\n };\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}\n","// Bracketed-paste accumulation, factored out of the TUI key handler so the\n// (fiddly) marker logic can be unit-tested in isolation.\n//\n// A terminal in bracketed-paste mode wraps pasted text as\n// `\\x1b[200~<content>\\x1b[201~`. The OS/terminal can split that across\n// several stdin reads, and Ink's keypress parser sometimes strips the ESC\n// byte — leaving a bare `[200~` / `[201~`. So we:\n// - detect both the ESC-prefixed and bare marker forms,\n// - buffer fragments across calls until the closing marker arrives,\n// - hand back the fully-assembled payload exactly once.\n\nconst BEGIN = '[200~';\nconst END = '[201~';\n// biome-ignore lint/suspicious/noControlCharactersInRegex: paste markers carry a literal ESC\nconst BEGIN_RE = /\\x1b?\\[200~/g;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: paste markers carry a literal ESC\nconst END_RE = /\\x1b?\\[201~/g;\n// Partial ANSI CSI without the ESC prefix — Ink strips ESC from sequences\n// like \\x1b[0m, leaving [0m which would otherwise appear as literal text.\nconst PARTIAL_ANSI_RE = /^\\[[\\x30-\\x3f]*[\\x20-\\x2f]*[\\x40-\\x7e]/;\nconst ANSI_RE = new RegExp(\n [\n // CSI: ESC [ params* intermediates* final\n // params 0x30-0x3f (digits, ; : < = > ?)\n // intermediates 0x20-0x2f (space … /)\n // final 0x40-0x7e (@ … ~)\n '\\\\x1b\\\\[[\\\\x30-\\\\x3f]*[\\\\x20-\\\\x2f]*[\\\\x40-\\\\x7e]',\n // OSC: ESC ] … BEL (\\x07) or ST (\\x1b\\\\)\n '\\\\x1b\\\\][^\\\\x07\\\\x1b]*(?:\\\\x07|\\\\x1b\\\\\\\\)',\n // DCS: ESC P … ST (\\x1b\\\\)\n '\\\\x1bP[^\\\\x1b]*(?:\\\\x1b\\\\\\\\)',\n // SOS / PM: ESC X / ESC ^\n '\\\\x1b[XP][^\\\\x1b]*(?:\\\\x1b\\\\\\\\)',\n // Standalone ESC — guard only\n '\\\\x1b',\n ].join('|'),\n 'g',\n);\n\nexport interface PasteFeedResult {\n /** New accumulator state: a string while mid-paste, `null` when idle. */\n accum: string | null;\n /**\n * The fully-assembled paste payload when an end marker closed it, else\n * `null` (still buffering).\n */\n complete: string | null;\n}\n\n/**\n * Feed one keypress fragment into the paste accumulator.\n *\n * @param accum current accumulator (`null` when not inside a paste)\n * @param input the raw keypress string for this event\n * @returns `null` when `input` is not part of a paste (the caller should\n * handle it as normal input); otherwise the updated accumulation state.\n */\nexport function feedPaste(accum: string | null, input: string): PasteFeedResult | null {\n if (accum === null && !input.includes(BEGIN)) {\n // If input starts with '[' but is not a paste marker, it may be a partial\n // ANSI CSI sequence whose ESC was stripped by Ink. Guard against it\n // appearing as literal text in the input buffer.\n if (input.startsWith('[') && !input.startsWith(BEGIN) && !input.startsWith(END)) {\n // Treat partial ANSI sequences (ESC stripped) as mid-paste content\n // so [0m doesn't leak into the buffer as literal text.\n if (PARTIAL_ANSI_RE.test(input)) {\n return { accum: '', complete: null };\n }\n // Bare '[' is not a paste marker and not a known partial ANSI\n // sequence — let it through as ordinary input.\n return null;\n }\n return null;\n }\n // Strip paste markers AND all ANSI sequences before accumulating.\n const piece = input.replace(BEGIN_RE, '').replace(END_RE, '').replace(ANSI_RE, '');\n const next = (accum ?? '') + piece;\n if (input.includes(END)) return { accum: null, complete: next };\n return { accum: next, complete: null };\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}\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 * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n Agent,\n AttachmentStore,\n ContentBlock,\n Director,\n EventBus,\n FleetEvent,\n QueueStore,\n SlashCommandRegistry,\n TokenCounter,\n} from '@wrongstack/core';\nimport { DefaultSessionRewinder } from '@wrongstack/core';\nimport { InputBuilder, buildGoalPreamble, formatTodosList, writeOut } from '@wrongstack/core';\nimport { type VisionAdapters, routeImagesForModel } from '@wrongstack/runtime/vision';\nimport { getProcessRegistry } from '@wrongstack/tools';\nimport { Box, type DOMElement, Text, measureElement, useApp, useStdout } from 'ink';\nimport React, { useCallback, useEffect, useMemo, useReducer, useRef, useState } from 'react';\nimport { readClipboardImage } from './clipboard.js';\nimport { AgentsMonitor } from './components/agents-monitor.js';\nimport {\n AUTONOMY_OPTIONS,\n type AutonomyOption,\n AutonomyPicker,\n} from './components/autonomy-picker.js';\nimport { BrainDecisionPrompt } from './components/brain-decision-prompt.js';\nimport { CheckpointTimeline } from './components/checkpoint-timeline.js';\nimport {\n type ConfirmDecision,\n ConfirmPrompt,\n confirmButtonSegments,\n} from './components/confirm-prompt.js';\nimport { FilePicker } from './components/file-picker.js';\nimport { FleetMonitor } from './components/fleet-monitor.js';\nimport { FleetPanel } from './components/fleet-panel.js';\nimport { HelpOverlay } from './components/help-overlay.js';\nimport { History, type HistoryEntry } from './components/history.js';\nimport { EMPTY_KEY, Input, type KeyEvent } from './components/input.js';\nimport { KeyHintBar } from './components/key-hint-bar.js';\nimport { LiveActivityStrip } from './components/live-activity-strip.js';\nimport { ModelPicker, type ProviderOption } from './components/model-picker.js';\nimport { PhaseMonitor } from './components/phase-monitor.js';\nimport { PhasePanel } from './components/phase-panel.js';\nimport { ScrollableHistory, scrollOffsetForTrackRow } from './components/scrollable-history.js';\nimport {\n DELAY_PRESETS_MS,\n SETTINGS_MODES,\n type SettingsMode,\n SettingsPicker,\n} from './components/settings-picker.js';\nimport { SlashMenu } from './components/slash-menu.js';\nimport { StatusBar, statusBarAutonomySpan, statusBarModelSpan } from './components/status-bar.js';\nimport { WorktreeMonitor } from './components/worktree-monitor.js';\nimport { WorktreePanel, type WorktreeRow } from './components/worktree-panel.js';\nimport { searchFiles } from './file-search.js';\nimport { type GitInfo, readGitInfo } from './git-info.js';\nimport {\n INLINE_TOKEN_SRC,\n deleteTokenBackward,\n inputIndexAtRowCol,\n layoutInputRows,\n tokenLengthForward,\n} from './input-tokens.js';\nimport { createKillSlashCommand } from './kill-slash.js';\nimport type { MouseEvent as TuiMouseEvent } from './mouse.js';\nimport { feedPaste } from './paste-accumulator.js';\nimport { createPsSlashCommand } from './ps-slash.js';\nimport { createQueueSlashCommand } from './queue-slash.js';\n\nexport interface QueueItem {\n id: number;\n displayText: string;\n blocks: ContentBlock[];\n}\n\n/** Rows the chat-history viewport scrolls per wheel tick (mouse mode). */\nconst WHEEL_STEP = 3;\n/** Floor for the scroll viewport so it never collapses to nothing when the\n * bottom region (overlays, wrapped input) is tall. */\nconst MIN_VIEWPORT = 3;\n/** Input prompt — mirrors the <Input> default so click-to-position-cursor maps\n * columns the same way the input renders them. */\nconst INPUT_PROMPT = '› ';\n\ntype SerialAutonomyStage =\n | { phase: 'idle' }\n | { phase: 'decide'; reason: string }\n | { phase: 'execute'; task: string }\n | { phase: 'reflect'; status: 'success' | 'failure' | 'aborted' | 'skipped'; note?: string }\n | { phase: 'sleep'; ms: number }\n | { phase: 'paused' }\n | { phase: 'stopped' }\n | { phase: 'error'; message: string };\n\ntype ParallelAutonomyStage =\n | { phase: 'idle' }\n | { phase: 'decompose' }\n | { phase: 'fanout'; slots: number }\n | { phase: 'await'; taskIds: string[] }\n | { phase: 'aggregate'; successCount: number; total: number; goalComplete: boolean }\n | { phase: 'sleep'; ms: number }\n | { phase: 'stopped' }\n | { phase: 'error'; message: string };\n\ntype AutonomyStage = SerialAutonomyStage | ParallelAutonomyStage;\n\n/** Per-subagent state tracked live from the FleetBus. */\nexport interface FleetEntry {\n id: string;\n name: string;\n provider?: string;\n model?: string;\n status: 'idle' | 'running' | 'success' | 'failed' | 'timeout' | 'stopped';\n streamingText: string;\n iterations: number;\n toolCalls: number;\n recentTools: Array<{\n name: string;\n ok?: boolean;\n durationMs?: number;\n outputBytes?: number;\n outputLines?: number;\n at: number;\n }>;\n recentMessages: Array<{ text: string; at: number }>;\n cost: number;\n startedAt: number;\n lastEventAt: number;\n /**\n * Tool the subagent is currently inside, set on `tool.started` and\n * cleared on `tool.executed`. Lets the FleetPanel render \"running →\n * bash\" instead of an opaque \"running\". Undefined when no tool is\n * mid-flight (between iterations, before the first tool, or after\n * the last tool of a run).\n */\n currentTool?: { name: string; startedAt: number };\n /**\n * Absolute path to the per-subagent JSONL transcript on disk, when\n * one was created. Surfaced so the FleetPanel can render `path:`\n * dim under the entry — users grep / tail the file for full\n * visibility into the subagent's run.\n */\n transcriptPath?: string;\n /**\n * Most recent budget warning: subagent hit a soft limit and the\n * coordinator is auto-extending. Rendered in FleetPanel as:\n * \"⚡ hitting tool_calls limit (350/400) — extending\"\n * Cleared on the next fleetDone or fleetStart.\n */\n budgetWarning?: { kind: string; used: number; limit: number; at: number };\n /**\n * Cumulative auto-extension grants for this subagent. Surfaced as a\n * persistent \"⚡×N\" badge in the monitor and 4th status line so the user\n * can see how often never-die kept the agent alive. Survives across tasks\n * within the same subagent entry (unlike `budgetWarning`, which clears).\n */\n extensions?: number;\n /**\n * Latest context window fill percentage (0–1, can exceed 1 when over budget).\n * Emitted on every `iteration.completed` via `ctx.pct` event.\n * Rendered as a colored progress bar in the AgentsMonitor.\n */\n ctxPct?: number;\n /** Estimated total tokens in the context window (from ctx.pct event). */\n ctxTokens?: number;\n /** Provider's max context window in tokens (from ctx.pct event). */\n ctxMaxTokens?: number;\n /**\n * Human-readable reason for terminal failure, when known.\n * E.g. \"provider_auth\", \"rate_limit\", \"timeout\", \"budget_iterations\".\n * Shown in the Fleet timeline and the per-agent card in the agents monitor.\n */\n failureReason?: string;\n}\n\n/** A registered slash command matched against the user's current / query. */\nexport interface SlashCommandMatch {\n name: string;\n description: string;\n argsHint?: string;\n isBuiltin: boolean;\n}\n\nexport function selectedSlashCommandLine(picker: {\n open: boolean;\n matches: SlashCommandMatch[];\n selected: number;\n}): string | null {\n if (!picker.open || picker.matches.length === 0) return null;\n const picked = picker.matches[picker.selected];\n return picked ? `/${picked.name}` : null;\n}\n\nexport interface AppProps {\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 queue across crashes; rehydrated on mount, written on every mutation. */\n queueStore?: QueueStore;\n /** Reflects the policy's --yolo flag for the status bar's \"⚠ YOLO\" chip. */\n yolo?: boolean;\n /**\n * Query the live YOLO state from the permission policy. Called after\n * every slash-command dispatch so `/yolo off` (which mutates the\n * policy inside the CLI) is immediately reflected in the status bar.\n * Mirrors the `agent.ctx.model` → `setLiveModel` pattern used for\n * provider/model sync.\n */\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 goes to\n * 'eternal' the TUI drives `runOneIteration()` from a 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 goes to\n * 'eternal-parallel' the TUI drives `runOneIteration()` from a 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. The\n * TUI installs this on mount to render each iteration as a timeline\n * entry the moment it lands — strictly more responsive than reading\n * goal.json after the fact.\n */\n subscribeEternalIteration?: (\n fn: (entry: import('@wrongstack/core').JournalEntry) => void,\n ) => () => void;\n /**\n * Subscribe to per-iteration stage transitions from the autonomy engines.\n * Drives `state.eternalStage` used by the status bar to show the\n * engine's current location.\n */\n subscribeEternalStage?: (fn: (stage: AutonomyStage) => void) => () => void;\n /**\n * Subscribe to AutoPhase phase/task events from the PhaseOrchestrator.\n * Drives `state.autoPhase` used by the PhaseMonitor component.\n * Handlers receive the event name and payload from PhaseEventMap.\n */\n subscribeAutoPhase?: (handler: (event: string, payload: unknown) => void) => () => void;\n /**\n * Read the persisted autonomy settings (defaultMode, autoProceedDelayMs).\n * Used by the SettingsPicker in the TUI on mount and after Ctrl+S toggle.\n */\n getSettings?: () => { mode: 'off' | 'suggest' | 'auto'; delayMs: number };\n /**\n * Persist autonomy settings changes. Returns null on success, or an\n * error string on failure (so the TUI can display it as a hint).\n */\n saveSettings?: (s: { mode: 'off' | 'suggest' | 'auto'; delayMs: number }) =>\n | string\n | null\n | Promise<string | null>;\n /**\n * Predict likely next steps after a completed turn (/next). The CLI owns the\n * gating (toggle + autonomy off) and returns [] when disabled, so the App can\n * call it unconditionally on a done turn. Display-only — never executed.\n */\n predictNext?: (input: {\n userRequest: string;\n assistantSummary: string;\n }) => Promise<string[]>;\n /**\n * SDD session context getter. When an SDD session is active, returns\n * the AI prompt context to inject into user messages so the model\n * knows it's in a spec-building conversation.\n */\n getSDDContext?: () => string | null;\n /**\n * Process AI output for SDD auto-detection (spec, tasks, plan).\n * Called after every agent.run() completes. Returns displayable\n * status messages (e.g. \"✓ Spec detected and saved!\").\n */\n onSDDOutput?: (output: string) => Promise<string[]>;\n /** Surfaced in the startup banner. Falls back to \"dev\" when omitted. */\n appVersion?: string;\n /** Provider id shown in the banner (\"openai\", \"anthropic\", …). Defaults to \"agent\". */\n provider?: string;\n /** Wire family for the configured provider — rendered under provider in the banner. */\n family?: string;\n /** Last 3 chars of the active API key, shown in the banner for \"did I pick the right key?\" verification. */\n keyTail?: string;\n /**\n * Snapshot the keyed providers (and their model lists) for the\n * `/model` picker. Called every time the picker opens, so the result\n * stays in sync with config edits / new aliases. Async because the\n * host may need to load the models.dev catalog.\n */\n getPickableProviders?: () => Promise<ProviderOption[]>;\n /**\n * Apply a (provider, model) pair after the picker confirms. Returns\n * an error message on failure; null on success. The host owns the\n * actual Provider construction + Context mutation.\n */\n switchProviderAndModel?: (providerId: string, modelId: string) => string | null;\n /**\n * Apply an autonomy mode after the picker confirms. Returns\n * an error string on failure; null on success.\n */\n switchAutonomy?: (\n mode: 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel',\n ) => string | null;\n /**\n * Real max-context token budget for the *active model*, resolved by the\n * CLI via the ModelsRegistry. The provider object only knows its family\n * default (e.g. anthropic = 200k) which is wrong for variants like the\n * 1M-context Opus model. The status bar's context chip uses this when\n * provided and falls back to the provider baseline otherwise.\n */\n effectiveMaxContext?: number;\n /** Absolute project root for goal.json loading. */\n projectRoot?: string;\n onExit: (code: number) => void;\n /** Called when /clear is dispatched — the TUI should wipe its history entries (but keep the banner). */\n onClearHistory?: (\n dispatch: React.Dispatch<{ type: 'clearHistory' } | { type: 'resetContextChip' }>,\n ) => void;\n\n /**\n * Goal text passed from `--goal \"...\"` on the command line. When set,\n * the App mounts, renders the banner, then automatically dispatches\n * a synthetic `/goal <text>` so the user lands in goal mode without\n * having to type the slash command. Mutually advisory with `initialSteer`\n * — `initialGoal` wins if both are present.\n */\n initialGoal?: string;\n /**\n * Initial user message passed from `--ask \"...\"` on the command line.\n * Submitted verbatim as the first turn (no preamble) so users can\n * launch the TUI and pre-populate one turn from a shell alias / script.\n */\n initialAsk?: string;\n /** Directory for session JSONL files. Passed to App for /rewind. */\n sessionsDir?: string;\n /**\n * True when full mouse mode is active (clickable pickers + in-app wheel\n * scrolling). Implies alt-screen. Switches History to the scrollable\n * viewport and enables the mouse event handlers.\n */\n mouse?: boolean;\n /**\n * Subscribe to decoded mouse events (press/release/wheel with 1-based\n * col/row). Installed by run-tui only when mouse mode is on; the App wires\n * it on mount and tears it down on unmount. Returns an unsubscribe fn.\n */\n subscribeMouse?: (fn: (ev: import('./mouse.js').MouseEvent) => void) => () => void;\n /**\n * True when the managed full-screen viewport is the surface (alt-screen on).\n * Drives ScrollableHistory + in-app scroll + collapsibility, independent of\n * mouse. When false the app uses History + Ink <Static> (native scrollback).\n */\n managed?: boolean;\n\n // --- Fleet ---\n /** Live director for fleet panel rendering. Null when director mode is off. */\n director: Director | null;\n /** Optional roster for human-readable subagent names. */\n fleetRoster?: Record<string, { name: string }>;\n /**\n * Shared controller for the `/fleet stream on|off` slash command. The\n * App installs a dispatch-backed setter on mount so the slash command\n * can flip the reducer's `streamFleet` flag from the CLI surface.\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: (\n items: Array<'todos' | 'plan' | 'fleet' | 'git' | 'elapsed' | 'context' | 'cost'>,\n ) => void;\n /**\n * Controller for the agents monitor overlay. App installs a dispatch-backed\n * setter on mount so the `/agents on|off` slash command can toggle the\n * overlay without a round-trip.\n */\n agentsMonitorController?: {\n visible: boolean;\n setVisible: (visible: boolean) => void;\n };\n}\n\ntype DraftEntry = HistoryEntry extends infer T\n ? T extends { id: number }\n ? Omit<T, 'id'>\n : never\n : never;\n\ntype GoalSummary = {\n goal: string;\n goalState: 'active' | 'paused' | 'completed' | 'abandoned';\n iterations: number;\n lastTask?: string;\n lastStatus?: string;\n} | null;\n\ntype State = {\n entries: HistoryEntry[];\n buffer: string;\n cursor: number;\n streamingText: string;\n /**\n * Live tail of the currently streaming tool's stdout/progress text. Mirrors\n * the assistant `streamingText` pattern but is keyed by tool_use id so the\n * tail is cleared automatically when that tool finishes. Only one tool's\n * stream is shown at a time — multi-tool streaming is rare and stacking\n * tails fights for the same screen space.\n */\n toolStream: { toolUseId: string; name: string; text: string; startedAt: number } | null;\n status: 'idle' | 'running' | 'streaming' | 'aborting';\n interrupts: number;\n /**\n * Set when the user pressed Esc mid-iteration to interrupt the agent.\n * The NEXT submitted user message gets a STEERING prefix block prepended\n * so the model sees \"I interrupted you on purpose — focus on this\n * instead of resuming the prior task\". Cleared once that message\n * lands. Distinct from `interrupts` (which is the Ctrl+C exit ladder).\n */\n steeringPending: boolean;\n /**\n * Context snapshot captured at Esc time, replayed into the STEERING\n * preamble so the model sees exactly what it was mid-doing when the\n * user pulled the cord. Cleared together with `steeringPending`.\n * Without this the model has to guess from chat scrollback which\n * tools were live — and it can't see subagent state at all.\n */\n steerSnapshot: {\n runningTools: string[];\n subagents: Array<{ label: string; status: string; tool?: string }>;\n subagentsTerminated: number;\n partialAssistantText: string;\n } | null;\n hint: string;\n brain: {\n state: 'idle' | 'deciding' | 'answered' | 'ask_human' | 'denied';\n source?: string;\n risk?: 'low' | 'medium' | 'high' | 'critical';\n summary?: string;\n updatedAt?: number;\n };\n brainPrompt: {\n requestId: string;\n source: string;\n risk: 'low' | 'medium' | 'high' | 'critical';\n question: string;\n context?: string;\n options?: Array<{\n id: string;\n label: string;\n risk?: string;\n consequence?: string;\n recommended?: boolean;\n }>;\n } | null;\n nextId: number;\n picker: { open: boolean; query: string; matches: string[]; selected: number };\n /** Slash command picker — open while typing a / command. */\n slashPicker: { open: boolean; query: string; matches: SlashCommandMatch[]; selected: number };\n /** Tool calls currently in-flight, by tool_use id. Surface in the status bar. */\n runningTools: Map<string, { name: string; startedAt: number }>;\n /** FIFO of user messages typed while the agent was running. Drained when idle. */\n queue: QueueItem[];\n nextQueueId: number;\n /** Previous input strings for up/down navigation. */\n inputHistory: string[];\n /** 0 = current buffer (not in history), 1 = most recent, n = nth most recent. */\n historyIndex: number;\n /** Two-step model picker (provider → model) — opened by `/model`. */\n modelPicker: {\n open: boolean;\n step: 'provider' | 'model';\n providerOptions: ProviderOption[];\n modelOptions: string[];\n /** Filtered list shown in step 2 (same as modelOptions when searchQuery is empty). */\n filteredOptions: string[];\n selected: number;\n pickedProviderId?: string;\n hint?: string;\n /** Live search filter in step 2. */\n searchQuery: string;\n };\n /** Single-step autonomy mode picker — opened by `/autonomy`. */\n autonomyPicker: {\n open: boolean;\n options: AutonomyOption[];\n selected: number;\n hint?: string;\n };\n /** Autonomy settings editor — opened by `/settings` or Ctrl+S. */\n settingsPicker: {\n open: boolean;\n /** Focused row: 0 = mode, 1 = delay. */\n field: number;\n mode: SettingsMode;\n delayMs: number;\n hint?: string;\n };\n /** Pending tool confirmations — queue to handle multiple tools requesting confirmation. */\n confirmQueue: {\n toolUseId: string;\n toolName: string;\n input: unknown;\n suggestedPattern: string;\n resolve: (decision: 'yes' | 'no' | 'always' | 'deny') => void;\n }[];\n /** Incremented on /clear so the context chip re-reads from agent.ctx tokens. */\n contextChipVersion: number;\n /** Live fleet state: per-subagent entries from FleetBus events. Keyed by subagentId. */\n fleet: Record<string, FleetEntry>;\n /**\n * Leader-loop activity, synthesized for the AgentsMonitor overlay so the\n * user can see leader iteration / tool counts alongside subagent rows.\n * Driven by EventBus `iteration.started`/`iteration.completed`/`tool.started`/`tool.executed`.\n * Always present; renders as AGENT#0 LEADER in the monitor regardless of\n * whether any subagents exist.\n */\n leader: {\n iterations: number;\n toolCalls: number;\n recentTools: Array<{ name: string; ok?: boolean; durationMs?: number; at: number }>;\n currentTool?: { name: string; startedAt: number };\n startedAt: number;\n lastEventAt: number;\n /** True while inside an iteration (between iteration.started and iteration.completed). */\n iterating: boolean;\n /** Latest context window fill fraction (from ctx.pct event). */\n ctxPct?: number;\n /** Estimated total tokens in context window. */\n ctxTokens?: number;\n /** Provider max context in tokens. */\n ctxMaxTokens?: number;\n };\n /** Fleet-wide accumulated cost. */\n fleetCost: number;\n /** Fleet-wide token totals from the usage aggregator, for the monitor gauge. */\n fleetTokens: { input: number; output: number };\n /**\n * When true, subagent text activity is\n * streamed into the main history with an `AGENT#N` prefix. Toggled\n * with `/fleet stream on|off`. Tool calls stay in the live fleet\n * surfaces so chat history remains readable during multi-agent runs.\n */\n streamFleet: boolean;\n /** When true, the full graphical fleet monitor overlay is shown (Ctrl+F). */\n monitorOpen: boolean;\n /** When true, the agents monitor overlay is shown (Ctrl+G). */\n agentsMonitorOpen: boolean;\n /** When true, the keys-&-commands help overlay is shown (`?` on an empty prompt). */\n helpOpen: boolean;\n /**\n * Active or completed collaborative debugging session state.\n * Null when no collab session has run. Tracks counts + the event timeline\n * so FleetMonitor can render a live \"COLLAB SESSION\" banner and per-event\n * entries (bug.found / refactor.plan / critic.evaluation) as they arrive.\n */\n collabSession: {\n /** Null until the first collab subagent spawns; set on first bug.found. */\n sessionId: string | null;\n bugCount: number;\n planCount: number;\n evalCount: number;\n /** Most recent overall verdict when the session completes. */\n overallVerdict: 'approve' | 'needs_revision' | 'reject' | null;\n /** Timeline of collab events for the FleetMonitor overlay. */\n timeline: Array<{ at: number; icon: string; color: string; text: string }>;\n startedAt: number | null;\n } | null;\n /** Session checkpoints recorded by SessionWriter.writeCheckpoint() events. */\n checkpoints: Array<{\n promptIndex: number;\n promptPreview: string;\n ts: string;\n fileCount: number;\n }>;\n /** Checkpoint timeline overlay — null when closed. */\n rewindOverlay: {\n checkpoints: Array<{\n promptIndex: number;\n promptPreview: string;\n ts: string;\n fileCount: number;\n }>;\n selected: number;\n } | null;\n /** Live iteration-stage of the active autonomy engine. */\n eternalStage: AutonomyStage | null;\n /** Loaded from .wrongstack/goal.json on mount for startup banner. */\n goalSummary: GoalSummary;\n /** AutoPhase orchestrator state — rendered by PhaseMonitor. */\n autoPhase: {\n /** AutoPhase graph title. */\n title: string;\n /** Per-phase task summary, keyed by phaseId. */\n phases: Record<\n string,\n {\n name: string;\n status: string;\n completedTasks: number;\n totalTasks: number;\n startedAt?: number;\n }\n >;\n /** Active phase IDs (running phases). */\n runningPhaseIds: string[];\n /** Elapsed ms since graph start — drives the elapsed counter. */\n elapsedMs: number;\n /** True while the monitor overlay is open (Ctrl+P). */\n monitorOpen: boolean;\n } | null;\n /** Git-worktree isolation state — rendered by WorktreePanel/WorktreeMonitor. */\n worktrees: Record<string, WorktreeRow & { baseBranch?: string }>;\n /** Base branch worktrees fork from (for the monitor header). */\n worktreeBase?: string;\n /** True while the worktree monitor overlay is open (Ctrl+T). */\n worktreeMonitorOpen: boolean;\n /**\n * In-app chat scroll state, used only in mouse mode (the scrollable\n * viewport). In the default `<Static>` path these are inert.\n * scrollOffset — rows scrolled up from the bottom; 0 = pinned to newest.\n * totalLines — last measured content height (rows), from onMeasure.\n * viewportRows — last computed viewport height (rows).\n * pendingNewLines — rows added while scrolled up; drives the \"↓ N new\" hint.\n */\n scrollOffset: number;\n totalLines: number;\n viewportRows: number;\n pendingNewLines: number;\n};\n\ntype Action =\n | { type: 'addEntry'; entry: DraftEntry }\n | { type: 'setBuffer'; buffer: string; cursor: number }\n | { type: 'clearInput' }\n | { type: 'clearHistory' }\n | { type: 'streamDelta'; delta: string }\n | { type: 'streamReset' }\n | { type: 'status'; status: State['status'] }\n | { type: 'interrupt' }\n | { type: 'resetInterrupts' }\n /**\n * User pressed Esc mid-iteration — flag the next message for steering\n * AND stash a context snapshot so the preamble can tell the model\n * exactly what it was doing.\n */\n | { type: 'steerStart'; snapshot: State['steerSnapshot'] }\n /** Submit handler consumed the steering flag; reset. */\n | { type: 'steerConsume' }\n | { type: 'hint'; text: string }\n | {\n type: 'brainStatus';\n state: State['brain']['state'];\n source?: string;\n risk?: State['brain']['risk'];\n summary?: string;\n }\n | { type: 'brainPromptSet'; prompt: NonNullable<State['brainPrompt']> }\n | { type: 'brainPromptClear' }\n | { type: 'pickerOpen'; query: string }\n | { type: 'pickerClose' }\n | { type: 'pickerSetMatches'; query: string; matches: string[] }\n | { type: 'pickerMove'; delta: number }\n | { type: 'toolStarted'; id: string; name: string }\n | { type: 'toolEnded'; id?: string; name?: string }\n | { type: 'toolStreamAppend'; toolUseId: string; name: string; text: string; startedAt: number }\n | { type: 'toolStreamClear'; toolUseId?: string; name?: string }\n | { type: 'enqueue'; item: Omit<QueueItem, 'id'> }\n | { type: 'dequeueFirst' }\n | { type: 'queueClear' }\n | { type: 'queueDelete'; positions: number[] }\n | { type: 'slashPickerOpen'; query: string; matches: SlashCommandMatch[] }\n | { type: 'slashPickerClose' }\n | { type: 'slashPickerMove'; delta: number }\n | { type: 'modelPickerOpen'; providers: ProviderOption[] }\n | { type: 'modelPickerClose' }\n | { type: 'modelPickerMove'; delta: number }\n | { type: 'modelPickerPickProvider'; providerId: string; models: string[] }\n | { type: 'modelPickerBack' }\n | { type: 'modelPickerHint'; text?: string }\n /** Update the search filter in step 2. */\n | { type: 'modelPickerSearch'; query: string }\n | { type: 'autonomyPickerOpen'; options: AutonomyOption[] }\n | { type: 'autonomyPickerClose' }\n | { type: 'autonomyPickerMove'; delta: number }\n | { type: 'autonomyPickerHint'; text?: string }\n | { type: 'settingsOpen'; mode: SettingsMode; delayMs: number }\n | { type: 'settingsClose' }\n | { type: 'settingsFieldMove'; delta: number }\n | { type: 'settingsFieldSet'; field: number }\n | { type: 'settingsValueChange'; delta: number }\n | { type: 'settingsHint'; text?: string }\n | { type: 'historyPush'; text: string }\n | { type: 'historyUp' }\n | { type: 'historyDown' }\n | { type: 'confirmOpen'; info: State['confirmQueue'][0] }\n | { type: 'confirmClose' }\n | { type: 'resetContextChip' }\n // Fleet actions\n | { type: 'fleetSeed'; entries: FleetEntry[]; cost: number }\n | {\n type: 'fleetSpawn';\n id: string;\n name?: string;\n provider?: string;\n model?: string;\n transcriptPath?: string;\n }\n | { type: 'fleetStart'; id: string; taskId?: string }\n | { type: 'fleetDelta'; id: string; text: string }\n | { type: 'fleetMessage'; id: string; text: string }\n | {\n type: 'fleetTool';\n id: string;\n name?: string;\n ok?: boolean;\n durationMs?: number;\n outputBytes?: number;\n outputLines?: number;\n }\n /** tool.started: pin the current tool name for status display. */\n | { type: 'fleetToolStart'; id: string; name: string }\n /** tool.executed: clear the current tool (paired with fleetTool). */\n | { type: 'fleetToolEnd'; id: string }\n | {\n type: 'fleetUsage';\n id: string;\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n }\n | {\n type: 'fleetDone';\n id: string;\n status: FleetEntry['status'];\n iterations: number;\n toolCalls: number;\n /** Human-readable failure reason, e.g. \"provider_auth\", \"rate_limit\", \"timeout\". */\n failureReason?: string;\n }\n | {\n type: 'fleetBudgetWarning';\n id: string;\n kind: string;\n used: number;\n limit: number;\n }\n | {\n type: 'fleetBudgetExtended';\n id: string;\n totalExtensions: number;\n }\n | {\n type: 'fleetCtxPct';\n id: string;\n load: number;\n tokens: number;\n maxContext: number;\n }\n | { type: 'fleetCost'; cost: number; input?: number; output?: number }\n | { type: 'leaderIterStart' }\n | { type: 'leaderIterEnd' }\n | { type: 'leaderToolStart'; name: string }\n | { type: 'leaderToolEnd'; name: string; ok?: boolean; durationMs?: number }\n | { type: 'leaderCtxPct'; load: number; tokens: number; maxContext: number }\n | { type: 'setStreamFleet'; enabled: boolean }\n | { type: 'toggleMonitor' }\n | { type: 'toggleAgentsMonitor' }\n | { type: 'toggleHelp' }\n | { type: 'checkpointReceived'; cp: State['checkpoints'][0] }\n | { type: 'rewindOverlayOpen' }\n | { type: 'rewindOverlayClose' }\n | { type: 'rewindOverlayMove'; delta: number }\n | { type: 'sessionRewound'; toPromptIndex: number }\n | {\n type: 'eternalStage';\n stage: AutonomyStage;\n }\n | { type: 'goalSummary'; summary: GoalSummary }\n | { type: 'autoPhaseInit'; title: string }\n | {\n type: 'autoPhasePhaseUpdate';\n phaseId: string;\n name: string;\n status: string;\n completedTasks: number;\n totalTasks: number;\n startedAt?: number;\n }\n | { type: 'autoPhaseRunningPhases'; phaseIds: string[] }\n | { type: 'autoPhaseElapsed'; ms: number }\n | { type: 'autoPhaseMonitorToggle' }\n | { type: 'autoPhaseReset' }\n | {\n type: 'worktreeUpsert';\n handleId: string;\n row: Partial<WorktreeRow & { baseBranch?: string }>;\n baseBranch?: string;\n }\n | { type: 'worktreeRemove'; handleId: string }\n | { type: 'worktreeMonitorToggle' }\n // --- In-app chat scroll (mouse mode) ---\n /** Scroll by `delta` rows: +up (older), -down (newer). Clamped. */\n | { type: 'scrollBy'; delta: number }\n | { type: 'scrollTo'; offset: number }\n /** Scroll by a viewport page in `dir`. */\n | { type: 'scrollPage'; dir: 'up' | 'down' }\n /** Jump to the newest output (pinned). */\n | { type: 'scrollToBottom' }\n /** Jump to the oldest output. */\n | { type: 'scrollToTop' }\n /** Report the measured content height; re-clamps offset + tracks new lines. */\n | { type: 'setMeasuredLines'; totalLines: number }\n /** Report the computed viewport height; re-clamps offset. */\n | { type: 'setViewportRows'; rows: number }\n /**\n * Fold a batch of fleet/display actions through the reducer in ONE pass so\n * a 150ms burst of subagent events produces a single React render instead\n * of one per event. Order-preserving; only high-frequency display events\n * are batched (correctness-sensitive events stay immediate).\n */\n | { type: 'fleetBatch'; actions: Action[] }\n /** BugHunter emitted a bug.found event on the FleetBus. */\n | {\n type: 'collabBugFound';\n sessionId: string;\n bugId: string;\n severity: string;\n description: string;\n }\n /** RefactorPlanner emitted a refactor.plan event on the FleetBus. */\n | {\n type: 'collabPlanEmitted';\n sessionId: string;\n planId: string;\n riskScore: string;\n phaseCount: number;\n }\n /** Critic emitted a critic.evaluation event on the FleetBus. */\n | {\n type: 'collabEvalComplete';\n sessionId: string;\n evalId: string;\n verdict: string;\n score: number;\n }\n /** Collab session completed — overall verdict is available. */\n | {\n type: 'collabSessionDone';\n sessionId: string;\n verdict: 'approve' | 'needs_revision' | 'reject';\n }\n /** A collab subagent (bug-hunter / refactor-planner / critic) was spawned. */\n | { type: 'collabSubagentSpawned'; subagentId: string; role: string };\n\nexport function reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'addEntry': {\n // Append-only. We render finalized entries via Ink's <Static>,\n // which forbids removals or reordering — old items live on in the\n // terminal's native scrollback. Memory growth is bounded by the\n // terminal's own scrollback limits in practice.\n const appended = [...state.entries, { ...action.entry, id: state.nextId } as HistoryEntry];\n return { ...state, entries: appended, nextId: state.nextId + 1 };\n }\n case 'setBuffer':\n return { ...state, buffer: action.buffer, cursor: action.cursor };\n case 'clearInput':\n return {\n ...state,\n buffer: '',\n cursor: 0,\n historyIndex: 0,\n picker: { open: false, query: '', matches: [], selected: 0 },\n slashPicker: { open: false, query: '', matches: [], selected: 0 },\n };\n case 'clearHistory': {\n // Keep only the banner entry (always first, id=0). Any other entries\n // (user messages, assistant responses, slash results) are discarded so\n // the TUI starts fresh after /clear.\n const banner = state.entries.find((e) => e.kind === 'banner');\n return {\n ...state,\n entries: banner ? [banner] : state.entries,\n queue: [],\n nextQueueId: 1,\n scrollOffset: 0,\n pendingNewLines: 0,\n };\n }\n case 'streamDelta':\n return { ...state, streamingText: state.streamingText + action.delta };\n case 'streamReset':\n return { ...state, streamingText: '' };\n case 'status':\n return { ...state, status: action.status };\n case 'interrupt':\n return { ...state, interrupts: state.interrupts + 1 };\n case 'steerStart':\n return { ...state, steeringPending: true, steerSnapshot: action.snapshot };\n case 'steerConsume':\n return { ...state, steeringPending: false, steerSnapshot: null, interrupts: 0 };\n case 'resetInterrupts':\n return { ...state, interrupts: 0 };\n case 'hint':\n return { ...state, hint: action.text };\n case 'brainStatus':\n return {\n ...state,\n brain: {\n state: action.state,\n source: action.source,\n risk: action.risk,\n summary: action.summary,\n updatedAt: Date.now(),\n },\n };\n case 'brainPromptSet':\n return { ...state, brainPrompt: action.prompt };\n case 'brainPromptClear':\n return { ...state, brainPrompt: null };\n case 'pickerOpen':\n return {\n ...state,\n picker: { open: true, query: action.query, matches: state.picker.matches, selected: 0 },\n };\n case 'pickerClose':\n return {\n ...state,\n picker: { open: false, query: '', matches: [], selected: 0 },\n };\n case 'pickerSetMatches':\n // Guard against stale async results — only apply if query still matches.\n if (!state.picker.open || state.picker.query !== action.query) return state;\n return {\n ...state,\n picker: {\n ...state.picker,\n matches: action.matches,\n selected: Math.min(state.picker.selected, Math.max(0, action.matches.length - 1)),\n },\n };\n case 'pickerMove': {\n const n = state.picker.matches.length;\n if (n === 0) return state;\n const next = (state.picker.selected + action.delta + n) % n;\n return { ...state, picker: { ...state.picker, selected: next } };\n }\n case 'toolStarted': {\n const next = new Map(state.runningTools);\n next.set(action.id, { name: action.name, startedAt: Date.now() });\n return { ...state, runningTools: next };\n }\n case 'toolEnded': {\n const next = new Map(state.runningTools);\n if (action.id !== undefined && next.has(action.id)) {\n next.delete(action.id);\n return { ...state, runningTools: next };\n }\n if (action.name !== undefined) {\n // Fall back to clearing the oldest running entry with this name —\n // `tool.executed` doesn't carry the tool_use id, so we approximate.\n for (const [id, info] of next) {\n if (info.name === action.name) {\n next.delete(id);\n return { ...state, runningTools: next };\n }\n }\n }\n return state;\n }\n case 'toolStreamAppend': {\n // Only one tool's stream is shown at a time. If a different tool is\n // currently streaming, switch — last writer wins. Streams from\n // not-yet-acknowledged tools take over as soon as data arrives, which\n // matches user intuition (whatever just produced output is what's\n // visible).\n const cur = state.toolStream;\n if (cur && cur.toolUseId === action.toolUseId) {\n return {\n ...state,\n toolStream: { ...cur, text: cur.text + action.text },\n };\n }\n return {\n ...state,\n toolStream: {\n toolUseId: action.toolUseId,\n name: action.name,\n text: action.text,\n startedAt: action.startedAt,\n },\n };\n }\n case 'toolStreamClear': {\n if (state.toolStream === null) return state;\n // Clear only when the finishing tool matches the streaming one. A\n // stale `tool.executed` for a different tool must not blank the\n // currently-visible stream.\n const t = state.toolStream;\n if (action.toolUseId !== undefined && action.toolUseId !== t.toolUseId) return state;\n if (action.name !== undefined && action.toolUseId === undefined && action.name !== t.name)\n return state;\n return { ...state, toolStream: null };\n }\n case 'enqueue': {\n const item: QueueItem = { ...action.item, id: state.nextQueueId };\n return {\n ...state,\n queue: [...state.queue, item],\n nextQueueId: state.nextQueueId + 1,\n };\n }\n case 'dequeueFirst': {\n if (state.queue.length === 0) return state;\n return { ...state, queue: state.queue.slice(1) };\n }\n case 'queueClear': {\n if (state.queue.length === 0) return state;\n return { ...state, queue: [] };\n }\n case 'queueDelete': {\n if (state.queue.length === 0 || action.positions.length === 0) return state;\n // Positions are 1-based; convert to 0-based set for fast filtering.\n const drop = new Set(action.positions.map((p) => p - 1).filter((i) => i >= 0));\n const filtered = state.queue.filter((_, i) => !drop.has(i));\n if (filtered.length === state.queue.length) return state;\n return { ...state, queue: filtered };\n }\n case 'slashPickerOpen':\n return {\n ...state,\n slashPicker: { open: true, query: action.query, matches: action.matches, selected: 0 },\n };\n case 'slashPickerClose':\n return {\n ...state,\n slashPicker: { open: false, query: '', matches: [], selected: 0 },\n };\n case 'slashPickerMove': {\n const n = state.slashPicker.matches.length;\n if (n === 0) return state;\n const next = (state.slashPicker.selected + action.delta + n) % n;\n return { ...state, slashPicker: { ...state.slashPicker, selected: next } };\n }\n case 'historyPush': {\n if (action.text === '' || action.text === state.inputHistory[0]) return state;\n return { ...state, inputHistory: [action.text, ...state.inputHistory].slice(0, 100) };\n }\n case 'historyUp': {\n if (state.inputHistory.length === 0) return state;\n const next = Math.min(state.historyIndex + 1, state.inputHistory.length);\n const entry = state.inputHistory[next - 1] ?? '';\n return { ...state, historyIndex: next, buffer: entry, cursor: entry.length };\n }\n case 'historyDown': {\n if (state.historyIndex === 0) return state;\n const next = state.historyIndex - 1;\n const entry = next === 0 ? '' : (state.inputHistory[next - 1] ?? '');\n return { ...state, historyIndex: next, buffer: entry, cursor: entry.length };\n }\n case 'modelPickerOpen':\n return {\n ...state,\n modelPicker: {\n open: true,\n step: 'provider',\n providerOptions: action.providers,\n modelOptions: [],\n filteredOptions: [],\n selected: 0,\n hint: undefined,\n searchQuery: '',\n },\n };\n case 'modelPickerClose':\n return {\n ...state,\n modelPicker: {\n open: false,\n step: 'provider',\n providerOptions: [],\n modelOptions: [],\n filteredOptions: [],\n selected: 0,\n searchQuery: '',\n },\n };\n case 'modelPickerMove': {\n if (!state.modelPicker.open) return state;\n const list =\n state.modelPicker.step === 'provider'\n ? state.modelPicker.providerOptions\n : state.modelPicker.filteredOptions;\n const len = list.length;\n if (len === 0) return state;\n const next = (state.modelPicker.selected + action.delta + len) % len;\n return {\n ...state,\n modelPicker: { ...state.modelPicker, selected: next },\n };\n }\n case 'modelPickerPickProvider':\n return {\n ...state,\n modelPicker: {\n ...state.modelPicker,\n step: 'model',\n modelOptions: action.models,\n filteredOptions: action.models,\n selected: 0,\n pickedProviderId: action.providerId,\n hint: undefined,\n searchQuery: '',\n },\n };\n case 'modelPickerBack':\n return {\n ...state,\n modelPicker: {\n ...state.modelPicker,\n step: 'provider',\n modelOptions: [],\n filteredOptions: [],\n selected: 0,\n pickedProviderId: undefined,\n hint: undefined,\n searchQuery: '',\n },\n };\n case 'modelPickerSearch': {\n if (!state.modelPicker.open || state.modelPicker.step !== 'model') return state;\n const q = action.query.toLowerCase();\n const filtered = q\n ? state.modelPicker.modelOptions.filter((id) => id.toLowerCase().includes(q))\n : state.modelPicker.modelOptions;\n const selected = filtered.length > 0\n ? Math.min(state.modelPicker.selected, filtered.length - 1)\n : 0;\n return {\n ...state,\n modelPicker: {\n ...state.modelPicker,\n filteredOptions: filtered,\n selected,\n searchQuery: action.query,\n hint: undefined,\n },\n };\n }\n case 'modelPickerHint':\n return {\n ...state,\n modelPicker: { ...state.modelPicker, hint: action.text },\n };\n case 'autonomyPickerOpen':\n return {\n ...state,\n autonomyPicker: { open: true, options: action.options, selected: 0, hint: undefined },\n };\n case 'autonomyPickerClose':\n return {\n ...state,\n autonomyPicker: { open: false, options: [], selected: 0 },\n };\n case 'autonomyPickerMove': {\n const n = state.autonomyPicker.options.length;\n if (n === 0) return state;\n const next = (state.autonomyPicker.selected + action.delta + n) % n;\n return {\n ...state,\n autonomyPicker: { ...state.autonomyPicker, selected: next },\n };\n }\n case 'autonomyPickerHint':\n return {\n ...state,\n autonomyPicker: { ...state.autonomyPicker, hint: action.text },\n };\n case 'settingsOpen':\n return {\n ...state,\n settingsPicker: {\n open: true,\n field: 0,\n mode: action.mode,\n delayMs: action.delayMs,\n hint: undefined,\n },\n };\n case 'settingsClose':\n return {\n ...state,\n settingsPicker: { ...state.settingsPicker, open: false, hint: undefined },\n };\n case 'settingsFieldMove': {\n // Two fields (mode / delay); wrap around.\n const next = (state.settingsPicker.field + action.delta + 2) % 2;\n return {\n ...state,\n settingsPicker: { ...state.settingsPicker, field: next, hint: undefined },\n };\n }\n case 'settingsFieldSet': {\n const field = action.field === 1 ? 1 : 0;\n return { ...state, settingsPicker: { ...state.settingsPicker, field, hint: undefined } };\n }\n case 'settingsValueChange': {\n if (state.settingsPicker.field === 0) {\n const i = SETTINGS_MODES.indexOf(state.settingsPicker.mode);\n const base = i < 0 ? 0 : i;\n const next = (base + action.delta + SETTINGS_MODES.length) % SETTINGS_MODES.length;\n return {\n ...state,\n settingsPicker: { ...state.settingsPicker, mode: SETTINGS_MODES[next]!, hint: undefined },\n };\n }\n const j = DELAY_PRESETS_MS.indexOf(state.settingsPicker.delayMs);\n // Snap an off-preset value onto the nearest step before moving.\n const base = j < 0 ? 0 : j;\n const next = (base + action.delta + DELAY_PRESETS_MS.length) % DELAY_PRESETS_MS.length;\n return {\n ...state,\n settingsPicker: {\n ...state.settingsPicker,\n delayMs: DELAY_PRESETS_MS[next]!,\n hint: undefined,\n },\n };\n }\n case 'settingsHint':\n return { ...state, settingsPicker: { ...state.settingsPicker, hint: action.text } };\n case 'confirmOpen':\n return { ...state, confirmQueue: [...state.confirmQueue, action.info] };\n case 'confirmClose':\n return { ...state, confirmQueue: state.confirmQueue.slice(1) };\n case 'resetContextChip':\n return { ...state, contextChipVersion: state.contextChipVersion + 1 };\n // --- Fleet ---\n case 'fleetSeed': {\n const seeded: Record<string, FleetEntry> = {};\n for (const e of action.entries) {\n seeded[e.id] = {\n ...e,\n recentTools: e.recentTools ?? [],\n recentMessages: e.recentMessages ?? [],\n };\n }\n return { ...state, fleet: seeded, fleetCost: action.cost };\n }\n case 'fleetSpawn': {\n const existing = state.fleet[action.id];\n const incomingName = action.name ?? action.id.slice(0, 8);\n // Placeholder names that should be overwritten when a better name arrives.\n // \"adhoc\" is what MultiAgentHost.spawn() seeds before Director.spawn()\n // assigns the real nickname. id-prefix fallbacks also count as placeholders.\n const isPlaceholderName = (name: string) =>\n name === 'adhoc' ||\n name === 'subagent' ||\n name === 'generic' ||\n name.startsWith('slot-') ||\n name === action.id.slice(0, 8);\n\n if (existing) {\n // If we already have an entry but it has a placeholder name and the\n // incoming name is a real improvement, update the name. This handles\n // the race between EventBus's \"subagent.spawned\" (which fires before\n // Director.spawn() assigns the nickname) and FleetBus's\n // \"subagent.assigned\" (which fires after the manifest is updated).\n if (\n isPlaceholderName(existing.name) &&\n !isPlaceholderName(incomingName) &&\n incomingName !== existing.name\n ) {\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: { ...existing, name: incomingName },\n },\n };\n }\n return state;\n }\n const entry: FleetEntry = {\n id: action.id,\n name: incomingName,\n provider: action.provider,\n model: action.model,\n status: 'idle',\n streamingText: '',\n iterations: 0,\n toolCalls: 0,\n recentTools: [],\n recentMessages: [],\n cost: 0,\n startedAt: Date.now(),\n lastEventAt: Date.now(),\n transcriptPath: action.transcriptPath,\n };\n return { ...state, fleet: { ...state.fleet, [action.id]: entry } };\n }\n case 'fleetToolStart': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: {\n ...cur,\n currentTool: { name: action.name, startedAt: Date.now() },\n lastEventAt: Date.now(),\n },\n },\n };\n }\n case 'fleetToolEnd': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: { ...cur, currentTool: undefined, lastEventAt: Date.now() },\n },\n };\n }\n case 'fleetStart': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: {\n ...cur,\n status: 'running' as const,\n streamingText: '',\n budgetWarning: undefined, // clear on restart\n startedAt: Date.now(),\n },\n },\n };\n }\n case 'fleetDelta': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n // Keep last 500 chars of streaming text for display (refactor plans are verbose)\n const appended = (cur.streamingText + action.text).slice(-500);\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: { ...cur, streamingText: appended, lastEventAt: Date.now() },\n },\n };\n }\n case 'fleetMessage': {\n const cur = state.fleet[action.id];\n const text = action.text.trim().replace(/\\s+/g, ' ');\n if (!cur || !text) return state;\n const now = Date.now();\n const recentMessages = [...(cur.recentMessages ?? []), { text, at: now }].slice(-2);\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: { ...cur, recentMessages, lastEventAt: now },\n },\n };\n }\n case 'fleetTool': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n const now = Date.now();\n const recentTools =\n action.name !== undefined\n ? [\n ...(cur.recentTools ?? []),\n {\n name: action.name,\n ok: action.ok,\n durationMs: action.durationMs,\n outputBytes: action.outputBytes,\n outputLines: action.outputLines,\n at: now,\n },\n ].slice(-2)\n : (cur.recentTools ?? []);\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: {\n ...cur,\n toolCalls: cur.toolCalls + 1,\n recentTools,\n lastEventAt: now,\n },\n },\n };\n }\n case 'fleetUsage': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: { ...state.fleet, [action.id]: { ...cur, lastEventAt: Date.now() } },\n };\n }\n case 'fleetDone': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: {\n ...cur,\n status: action.status,\n iterations: action.iterations,\n toolCalls: action.toolCalls,\n streamingText: '',\n currentTool: undefined,\n budgetWarning: undefined, // clear on done/restart\n lastEventAt: Date.now(),\n failureReason: action.failureReason,\n },\n },\n };\n }\n case 'fleetBudgetWarning': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: {\n ...cur,\n budgetWarning: {\n kind: action.kind,\n used: action.used,\n limit: action.limit,\n at: Date.now(),\n },\n lastEventAt: Date.now(),\n },\n },\n };\n }\n case 'fleetBudgetExtended': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: {\n ...cur,\n // The director sends the authoritative cumulative count; trust it\n // over a local increment so a dropped event can't desync the badge.\n extensions: action.totalExtensions,\n lastEventAt: Date.now(),\n },\n },\n };\n }\n case 'fleetCtxPct': {\n const cur = state.fleet[action.id];\n if (!cur) return state;\n return {\n ...state,\n fleet: {\n ...state.fleet,\n [action.id]: {\n ...cur,\n ctxPct: action.load,\n ctxTokens: action.tokens,\n ctxMaxTokens: action.maxContext,\n lastEventAt: Date.now(),\n },\n },\n };\n }\n case 'fleetCost': {\n return {\n ...state,\n fleetCost: action.cost,\n fleetTokens:\n action.input !== undefined || action.output !== undefined\n ? {\n input: action.input ?? state.fleetTokens.input,\n output: action.output ?? state.fleetTokens.output,\n }\n : state.fleetTokens,\n };\n }\n case 'leaderIterStart': {\n return {\n ...state,\n leader: {\n ...state.leader,\n iterations: state.leader.iterations + 1,\n iterating: true,\n lastEventAt: Date.now(),\n },\n };\n }\n case 'leaderIterEnd': {\n return {\n ...state,\n leader: { ...state.leader, iterating: false, lastEventAt: Date.now() },\n };\n }\n case 'leaderToolStart': {\n return {\n ...state,\n leader: {\n ...state.leader,\n currentTool: { name: action.name, startedAt: Date.now() },\n lastEventAt: Date.now(),\n },\n };\n }\n case 'leaderToolEnd': {\n const now = Date.now();\n const recentTools = [\n ...state.leader.recentTools,\n { name: action.name, ok: action.ok, durationMs: action.durationMs, at: now },\n ].slice(-8);\n return {\n ...state,\n leader: {\n ...state.leader,\n toolCalls: state.leader.toolCalls + 1,\n currentTool: undefined,\n recentTools,\n lastEventAt: now,\n },\n };\n }\n case 'leaderCtxPct': {\n return {\n ...state,\n leader: {\n ...state.leader,\n ctxPct: action.load,\n ctxTokens: action.tokens,\n ctxMaxTokens: action.maxContext,\n lastEventAt: Date.now(),\n },\n };\n }\n case 'setStreamFleet': {\n return { ...state, streamFleet: action.enabled };\n }\n case 'toggleMonitor': {\n return { ...state, monitorOpen: !state.monitorOpen };\n }\n case 'toggleAgentsMonitor': {\n return { ...state, agentsMonitorOpen: !state.agentsMonitorOpen };\n }\n case 'toggleHelp': {\n return { ...state, helpOpen: !state.helpOpen };\n }\n case 'checkpointReceived': {\n const existing = state.checkpoints.find((c) => c.promptIndex === action.cp.promptIndex);\n if (existing) return state;\n return { ...state, checkpoints: [...state.checkpoints, action.cp] };\n }\n case 'rewindOverlayOpen': {\n return {\n ...state,\n rewindOverlay: { checkpoints: state.checkpoints, selected: state.checkpoints.length - 1 },\n };\n }\n case 'rewindOverlayClose': {\n return { ...state, rewindOverlay: null };\n }\n case 'rewindOverlayMove': {\n if (!state.rewindOverlay) return state;\n const len = state.rewindOverlay.checkpoints.length;\n if (len === 0) return { ...state, rewindOverlay: null };\n const selected = Math.max(0, Math.min(len - 1, state.rewindOverlay.selected + action.delta));\n return { ...state, rewindOverlay: { ...state.rewindOverlay, selected } };\n }\n case 'sessionRewound': {\n return {\n ...state,\n checkpoints: state.checkpoints.filter((c) => c.promptIndex <= action.toPromptIndex),\n rewindOverlay: null,\n };\n }\n case 'eternalStage': {\n return { ...state, eternalStage: action.stage };\n }\n case 'goalSummary': {\n return { ...state, goalSummary: action.summary };\n }\n case 'autoPhaseInit': {\n return {\n ...state,\n autoPhase: {\n title: action.title,\n phases: {},\n runningPhaseIds: [],\n elapsedMs: 0,\n monitorOpen: false,\n },\n };\n }\n case 'autoPhasePhaseUpdate': {\n // Lazily initialize autoPhase state on first phase event — the title\n // is not shown in the PhaseMonitor so a placeholder is fine here.\n const existing = state.autoPhase ?? {\n title: 'AutoPhase',\n phases: {},\n runningPhaseIds: [],\n elapsedMs: 0,\n monitorOpen: false,\n };\n return {\n ...state,\n autoPhase: {\n ...existing,\n phases: {\n ...existing.phases,\n [action.phaseId]: {\n name: action.name,\n status: action.status,\n completedTasks: action.completedTasks,\n totalTasks: action.totalTasks,\n startedAt: action.startedAt,\n },\n },\n },\n };\n }\n case 'autoPhaseRunningPhases': {\n if (!state.autoPhase) return state;\n return {\n ...state,\n autoPhase: { ...state.autoPhase, runningPhaseIds: action.phaseIds },\n };\n }\n case 'autoPhaseElapsed': {\n if (!state.autoPhase) return state;\n return { ...state, autoPhase: { ...state.autoPhase, elapsedMs: action.ms } };\n }\n case 'autoPhaseMonitorToggle': {\n if (!state.autoPhase) return state;\n return {\n ...state,\n autoPhase: { ...state.autoPhase, monitorOpen: !state.autoPhase.monitorOpen },\n };\n }\n case 'autoPhaseReset': {\n return { ...state, autoPhase: null };\n }\n case 'worktreeUpsert': {\n const prev = state.worktrees[action.handleId];\n const merged: WorktreeRow & { baseBranch?: string } = {\n branch: '',\n ownerLabel: '',\n status: 'active',\n insertions: 0,\n deletions: 0,\n files: 0,\n allocatedAt: Date.now(),\n ...prev,\n ...action.row,\n };\n return {\n ...state,\n worktrees: { ...state.worktrees, [action.handleId]: merged },\n worktreeBase: action.baseBranch ?? state.worktreeBase,\n };\n }\n case 'worktreeRemove': {\n if (!state.worktrees[action.handleId]) return state;\n const next = { ...state.worktrees };\n delete next[action.handleId];\n return { ...state, worktrees: next };\n }\n case 'worktreeMonitorToggle': {\n return { ...state, worktreeMonitorOpen: !state.worktreeMonitorOpen };\n }\n // --- In-app chat scroll (mouse mode) ---\n case 'scrollBy': {\n const maxOffset = Math.max(0, state.totalLines - state.viewportRows);\n const next = Math.max(0, Math.min(maxOffset, state.scrollOffset + action.delta));\n return {\n ...state,\n scrollOffset: next,\n pendingNewLines: next === 0 ? 0 : state.pendingNewLines,\n };\n }\n case 'scrollPage': {\n const page = Math.max(1, state.viewportRows - 1);\n const delta = action.dir === 'up' ? page : -page;\n const maxOffset = Math.max(0, state.totalLines - state.viewportRows);\n const next = Math.max(0, Math.min(maxOffset, state.scrollOffset + delta));\n return {\n ...state,\n scrollOffset: next,\n pendingNewLines: next === 0 ? 0 : state.pendingNewLines,\n };\n }\n case 'scrollTo': {\n const maxOffset = Math.max(0, state.totalLines - state.viewportRows);\n const next = Math.max(0, Math.min(maxOffset, action.offset));\n return {\n ...state,\n scrollOffset: next,\n pendingNewLines: next === 0 ? 0 : state.pendingNewLines,\n };\n }\n case 'scrollToBottom':\n return { ...state, scrollOffset: 0, pendingNewLines: 0 };\n case 'scrollToTop': {\n const maxOffset = Math.max(0, state.totalLines - state.viewportRows);\n return { ...state, scrollOffset: maxOffset };\n }\n case 'setMeasuredLines': {\n const newTotal = action.totalLines;\n const oldTotal = state.totalLines;\n const maxOffset = Math.max(0, newTotal - state.viewportRows);\n // Content grew while the user is scrolled up → keep the visible window\n // anchored on the same older rows by pushing the offset along with the\n // growth, and surface the new-line count for the \"jump to bottom\" hint.\n if (state.scrollOffset > 0 && newTotal > oldTotal) {\n const grew = newTotal - oldTotal;\n return {\n ...state,\n totalLines: newTotal,\n scrollOffset: Math.min(maxOffset, state.scrollOffset + grew),\n pendingNewLines: state.pendingNewLines + grew,\n };\n }\n // Pinned, or content shrank (e.g. /clear): re-clamp and keep following.\n return {\n ...state,\n totalLines: newTotal,\n scrollOffset: Math.min(state.scrollOffset, maxOffset),\n };\n }\n case 'setViewportRows': {\n const maxOffset = Math.max(0, state.totalLines - action.rows);\n return {\n ...state,\n viewportRows: action.rows,\n scrollOffset: Math.min(state.scrollOffset, maxOffset),\n };\n }\n case 'fleetBatch':\n // Fold each batched action through the reducer; one new state, one render.\n return action.actions.reduce((s, a) => reducer(s, a), state);\n // --- Collab session ---\n case 'collabSubagentSpawned': {\n // Lazily initialize collab state on the first subagent spawn.\n if (state.collabSession) return state;\n return {\n ...state,\n collabSession: {\n sessionId: null,\n bugCount: 0,\n planCount: 0,\n evalCount: 0,\n overallVerdict: null,\n timeline: [{ at: Date.now(), icon: '⚡', color: 'cyan', text: `${action.role} spawned` }],\n startedAt: Date.now(),\n },\n };\n }\n case 'collabBugFound': {\n const cs = state.collabSession;\n if (!cs) {\n // Lazily bootstrap collab state on first event.\n return {\n ...state,\n collabSession: {\n sessionId: action.sessionId,\n bugCount: 1,\n planCount: 0,\n evalCount: 0,\n overallVerdict: null,\n timeline: [\n {\n at: Date.now(),\n icon: '🐛',\n color: 'red',\n text: `bug: ${action.description.slice(0, 60)}…`,\n },\n ],\n startedAt: Date.now(),\n },\n };\n }\n const entry = {\n at: Date.now(),\n icon: '🐛',\n color: 'red',\n text: `bug [${action.severity}]: ${action.description.slice(0, 55)}…`,\n };\n return {\n ...state,\n collabSession: {\n ...cs,\n sessionId: action.sessionId,\n bugCount: cs.bugCount + 1,\n timeline: [entry, ...cs.timeline].slice(0, 30),\n },\n };\n }\n case 'collabPlanEmitted': {\n const cs = state.collabSession;\n if (!cs) return state;\n const entry = {\n at: Date.now(),\n icon: '📐',\n color: 'yellow',\n text: `plan [${action.riskScore}]: ${action.phaseCount} phases`,\n };\n return {\n ...state,\n collabSession: {\n ...cs,\n sessionId: action.sessionId,\n planCount: cs.planCount + 1,\n timeline: [entry, ...cs.timeline].slice(0, 30),\n },\n };\n }\n case 'collabEvalComplete': {\n const cs = state.collabSession;\n if (!cs) return state;\n const entry = {\n at: Date.now(),\n icon: '⚖️',\n color:\n action.verdict === 'approve' ? 'green' : action.verdict === 'reject' ? 'red' : 'yellow',\n text: `eval ${action.score}/10 → ${action.verdict}`,\n };\n return {\n ...state,\n collabSession: {\n ...cs,\n sessionId: action.sessionId,\n evalCount: cs.evalCount + 1,\n timeline: [entry, ...cs.timeline].slice(0, 30),\n },\n };\n }\n case 'collabSessionDone': {\n const cs = state.collabSession;\n if (!cs) return state;\n const entry = {\n at: Date.now(),\n icon: '🏁',\n color: 'green',\n text: `session done — ${action.verdict}`,\n };\n return {\n ...state,\n collabSession: {\n ...cs,\n overallVerdict: action.verdict,\n timeline: [entry, ...cs.timeline].slice(0, 30),\n },\n };\n }\n }\n}\n\nconst PASTE_THRESHOLD_CHARS = 200;\n\n/**\n * Build the steering preamble that gets prepended to a user's message\n * after they pressed Esc to interrupt the agent. The preamble carries\n * three things the model would otherwise have to infer:\n *\n * 1. Context — exactly what was in flight (tool calls, subagents,\n * partial assistant text). Without this the model rationalizes\n * from chat scrollback and often resumes the prior task by\n * accident.\n * 2. Authority — a short, explicit list of what the model is\n * allowed to do (abandon the prior plan, respawn fresh\n * subagents, ask for clarification). Models hedge unless they\n * believe they have permission to pivot hard.\n * 3. New direction — the user's actual instruction, fenced off.\n *\n * The block is user-role plain text. We deliberately don't use a\n * system role here — the human triggered this, so accountability\n * stays with their turn and the model can challenge / clarify\n * without violating role separation.\n *\n * Exported for the steering test that pins the contract.\n */\nexport function buildSteeringPreamble(\n snapshot: State['steerSnapshot'],\n newDirection: string,\n): string {\n const lines: string[] = ['[STEERING — I pressed Esc to interrupt you mid-task on purpose.', ''];\n\n // Section 1: what was running. Even an empty list is useful —\n // tells the model \"you weren't doing much yet, no work to mourn\".\n const ctx: string[] = [];\n if (snapshot?.runningTools && snapshot.runningTools.length > 0) {\n ctx.push(`- in-flight tools (now cancelled): ${snapshot.runningTools.join(', ')}`);\n }\n if (snapshot?.subagentsTerminated && snapshot.subagentsTerminated > 0) {\n const subDetails = snapshot.subagents\n .map((s) => `${s.label}${s.tool ? ` (was running: ${s.tool})` : ''}`)\n .join(', ');\n ctx.push(\n `- subagents (${snapshot.subagentsTerminated} terminated by me, do NOT await them): ${subDetails}`,\n );\n }\n if (snapshot?.partialAssistantText && snapshot.partialAssistantText.trim().length > 0) {\n const tail = snapshot.partialAssistantText.trim().slice(-300);\n ctx.push(`- your last partial output (truncated, for context only): \"${tail}\"`);\n }\n if (ctx.length > 0) {\n lines.push('What was happening when I cut you off:');\n lines.push(...ctx);\n lines.push('');\n }\n\n // Section 2: authority. Explicit grant so the model doesn't hedge.\n lines.push('You have authority to:');\n lines.push('- Abandon the prior plan entirely if the new direction makes it stale.');\n lines.push('- Re-spawn fresh subagents (with different roles or tasks) if needed.');\n lines.push('- Skip a polite \"should I continue?\" — just pivot.');\n lines.push('- Ask me to clarify if the new direction is genuinely ambiguous.');\n lines.push('');\n\n // Section 3: the user's instruction, fenced so the model can't\n // mistake it for part of the preamble.\n lines.push('New direction:');\n lines.push('---');\n lines.push(newDirection);\n lines.push('---');\n lines.push(']');\n\n return lines.join('\\n');\n}\n\n// `buildGoalPreamble` was relocated to @wrongstack/core so headless and\n// WebUI callers (which depend on @wrongstack/cli but not @wrongstack/tui)\n// can issue `/goal set` without dragging the TUI package in. Re-exported\n// from this module for backward compatibility with consumers still\n// importing from @wrongstack/tui; also used locally within this file\n// where `/goal …` is wired into the chat-input handler.\nexport { buildGoalPreamble } from '@wrongstack/core';\n\nexport function App({\n agent,\n slashRegistry,\n attachments,\n events,\n tokenCounter,\n visionAdapters = [],\n supportsVision,\n model,\n banner = true,\n queueStore,\n yolo = false,\n getYolo,\n getAutonomy,\n getEternalEngine,\n getParallelEngine,\n subscribeEternalIteration,\n subscribeEternalStage,\n subscribeAutoPhase,\n getSDDContext,\n onSDDOutput,\n appVersion,\n provider,\n family,\n keyTail,\n getPickableProviders,\n switchProviderAndModel,\n getSettings,\n saveSettings,\n predictNext,\n switchAutonomy,\n effectiveMaxContext,\n onExit,\n director,\n fleetRoster,\n onClearHistory,\n fleetStreamController,\n statuslineHiddenItems,\n setStatuslineHiddenItems,\n agentsMonitorController,\n initialGoal,\n initialAsk,\n sessionsDir,\n mouse = false,\n subscribeMouse,\n managed = false,\n}: AppProps): React.ReactElement {\n const { exit } = useApp();\n // Reactive mirrors of agent.ctx.{model,provider.id} so the status bar\n // re-renders when /model or /use mutate them. The banner is `Static`\n // and never re-renders — the user gets the textual confirmation from\n // the slash command's message in history instead.\n const [liveModel, setLiveModel] = useState<string>(model);\n const [liveProvider, setLiveProvider] = useState<string>(provider ?? 'agent');\n // CLI resolves the startup model's catalog limit, but /model can switch to a\n // different model without remounting App. Keep the denominator mutable so the\n // status bar follows the active model instead of a stale launch-time prop.\n const [activeMaxContext, setActiveMaxContext] = useState<number | undefined>(effectiveMaxContext);\n const [yoloLive, setYoloLive] = useState<boolean>(yolo);\n const [autonomyLive, setAutonomyLive] = useState<\n 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel'\n >(getAutonomy?.() ?? 'off');\n const [hiddenItems, setHiddenItems] = useState(statuslineHiddenItems);\n\n // Terminal row count, tracked reactively so the mouse-mode scroll viewport\n // can size itself against the live screen height. Only consumed in mouse\n // mode; harmless to track otherwise.\n const { stdout } = useStdout();\n const [termRows, setTermRows] = useState(stdout?.rows ?? 24);\n const [termCols, setTermCols] = useState(stdout?.columns ?? 80);\n useEffect(() => {\n const onResize = () => {\n setTermRows(process.stdout.rows ?? 24);\n setTermCols(process.stdout.columns ?? 80);\n };\n process.stdout.on('resize', onResize);\n return () => {\n process.stdout.off('resize', onResize);\n };\n }, []);\n\n // `mouse` (prop) is the launch-time CAPABILITY: it's only true when run-tui\n // set up the stdin proxy + mouse-event subscription, which only happens with\n // --mouse. `mouseLive` is the runtime ON/OFF, toggled by `/mouse`. Tracking\n // can only be enabled when the capability exists (otherwise mouse bytes would\n // pollute Ink), so /mouse refuses to turn on without --mouse.\n const [mouseLive, setMouseLive] = useState(mouse);\n // Whether the managed viewport (ScrollableHistory + in-app scroll) is the\n // active surface. Mirrors alt-screen; toggled by /altscreen and /mouse.\n const [managedLive, setManagedLive] = useState(managed);\n\n // Sync when parent re-loads from config file (e.g., after /statusline reset)\n useEffect(() => {\n setHiddenItems(statuslineHiddenItems);\n }, [statuslineHiddenItems]);\n\n // Push local changes back to the parent controller so /statusline sees them\n useEffect(() => {\n setStatuslineHiddenItems(hiddenItems);\n }, [setStatuslineHiddenItems, hiddenItems]);\n\n const projectRoot = agent.ctx.projectRoot;\n\n // Load goal.json on mount to show startup banner with goal state\n useEffect(() => {\n if (!projectRoot) return;\n const goalPath = path.join(projectRoot, '.wrongstack', 'goal.json');\n fs.readFile(goalPath, 'utf8')\n .then((raw) => {\n const goal = JSON.parse(raw);\n if (goal?.goal && typeof goal.iterations === 'number') {\n const lastEntry = goal.journal?.[goal.journal.length - 1];\n dispatch({\n type: 'goalSummary',\n summary: {\n goal: goal.goal,\n goalState: goal.goalState ?? 'active',\n iterations: goal.iterations,\n lastTask: lastEntry?.task,\n lastStatus: lastEntry?.status,\n },\n });\n }\n })\n .catch(() => {\n // No goal file yet — that's fine\n });\n }, [projectRoot]);\n\n const [state, dispatch] = useReducer(reducer, {\n entries: banner\n ? [\n {\n id: 0,\n kind: 'banner' as const,\n version: appVersion ?? 'dev',\n provider: provider ?? 'agent',\n model,\n cwd: agent.ctx.cwd,\n family,\n keyTail,\n },\n ]\n : [],\n buffer: '',\n cursor: 0,\n streamingText: '',\n toolStream: null,\n status: 'idle' as const,\n interrupts: 0,\n steeringPending: false,\n steerSnapshot: null,\n hint: '',\n brain: { state: 'idle' as const },\n brainPrompt: null,\n nextId: 1,\n picker: { open: false, query: '', matches: [], selected: 0 },\n slashPicker: { open: false, query: '', matches: [], selected: 0 },\n runningTools: new Map(),\n queue: [],\n nextQueueId: 1,\n inputHistory: [],\n historyIndex: 0,\n modelPicker: {\n open: false,\n step: 'provider' as const,\n providerOptions: [],\n modelOptions: [],\n filteredOptions: [],\n selected: 0,\n searchQuery: '',\n },\n autonomyPicker: { open: false, options: [], selected: 0 },\n settingsPicker: { open: false, field: 0, mode: 'off', delayMs: 0 },\n confirmQueue: [],\n contextChipVersion: 0,\n fleet: {},\n leader: {\n iterations: 0,\n toolCalls: 0,\n recentTools: [],\n currentTool: undefined,\n startedAt: Date.now(),\n lastEventAt: Date.now(),\n iterating: false,\n },\n fleetCost: 0,\n fleetTokens: { input: 0, output: 0 },\n streamFleet: true,\n monitorOpen: false,\n agentsMonitorOpen: false,\n helpOpen: false,\n collabSession: null,\n checkpoints: [],\n rewindOverlay: null,\n eternalStage: null,\n goalSummary: null,\n autoPhase: null,\n worktrees: {},\n worktreeMonitorOpen: false,\n scrollOffset: 0,\n totalLines: 0,\n viewportRows: 0,\n pendingNewLines: 0,\n });\n\n const builderRef = useRef<InputBuilder | null>(null);\n if (builderRef.current === null) {\n builderRef.current = new InputBuilder({ store: attachments });\n }\n\n // Bracketed-paste accumulator. A single paste can be delivered across\n // several stdin/keypress events: only the first carries the \\x1b[200~\n // begin marker and only the last carries \\x1b[201~. We buffer every\n // fragment here between those markers and finalize once, so a paste never\n // fragments into multiple placeholders or leaks newlines into the buffer.\n // `null` means \"not currently inside a paste\".\n const pasteAccumRef = useRef<string | null>(null);\n // Safety net: if the closing \\x1b[201~ marker never arrives (a terminal\n // dropped it, or Ink split the escape across chunks), flush the buffered\n // payload after a short idle period so accumulation can't swallow input\n // indefinitely. Real pastes deliver all fragments back-to-back, well\n // inside this window.\n const pasteFlushTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const activeCtrlRef = useRef<AbortController | null>(null);\n // Set once we've asked Ink to unmount on a Ctrl+C exit. A synchronous ref\n // (not React state) because consecutive SIGINTs can fire faster than a\n // re-render — without it, `stateRef.current.interrupts` reads stale and a\n // wedged unmount could never escalate to a hard exit.\n const exitRequestedRef = useRef(false);\n // Prevent re-entrant handleKey: some terminals emit \\r\\n as two separate\n // stdin events for Enter. While the first event is being processed (submit\n // or picker accept), the second arrives with stale state and would trigger\n // a duplicate action. The gate blocks the stale-second event entirely.\n const inputGateRef = useRef(false);\n // Separate guard JUST for the submit path. The full `inputGateRef`\n // is held across `await foo()` blocks (picker accept, model picker\n // commit) — that's fine because those resolve in milliseconds. But\n // `await submit()` resolves only when `agent.run()` finishes, which\n // can be minutes for a delegated subagent task. Using the same gate\n // would lock ALL keystrokes (typing, backspace, slash menu) for the\n // entire agent run. This timestamp-based guard fires for the few\n // milliseconds needed to debounce a terminal-side `\\r\\n` double-event\n // and then auto-releases — leaving the input live for the user.\n const lastEnterAtRef = useRef(0);\n // Maps an inline attachment token (e.g. `[pasted #1, 123 lines]`) to a short\n // preview of its content, so the chat-history entry can show the collapsed\n // text below the message. Append-only for the lifetime of the session; the\n // token strings are unique per attachment seq, so stale entries are inert.\n const tokenPreviewsRef = useRef<Map<string, string>>(new Map());\n // The status-bar chip surfaces the basename so multiple WrongStack\n // windows running against different repos are immediately distinguishable.\n // Empty / root fallback to undefined so the chip just hides itself.\n const projectName = React.useMemo(() => {\n const base = path.basename(projectRoot);\n return base && base !== path.sep ? base : undefined;\n }, [projectRoot]);\n\n // Source of truth for the streamed assistant text — kept here, not in\n // React state, because we need to read it synchronously when `agent.run`\n // returns. The React `streamingText` shown in the live tail is throttled\n // (~10fps) for redraw cost, so it can lag the actual stream by up to\n // FLUSH_MS. Reading from this ref instead removes the race where the\n // final chunk lands in pending after run() returns and ends up flashing\n // into the next frame's tail (leaking into scrollback).\n const streamingTextRef = useRef('');\n const pendingDeltaRef = useRef('');\n const flushTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Latest state snapshot — async callbacks (the queue drainer, slash command\n // closures) read this instead of capturing `state` to avoid stale closures.\n const stateRef = useRef<State>(state);\n stateRef.current = state;\n const draftRef = useRef({ buffer: state.buffer, cursor: state.cursor });\n draftRef.current = { buffer: state.buffer, cursor: state.cursor };\n\n // ── Mouse mode: viewport geometry + event routing ─────────────────────\n // Measures the bottom region (everything below the scroll viewport) so the\n // viewport height can be derived as termRows − bottomHeight. One ref over the\n // whole region instead of per-block bookkeeping. Mouse mode only.\n const bottomRef = useRef<DOMElement | null>(null);\n // Wraps the rows ABOVE any open picker (live strip + input). Its measured\n // height tells the click handler the absolute screen row where a picker's\n // items begin, so a click can be mapped to a list index.\n const prePickerRef = useRef<DOMElement | null>(null);\n const preRowsRef = useRef(0);\n // Wraps just the LiveActivityStrip (the rows ABOVE the input). Its measured\n // height locates the input's first screen row for click-to-position-cursor.\n const liveStripRef = useRef<DOMElement | null>(null);\n const liveStripRowsRef = useRef(0);\n // useLayoutEffect (not useEffect) so the viewport is sized BEFORE paint — no\n // one-frame flash. measureElement here only READS the already-computed Yoga\n // height (cheap), and the dispatch is guarded to fire only when the height\n // actually changed, so this stays a stable measure-and-set (no churn loop,\n // and streaming tokens never trigger a setViewportRows because the bottom\n // region's height doesn't change while the chat viewport streams).\n React.useLayoutEffect(() => {\n if (!managedLive) return;\n const node = bottomRef.current;\n if (!node) return;\n const { height } = measureElement(node);\n if (prePickerRef.current) {\n preRowsRef.current = measureElement(prePickerRef.current).height;\n }\n if (liveStripRef.current) {\n liveStripRowsRef.current = measureElement(liveStripRef.current).height;\n }\n const s = stateRef.current;\n const affordance = s.scrollOffset > 0 && s.pendingNewLines > 0 ? 1 : 0;\n // Bias the viewport DOWN by one row: an extra blank chat row is invisible,\n // but a status bar pushed off-screen is not.\n const vp = Math.max(MIN_VIEWPORT, termRows - height - affordance - 1);\n if (vp !== s.viewportRows) {\n dispatch({ type: 'setViewportRows', rows: vp });\n }\n // stable deps: stateRef (ref), dispatch (stable from useReducer),\n // termRows is a prop of the effect scope.\n }, [managedLive, termRows]);\n\n // Latest handleKey, so click-to-activate can replay an Enter through the\n // normal input pipeline (handleKey is defined far below; the ref is filled\n // after it). handleMouse only ever runs post-mount, so the ref is populated.\n const handleKeyRef = useRef<((input: string, key: KeyEvent) => void) | null>(null);\n // Set to the row index a mouse click selected; the effect below replays Enter\n // once that row is the live selection, giving single-click confirm.\n const pendingClickConfirmRef = useRef<number | null>(null);\n // Latest open-routines + rewind handler + confirm decision, so the\n // empty-dep mouse handler can drive surfaces defined further down without\n // re-subscribing. Populated each render (see assignments below their defs).\n const openModelPickerRef = useRef<(() => void) | null>(null);\n const openAutonomyPickerRef = useRef<(() => void) | null>(null);\n const handleRewindToRef = useRef<((promptIndex: number) => void) | null>(null);\n // The bordered ConfirmPrompt's wrapper Box + the live decision callback, so\n // a click on the button row can be located (measured height) and fired.\n const confirmRef = useRef<DOMElement | null>(null);\n const confirmDecisionRef = useRef<((d: ConfirmDecision) => void) | null>(null);\n // True while the left button is held after pressing on the scrollbar, so\n // subsequent motion events scrub the chat viewport (thumb drag).\n const scrollbarDragRef = useRef(false);\n // Multi-click detection: tracks the timestamp and position of the last left\n // click to identify double/triple clicks. SGR 1006 doesn't emit native\n // multi-click events, so we track them ourselves.\n const lastLeftClickRef = useRef<{ x: number; y: number; ts: number; count: number } | null>(null);\n const DOUBLE_CLICK_MS = 500;\n const DOUBLE_CLICK_DIST = 5; // max pixels between clicks to count as multi-click\n // Live status-bar chip inputs, so the empty-dep mouse handler can hit-test\n // the model / autonomy chips against their current values (not stale ones).\n const statusChipRef = useRef<{\n version?: string;\n model: string;\n fleetRunning: number;\n yolo: boolean;\n autonomy: 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel';\n }>({ version: appVersion, model, fleetRunning: 0, yolo, autonomy: 'off' });\n\n // Mouse routing. Wheel scrolls history (or drives an open picker's\n // selection); a left click on a picker item selects + activates it; a click\n // on the \"N new lines\" affordance jumps to the bottom. Registered once;\n // reads live state via stateRef + measured geometry via preRowsRef.\n const handleMouse = React.useCallback(\n (ev: TuiMouseEvent) => {\n const s = stateRef.current;\n if (ev.type === 'wheel') {\n const up = ev.button === 'wheelUp';\n const step = up ? -1 : 1;\n // An open list overlay claims the wheel for its own selection.\n if (s.slashPicker.open) return dispatch({ type: 'slashPickerMove', delta: step });\n if (s.modelPicker.open) return dispatch({ type: 'modelPickerMove', delta: step });\n if (s.autonomyPicker.open) return dispatch({ type: 'autonomyPickerMove', delta: step });\n if (s.settingsPicker.open) return dispatch({ type: 'settingsFieldMove', delta: step });\n if (s.picker.open) return dispatch({ type: 'pickerMove', delta: step });\n if (s.rewindOverlay) return dispatch({ type: 'rewindOverlayMove', delta: step });\n // Otherwise scroll the chat history viewport.\n return dispatch({ type: 'scrollBy', delta: up ? WHEEL_STEP : -WHEEL_STEP });\n }\n // Button release ends any in-progress scrollbar drag.\n if (ev.type === 'release') {\n scrollbarDragRef.current = false;\n return;\n }\n if (ev.button !== 'left') return;\n\n // Multi-click detection: tracks consecutive clicks within DOUBLE_CLICK_MS\n // and DOUBLE_CLICK_DIST to identify double/triple clicks. Note: terminal\n // text selection is managed by the terminal emulator, not the app, so\n // clickCount is tracked here for future use (e.g., terminal selection API).\n const now = Date.now();\n const lastClick = lastLeftClickRef.current;\n const isMultiClick =\n lastClick !== null &&\n now - lastClick.ts < DOUBLE_CLICK_MS &&\n Math.abs(ev.x - lastClick.x) <= DOUBLE_CLICK_DIST &&\n Math.abs(ev.y - lastClick.y) <= DOUBLE_CLICK_DIST;\n const clickCount = isMultiClick ? lastClick.count + 1 : 1;\n lastLeftClickRef.current = { x: ev.x, y: ev.y, ts: now, count: clickCount };\n void clickCount; // tracked for future terminal selection API use\n\n // Scrollbar (right edge, rows 1..viewportRows): a press on it jumps the\n // viewport to that position and arms a drag; subsequent held-motion\n // events scrub. The bar is the terminal's last column — accept it plus\n // its 1-col left margin so near-misses still grab. Motion events never\n // fall through to click handling.\n {\n const rows = s.viewportRows;\n if (ev.drag) {\n if (scrollbarDragRef.current && s.totalLines > rows) {\n dispatch({\n type: 'scrollTo',\n offset: scrollOffsetForTrackRow(rows, s.totalLines, ev.y - 1),\n });\n }\n return;\n }\n const cols = termCols || 80;\n // Accept the scrollbar column plus 1-col left margin so near-misses still grab.\n const onScrollbar = cols > 0 && ev.x >= cols - 2 && ev.y >= 1 && ev.y <= rows;\n if (onScrollbar && s.totalLines > rows) {\n scrollbarDragRef.current = true;\n dispatch({\n type: 'scrollTo',\n offset: scrollOffsetForTrackRow(rows, s.totalLines, ev.y - 1),\n });\n return;\n }\n }\n\n // A click in the bottom region (where they render) dismisses an open\n // informational overlay — mouse parity with Esc. These can't coexist\n // with pickers/confirm (handleKey guards that), so this never eats a\n // picker click. Clicks up in the chat viewport are left alone.\n if (ev.y > s.viewportRows) {\n if (s.helpOpen) return dispatch({ type: 'toggleHelp' });\n if (s.agentsMonitorOpen) return dispatch({ type: 'toggleAgentsMonitor' });\n if (s.monitorOpen) return dispatch({ type: 'toggleMonitor' });\n if (s.worktreeMonitorOpen) return dispatch({ type: 'worktreeMonitorToggle' });\n if (s.autoPhase?.monitorOpen) return dispatch({ type: 'autoPhaseMonitorToggle' });\n }\n\n const affordance = s.scrollOffset > 0 && s.pendingNewLines > 0 ? 1 : 0;\n // The affordance occupies the row just below the viewport (1-based).\n if (affordance && ev.y === s.viewportRows + 1) {\n return dispatch({ type: 'scrollToBottom' });\n }\n\n // Permission dialog: map a click on the button row to a decision. The\n // dialog is the only thing between the input region and the status bar\n // while a confirm is pending, so its top row is deterministic. We\n // measure its box height to find the button row (the line just above the\n // bottom border).\n if (s.confirmQueue.length > 0) {\n const node = confirmRef.current;\n const head = s.confirmQueue[0];\n if (node && head) {\n const { height } = measureElement(node);\n const top = s.viewportRows + affordance + preRowsRef.current + 1;\n const buttonsRow = top + height - 2; // -1 bottom border, -1 to land on buttons\n if (ev.y === buttonsRow) {\n // round border (1) + paddingX (1) before the first content column.\n const contentX = ev.x - 1 - 2;\n for (const seg of confirmButtonSegments(head.suggestedPattern)) {\n if (contentX >= seg.start && contentX < seg.start + seg.len) {\n confirmDecisionRef.current?.(seg.decision);\n return;\n }\n }\n }\n }\n return; // a confirm is modal — swallow other clicks\n }\n\n // Checkpoint timeline (/rewind): click selects; click on the already\n // selected row rewinds. Layout: outer padding(1) + header(1) +\n // marginBottom(1) = 3 rows before the first checkpoint.\n if (s.rewindOverlay) {\n const cps = s.rewindOverlay.checkpoints;\n const firstItemRow = s.viewportRows + affordance + preRowsRef.current + 3 + 1;\n const index = ev.y - firstItemRow;\n if (index < 0 || index >= cps.length) return;\n if (index === s.rewindOverlay.selected) {\n handleRewindToRef.current?.(cps[index]!.promptIndex);\n } else {\n dispatch({ type: 'rewindOverlayMove', delta: index - s.rewindOverlay.selected });\n }\n return;\n }\n\n // Settings editor: click focuses a field; clicking the already-focused\n // field cycles its value. Header: title(1) + hint(1) = 2 rows.\n if (s.settingsPicker.open) {\n const firstRow = s.viewportRows + affordance + preRowsRef.current + 2 + 1;\n const field = ev.y - firstRow;\n if (field < 0 || field > 1) return;\n if (field === s.settingsPicker.field) {\n dispatch({ type: 'settingsValueChange', delta: 1 });\n } else {\n dispatch({ type: 'settingsFieldSet', field });\n }\n return;\n }\n\n // Identify the open picker, its header height (rows before the first\n // item) and how to move/confirm it. Only the bottom-anchored list\n // pickers participate; the full-screen rewind overlay does not.\n const picker = s.modelPicker.open\n ? {\n header: 2,\n count:\n s.modelPicker.step === 'provider'\n ? s.modelPicker.providerOptions.length\n : s.modelPicker.modelOptions.length,\n selected: s.modelPicker.selected,\n move: (delta: number) => dispatch({ type: 'modelPickerMove', delta }),\n }\n : s.autonomyPicker.open\n ? {\n header: 2,\n count: s.autonomyPicker.options.length,\n selected: s.autonomyPicker.selected,\n move: (delta: number) => dispatch({ type: 'autonomyPickerMove', delta }),\n }\n : s.slashPicker.open\n ? {\n header: 1,\n count: s.slashPicker.matches.length,\n selected: s.slashPicker.selected,\n move: (delta: number) => dispatch({ type: 'slashPickerMove', delta }),\n }\n : s.picker.open\n ? {\n header: 1,\n count: s.picker.matches.length,\n selected: s.picker.selected,\n move: (delta: number) => dispatch({ type: 'pickerMove', delta }),\n }\n : null;\n if (!picker || picker.count === 0) {\n // Click inside the editable input → reposition the caret. The input\n // sits just below the live-activity strip; its first row and wrapped\n // height are deterministic from the measured strip height + the same\n // layout the component renders. Skipped while the input is disabled.\n const inputDisabled = s.status === 'aborting' && !s.steeringPending;\n if (!inputDisabled) {\n const cols = termCols || 80;\n const inputTop = s.viewportRows + affordance + liveStripRowsRef.current + 1;\n const inputRows = layoutInputRows(INPUT_PROMPT, s.buffer, s.cursor, cols).length;\n const rowIdx = ev.y - inputTop;\n if (rowIdx >= 0 && rowIdx < inputRows) {\n const next = inputIndexAtRowCol(INPUT_PROMPT, s.buffer, cols, rowIdx, ev.x - 1);\n return dispatch({ type: 'setBuffer', buffer: s.buffer, cursor: next });\n }\n }\n\n // No list picker open → the status bar is at a deterministic row.\n // Make its model chip (line 1) and autonomy chip (line 2) clickable.\n if (\n !s.helpOpen &&\n !s.agentsMonitorOpen &&\n !s.monitorOpen &&\n !s.worktreeMonitorOpen &&\n !s.autoPhase?.monitorOpen\n ) {\n const chip = statusChipRef.current;\n const statusTop = s.viewportRows + affordance + preRowsRef.current + 1;\n const contentX = ev.x - 1; // status bar has no left border; paddingX folded into spans\n if (ev.y === statusTop + 1) {\n const span = statusBarModelSpan({\n version: chip.version,\n state: s.status,\n fleetRunning: chip.fleetRunning,\n model: chip.model,\n });\n if (contentX >= span.start && contentX < span.start + span.len) {\n openModelPickerRef.current?.();\n }\n } else if (ev.y === statusTop + 2) {\n const span = statusBarAutonomySpan({ yolo: chip.yolo, autonomy: chip.autonomy });\n if (span && contentX >= span.start && contentX < span.start + span.len) {\n openAutonomyPickerRef.current?.();\n }\n }\n }\n return;\n }\n\n // Absolute (1-based) row of the picker's first item:\n // viewport rows + affordance + (live strip + input) + header.\n const firstItemRow = s.viewportRows + affordance + preRowsRef.current + picker.header + 1;\n const index = ev.y - firstItemRow;\n if (index < 0 || index >= picker.count) return;\n // Single-click select + confirm. handleKey's Enter path confirms whatever\n // is selected at RENDER time, so we can't move + confirm in one event.\n // Instead: if the row is already selected, confirm now; otherwise move to\n // it and arm pendingClickConfirm — an effect replays Enter on the next\n // render (when handleKey closes over the updated selection). If anything\n // is off, it degrades gracefully to a second click confirming.\n if (index === picker.selected) {\n handleKeyRef.current?.('', { ...EMPTY_KEY, return: true });\n } else {\n pendingClickConfirmRef.current = index;\n picker.move(index - picker.selected);\n }\n },\n // dispatch is stable (useReducer); refs are mutable — no reactive deps.\n // termCols is stable (useState + resize effect).\n [termCols],\n );\n useEffect(() => {\n if (!subscribeMouse) return;\n return subscribeMouse(handleMouse);\n }, [subscribeMouse, handleMouse]);\n\n // Single-click confirm: after a click moved the selection, replay Enter once\n // the clicked row is the live selection (handleKey then closes over the\n // updated state, so it confirms the RIGHT item). Cleared if the picker closes.\n useEffect(() => {\n const target = pendingClickConfirmRef.current;\n if (target === null) return;\n const open =\n state.slashPicker.open ||\n state.modelPicker.open ||\n state.autonomyPicker.open ||\n state.picker.open;\n if (!open) {\n pendingClickConfirmRef.current = null;\n return;\n }\n const sel = state.slashPicker.open\n ? state.slashPicker.selected\n : state.modelPicker.open\n ? state.modelPicker.selected\n : state.autonomyPicker.open\n ? state.autonomyPicker.selected\n : state.picker.selected;\n if (sel === target) {\n pendingClickConfirmRef.current = null;\n handleKeyRef.current?.('', { ...EMPTY_KEY, return: true });\n }\n }, [\n state.slashPicker.open,\n state.slashPicker.selected,\n state.modelPicker.open,\n state.modelPicker.selected,\n state.autonomyPicker.open,\n state.autonomyPicker.selected,\n state.picker.open,\n state.picker.selected,\n ]);\n\n // handleRewindTo must be declared before the /rewind useEffect (line 1803)\n // so the closure can capture it. It is intentionally NOT in useCallback\n // — each call needs a fresh rewinder referencing the current sessionsDir.\n const handleRewindTo = React.useCallback(\n async (checkpointIndex: number) => {\n const sessionId = agent.ctx.session.id;\n if (!sessionId) return;\n const rewinder = new DefaultSessionRewinder(sessionsDir ?? '', projectRoot ?? agent.ctx.cwd);\n // Revert file system changes first (read-only, safe to do eagerly).\n await rewinder.rewindToCheckpoint(sessionId, checkpointIndex);\n // Then truncate the conversation history — this fires session.rewound\n // on the EventBus, which the useEffect at line 2212 listens to and\n // dispatches sessionRewound + clearHistory.\n await agent.ctx.session.truncateToCheckpoint(checkpointIndex);\n },\n [agent.ctx.session, sessionsDir, projectRoot, agent.ctx.cwd],\n );\n\n const setDraft = (buffer: string, cursor: number): void => {\n draftRef.current = { buffer, cursor };\n dispatch({ type: 'setBuffer', buffer, cursor });\n };\n\n const clearDraft = (): void => {\n draftRef.current = { buffer: '', cursor: 0 };\n dispatch({ type: 'clearInput' });\n };\n\n // Session-elapsed clock. Mount time is fixed; we re-render once per\n // second to refresh the \"⏱ 12:34\" chip. The interval is cheap — one\n // dispatch per tick into the same `tick` action — and stops cleanly\n // on unmount.\n const startedAtRef = useRef<number>(Date.now());\n const [nowTick, setNowTick] = React.useState<number>(Date.now());\n useEffect(() => {\n const t = setInterval(() => setNowTick(Date.now()), 1000);\n return () => clearInterval(t);\n }, []);\n const elapsedMs = nowTick - startedAtRef.current;\n\n // Git branch + change counts. Polled every 5s (cheap, two short-lived\n // `git` subprocesses). Skipped silently when the cwd isn't a repo or\n // git isn't installed — the chip just doesn't render.\n const [gitInfo, setGitInfo] = React.useState<GitInfo | null>(null);\n useEffect(() => {\n let cancelled = false;\n const refresh = () => {\n readGitInfo(agent.ctx.cwd)\n .then((info) => {\n if (!cancelled) setGitInfo(info);\n })\n .catch(() => undefined);\n };\n refresh();\n const t = setInterval(refresh, 5000);\n return () => {\n cancelled = true;\n clearInterval(t);\n };\n }, [agent.ctx.cwd]);\n\n // Latest provider request's input-token count. Tracked separately\n // from `tokenCounter` (which is cumulative) because for the context\n // fullness bar we want the live size of the conversation as it sat\n // on the wire — that's what determines how close we are to the\n // model's max context window.\n //\n // We sum input + cacheRead + cacheWrite so the chip reflects the TRUE\n // total context the model loaded (Usage is disjoint by design — see the\n // doc on Usage). Without this, prompt-cached turns would show only the\n // fresh-token delta and the chip would read 0% even when the context\n // was near the limit.\n // Cumulative \"effective context\" from tokenCounter: fresh input tokens\n // PLUS cached tokens that were sent as part of this prompt. All three\n // contribute to context-window pressure — cache tokens are still tokens\n // the model must process. (usage.input is disjoint from cacheRead/\n // cacheWrite, so simple sum is correct.)\n\n // Per-model maxContext. CLI passes the startup value, then model-switch and\n // ctx.pct events keep activeMaxContext in sync with the live agent context.\n const maxContext = activeMaxContext ?? agent.ctx.provider.capabilities.maxContext;\n\n // Per-request context pressure: current prompt tokens (input + cacheRead).\n // Unlike the cumulative tokenCounter.total() which grows across all turns,\n // this tracks the live request's context weight — what actually determines\n // how close we are to the maxContext ceiling.\n // Cached tokens (cacheWrite) are excluded because they are an accounting\n // artifact of THIS request (provider charges for them separately); they\n // are already counted in usage.input as part of the prompt the model sees.\n const currentContextTokens =\n (tokenCounter?.currentRequestTokens()?.input ?? 0) +\n (tokenCounter?.currentRequestTokens()?.cacheRead ?? 0);\n\n const contextWindow = useMemo(() => {\n void state.contextChipVersion;\n return currentContextTokens > 0 && maxContext > 0\n ? { used: currentContextTokens, max: maxContext }\n : undefined;\n }, [currentContextTokens, maxContext, state.contextChipVersion]);\n\n // Todo counts come from the agent's context, which is mutated by\n // the `todo` tool. Re-read on each render — array access is O(N) on\n // a list that's typically < 20 items.\n // biome-ignore lint/correctness/useExhaustiveDependencies: nowTick intentionally triggers re-render; ctx.todos is not React state\n const todos = useMemo(() => {\n const counts = { pending: 0, inProgress: 0, completed: 0 };\n for (const t of agent.ctx.todos) {\n if (t.status === 'pending') counts.pending++;\n else if (t.status === 'in_progress') counts.inProgress++;\n else if (t.status === 'completed') counts.completed++;\n }\n return counts;\n // Tick on `nowTick` so we pick up todo changes even though\n // agent.ctx.todos isn't React state — the 1s clock doubles as a\n // poll for ctx-side state.\n }, [nowTick, agent.ctx.todos]);\n\n // Fleet breakdown for the status-bar chip. Derived from `state.fleet`,\n // which the FleetBus event listeners already maintain — re-bucket\n // into running / idle / pending / completed because that's the slice\n // the user cares about at a glance. Recomputes on every state.fleet\n // change (cheap — fleet usually has <10 entries).\n const fleetCounts = useMemo(() => {\n const entries = Object.values(state.fleet);\n if (entries.length === 0) return undefined;\n let running = 0;\n let idle = 0;\n let completed = 0;\n for (const e of entries) {\n if (e.status === 'running') running += 1;\n else if (e.status === 'idle') idle += 1;\n else completed += 1; // success/failed/timeout/stopped all count as \"done\"\n }\n return { running, idle, pending: 0, completed };\n }, [state.fleet]);\n\n // Synthesize LEADER as AGENT#0 and prepend to the live fleet so the\n // monitor / FleetPanel are never empty even when no subagents have been\n // spawned. The 'leader' key can't collide with subagent IDs (those are\n // ULIDs). status maps from the high-level run state — streaming/running/\n // iterating → 'running', else 'idle'.\n const entriesWithLeader = useMemo<Record<string, FleetEntry>>(() => {\n const leaderEntry: FleetEntry = {\n id: 'leader',\n name: 'LEADER',\n provider,\n model,\n status:\n state.status === 'running' || state.status === 'streaming' || state.leader.iterating\n ? 'running'\n : 'idle',\n streamingText: '',\n iterations: state.leader.iterations,\n toolCalls: state.leader.toolCalls,\n recentTools: state.leader.recentTools,\n recentMessages: [],\n cost: 0,\n startedAt: state.leader.startedAt,\n lastEventAt: state.leader.lastEventAt,\n currentTool: state.leader.currentTool,\n ctxPct: state.leader.ctxPct,\n ctxTokens: state.leader.ctxTokens,\n ctxMaxTokens: state.leader.ctxMaxTokens ?? effectiveMaxContext,\n };\n return { leader: leaderEntry, ...state.fleet };\n }, [state.fleet, state.leader, state.status, provider, model, effectiveMaxContext]);\n\n // Stable per-subagent label + color assigned on first sighting.\n const STREAM_COLORS = ['cyan', 'magenta', 'yellow', 'green', 'blue'];\n const labelsRef = useRef<Map<string, { label: string; color: string }>>(new Map());\n const labelFor = (id: string, name?: string): { label: string; color: string } => {\n const m = labelsRef.current;\n const existing = m.get(id);\n if (existing) return existing;\n const n = m.size + 1;\n // Nickname wins: show \"Einstein (Bug Hunter)\" rather than \"AGENT#1 Einstein (Bug Hunter)\".\n const v = {\n label: name && name !== id ? name : `AGENT#${n}`,\n color: STREAM_COLORS[(n - 1) % STREAM_COLORS.length]!,\n };\n m.set(id, v);\n return v;\n };\n\n // Plan counts come from `<sessionId>.plan.json` on disk, not React\n // state. We poll lazily every few ticks so the chip stays current\n // without slamming the FS — plans change at human pace (a few times\n // per session at most), so 3s granularity is plenty.\n const [planCounts, setPlanCounts] = useState<{\n open: number;\n inProgress: number;\n done: number;\n } | null>(null);\n useEffect(() => {\n const planPath = (agent.ctx.meta as Record<string, unknown>)['plan.path'];\n if (typeof planPath !== 'string' || !planPath) return;\n let cancelled = false;\n const poll = async () => {\n try {\n const data = await fs.readFile(planPath, 'utf8');\n const parsed = JSON.parse(data) as {\n items?: Array<{ status?: string }>;\n };\n if (cancelled) return;\n if (!Array.isArray(parsed.items)) {\n setPlanCounts(null);\n return;\n }\n let open = 0;\n let inProgress = 0;\n let done = 0;\n for (const it of parsed.items) {\n if (it?.status === 'done') done++;\n else if (it?.status === 'in_progress') inProgress++;\n else open++;\n }\n setPlanCounts(open + inProgress + done > 0 ? { open, inProgress, done } : null);\n } catch {\n // Missing or corrupt — clear the chip.\n if (!cancelled) setPlanCounts(null);\n }\n };\n void poll();\n const id = setInterval(poll, 3000);\n return () => {\n cancelled = true;\n clearInterval(id);\n };\n }, [agent.ctx.meta]);\n\n // Live-region shrink mitigation. Ink's log-update tracks the previous\n // render's logical line count; when content visually wraps past the\n // terminal width, the visual-row count exceeds the logical count and\n // log-update's clear-and-rewrite leaves the extra visual rows behind.\n // Those extras then slide into native scrollback as the next render\n // commits new Static items above the live region — looking to the user\n // like an extra echo of the input (\"Enter ile boş input da history'e\n // sıyrılıyor\").\n //\n // We can't reach log-update directly, but we can issue an erase-below-\n // cursor (\\x1b[J) at the moments most likely to leak: when a picker /\n // dialog transitions from open → closed (the live region's height\n // drops sharply), when a fresh history entry was just committed, and\n // when the terminal resizes (Ink re-renders the live region but the\n // cleanup logic above doesn't fire since none of its deps changed).\n // \\x1b[J only touches what's below the cursor, so committed Static\n // history above is preserved. For users in heavy resize / picker\n // workflows the bullet-proof alternative is still `--alt-screen`.\n const prevAnyOverlayOpen = useRef(false);\n const prevEntriesCount = useRef(0);\n // Stable erase function — only calls process.stdout.write which is a stable global.\n const eraseLiveRegion = useCallback(() => {\n try {\n // \\x1b[J = erase from cursor to end of screen. The cursor sits at the\n // top of log-update's live region, so this clears the stale live\n // region only and leaves committed Static history (in scrollback)\n // untouched. Do NOT prefix with \\x1b[H: homing to (0,0) wipes the\n // visible committed output and forces the input/status bar to redraw\n // at the top of the viewport instead of staying pinned to the bottom.\n writeOut('\\x1b[J');\n } catch {\n // stdout might be detached during shutdown — ignore.\n }\n }, []);\n useEffect(() => {\n const anyOpenNow =\n state.picker.open ||\n state.slashPicker.open ||\n state.modelPicker.open ||\n state.autonomyPicker.open ||\n state.settingsPicker.open ||\n state.confirmQueue.length > 0;\n const overlayClosed = prevAnyOverlayOpen.current && !anyOpenNow;\n const newEntryCommitted = state.entries.length > prevEntriesCount.current;\n prevAnyOverlayOpen.current = anyOpenNow;\n prevEntriesCount.current = state.entries.length;\n if (overlayClosed || newEntryCommitted) {\n eraseLiveRegion();\n }\n }, [\n state.picker.open,\n state.slashPicker.open,\n state.modelPicker.open,\n state.autonomyPicker.open,\n state.settingsPicker.open,\n state.confirmQueue.length,\n state.entries.length,\n eraseLiveRegion,\n ]);\n\n // Erase stale live-region content on terminal resize. Without this, Ink\n // re-renders the live region at the new dimensions but leaves visual\n // artifacts from the previous size that bleed into scrollback.\n useEffect(() => {\n const handleResize = () => eraseLiveRegion();\n process.stdout.on('resize', handleResize);\n return () => {\n process.stdout.off('resize', handleResize);\n };\n }, [eraseLiveRegion]);\n\n // Detect an active `@<query>` token at the cursor and drive the picker.\n // Reruns whenever buffer/cursor changes — guards against stale results.\n // biome-ignore lint/correctness/useExhaustiveDependencies: picker state reads are intentional — dispatching based on stale picker state is harmless\n useEffect(() => {\n const detected = detectAtToken(state.buffer, state.cursor);\n if (!detected) {\n if (state.picker.open) dispatch({ type: 'pickerClose' });\n return;\n }\n if (!state.picker.open || state.picker.query !== detected.query) {\n dispatch({ type: 'pickerOpen', query: detected.query });\n }\n let cancelled = false;\n searchFiles(projectRoot, detected.query, 8)\n .then((matches) => {\n if (!cancelled) {\n dispatch({ type: 'pickerSetMatches', query: detected.query, matches });\n }\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.buffer, state.cursor, projectRoot]);\n\n // Detect an active `/<query>` token at the cursor and drive the slash picker.\n // biome-ignore lint/correctness/useExhaustiveDependencies: slashPicker state reads are intentional — same pattern as @ picker above\n useEffect(() => {\n const trimmed = state.buffer.trimStart();\n if (!trimmed.startsWith('/')) {\n if (state.slashPicker.open) dispatch({ type: 'slashPickerClose' });\n return;\n }\n // Once any whitespace appears after the leading '/', the user has moved\n // past the command name into argument territory (e.g. `/model glm-5.1`).\n // Keeping the picker open here is actively harmful: arrow keys would\n // still target the command menu even though the user is typing args.\n // Close it so Enter submits the full line.\n if (/\\s/.test(trimmed)) {\n if (state.slashPicker.open) dispatch({ type: 'slashPickerClose' });\n return;\n }\n const query = trimmed.slice(1).toLowerCase();\n const allCommands = slashRegistry.listWithOwner();\n const matches: SlashCommandMatch[] = allCommands\n .filter(({ cmd }) => {\n const name = cmd.name.toLowerCase();\n const aliases = cmd.aliases ?? [];\n return name.includes(query) || aliases.some((a) => a.toLowerCase().includes(query));\n })\n .slice(0, 12)\n .map(({ cmd, owner }) => ({\n name: cmd.name,\n description: cmd.description,\n argsHint: cmd.argsHint,\n isBuiltin: owner === 'core',\n }));\n\n if (!state.slashPicker.open) {\n dispatch({ type: 'slashPickerOpen', query, matches });\n } else if (state.slashPicker.query !== query) {\n dispatch({ type: 'slashPickerOpen', query, matches });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.buffer, slashRegistry]);\n\n const pasteClipboardImage = async (): Promise<void> => {\n const builder = builderRef.current;\n if (!builder) return;\n try {\n const img = await readClipboardImage();\n if (!img) {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'info', text: 'No image on the clipboard.' },\n });\n return;\n }\n // Register-only: the token goes inline into the editable buffer (like a\n // pasted block) so it renders as a chip and expands from the buffer at\n // submit — not into a separate pill above the input.\n const token = await builder.registerImage(img.base64, img.mediaType);\n const kb = (img.bytes / 1024).toFixed(0);\n tokenPreviewsRef.current.set(token, `image, ${kb} KB`);\n const { buffer, cursor } = draftRef.current;\n const next = buffer.slice(0, cursor) + token + buffer.slice(cursor);\n setDraft(next, cursor + token.length);\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'error',\n text: `Clipboard image error: ${err instanceof Error ? err.message : String(err)}`,\n },\n });\n }\n };\n\n const acceptPickerSelection = async (): Promise<void> => {\n const { open, matches, selected } = state.picker;\n if (!open || matches.length === 0) return;\n const picked = matches[selected];\n if (!picked) return;\n const builder = builderRef.current;\n if (!builder) return;\n\n // Find the @-token span we're replacing.\n const draft = draftRef.current;\n const tok = detectAtToken(draft.buffer, draft.cursor);\n if (!tok) {\n dispatch({ type: 'pickerClose' });\n return;\n }\n\n // Register the file (no builder display mutation) and put a path-keyed\n // `[file:<path>]` token inline in the visible buffer (replacing @query).\n // The buffer is the single source of truth — the token expands back to the\n // file content at submit via the store's path lookup.\n const absPath = path.isAbsolute(picked) ? picked : path.join(projectRoot, picked);\n try {\n const data = await fs.readFile(absPath, 'utf8');\n const token = await builder.registerFile({\n kind: 'file',\n data,\n meta: { filename: picked, label: picked },\n });\n const before = draft.buffer.slice(0, tok.start);\n const after = draft.buffer.slice(tok.end);\n const next = `${before}${token}${after}`;\n setDraft(next, tok.start + token.length);\n dispatch({ type: 'pickerClose' });\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'error',\n text: `Attach failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n });\n dispatch({ type: 'pickerClose' });\n }\n };\n\n /** Fill the buffer with the selected slash command and close the picker. */\n const acceptSlashPickerSelection = (): void => {\n const { open, matches, selected } = state.slashPicker;\n if (!open || matches.length === 0) return;\n const picked = matches[selected];\n if (!picked) return;\n const cmd = picked.argsHint !== undefined ? `/${picked.name} ` : `/${picked.name}`;\n setDraft(cmd, cmd.length);\n dispatch({ type: 'slashPickerClose' });\n };\n\n // Rehydrate any queue items persisted by a previous (crashed) run.\n // Fires once at mount; the persist effect below picks up afterwards.\n // We dispatch one enqueue per item so the reducer's id allocation\n // stays the single source of truth — no need to import its internals.\n useEffect(() => {\n if (!queueStore) return;\n let cancelled = false;\n queueStore\n .read()\n .then((items) => {\n if (cancelled || items.length === 0) return;\n for (const item of items) {\n dispatch({\n type: 'enqueue',\n item: { displayText: item.displayText, blocks: item.blocks },\n });\n }\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'info',\n text: `Restored ${items.length} queued message${items.length === 1 ? '' : 's'} from a previous run.`,\n },\n });\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [queueStore]);\n\n // Persist the queue snapshot on every change. Strip the in-memory id\n // before writing — it's render bookkeeping, not part of the message.\n // Errors are swallowed: the queue lives in memory regardless, so a\n // persistence failure only loses crash-recovery, not the queue itself.\n useEffect(() => {\n if (!queueStore) return;\n queueStore\n .write(state.queue.map(({ displayText, blocks }) => ({ displayText, blocks })))\n .catch(() => undefined);\n }, [state.queue, queueStore]);\n\n // Register the TUI-only /queue command for the lifetime of this App.\n useEffect(() => {\n const cmd = createQueueSlashCommand({\n getQueue: () => stateRef.current.queue,\n clear: () => dispatch({ type: 'queueClear' }),\n deleteAt: (positions) => dispatch({ type: 'queueDelete', positions }),\n });\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('queue');\n };\n }, [slashRegistry]);\n\n // Register /kill (list/kill tracked bash/exec processes) and /ps (list only).\n useEffect(() => {\n slashRegistry.register(createKillSlashCommand());\n slashRegistry.register(createPsSlashCommand());\n return () => {\n slashRegistry.unregister('kill');\n slashRegistry.unregister('ps');\n };\n }, [slashRegistry]);\n\n // Kill all tracked bash/exec processes when the TUI unmounts.\n // This fires on natural exit, Ctrl+C, and any other unmount path,\n // ensuring no orphaned child processes survive after the session ends.\n useEffect(() => {\n return () => {\n getProcessRegistry().killAll();\n };\n }, []);\n\n // Register `/altscreen on|off` — runtime escape valve for the\n // alt-screen scrollback limitation. In alt-screen mode the terminal's\n // native scrollback is disabled, so users can't review old chat\n // entries. `off` writes the alt-screen-exit escape so subsequent\n // entries land in the normal scroll region and the mouse wheel /\n // shift+pgup work again. The trade-off (lost on-screen history,\n // resize artifacts) is spelled out in the response message so the\n // user can decide whether to keep it.\n useEffect(() => {\n const ALT_OFF = '\\x1b[?1049l';\n const ALT_ON = '\\x1b[?1049h';\n const cmd = {\n name: 'altscreen',\n description:\n 'Toggle the alt-screen buffer. Default is OFF (native scroll); /altscreen on for full-screen mode.',\n async run(args: string) {\n const arg = args.trim().toLowerCase();\n if (arg === 'off') {\n try {\n writeOut(ALT_OFF);\n } catch {\n return { message: 'Failed to exit alt-screen.' };\n }\n // Leaving alt-screen drops the managed viewport back to <Static>.\n setManagedLive(false);\n return {\n message:\n 'Alt-screen disabled. New entries will land in normal scrollback (mouse wheel / Shift+PgUp work). ' +\n 'On-screen history rendered before this command is no longer reachable via terminal scroll. ' +\n 'Resize may now leak the live region — `/altscreen on` to re-enable.',\n };\n }\n if (arg === 'on') {\n try {\n writeOut(ALT_ON);\n } catch {\n return { message: 'Failed to re-enter alt-screen.' };\n }\n // Entering alt-screen turns on the managed viewport (in-app scroll +\n // PgUp/PgDn + collapsibility), no mouse required.\n setManagedLive(true);\n return {\n message:\n 'Alt-screen re-enabled. Managed scroll (PgUp/PgDn) is now active; native scroll is off.',\n };\n }\n return { message: 'Usage: /altscreen on|off' };\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('altscreen');\n };\n }, [slashRegistry]);\n\n // Register `/mouse on|off` — runtime toggle for full mouse mode (clickable\n // pickers + in-app wheel scroll). Enabling REQUIRES launching with --mouse:\n // that's when run-tui installs the stdin proxy that keeps mouse bytes out of\n // Ink's keypress parser. Without it, turning tracking on would spray\n // `<0;..M` junk into the input — so we refuse and tell the user to relaunch.\n const mouseLiveRef = useRef(mouseLive);\n mouseLiveRef.current = mouseLive;\n useEffect(() => {\n const MOUSE_ON_SEQ = '\\x1b[?1000h\\x1b[?1006h';\n const MOUSE_OFF_SEQ = '\\x1b[?1006l\\x1b[?1000l';\n const ALT_ON = '\\x1b[?1049h';\n const ALT_OFF = '\\x1b[?1049l';\n const cmd = {\n name: 'mouse',\n description:\n 'Toggle mouse mode (clickable menus + wheel-scroll chat). Needs launch with --mouse to enable.',\n async run(args: string) {\n const arg = args.trim().toLowerCase();\n if (arg !== 'on' && arg !== 'off') {\n return {\n message: `Mouse mode is ${mouseLiveRef.current ? 'ON' : 'OFF'}. Usage: /mouse on|off`,\n };\n }\n if (arg === 'on') {\n if (!mouse) {\n return {\n message:\n 'Mouse mode needs the --mouse launch flag (it rewires stdin so mouse ' +\n 'bytes never reach the input). Restart with `wstack --tui --mouse`.',\n };\n }\n try {\n writeOut(ALT_ON);\n writeOut('\\x1b[H');\n writeOut(MOUSE_ON_SEQ);\n } catch {\n return { message: 'Failed to enable mouse mode.' };\n }\n setMouseLive(true);\n setManagedLive(true);\n return {\n message:\n 'Mouse mode ON. Click menu items, wheel-scroll the chat (PgUp/PgDn too). ' +\n 'Native terminal copy/scroll are suspended until `/mouse off`.',\n };\n }\n // off\n try {\n writeOut(MOUSE_OFF_SEQ);\n writeOut(ALT_OFF);\n } catch {\n return { message: 'Failed to disable mouse mode.' };\n }\n setMouseLive(false);\n // /mouse off also exits alt-screen (above), so drop the managed\n // viewport back to native scrollback.\n setManagedLive(false);\n return {\n message:\n 'Mouse mode OFF. Native terminal scroll/copy restored; chat history flows ' +\n 'into native scrollback again.',\n };\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('mouse');\n };\n }, [slashRegistry, mouse]);\n\n // `/steer <message>` — slash-command equivalent of Esc-to-steer.\n // Useful when Esc is consumed by an outer terminal multiplexer, or\n // when the user wants a single-shot redirect without the typed\n // follow-up (the message is the new direction). Performs the same\n // sequence the Esc handler does: snapshot context, abort the active\n // run, terminate the fleet, drop the queue, then sets steeringPending\n // so the message — submitted as the slash command's return — picks\n // up the rich STEERING preamble in the normal submit path.\n //\n // Unlike Esc, this slash command can be invoked at any state. When\n // the agent is idle the abort and fleet-termination are no-ops; the\n // steering preamble still gets prepended, which is harmless extra\n // context (\"nothing was running\") for the next turn.\n useEffect(() => {\n const cmd = {\n name: 'steer',\n description: 'Interrupt the running agent (incl. fleet) and redirect: /steer <new direction>',\n help: [\n 'Usage: /steer <new direction>',\n '',\n 'Aborts the active iteration, terminates any running subagents,',\n 'drops queued messages, and sends your text to the model with a',\n 'STEERING preamble explaining what was in flight and what the',\n 'model is authorised to do (pivot hard, respawn subagents, ask',\n 'for clarification). Equivalent to pressing Esc then typing.',\n ].join('\\n'),\n async run(args: string) {\n const text = args.trim();\n if (!text) {\n return { message: 'Usage: /steer <new direction>' };\n }\n // Capture BEFORE mutating — same as the Esc handler.\n const s = stateRef.current;\n const runningTools = Array.from(s.runningTools.values()).map((t) => t.name);\n const subagents = Object.values(s.fleet)\n .filter((e) => e.status === 'running')\n .map((e) => ({ label: e.name, status: e.status, tool: e.currentTool?.name }));\n const subagentsTerminated = subagents.length;\n const partialAssistantText = streamingTextRef.current.slice(-1500);\n\n activeCtrlRef.current?.abort();\n dispatch({\n type: 'steerStart',\n snapshot: { runningTools, subagents, subagentsTerminated, partialAssistantText },\n });\n const droppedCount = s.queue.length;\n if (droppedCount > 0) dispatch({ type: 'queueClear' });\n if (director && subagentsTerminated > 0) {\n const cap = new Promise<void>((resolve) => {\n const t = setTimeout(resolve, 1500);\n t.unref?.();\n });\n void Promise.race([director.terminateAll().catch(() => undefined), cap]);\n }\n\n // Build the full preamble + direction here, return it as the\n // slash command output's `runText` so the submit pipeline\n // sends THIS to the model instead of \"/steer …\".\n const preamble = buildSteeringPreamble(\n { runningTools, subagents, subagentsTerminated, partialAssistantText },\n text,\n );\n // Consume immediately — the runText below already carries the\n // preamble; the steeringPending flag would otherwise double up.\n dispatch({ type: 'steerConsume' });\n\n const droppedTag = droppedCount > 0 ? ` · dropped ${droppedCount} queued` : '';\n const fleetTag =\n subagentsTerminated > 0\n ? ` · stopped ${subagentsTerminated} subagent${subagentsTerminated === 1 ? '' : 's'}`\n : '';\n return {\n message: `↯ Steering${droppedTag}${fleetTag}.`,\n runText: preamble,\n };\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('steer');\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [slashRegistry, director]);\n\n // `/rewind` — open the checkpoint timeline overlay. If a checkpoint\n // index is provided as argument, rewinds directly to it.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- handleRewindTo is stable via useCallback\n useEffect(() => {\n const cmd = {\n name: 'rewind',\n description: 'Open checkpoint timeline to rewind session: /rewind [checkpoint-index]',\n help: [\n 'Usage: /rewind [checkpoint-index]',\n '',\n 'Opens a checkpoint timeline. Use ↑/↓ to navigate, Enter to rewind,',\n 'Esc to cancel. The session is reverted to the selected checkpoint',\n 'and conversation history is truncated — LLM continues fresh.',\n '',\n 'If a checkpoint index is provided the timeline is skipped and',\n 'rewind happens immediately.',\n ].join('\\n'),\n async run(args: string) {\n const idx = Number.parseInt(args.trim(), 10);\n if (!Number.isNaN(idx) && idx >= 0) {\n handleRewindTo(idx);\n return {};\n }\n // No arg — open the timeline overlay\n const s = stateRef.current;\n if (s.checkpoints.length === 0) {\n return { message: 'No checkpoints in this session yet.' };\n }\n dispatch({ type: 'rewindOverlayOpen' });\n return {};\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('rewind');\n };\n }, [slashRegistry, handleRewindTo]);\n\n // `/agents` — bare `/agents` and `/agents monitor` toggle the overlay.\n // `/agents <id>` falls through to the CLI builtin (same-name registration\n // from the same 'core' owner is a no-op per SlashCommandRegistry semantics,\n // so we own the bare/monitor forms here and let the builtin handle IDs).\n useEffect(() => {\n const cmd = {\n name: 'agents',\n description: 'Toggle the agents monitor overlay.',\n async run(args: string) {\n const arg = args.trim().toLowerCase();\n if (!arg || arg === 'monitor') {\n dispatch({ type: 'toggleAgentsMonitor' });\n return { message: undefined };\n }\n // Any other arg falls through to the CLI builtin (same owner\n // 'core' re-registration = silently ignored). The builtin handles\n // onAgents UUID lookups and /agents on|off.\n return { message: undefined };\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('agents');\n };\n }, [slashRegistry]);\n\n // `/goal` is registered as a CLI builtin (packages/cli/src/slash-commands/\n // goal.ts) which handles both the preamble lock-in (the former TUI\n // behavior) and goal.json persistence for /autonomy eternal. The TUI\n // does NOT register its own /goal here — that would collide with the\n // builtin and throw \"already registered\" on mount.\n\n // Open routines shared by their slash command AND a mouse click on the\n // matching status-bar chip. Kept in refs (below) so the empty-dep mouse\n // handler can fire the latest version without re-subscribing.\n const openModelPicker = React.useCallback(async () => {\n if (!getPickableProviders) return;\n const providers = await getPickableProviders();\n dispatch({ type: 'modelPickerOpen', providers });\n }, [getPickableProviders]);\n const openAutonomyPicker = React.useCallback(() => {\n if (!switchAutonomy) return;\n dispatch({ type: 'autonomyPickerOpen', options: AUTONOMY_OPTIONS });\n }, [switchAutonomy]);\n const openSettings = React.useCallback(() => {\n if (!getSettings) return;\n const s = getSettings();\n dispatch({ type: 'settingsOpen', mode: s.mode, delayMs: s.delayMs });\n }, [getSettings]);\n\n // Register the TUI-only `/model` command — opens a two-step picker\n // (provider → model). All work is local state mutation; the actual\n // switch fires only after the user confirms a model in step 2.\n useEffect(() => {\n if (!getPickableProviders || !switchProviderAndModel) return;\n const cmd = {\n name: 'model',\n aliases: ['provider', 'switch'],\n description: 'Pick a provider + model interactively (two-step).',\n async run() {\n await openModelPicker();\n return { message: undefined };\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('model');\n };\n }, [slashRegistry, getPickableProviders, switchProviderAndModel, openModelPicker]);\n\n // Register the TUI-only `/settings` command — opens the autonomy settings\n // editor (default mode + auto-proceed delay). Gated on the settings\n // accessors being wired by the host (CLI passes them in).\n useEffect(() => {\n if (!getSettings || !saveSettings) return;\n const cmd = {\n name: 'settings',\n aliases: ['config', 'prefs'],\n description: 'Edit autonomy defaults (mode + auto-proceed delay).',\n async run() {\n openSettings();\n return { message: undefined };\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('settings');\n };\n }, [slashRegistry, getSettings, saveSettings, openSettings]);\n\n // Register the TUI-only `/autonomy` command — opens a single-step picker.\n // When the user types `/autonomy` with no arg, the picker appears.\n // If they type `/autonomy off` etc. with an arg, the CLI builtin handles it.\n useEffect(() => {\n if (!switchAutonomy) return;\n const cmd = {\n name: 'autonomy',\n aliases: ['auto'],\n description: 'Pick an autonomy mode interactively (picker).',\n async run() {\n dispatch({ type: 'autonomyPickerOpen', options: AUTONOMY_OPTIONS });\n return { message: undefined };\n },\n };\n slashRegistry.register(cmd);\n return () => {\n slashRegistry.unregister('autonomy');\n };\n }, [slashRegistry, switchAutonomy]);\n\n // Subscribe to provider streaming events.\n useEffect(() => {\n // Throttle stream delta DISPATCHES to reduce flicker — we batch into\n // React state at ~10fps. The full text is also written into\n // streamingTextRef synchronously on every delta, so `runBlocks` can\n // read the complete stream when `agent.run` returns without racing\n // the throttle's last unflushed batch.\n const FLUSH_MS = 100;\n const flush = () => {\n if (pendingDeltaRef.current) {\n dispatch({ type: 'streamDelta', delta: pendingDeltaRef.current });\n pendingDeltaRef.current = '';\n }\n flushTimerRef.current = null;\n };\n const offDelta = events.on('provider.text_delta', (e) => {\n // Strip any bracketed-paste DCS sequences that some providers echo\n // into the stream. They are invisible in a real terminal but appear as\n // junk text if Ink's raw rendering catches them. The ESC byte is\n // matched optionally — a stripped/split ESC would otherwise leave a\n // bare `[200~` in the rendered text (same failure as the input path).\n // biome-ignore lint/suspicious/noControlCharactersInRegex: bracketed paste escape sequences are intentional\n const text = e.text.replace(/\\x1b?\\[200~|\\x1b?\\[201~/g, '');\n streamingTextRef.current += text;\n pendingDeltaRef.current += text;\n if (!flushTimerRef.current) flushTimerRef.current = setTimeout(flush, FLUSH_MS);\n });\n const offToolStart = events.on('tool.started', (e) => {\n dispatch({ type: 'toolStarted', id: e.id, name: e.name });\n dispatch({ type: 'leaderToolStart', name: e.name });\n });\n const offIterStart = events.on('iteration.started', () => {\n dispatch({ type: 'leaderIterStart' });\n });\n const offIterEnd = events.on('iteration.completed', () => {\n dispatch({ type: 'leaderIterEnd' });\n });\n const offToolProgress = events.on('tool.progress', (e) => {\n // Only `partial_output` becomes the live tail. Other event kinds\n // (`log`, `warning`, `metric`, `file_changed`) are deliberately not\n // rendered here — they pile up too fast and would steal screen real\n // estate from the assistant text. They still flow through EventBus\n // for observability/metrics consumers.\n if (e.event.type !== 'partial_output' || !e.event.text) return;\n dispatch({\n type: 'toolStreamAppend',\n toolUseId: e.id,\n name: e.name,\n text: e.event.text,\n startedAt: Date.now(),\n });\n });\n const offTool = events.on('tool.executed', (e) => {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'tool',\n name: e.name,\n durationMs: e.durationMs,\n ok: e.ok,\n input: e.input,\n output: e.output,\n // Real model-visible sizes — forwarded so the size chip beside\n // the tool header can show what the model paid for instead of\n // the misleading preview-byte count we used to surface.\n outputBytes: e.outputBytes,\n outputTokens: e.outputTokens,\n outputLines: e.outputLines,\n },\n });\n // `tool.executed` has no tool_use id; the reducer falls back to\n // clearing the oldest running entry that matches this name.\n dispatch({ type: 'toolEnded', name: e.name });\n // Clear the live tail for this tool — the final entry is now in\n // <Static>, no need to keep mirroring it below.\n dispatch({ type: 'toolStreamClear', name: e.name });\n // Mirror into the leader-only counter so the AgentsMonitor's LEADER\n // row stays live even when no subagents exist.\n dispatch({ type: 'leaderToolEnd', name: e.name, ok: e.ok, durationMs: e.durationMs });\n // Echo the current todo list into chat whenever the `todo` tool\n // mutates ctx.todos — same format as `/todos list`. Snapshotted from\n // agent.ctx.todos at this point (the tool executor has already\n // applied the mutation by the time tool.executed fires).\n if (e.ok && e.name === 'todo') {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'info', text: formatTodosList(agent.ctx.todos) },\n });\n }\n });\n const offRetry = events.on('provider.retry', (e) => {\n const secs = (e.delayMs / 1000).toFixed(e.delayMs >= 1000 ? 1 : 2);\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: `⟳ retry ${e.attempt} in ${secs}s — ${e.description}` },\n });\n });\n const offProvErr = events.on('provider.error', (e) => {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'error', text: e.description },\n });\n });\n // Per-iteration text flush. Without this, the entire run buffers all text\n // deltas in the live tail box and dumps them into history as ONE assistant\n // entry only after `agent.run()` returns. Tool results, in contrast, land\n // in history immediately via `tool.executed` — so a multi-iteration turn\n // renders as \"all tools, then a wall of text\" instead of the natural\n // text → tool → text → tool interleaving that matches the actual stream.\n //\n // We hook `provider.response` (fires once per LLM call, both for\n // intermediate `tool_use` stops and the final `end_turn`) and commit\n // whatever has accumulated in `streamingTextRef` as an assistant history\n // entry. The next iteration's deltas start a fresh buffer. `runBlocks`\n // becomes purely the loop driver — it no longer adds the assistant entry,\n // since the per-iteration flushes have already done so.\n const offProvResp = events.on('provider.response', () => {\n const text = streamingTextRef.current;\n streamingTextRef.current = '';\n pendingDeltaRef.current = '';\n if (flushTimerRef.current) {\n clearTimeout(flushTimerRef.current);\n flushTimerRef.current = null;\n }\n dispatch({ type: 'streamReset' });\n if (text.trim()) {\n dispatch({ type: 'addEntry', entry: { kind: 'assistant', text } });\n }\n });\n const offConfirmNeeded = events.on('tool.confirm_needed', (e) => {\n // Only show the ConfirmPrompt component — no duplicate history entry needed.\n // The full ConfirmPrompt with y/n/a/d keys is rendered below;\n // the history placeholder was redundant.\n dispatch({\n type: 'confirmOpen',\n info: {\n toolUseId: e.toolUseId,\n toolName: e.tool.name,\n input: e.input,\n suggestedPattern: e.suggestedPattern,\n resolve: e.resolve,\n },\n });\n });\n const offTrustPersisted = events.on('trust.persisted', (e) => {\n const icon = e.decision === 'always' ? '✓' : '✗';\n const label = e.decision === 'always' ? 'always allowed' : 'denied';\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'info',\n text: `${icon} ${label}: ${e.tool}(${e.pattern})`,\n },\n });\n });\n return () => {\n offDelta();\n offToolStart();\n offIterStart();\n offIterEnd();\n offToolProgress();\n offTool();\n offRetry();\n offProvErr();\n offProvResp();\n offConfirmNeeded();\n offTrustPersisted();\n if (flushTimerRef.current) clearTimeout(flushTimerRef.current);\n };\n }, [events, agent.ctx.todos]);\n\n // Live mirror of `streamFleet` for the FleetBus listener below. The\n // listener is wired in a single mount-time effect so it doesn't tear\n // down per-state-change; a ref lets it read the current toggle value\n // on every event without re-subscribing.\n const streamFleetRef = useRef(state.streamFleet);\n useEffect(() => {\n streamFleetRef.current = state.streamFleet;\n }, [state.streamFleet]);\n\n // --- Subagent lifecycle entries (uniform for director + non-director) ---\n // Wired to EventBus, not FleetBus, so /spawn-agent runs (which don't\n // build a Director) also surface in the chat. The director path emits\n // the same events through `MultiAgentHost`, so this single listener\n // covers both modes and replaces the per-status history entry that\n // previously lived inside the director.on('task.completed') hook.\n // biome-ignore lint/correctness/useExhaustiveDependencies: labelFor is ref-stable (uses useRef)\n useEffect(() => {\n const offSpawned = events.on('subagent.spawned', (e) => {\n const lbl = labelFor(e.subagentId, e.name);\n dispatch({\n type: 'fleetSpawn',\n id: e.subagentId,\n name: e.name,\n provider: e.provider,\n model: e.model,\n transcriptPath: e.transcriptPath,\n });\n const where = e.provider && e.model ? `${e.provider}/${e.model}` : 'spawned';\n const desc = e.description ? ` — ${e.description.slice(0, 80)}` : '';\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '▶',\n text: `${where}${desc}`,\n },\n });\n });\n const offStarted = events.on('subagent.task_started', (e) => {\n const lbl = labelFor(e.subagentId);\n dispatch({ type: 'fleetStart', id: e.subagentId, taskId: e.taskId });\n const desc = e.description ? ` — ${e.description.slice(0, 80)}` : '';\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '●',\n text: `task started${desc}`,\n },\n });\n });\n const offCompleted = events.on('subagent.task_completed', (e) => {\n const lbl = labelFor(e.subagentId);\n const errKind = e.error?.kind;\n dispatch({\n type: 'fleetDone',\n id: e.subagentId,\n status: e.status,\n iterations: e.iterations,\n toolCalls: e.toolCalls,\n failureReason: errKind,\n });\n // Status-specific icon so timeout/stopped/failed are visually\n // distinct from a plain success. We now have a structured error\n // envelope with `kind` (e.g. `provider_rate_limit`,\n // `tool_failed`) — prefix the tail with `[kind]` so the user\n // sees the actual failure mode, not just \"✗ failed\" for every\n // breed of failure.\n const icon =\n e.status === 'success'\n ? '✓'\n : e.status === 'timeout'\n ? '⏱'\n : e.status === 'stopped'\n ? '⊘'\n : '✗';\n const errMsg = e.error?.message;\n const errMsgTail = errMsg\n ? ` — ${errMsg.replace(/\\s+/g, ' ').slice(0, 100)}${errMsg.length > 100 ? '…' : ''}`\n : '';\n const errChip = errKind ? ` [${errKind}]` : '';\n const secs = (e.durationMs / 1000).toFixed(e.durationMs < 10_000 ? 1 : 0);\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon,\n text: `${e.status} (${e.iterations} iter · ${e.toolCalls} tools · ${secs}s)${errChip}${errMsgTail}`,\n },\n });\n });\n // Budget pressure: subagent hit a soft limit and the coordinator\n // is auto-extending. Surface as a fleet warning so the user can see\n // \"⚡ agent#bug-hunter hitting tool_calls limit (350/400) — extending\".\n // Timeout-specific: never says \"extending\" since timeout is a pure\n // warning — the subagent just keeps running until it finishes.\n const offBudgetWarning = events.on('subagent.budget_warning', (e) => {\n const lbl = labelFor(e.subagentId);\n dispatch({\n type: 'fleetBudgetWarning',\n id: e.subagentId,\n kind: e.kind,\n used: e.used,\n limit: e.limit,\n });\n const timeoutSuffix = e.kind === 'timeout' ? ' (subagent continues running)' : ' — extending';\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '⚡',\n text: `hitting ${e.kind} limit (${e.used}/${e.limit})${timeoutSuffix}`,\n },\n });\n });\n // Granted extension — bump the persistent ⚡×N badge and log the grant\n // so the chat history shows the never-die handshake completing.\n const offBudgetExtended = events.on('subagent.budget_extended', (e) => {\n const lbl = labelFor(e.subagentId);\n dispatch({\n type: 'fleetBudgetExtended',\n id: e.subagentId,\n totalExtensions: e.totalExtensions,\n });\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '⚡',\n text: `extended ${e.kind} → ${e.newLimit} (×${e.totalExtensions})`,\n },\n });\n });\n // Periodic progress snapshot so the user can see what each subagent\n // is doing in the main chat history without opening the FleetPanel.\n // Format: \"AGENT#2 💬 L25 · 47 tools · $0.023 · doing bash...\"\n const offIterationSummary = events.on('subagent.iteration_summary', (e) => {\n const lbl = labelFor(e.subagentId);\n const costStr = e.costUsd > 0 ? ` · ${e.costUsd.toFixed(3)}` : '';\n const toolStr = e.currentTool ? ` · doing ${e.currentTool}` : '';\n const partial = e.partialText\n ? ` · \"${e.partialText.slice(0, 60)}${e.partialText.length > 60 ? '…' : ''}\"`\n : '';\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '💬',\n text: `L${e.iteration} · ${e.toolCalls} tools${costStr}${toolStr}${partial}`,\n },\n });\n });\n // Live context window fill: update ctxPct on the fleet entry so the\n // AgentsMonitor (Ctrl+G) can render a per-agent progress bar.\n // In director mode, MultiAgentHost forwards subagent ctx.pct events as\n // 'subagent.ctx_pct' with subagentId. The leader agent emits ctx.pct\n // directly (handled by a separate listener below for non-director mode).\n const offCtxPct = events.on('subagent.ctx_pct', (e) => {\n dispatch({\n type: 'fleetCtxPct',\n id: e.subagentId,\n load: e.load,\n tokens: e.tokens,\n maxContext: e.maxContext,\n });\n });\n // Leader agent ctx.pct: emitted directly on the host EventBus (not forwarded\n // by MultiAgentHost). Updates the dedicated leader state for the monitor.\n const offLeaderCtxPct = events.on('ctx.pct', (e) => {\n setActiveMaxContext(e.maxContext);\n dispatch({\n type: 'leaderCtxPct',\n load: e.load,\n tokens: e.tokens,\n maxContext: e.maxContext,\n });\n });\n const offLeaderMaxContext = events.on('ctx.max_context', (e) => {\n if (e.maxContext > 0) setActiveMaxContext(e.maxContext);\n });\n // Always-on per-tool state surface. Now fires in both director and\n // non-director modes, so the leader's chat history shows subagent\n // tool calls regardless of mode. Director mode also gets FleetBus\n // path for richer FleetPanel streaming.\n const offTool = events.on('subagent.tool_executed', (e) => {\n dispatch({\n type: 'fleetTool',\n id: e.subagentId,\n name: e.name,\n ok: e.ok,\n durationMs: e.durationMs,\n outputBytes: e.outputBytes,\n });\n dispatch({ type: 'fleetToolEnd', id: e.subagentId });\n });\n return () => {\n offSpawned();\n offStarted();\n offCompleted();\n offBudgetWarning();\n offBudgetExtended();\n offIterationSummary();\n offCtxPct();\n offLeaderCtxPct();\n offLeaderMaxContext();\n offTool();\n };\n }, [events, director]);\n\n // Checkpoint and session rewind event listeners — no director required.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- onClearHistory is stable\n useEffect(() => {\n const offCheckpoint = events.on('checkpoint.written', (e) => {\n dispatch({\n type: 'checkpointReceived',\n cp: {\n promptIndex: e.promptIndex,\n promptPreview: e.promptPreview,\n ts: e.ts,\n fileCount: e.fileCount,\n },\n });\n });\n const offRewound = events.on('session.rewound', (_e) => {\n dispatch({ type: 'sessionRewound', toPromptIndex: 0 });\n dispatch({ type: 'clearHistory' });\n if (onClearHistory) {\n onClearHistory(dispatch);\n }\n });\n return () => {\n offCheckpoint();\n offRewound();\n };\n }, [events, onClearHistory]);\n\n // --- Brain decision events → chat history/status bar ---\n useEffect(() => {\n const requestSummary = (request: { source: string; question: string }) =>\n `${request.source}: ${request.question}`.slice(0, 80);\n\n const addBrainEntry = (\n status: Exclude<Extract<HistoryEntry, { kind: 'brain' }>['status'], 'thinking'>,\n payload: unknown,\n ) => {\n const p = payload as {\n request: {\n id: string;\n source: string;\n risk: Extract<HistoryEntry, { kind: 'brain' }>['risk'];\n question: string;\n context?: string;\n options?: NonNullable<State['brainPrompt']>['options'];\n };\n decision: {\n type: string;\n optionId?: string;\n text?: string;\n prompt?: string;\n reason?: string;\n rationale?: string;\n };\n };\n const decision =\n p.decision.optionId ??\n p.decision.text ??\n p.decision.reason ??\n p.decision.prompt ??\n p.decision.type;\n dispatch({\n type: 'brainStatus',\n state: status,\n source: p.request.source,\n risk: p.request.risk,\n summary: decision,\n });\n if (status === 'ask_human') {\n dispatch({\n type: 'brainPromptSet',\n prompt: {\n requestId: p.request.id,\n source: p.request.source,\n risk: p.request.risk,\n question: p.request.question,\n context: p.request.context,\n options: p.request.options,\n },\n });\n } else {\n dispatch({ type: 'brainPromptClear' });\n }\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'brain',\n status,\n source: p.request.source,\n risk: p.request.risk,\n question: p.request.question,\n decision,\n rationale: p.decision.rationale,\n },\n });\n };\n\n const offRequested = events.on('brain.decision_requested', ({ request }) => {\n dispatch({\n type: 'brainStatus',\n state: 'deciding',\n source: request.source,\n risk: request.risk,\n summary: requestSummary(request),\n });\n });\n const offAnswered = events.on('brain.decision_answered', (payload) => {\n addBrainEntry('answered', payload);\n });\n const offAskHuman = events.on('brain.decision_ask_human', (payload) => {\n addBrainEntry('ask_human', payload);\n });\n const offDenied = events.on('brain.decision_denied', (payload) => {\n addBrainEntry('denied', payload);\n });\n return () => {\n offRequested();\n offAnswered();\n offAskHuman();\n offDenied();\n };\n }, [events]);\n\n // --- AutoPhase phase/task events → PhaseMonitor ---\n useEffect(() => {\n if (!subscribeAutoPhase) return;\n\n const handler = (event: string, payload: unknown) => {\n switch (event) {\n case 'phase.started': {\n const p = payload as { phaseId: string; name: string };\n dispatch({\n type: 'autoPhasePhaseUpdate',\n phaseId: p.phaseId,\n name: p.name,\n status: 'running',\n completedTasks: 0,\n totalTasks: 0,\n startedAt: Date.now(),\n });\n break;\n }\n case 'phase.completed': {\n const p = payload as { phaseId: string; name: string; durationMs: number };\n dispatch({\n type: 'autoPhasePhaseUpdate',\n phaseId: p.phaseId,\n name: p.name,\n status: 'completed',\n completedTasks: 0,\n totalTasks: 0,\n });\n break;\n }\n case 'phase.failed': {\n const p = payload as { phaseId: string; name: string; error?: string };\n dispatch({\n type: 'autoPhasePhaseUpdate',\n phaseId: p.phaseId,\n name: p.name,\n status: 'failed',\n completedTasks: 0,\n totalTasks: 0,\n });\n break;\n }\n case 'phase.statusChange': {\n const p = payload as { phaseId: string; name: string; from: string; to: string };\n const status = p.to === 'running' ? 'running' : p.to;\n dispatch({\n type: 'autoPhasePhaseUpdate',\n phaseId: p.phaseId,\n name: p.name,\n status,\n completedTasks: 0,\n totalTasks: 0,\n });\n break;\n }\n case 'phase.taskCompleted': {\n const p = payload as { phaseId: string; taskId: string; taskTitle: string };\n const existing = stateRef.current.autoPhase?.phases[p.phaseId];\n if (existing) {\n dispatch({\n type: 'autoPhasePhaseUpdate',\n phaseId: p.phaseId,\n name: existing.name,\n status: existing.status,\n completedTasks: existing.completedTasks + 1,\n totalTasks: existing.totalTasks,\n });\n }\n break;\n }\n case 'autonomous.tick': {\n const p = payload as {\n activePhases: Array<{ id: string }>;\n queuedPhases: Array<{ id: string }>;\n };\n dispatch({ type: 'autoPhaseRunningPhases', phaseIds: p.activePhases.map((ph) => ph.id) });\n // Update elapsed time\n const ap = stateRef.current.autoPhase;\n if (ap) {\n const firstPhase = ap.phases[Object.keys(ap.phases)[0] ?? ''];\n const elapsed =\n ap.elapsedMs > 0\n ? ap.elapsedMs + 1000\n : Date.now() - (firstPhase?.startedAt ?? Date.now());\n dispatch({ type: 'autoPhaseElapsed', ms: elapsed });\n }\n break;\n }\n case 'graph.completed': {\n dispatch({ type: 'autoPhaseReset' });\n break;\n }\n case 'graph.failed': {\n dispatch({ type: 'autoPhaseReset' });\n break;\n }\n case 'worktree.allocated': {\n const p = payload as {\n handleId: string;\n ownerLabel: string;\n branch: string;\n baseBranch: string;\n };\n dispatch({\n type: 'worktreeUpsert',\n handleId: p.handleId,\n baseBranch: p.baseBranch,\n row: {\n branch: p.branch,\n ownerLabel: p.ownerLabel,\n baseBranch: p.baseBranch,\n status: 'active',\n allocatedAt: Date.now(),\n },\n });\n break;\n }\n case 'worktree.committed': {\n const p = payload as {\n handleId: string;\n insertions: number;\n deletions: number;\n files: number;\n };\n dispatch({\n type: 'worktreeUpsert',\n handleId: p.handleId,\n row: {\n insertions: p.insertions,\n deletions: p.deletions,\n files: p.files,\n status: 'committing',\n },\n });\n break;\n }\n case 'worktree.merged': {\n const p = payload as { handleId: string };\n dispatch({ type: 'worktreeUpsert', handleId: p.handleId, row: { status: 'merged' } });\n break;\n }\n case 'worktree.conflict': {\n const p = payload as { handleId: string; conflictFiles: string[] };\n dispatch({\n type: 'worktreeUpsert',\n handleId: p.handleId,\n row: { status: 'needs-review', conflictFiles: p.conflictFiles },\n });\n break;\n }\n case 'worktree.failed': {\n const p = payload as { handleId: string };\n dispatch({ type: 'worktreeUpsert', handleId: p.handleId, row: { status: 'failed' } });\n break;\n }\n case 'worktree.released': {\n const p = payload as { handleId: string; kept: boolean };\n // Keep conflicted/failed (kept) worktrees visible; drop clean ones.\n if (!p.kept) dispatch({ type: 'worktreeRemove', handleId: p.handleId });\n break;\n }\n }\n };\n\n return subscribeAutoPhase(handler);\n }, [subscribeAutoPhase]);\n\n // --- Leader agent compaction events → chat history ---\n useEffect(() => {\n const offFired = events.on('compaction.fired', (e) => {\n const { level, tokens, load, maxContext, report } = e as {\n level: string;\n tokens: number;\n load: number;\n maxContext: number;\n report: { before: number; after: number; reductions: { phase: string; saved: number }[] };\n aggressive: boolean;\n };\n const pct = (load * 100).toFixed(0);\n const before = report.before;\n const after = report.after;\n const saved = before - after;\n // `tokens` / `load` come from the middleware's full-request estimator\n // (messages + system + tools); `report.before` is the compactor's\n // message-only count. They are different views of the same moment, so\n // label them explicitly to avoid the \"98k tokens but 73% load?\" confusion.\n if (saved <= 0) {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'info',\n text: `▸ compaction skipped at ${level} — load ${pct}% (${tokens.toLocaleString()} of ${maxContext.toLocaleString()} tok). preserveK protects recent turns; nothing to elide.`,\n },\n });\n return;\n }\n const table = [\n `▸ context compacted at ${level} — load ${pct}% (${tokens.toLocaleString()} of ${maxContext.toLocaleString()} tok, full request)`,\n ` msg tokens before ${before.toLocaleString().padStart(8)}`,\n ` msg tokens after ${after.toLocaleString().padStart(8)}`,\n ` saved ${saved.toLocaleString().padStart(8)} (${((saved / before) * 100).toFixed(1)}%)`,\n ];\n for (const line of table) {\n dispatch({ type: 'addEntry', entry: { kind: 'info', text: line } });\n }\n });\n const offFailed = events.on('compaction.failed', (e) => {\n const { level, load, maxContext, fatal } = e as {\n level: string;\n load: number;\n maxContext: number;\n fatal: boolean;\n };\n const pct = (load * 100).toFixed(0);\n const text = fatal\n ? `✗ compaction failed at ${level} — load ${pct}% of ${maxContext.toLocaleString()} tok — FATAL`\n : `⚠ compaction failed at ${level} — load ${pct}% of ${maxContext.toLocaleString()} tok — continuing`;\n dispatch({ type: 'addEntry', entry: { kind: fatal ? 'error' : 'warn', text } });\n });\n return () => {\n offFired();\n offFailed();\n };\n }, [events]);\n\n // Install a dispatch-backed setter into the shared controller so the\n // `/fleet stream on|off` slash command can flip our reducer flag.\n // Restored to a noop on unmount so a late-arriving slash callback\n // doesn't dispatch into a torn-down React tree.\n useEffect(() => {\n if (!fleetStreamController) return;\n fleetStreamController.enabled = state.streamFleet;\n fleetStreamController.setEnabled = (enabled: boolean) => {\n dispatch({ type: 'setStreamFleet', enabled });\n };\n return () => {\n fleetStreamController.setEnabled = (enabled: boolean) => {\n fleetStreamController.enabled = enabled;\n };\n };\n }, [fleetStreamController, state.streamFleet]);\n\n // Keep the controller's mirror of `enabled` in sync when the toggle is\n // flipped from a TUI-side path (not the slash command).\n useEffect(() => {\n if (fleetStreamController) fleetStreamController.enabled = state.streamFleet;\n }, [state.streamFleet, fleetStreamController]);\n\n // Install a dispatch-backed setter into the shared controller so the\n // `/agents on|off` slash command can toggle our overlay flag.\n // Restored to a noop on unmount so a late-arriving slash callback\n // doesn't dispatch into a torn-down React tree.\n useEffect(() => {\n if (!agentsMonitorController) return;\n agentsMonitorController.visible = state.agentsMonitorOpen;\n agentsMonitorController.setVisible = (visible: boolean) => {\n if (visible !== state.agentsMonitorOpen) {\n dispatch({ type: 'toggleAgentsMonitor' });\n }\n };\n return () => {\n agentsMonitorController.setVisible = (visible: boolean) => {\n agentsMonitorController.visible = visible;\n };\n };\n }, [agentsMonitorController, state.agentsMonitorOpen]);\n\n // Keep the controller's mirror of `visible` in sync when the toggle is\n // flipped from a TUI-side path (not the slash command).\n useEffect(() => {\n if (agentsMonitorController) agentsMonitorController.visible = state.agentsMonitorOpen;\n }, [state.agentsMonitorOpen, agentsMonitorController]);\n\n // Track double-Esc for input buffer clearing.\n const lastEscAtRef = useRef(0);\n const ESC_DOUBLE_PRESS_MS = 1000;\n\n // --- FleetBus → TUI dispatch bridge ---\n // Subscribes to every event on the director's FleetBus and dispatches\n // fleet state actions. Text deltas are throttled (FLUSH_MS) to avoid\n // flooding React re-renders; other events dispatch immediately.\n // Seeds initial fleet state from director.status() on mount so the\n // panel reflects subagents spawned before the TUI attached.\n // biome-ignore lint/correctness/useExhaustiveDependencies: labelFor is ref-stable\n useEffect(() => {\n const d = director;\n if (!d) return;\n const FLUSH_MS = 150;\n\n // Coalesce high-frequency subagent display events. Instead of dispatching\n // (and re-rendering) once per event, queue them and flush as ONE\n // `fleetBatch` every ~150ms. During a multi-agent run this turns hundreds\n // of renders/sec into ~6/sec. Correctness-sensitive events (task.completed\n // on offDone, and the one-time mount seed) keep the real `dispatch`.\n const batch: Action[] = [];\n let batchTimer: ReturnType<typeof setTimeout> | null = null;\n const flushBatch = () => {\n batchTimer = null;\n if (batch.length === 0) return;\n dispatch({ type: 'fleetBatch', actions: batch.splice(0, batch.length) });\n };\n const enq = (a: Action) => {\n batch.push(a);\n // Cap so a 20-agent burst can't grow an unbounded array before the timer.\n if (batch.length >= 256) {\n if (batchTimer) clearTimeout(batchTimer);\n flushBatch();\n return;\n }\n if (!batchTimer) batchTimer = setTimeout(flushBatch, FLUSH_MS);\n };\n\n // Per-agent buffered assistant text. Flushed as one `subagent`\n // history entry when the agent stops emitting deltas for FLUSH_MS,\n // so we don't fire a fresh history entry on every token.\n const streamBuf = new Map<string, string>();\n let streamFlushTimer: ReturnType<typeof setTimeout> | null = null;\n const flushStreamBufs = () => {\n for (const [id, text] of streamBuf) {\n const trimmed = text.trim();\n if (!trimmed) continue;\n const lbl = labelFor(id);\n enq({ type: 'fleetMessage', id, text: trimmed });\n if (streamFleetRef.current) {\n enq({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '💬',\n text: trimmed,\n },\n });\n }\n }\n streamBuf.clear();\n streamFlushTimer = null;\n };\n\n // Seed: discover already-spawned subagents from the coordinator.\n const status = d.status();\n for (const s of status.subagents) {\n const meta = d.getSubagentMeta(s.id);\n dispatch({\n type: 'fleetSpawn',\n id: s.id,\n name: meta?.name ?? s.name,\n provider: meta?.provider,\n model: meta?.model,\n });\n // Seed a stable label so subagents spawned before TUI mount still\n // show up by name in the status bar's per-agent detail line.\n labelFor(s.id, meta?.name ?? s.name);\n }\n // Also seed cost from the usage aggregator.\n dispatch({\n type: 'fleetCost',\n cost: d.snapshot().total.cost,\n input: d.snapshot().total.input,\n output: d.snapshot().total.output,\n });\n\n // Discover new subagents on first FleetBus event for an unknown id.\n const seen = new Set(Object.keys(status.subagents));\n\n // Throttled delta accumulator per subagent.\n const pending = new Map<string, string>();\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n const doFlush = () => {\n for (const [id, text] of pending) {\n if (text) enq({ type: 'fleetDelta', id, text });\n }\n pending.clear();\n flushTimer = null;\n };\n\n const offFleet = d.fleet.onAny((e: FleetEvent) => {\n // All dispatches in this handler go through the 150ms batch: shadow\n // `dispatch` with `enq` for the whole callback so every switch case\n // below queues instead of rendering immediately.\n const dispatch = enq;\n // Discover new subagents.\n const fresh = !seen.has(e.subagentId);\n if (fresh) {\n seen.add(e.subagentId);\n const meta = d.getSubagentMeta(e.subagentId);\n dispatch({\n type: 'fleetSpawn',\n id: e.subagentId,\n name: meta?.name,\n provider: meta?.provider,\n model: meta?.model,\n });\n // Always assign a label on first sighting so the status bar's\n // 4th line has stable AGENT#N names even when history streaming\n // is disabled. The history `spawned` entry below is gated on\n // streamFleet; label assignment itself is unconditional.\n const lbl = labelFor(e.subagentId, meta?.name);\n if (streamFleetRef.current) {\n const where =\n meta?.provider && meta?.model ? `${meta.provider}/${meta.model}` : 'spawned';\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '▶',\n text: where,\n },\n });\n }\n }\n\n switch (e.type) {\n case 'iteration.started':\n dispatch({ type: 'fleetStart', id: e.subagentId });\n break;\n case 'session.started':\n // First event a subagent emits — treat as start so the fleet\n // panel is populated even if no iteration.started fires yet.\n dispatch({ type: 'fleetStart', id: e.subagentId });\n break;\n case 'provider.text_delta': {\n const p = e.payload as { text?: string };\n if (p?.text) {\n const cur = pending.get(e.subagentId) ?? '';\n pending.set(e.subagentId, cur + p.text);\n if (!flushTimer) flushTimer = setTimeout(doFlush, FLUSH_MS);\n streamBuf.set(e.subagentId, (streamBuf.get(e.subagentId) ?? '') + p.text);\n if (streamFlushTimer) clearTimeout(streamFlushTimer);\n streamFlushTimer = setTimeout(flushStreamBufs, FLUSH_MS * 4);\n }\n break;\n }\n case 'provider.thinking_delta': {\n // Extended thinking output — same buffering as text_delta so\n // it gets flushed into recentMessages and (when streaming is\n // on) injected into leader history.\n const p = e.payload as { text?: string };\n if (p?.text) {\n streamBuf.set(e.subagentId, (streamBuf.get(e.subagentId) ?? '') + p.text);\n if (streamFlushTimer) clearTimeout(streamFlushTimer);\n streamFlushTimer = setTimeout(flushStreamBufs, FLUSH_MS * 4);\n }\n break;\n }\n case 'provider.retry': {\n const p = e.payload as { attempt?: number; delayMs?: number };\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'warn',\n text: `subagent retry ${p?.attempt ?? '?'}${p?.delayMs ? ` (${p.delayMs}ms)` : ''}`,\n },\n });\n break;\n }\n case 'provider.error': {\n const p = e.payload as { description?: string };\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'error',\n text: `subagent error${p?.description ? `: ${p.description}` : ''}`,\n },\n });\n break;\n }\n case 'tool.started': {\n const p = e.payload as { name?: string };\n if (p?.name) {\n dispatch({ type: 'fleetToolStart', id: e.subagentId, name: p.name });\n }\n break;\n }\n case 'tool.executed': {\n const p = e.payload as {\n name?: string;\n ok?: boolean;\n durationMs?: number;\n outputBytes?: number;\n outputLines?: number;\n };\n dispatch({\n type: 'fleetTool',\n id: e.subagentId,\n name: p?.name,\n ok: p?.ok,\n durationMs: p?.durationMs,\n outputBytes: p?.outputBytes,\n outputLines: p?.outputLines,\n });\n dispatch({ type: 'fleetToolEnd', id: e.subagentId });\n // Also inject into leader chat history when stream is enabled.\n if (streamFleetRef.current && p?.name) {\n const lbl = labelFor(e.subagentId);\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'subagent',\n agentLabel: lbl.label,\n agentColor: lbl.color,\n icon: '🔧',\n text: `→ ${p.name} ${p.ok === false ? '✗' : '✓'}${p.durationMs != null ? ` (${p.durationMs}ms)` : ''}`,\n },\n });\n }\n break;\n }\n case 'provider.response': {\n // Surface live cost from the aggregator (already computed with\n // per-model pricing).\n dispatch({\n type: 'fleetCost',\n cost: d.snapshot().total.cost,\n input: d.snapshot().total.input,\n output: d.snapshot().total.output,\n });\n break;\n }\n case 'session.ended':\n // Subagent finished — leave status update to task.completed.\n break;\n case 'compaction.fired':\n dispatch({\n type: 'addEntry',\n entry: { kind: 'info', text: 'subagent compaction triggered' },\n });\n break;\n case 'compaction.failed':\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: 'subagent compaction failed' },\n });\n break;\n case 'token.threshold':\n dispatch({\n type: 'addEntry',\n entry: { kind: 'info', text: 'subagent token threshold reached' },\n });\n break;\n case 'budget.threshold_reached': {\n const p = e.payload as { kind?: string; used?: number; limit?: number };\n dispatch({\n type: 'fleetBudgetWarning',\n id: e.subagentId,\n kind: p?.kind ?? 'unknown',\n used: p?.used ?? 0,\n limit: p?.limit ?? 0,\n });\n break;\n }\n case 'budget.extended': {\n const p = e.payload as { totalExtensions?: number };\n if (p?.totalExtensions !== undefined) {\n dispatch({\n type: 'fleetBudgetExtended',\n id: e.subagentId,\n totalExtensions: p.totalExtensions,\n });\n }\n break;\n }\n // --- Collab session events ---\n case 'bug.found': {\n // Detect collab subagent role from subagentId: bug-hunter-<sid>,\n // refactor-planner-<sid>, critic-<sid>\n const role = e.subagentId.includes('bug-hunter')\n ? 'bug-hunter'\n : e.subagentId.includes('refactor-planner')\n ? 'refactor-planner'\n : e.subagentId.includes('critic')\n ? 'critic'\n : null;\n if (!role && !state.collabSession) {\n // Not a collab subagent — ignore.\n break;\n }\n if (!state.collabSession) {\n // First collab event we've seen — bootstrap state lazily.\n dispatch({\n type: 'collabSubagentSpawned',\n subagentId: e.subagentId,\n role: role ?? 'unknown',\n });\n }\n const bp = e.payload as {\n finding?: { id?: string; severity?: string; description?: string };\n };\n if (bp?.finding) {\n const sessionId = e.subagentId.split('-').slice(1).join('-') || e.subagentId;\n dispatch({\n type: 'collabBugFound',\n sessionId,\n bugId: bp.finding.id ?? 'unknown',\n severity: bp.finding.severity ?? 'unknown',\n description: bp.finding.description ?? '',\n });\n }\n break;\n }\n case 'refactor.plan': {\n if (!state.collabSession) break;\n const pp = e.payload as {\n plan?: { id?: string; riskScore?: string; phases?: unknown[] };\n };\n if (pp?.plan) {\n const sessionId = e.subagentId.split('-').slice(1).join('-') || e.subagentId;\n dispatch({\n type: 'collabPlanEmitted',\n sessionId,\n planId: pp.plan.id ?? 'unknown',\n riskScore: pp.plan.riskScore ?? 'unknown',\n phaseCount: pp.plan.phases?.length ?? 0,\n });\n }\n break;\n }\n case 'critic.evaluation': {\n if (!state.collabSession) break;\n const ep = e.payload as {\n evaluation?: { id?: string; verdict?: string; score?: number };\n };\n if (ep?.evaluation) {\n const sessionId = e.subagentId.split('-').slice(1).join('-') || e.subagentId;\n dispatch({\n type: 'collabEvalComplete',\n sessionId,\n evalId: ep.evaluation.id ?? 'unknown',\n verdict: ep.evaluation.verdict ?? 'unknown',\n score: ep.evaluation.score ?? 0,\n });\n }\n break;\n }\n case 'collab.session_done': {\n // Emitted by the CollabSession itself (EventEmitter 'session.done').\n if (!state.collabSession) break;\n const dp = e.payload as {\n report?: {\n sessionId?: string;\n overallVerdict?: 'approve' | 'needs_revision' | 'reject';\n };\n };\n if (dp?.report) {\n dispatch({\n type: 'collabSessionDone',\n sessionId: dp.report.sessionId ?? state.collabSession.sessionId ?? 'unknown',\n verdict: dp.report.overallVerdict ?? 'needs_revision',\n });\n }\n break;\n }\n }\n });\n\n // Task completions arrive on the director's bus too, but the\n // history entry is now produced by the `subagent.task_completed`\n // EventBus listener (which fires uniformly for director and\n // non-director paths). Here we only update fleet panel state +\n // running cost — the chat-side entry would otherwise duplicate.\n const offDone = d.on('task.completed', (payload) => {\n dispatch({\n type: 'fleetDone',\n id: payload.result.subagentId,\n status: payload.result.status,\n iterations: payload.result.iterations,\n toolCalls: payload.result.toolCalls,\n });\n dispatch({\n type: 'fleetCost',\n cost: d.snapshot().total.cost,\n input: d.snapshot().total.input,\n output: d.snapshot().total.output,\n });\n // Drain any pending streaming text right before the completion\n // entry is committed by the EventBus listener so the order\n // \"chat → done line\" stays correct. flushStreamBufs queues into the\n // batch, so flush the batch synchronously here to commit those chat\n // lines before the done entry lands.\n if (streamFlushTimer) {\n clearTimeout(streamFlushTimer);\n flushStreamBufs();\n }\n if (batchTimer) clearTimeout(batchTimer);\n flushBatch();\n });\n\n return () => {\n offFleet();\n offDone();\n if (flushTimer) clearTimeout(flushTimer);\n doFlush(); // queues any pending deltas\n if (streamFlushTimer) clearTimeout(streamFlushTimer);\n flushStreamBufs(); // queues any pending messages\n if (batchTimer) clearTimeout(batchTimer);\n flushBatch(); // commit the queued batch before teardown\n };\n }, [director]);\n\n // Handle SIGINT as a three-stage escalation:\n // 1st press — stop work and stay at the prompt: cancel the foreground\n // run + kill the fleet, OR (in autonomy / background-only mode) halt\n // the engines + terminate the fleet. Pickers cancel instead.\n // 2nd press — exit: graceful Ink unmount (restores the terminal) with a\n // hard-exit fallback timer in case the React tree is wedged.\n // 3rd press — immediate process.exit, so a wedged Ink loop can't trap\n // the user.\n useEffect(() => {\n const onSigint = () => {\n const current = stateRef.current;\n // Second (or later) Ctrl+C — exit no matter what. Status may be\n // 'aborting', 'running', or 'streaming'; the user has clearly\n // decided they want out. Try Ink's graceful exit first, then\n // hard-exit on a short timer in case the React tree is wedged.\n if (current.interrupts >= 1) {\n // Second (or later) Ctrl+C — the user wants out. Force-kill tracked\n // processes regardless of state.\n getProcessRegistry().killAll({ force: true });\n // If we already asked Ink to unmount and the user pressed again, the\n // React tree is wedged — hard-exit immediately.\n if (exitRequestedRef.current) {\n process.exit(130);\n }\n exitRequestedRef.current = true;\n dispatch({ type: 'interrupt' });\n // Terminate any lingering fleet so subagents don't outlive the TUI.\n if (director) void director.terminateAll().catch(() => undefined);\n // Graceful Ink unmount first: it restores the terminal (raw mode off,\n // cursor shown, alt-screen dismantled) and routes the 130 exit code\n // through run-tui's settle(). A bare process.exit() here would skip\n // that and can leave the terminal in raw mode — the \"exit feels\n // broken\" symptom. Fall back to a hard exit if Ink never unmounts.\n onExit(130);\n exit();\n const hardExit = setTimeout(() => process.exit(130), 400);\n hardExit.unref?.();\n return;\n }\n dispatch({ type: 'interrupt' });\n\n // Pickers are safe to cancel outright — closing the overlay\n // restores the previous state cleanly with no side-effects.\n // Do this first so a single Ctrl+C from the model picker or\n // slash picker exits gracefully instead of doing nothing.\n if (current.modelPicker.open) {\n dispatch({ type: 'modelPickerClose' });\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: 'Model picker cancelled.' },\n });\n return;\n }\n if (current.settingsPicker.open) {\n dispatch({ type: 'settingsClose' });\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: 'Settings cancelled.' },\n });\n return;\n }\n if (current.slashPicker.open) {\n dispatch({ type: 'slashPickerClose' });\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: 'Cancelled.' },\n });\n return;\n }\n\n if (activeCtrlRef.current) {\n activeCtrlRef.current.abort();\n dispatch({ type: 'status', status: 'aborting' });\n // Kill every running subagent on the first interrupt — without\n // this the parent agent.run() stays parked in `await delegate\n // → director.awaitTasks` forever and the \"press again to exit\"\n // hint becomes a lie.\n //\n // We `await` terminateAll AND race a 1500ms cap so a stuck\n // bridge or hung tool can't trap us in cleanup — the user\n // pressed Ctrl+C; their patience is finite. The second\n // Ctrl+C still forces exit immediately via the path above,\n // so this race only matters for the polite-shutdown window.\n if (director) {\n const cap = new Promise<void>((resolve) => {\n const t = setTimeout(resolve, 1500);\n t.unref?.();\n });\n void Promise.race([director.terminateAll().catch(() => undefined), cap]);\n }\n // Kill all tracked bash/exec processes from the process registry.\n // This ensures runaway child processes (including background bashes\n // that outlive the agent iteration) are cleaned up on Ctrl+C.\n const killed = getProcessRegistry().killAll();\n const procTag =\n killed.length > 0\n ? ` + killed ${killed.length} process${killed.length === 1 ? '' : 'es'}`\n : '';\n const droppedCount = stateRef.current.queue.length;\n if (droppedCount > 0) {\n dispatch({ type: 'queueClear' });\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'warn',\n text: `Iteration cancelled${director ? ' + fleet terminated' : ''}${procTag}. Dropped ${droppedCount} queued message${droppedCount === 1 ? '' : 's'}. Press Ctrl+C again to exit.`,\n },\n });\n } else {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'warn',\n text: `Iteration cancelled${director ? ' + fleet terminated' : ''}${procTag}. Press Ctrl+C again to exit.`,\n },\n });\n }\n } else {\n // No foreground (runBlocks) controller. We may still have background\n // work with no AbortController of its own: an autonomy engine driving\n // iterations, or a fleet of subagents. Eternal/parallel loops never\n // set activeCtrlRef, so this branch is the ONLY place their Ctrl+C is\n // handled — the first press must actually stop that work (and return\n // to the prompt), not merely announce \"press again to exit\".\n const fleetRunning = Object.values(current.fleet).filter(\n (e) => e.status === 'running',\n ).length;\n const autonomyRunning =\n eternalLoopRunningRef.current ||\n parallelLoopRunningRef.current ||\n getEternalEngine?.()?.currentState === 'running' ||\n getParallelEngine?.()?.currentState === 'running';\n if (autonomyRunning || fleetRunning > 0) {\n // Halt the engines first — eternal's stop() aborts the in-flight\n // iteration; both flip their persisted state to 'stopped'. Then\n // flip autonomy off so the driver loop won't start another\n // iteration, and terminate the fleet + tracked processes.\n getEternalEngine?.()?.stop();\n getParallelEngine?.()?.stop();\n if (autonomyRunning) switchAutonomy?.('off');\n if (director) {\n const cap = new Promise<void>((resolve) => {\n const t = setTimeout(resolve, 1500);\n t.unref?.();\n });\n void Promise.race([director.terminateAll().catch(() => undefined), cap]);\n }\n const killed = getProcessRegistry().killAll();\n const bits: string[] = [];\n if (autonomyRunning) bits.push('autonomy stopped');\n if (fleetRunning > 0)\n bits.push(`${fleetRunning} agent${fleetRunning === 1 ? '' : 's'} terminated`);\n if (killed.length > 0)\n bits.push(`${killed.length} process${killed.length === 1 ? '' : 'es'} killed`);\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'warn',\n text: `${bits.join(' + ') || 'Background work stopped'}. Press Ctrl+C again to exit.`,\n },\n });\n return;\n }\n // Truly idle — nothing running. Kill any lingering processes and arm\n // the second-press exit.\n const killed = getProcessRegistry().killAll();\n const procTag =\n killed.length > 0\n ? ` Killed ${killed.length} process${killed.length === 1 ? '' : 'es'}.`\n : '';\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: `Press Ctrl+C again to exit.${procTag}` },\n });\n }\n };\n process.on('SIGINT', onSigint);\n return () => {\n process.off('SIGINT', onSigint);\n };\n }, [director, getEternalEngine, getParallelEngine, switchAutonomy, onExit, exit]);\n\n /** Truncate pasted content for history preview: first `lines` lines + \"...\" line if truncated. */\n const truncatePastePreview = (text: string, lines: number): string => {\n const all = text.split('\\n');\n if (all.length <= lines) return text;\n const head = all.slice(0, lines).join('\\n');\n return `${head}\\n... (${all.length - lines} more lines)`;\n };\n\n // Finalize a fully-assembled paste payload. A collapse-worthy paste (long\n // or many-lined) or any multi-line paste becomes an inline `[pasted #N, L\n // lines]` chip in the editable row — the content lives in the AttachmentStore\n // and is expanded from the buffer at submit. A short single-line paste is\n // inserted straight into the row as raw text so the user can see and edit it.\n const commitPaste = async (full: string): Promise<void> => {\n const builder = builderRef.current;\n if (!builder || !full) return;\n if (builder.wouldCollapse(full) || full.includes('\\n')) {\n // Register-only: store the paste, get back the inline token. The token\n // goes into the buffer (single source of truth); nothing is appended to\n // the builder's own display, so there's no double-expansion at submit.\n const token = await builder.registerPaste(full);\n tokenPreviewsRef.current.set(token, truncatePastePreview(full, 6));\n const { buffer, cursor } = draftRef.current;\n const next = buffer.slice(0, cursor) + token + buffer.slice(cursor);\n setDraft(next, cursor + token.length);\n return;\n }\n const { buffer, cursor } = draftRef.current;\n const next = buffer.slice(0, cursor) + full + buffer.slice(cursor);\n setDraft(next, cursor + full.length);\n };\n\n const handleKey = async (input: string, key: KeyEvent) => {\n // Note: we no longer block input while the agent is running. Enter\n // routes through the queue when busy (see submit()), but typing,\n // backspace, paste, and clipboard-image all stay live.\n // Exception: when status is 'aborting', all input is blocked — except\n // Ctrl+C which the SIGINT handler processes directly (not through handleKey).\n // We check interrupts here so the second Ctrl+C can still reach the handler\n // even though status is 'aborting'.\n // Block input while aborting — unless the user is mid-steering\n // (they need to type their new direction) or already pressed Ctrl+C\n // twice (exit ladder takes priority). Ctrl+C SIGINT handler bypasses\n // handleKey entirely so it always fires regardless of this guard.\n if (state.status === 'aborting' && !state.steeringPending && state.interrupts === 0) return;\n // Block all input while confirmation prompt is shown — the ConfirmPrompt\n // component handles y/n/a/d/escape/enter itself and Input's disabled prop\n // is not reliable when multiple useInput hooks are active.\n if (state.confirmQueue.length > 0) return;\n\n // The help overlay is modal: Esc / `?` / `q` dismiss it; every other key is\n // swallowed so nothing leaks into the editor or chat behind it.\n if (state.helpOpen) {\n if (key.escape || input === '?' || input === 'q') dispatch({ type: 'toggleHelp' });\n return;\n }\n\n // Re-entrancy guard: block stale-second events from \\r\\n terminals.\n if (inputGateRef.current) return;\n\n // ── Managed-viewport scroll keys (PageUp/PageDown + Ctrl+Home/End) ─\n // Keyboard parity with the wheel: page the chat viewport. Active whenever\n // the managed viewport is the surface (alt-screen), mouse or not.\n // Home/End (when buffer empty) are handled separately below.\n if (managedLive) {\n if (key.pageUp) {\n dispatch({ type: 'scrollPage', dir: 'up' });\n return;\n }\n if (key.pageDown) {\n dispatch({ type: 'scrollPage', dir: 'down' });\n return;\n }\n // Ctrl+Home/End: jump to top/bottom of chat history.\n if (key.ctrl && key.home) {\n dispatch({ type: 'scrollToTop' });\n return;\n }\n if (key.ctrl && key.end) {\n dispatch({ type: 'scrollToBottom' });\n return;\n }\n }\n\n // ── Double-Esc clears input buffer ────────────────────────────────\n // When the user presses Esc twice within ESC_DOUBLE_PRESS_MS ms while\n // the buffer is non-empty, clear it. This mirrors the behaviour of bash's\n // Ctrl+C double-press clearing the line, adapted for Esc (no Ctrl needed).\n if (key.escape) {\n const now = Date.now();\n if (state.buffer.length > 0 && now - lastEscAtRef.current < ESC_DOUBLE_PRESS_MS) {\n dispatch({ type: 'clearInput' });\n lastEscAtRef.current = 0;\n return;\n }\n lastEscAtRef.current = now;\n }\n\n // ── Bracketed-paste accumulation ──────────────────────────────────\n // Must run before the Enter/key handling below: a paste split across\n // events can land a fragment that is exactly \"\\n\", which would\n // otherwise be read as Enter and submit mid-paste. The begin marker\n // (\\x1b[200~, or a bare [200~ when Ink ate the ESC) opens accumulation;\n // we swallow every fragment until the end marker (\\x1b[201~ / [201~),\n // then finalize the whole payload at once.\n if (input) {\n const paste = feedPaste(pasteAccumRef.current, input);\n if (paste) {\n pasteAccumRef.current = paste.accum;\n if (pasteFlushTimerRef.current) clearTimeout(pasteFlushTimerRef.current);\n if (paste.complete !== null) {\n pasteFlushTimerRef.current = null;\n await commitPaste(paste.complete);\n return;\n }\n pasteFlushTimerRef.current = setTimeout(() => {\n pasteFlushTimerRef.current = null;\n const full = pasteAccumRef.current;\n pasteAccumRef.current = null;\n if (full) void commitPaste(full);\n }, 250);\n return;\n }\n }\n\n // Some terminals emit \\r\\n for Enter as two separate stdin events.\n // \\r arrives with key.return=true (handled below); \\n may arrive as\n // a stray character with key.return=false. Normalize both to Enter\n // and prevent them from polluting the buffer as literal text.\n const isEnter = key.return || input === '\\r' || input === '\\n';\n\n // IMPORTANT: do NOT bail on `!input` here. Special keys (arrows,\n // Enter, Escape, Tab, Backspace) arrive with an empty `input`\n // string, and the slash/file pickers + cursor movement below all\n // depend on receiving those events. The late guard before text\n // insertion handles the empty-input case correctly.\n\n // Model picker takes absolute precedence: nothing else is meaningful\n // while the two-step overlay is open. Esc cancels (or backs out of\n // step 2 to step 1); Enter advances to the next step or confirms.\n // Step 2 additionally supports type-to-search and Backspace-to-delete.\n if (state.modelPicker.open) {\n if (key.escape) {\n if (state.modelPicker.step === 'model') {\n dispatch({ type: 'modelPickerBack' });\n } else {\n dispatch({ type: 'modelPickerClose' });\n }\n return;\n }\n if (key.upArrow) {\n dispatch({ type: 'modelPickerMove', delta: -1 });\n return;\n }\n if (key.downArrow) {\n dispatch({ type: 'modelPickerMove', delta: 1 });\n return;\n }\n // Step 2: type-to-search — printable characters append to the filter.\n if (state.modelPicker.step === 'model' && input && !key.return && !key.backspace) {\n dispatch({ type: 'modelPickerSearch', query: state.modelPicker.searchQuery + input });\n return;\n }\n // Step 2: Backspace — delete last char from filter, or go back if empty.\n if (state.modelPicker.step === 'model' && key.backspace) {\n const q = state.modelPicker.searchQuery;\n if (q.length > 0) {\n dispatch({ type: 'modelPickerSearch', query: q.slice(0, -1) });\n } else {\n dispatch({ type: 'modelPickerBack' });\n }\n return;\n }\n if (isEnter) {\n inputGateRef.current = true;\n try {\n if (state.modelPicker.step === 'provider') {\n const opt = state.modelPicker.providerOptions[state.modelPicker.selected];\n if (!opt) return;\n dispatch({\n type: 'modelPickerPickProvider',\n providerId: opt.id,\n models: opt.models,\n });\n return;\n }\n // step === 'model' → commit the switch (use filteredOptions for selected model)\n const providerId = state.modelPicker.pickedProviderId;\n const modelId = state.modelPicker.filteredOptions[state.modelPicker.selected];\n if (!providerId || !modelId) return;\n const err = switchProviderAndModel?.(providerId, modelId);\n if (err) {\n dispatch({ type: 'modelPickerHint', text: err });\n return;\n }\n setLiveProvider(providerId);\n setLiveModel(modelId);\n setActiveMaxContext(agent.ctx.provider.capabilities.maxContext);\n dispatch({\n type: 'addEntry',\n entry: { kind: 'info', text: `Switched to ${providerId} / ${modelId}.` },\n });\n dispatch({ type: 'modelPickerClose' });\n return;\n } finally {\n inputGateRef.current = false;\n }\n }\n // Any other key while picker is open: ignore.\n return;\n }\n\n // Autonomy picker takes absolute precedence while open.\n if (state.autonomyPicker.open) {\n if (key.escape) {\n dispatch({ type: 'autonomyPickerClose' });\n return;\n }\n if (key.upArrow) {\n dispatch({ type: 'autonomyPickerMove', delta: -1 });\n return;\n }\n if (key.downArrow) {\n dispatch({ type: 'autonomyPickerMove', delta: 1 });\n return;\n }\n if (isEnter) {\n const opt = state.autonomyPicker.options[state.autonomyPicker.selected];\n if (!opt) return;\n const err = switchAutonomy?.(opt.mode);\n if (err) {\n dispatch({ type: 'autonomyPickerHint', text: err });\n return;\n }\n dispatch({ type: 'autonomyPickerClose' });\n return;\n }\n return;\n }\n\n if (state.settingsPicker.open) {\n if (key.escape || (key.ctrl && input === 's')) {\n dispatch({ type: 'settingsClose' });\n return;\n }\n if (key.upArrow) {\n dispatch({ type: 'settingsFieldMove', delta: -1 });\n return;\n }\n if (key.downArrow) {\n dispatch({ type: 'settingsFieldMove', delta: 1 });\n return;\n }\n if (key.leftArrow) {\n dispatch({ type: 'settingsValueChange', delta: -1 });\n return;\n }\n if (key.rightArrow) {\n dispatch({ type: 'settingsValueChange', delta: 1 });\n return;\n }\n if (isEnter) {\n const { mode, delayMs } = state.settingsPicker;\n const err = await saveSettings?.({ mode, delayMs });\n if (err) {\n dispatch({ type: 'settingsHint', text: err });\n return;\n }\n dispatch({ type: 'settingsClose' });\n return;\n }\n return;\n }\n\n if (state.slashPicker.open) {\n if (key.escape) {\n dispatch({ type: 'slashPickerClose' });\n return;\n }\n if (key.upArrow) {\n dispatch({ type: 'slashPickerMove', delta: -1 });\n return;\n }\n if (key.downArrow) {\n dispatch({ type: 'slashPickerMove', delta: 1 });\n return;\n }\n if (isEnter) {\n const now = Date.now();\n if (now - lastEnterAtRef.current < 50) return;\n lastEnterAtRef.current = now;\n inputGateRef.current = true;\n const line = selectedSlashCommandLine(state.slashPicker);\n if (line) {\n void submit(line);\n } else {\n acceptSlashPickerSelection();\n }\n inputGateRef.current = false;\n return;\n }\n // Tab → autocomplete with selected command\n if (key.tab && state.slashPicker.matches.length > 0) {\n const sel = state.slashPicker.matches[state.slashPicker.selected];\n if (sel) {\n setDraft(`/${sel.name} `, sel.name.length + 2);\n dispatch({ type: 'slashPickerClose' });\n }\n return;\n }\n // Any other key falls through to normal text handling.\n }\n\n // Picker takes precedence over normal input handling when open.\n if (state.picker.open) {\n if (key.escape) {\n dispatch({ type: 'pickerClose' });\n return;\n }\n if (key.upArrow) {\n dispatch({ type: 'pickerMove', delta: -1 });\n return;\n }\n if (key.downArrow) {\n dispatch({ type: 'pickerMove', delta: 1 });\n return;\n }\n if (isEnter) {\n inputGateRef.current = true;\n try {\n await acceptPickerSelection();\n } finally {\n inputGateRef.current = false;\n }\n return;\n }\n // Any other key falls through to normal text handling, which will\n // either extend the @-query (e.g. typing more chars) or break it\n // (e.g. typing a space) — handled below.\n }\n\n // Esc when the agent is busy = \"drop what you're doing, I want to\n // steer\". Aborts the current iteration, terminates any running\n // subagents (otherwise they keep burning tokens on now-stale work),\n // and stashes a context snapshot so the STEERING preamble can tell\n // the model exactly what it was mid-doing. Does NOT consume the\n // Ctrl+C exit ladder (interrupts counter untouched). When no run\n // is active, Esc falls through to normal text handling.\n if (key.escape && state.status !== 'idle' && state.confirmQueue.length === 0) {\n // Snapshot context BEFORE we mutate anything. The submit handler\n // replays this into the model prompt so the model isn't guessing.\n const runningTools = Array.from(state.runningTools.values()).map((t) => t.name);\n const subagents = Object.values(state.fleet)\n .filter((e) => e.status === 'running')\n .map((e) => ({\n label: e.name,\n status: e.status,\n tool: e.currentTool?.name,\n }));\n const subagentsTerminated = subagents.length;\n const partialAssistantText = streamingTextRef.current.slice(-1500);\n\n activeCtrlRef.current?.abort();\n dispatch({ type: 'status', status: 'aborting' });\n dispatch({\n type: 'steerStart',\n snapshot: {\n runningTools,\n subagents,\n subagentsTerminated,\n partialAssistantText,\n },\n });\n\n // Kill the fleet too. Without this the subagents keep running\n // on the old direction, finish minutes later, and pollute the\n // chat with task.completed events the model doesn't care about\n // anymore. Cap at 1.5s so a wedged bridge can't hang the steer.\n if (director && subagentsTerminated > 0) {\n const cap = new Promise<void>((resolve) => {\n const t = setTimeout(resolve, 1500);\n t.unref?.();\n });\n void Promise.race([director.terminateAll().catch(() => undefined), cap]);\n }\n\n // Drop anything queued — steering means the user is redirecting,\n // not adding to the backlog. Without this the queued items would\n // run *before* the steering message, which contradicts the UX.\n const droppedCount = state.queue.length;\n if (droppedCount > 0) dispatch({ type: 'queueClear' });\n const droppedTag = droppedCount > 0 ? ` · dropped ${droppedCount} queued` : '';\n const fleetTag =\n subagentsTerminated > 0\n ? ` · stopped ${subagentsTerminated} subagent${subagentsTerminated === 1 ? '' : 's'}`\n : '';\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'warn',\n text: `↯ Interrupted${droppedTag}${fleetTag}. Type your new direction.`,\n },\n });\n return;\n }\n\n // Monitor overlays. Ctrl+F/G/T are the primary chords; F2/F3/F4 are\n // terminal-safe aliases because some terminals intercept the chord before\n // it reaches the app (notably Windows Terminal eats Ctrl+F for \"Find\").\n // F11 is deliberately unused — most terminals reserve it for fullscreen.\n // All toggles are allowed even while aborting, so the user can check\n // subagent state mid-steer.\n const toggleFleetOverlay = () => {\n if (state.agentsMonitorOpen) {\n // Switch: close AgentsMonitor, open FleetMonitor\n dispatch({ type: 'toggleAgentsMonitor' });\n dispatch({ type: 'toggleMonitor' });\n } else {\n dispatch({ type: 'toggleMonitor' });\n }\n };\n const toggleAgentsOverlay = () => {\n if (state.monitorOpen) {\n // Switch: close FleetMonitor, open AgentsMonitor\n dispatch({ type: 'toggleMonitor' });\n dispatch({ type: 'toggleAgentsMonitor' });\n } else {\n dispatch({ type: 'toggleAgentsMonitor' });\n }\n };\n const toggleWorktreeOverlay = () => {\n if (state.worktreeMonitorOpen) {\n dispatch({ type: 'worktreeMonitorToggle' });\n return;\n }\n // Opening closes any other overlay first so only one dashboard shows.\n if (state.agentsMonitorOpen) dispatch({ type: 'toggleAgentsMonitor' });\n if (state.monitorOpen) dispatch({ type: 'toggleMonitor' });\n if (state.autoPhase?.monitorOpen) dispatch({ type: 'autoPhaseMonitorToggle' });\n dispatch({ type: 'worktreeMonitorToggle' });\n };\n // Ctrl+F / F2 → fleet orchestration monitor.\n if ((key.ctrl && input === 'f') || key.fn === 2) {\n toggleFleetOverlay();\n return;\n }\n // Ctrl+G / F3 → agents live monitor.\n if ((key.ctrl && input === 'g') || key.fn === 3) {\n toggleAgentsOverlay();\n return;\n }\n // Ctrl+T / F4 → worktree monitor. (Word-delete that used to live on Ctrl+T\n // is covered by Ctrl+Backspace.)\n if ((key.ctrl && input === 't') || key.fn === 4) {\n toggleWorktreeOverlay();\n return;\n }\n // Ctrl+S toggles the autonomy settings editor (also openable via\n // `/settings`). Only when the host wired the settings accessors.\n if (key.ctrl && input === 's') {\n if (state.settingsPicker.open) {\n dispatch({ type: 'settingsClose' });\n } else if (getSettings && saveSettings) {\n const cfg = getSettings();\n dispatch({ type: 'settingsOpen', mode: cfg.mode, delayMs: cfg.delayMs });\n }\n return;\n }\n // Esc closes whichever monitor is open. When both are closed the busy-state\n // Esc handler above already returned when a run was active.\n if (key.escape) {\n if (state.agentsMonitorOpen) {\n dispatch({ type: 'toggleAgentsMonitor' });\n return;\n }\n if (state.monitorOpen) {\n dispatch({ type: 'toggleMonitor' });\n return;\n }\n if (state.worktreeMonitorOpen) {\n dispatch({ type: 'worktreeMonitorToggle' });\n return;\n }\n }\n\n // `?` on an empty prompt opens the keys-&-commands help overlay (lazygit\n // style). With any draft text it types normally, so a literal `?` mid-\n // message is never swallowed. Guarded against every other overlay/picker so\n // it never steals their `?`.\n if (\n input === '?' &&\n !key.ctrl &&\n !key.meta &&\n draftRef.current.buffer === '' &&\n !state.slashPicker.open &&\n !state.picker.open &&\n !state.modelPicker.open &&\n !state.autonomyPicker.open &&\n !state.settingsPicker.open &&\n !state.rewindOverlay &&\n !state.monitorOpen &&\n !state.agentsMonitorOpen &&\n !state.worktreeMonitorOpen &&\n !state.autoPhase?.monitorOpen\n ) {\n dispatch({ type: 'toggleHelp' });\n return;\n }\n\n if (isEnter) {\n // Re-entrancy protection for terminals that emit `\\r\\n` as two\n // separate stdin events: ignore Enter pressed within 50ms of the\n // last one. The 50ms window catches the double-event reliably\n // (the second `\\n` arrives within microseconds of the `\\r`) while\n // staying well below human double-tap speed.\n //\n // We intentionally do NOT await submit() here — it kicks off\n // agent.run() which can stay pending for minutes when a delegate\n // call is in flight. Awaiting would block this handler frame for\n // the full duration, which means every subsequent keystroke would\n // miss its dispatch (including the slash key — the user reported\n // the input feeling dead during delegated work). submit() handles\n // its own re-entrancy via state.status: when the agent is busy,\n // the message is queued instead of re-running concurrently.\n const now = Date.now();\n if (now - lastEnterAtRef.current < 50) return;\n lastEnterAtRef.current = now;\n void submit();\n return;\n }\n\n const { buffer, cursor } = draftRef.current;\n\n if (key.backspace || key.delete) {\n if (key.ctrl) {\n if (key.backspace) {\n if (cursor === 0) return;\n const beforeCursor = buffer.slice(0, cursor);\n const lastWordStart = beforeCursor.lastIndexOf(' ') + 1;\n const next = beforeCursor.slice(0, lastWordStart) + buffer.slice(cursor);\n setDraft(next, lastWordStart);\n } else {\n if (cursor >= buffer.length) return;\n const afterCursor = buffer.slice(cursor);\n const nextWordStart = afterCursor.indexOf(' ');\n const end = nextWordStart === -1 ? buffer.length : cursor + nextWordStart + 1;\n const next = buffer.slice(0, cursor) + buffer.slice(end);\n setDraft(next, cursor);\n }\n return;\n }\n\n // Token-aware backspace: if the text immediately before the cursor ends\n // with a whole attachment chip (`[pasted …]` / `[file:…]` / `[image …]`),\n // delete the entire token in one keystroke — anywhere in the line, not\n // just at the end.\n if (key.backspace) {\n const tokenDel = deleteTokenBackward(buffer, cursor);\n if (tokenDel) {\n setDraft(tokenDel.buffer, tokenDel.cursor);\n return;\n }\n }\n\n if (cursor === 0) return;\n const next = buffer.slice(0, cursor - 1) + buffer.slice(cursor);\n setDraft(next, cursor - 1);\n return;\n }\n\n if (key.leftArrow) {\n if (key.ctrl) {\n if (cursor === 0) return;\n const beforeCursor = buffer.slice(0, cursor);\n const prevWordStart = beforeCursor.lastIndexOf(' ');\n const target = prevWordStart === -1 ? 0 : prevWordStart + 1;\n setDraft(buffer, target);\n return;\n }\n if (cursor > 0) setDraft(buffer, cursor - 1);\n return;\n }\n if (key.rightArrow) {\n if (key.ctrl) {\n if (cursor >= buffer.length) return;\n const afterCursor = buffer.slice(cursor);\n const nextWordStart = afterCursor.indexOf(' ');\n const target = nextWordStart === -1 ? buffer.length : cursor + nextWordStart + 1;\n setDraft(buffer, target);\n return;\n }\n if (cursor < buffer.length) setDraft(buffer, cursor + 1);\n return;\n }\n // In managed (scroll) mode: Home/End scroll the chat viewport to top/bottom\n // when the input buffer is empty, mirroring the wheel and PgUp/PgDn.\n // When there is text in the buffer, Home/End position the cursor.\n if (key.home) {\n if (managedLive && buffer.length === 0) {\n dispatch({ type: 'scrollToTop' });\n } else {\n setDraft(buffer, 0);\n }\n return;\n }\n if (key.end) {\n if (managedLive && buffer.length === 0) {\n dispatch({ type: 'scrollToBottom' });\n } else {\n setDraft(buffer, buffer.length);\n }\n return;\n }\n\n // History scrolling is delegated to the terminal's native scrollback\n // (mouse wheel, Shift+PgUp in Windows Terminal, etc.) — Ink's <Static>\n // emits each finalized entry once and never repaints over it.\n if (key.upArrow) {\n if (state.inputHistory.length > 0) dispatch({ type: 'historyUp' });\n return;\n }\n if (key.downArrow) {\n if (state.historyIndex > 0) dispatch({ type: 'historyDown' });\n return;\n }\n // Ctrl+P → toggle PhaseMonitor overlay when AutoPhase is active.\n if (key.ctrl && input === 'p') {\n if (state.autoPhase) dispatch({ type: 'autoPhaseMonitorToggle' });\n else {\n // No active AutoPhase — treat as a command alias for /autophase status\n slashRegistry.dispatch('/autophase', agent.ctx).then((res) => {\n if (res?.message)\n dispatch({ type: 'addEntry', entry: { kind: 'info', text: res.message } });\n });\n }\n return;\n }\n if (key.ctrl && input === 'a') {\n setDraft(buffer, 0);\n return;\n }\n if (key.ctrl && input === 'e') {\n setDraft(buffer, buffer.length);\n return;\n }\n if (key.ctrl && input === 'u') {\n setDraft('', 0);\n return;\n }\n // Delete key and Ctrl+D → delete character at cursor (forward delete).\n // Ctrl+D also doubles as \"EOF\" in some shells — here it's just convenient\n // forward-delete when the user isn't at the terminal's physical Delete key.\n if (key.delete || (key.ctrl && input === 'd')) {\n if (cursor >= buffer.length) return;\n // Token-aware forward delete: drop a whole chip if one starts at cursor.\n const span = tokenLengthForward(buffer, cursor) || 1;\n const next = buffer.slice(0, cursor) + buffer.slice(cursor + span);\n setDraft(next, cursor);\n return;\n }\n\n // Ctrl+K → kill: delete from cursor to end of line.\n if (key.ctrl && input === 'k') {\n if (cursor >= buffer.length) return;\n const next = buffer.slice(0, cursor);\n setDraft(next, cursor);\n return;\n }\n\n // Alt+V → read image from clipboard and attach as [image #N].\n if (key.meta && input === 'v') {\n await pasteClipboardImage();\n return;\n }\n\n if (!input || key.ctrl || key.meta) return;\n\n // Never insert a raw escape sequence as text. An unrecognized F-key or CSI\n // sequence that Ink forwards as `input` would otherwise leak bytes into the\n // row (the F2/F3/F4 overlays are handled above via key.fn from raw stdin).\n if (input.charCodeAt(0) === 0x1b) return;\n\n // Non-bracketed large paste: some terminals (notably older Windows\n // consoles) don't emit \\x1b[200~ markers, so a paste arrives as one big\n // text chunk. Bracketed pastes are already handled by the accumulation\n // guard near the top of handleKey; route big unmarked chunks through the\n // same finalizer so they collapse to a pill consistently.\n if (input.length > PASTE_THRESHOLD_CHARS) {\n await commitPaste(input);\n return;\n }\n\n // Any multi-line chunk is a paste (Enter was already handled above), even\n // a short non-bracketed one. Route it through the same finalizer so it\n // collapses to an inline `[pasted #N, L lines]` chip instead of leaking\n // newlines (or being flattened to spaces) into the row.\n if (input.includes('\\n')) {\n await commitPaste(input);\n return;\n }\n\n const next = buffer.slice(0, cursor) + input + buffer.slice(cursor);\n setDraft(next, cursor + input.length);\n };\n\n /**\n * Drive a single iteration: run the agent against `blocks`, render the\n * result into history, then if any messages were typed while we were\n * busy, pull the head of the queue and recurse. Recursion terminates\n * when the queue is empty (status stays idle).\n */\n const runBlocks = async (blocks: ContentBlock[]): Promise<void> => {\n const ctrl = new AbortController();\n activeCtrlRef.current = ctrl;\n // Each run starts a fresh interrupt cycle: 1st Ctrl+C aborts, 2nd exits.\n // submit() already resets, but queue-drain / runText / autonomy paths\n // re-enter runBlocks without going through submit — without this reset a\n // stale counter from a prior abort would make the next run's first\n // Ctrl+C force-exit instead of aborting.\n dispatch({ type: 'resetInterrupts' });\n dispatch({ type: 'status', status: 'running' });\n\n try {\n const startedAt = Date.now();\n const before = tokenCounter?.total();\n const costBefore = tokenCounter?.estimateCost().total ?? 0;\n const routed = blocks.some((block) => block.type === 'image')\n ? await routeImagesForModel(blocks, {\n supportsVision: supportsVision\n ? await supportsVision()\n : agent.ctx.provider.capabilities.vision,\n adapters: visionAdapters,\n ctx: agent.ctx,\n signal: ctrl.signal,\n providerId: agent.ctx.provider.id,\n model: agent.ctx.model,\n })\n : { blocks, route: 'none' as const, convertedImages: 0 };\n if (routed.route === 'adapter') {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'info',\n text: `Image input analyzed via ${routed.adapterName ?? 'vision adapter'} (${routed.convertedImages} image${routed.convertedImages === 1 ? '' : 's'}).`,\n },\n });\n }\n const result = await agent.run(routed.blocks, { signal: ctrl.signal });\n\n // Per-iteration assistant text was already committed by the\n // `provider.response` listener as each LLM call finished. Safety net:\n // if anything is still lingering in the synchronous ref (e.g. an\n // aborted run that never received a final provider.response), commit\n // it now so partial output is preserved rather than silently dropped.\n const lingering = streamingTextRef.current;\n if (lingering.trim()) {\n dispatch({ type: 'addEntry', entry: { kind: 'assistant', text: lingering } });\n }\n streamingTextRef.current = '';\n pendingDeltaRef.current = '';\n if (flushTimerRef.current) {\n clearTimeout(flushTimerRef.current);\n flushTimerRef.current = null;\n }\n dispatch({ type: 'streamReset' });\n\n if (result.status === 'aborted') {\n dispatch({ type: 'addEntry', entry: { kind: 'warn', text: 'Aborted.' } });\n } else if (result.status === 'failed') {\n const err = result.error;\n const text = err\n ? `Failed [${err.severity}${err.recoverable ? ', recoverable' : ''}]: ${err.describe()}`\n : 'Failed.';\n dispatch({\n type: 'addEntry',\n entry: { kind: 'error', text },\n });\n } else if (result.status === 'max_iterations') {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'warn', text: `Hit max iterations (${result.iterations}).` },\n });\n }\n\n // ── SDD Auto-Detection ──────────────────────────────────────────\n // Process AI output for spec, implementation plan, and task detection.\n if (result.status === 'done' && result.finalText && onSDDOutput) {\n try {\n const sddMessages = await onSDDOutput(result.finalText);\n for (const msg of sddMessages) {\n dispatch({ type: 'addEntry', entry: { kind: 'info', text: msg } });\n }\n } catch {\n // Non-fatal — SDD detection is best-effort\n }\n }\n\n if (tokenCounter && before) {\n const after = tokenCounter.total();\n const costAfter = tokenCounter.estimateCost().total;\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'turn-summary',\n text: `[in: ${fmtTok(after.input - before.input)} out: ${fmtTok(after.output - before.output)} iters: ${result.iterations} cost: ${(costAfter - costBefore).toFixed(4)} ${((Date.now() - startedAt) / 1000).toFixed(1)}s]`,\n },\n });\n }\n\n // ── Next-task prediction (/next) ─────────────────────────────────\n // Opt-in. The CLI gates on the toggle + autonomy-off and returns []\n // when disabled, so calling unconditionally here is safe. Best-effort:\n // any failure is swallowed so prediction can never break the turn.\n if (result.status === 'done' && predictNext) {\n try {\n const userRequest = blocks\n .filter((b) => b.type === 'text')\n .map((b) => (b as { text: string }).text)\n .join(' ')\n .trim();\n const predictions = await predictNext({\n userRequest,\n assistantSummary: result.finalText ?? '',\n });\n if (predictions.length > 0) {\n const text = ['↳ likely next:', ...predictions.map((p, i) => ` ${i + 1}. ${p}`)].join(\n '\\n',\n );\n dispatch({ type: 'addEntry', entry: { kind: 'turn-summary', text } });\n }\n } catch {\n // Best-effort — never let prediction break the turn.\n }\n }\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'error', text: err instanceof Error ? err.message : String(err) },\n });\n } finally {\n activeCtrlRef.current = null;\n dispatch({ type: 'status', status: 'idle' });\n }\n\n // Drain the queue. If the run was aborted, the SIGINT handler has\n // already cleared the queue, so the head will be undefined.\n const head = stateRef.current.queue[0];\n if (head) {\n dispatch({ type: 'dequeueFirst' });\n await runBlocks(head.blocks);\n }\n };\n const runBlocksRef = useRef(runBlocks);\n runBlocksRef.current = runBlocks;\n\n /**\n * Eternal-mode driver. Loops `engine.runOneIteration()` until autonomy\n * flips away from 'eternal' or the engine reports stopped state. Each\n * iteration appends an info entry summarizing what happened so the TUI\n * timeline shows the engine's activity. Runs as a single sequential\n * consumer of `agent.run` — no race with user submissions because user\n * input is gated by `state.status` (a running iteration keeps status\n * at 'running' until the agent.run inside the engine returns).\n */\n const runEternalLoop = async (): Promise<void> => {\n const engine = getEternalEngine?.();\n if (!engine) return;\n // Avoid double-driving if the loop is already running. Status will\n // bounce idle↔running per iteration; the autonomy flag is the source\n // of truth for \"should we keep going\".\n if (eternalLoopRunningRef.current) return;\n eternalLoopRunningRef.current = true;\n try {\n while (true) {\n // Re-check the live state every iteration — /autonomy stop, SIGINT,\n // or /goal clear could have flipped it during the prior iteration.\n const liveMode = getAutonomy?.() ?? 'off';\n if (liveMode !== 'eternal') break;\n if (engine.currentState === 'stopped') break;\n dispatch({ type: 'status', status: 'running' });\n try {\n // Per-iteration entries land via the subscribeEternalIteration\n // useEffect below — we don't need to log here. Only surface\n // *errors* the engine catches but doesn't journal.\n await engine.runOneIteration();\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'error',\n text: `[eternal] ${err instanceof Error ? err.message : String(err)}`,\n },\n });\n }\n dispatch({ type: 'status', status: 'idle' });\n // Yield so a slash command submitted between iterations (e.g.\n // /autonomy stop) actually lands before we kick the next one.\n await new Promise((r) => setTimeout(r, 200));\n }\n } finally {\n eternalLoopRunningRef.current = false;\n // Sync the displayed autonomy state with reality. The loop only exits\n // when getAutonomy() !== 'eternal' or engine.currentState === 'stopped',\n // both of which mean the mode is effectively off/idle. Refreshing here\n // stops the status bar from oscillating between \"● thinking…\" and\n // \"● idle\" forever after the goal is done.\n if (getAutonomy) {\n const finalMode = getAutonomy();\n if (finalMode !== autonomyLive) setAutonomyLive(finalMode);\n }\n }\n };\n const eternalLoopRunningRef = useRef(false);\n const runEternalLoopRef = useRef(runEternalLoop);\n runEternalLoopRef.current = runEternalLoop;\n\n /** Parallel-eternal driver — fan-out loop for the ParallelEternalEngine. */\n const runParallelLoop = async (): Promise<void> => {\n const engine = getParallelEngine?.();\n if (!engine) return;\n if (parallelLoopRunningRef.current) return;\n parallelLoopRunningRef.current = true;\n try {\n while (true) {\n const liveMode = getAutonomy?.() ?? 'off';\n if (liveMode !== 'eternal-parallel') break;\n if (engine.currentState === 'stopped') break;\n dispatch({ type: 'status', status: 'running' });\n try {\n await engine.runOneIteration();\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'error',\n text: `[parallel] ${err instanceof Error ? err.message : String(err)}`,\n },\n });\n }\n dispatch({ type: 'status', status: 'idle' });\n await new Promise((r) => setTimeout(r, 200));\n }\n } finally {\n parallelLoopRunningRef.current = false;\n if (getAutonomy) {\n const finalMode = getAutonomy();\n if (finalMode !== autonomyLive) setAutonomyLive(finalMode);\n }\n }\n };\n const parallelLoopRunningRef = useRef(false);\n const runParallelLoopRef = useRef(runParallelLoop);\n runParallelLoopRef.current = runParallelLoop;\n\n // Subscribe to live per-iteration events from the eternal engine. The\n // engine's loop drive (runEternalLoop above) emits \"iteration completed\"\n // info entries, but those are coarse — this subscription surfaces the\n // *actual* journal entry per iteration with source, status, and cost.\n // Without it the TUI timeline only shows one-line summaries; with it the\n // user sees `#42 ✓ [todo] refactor parser ($0.0034)`.\n useEffect(() => {\n if (!subscribeEternalIteration) return;\n const unsub = subscribeEternalIteration((entry) => {\n const mark =\n entry.status === 'success'\n ? '✓'\n : entry.status === 'failure'\n ? '✗'\n : entry.status === 'aborted'\n ? '⊘'\n : '·';\n const cost = typeof entry.costUsd === 'number' ? ` ($${entry.costUsd.toFixed(4)})` : '';\n const note = entry.note ? ` — ${entry.note.slice(0, 80)}` : '';\n const text = `#${entry.iteration} ${mark} [${entry.source}] ${entry.task}${cost}${note}`;\n dispatch({ type: 'addEntry', entry: { kind: 'info', text } });\n });\n return unsub;\n }, [subscribeEternalIteration]);\n\n // Subscribe to live stage-transition events from the eternal engine.\n // Drives `state.eternalStage` used by the status bar to show the\n // engine's current location (decide → execute → reflect → sleep/paused).\n useEffect(() => {\n if (!subscribeEternalStage) return;\n const unsub = subscribeEternalStage((stage) => {\n dispatch({ type: 'eternalStage', stage });\n });\n return unsub;\n }, [subscribeEternalStage]);\n\n const submit = async (overrideRaw?: string) => {\n const raw = overrideRaw ?? draftRef.current.buffer;\n const trimmed = raw.trim();\n // Attachment chips live inline in the buffer now, so a paste/file-only\n // message is already non-empty here — a single `!trimmed` guard suffices.\n if (!trimmed) return;\n\n dispatch({ type: 'resetInterrupts' });\n const pushSubmittedHistory = () => {\n if (trimmed) dispatch({ type: 'historyPush', text: trimmed });\n };\n if (trimmed === '/image' || trimmed === '/paste-image') {\n pushSubmittedHistory();\n clearDraft();\n await pasteClipboardImage();\n return;\n }\n\n // Slash commands always dispatch immediately, even mid-iteration —\n // they don't conflict with a running agent.\n if (trimmed.startsWith('/')) {\n dispatch({ type: 'addEntry', entry: { kind: 'user', text: trimmed } });\n pushSubmittedHistory();\n clearDraft();\n try {\n const res = await slashRegistry.dispatch(trimmed, agent.ctx);\n if (res?.message) {\n dispatch({ type: 'addEntry', entry: { kind: 'info', text: res.message } });\n }\n // autoPhaseInit: when /autophase start succeeds, the graph title is\n // embedded in metadata so the TUI can show the PhasePanel immediately\n // even before the first orchestrator event fires.\n if (res?.metadata?.autoPhaseInit) {\n const m = res.metadata.autoPhaseInit as { title: string };\n dispatch({ type: 'autoPhaseInit', title: m.title });\n }\n // Slash commands like /model and /use mutate agent.ctx directly.\n // Re-sync the visible status bar so the user sees the switch\n // landed; otherwise the bar keeps the startup-time values and\n // /model \"feels\" broken even when subsequent requests use the\n // new model.\n const ctxModel = agent.ctx.model;\n if (ctxModel && ctxModel !== liveModel) setLiveModel(ctxModel);\n const ctxProviderId = (agent.ctx.provider as { id?: string } | undefined)?.id;\n if (ctxProviderId && ctxProviderId !== liveProvider) setLiveProvider(ctxProviderId);\n const ctxMaxContext = agent.ctx.provider.capabilities.maxContext;\n if (ctxMaxContext > 0 && ctxMaxContext !== activeMaxContext) {\n setActiveMaxContext(ctxMaxContext);\n }\n if (getYolo) {\n const currentYolo = getYolo();\n if (currentYolo !== yoloLive) setYoloLive(currentYolo);\n }\n if (getAutonomy) {\n const currentAutonomy = getAutonomy();\n if (currentAutonomy !== autonomyLive) setAutonomyLive(currentAutonomy);\n // When /autonomy eternal lands, kick off the engine-driven loop.\n // Fire-and-forget — the loop runs until autonomy flips away from\n // 'eternal' or the engine's currentState goes !== 'running'.\n // Without this, the slash command would set the flag but the\n // TUI would just sit at the prompt waiting for user input.\n if (currentAutonomy === 'eternal' && getEternalEngine) {\n void runEternalLoopRef.current();\n }\n if (currentAutonomy === 'eternal-parallel' && getParallelEngine) {\n void runParallelLoopRef.current();\n }\n }\n if (res?.exit) {\n exit();\n onExit(0);\n }\n // `runText` lets a slash command queue a follow-up user-role\n // message (used by `/steer <text>` to send the STEERING\n // preamble + new direction as if the user had typed it).\n // Run AFTER the message is rendered so the user sees the\n // slash result before the model's response streams.\n if (res?.runText) {\n const b = builderRef.current;\n if (b) {\n b.appendText(res.runText);\n const blocks = await b.submit();\n // Wait briefly for any in-flight abort to settle into\n // 'idle' before kicking the next iteration — otherwise\n // runBlocks would early-return on the busy guard.\n const start = Date.now();\n while (stateRef.current.status !== 'idle' && Date.now() - start < 1500) {\n await new Promise((r) => setTimeout(r, 25));\n }\n await runBlocks(blocks);\n }\n }\n // Only fire onClearHistory for `/clear` — without this gate every\n // slash command (`/model`, `/use`, `/help`, …) would wipe the\n // conversation. Match the command name segment, not just the\n // prefix, so `/clearfoo` doesn't trigger.\n const cmd = trimmed.slice(1).split(/\\s+/, 1)[0];\n if (cmd === 'clear') {\n onClearHistory?.(dispatch);\n }\n } catch (err) {\n dispatch({\n type: 'addEntry',\n entry: { kind: 'error', text: err instanceof Error ? err.message : String(err) },\n });\n }\n return;\n }\n\n const builder = builderRef.current;\n if (!builder) return;\n // Steering inject: if the user pressed Esc on the prior iteration,\n // prepend a STEERING preamble so the model sees this isn't a\n // follow-up — it's an interrupt redirecting the work. The preamble\n // carries (a) context the model would otherwise have to guess\n // (what tools were running, what subagents were live) and (b)\n // explicit authority — \"drop the prior plan, respawn subagents\n // if useful, ask for clarification if needed\". Plain user-role\n // text so accountability stays with the human who triggered it.\n const steering = state.steeringPending;\n\n // ── SDD Context Injection ──────────────────────────────────────────\n // When an SDD session is active, prepend the session context so the\n // model knows it's in a spec-building conversation.\n const sddContext = getSDDContext?.();\n if (sddContext && trimmed) {\n builder.appendText(`[SDD SESSION ACTIVE]\\n${sddContext}\\n\\n---\\nUser message:\\n`);\n }\n\n if (trimmed) {\n const toAppend = steering ? buildSteeringPreamble(state.steerSnapshot, trimmed) : trimmed;\n builder.appendText(toAppend);\n }\n if (steering) dispatch({ type: 'steerConsume' });\n // The user sees their original text + a visual ↯ marker when\n // steering, not the full preamble — keeps the chat readable while\n // the model still gets the explicit instruction.\n const displayText = trimmed ? (steering ? `↯ ${trimmed}` : trimmed) : '(attachments only)';\n // Build the history preview by scanning the message for inline chip tokens\n // and pulling each one's stored preview. Each chip becomes a label line\n // followed by an indented snippet of its collapsed content.\n const pasteParts: string[] = [];\n for (const m of trimmed.matchAll(new RegExp(INLINE_TOKEN_SRC, 'g'))) {\n const token = m[0];\n const content = tokenPreviewsRef.current.get(token);\n pasteParts.push(token);\n if (content) pasteParts.push(` ${content.split('\\n').slice(0, 6).join('\\n ')}`);\n }\n const pasteContent = pasteParts.length > 0 ? pasteParts.join('\\n') : undefined;\n pushSubmittedHistory();\n clearDraft();\n const blocks = await builder.submit();\n\n if (state.status !== 'idle') {\n // Agent is busy — queue this message for the drainer to pick up.\n dispatch({\n type: 'addEntry',\n entry: { kind: 'user', text: displayText, queued: true, pasteContent },\n });\n dispatch({ type: 'enqueue', item: { displayText, blocks } });\n return;\n }\n\n dispatch({ type: 'addEntry', entry: { kind: 'user', text: displayText, pasteContent } });\n await runBlocks(blocks);\n };\n\n // ─── --goal / --ask boot inject ─────────────────────────────────────\n // The CLI may pass `--goal \"...\"` or `--ask \"...\"` to pre-populate the\n // very first turn. `initialGoal` wraps the text in the GOAL preamble so\n // the model lands in autonomous goal mode; `initialAsk` submits the text\n // verbatim (handy for scripted shell aliases). Both fire one-shot via a\n // mount-time ref guard so a re-render can't double-submit. We wait a tick\n // for the input builder to settle, then push directly into runBlocks —\n // bypassing the slash registry / submit() path keeps the boot path\n // self-contained even if user-installed slash commands haven't mounted\n // their effects yet.\n const bootInjectedRef = useRef(false);\n useEffect(() => {\n if (bootInjectedRef.current) return;\n bootInjectedRef.current = true;\n const goal = initialGoal?.trim();\n const ask = initialAsk?.trim();\n if (!goal && !ask) return;\n void (async () => {\n // Give the banner a frame to render first so the user sees the\n // greeting before the first turn streams over the top of it.\n await new Promise((r) => setTimeout(r, 50));\n const b = builderRef.current;\n if (!b) return;\n if (goal) {\n const shortGoal = goal.length > 80 ? `${goal.slice(0, 80)}…` : goal;\n dispatch({\n type: 'addEntry',\n entry: {\n kind: 'info',\n text: `🎯 Goal locked: ${shortGoal}\\n Agent will work until verifiably complete. Esc / /steer to redirect, Ctrl+C to stop.`,\n },\n });\n b.appendText(buildGoalPreamble(goal));\n } else if (ask) {\n dispatch({ type: 'addEntry', entry: { kind: 'user', text: ask } });\n b.appendText(ask);\n }\n const blocks = await b.submit();\n await runBlocksRef.current(blocks);\n })();\n }, [initialAsk, initialGoal]);\n\n // Expose the latest handleKey to the mouse handler (click-to-confirm).\n handleKeyRef.current = handleKey;\n // Expose the latest open-routines / rewind handler / status chip values to\n // the empty-dep mouse handler so clicks drive the live state.\n openModelPickerRef.current = () => {\n void openModelPicker();\n };\n openAutonomyPickerRef.current = openAutonomyPicker;\n handleRewindToRef.current = (promptIndex: number) => {\n void handleRewindTo(promptIndex);\n };\n statusChipRef.current = {\n version: appVersion,\n model: `${liveProvider}/${liveModel}`,\n fleetRunning: fleetCounts?.running ?? 0,\n yolo: yoloLive,\n autonomy: autonomyLive,\n };\n\n const inputHint = useMemo(() => {\n if (state.status !== 'idle') return '';\n if (state.buffer.startsWith('/')) return 'slash command — Enter to dispatch';\n if (state.picker.open) return '';\n return '';\n }, [state.buffer, state.status, state.picker.open]);\n\n const affordanceShown = managedLive && state.scrollOffset > 0 && state.pendingNewLines > 0;\n return (\n <Box flexDirection=\"column\" height={managedLive ? termRows : undefined}>\n {managedLive ? (\n <ScrollableHistory\n entries={state.entries}\n streamingText={state.streamingText}\n toolStream={state.toolStream}\n scrollOffset={state.scrollOffset}\n viewportRows={state.viewportRows || Math.max(MIN_VIEWPORT, termRows - 8)}\n totalLines={state.totalLines}\n onMeasure={(total) => dispatch({ type: 'setMeasuredLines', totalLines: total })}\n />\n ) : (\n <History\n entries={state.entries}\n streamingText={state.streamingText}\n toolStream={state.toolStream}\n />\n )}\n {affordanceShown ? (\n <Text dimColor>\n {` ↓ ${state.pendingNewLines} new line${state.pendingNewLines === 1 ? '' : 's'} — PgDn or click to jump to bottom`}\n </Text>\n ) : null}\n {/* In mouse mode the whole live region below the scroll viewport is\n wrapped in one measured Box so its height feeds the viewport-size\n computation. In the default path it's a layout-neutral column. */}\n <Box ref={managedLive ? bottomRef : undefined} flexDirection=\"column\" flexShrink={0}>\n {/* Live activity strip + input. Wrapped so its height locates where an\n open picker's items start on screen (click-to-select geometry). */}\n <Box ref={managedLive ? prePickerRef : undefined} flexDirection=\"column\" flexShrink={0}>\n <Box ref={managedLive ? liveStripRef : undefined} flexDirection=\"column\" flexShrink={0}>\n <LiveActivityStrip entries={state.fleet} nowTick={nowTick} />\n </Box>\n <Input\n prompt={INPUT_PROMPT}\n value={state.buffer}\n cursor={state.cursor}\n disabled={\n (state.status === 'aborting' && !state.steeringPending) ||\n state.confirmQueue.length > 0\n }\n hint={inputHint}\n onKey={handleKey}\n />\n </Box>\n {state.picker.open ? (\n <FilePicker\n query={state.picker.query}\n matches={state.picker.matches}\n selected={state.picker.selected}\n />\n ) : null}\n {state.slashPicker.open ? (\n <SlashMenu\n query={state.slashPicker.query}\n matches={state.slashPicker.matches}\n selected={state.slashPicker.selected}\n />\n ) : null}\n {state.modelPicker.open ? (\n <ModelPicker\n step={state.modelPicker.step}\n providerOptions={state.modelPicker.providerOptions}\n modelOptions={state.modelPicker.modelOptions}\n filteredOptions={state.modelPicker.filteredOptions}\n selected={state.modelPicker.selected}\n pickedProviderId={state.modelPicker.pickedProviderId}\n searchQuery={state.modelPicker.searchQuery}\n hint={state.modelPicker.hint}\n />\n ) : null}\n {state.autonomyPicker.open ? (\n <AutonomyPicker\n options={state.autonomyPicker.options}\n selected={state.autonomyPicker.selected}\n hint={state.autonomyPicker.hint}\n />\n ) : null}\n {state.settingsPicker.open ? (\n <SettingsPicker\n field={state.settingsPicker.field}\n mode={state.settingsPicker.mode}\n delayMs={state.settingsPicker.delayMs}\n hint={state.settingsPicker.hint}\n />\n ) : null}\n {state.rewindOverlay ? (\n <CheckpointTimeline\n checkpoints={state.rewindOverlay.checkpoints}\n selected={state.rewindOverlay.selected}\n onSelect={(i) =>\n dispatch({ type: 'rewindOverlayMove', delta: i - state.rewindOverlay!.selected })\n }\n onConfirm={(i) => handleRewindTo(state.rewindOverlay!.checkpoints[i]!.promptIndex)}\n onClose={() => dispatch({ type: 'rewindOverlayClose' })}\n />\n ) : null}\n {state.brainPrompt ? (\n <Box flexDirection=\"column\" marginY={1} flexShrink={0}>\n <BrainDecisionPrompt\n {...state.brainPrompt}\n onAnswer={(answer) => {\n events.emit('brain.human_answered', { ...answer, at: Date.now() });\n dispatch({ type: 'brainPromptClear' });\n }}\n />\n </Box>\n ) : null}\n {state.confirmQueue.length > 0 &&\n (() => {\n const head = state.confirmQueue[0]!;\n let resolved = false;\n const onDecision = (decision: ConfirmDecision) => {\n if (resolved) return;\n resolved = true;\n head.resolve(decision);\n dispatch({ type: 'confirmClose' });\n };\n // Expose the live decision callback so a mouse click on the button\n // row can fire it (see handleMouse). The wrapper Box owns marginY\n // and carries the ref so measureElement returns the exact box\n // height the hit-test uses to locate the button row.\n confirmDecisionRef.current = onDecision;\n return (\n <Box ref={confirmRef} flexDirection=\"column\" marginY={1} flexShrink={0}>\n <ConfirmPrompt\n toolName={head.toolName}\n input={head.input}\n suggestedPattern={head.suggestedPattern}\n onDecision={onDecision}\n />\n </Box>\n );\n })()}\n <StatusBar\n model={`${liveProvider}/${liveModel}`}\n version={appVersion}\n state={state.status}\n tokenCounter={tokenCounter}\n hint={renderRunningTools(state.runningTools) || state.hint}\n queueCount={state.queue.length}\n yolo={yoloLive}\n autonomy={autonomyLive}\n elapsedMs={elapsedMs}\n todos={todos}\n plan={planCounts ?? undefined}\n fleet={fleetCounts}\n git={gitInfo}\n context={contextWindow}\n brain={state.brain}\n projectName={projectName}\n subagentCount={Object.keys(state.fleet).length}\n processCount={getProcessRegistry().activeCount}\n hiddenItems={hiddenItems}\n eternalStage={state.eternalStage}\n goalSummary={state.goalSummary}\n />\n {/* Only render the persistent hint bar in the managed (alt-screen)\n viewport. In the default inline-redraw mode it would add a row to the\n fragile live region and collide with monitor panels rendered below it\n (interleaving their counts into the hints). */}\n {managedLive ? (\n <KeyHintBar\n context={{\n confirm: state.confirmQueue.length > 0,\n picker:\n state.picker.open ||\n state.slashPicker.open ||\n state.modelPicker.open ||\n state.autonomyPicker.open ||\n state.settingsPicker.open ||\n !!state.rewindOverlay,\n monitor:\n state.agentsMonitorOpen ||\n state.monitorOpen ||\n state.worktreeMonitorOpen ||\n !!state.autoPhase?.monitorOpen,\n managed: managedLive,\n mouse: mouseLive,\n }}\n />\n ) : null}\n {/* Keys-&-commands help overlay (`?` on an empty prompt). Modal: while\n open, handleKey swallows everything but Esc/?/q, so it never coexists\n with a monitor. */}\n {state.helpOpen ? <HelpOverlay managed={managedLive} mouse={mouseLive} /> : null}\n {/* Agents monitor overlay (Ctrl+G) and fleet monitor overlay (Ctrl+F)\n take up the lower region — hide FleetPanel while any overlay is open. */}\n {state.agentsMonitorOpen ? (\n <AgentsMonitor\n entries={entriesWithLeader}\n totalCost={state.fleetCost}\n totalTokens={state.fleetTokens}\n nowTick={nowTick}\n />\n ) : state.autoPhase?.monitorOpen ? (\n <PhaseMonitor\n phases={state.autoPhase.phases}\n runningPhaseIds={state.autoPhase.runningPhaseIds}\n elapsedMs={state.autoPhase.elapsedMs}\n nowTick={nowTick}\n onClose={() => dispatch({ type: 'autoPhaseMonitorToggle' })}\n />\n ) : state.worktreeMonitorOpen ? (\n <WorktreeMonitor\n worktrees={state.worktrees}\n baseBranch={state.worktreeBase}\n nowTick={nowTick}\n onClose={() => dispatch({ type: 'worktreeMonitorToggle' })}\n />\n ) : state.monitorOpen ? (\n <FleetMonitor\n entries={state.fleet}\n totalCost={state.fleetCost}\n totalTokens={state.fleetTokens}\n nowTick={nowTick}\n collabSession={state.collabSession}\n />\n ) : director ? (\n <FleetPanel\n entries={entriesWithLeader}\n totalCost={state.fleetCost}\n roster={fleetRoster}\n collabSession={state.collabSession}\n />\n ) : null}\n {state.autoPhase && !state.autoPhase.monitorOpen ? (\n <PhasePanel\n phases={state.autoPhase.phases}\n runningPhaseIds={state.autoPhase.runningPhaseIds}\n nowTick={nowTick}\n />\n ) : null}\n {Object.keys(state.worktrees).length > 0 &&\n !state.worktreeMonitorOpen &&\n !state.monitorOpen ? (\n <WorktreePanel worktrees={state.worktrees} nowTick={nowTick} />\n ) : null}\n </Box>\n </Box>\n );\n}\n\n/**\n * Render an at-a-glance \"running: …\" hint for the status bar. Shows the\n * oldest in-flight tool by name; if more than one, appends \"(+N)\".\n */\nexport function renderRunningTools(\n running: ReadonlyMap<string, { name: string; startedAt: number }>,\n): string {\n if (running.size === 0) return '';\n let oldest: { name: string; startedAt: number } | null = null;\n for (const info of running.values()) {\n if (!oldest || info.startedAt < oldest.startedAt) oldest = info;\n }\n if (!oldest) return '';\n const elapsedSec = ((Date.now() - oldest.startedAt) / 1000).toFixed(1);\n const more = running.size > 1 ? ` (+${running.size - 1})` : '';\n return `running: ${oldest.name} ${elapsedSec}s${more}`;\n}\n\n/**\n * Find an active `@<query>` token at the cursor. The token starts at the\n * last `@` not preceded by a non-whitespace char, and runs up to the cursor\n * (no whitespace allowed inside). Returns null if no active token.\n */\nexport function detectAtToken(\n buffer: string,\n cursor: number,\n): { start: number; end: number; query: string } | null {\n let i = cursor - 1;\n while (i >= 0) {\n const ch = buffer.charCodeAt(i);\n if (ch === 64 /* @ */) {\n // Must be at the start of buffer or preceded by whitespace.\n if (i === 0 || /\\s/.test(buffer[i - 1] ?? '')) {\n return { start: i, end: cursor, query: buffer.slice(i + 1, cursor) };\n }\n return null;\n }\n if (ch === 32 /* space */ || ch === 9 /* tab */ || ch === 10 /* nl */) return null;\n i--;\n }\n return null;\n}\n\nfunction fmtTok(n: number): string {\n if (n < 1000) return String(n);\n if (n < 1_000_000) return `${(n / 1000).toFixed(n < 10_000 ? 1 : 0)}k`;\n return `${(n / 1_000_000).toFixed(1)}M`;\n}\n","// SGR (1006) mouse-sequence parser, factored out of the TUI input path so the\n// (fiddly) byte decoding can be unit-tested in isolation.\n//\n// With mouse tracking enabled (DECSET ?1000h ?1006h) the terminal emits, for\n// every press / release / wheel tick:\n//\n// ESC [ < Cb ; Cx ; Cy M (press / wheel / motion)\n// ESC [ < Cb ; Cx ; Cy m (release)\n//\n// Cx / Cy are 1-based column / row. Cb packs the button in its low bits plus\n// modifier and event-class flags:\n//\n// bits 0-1 button 0 = left, 1 = middle, 2 = right, 3 = none/release\n// bit 2 (4) shift\n// bit 3 (8) alt / meta\n// bit 4 (16) ctrl\n// bit 5 (32) motion (drag) — set while a button is held and the pointer moves\n// bit 6 (64) wheel — 64 = wheel up, 65 = wheel down, 66/67 = wheel left/right\n//\n// Like bracketed-paste markers, Ink's keypress parser can strip the leading\n// ESC byte, leaving a bare `[<…`. We match the ESC optionally so both forms\n// decode. A single stdin chunk can carry several sequences (fast wheel\n// spins) — parseSgrMouse returns every event it finds, in order.\n\nexport type MouseButton = 'left' | 'middle' | 'right' | 'wheelUp' | 'wheelDown' | 'other';\n\nexport interface MouseEvent {\n /** press = button down (or wheel tick), release = button up, wheel = scroll. */\n type: 'press' | 'release' | 'wheel';\n button: MouseButton;\n /** 1-based terminal column. */\n x: number;\n /** 1-based terminal row. */\n y: number;\n shift: boolean;\n alt: boolean;\n ctrl: boolean;\n /** Pointer moved with a button held (motion flag, bit 5). */\n drag: boolean;\n}\n\n// ESC is optional: Ink sometimes strips it from CSI sequences (same reason the\n// paste accumulator matches a bare `[200~`). Global flag so matchAll yields\n// every sequence in a chunk.\n// biome-ignore lint/suspicious/noControlCharactersInRegex: SGR mouse sequences carry a literal ESC\nconst SGR_MOUSE_RE = /\\x1b?\\[<(\\d+);(\\d+);(\\d+)([Mm])/g;\n\n/** True when the chunk contains at least one SGR mouse sequence. Cheap guard\n * used to drop mouse bytes before they reach a text input. */\nexport function hasSgrMouse(s: string): boolean {\n // Build a fresh non-stateful matcher so repeated calls are independent.\n return new RegExp(SGR_MOUSE_RE.source).test(s);\n}\n\n/** Strip every SGR mouse sequence out of a chunk, returning the remaining\n * (keyboard) bytes. Used by the stdin proxy so Ink never sees mouse data. */\nexport function stripSgrMouse(s: string): string {\n return s.replace(SGR_MOUSE_RE, '');\n}\n\n/** Decode every SGR mouse sequence in `s`, in order. Non-mouse bytes are\n * ignored. Returns [] when there are none. */\nexport function parseSgrMouse(s: string): MouseEvent[] {\n const events: MouseEvent[] = [];\n for (const m of s.matchAll(SGR_MOUSE_RE)) {\n const cb = Number.parseInt(m[1] ?? '', 10);\n const x = Number.parseInt(m[2] ?? '', 10);\n const y = Number.parseInt(m[3] ?? '', 10);\n const final = m[4];\n if (!Number.isFinite(cb) || !Number.isFinite(x) || !Number.isFinite(y)) continue;\n const isWheel = (cb & 64) !== 0;\n const drag = (cb & 32) !== 0;\n const low = cb & 3;\n let button: MouseButton;\n let type: MouseEvent['type'];\n if (isWheel) {\n type = 'wheel';\n button = low === 0 ? 'wheelUp' : low === 1 ? 'wheelDown' : 'other';\n } else if (final === 'm') {\n // Lowercase terminator = button release.\n type = 'release';\n button = low === 0 ? 'left' : low === 1 ? 'middle' : low === 2 ? 'right' : 'other';\n } else {\n type = 'press';\n button = low === 0 ? 'left' : low === 1 ? 'middle' : low === 2 ? 'right' : 'other';\n }\n events.push({\n type,\n button,\n x,\n y,\n shift: (cb & 4) !== 0,\n alt: (cb & 8) !== 0,\n ctrl: (cb & 16) !== 0,\n drag,\n });\n }\n return events;\n}\n","import type { EventBus } from '@wrongstack/core';\n\n/**\n * Animated terminal/tab title for the TUI.\n *\n * Writes an OSC-0 sequence (`ESC ] 0 ; <text> BEL`) — an out-of-band terminal\n * command that sets the window/tab title without touching the screen, so it\n * never corrupts Ink's render. The title animates: a braille spinner plus a\n * live status derived from the agent's EventBus (thinking / running a tool),\n * and a gentle scrolling marquee when idle. Reset to a static title on stop.\n *\n * Disable with WRONGSTACK_NO_TITLE=1.\n */\n\nconst SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\nconst setTitle = (s: string): string => `\\x1b]0;${s}\\x07`;\n\n/** A marquee window over `text`, advancing by `offset`. */\nfunction marquee(text: string, offset: number, width: number): string {\n const padded = `${text} `;\n const start = offset % padded.length;\n return (padded + padded).slice(start, start + width);\n}\n\nexport interface TerminalTitleOptions {\n stdout: NodeJS.WriteStream;\n events: EventBus;\n model?: string;\n appName?: string;\n intervalMs?: number;\n /** ms of silence before the title falls back to the idle marquee. */\n idleAfterMs?: number;\n}\n\nexport function startTerminalTitle(opts: TerminalTitleOptions): () => void {\n const { stdout, events } = opts;\n if (process.env['WRONGSTACK_NO_TITLE'] === '1' || !stdout.isTTY) {\n return () => {};\n }\n\n const app = opts.appName ?? 'WrongStack';\n const idleAfter = opts.idleAfterMs ?? 3500;\n const suffix = ` · ${app}`;\n\n let frame = 0;\n let scroll = 0;\n let phase: 'idle' | 'thinking' | 'tool' = 'idle';\n let toolName = '';\n let lastActivity = 0; // 0 → never active yet, start idle\n\n const touch = (next: 'thinking' | 'tool', tool?: string) => {\n phase = next;\n if (tool) toolName = tool;\n lastActivity = Date.now();\n };\n\n const offs: Array<() => void> = [\n events.on('iteration.started', () => touch('thinking')),\n events.on('provider.text_delta', () => touch('thinking')),\n events.on('provider.thinking_delta', () => touch('thinking')),\n events.on('tool.started', (e) => touch('tool', (e as { name?: string }).name ?? 'tool')),\n events.on('tool.executed', () => touch('thinking')),\n ];\n\n const write = (s: string) => {\n try {\n stdout.write(s);\n } catch {\n /* stdout closed during shutdown */\n }\n };\n\n const timer = setInterval(() => {\n frame = (frame + 1) % SPINNER.length;\n scroll += 1;\n if (lastActivity && Date.now() - lastActivity > idleAfter) phase = 'idle';\n\n const sp = SPINNER[frame];\n let title: string;\n if (phase === 'tool') {\n title = `${sp} ▸ ${toolName}${suffix}`;\n } else if (phase === 'thinking') {\n title = `${sp} thinking…${suffix}`;\n } else {\n // Idle: scroll the app name + model so the tab still feels alive.\n title = marquee(`✦ ${app}${suffix}`, scroll >> 1, 22);\n }\n write(setTitle(title));\n }, opts.intervalMs ?? 130);\n // Don't keep the event loop alive just for the title animation.\n timer.unref?.();\n\n return () => {\n clearInterval(timer);\n for (const off of offs) off();\n write(setTitle(app));\n };\n}\n","import { Readable } from 'node:stream';\nimport type {\n Agent,\n AttachmentStore,\n Director,\n EventBus,\n QueueStore,\n SlashCommandRegistry,\n TokenCounter,\n} from '@wrongstack/core';\nimport { writeErr } from '@wrongstack/core';\nimport type { VisionAdapters } from '@wrongstack/runtime/vision';\nimport { render } from 'ink';\nimport React from 'react';\nimport { App } from './app.js';\nimport { type MouseEvent, parseSgrMouse, stripSgrMouse } from './mouse.js';\nimport { startTerminalTitle } from './terminal-title.js';\n\nexport type SerialAutonomyStage =\n | { phase: 'idle' }\n | { phase: 'decide'; reason: string }\n | { phase: 'execute'; task: string }\n | { phase: 'reflect'; status: 'success' | 'failure' | 'aborted' | 'skipped'; note?: string }\n | { phase: 'sleep'; ms: number }\n | { phase: 'paused' }\n | { phase: 'stopped' }\n | { phase: 'error'; message: string };\n\nexport type ParallelAutonomyStage =\n | { phase: 'idle' }\n | { phase: 'decompose' }\n | { phase: 'fanout'; slots: number }\n | { phase: 'await'; taskIds: string[] }\n | { phase: 'aggregate'; successCount: number; total: number; goalComplete: boolean }\n | { phase: 'sleep'; ms: number }\n | { phase: 'stopped' }\n | { phase: 'error'; message: string };\n\nexport type AutonomyStage = SerialAutonomyStage | ParallelAutonomyStage;\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 /**\n * Subscribe to per-iteration stage transitions from the autonomy engines.\n * TUI uses this to render live status in the status bar.\n */\n subscribeEternalStage?: (fn: (stage: AutonomyStage) => void) => () => 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 /** Apply an autonomy mode after the picker confirms. Returns an error string on failure. */\n switchAutonomy?: (\n mode: 'off' | 'suggest' | 'auto' | 'eternal' | 'eternal-parallel',\n ) => 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 /** Absolute project root for goal.json loading. */\n projectRoot?: string;\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 * Enable full mouse support: clickable list items in menus/pickers and\n * in-app mouse-wheel scrolling of the chat history. Opt-in (default false)\n * because enabling terminal mouse tracking disables the terminal's own\n * wheel-scroll and text-selection/copy. When true this FORCES alt-screen\n * on (the app must own the screen to render its scroll viewport).\n */\n mouse?: 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: (\n items: Array<'todos' | 'plan' | 'fleet' | 'git' | 'elapsed' | 'context' | 'cost'>,\n ) => void;\n /**\n * Controller for the agents monitor overlay. App installs a dispatch-backed\n * setter on mount so the `/agents on|off` slash command can toggle the\n * overlay without a round-trip.\n */\n agentsMonitorController?: {\n visible: boolean;\n setVisible: (visible: boolean) => void;\n };\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 * Subscribe to AutoPhase phase/graph events from the PhaseOrchestrator.\n * Returns an unsubscribe function. The TUI uses this to drive the\n * PhaseMonitor and PhasePanel live views via dispatch actions.\n */\n subscribeAutoPhase?: (handler: (event: string, payload: unknown) => void) => () => void;\n /**\n * Read the persisted autonomy settings (defaultMode, autoProceedDelayMs).\n * Used by the SettingsPicker in the TUI on mount and after Ctrl+S toggle.\n */\n getSettings?: () => { mode: 'off' | 'suggest' | 'auto'; delayMs: number };\n /**\n * Persist autonomy settings changes. Returns null on success, or an\n * error string on failure (so the TUI can display it as a hint).\n */\n saveSettings?: (s: { mode: 'off' | 'suggest' | 'auto'; delayMs: number }) =>\n | string\n | null\n | Promise<string | null>;\n /**\n * Predict likely next steps after a completed turn. The CLI wires this from\n * the session provider and the `/next` toggle; it returns [] when prediction\n * is disabled or autonomy isn't 'off'. Display-only — never executed.\n */\n predictNext?: (input: {\n userRequest: string;\n assistantSummary: string;\n }) => 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\n// Mouse tracking: DECSET 1000 (button press/release) + 1002 (button-event\n// tracking: motion reported only WHILE a button is held) + 1006 (SGR extended\n// coordinates, so columns/rows beyond 223 are reported as decimal). Enabling\n// these takes the mouse away from the terminal's native wheel-scroll and\n// text-selection — which is why mouse mode is opt-in and forces alt-screen so\n// the app owns the screen and can render its own scroll viewport. 1002 (not\n// 1003 any-motion) keeps idle moves quiet while still enabling scrollbar\n// thumb drags; the SGR parser flags held-motion via the drag bit.\nconst MOUSE_ON = '\\x1b[?1000h\\x1b[?1002h\\x1b[?1006h';\nconst MOUSE_OFF = '\\x1b[?1006l\\x1b[?1002l\\x1b[?1000l';\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 writeErr(\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 useMouse = opts.mouse === true;\n // Mouse mode forces alt-screen: in-app scroll needs the app to own the\n // whole screen (no native-scrollback leak), which is exactly what\n // alt-screen guarantees.\n const useAltScreen = opts.altScreen === true || useMouse;\n if (useAltScreen) {\n stdout.write(ALT_SCREEN_ON);\n stdout.write(CURSOR_HOME);\n }\n stdout.write(BRACKETED_PASTE_ON);\n if (useMouse) {\n stdout.write(MOUSE_ON);\n }\n\n // When mouse mode is on we intercept stdin: the real TTY is consumed here,\n // SGR mouse sequences are decoded and fanned out to subscribers, and only\n // the remaining keyboard bytes are forwarded to a PassThrough that Ink\n // reads instead of process.stdin. This keeps mouse bytes from ever\n // polluting Ink's keypress parser (which would otherwise insert `<0;..M`\n // junk into the input). When mouse mode is off, Ink reads process.stdin\n // directly and nothing below runs — zero behavior change for the default.\n const mouseListeners = new Set<(ev: MouseEvent) => void>();\n let inkStdin: NodeJS.ReadStream = stdin;\n let detachMouse: (() => void) | null = null;\n if (useMouse) {\n /**\n * Keyboard-only readable stream that fans out SGR mouse bytes to subscribers\n * and forwards the remaining keyboard bytes to Ink's stdin.\n *\n * PassThrough was tried first but its _read(0) override destabilises the\n * internal `needReadable` state machine: _read(0) calls this.read(0) which\n * returns null when the buffer is empty, preventing PassThrough from ever\n * emitting the 'readable' event that Ink's handleReadable waits on — classic\n * deadlock (mouse AND keyboard freeze). A minimal custom Readable avoids\n * this by properly implementing _read() to NEVER block — it just returns\n * and lets push() from the stdin data handler signal availability.\n */\n class KeyboardReadable extends Readable {\n private pendingChunks: string[] = [];\n\n // eslint-disable-next-line no-useless-constructor\n constructor() {\n super({ encoding: 'utf8', highWaterMark: 64 * 1024 }); // 64KB buffer\n }\n\n override _read(_size: number): void {\n // Pull any pending chunks through. This is called when the buffer is\n // drained enough to drop below the high-water mark. We don't block —\n // we push whatever we have (which may be nothing if stdin hasn't\n // delivered yet). The 'readable' event will fire when push() adds\n // data to an empty buffer.\n void _size;\n this.flushPending();\n }\n\n private flushPending(): void {\n while (this.pendingChunks.length > 0) {\n const chunk = this.pendingChunks[0]!;\n const ok = this.push(chunk);\n this.pendingChunks.shift();\n if (!ok) {\n // Buffer is full again — stop flushing, wait for _read to be\n // called when the buffer drains. Store remaining chunks.\n break;\n }\n }\n }\n\n /** Called by the stdin data handler when keyboard bytes are available. */\n doPush(chunk: string): void {\n if (chunk.length === 0) return;\n // push() returns false when the internal buffer exceeds high-water mark.\n // When that happens, queue the chunk so it's not lost. The _read()\n // method will drain the queue when the buffer drains.\n const ok = this.push(chunk);\n if (ok) {\n // Successfully buffered — if we had pending chunks, try to flush more.\n if (this.pendingChunks.length > 0) {\n this.flushPending();\n }\n } else {\n // Buffer full — queue for when _read is called after buffer drains.\n // Cap the queue to prevent unbounded memory growth (drop oldest if needed).\n if (this.pendingChunks.length >= 100) {\n this.pendingChunks.shift(); // drop oldest\n }\n this.pendingChunks.push(chunk);\n }\n }\n\n /** Called on shutdown so the stream closes cleanly. */\n doEnd(): void {\n this.pendingChunks = [];\n this.push(null); // null = EOF\n }\n }\n const keyboardStream = new KeyboardReadable();\n const p = keyboardStream as unknown as NodeJS.ReadStream;\n // Ink probes isTTY and drives raw mode / ref bookkeeping on its stdin;\n // delegate those to the real terminal so its behavior is unchanged.\n p.isTTY = true;\n p.setRawMode = (mode: boolean): NodeJS.ReadStream => {\n try {\n stdin.setRawMode?.(mode);\n } catch {\n // real stdin may not support raw mode in some shells — ignore.\n }\n return p;\n };\n const realRef = stdin.ref?.bind(stdin);\n const realUnref = stdin.unref?.bind(stdin);\n p.ref = (): NodeJS.ReadStream => {\n realRef?.();\n return p;\n };\n p.unref = (): NodeJS.ReadStream => {\n realUnref?.();\n return p;\n };\n stdin.setEncoding('utf8');\n const onData = (chunk: string) => {\n const evs = parseSgrMouse(chunk);\n for (const ev of evs) {\n for (const fn of mouseListeners) {\n try {\n fn(ev);\n } catch {\n // a listener throwing must not break input routing — ignore.\n }\n }\n }\n const rest = stripSgrMouse(chunk);\n keyboardStream.doPush(rest);\n };\n stdin.on('data', onData);\n detachMouse = () => {\n stdin.off('data', onData);\n keyboardStream.doEnd();\n };\n inkStdin = p;\n }\n const subscribeMouse = useMouse\n ? (fn: (ev: MouseEvent) => void): (() => void) => {\n mouseListeners.add(fn);\n return () => {\n mouseListeners.delete(fn);\n };\n }\n : undefined;\n\n // Animated window/tab title: a braille spinner + live status (thinking /\n // running a tool) driven by the EventBus, scrolling the app name when idle.\n // Out-of-band OSC sequence, so it never touches Ink's render. Reset on\n // cleanup(). Self-disables on a non-TTY or WRONGSTACK_NO_TITLE=1.\n const stopTitle = startTerminalTitle({ stdout, events: opts.events, model: opts.model });\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 stopTitle();\n } catch {\n // title controller already torn down — ignore.\n }\n try {\n detachMouse?.();\n } catch {\n // listener already detached — ignore.\n }\n try {\n stdout.write(BRACKETED_PASTE_OFF);\n // Mouse off before alt-screen off: disable tracking while we still own\n // the screen, then restore the user's previous terminal contents.\n if (useMouse) {\n stdout.write(MOUSE_OFF);\n }\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 subscribeEternalStage: opts.subscribeEternalStage,\n subscribeAutoPhase: opts.subscribeAutoPhase,\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 switchAutonomy: opts.switchAutonomy,\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 agentsMonitorController: opts.agentsMonitorController,\n initialGoal: opts.initialGoal,\n initialAsk: opts.initialAsk,\n getSDDContext: opts.getSDDContext,\n onSDDOutput: opts.onSDDOutput,\n sessionsDir: opts.sessionsDir,\n projectRoot: opts.projectRoot,\n getSettings: opts.getSettings,\n saveSettings: opts.saveSettings,\n predictNext: opts.predictNext,\n mouse: useMouse,\n subscribeMouse,\n // Managed viewport (in-app scroll + collapsibility) follows\n // alt-screen: it owns the screen, so there's no native-scrollback\n // leak. Decoupled from mouse so --alt-screen alone gets it.\n managed: useAltScreen,\n }),\n { exitOnCtrlC: false, stdin: inkStdin },\n );\n } catch (err) {\n writeErr(\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.\n // Do NOT prefix with \\x1b[H: homing to (0,0) erases the visible\n // committed output and repositions the live region (input + status\n // bar) at the top of the viewport instead of the bottom.\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"]}
|