reasonix 0.34.1 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dashboard/app.css +16 -14
  2. package/dashboard/dist/app.js +77 -18
  3. package/dashboard/dist/app.js.map +1 -1
  4. package/dist/cli/{chat-TD6GR3QK.js → chat-RGMYAOY2.js} +18 -17
  5. package/dist/cli/{chunk-SA4UGZPG.js → chunk-2MCYGFLK.js} +15 -10
  6. package/dist/cli/chunk-2MCYGFLK.js.map +1 -0
  7. package/dist/cli/{chunk-SW3CCXEV.js → chunk-4Q3GRJIU.js} +2 -2
  8. package/dist/cli/{chunk-5JXXEPDM.js → chunk-BHLHOS5Y.js} +8 -2
  9. package/dist/cli/chunk-BHLHOS5Y.js.map +1 -0
  10. package/dist/cli/{chunk-F3ILWP2L.js → chunk-BJ376EN3.js} +9 -8
  11. package/dist/cli/chunk-BJ376EN3.js.map +1 -0
  12. package/dist/cli/{chunk-2AWTGJ2C.js → chunk-CRPQUBP6.js} +26 -9
  13. package/dist/cli/{chunk-2AWTGJ2C.js.map → chunk-CRPQUBP6.js.map} +1 -1
  14. package/dist/cli/{chunk-EINEIIIW.js → chunk-EN4LAZW5.js} +563 -250
  15. package/dist/cli/chunk-EN4LAZW5.js.map +1 -0
  16. package/dist/cli/{chunk-OERAGRJX.js → chunk-IPCPEZWQ.js} +2 -2
  17. package/dist/cli/{chunk-U3V2ZQ5J.js → chunk-KJQIA4US.js} +6 -2
  18. package/dist/cli/chunk-KJQIA4US.js.map +1 -0
  19. package/dist/cli/{chunk-Q36KBLSU.js → chunk-MLXUGPJE.js} +292 -35
  20. package/dist/cli/chunk-MLXUGPJE.js.map +1 -0
  21. package/dist/cli/{chunk-SX6L4HZZ.js → chunk-QPNZWUZF.js} +53 -6
  22. package/dist/cli/chunk-QPNZWUZF.js.map +1 -0
  23. package/dist/cli/{chunk-LNTORE5K.js → chunk-QRUQ2BFT.js} +159 -40
  24. package/dist/cli/chunk-QRUQ2BFT.js.map +1 -0
  25. package/dist/cli/{chunk-KZHMKOJH.js → chunk-T52GAWPP.js} +25 -3
  26. package/dist/cli/chunk-T52GAWPP.js.map +1 -0
  27. package/dist/cli/{chunk-I6YIAK6C.js → chunk-UNMYFZPZ.js} +2 -2
  28. package/dist/cli/{update-4TJWRUIN.js → chunk-WJ3YX4PZ.js} +51 -12
  29. package/dist/cli/chunk-WJ3YX4PZ.js.map +1 -0
  30. package/dist/cli/{chunk-RXGEGA7K.js → chunk-XQIFIB3U.js} +18 -7
  31. package/dist/cli/{chunk-RXGEGA7K.js.map → chunk-XQIFIB3U.js.map} +1 -1
  32. package/dist/cli/{chunk-2EBODRRO.js → chunk-ZJR4QLXB.js} +5 -1
  33. package/dist/cli/{chunk-2EBODRRO.js.map → chunk-ZJR4QLXB.js.map} +1 -1
  34. package/dist/cli/{chunk-6TMHAK5D.js → chunk-ZU45XW3P.js} +2 -2
  35. package/dist/cli/code-KJB3WDU6.js +435 -0
  36. package/dist/cli/code-KJB3WDU6.js.map +1 -0
  37. package/dist/cli/{commands-MEZPSEHV.js → commands-FE2UDFBC.js} +3 -3
  38. package/dist/cli/{commit-CE4EFTUQ.js → commit-3IAGB22T.js} +5 -4
  39. package/dist/cli/commit-3IAGB22T.js.map +1 -0
  40. package/dist/cli/{doctor-YASM64X6.js → doctor-DKD34EFD.js} +7 -7
  41. package/dist/cli/index.js +35 -33
  42. package/dist/cli/index.js.map +1 -1
  43. package/dist/cli/{mcp-LDFK5QJI.js → mcp-2RDEQST6.js} +2 -2
  44. package/dist/cli/{mcp-browse-FYHEITCM.js → mcp-browse-VM5GLRBQ.js} +2 -2
  45. package/dist/cli/{mcp-inspect-T2HBR22P.js → mcp-inspect-CWSVCZUQ.js} +3 -3
  46. package/dist/cli/{prompt-V47QKSAR.js → prompt-YEKXMNNV.js} +3 -3
  47. package/dist/cli/{replay-JEDLU7F2.js → replay-D7RT2DR7.js} +3 -3
  48. package/dist/cli/replay-D7RT2DR7.js.map +1 -0
  49. package/dist/cli/{run-NHD2RSTD.js → run-FK5UBIIM.js} +13 -12
  50. package/dist/cli/run-FK5UBIIM.js.map +1 -0
  51. package/dist/cli/{server-MC4A4WAJ.js → server-W4XJK4GX.js} +17 -17
  52. package/dist/cli/{server-MC4A4WAJ.js.map → server-W4XJK4GX.js.map} +1 -1
  53. package/dist/cli/{sessions-ZHWJEW4L.js → sessions-YZXWMIWW.js} +10 -10
  54. package/dist/cli/{setup-DK43MT47.js → setup-IIAJXHP4.js} +196 -130
  55. package/dist/cli/setup-IIAJXHP4.js.map +1 -0
  56. package/dist/cli/update-GUCWB4UN.js +13 -0
  57. package/dist/cli/update-GUCWB4UN.js.map +1 -0
  58. package/dist/cli/{version-O362UKPM.js → version-DWD6RLIU.js} +12 -12
  59. package/dist/index.d.ts +19 -2
  60. package/dist/index.js +543 -78
  61. package/dist/index.js.map +1 -1
  62. package/package.json +1 -1
  63. package/dist/cli/chunk-5JXXEPDM.js.map +0 -1
  64. package/dist/cli/chunk-EINEIIIW.js.map +0 -1
  65. package/dist/cli/chunk-F3ILWP2L.js.map +0 -1
  66. package/dist/cli/chunk-KZHMKOJH.js.map +0 -1
  67. package/dist/cli/chunk-LNTORE5K.js.map +0 -1
  68. package/dist/cli/chunk-Q36KBLSU.js.map +0 -1
  69. package/dist/cli/chunk-SA4UGZPG.js.map +0 -1
  70. package/dist/cli/chunk-SX6L4HZZ.js.map +0 -1
  71. package/dist/cli/chunk-U3V2ZQ5J.js.map +0 -1
  72. package/dist/cli/code-TGUOQBRJ.js +0 -153
  73. package/dist/cli/code-TGUOQBRJ.js.map +0 -1
  74. package/dist/cli/commit-CE4EFTUQ.js.map +0 -1
  75. package/dist/cli/replay-JEDLU7F2.js.map +0 -1
  76. package/dist/cli/run-NHD2RSTD.js.map +0 -1
  77. package/dist/cli/setup-DK43MT47.js.map +0 -1
  78. package/dist/cli/update-4TJWRUIN.js.map +0 -1
  79. /package/dist/cli/{chat-TD6GR3QK.js.map → chat-RGMYAOY2.js.map} +0 -0
  80. /package/dist/cli/{chunk-SW3CCXEV.js.map → chunk-4Q3GRJIU.js.map} +0 -0
  81. /package/dist/cli/{chunk-OERAGRJX.js.map → chunk-IPCPEZWQ.js.map} +0 -0
  82. /package/dist/cli/{chunk-I6YIAK6C.js.map → chunk-UNMYFZPZ.js.map} +0 -0
  83. /package/dist/cli/{chunk-6TMHAK5D.js.map → chunk-ZU45XW3P.js.map} +0 -0
  84. /package/dist/cli/{commands-MEZPSEHV.js.map → commands-FE2UDFBC.js.map} +0 -0
  85. /package/dist/cli/{doctor-YASM64X6.js.map → doctor-DKD34EFD.js.map} +0 -0
  86. /package/dist/cli/{mcp-LDFK5QJI.js.map → mcp-2RDEQST6.js.map} +0 -0
  87. /package/dist/cli/{mcp-browse-FYHEITCM.js.map → mcp-browse-VM5GLRBQ.js.map} +0 -0
  88. /package/dist/cli/{mcp-inspect-T2HBR22P.js.map → mcp-inspect-CWSVCZUQ.js.map} +0 -0
  89. /package/dist/cli/{prompt-V47QKSAR.js.map → prompt-YEKXMNNV.js.map} +0 -0
  90. /package/dist/cli/{sessions-ZHWJEW4L.js.map → sessions-YZXWMIWW.js.map} +0 -0
  91. /package/dist/cli/{version-O362UKPM.js.map → version-DWD6RLIU.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/cli/commands/chat.tsx","../../src/mcp/summary.ts","../../src/cli/ui/App.tsx","../../src/code/checkpoints.ts","../../src/code/pending-edits.ts","../../src/core/event-redaction.ts","../../src/core/eventize.ts","../../src/slash-usage.ts","../../src/tools/skills.ts","../../src/cli/ui/AtMentionSuggestions.tsx","../../src/cli/ui/CheckpointPicker.tsx","../../src/cli/ui/dashboard/use-picker-broadcast.ts","../../src/cli/ui/ChoiceConfirm.tsx","../../src/cli/ui/cards/ApprovalCard.tsx","../../src/cli/ui/layout/viewport-budget.tsx","../../src/cli/ui/EditConfirm.tsx","../../src/code/diff-preview.ts","../../src/cli/ui/DenyContextInput.tsx","../../src/cli/ui/SplitDiff.tsx","../../src/cli/ui/McpHub.tsx","../../src/cli/ui/McpBrowser.tsx","../../src/cli/ui/mcp-disable.ts","../../src/cli/ui/mcp-health.ts","../../src/mcp/drift.ts","../../src/mcp/reconnect.ts","../../src/cli/ui/mcp-reconnect-kickoff.ts","../../src/cli/ui/McpMarketplace.tsx","../../src/cli/ui/ModelPicker.tsx","../../src/cli/ui/primitives/Pill.tsx","../../src/cli/ui/PlanCheckpointConfirm.tsx","../../src/cli/ui/PlanStepList.tsx","../../src/cli/ui/char-bar.tsx","../../src/cli/ui/PlanConfirm.tsx","../../src/cli/ui/markdown-view.tsx","../../node_modules/marked/src/defaults.ts","../../node_modules/marked/src/rules.ts","../../node_modules/marked/src/helpers.ts","../../node_modules/marked/src/Tokenizer.ts","../../node_modules/marked/src/Lexer.ts","../../node_modules/marked/src/Renderer.ts","../../node_modules/marked/src/TextRenderer.ts","../../node_modules/marked/src/Parser.ts","../../node_modules/marked/src/Hooks.ts","../../node_modules/marked/src/Instance.ts","../../node_modules/marked/src/marked.ts","../../src/cli/ui/markdown-lines.ts","../../src/cli/ui/PlanRefineInput.tsx","../../src/cli/ui/ticker.tsx","../../src/cli/ui/PlanReviseConfirm.tsx","../../src/cli/ui/PlanReviseEditor.tsx","../../src/cli/ui/PromptInput.tsx","../../src/cli/ui/key-normalize.ts","../../src/cli/ui/multiline-keys.ts","../../src/cli/ui/paste-sentinels.ts","../../src/cli/ui/prompt-viewport.ts","../../src/cli/ui/SessionPicker.tsx","../../src/cli/ui/ShellConfirm.tsx","../../src/cli/ui/SlashArgPicker.tsx","../../src/cli/ui/SlashSuggestions.tsx","../../src/cli/ui/WelcomeBanner.tsx","../../src/cli/ui/bang.ts","../../src/cli/ui/edit-history.ts","../../src/cli/ui/effects/loop-to-dashboard.ts","../../src/cli/ui/hash-memory.ts","../../src/cli/ui/hooks/apply-slash-result.ts","../../src/cli/ui/hooks/handle-assistant-final.ts","../../src/cli/ui/hooks/handle-stream-events.ts","../../src/cli/ui/hooks/handle-tool-event.ts","../../src/cli/ui/hooks/useAgentSession.ts","../../src/cli/ui/hooks/useChatScroll.ts","../../src/cli/ui/hooks/useCodeMode.ts","../../src/cli/ui/hooks/useInputRecall.ts","../../src/cli/ui/hooks/useLoopMode.ts","../../src/cli/ui/hooks/useQuit.ts","../../src/cli/ui/hooks/useScrollback.ts","../../src/cli/ui/state/provider.tsx","../../src/cli/ui/state/reducer.ts","../../src/cli/ui/state/state.ts","../../src/cli/ui/state/store.ts","../../src/cli/ui/hooks/useTranscriptWriter.ts","../../src/cli/ui/layout/CardStream.tsx","../../src/cli/ui/cards/CardRenderer.tsx","../../src/cli/ui/cards/CtxCard.tsx","../../src/cli/ui/primitives/Card.tsx","../../src/cli/ui/primitives/CardHeader.tsx","../../src/cli/ui/cards/DiffCard.tsx","../../src/cli/ui/cards/DoctorCard.tsx","../../src/cli/ui/cards/ErrorCard.tsx","../../src/cli/ui/cards/LiveCard.tsx","../../src/cli/ui/primitives/Spinner.tsx","../../src/cli/ui/cards/MemoryCard.tsx","../../src/cli/ui/cards/PlanCard.tsx","../../src/cli/ui/cards/ReasoningCard.tsx","../../src/frame/width.ts","../../src/cli/ui/primitives/CursorBlock.tsx","../../src/cli/ui/cards/SearchCard.tsx","../../src/cli/ui/cards/StreamingCard.tsx","../../src/cli/ui/layout/LiveExpandContext.ts","../../src/cli/ui/markdown.tsx","../../src/cli/ui/cards/SubAgentCard.tsx","../../src/cli/ui/cards/TaskCard.tsx","../../src/cli/ui/cards/TipCard.tsx","../../src/cli/ui/cards/ToolCard.tsx","../../src/cli/ui/cards/UsageCard.tsx","../../src/cli/ui/cards/UserCard.tsx","../../src/cli/ui/cards/time.ts","../../src/cli/ui/cards/WarnCard.tsx","../../src/cli/ui/layout/LiveRows.tsx","../../src/cli/ui/layout/StatusRow.tsx","../../src/cli/ui/primitives/Countdown.tsx","../../src/cli/ui/layout/ToastRail.tsx","../../src/cli/ui/layout/plan-live-row.tsx","../../src/cli/ui/loop.ts","../../src/cli/ui/mcp-append.ts","../../src/cli/ui/mcp-browse.ts","../../src/cli/ui/mcp-server-list.ts","../../src/cli/ui/paste-collapse.ts","../../src/cli/ui/slash/handlers/admin.ts","../../src/cli/ui/slash/handlers/basic.ts","../../src/cli/ui/slash/handlers/dashboard.ts","../../src/cli/ui/slash/helpers.ts","../../src/cli/ui/slash/handlers/edits.ts","../../src/cli/ui/slash/handlers/init.ts","../../src/cli/ui/slash/handlers/jobs.ts","../../src/cli/ui/slash/handlers/language.ts","../../src/cli/ui/slash/handlers/mcp.ts","../../src/cli/ui/slash/handlers/memory.ts","../../src/cli/ui/slash/handlers/model.ts","../../src/cli/ui/ctx-breakdown.tsx","../../src/cli/ui/slash/handlers/observability.ts","../../src/cli/ui/slash/handlers/permissions.ts","../../src/cli/ui/slash/handlers/plans.ts","../../src/cli/ui/slash/handlers/sessions.ts","../../src/cli/ui/slash/handlers/skill.ts","../../src/cli/ui/slash/handlers/theme.ts","../../src/cli/ui/slash/handlers/web-search-engine.ts","../../src/cli/ui/slash/dispatch.ts","../../src/cli/ui/state/TurnTranslator.ts","../../src/cli/ui/state/cards-to-messages.ts","../../src/cli/ui/state/hydrate.ts","../../src/cli/ui/useCompletionPickers.ts","../../src/cli/ui/useEditHistory.ts","../../src/cli/ui/useSessionInfo.ts","../../src/cli/ui/useSubagent.ts","../../src/cli/ui/Setup.tsx","../../src/cli/ui/MaskedInput.tsx","../../src/cli/ui/drain-tty.ts"],"sourcesContent":["import { render } from \"ink\";\nimport React, { useState } from \"react\";\nimport {\n loadApiKey,\n readConfig,\n searchEnabled,\n webSearchEndpoint,\n webSearchEngine,\n} from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport type { CacheFirstLoop } from \"../../loop.js\";\nimport { McpClient } from \"../../mcp/client.js\";\nimport { type InspectionReport, inspectMcpServer } from \"../../mcp/inspect.js\";\nimport { preflightStdioSpec } from \"../../mcp/preflight.js\";\nimport { type McpClientHost, bridgeMcpTools } from \"../../mcp/registry.js\";\nimport { parseMcpSpec } from \"../../mcp/spec.js\";\nimport { SseTransport } from \"../../mcp/sse.js\";\nimport { type McpTransport, StdioTransport } from \"../../mcp/stdio.js\";\nimport { StreamableHttpTransport } from \"../../mcp/streamable-http.js\";\nimport { buildMcpServerSummary } from \"../../mcp/summary.js\";\nimport {\n deleteSession,\n listSessionsForWorkspace,\n renameSession,\n resolveSession,\n} from \"../../memory/session.js\";\nimport { ToolRegistry } from \"../../tools.js\";\nimport { registerChoiceTool } from \"../../tools/choice.js\";\nimport { registerMemoryTools } from \"../../tools/memory.js\";\nimport { registerWebTools } from \"../../tools/web.js\";\nimport { markPhase } from \"../startup-profile.js\";\nimport { App } from \"../ui/App.js\";\nimport { SessionPicker } from \"../ui/SessionPicker.js\";\nimport { Setup } from \"../ui/Setup.js\";\nimport { drainTtyResponses } from \"../ui/drain-tty.js\";\nimport { KeystrokeProvider } from \"../ui/keystroke-context.js\";\nimport { formatMcpLifecycleEvent } from \"../ui/mcp-lifecycle.js\";\nimport { formatMcpSlowToast } from \"../ui/mcp-toast.js\";\nimport type { McpServerSummary } from \"../ui/slash.js\";\n\nexport interface ProgressInfo {\n toolName: string;\n progress: number;\n total?: number;\n message?: string;\n}\n\ninterface SpecRecord {\n spec: string;\n client: McpClient;\n summary: McpServerSummary;\n /** Names of bridged tools — used for hot-unbridge. */\n registeredNames: string[];\n /** ToolSpec snapshots captured AFTER bridge — handed to loop.prefix.addTool on hot-add. */\n registeredSpecs: import(\"../../types.js\").ToolSpec[];\n}\n\ninterface RuntimeContext {\n getTools: () => ToolRegistry | undefined;\n getMcpPrefix: () => string | undefined;\n getRequestedCount: () => number;\n progressSink: { current: ((info: ProgressInfo) => void) | null };\n}\n\nexport interface McpRuntime {\n size(): number;\n specs(): string[];\n summaries(): McpServerSummary[];\n addSpec(\n raw: string,\n loop?: CacheFirstLoop,\n ): Promise<{ ok: true; summary: McpServerSummary } | { ok: false; reason: string }>;\n removeSpec(raw: string, loop?: CacheFirstLoop): Promise<boolean>;\n reloadFromConfig(loop?: CacheFirstLoop): Promise<{\n added: string[];\n removed: string[];\n failed: Array<{ spec: string; reason: string }>;\n summaries: McpServerSummary[];\n }>;\n closeAll(): Promise<void>;\n}\n\nfunction createMcpRuntime(ctx: RuntimeContext): McpRuntime {\n const records = new Map<string, SpecRecord>();\n const insertionOrder: string[] = [];\n\n async function addSpec(\n raw: string,\n loop?: CacheFirstLoop,\n ): Promise<{ ok: true; summary: McpServerSummary } | { ok: false; reason: string }> {\n if (records.has(raw)) {\n return { ok: true, summary: records.get(raw)!.summary };\n }\n const tools = ctx.getTools();\n if (!tools) return { ok: false, reason: \"no tool registry available\" };\n const disabledNames = new Set(readConfig().mcpDisabled ?? []);\n let label = \"anon\";\n let mcp: McpClient | undefined;\n try {\n const spec = parseMcpSpec(raw);\n label = spec.name ?? \"anon\";\n if (spec.name && disabledNames.has(spec.name)) {\n process.stderr.write(`${formatMcpLifecycleEvent({ state: \"disabled\", name: label })}\\n`);\n return { ok: false, reason: \"disabled by user\" };\n }\n process.stderr.write(`${formatMcpLifecycleEvent({ state: \"handshake\", name: label })}\\n`);\n const t0 = Date.now();\n const namePrefix = spec.name\n ? `${spec.name}_`\n : ctx.getRequestedCount() === 1 && ctx.getMcpPrefix()\n ? (ctx.getMcpPrefix() as string)\n : \"\";\n if (spec.transport === \"stdio\") preflightStdioSpec(spec);\n const transport: McpTransport =\n spec.transport === \"sse\"\n ? new SseTransport({ url: spec.url })\n : spec.transport === \"streamable-http\"\n ? new StreamableHttpTransport({ url: spec.url })\n : new StdioTransport({ command: spec.command, args: spec.args });\n mcp = new McpClient({ transport });\n await mcp.initialize();\n const host: McpClientHost = { client: mcp };\n const bridge = await bridgeMcpTools(mcp, {\n registry: tools,\n namePrefix,\n serverName: label,\n host,\n onProgress: (info) => ctx.progressSink.current?.(info),\n onSlow: (info) =>\n process.stderr.write(\n `${formatMcpSlowToast({ name: info.serverName, p95Ms: info.p95Ms, sampleSize: info.sampleSize })}\\n`,\n ),\n });\n let report: InspectionReport;\n try {\n report = await inspectMcpServer(mcp);\n } catch {\n report = {\n protocolVersion: mcp.protocolVersion,\n serverInfo: mcp.serverInfo,\n capabilities: mcp.serverCapabilities ?? {},\n tools: { supported: true, items: [] },\n resources: { supported: false, reason: \"inspect failed\" },\n prompts: { supported: false, reason: \"inspect failed\" },\n elapsedMs: 0,\n };\n }\n const ms = Date.now() - t0;\n const resourceCount = report.resources.supported ? report.resources.items.length : 0;\n const promptCount = report.prompts.supported ? report.prompts.items.length : 0;\n process.stderr.write(\n `${formatMcpLifecycleEvent({\n state: \"connected\",\n name: label,\n tools: bridge.registeredNames.length,\n resources: resourceCount,\n prompts: promptCount,\n ms,\n })}\\n`,\n );\n const summary = buildMcpServerSummary({\n label,\n spec: raw,\n toolCount: bridge.registeredNames.length,\n report,\n host,\n bridgeEnv: bridge.env,\n });\n // Snapshot tool specs AFTER bridge so hot-add can replay them into loop.prefix.\n const allSpecs = tools.specs();\n const registeredSpecs = allSpecs.filter((s) =>\n bridge.registeredNames.includes(s.function.name),\n );\n records.set(raw, {\n spec: raw,\n client: mcp,\n summary,\n registeredNames: bridge.registeredNames,\n registeredSpecs,\n });\n insertionOrder.push(raw);\n // Hot-add: shift the prefix so the live loop sees the new tools\n // on the very next turn. Each addTool is one cache-miss turn.\n if (loop) for (const s of registeredSpecs) loop.prefix.addTool(s);\n return { ok: true, summary };\n } catch (err) {\n await mcp?.close().catch(() => undefined);\n const reason = (err as Error).message;\n process.stderr.write(\n `${formatMcpLifecycleEvent({ state: \"failed\", name: label, reason })}\\n → run \\`reasonix setup\\` to remove this entry, or fix the underlying issue (missing npm package, network, etc.).\\n`,\n );\n return { ok: false, reason };\n }\n }\n\n async function removeSpec(raw: string, loop?: CacheFirstLoop): Promise<boolean> {\n const record = records.get(raw);\n if (!record) return false;\n await record.client.close().catch(() => undefined);\n const tools = ctx.getTools();\n for (const name of record.registeredNames) {\n tools?.unregister(name);\n loop?.prefix.removeTool(name);\n }\n records.delete(raw);\n const idx = insertionOrder.indexOf(raw);\n if (idx >= 0) insertionOrder.splice(idx, 1);\n return true;\n }\n\n async function reloadFromConfig(loop?: CacheFirstLoop): Promise<{\n added: string[];\n removed: string[];\n failed: Array<{ spec: string; reason: string }>;\n summaries: McpServerSummary[];\n }> {\n const desired = readConfig().mcp ?? [];\n const desiredSet = new Set(desired);\n const currentSet = new Set(records.keys());\n const added: string[] = [];\n const removed: string[] = [];\n const failed: Array<{ spec: string; reason: string }> = [];\n\n for (const spec of [...currentSet]) {\n if (!desiredSet.has(spec)) {\n await removeSpec(spec, loop);\n removed.push(spec);\n }\n }\n for (const spec of desired) {\n if (currentSet.has(spec)) continue;\n const result = await addSpec(spec, loop);\n if (result.ok) added.push(spec);\n else failed.push({ spec, reason: result.reason });\n }\n return { added, removed, failed, summaries: summaries() };\n }\n\n function specs(): string[] {\n return [...insertionOrder];\n }\n function summaries(): McpServerSummary[] {\n return insertionOrder\n .map((s) => records.get(s)?.summary)\n .filter((s): s is McpServerSummary => Boolean(s));\n }\n async function closeAll(): Promise<void> {\n for (const r of records.values()) await r.client.close().catch(() => undefined);\n records.clear();\n insertionOrder.length = 0;\n }\n return {\n size: () => records.size,\n specs,\n summaries,\n addSpec,\n removeSpec,\n reloadFromConfig,\n closeAll,\n };\n}\n\nexport interface ChatOptions {\n model: string;\n system: string;\n transcript?: string;\n /**\n * Soft USD cap on session spend. Undefined → no cap (default).\n * The loop warns once at 80% and refuses to start a new turn at\n * 100%. Users can bump or clear via `/budget <usd>` / `/budget off`\n * mid-session.\n */\n budgetUsd?: number;\n session?: string;\n /** Zero or more MCP server specs. Each: `\"name=cmd args...\"` or `\"cmd args...\"`. */\n mcp?: string[];\n /** Global prefix — only used when a single anonymous server is given. */\n mcpPrefix?: string;\n /**\n * Pre-built ToolRegistry used as a seed. MCP bridges (if any) are\n * layered on top of whatever's already registered. Used by\n * `reasonix code` to register native filesystem tools in place of\n * the old `npx -y @modelcontextprotocol/server-filesystem` subprocess.\n */\n seedTools?: ToolRegistry;\n /**\n * Enable SEARCH/REPLACE edit-block processing after each assistant turn.\n * Set by `reasonix code`; plain `reasonix chat` leaves this off.\n */\n codeMode?: {\n rootDir: string;\n jobs?: import(\"../../tools/jobs.js\").JobRegistry;\n /**\n * `/cwd <path>` callback — re-registers every rootDir-dependent\n * native tool against the new path. Optional so embedders that\n * don't want live cwd switching can omit it (the slash command\n * then falls back to non-tool updates only).\n */\n reregisterTools?: (rootDir: string) => void;\n /** Async tail of `/cwd` — re-probe the new dir for a semantic index. */\n reBootstrapSemantic?: (rootDir: string) => Promise<{ enabled: boolean }>;\n };\n /** Skip the session picker — assume \"Resume\" (backwards-compatible auto-continue). */\n forceResume?: boolean;\n /** Skip the session picker — assume \"New\" (wipe the session file and start fresh). */\n forceNew?: boolean;\n /**\n * When true, suppress auto-launch of the embedded web dashboard.\n * Default behavior (false/undefined) is to boot it on mount so the\n * URL is visible in the status bar.\n */\n noDashboard?: boolean;\n /**\n * Render into the terminal's alternate screen buffer. Default true —\n * alt-screen avoids the scrollback-mode resize/wrap ghost class. Pass\n * false (CLI: `--no-alt-screen`) when the chat output needs to remain\n * in shell scrollback after exit.\n */\n altScreen?: boolean;\n}\n\ninterface RootProps extends ChatOptions {\n initialKey: string | undefined;\n tools: ToolRegistry | undefined;\n mcpSpecs: string[];\n mcpServers: McpServerSummary[];\n /** App.tsx writes its progress handler here on mount so MCP frames flow into OngoingToolRow. */\n progressSink: { current: ((info: ProgressInfo) => void) | null };\n /** Show the SessionPicker (full list) when no --session was specified and saved sessions exist. */\n showPicker: boolean;\n /** Hot-reload runtime — passed through to App so /mcp browse + dashboard can bridge after install. */\n mcpRuntime: McpRuntime;\n}\n\nfunction Root({\n initialKey,\n tools,\n mcpSpecs,\n mcpServers,\n progressSink,\n showPicker,\n mcpRuntime,\n ...appProps\n}: RootProps) {\n const [key, setKey] = useState<string | undefined>(initialKey);\n const [pickerOpen, setPickerOpen] = useState(showPicker);\n const [activeSession, setActiveSession] = useState<string | undefined>(appProps.session);\n const workspaceRoot = appProps.codeMode?.rootDir ?? process.cwd();\n const [sessions, setSessions] = useState(() => listSessionsForWorkspace(workspaceRoot));\n\n if (!key) {\n return (\n <Setup\n onReady={(k) => {\n process.env.DEEPSEEK_API_KEY = k;\n setKey(k);\n }}\n />\n );\n }\n process.env.DEEPSEEK_API_KEY = key;\n\n if (pickerOpen) {\n return (\n <KeystrokeProvider>\n <SessionPicker\n sessions={sessions}\n workspace={workspaceRoot}\n onChoose={(outcome) => {\n if (outcome.kind === \"open\") {\n setActiveSession(outcome.name);\n setPickerOpen(false);\n return;\n }\n if (outcome.kind === \"new\") {\n setActiveSession(undefined);\n setPickerOpen(false);\n return;\n }\n if (outcome.kind === \"delete\") {\n deleteSession(outcome.name);\n setSessions(listSessionsForWorkspace(workspaceRoot));\n return;\n }\n if (outcome.kind === \"rename\") {\n renameSession(outcome.name, outcome.newName);\n setSessions(listSessionsForWorkspace(workspaceRoot));\n return;\n }\n if (outcome.kind === \"quit\") {\n process.exit(0);\n }\n }}\n />\n </KeystrokeProvider>\n );\n }\n\n return (\n <KeystrokeProvider>\n <App\n // key forces a full remount (and fresh transcript / scrollback / cards) on switch.\n key={activeSession ?? \"__new__\"}\n model={appProps.model}\n system={appProps.system}\n transcript={appProps.transcript}\n budgetUsd={appProps.budgetUsd}\n session={activeSession}\n tools={tools}\n mcpSpecs={mcpSpecs}\n mcpServers={mcpServers}\n mcpRuntime={mcpRuntime}\n progressSink={progressSink}\n codeMode={appProps.codeMode}\n noDashboard={appProps.noDashboard}\n onSwitchSession={setActiveSession}\n />\n </KeystrokeProvider>\n );\n}\n\nexport async function chatCommand(opts: ChatOptions): Promise<void> {\n markPhase(\"chat_command_enter\");\n loadDotenv();\n const initialKey = loadApiKey();\n markPhase(\"config_loaded\");\n\n const requestedSpecs = opts.mcp ?? [];\n // Shared progress sink: the bridge's onProgress callback writes\n // through `progressSink.current`, which App.tsx sets to its UI\n // updater on mount. Started null so early progress frames (before\n // the App has mounted) are dropped rather than buffered.\n const progressSink: { current: ((info: ProgressInfo) => void) | null } = { current: null };\n // Seed registry from the caller (e.g. reasonix code's native\n // filesystem tools) — MCP bridges layer on top rather than\n // replacing. When no seed AND no MCP, tools stays undefined and\n // the loop runs as a bare chat.\n let tools: ToolRegistry | undefined = opts.seedTools;\n if (requestedSpecs.length > 0 && !tools) tools = new ToolRegistry();\n\n const runtime = createMcpRuntime({\n getTools: () => tools,\n getMcpPrefix: () => opts.mcpPrefix,\n getRequestedCount: () => requestedSpecs.length,\n progressSink,\n });\n\n const failedSpecs: Array<{ spec: string; reason: string }> = [];\n if (requestedSpecs.length > 0) markPhase(\"mcp_launch\");\n for (const raw of requestedSpecs) {\n const result = await runtime.addSpec(raw);\n if (!result.ok) failedSpecs.push({ spec: raw, reason: result.reason });\n }\n if (requestedSpecs.length > 0) {\n markPhase(\n `mcp_connected_${requestedSpecs.length - failedSpecs.length}_of_${requestedSpecs.length}`,\n );\n }\n if (runtime.size() === 0 && !opts.seedTools) {\n tools = undefined;\n }\n // Preserve configured specs even when startup leaves them unbridged\n // so `/mcp` can still surface the configured-but-offline set.\n const mcpSpecs = [...requestedSpecs];\n const mcpServers = runtime.summaries();\n\n // Register web search/fetch tools unless explicitly disabled. DDG\n // backs them with no key required; the model invokes them whenever\n // a question needs info fresher than its training data.\n if (searchEnabled()) {\n if (!tools) tools = new ToolRegistry();\n registerWebTools(tools, {\n webSearchEngine: webSearchEngine(),\n webSearchEndpoint: webSearchEndpoint(),\n });\n }\n\n // Memory tools — available in every session, not just code mode.\n // Chat-mode callers get global scope only; project scope requires\n // the seedTools path from `reasonix code` (which registers its own\n // MemoryStore bound to rootDir before chatCommand runs).\n // `run_skill` is registered later in App.tsx (where the client\n // exists) so it can wire the subagent runner for runAs:subagent\n // skills.\n if (!opts.seedTools) {\n if (!tools) tools = new ToolRegistry();\n registerMemoryTools(tools, {});\n // `ask_choice` — branching primitive, useful in chat too (stylistic\n // preferences, doc language, library picks). Independent of plan\n // mode, which chat doesn't have anyway.\n registerChoiceTool(tools);\n }\n\n // resolveSession handles --new (timestamped name, old session preserved)\n // and --resume (latest prefixed). Default falls through to the latest\n // prefixed-or-base.\n const { resolved: resolvedSession } = resolveSession(\n opts.session,\n opts.forceNew,\n opts.forceResume,\n );\n const launchWorkspace = opts.codeMode?.rootDir ?? process.cwd();\n const showPicker =\n !opts.session && !opts.forceResume && listSessionsForWorkspace(launchWorkspace).length > 0;\n\n markPhase(\"ink_render_call\");\n const { waitUntilExit } = render(\n <Root\n initialKey={initialKey}\n tools={tools}\n mcpSpecs={mcpSpecs}\n mcpServers={mcpServers}\n mcpRuntime={runtime}\n progressSink={progressSink}\n showPicker={showPicker}\n {...opts}\n session={resolvedSession}\n />,\n {\n exitOnCtrlC: true,\n // patchConsole:false — winpty/MINTTY redraw-glitch source.\n patchConsole: false,\n incrementalRendering: true,\n // Default true — alt-screen is the only mode without scrollback-\n // reflow ghosting. `--no-alt-screen` opts back into scrollback mode\n // for users who need chat output preserved in shell history on exit.\n alternateScreen: opts.altScreen !== false,\n },\n );\n try {\n await waitUntilExit();\n } finally {\n await runtime.closeAll();\n // Eat any pending terminal-feature-detection responses (#365) so the\n // parent shell doesn't print them as junk after exit.\n await drainTtyResponses();\n }\n}\n","import type { InspectionReport } from \"./inspect.js\";\nimport type { BridgeEnv, McpClientHost } from \"./registry.js\";\nimport type { GetPromptResult, ReadResourceResult } from \"./types.js\";\n\nexport interface McpServerSummary {\n label: string;\n spec: string;\n toolCount: number;\n report: InspectionReport;\n host: McpClientHost;\n bridgeEnv: BridgeEnv;\n readResource(uri: string): Promise<ReadResourceResult>;\n getPrompt(name: string, args?: Record<string, string>): Promise<GetPromptResult>;\n}\n\nexport function buildMcpServerSummary(opts: {\n label: string;\n spec: string;\n toolCount: number;\n report: InspectionReport;\n host: McpClientHost;\n bridgeEnv: BridgeEnv;\n}): McpServerSummary {\n return {\n label: opts.label,\n spec: opts.spec,\n toolCount: opts.toolCount,\n report: opts.report,\n host: opts.host,\n bridgeEnv: opts.bridgeEnv,\n readResource(uri) {\n return opts.host.client.readResource(uri);\n },\n getPrompt(name, args) {\n return args !== undefined\n ? opts.host.client.getPrompt(name, args)\n : opts.host.client.getPrompt(name);\n },\n };\n}\n","import { type WriteStream, statSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { Box, Text, useStdout } from \"ink\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n type JsonlEventSink,\n eventLogPath,\n openEventSink,\n} from \"../../adapters/event-sink-jsonl.js\";\nimport { type AtUrlExpansion, expandAtMentions, expandAtUrls } from \"../../at-mentions.js\";\nimport {\n type CheckpointMeta,\n createCheckpoint,\n deleteCheckpoint,\n fmtAgo,\n listCheckpoints,\n restoreCheckpoint,\n} from \"../../code/checkpoints.js\";\nimport {\n type EditBlock,\n applyEditBlocks,\n snapshotBeforeEdits,\n toWholeFileEditBlock,\n} from \"../../code/edit-blocks.js\";\nimport { clearPendingEdits, loadPendingEdits } from \"../../code/pending-edits.js\";\nimport {\n clearPlanState,\n loadPlanState,\n relativeTime,\n savePlanState,\n} from \"../../code/plan-store.js\";\nimport {\n type EditMode,\n type PresetName,\n defaultConfigPath,\n editModeHintShown,\n loadEditMode,\n loadReasoningEffort,\n loadTheme,\n markEditModeHintShown,\n markMouseClipboardHintShown,\n mouseClipboardHintShown,\n resolveThemePreference,\n saveEditMode,\n saveReasoningEffort,\n} from \"../../config.js\";\nimport { Eventizer } from \"../../core/eventize.js\";\nimport { pauseGate } from \"../../core/pause-gate.js\";\nimport { type ResolvedHook, formatHookOutcomeMessage, loadHooks, runHooks } from \"../../hooks.js\";\nimport { onLanguageChange, t, tObj } from \"../../i18n/index.js\";\nimport { CacheFirstLoop, DeepSeekClient, ImmutablePrefix } from \"../../index.js\";\nimport type { LoopEvent } from \"../../loop.js\";\nimport {\n deleteSession,\n detectGitBranch,\n type listSessions,\n listSessionsForWorkspace,\n loadSessionMessages,\n loadSessionMeta,\n patchSessionMeta,\n renameSession,\n} from \"../../memory/session.js\";\nimport type {\n ActiveModal,\n DashboardEvent,\n DashboardMessage,\n PickerResolution,\n SubmitResult,\n} from \"../../server/context.js\";\nimport type { DashboardServerHandle } from \"../../server/index.js\";\nimport { loadSlashUsage, recordSlashUse } from \"../../slash-usage.js\";\nimport {\n DEEPSEEK_CONTEXT_TOKENS,\n DEFAULT_CONTEXT_TOKENS,\n type SessionSummary,\n} from \"../../telemetry/stats.js\";\nimport { defaultUsageLogPath } from \"../../telemetry/usage.js\";\nimport type { ToolRegistry } from \"../../tools.js\";\nimport type { ChoiceOption } from \"../../tools/choice.js\";\nimport type { PlanStep } from \"../../tools/plan.js\";\nimport { formatCommandResult, runCommand } from \"../../tools/shell.js\";\nimport { registerSkillTools } from \"../../tools/skills.js\";\nimport { formatSubagentResult, spawnSubagent } from \"../../tools/subagent.js\";\nimport { webFetch } from \"../../tools/web.js\";\nimport { openTranscriptFile } from \"../../transcript/log.js\";\nimport { dumpStartupProfile, markPhase } from \"../startup-profile.js\";\nimport { AtMentionSuggestions } from \"./AtMentionSuggestions.js\";\nimport { CheckpointPicker } from \"./CheckpointPicker.js\";\nimport { ChoiceConfirm, type ChoiceConfirmChoice } from \"./ChoiceConfirm.js\";\nimport { EditConfirm, type EditReviewChoice } from \"./EditConfirm.js\";\nimport { McpHub } from \"./McpHub.js\";\nimport { ModelPicker } from \"./ModelPicker.js\";\nimport { PlanCheckpointConfirm } from \"./PlanCheckpointConfirm.js\";\nimport { PlanConfirm, type PlanConfirmChoice } from \"./PlanConfirm.js\";\nimport { PlanRefineInput } from \"./PlanRefineInput.js\";\nimport { PlanReviseConfirm, type ReviseChoice } from \"./PlanReviseConfirm.js\";\nimport { PlanReviseEditor } from \"./PlanReviseEditor.js\";\nimport { PromptInput } from \"./PromptInput.js\";\nimport { SessionPicker } from \"./SessionPicker.js\";\nimport { ShellConfirm, type ShellConfirmChoice, derivePrefix } from \"./ShellConfirm.js\";\nimport { SlashArgPicker } from \"./SlashArgPicker.js\";\nimport { SlashSuggestions } from \"./SlashSuggestions.js\";\nimport { WelcomeBanner } from \"./WelcomeBanner.js\";\nimport { detectBangCommand, formatBangUserMessage } from \"./bang.js\";\nimport type { PickerSnapshot, ViewerSnapshot } from \"./dashboard/use-picker-broadcast.js\";\nimport { useViewerBroadcast } from \"./dashboard/use-picker-broadcast.js\";\nimport { formatEditResults } from \"./edit-history.js\";\nimport { loopEventToDashboard } from \"./effects/loop-to-dashboard.js\";\nimport { appendGlobalMemory, appendProjectMemory, detectHashMemory } from \"./hash-memory.js\";\nimport { applySlashResult } from \"./hooks/apply-slash-result.js\";\nimport { handleAssistantFinal } from \"./hooks/handle-assistant-final.js\";\nimport {\n handleErrorEvent,\n handleToolStart,\n handleWarningEvent,\n} from \"./hooks/handle-stream-events.js\";\nimport { handleToolEvent } from \"./hooks/handle-tool-event.js\";\nimport { useAgentSession } from \"./hooks/useAgentSession.js\";\nimport { useChatScroll } from \"./hooks/useChatScroll.js\";\nimport { useCodeMode } from \"./hooks/useCodeMode.js\";\nimport { useInputRecall } from \"./hooks/useInputRecall.js\";\nimport { useLoopMode } from \"./hooks/useLoopMode.js\";\nimport { useQuit } from \"./hooks/useQuit.js\";\nimport { useScrollback } from \"./hooks/useScrollback.js\";\nimport { useTranscriptWriter } from \"./hooks/useTranscriptWriter.js\";\nimport { useKeystroke } from \"./keystroke-context.js\";\nimport { CardStream } from \"./layout/CardStream.js\";\nimport { LiveExpandContext } from \"./layout/LiveExpandContext.js\";\nimport {\n ModeStatusBar,\n OngoingToolRow,\n SubagentLiveStack,\n ThinkingRow,\n UndoBanner,\n} from \"./layout/LiveRows.js\";\nimport { StatusRow } from \"./layout/StatusRow.js\";\nimport { ToastRail } from \"./layout/ToastRail.js\";\nimport { PlanLiveRow } from \"./layout/plan-live-row.js\";\nimport { ViewportBudgetProvider } from \"./layout/viewport-budget.js\";\nimport { formatLoopStatus } from \"./loop.js\";\nimport { applyMcpAppend } from \"./mcp-append.js\";\nimport { handleMcpBrowseSlash } from \"./mcp-browse.js\";\nimport { replaceMcpServerSummary } from \"./mcp-server-list.js\";\nimport { formatLongPaste } from \"./paste-collapse.js\";\nimport { PRESETS, resolvePreset } from \"./presets.js\";\nimport { type McpServerSummary, handleSlash, parseSlash, suggestSlashCommands } from \"./slash.js\";\nimport { TurnTranslator } from \"./state/TurnTranslator.js\";\nimport { cardsToDashboardMessages } from \"./state/cards-to-messages.js\";\nimport { hydrateCardsFromMessages } from \"./state/hydrate.js\";\nimport { AgentStoreProvider, useAgentState, useAgentStore } from \"./state/provider.js\";\nimport { ThemeProvider } from \"./theme/context.js\";\nimport { FG } from \"./theme/tokens.js\";\nimport { TickerProvider } from \"./ticker.js\";\nimport { useCompletionPickers } from \"./useCompletionPickers.js\";\nimport { useEditHistory } from \"./useEditHistory.js\";\nimport { useSessionInfo } from \"./useSessionInfo.js\";\nimport { useSubagent } from \"./useSubagent.js\";\n\nexport interface AppProps {\n model: string;\n system: string;\n transcript?: string;\n /** Soft USD spend cap; undefined → no cap. See CacheFirstLoopOptions.budgetUsd. */\n budgetUsd?: number;\n session?: string;\n /**\n * Pre-populated tool registry (e.g. from bridgeMcpTools()). When present,\n * its specs are folded into the ImmutablePrefix so the model sees them,\n * and its dispatch is used for tool calls — MCP tools become first-class.\n */\n tools?: ToolRegistry;\n /** Raw `--mcp` / config-derived spec strings, for `/mcp` slash display. */\n mcpSpecs?: string[];\n /**\n * Pre-captured inspection reports for each connected MCP server,\n * collected once at chat startup. Drives the rich `/mcp` slash view\n * (tools + resources + prompts per server).\n */\n mcpServers?: McpServerSummary[];\n /**\n * Hot-reload runtime owned by chatCommand. Lets slash + dashboard\n * trigger an add/remove round-trip after the user installs from the\n * marketplace, without restarting the process.\n */\n mcpRuntime?: import(\"../commands/chat.js\").McpRuntime;\n /**\n * Shared ref the MCP bridge's onProgress callback writes through.\n * We attach our updater to `progressSink.current` on mount so any\n * `notifications/progress` frame from any bridged tool flows into\n * the UI. `null` allowed — chat mode without MCP leaves it unset.\n */\n progressSink?: {\n current:\n | ((info: { toolName: string; progress: number; total?: number; message?: string }) => void)\n | null;\n };\n /**\n * When set, parse SEARCH/REPLACE blocks from assistant responses and\n * apply them to disk under `rootDir`. Set by `reasonix code`. The\n * optional `jobs` registry enables /jobs + /kill slashes in the TUI\n * and the status-bar \"N jobs running\" indicator.\n */\n codeMode?: {\n rootDir: string;\n jobs?: import(\"../../tools/jobs.js\").JobRegistry;\n /**\n * `/cwd <path>` callback — re-registers every rootDir-dependent\n * native tool against the new path. Optional: when omitted the\n * slash command degrades to updating hook cwd / memory root only,\n * with file/shell tools still pointing at the original root.\n */\n reregisterTools?: (rootDir: string) => void;\n /**\n * Async tail of the `/cwd` swap — re-probes the new directory for a\n * compatible semantic index, registers `semantic_search` against it\n * if found, unregisters the stale binding otherwise. Kept separate\n * from `reregisterTools` so the sync FS/shell/memory re-registration\n * isn't blocked on disk I/O.\n */\n reBootstrapSemantic?: (rootDir: string) => Promise<{ enabled: boolean }>;\n };\n /**\n * When `true`, suppress the auto-launch of the embedded web dashboard\n * server on TUI mount. Default behavior is to boot the dashboard so\n * the URL shows in the status bar (clickable in OSC-8-aware\n * terminals) — most users had no idea `/dashboard` even existed.\n * `--no-dashboard` is the CLI flag that flips this on for CI / users\n * who don't want a localhost listener.\n */\n noDashboard?: boolean;\n /** Mid-chat session swap — Root remounts App with the new session via key. */\n onSwitchSession?: (name: string | undefined) => void;\n}\n\n/**\n * Throttle interval in ms. We flush streaming deltas at most this often to\n * avoid re-rendering the whole UI on every single token from DeepSeek.\n * 33ms ≈ 30Hz, matches the cadence users feel as smooth in modern terminals\n * (Windows Terminal, WezTerm, iTerm2, Alacritty, Ghostty). Override via\n * `REASONIX_FLUSH_MS` if you're on a fragile terminal (winpty/MINTTY) that\n * leaves repaint artifacts at higher refresh rates — bumping back to 100\n * trades smoothness for stability.\n */\nconst FLUSH_INTERVAL_MS = (() => {\n const raw = process.env.REASONIX_FLUSH_MS;\n if (!raw) return 33;\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed < 16 || parsed > 1000) return 33;\n return Math.round(parsed);\n})();\n\n/**\n * True when the user has opted out of live spinner/streaming rows.\n * `REASONIX_UI=plain` suppresses every transient row in the render\n * tree so only the `<Static>` committed history + the input prompt\n * are drawn. Trades liveness for stability on terminals where Ink's\n * cursor-up repaint leaves ghost artifacts.\n */\nconst PLAIN_UI = process.env.REASONIX_UI === \"plain\";\n\n/**\n * Single-line status pill rendered below the modeline whenever a /loop\n * is active. Re-renders every second so the countdown ticks.\n */\nfunction LoopStatusRow({\n loop,\n}: {\n loop: { prompt: string; intervalMs: number; nextFireAt: number; iter: number };\n}) {\n const [, setTick] = React.useState(0);\n React.useEffect(() => {\n const id = setInterval(() => setTick((t) => t + 1), 1000);\n return () => clearInterval(id);\n }, []);\n const nextFireMs = Math.max(0, loop.nextFireAt - Date.now());\n return (\n <Box>\n <Text color=\"cyan\">{`▸ ${formatLoopStatus(loop.prompt, nextFireMs, loop.iter)} · /loop stop or type to cancel`}</Text>\n </Box>\n );\n}\n\ninterface StreamingState {\n id: string;\n text: string;\n reasoning: string;\n toolCallBuild?: { name: string; chars: number };\n}\n\nexport function App(props: AppProps): React.ReactElement {\n markPhase(\"app_render_start\");\n const session = useAgentSession({\n sessionId: props.session,\n model: props.model,\n workspace: props.codeMode?.rootDir ?? process.cwd(),\n });\n const initialCards = React.useMemo(\n () => (props.session ? hydrateCardsFromMessages(loadSessionMessages(props.session)) : []),\n [props.session],\n );\n const themeName = resolveThemePreference(loadTheme(), process.env.REASONIX_THEME);\n return (\n <ThemeProvider name={themeName}>\n <AgentStoreProvider session={session} initialCards={initialCards}>\n <AppInner {...props} />\n </AgentStoreProvider>\n </ThemeProvider>\n );\n}\n\nfunction AppInner({\n model,\n system,\n transcript,\n budgetUsd,\n session,\n tools,\n mcpSpecs,\n mcpServers,\n mcpRuntime,\n progressSink,\n codeMode,\n noDashboard,\n onSwitchSession,\n}: AppProps) {\n markPhase(\"app_inner_start\");\n const log = useScrollback();\n const agentStore = useAgentStore();\n const hasConversation = useAgentState((s) =>\n s.cards.some((c) => c.kind === \"user\" || c.kind === \"streaming\"),\n );\n const isStreaming = useAgentState((s) => s.cards.some((c) => c.kind === \"streaming\" && !c.done));\n const chatScroll = useChatScroll();\n const [input, setInput] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [slashUsage, setSlashUsage] = useState<Readonly<Record<string, number>>>(() =>\n loadSlashUsage(),\n );\n // ctrl-o toggles full-tail view on the live streaming card.\n // Auto-resets at the end of every turn so the next reply starts collapsed.\n const [liveExpand, setLiveExpand] = useState(false);\n useEffect(() => {\n if (!isStreaming && liveExpand) setLiveExpand(false);\n }, [isStreaming, liveExpand]);\n const [languageVersion, setLanguageVersion] = useState(0);\n useEffect(() => onLanguageChange(() => setLanguageVersion((v) => v + 1)), []);\n useEffect(() => {\n markPhase(\"first_paint\");\n dumpStartupProfile();\n }, []);\n // Live MCP server list: initialized from the boot-time prop, then\n // updated immutably when append-drift adds tools mid-session.\n const [liveMcpServers, setLiveMcpServers] = useState<McpServerSummary[]>(() => mcpServers ?? []);\n // Tracks whether the current turn has been aborted via Esc, so the\n // Esc handler only fires once per turn (repeated presses would yield\n // stacked warning events).\n const abortedThisTurn = useRef(false);\n // Mirrors the live `busy` flag for /loop's timer (it has no React\n // closure handle, only refs). Skips the firing when a prior turn is\n // still running rather than queuing a duplicate submit.\n useEffect(() => {\n busyRef.current = busy;\n }, [busy]);\n // Name + truncated args of the tool currently dispatching. Populated\n // on `tool_start`, cleared on `tool` (or error). Drives the\n // \"▸ tool<X> running…\" pulse-spinner row so long tool calls don't\n // look like the app hung.\n const [ongoingTool, setOngoingTool] = useState<{ name: string; args?: string } | null>(null);\n // Latest progress frame for the currently-running tool (MCP\n // `notifications/progress`). `null` when no progress has been\n // reported for this tool call — OngoingToolRow still spins, just\n // without a progress number.\n const [toolProgress, setToolProgress] = useState<{\n progress: number;\n total?: number;\n message?: string;\n } | null>(null);\n // stdout handle for `/clear`-style hard screen wipes. Clearing the\n // store alone leaves the terminal scrollback intact — the user keeps\n // seeing prior turns until they scroll past them. Writing CSI 2J + 3J +\n // H genuinely nukes viewport AND scrollback, which is what `/clear`\n // means to a shell user.\n const { stdout } = useStdout();\n // Terminal input modes we opt into at startup, all paired with\n // disable-on-unmount so the user's shell doesn't inherit them:\n //\n // • Bracketed paste (DECSET 2004) — terminal wraps pasted text\n // with \\x1b[200~ … \\x1b[201~ markers so a multi-chunk paste\n // can't be misread as keystrokes (the trailing \\n in a paste\n // would otherwise fire submit).\n //\n // • modifyOtherKeys level 2 (CSI > 4 ; 2 m) — terminal encodes\n // modifier-bearing keypresses (Shift+Enter, Ctrl+Enter, etc.)\n // as `\\x1b[27;<mod>;<key>~` instead of the bare ASCII byte. Our\n // stdin-reader recognises `27;2;13~` as Shift+Enter and\n // `27;5;13~` as Ctrl+Enter. Terminals that don't understand the\n // SGR fall through silently — Shift+Enter just stays\n // indistinguishable from Enter, no regression.\n //\n // • SGR mouse tracking (DECSET 1006 + 1000) — terminal reports\n // wheel + button presses as `\\x1b[<btn;col;row;M` instead of\n // translating the wheel to ↑/↓ key sequences. Lets the chat\n // scroll-handler route `mouseScrollUp/Down` independently of\n // PromptInput's arrow-key bindings (history / cursor). Cost:\n // terminal-native drag-to-select needs a modifier (Shift on\n // Windows Terminal / Alacritty / WezTerm, Option on iTerm2).\n useEffect(() => {\n if (!stdout || !stdout.isTTY) return;\n stdout.write(\"\\u001b[?2004h\");\n stdout.write(\"\\u001b[>4;2m\");\n stdout.write(\"\\u001b[?1006h\\u001b[?1000h\");\n return () => {\n stdout.write(\"\\u001b[?1000l\\u001b[?1006l\");\n stdout.write(\"\\u001b[?2004l\");\n stdout.write(\"\\u001b[>4m\");\n };\n }, [stdout]);\n\n // Subagent UI wiring: live activity row + sink ref the loop closure\n // captures. Must be declared BEFORE loop construction so the\n // subagentRunner closure can read the ref. The wallet-currency thunk\n // reads from a ref populated AFTER useSessionInfo loads balance, so the\n // subagent-end cost suffix renders in the live wallet's symbol.\n const walletCurrencyRef = useRef<string | undefined>(undefined);\n const { activities: subagentActivities, sinkRef: subagentSinkRef } = useSubagent({\n session,\n log,\n getWalletCurrency: () => walletCurrencyRef.current,\n });\n // Transient \"what's happening\" text set by the loop during silent\n // phases (harvest round-trip, between-iteration R1 thinking, forced\n // summary). Rendered as a dim spinner row; auto-cleared on the next\n // primary event.\n const [statusLine, setStatusLine] = useState<string | null>(null);\n // Live working directory for every rootDir-dependent surface:\n // hook cwd, memory root, project shell allowlist root, `@file`\n // mention root, `applyEditBlocks` base, run_command cwd, project-\n // settings hook loader. `/cwd <path>` mutates this state to swap\n // the workspace mid-session; the prop `codeMode.rootDir` stays as\n // the original launch root so it can't accidentally drift (it's\n // used purely for \"is this a code-mode session?\" checks now).\n const [currentRootDir, setCurrentRootDir] = useState<string>(\n () => codeMode?.rootDir ?? process.cwd(),\n );\n // Loaded user hooks (project + global settings.json). Stays mutable\n // so `/hooks reload` and `/cwd` can rescan disk without\n // reconstructing the loop. The loop holds a parallel reference for\n // its tool-event dispatch; we keep them in sync via the effect below.\n const [hookList, setHookList] = useState<ResolvedHook[]>(() =>\n loadHooks({ projectRoot: codeMode?.rootDir }),\n );\n // Session-scoped edit history + undo banner + /undo, /history, /show\n // handlers. Kept in a custom hook so App.tsx only sees the small API\n // it needs — append an edit, arm the banner, answer the slash\n // callbacks, seal the turn entry, check whether anything's undoable.\n const {\n undoBanner,\n recordEdit,\n armUndoBanner,\n toggleUndoPause,\n codeUndo,\n codeHistory,\n codeShowEdit,\n sealCurrentEntry,\n hasUndoable,\n touchedPaths,\n } = useEditHistory(codeMode);\n // Pending edit blocks awaiting `/apply` or `/discard`. We do NOT\n // auto-apply — v0.4.1 showed that \"model proposed, so apply\" turns\n // analysis into unintended edits. The user explicitly confirms now.\n const pendingEdits = useRef<EditBlock[]>([]);\n // Reactive mirror of `pendingEdits.current.length`. Refs don't trigger\n // re-renders, but the bottom mode-status bar needs to show the queue\n // size live — this keeps the number in sync whenever the queue grows\n // (interceptor / text-SEARCH parse / checkpoint restore) or clears\n // (/apply / /discard / /new).\n const [pendingCount, setPendingCount] = useState(0);\n const syncPendingCount = useCallback(() => {\n setPendingCount(pendingEdits.current.length);\n // Bump the tick so the /walk modal re-evaluates \"first remaining\n // block\" after each per-block apply/discard. Without this the\n // EditConfirm render would keep the OLD block reference and never\n // advance.\n setPendingTick((t) => t + 1);\n }, []);\n // Edit-gate mode. `review` (default) queues edits into pendingEdits;\n // `auto` applies them immediately and exposes an undo banner. Shift+\n // Tab cycles, `/mode <review|auto>` sets explicitly. Persisted so\n // toggling once survives a relaunch.\n const [editMode, setEditMode] = useState<EditMode>(() => (codeMode ? loadEditMode() : \"review\"));\n const [preset, setPreset] = useState<\"auto\" | \"flash\" | \"pro\">(() => {\n if (model === \"deepseek-v4-pro\") return \"pro\";\n return \"auto\";\n });\n // Interceptor closure reads the live mode through this ref — so we\n // install the registry hook once (in useEffect below) and avoid tearing\n // down + reattaching it every time the user cycles modes.\n const editModeRef = useRef<EditMode>(editMode);\n useEffect(() => {\n editModeRef.current = editMode;\n if (codeMode) saveEditMode(editMode);\n }, [editMode, codeMode]);\n // Refs that mirror state for stable read-callbacks handed to the\n // embedded dashboard server. The server's `getXxx()` closures are\n // captured once at startDashboard time; without ref-mirrors the\n // returned values would freeze at boot. Same pattern as editModeRef.\n const planModeRef = useRef<boolean>(false);\n const currentRootDirRef = useRef<string>(\"\");\n const latestVersionRef = useRef<string | null>(null);\n // Current per-edit confirmation prompt (review mode, tool-call path).\n // Non-null → EditConfirm modal renders, interceptor is suspended on\n // `editReviewResolveRef.current`, other live rows hide. User picks a\n // choice → handleEditReviewChoose resolves the promise, interceptor\n // resumes and returns the tool result the model will see.\n const [pendingEditReview, setPendingEditReview] = useState<EditBlock | null>(null);\n // /walk active flag — when true the App walks pendingEdits one block\n // at a time through EditConfirm. Distinct from `pendingEditReview`,\n // which is the AUTO-mode tool-call interceptor. Walkthrough is\n // user-initiated against the QUEUED pending list, not mid-stream.\n const [walkthroughActive, setWalkthroughActive] = useState(false);\n // Bumped every time codeApply/codeDiscard mutates pendingEdits so the\n // walkthrough render can re-pick \"block 0 of the current queue\" via\n // a useMemo dep. Without this, walkthroughActive alone wouldn't\n // re-render after a partial apply.\n const [pendingTick, setPendingTick] = useState(0);\n /** Result from the EditConfirm modal: choice plus optional deny context. */\n interface EditReviewResult {\n choice: EditReviewChoice;\n denyContext?: string;\n }\n const editReviewResolveRef = useRef<((r: EditReviewResult) => void) | null>(null);\n // Per-turn override: set by \"apply-rest-of-turn\" so subsequent edits\n // in the SAME turn skip the modal and land like AUTO. Resets to \"ask\"\n // at handleSubmit entry so the next user turn starts fresh.\n const turnEditPolicyRef = useRef<\"ask\" | \"apply-all\">(\"ask\");\n // Visual highlight on the bottom mode bar for ~1.2s after Shift+Tab /\n // /mode flips the mode — a soft \"yes, it changed\" signal so the user\n // doesn't have to scan the header to confirm the toggle landed.\n const [modeFlash, setModeFlash] = useState(false);\n const modeFlashTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const prevEditModeRef = useRef<EditMode>(editMode);\n useEffect(() => {\n if (prevEditModeRef.current === editMode) return;\n prevEditModeRef.current = editMode;\n setModeFlash(true);\n if (modeFlashTimeoutRef.current) clearTimeout(modeFlashTimeoutRef.current);\n modeFlashTimeoutRef.current = setTimeout(() => {\n setModeFlash(false);\n modeFlashTimeoutRef.current = null;\n }, 1200);\n }, [editMode]);\n // Shell command the model asked to run that wasn't on the auto-run\n // allowlist. Non-null renders the ShellConfirm modal and disables\n // the prompt input; the user picks Run once / Always allow in this\n // project / Deny and we feed the result back as a synthetic user\n // message so the model sees what happened.\n const [pendingShell, setPendingShell] = useState<{\n id: number;\n command: string;\n kind: \"run_command\" | \"run_background\";\n } | null>(null);\n // Plan text the model submitted via `submit_plan` while plan mode\n // was active. Non-null renders PlanConfirm; user picks Approve /\n // Refine / Cancel and we drive the loop from there. Separate from\n // `planMode` because a pending plan is a one-shot decision even if\n // plan mode stays on (Refine keeps mode on; Approve/Cancel flip off).\n const [pendingPlan, setPendingPlan] = useState<string | null>(null);\n /** While the user is interactively editing the proposed plan via PlanReviseEditor; null = not editing. */\n const [pendingReviseEditor, setPendingReviseEditor] = useState<string | null>(null);\n /** True while the SessionPicker is open mid-chat (triggered by `/sessions`). */\n const [pendingSessionsPicker, setPendingSessionsPicker] = useState(false);\n const [sessionsPickerList, setSessionsPickerList] = useState<ReturnType<typeof listSessions>>([]);\n /** True while the CheckpointPicker is open mid-chat (triggered by bare `/restore`). */\n const [pendingCheckpointPicker, setPendingCheckpointPicker] = useState(false);\n const [checkpointPickerList, setCheckpointPickerList] = useState<CheckpointMeta[]>([]);\n /** Opens the unified McpHub modal — null when closed. `tab` selects the initial tab. */\n const [pendingMcpHub, setPendingMcpHub] = useState<{ tab: \"live\" | \"marketplace\" } | null>(null);\n /** True while the ModelPicker is open mid-chat (triggered by bare `/model`). */\n const [pendingModelPicker, setPendingModelPicker] = useState(false);\n // Stashed plan + intent while the user types free-form feedback\n // (refinement or last instructions on approve). When the picker\n // returns \"refine\" or \"approve\", we defer the loop-resume and show\n // PlanRefineInput. User types + Enter → we ship it; Esc → restore\n // pendingPlan and re-show the picker. Letting Approve also take\n // input closes the \"model left open questions, user had no place\n // to answer them\" hole.\n const [stagedInput, setStagedInput] = useState<{\n plan: string;\n mode: \"refine\" | \"approve\" | \"reject\";\n } | null>(null);\n // Mid-execution pause from mark_step_complete — model finished a step\n // and the loop waits for user to pick Continue / Revise / Stop.\n const [pendingCheckpoint, setPendingCheckpoint] = useState<{\n stepId: string;\n title?: string;\n completed: number;\n total: number;\n } | null>(null);\n // Staged entry for the Revise feedback input at a checkpoint.\n const [stagedCheckpointRevise, setStagedCheckpointRevise] = useState<{\n stepId: string;\n title?: string;\n completed: number;\n total: number;\n } | null>(null);\n // Plan revision proposal from `revise_plan`. Non-null mounts the\n // PlanReviseConfirm picker showing a step-level diff. Accept replaces\n // remaining steps in planStepsRef; Reject drops the proposal and the\n // model continues with the original plan.\n const [pendingRevision, setPendingRevision] = useState<{\n reason: string;\n remainingSteps: PlanStep[];\n summary?: string;\n } | null>(null);\n // Branching question from `ask_choice`. Non-null mounts ChoiceConfirm;\n // user picks an option (synthetic \"user picked <id>\"), types a\n // custom answer (synthetic \"user answered: <text>\"), or cancels.\n // Kept separate from pendingPlan because a branch question is\n // orthogonal to plan state — it can fire in chat mode or mid-plan\n // when the model genuinely needs a decision.\n const [pendingChoice, setPendingChoice] = useState<{\n question: string;\n options: ChoiceOption[];\n allowCustom: boolean;\n } | null>(null);\n // Staged entry for the \"Let me type my own answer\" path. Same\n // two-step pattern as stagedInput for plan approvals — user picks\n // \"custom\", we stash the question context, show a free-form input,\n // and Esc restores the picker.\n const [stagedChoiceCustom, setStagedChoiceCustom] = useState<{\n question: string;\n options: ChoiceOption[];\n allowCustom: boolean;\n } | null>(null);\n // Truthy when any pending modal owns the screen — gates global\n // hotkeys (chat-scroll, etc.) so they don't fire behind a picker.\n const modalOpen =\n !!pendingShell ||\n !!pendingPlan ||\n !!pendingReviseEditor ||\n !!pendingSessionsPicker ||\n !!pendingCheckpointPicker ||\n !!pendingMcpHub ||\n pendingModelPicker ||\n !!stagedInput ||\n !!pendingEditReview ||\n walkthroughActive ||\n !!pendingChoice ||\n !!stagedChoiceCustom ||\n !!pendingRevision ||\n !!stagedCheckpointRevise ||\n !!pendingCheckpoint;\n // Plan-mode indicator — displayed in the StatsPanel, mirrored onto\n // the ToolRegistry so dispatch enforces read-only. Toggled via the\n // `/plan` slash and PlanConfirm picker. Ephemeral — not persisted\n // across launches (you explicitly opt in per session).\n const [planMode, setPlanMode] = useState<boolean>(false);\n // /pro armed — next turn will run on v4-pro. Mirrored here (rather\n // than reading loop.proArmed directly) so state transitions trigger\n // a StatsPanel re-render that picks up the new badge.\n const [proArmed, setProArmed] = useState(false);\n // True while the CURRENT running turn is on v4-pro because of either\n // /pro arming or auto-escalation. Set on turn-start if armed consumed\n // OR any \"⇧ pro\" warning fires, cleared at turn-end.\n const [turnOnPro, setTurnOnPro] = useState(false);\n // Text waiting to be submitted AFTER the current turn finishes.\n // Set by ShellConfirm's onChoose when the user approves faster than\n // the model's \"awaiting confirmation\" response. We can't call\n // handleSubmit directly because it early-returns on `busy === true`,\n // so we abort the in-flight turn and let the effect below fire the\n // submit once busy clears.\n const [queuedSubmit, setQueuedSubmit] = useState<string | null>(null);\n // ↑/↓ recall over a turn-local prompt history. We don't persist to\n // disk — the session log already keeps the messages, and cross-\n // session bash-style recall would need per-project scoping.\n const { recallPrev, recallNext, pushHistory, resetCursor } = useInputRecall(setInput);\n // Disambiguates <Static> keys when a single turn yields multiple assistant_final events.\n const assistantIterCounter = useRef<number>(0);\n // Per-session @url fetch cache. Keyed by stripped URL; same URL\n // referenced twice in one session fetches once. Not persisted —\n // we deliberately re-fetch on session resume since the page may\n // have changed. Shape mirrors AtUrlExpansion + an optional `body`\n // so the trailing block can be reconstructed from cache alone.\n const atUrlCache = useRef<Map<string, AtUrlExpansion & { body?: string }>>(new Map());\n // handleSubmit is defined far below as a useCallback. The /loop timer\n // needs to call the LATEST closure on each firing (config could have\n // shifted mid-loop), so we mirror it through a ref. The mirror is\n // synced in a useEffect once handleSubmit is defined.\n const handleSubmitRef = useRef<((raw: string) => Promise<void>) | null>(null);\n const busyRef = useRef<boolean>(false);\n // Embedded dashboard server handle. Set when /dashboard boots; null\n // otherwise. Mutations to this ref happen inside the start/stop\n // callbacks; the slash handler uses getDashboardUrl() to surface\n // the current state without triggering re-renders on every poll.\n const dashboardRef = useRef<DashboardServerHandle | null>(null);\n // De-dupe concurrent startDashboard() invocations. Without this, when\n // the auto-start useEffect re-fires (because `startDashboard`'s\n // useCallback deps change mid-mount) the early `if (dashboardRef.current)\n // return` check sees null because the first call hasn't returned from\n // its `await startDashboardServer()` yet — so we'd start two listeners\n // on two ports, leak the first handle, and make the chrome pill flicker\n // between two URLs. Hold the in-flight Promise here and reuse it.\n const dashboardStartingRef = useRef<Promise<string> | null>(null);\n // SSE subscribers attached by /api/events. App.tsx fans out one\n // DashboardEvent per loop event so the web Chat tab updates in\n // sync with the TUI. The Set is keyed by the subscriber function\n // itself; subscribeEvents returns an unsubscribe closure.\n const eventSubscribersRef = useRef<Set<(ev: DashboardEvent) => void>>(new Set());\n /** Only one picker mounts at a time; snapshot feeds `getActiveModal` for late SSE clients. */\n const activePickerResolverRef = useRef<((res: PickerResolution) => void) | null>(null);\n const activePickerSnapshotRef = useRef<PickerSnapshot | null>(null);\n /** Active read-only viewer (e.g. /replay plan archive). Same late-SSE concern, simpler resolver (close only). */\n const activeViewerResolverRef = useRef<(() => void) | null>(null);\n const activeViewerSnapshotRef = useRef<ViewerSnapshot | null>(null);\n const [pendingReplayViewer, setPendingReplayViewer] = useState<ViewerSnapshot | null>(null);\n // Structured steps captured from the most recent `submit_plan` call.\n // Populated only when the model supplied `steps`; used by the\n // `mark_step_complete` handler to look up the step title and compute\n // the `N/M` counter. Reset on every new plan submission so a\n // revised plan starts fresh — old completions don't spill over.\n const planStepsRef = useRef<PlanStep[] | null>(null);\n const completedStepIdsRef = useRef<Set<string>>(new Set());\n // Markdown body + human-friendly summary captured from submit_plan.\n // Persisted alongside the structured state so a future Time-Travel\n // replay can show the model's full original proposal without re-\n // reading the JSONL log, and so /plans + the resume banner can\n // identify plans by intent rather than by filename.\n const planBodyRef = useRef<string | null>(null);\n const planSummaryRef = useRef<string | null>(null);\n // Wall-clock when the latest tool_start fired. Cleared when the\n // matching `tool` event arrives (or at turn end). Tools are\n // dispatched serially in the loop, so a single ref is enough — no\n // need for a per-toolName map.\n const toolStartedAtRef = useRef<number | null>(null);\n // Persist the active plan state (steps + completedStepIds) to disk\n // whenever it changes, so closing the terminal doesn't lose\n // structured progress. The on-disk format lives in plan-store.ts;\n // we just thread the session name through and call save/clear at\n // the right points. No-op when session is undefined (e.g.\n // ephemeral runs with --no-session).\n const persistPlanState = useCallback(() => {\n if (!session) return;\n const steps = planStepsRef.current;\n if (!steps || steps.length === 0) {\n clearPlanState(session);\n return;\n }\n const extras: { body?: string; summary?: string } = {};\n if (planBodyRef.current) extras.body = planBodyRef.current;\n if (planSummaryRef.current) extras.summary = planSummaryRef.current;\n savePlanState(session, steps, completedStepIdsRef.current, extras);\n }, [session]);\n const [summary, setSummary] = useState<SessionSummary>({\n turns: 0,\n totalCostUsd: 0,\n totalInputCostUsd: 0,\n totalOutputCostUsd: 0,\n claudeEquivalentUsd: 0,\n savingsVsClaudePct: 0,\n cacheHitRatio: 0,\n lastPromptTokens: 0,\n lastTurnCostUsd: 0,\n });\n\n const transcriptRef = useRef<WriteStream | null>(null);\n if (transcript && !transcriptRef.current) {\n transcriptRef.current = openTranscriptFile(transcript, {\n version: 1,\n source: \"reasonix chat\",\n model,\n startedAt: new Date().toISOString(),\n });\n }\n // Kernel event log sidecar — opens iff the session has a name (skip\n // ephemeral sessions). Sink + Eventizer share lifetime with App; the\n // for-await consumer below pipes every LoopEvent through them so a\n // typed Event log accumulates at `~/.reasonix/sessions/<name>.events.jsonl`.\n // Old transcript path is unchanged — this is a parallel artifact, not\n // a replacement. Future replay / projection consumers read from here.\n const eventSinkRef = useRef<JsonlEventSink | null>(null);\n const eventizerRef = useRef<Eventizer | null>(null);\n if (session && !eventSinkRef.current) {\n eventSinkRef.current = openEventSink(eventLogPath(session));\n eventizerRef.current = new Eventizer();\n eventSinkRef.current.append(eventizerRef.current.emitSessionOpened(0, session, 0));\n }\n useEffect(() => {\n return () => {\n transcriptRef.current?.end();\n void eventSinkRef.current?.close();\n };\n }, []);\n\n const loopRef = useRef<CacheFirstLoop | null>(null);\n // hookList + currentRootDir intentionally NOT in deps — they seed\n // the loop on first construction (loopRef guards a single\n // instantiation), and later edits flow in through the mutable\n // `loop.hooks = hookList` / `loop.hookCwd = currentRootDir` effects\n // below. Putting them in deps would tear down the loop on every\n // reload, wiping the append-only log mid-session.\n // biome-ignore lint/correctness/useExhaustiveDependencies: hookList — see comment above\n // biome-ignore lint/correctness/useExhaustiveDependencies: currentRootDir — see comment above\n const loop = useMemo(() => {\n if (loopRef.current) return loopRef.current;\n const client = new DeepSeekClient();\n // Register run_skill HERE (not in code.tsx / chat.tsx) because\n // subagent-runAs skills need the client + parent registry to\n // spawn child loops. Wiring lives in App.tsx so the same code\n // path covers both code mode and chat mode.\n //\n // The closure captures `tools` (parent registry), `client`, and\n // the subagent sink ref by lexical scope — `spawnSubagent` reads\n // them per invocation, so a sink handler attached after this\n // registration still receives events.\n if (tools && !tools.has(\"run_skill\")) {\n registerSkillTools(tools, {\n projectRoot: codeMode?.rootDir,\n subagentRunner: async (skill, task, signal) => {\n const result = await spawnSubagent({\n client,\n parentRegistry: tools,\n parentSignal: signal,\n // Skill body is the subagent's persona/playbook; the user-\n // supplied task is what to actually do inside it.\n system: skill.body,\n task,\n // Per-skill model override (frontmatter `model: ...`),\n // else falls through to spawnSubagent's default.\n model: skill.model,\n allowedTools: skill.allowedTools,\n sink: subagentSinkRef.current,\n // Stamped onto every event so the TUI sink + usage log can\n // attribute the run to a skill without extra bookkeeping.\n skillName: skill.name,\n });\n return formatSubagentResult(result);\n },\n });\n }\n const prefix = new ImmutablePrefix({\n system,\n toolSpecs: tools?.specs(),\n });\n const l = new CacheFirstLoop({\n client,\n prefix,\n tools,\n model,\n budgetUsd,\n session,\n hooks: hookList,\n hookCwd: currentRootDir,\n // Restore the user's last-chosen effort cap. Without this a\n // `/effort high` silently reverted to `max` on relaunch — the\n // loop's constructor default wins over persisted state.\n reasoningEffort: loadReasoningEffort(),\n });\n loopRef.current = l;\n return l;\n }, [model, system, budgetUsd, session, tools, codeMode]);\n\n useEffect(() => {\n if (!session || !tools) return;\n tools.setAuditListener((event) => {\n const sink = eventSinkRef.current;\n const eventizer = eventizerRef.current;\n if (!sink || !eventizer) return;\n sink.append(eventizer.emitToolCall(loop.currentTurn, event.name, event.args));\n });\n pauseGate.setAuditListener((event) => {\n const sink = eventSinkRef.current;\n const eventizer = eventizerRef.current;\n if (!sink || !eventizer) return;\n switch (event.type) {\n case \"tool.confirm.allow\":\n sink.append(eventizer.emitToolConfirmAllow(loop.currentTurn, event.kind, event.payload));\n break;\n case \"tool.confirm.deny\":\n sink.append(\n eventizer.emitToolConfirmDeny(\n loop.currentTurn,\n event.kind,\n event.payload,\n event.denyContext,\n ),\n );\n break;\n case \"tool.confirm.always_allow\":\n sink.append(\n eventizer.emitToolConfirmAlwaysAllow(\n loop.currentTurn,\n event.kind,\n event.payload,\n event.prefix,\n ),\n );\n break;\n }\n });\n return () => {\n tools.setAuditListener(null);\n pauseGate.setAuditListener(null);\n };\n }, [loop, session, tools]);\n\n // Keep the loop's hook list in sync after a `/hooks reload`. The\n // loop's field is intentionally mutable for exactly this case —\n // construction happens once, hook edits are picked up live.\n useEffect(() => {\n loop.hooks = hookList;\n }, [loop, hookList]);\n\n // Ambient session info (balance, model catalog, latest published\n // version) — three independent mount-time fetches behind one hook\n // so the refresh callbacks can be wired into handleSubmit's finally\n // (balance) and the slash context (/models, /update).\n const { balance, models, latestVersion, refreshBalance, refreshModels, refreshLatestVersion } =\n useSessionInfo(loop);\n\n // Keep the dashboard-server ref-mirrors in sync with their state.\n // These four are the load-bearing live reads for the attached\n // dashboard's read APIs; without these mirrors the captured\n // closures inside startDashboardServer freeze at boot time.\n useEffect(() => {\n planModeRef.current = planMode;\n }, [planMode]);\n useEffect(() => {\n currentRootDirRef.current = currentRootDir;\n }, [currentRootDir]);\n\n useEffect(() => {\n latestVersionRef.current = latestVersion ?? null;\n }, [latestVersion]);\n // Ref-mirror so getStats() (frozen at startDashboard time) sees fresh\n // balance. useSessionInfo refreshes balance every few minutes; we\n // forward to the dashboard without re-minting startDashboard.\n const balanceRef = useRef<typeof balance>(null);\n const modelsRef = useRef<string[] | null>(null);\n useEffect(() => {\n modelsRef.current = models;\n }, [models]);\n useEffect(() => {\n balanceRef.current = balance;\n walletCurrencyRef.current = balance?.currency;\n if (balance) {\n agentStore.dispatch({\n type: \"session.update\",\n patch: { balance: balance.total, balanceCurrency: balance.currency },\n });\n }\n }, [balance, agentStore]);\n\n // Fan out a DashboardEvent to every web subscriber. No-op when\n // nothing is connected, so the cost of the bridge in the common\n // (no dashboard open) case is one Set.size lookup per event.\n const broadcastDashboardEvent = useCallback((ev: DashboardEvent) => {\n const subs = eventSubscribersRef.current;\n if (subs.size === 0) return;\n for (const h of subs) {\n try {\n h(ev);\n } catch {\n /* one bad subscriber must not stop the others */\n }\n }\n }, []);\n const pickerPorts = useMemo(\n () => ({\n broadcast: broadcastDashboardEvent,\n resolverRef: activePickerResolverRef,\n snapshotRef: activePickerSnapshotRef,\n }),\n [broadcastDashboardEvent],\n );\n const viewerPorts = useMemo(\n () => ({\n broadcast: broadcastDashboardEvent,\n resolverRef: activeViewerResolverRef,\n snapshotRef: activeViewerSnapshotRef,\n }),\n [broadcastDashboardEvent],\n );\n useViewerBroadcast(\n !!pendingReplayViewer,\n pendingReplayViewer ?? { viewerKind: \"replay-plan\", title: \"\" },\n () => setPendingReplayViewer(null),\n viewerPorts,\n );\n\n // Broadcast busy-state changes so the web Chat tab can disable its\n // submit button while a turn is in flight. Mirrors what the TUI's\n // `busy` flag already drives for PromptInput.\n useEffect(() => {\n broadcastDashboardEvent({ kind: \"busy-change\", busy });\n }, [busy, broadcastDashboardEvent]);\n\n // ---------- Modal mirroring (web parity for ShellConfirm / ChoiceConfirm /\n // PlanConfirm / EditConfirm) ----------\n //\n // Each pending* state is the source of truth on the TUI side. These\n // effects fan it out to web subscribers as `modal-up` events; the\n // useEffect cleanup fires `modal-down` when the modal closes (the\n // user picked from EITHER surface — once a pending state goes null\n // the cleanup runs and both clients see it disappear).\n //\n // The shell + choice + plan paths are straightforward state→event.\n // edit-review is different — its source of truth is `editReviewResolveRef`\n // (a promise the dispatch interceptor is awaiting), wired via a\n // separate `pendingEditReview` state that we already broadcast here.\n\n useEffect(() => {\n if (!pendingShell) return;\n const modal: ActiveModal = {\n kind: \"shell\",\n command: pendingShell.command,\n allowPrefix: derivePrefix(pendingShell.command),\n shellKind: pendingShell.kind,\n };\n broadcastDashboardEvent({ kind: \"modal-up\", modal });\n return () => {\n broadcastDashboardEvent({ kind: \"modal-down\", modalKind: \"shell\" });\n };\n }, [pendingShell, broadcastDashboardEvent]);\n\n useEffect(() => {\n if (!pendingChoice) return;\n const modal: ActiveModal = {\n kind: \"choice\",\n question: pendingChoice.question,\n options: pendingChoice.options,\n allowCustom: pendingChoice.allowCustom,\n };\n broadcastDashboardEvent({ kind: \"modal-up\", modal });\n return () => {\n broadcastDashboardEvent({ kind: \"modal-down\", modalKind: \"choice\" });\n };\n }, [pendingChoice, broadcastDashboardEvent]);\n\n useEffect(() => {\n if (!pendingPlan) return;\n broadcastDashboardEvent({\n kind: \"modal-up\",\n modal: { kind: \"plan\", body: pendingPlan },\n });\n return () => {\n broadcastDashboardEvent({ kind: \"modal-down\", modalKind: \"plan\" });\n };\n }, [pendingPlan, broadcastDashboardEvent]);\n\n useEffect(() => {\n if (!pendingEditReview) return;\n // Trim the preview — older clients only render this string; newer\n // clients use `search`/`replace` directly to render a side-by-side\n // diff with syntax highlighting (full content, no line cap).\n const previewLines = (pendingEditReview.search || pendingEditReview.replace || \"\")\n .split(\"\\n\")\n .slice(0, 12);\n const preview = previewLines.join(\"\\n\");\n broadcastDashboardEvent({\n kind: \"modal-up\",\n modal: {\n kind: \"edit-review\",\n path: pendingEditReview.path,\n search: pendingEditReview.search ?? \"\",\n replace: pendingEditReview.replace ?? \"\",\n preview,\n total: pendingEdits.current.length,\n remaining: pendingEdits.current.length,\n },\n });\n return () => {\n broadcastDashboardEvent({ kind: \"modal-down\", modalKind: \"edit-review\" });\n };\n }, [pendingEditReview, broadcastDashboardEvent]);\n\n useEffect(() => {\n if (!pendingRevision) return;\n broadcastDashboardEvent({\n kind: \"modal-up\",\n modal: {\n kind: \"revision\",\n reason: pendingRevision.reason,\n remainingSteps: pendingRevision.remainingSteps.map((s) => ({\n id: s.id,\n title: s.title,\n action: s.action,\n ...(s.risk ? { risk: s.risk } : {}),\n })),\n ...(pendingRevision.summary ? { summary: pendingRevision.summary } : {}),\n },\n });\n return () => {\n broadcastDashboardEvent({ kind: \"modal-down\", modalKind: \"revision\" });\n };\n }, [pendingRevision, broadcastDashboardEvent]);\n\n // Three mutually-exclusive input-prefix pickers (slash name, @ file\n // mention, slash argument) — state + memos + commit callbacks live\n // in a dedicated hook so App.tsx only sees the small surface it\n // actually consumes in useInput / handleSubmit / render. Declared\n // after useSessionInfo because the slash-arg picker reads the model\n // catalog for `/model <partial>` completion.\n const {\n slashMatches,\n slashSelected,\n setSlashSelected,\n slashGroupMode,\n slashAdvancedHidden,\n atState,\n atSelected,\n setAtSelected,\n pickAtMention,\n recordRecentFile,\n slashArgContext,\n slashArgMatches,\n slashArgSelected,\n setSlashArgSelected,\n pickSlashArg,\n } = useCompletionPickers({\n input,\n setInput,\n codeMode,\n rootDir: currentRootDir,\n models,\n mcpServers: liveMcpServers,\n slashUsage,\n });\n\n // Wire the shared progressSink so the bridge's onProgress → us.\n // Only updates progress when the frame belongs to the currently-\n // running tool: late frames from a previous call shouldn't overwrite\n // the spinner of whatever's running next.\n useEffect(() => {\n if (!progressSink) return;\n progressSink.current = (info) => {\n setToolProgress({\n progress: info.progress,\n total: info.total,\n message: info.message,\n });\n };\n return () => {\n if (progressSink.current) progressSink.current = null;\n };\n }, [progressSink]);\n\n // Surface a one-time banner about session state on first mount.\n const sessionBannerShown = useRef(false);\n useEffect(() => {\n if (sessionBannerShown.current) return;\n sessionBannerShown.current = true;\n if (!session) {\n log.pushInfo(t(\"ui.ephemeralSession\"));\n } else if (loop.resumedMessageCount > 0) {\n log.pushInfo(t(\"ui.resumedSession\", { name: session, count: loop.resumedMessageCount }));\n } else {\n log.pushInfo(t(\"ui.newSession\", { name: session }));\n }\n // Restore any pending edit queue from a prior run that was\n // interrupted before /apply or /discard. The checkpoint file sits\n // next to the session log; if present, we re-populate pendingEdits\n // and post an info row so the user knows what's waiting.\n if (session && codeMode) {\n const restored = loadPendingEdits(session);\n if (restored && restored.length > 0) {\n pendingEdits.current = restored;\n syncPendingCount();\n log.pushInfo(t(\"ui.restoredEdits\", { count: restored.length }));\n }\n }\n // Restore structured plan state from a prior run. plan.json sits\n // next to the session JSONL; if present, populate planStepsRef +\n // completedStepIdsRef and post an info row showing how far along\n // the plan was. Pure-markdown plans don't persist (nothing to\n // restore), so users see this banner only when there's real\n // structured state to pick back up.\n // Guard: skip restoration when the session has zero prior messages\n // (truly fresh). A stale plan file from a prior wipe that wasn't\n // cleaned up is not a real plan to resume — it's a sidecar orphan.\n if (session && loop.resumedMessageCount > 0) {\n const restoredPlan = loadPlanState(session);\n if (restoredPlan && restoredPlan.steps.length > 0) {\n planStepsRef.current = restoredPlan.steps;\n completedStepIdsRef.current = new Set(restoredPlan.completedStepIds);\n planBodyRef.current = restoredPlan.body ?? null;\n planSummaryRef.current = restoredPlan.summary ?? null;\n const when = relativeTime(restoredPlan.updatedAt);\n const done = new Set(restoredPlan.completedStepIds);\n const summary = restoredPlan.summary ? ` — ${restoredPlan.summary}` : \"\";\n log.showPlan({\n title: t(\"ui.resumedPlan\", { when, summary }),\n steps: restoredPlan.steps.map((s) => ({\n id: s.id,\n title: s.title,\n status: done.has(s.id) ? \"done\" : \"queued\",\n })),\n variant: \"resumed\",\n });\n }\n }\n // One-time onboarding tip for the edit-gate keybindings. New users\n // wouldn't otherwise discover Shift+Tab (it's in /keys and the\n // bottom status bar, but both require looking). Shown exactly once\n // per install; the config flag suppresses re-display on every\n // relaunch. Skips chat mode — those shortcuts don't apply there.\n if (codeMode && !editModeHintShown()) {\n const tip = tObj<{\n topic: string;\n sections: ReadonlyArray<{ rows: ReadonlyArray<{ key: string; text: string }> }>;\n footer: string;\n }>(\"ui.tipEditBindings\");\n log.pushTip({ topic: tip.topic, sections: tip.sections, footer: tip.footer });\n markEditModeHintShown();\n }\n if (!mouseClipboardHintShown()) {\n const tip = tObj<{\n topic: string;\n sections: ReadonlyArray<{ rows: ReadonlyArray<{ key: string; text: string }> }>;\n footer: string;\n }>(\"ui.tipMouseClipboard\");\n log.pushTip({ topic: tip.topic, sections: tip.sections, footer: tip.footer });\n markMouseClipboardHintShown();\n }\n }, [session, loop, codeMode, syncPendingCount, log]);\n\n // Esc handles \"abort the current turn\" separately; Ctrl+C is the universal \"I'm done\" key.\n const quitProcess = useQuit(transcriptRef);\n\n // PgUp / PgDn always scroll chat history. ↑/↓ also reaches here when\n // PromptInput can't act on it: while busy (disabled) or once chat is\n // unpinned (user already scrolling). When pinned + idle, PromptInput\n // owns arrows — empty buffer recalls history, otherwise cursor motion.\n // Mouse wheel routes through mouseScrollUp/Down (SGR mouse mode) and\n // bypasses the arrow-key path entirely so the wheel always scrolls\n // scrollback regardless of buffer state.\n useKeystroke((ev) => {\n if (ev.pageUp || ev.mouseScrollUp) chatScroll.scrollUp();\n else if (ev.pageDown || ev.mouseScrollDown) chatScroll.scrollDown();\n else if (ev.end) chatScroll.jumpToBottom();\n else if ((!chatScroll.pinned || busy) && ev.upArrow) chatScroll.scrollUp();\n else if ((!chatScroll.pinned || busy) && ev.downArrow) chatScroll.scrollDown();\n }, !modalOpen);\n\n // Esc during busy → forward to the loop as an abort signal. The loop\n // finishes the tool call in flight (we can't kill subprocess stdio\n // mid-write), then diverts to its no-tools summary path so the user\n // gets an answer instead of a hard stop. Only listens while busy so\n // we don't accidentally hijack Esc in other contexts.\n //\n // Also handles ↑/↓ shell-style history while idle. We don't use\n // ink-text-input's (absent) history support; parent-level useInput\n // is simpler and lets us own the cursor semantics.\n useKeystroke((ev) => {\n // PromptInput consumes its own keystrokes via useKeystroke too,\n // so events fan out to both this handler and PromptInput's. The\n // global hotkeys here only fire when the relevant condition\n // (busy / codeMode / etc.) holds, otherwise they no-op and let\n // PromptInput own the key.\n const chKey = ev.input;\n const key = ev;\n if (ev.paste) {\n // Paste content goes only to PromptInput. Don't run global\n // hotkey logic over it (a `\\n` in paste shouldn't fire submit).\n return;\n }\n if (key.ctrl && key.input === \"c\") {\n quitProcess();\n return;\n }\n if (key.escape && busy) {\n if (abortedThisTurn.current) return;\n abortedThisTurn.current = true;\n // If an edit-review modal is up, resolve its promise first so the\n // interceptor unblocks — otherwise the tool call hangs past the\n // loop's abort and the next turn can't start. Esc during modal =\n // \"reject this edit\" (safe default — nothing lands on disk).\n const resolve = editReviewResolveRef.current;\n if (resolve) {\n editReviewResolveRef.current = null;\n setPendingEditReview(null);\n resolve({ choice: \"reject\" });\n }\n // Esc during a busy turn also kills any active /loop — the user\n // is taking over. Loops persist past plain Esc when the system is\n // idle so a long-cadence loop doesn't die from random key noise.\n if (isLoopActive()) stopLoop();\n loop.abort();\n return;\n }\n // Esc when idle ALSO cancels an active loop, since hitting Esc with\n // nothing else going on is a clear \"stop whatever's running\"\n // gesture. No-op when no loop is active.\n if (key.escape && !busy && isLoopActive()) {\n stopLoop();\n return;\n }\n // Esc dismisses any composer-level picker (slash / @ / slash-arg)\n // by clearing the prefix that triggered it. Picker footers advertise\n // \"esc cancel\" — this binds it.\n if (key.escape && !busy && (slashMatches || atState || slashArgContext)) {\n setInput(\"\");\n return;\n }\n // Esc inside a /walk session exits the walk WITHOUT applying or\n // discarding the current block — remaining edits stay queued so\n // the user can resume via /walk or commit via /apply later.\n if (key.escape && walkthroughActive) {\n setWalkthroughActive(false);\n const remaining = pendingEdits.current.length;\n log.pushInfo(\n remaining > 0\n ? t(\"app.walkCancelledRemaining\", { count: remaining })\n : t(\"app.walkCancelled\"),\n );\n return;\n }\n // Edit-mode cycle: Shift+Tab flips review ↔ auto. Available any\n // time a modal isn't up — including mid-turn — so the user can\n // switch gears without abandoning the in-flight request. Prefer\n // this to typing `/mode <x>`; one keystroke, no command parsing.\n if (\n codeMode &&\n key.shift &&\n key.tab &&\n !pendingShell &&\n !pendingPlan &&\n !pendingReviseEditor &&\n !pendingSessionsPicker &&\n !pendingCheckpointPicker &&\n !pendingMcpHub &&\n !stagedInput &&\n !pendingEditReview &&\n !walkthroughActive &&\n !pendingChoice &&\n !stagedChoiceCustom &&\n !pendingRevision\n ) {\n // Three-stop cycle: review → auto → yolo → review. yolo also\n // disables shell confirmations so true zero-prompt iteration takes two Shift+Tabs from default.\n const cur = editModeRef.current;\n const next: EditMode = cur === \"review\" ? \"auto\" : cur === \"auto\" ? \"yolo\" : \"review\";\n setEditMode(next);\n const message =\n next === \"yolo\"\n ? t(\"app.editModeYolo\")\n : next === \"auto\"\n ? t(\"app.editModeAuto\")\n : t(\"app.editModeReview\");\n log.pushInfo(message);\n return;\n }\n // Undo banner keybind: `u` rolls back the last auto-apply. Gated\n // on an empty prompt buffer so typing \"user\" into the input doesn't\n // steal from the first keystroke. 5-second window; after that the\n // banner self-dismisses and /undo remains the only path.\n if (\n codeMode &&\n input.length === 0 &&\n (chKey === \"u\" || chKey === \"U\") &&\n !pendingShell &&\n !pendingPlan &&\n !pendingReviseEditor &&\n !pendingSessionsPicker &&\n !pendingCheckpointPicker &&\n !pendingMcpHub &&\n !stagedInput &&\n !pendingEditReview &&\n !walkthroughActive &&\n !pendingChoice &&\n !stagedChoiceCustom &&\n !pendingRevision &&\n // Fire when EITHER the banner is up OR there's any non-undone\n // history entry — the keybind is useful long after the 5-second\n // banner expires, which users rightly want.\n (undoBanner || hasUndoable())\n ) {\n const out = codeUndo([]);\n log.pushInfo(out);\n return;\n }\n // Space toggles pause on the active undo countdown. Same gating as\n // the `u` keybind so typing in the prompt isn't intercepted.\n if (\n codeMode &&\n input.length === 0 &&\n chKey === \" \" &&\n undoBanner &&\n !pendingShell &&\n !pendingPlan &&\n !pendingReviseEditor &&\n !pendingSessionsPicker &&\n !pendingCheckpointPicker &&\n !pendingMcpHub &&\n !stagedInput &&\n !pendingEditReview &&\n !walkthroughActive &&\n !pendingChoice &&\n !stagedChoiceCustom &&\n !pendingRevision\n ) {\n toggleUndoPause();\n return;\n }\n // Ctrl-O toggles full-tail view on the live streaming reply so a long\n // plan / todo can be read while it's still being written. Resets at\n // turn end so each new reply starts collapsed.\n if (\n key.ctrl &&\n key.input === \"o\" &&\n isStreaming &&\n !pendingShell &&\n !pendingPlan &&\n !pendingReviseEditor &&\n !pendingSessionsPicker &&\n !pendingCheckpointPicker &&\n !pendingMcpHub &&\n !stagedInput &&\n !pendingEditReview &&\n !walkthroughActive &&\n !pendingChoice &&\n !stagedChoiceCustom &&\n !pendingRevision\n ) {\n setLiveExpand((v) => !v);\n return;\n }\n if (busy) return;\n // ShellConfirm owns the full keyboard while it's showing. If we\n // kept handling ↑/↓ / Tab here they'd race with its SingleSelect\n // — the picker would move AND history recall would fire into the\n // (hidden) prompt buffer. Bail early.\n if (pendingShell) return;\n\n // @-mention picker takes the same priority tier as slash. ↑/↓ walk\n // the list; Tab on a folder drills into it, Tab on a file commits.\n // Enter is caught in handleSubmit. Right arrow stays cursor-move\n // (would otherwise fight PromptInput's multiline cursor). Must come\n // BEFORE slash so the two pickers don't share arrow keys.\n if (atState && atState.entries.length > 0) {\n const entries = atState.entries;\n if (key.upArrow) {\n setAtSelected((i) => Math.max(0, i - 1));\n return;\n }\n if (key.downArrow) {\n setAtSelected((i) => Math.min(entries.length - 1, i + 1));\n return;\n }\n if (key.tab) {\n const sel = entries[atSelected] ?? entries[0];\n if (sel) pickAtMention(sel, sel.isDir ? \"drill\" : \"commit\");\n return;\n }\n }\n\n // Slash-argument picker. Fires inside `/<cmd> <partial>` — either\n // a file picker (for /edit), enum picker (for /preset, /model,\n // /plan, /branch, /harvest), or hint-only row. Navigation + Tab\n // substitute the highlighted value at the arg's offset.\n if (slashArgMatches && slashArgMatches.length > 0) {\n if (key.upArrow) {\n setSlashArgSelected((i) => Math.max(0, i - 1));\n return;\n }\n if (key.downArrow) {\n setSlashArgSelected((i) => Math.min(slashArgMatches.length - 1, i + 1));\n return;\n }\n if (key.tab) {\n const sel = slashArgMatches[slashArgSelected] ?? slashArgMatches[0];\n if (sel) pickSlashArg(sel);\n return;\n }\n }\n\n // Slash-suggestion mode takes priority over history recall.\n // When the user is typing a `/…` prefix and there are matches,\n // ↑/↓ walk the suggestion list and Tab snaps the input to the\n // highlighted command. Enter is handled in `handleSubmit` so\n // TextInput's onSubmit still fires cleanly.\n if (slashMatches && slashMatches.length > 0) {\n if (key.upArrow) {\n setSlashSelected((i) => Math.max(0, i - 1));\n return;\n }\n if (key.downArrow) {\n setSlashSelected((i) => Math.min(slashMatches.length - 1, i + 1));\n return;\n }\n if (key.tab) {\n const sel = slashMatches[slashSelected] ?? slashMatches[0];\n if (sel) setInput(`/${sel.cmd}`);\n return;\n }\n }\n\n // History recall (↑/↓) used to live here guarded by `input.length\n // === 0`. It now runs inside PromptInput — the child detects\n // when a buffer-edge arrow key has nowhere left to go (empty\n // buffer, or cursor at first/last line of a multi-line draft)\n // and calls back into `recallPrev` / `recallNext` below. That\n // lets users escape into history from a multi-line draft by\n // pressing ↑ at the first line without first emptying the\n // buffer.\n });\n\n // Edit-gate interceptor. Reroutes `edit_file` / `write_file` tool\n // calls through the review queue (in `review` mode) or the auto-apply\n // snapshot/banner path (in `auto` mode) so the model's tool usage\n // respects the same gate as its text-form SEARCH/REPLACE output.\n // Without this, edit_file bypasses `/apply` entirely — which was the\n // bug that made the preview flow feel absent pre-0.5.24.\n //\n // `editModeRef` is read inside the closure so mode cycles don't need\n // to reinstall the hook. Cleanup clears the slot on unmount so a\n // follow-up App instance (tests, HMR) starts with a fresh registry.\n //\n // biome-ignore lint/correctness/useExhaustiveDependencies: session / setEditMode / syncPendingCount are intentional closure captures — their updaters are stable and we don't want to tear down and rebuild the interceptor on unrelated state churn\n useEffect(() => {\n if (!tools || !codeMode) return;\n tools.setToolInterceptor(async (name, args) => {\n if (name !== \"edit_file\" && name !== \"write_file\") return null;\n const rawPath = typeof args.path === \"string\" ? args.path : \"\";\n if (!rawPath) return null;\n // Mirror filesystem.ts safePath's leading-slash tolerance so\n // `/src/foo.ts` doesn't get misrouted through applyEditBlock's\n // rootDir-escape check.\n let relPath = rawPath;\n while (relPath.startsWith(\"/\") || relPath.startsWith(\"\\\\\")) {\n relPath = relPath.slice(1);\n }\n if (!relPath) return null;\n\n // Read root via ref so a workspace swap (which runs reregisterTools\n // for read_file/run_command) is also visible to this interceptor —\n // otherwise edit_file writes to the OLD root while read_file looks in\n // the NEW one, producing ENOENT on the next read of a just-edited file.\n const rootForEdit = currentRootDirRef.current;\n let block: EditBlock;\n if (name === \"edit_file\") {\n const search = typeof args.search === \"string\" ? args.search : \"\";\n const replace = typeof args.replace === \"string\" ? args.replace : \"\";\n if (!search) return null; // let the tool fn surface the \"empty search\" error\n block = { path: relPath, search, replace, offset: 0 };\n } else {\n // write_file: capture the current content (if any) as SEARCH so\n // the queued block is a literal whole-file overwrite. For new\n // files SEARCH stays empty — applyEditBlock's create-new sentinel.\n const content = typeof args.content === \"string\" ? args.content : \"\";\n block = toWholeFileEditBlock(relPath, content, rootForEdit);\n }\n\n // Helper: apply the current block + record into history + arm\n // undo. Used by auto mode AND by the various \"apply\" branches\n // of the review modal so we don't duplicate the snapshot /\n // apply / banner logic.\n //\n // Does NOT push an info row to scrollback: the returned string\n // becomes the tool result AND the loop yields a `tool` event right\n // after — ToolCard renders that with the same text. Pushing here\n // would produce \"result shown twice\".\n const applyNow = (): string => {\n const snaps = snapshotBeforeEdits([block], rootForEdit);\n const results = applyEditBlocks([block], rootForEdit);\n const good = results.some((r) => r.status === \"applied\" || r.status === \"created\");\n if (good) {\n recordEdit(\"auto\", [block], results, snaps);\n armUndoBanner(results);\n }\n return formatEditResults(results);\n };\n\n // yolo behaves like auto for edit application — the only extra\n // power yolo adds is bypassing shell confirmations (handled in\n // shell.ts via the allowAll getter).\n if (editModeRef.current === \"auto\" || editModeRef.current === \"yolo\") return applyNow();\n\n // review mode, tool-call path: suspend the interceptor on the\n // per-edit modal unless the user has already hit \"apply-rest-of-\n // turn\" earlier in the same turn. Text-form SEARCH/REPLACE blocks\n // in assistant_final still queue for end-of-turn preview — they\n // land all at once with no mid-stream opportunity to prompt.\n if (turnEditPolicyRef.current === \"apply-all\") return applyNow();\n\n const { choice, denyContext } = await new Promise<EditReviewResult>((resolveChoice) => {\n editReviewResolveRef.current = resolveChoice;\n setPendingEditReview(block);\n });\n // Clear the pending-review slot synchronously so a rapid-fire next\n // tool call doesn't race the React state settling.\n editReviewResolveRef.current = null;\n setPendingEditReview(null);\n\n if (choice === \"reject\") {\n const context = denyContext ? ` because: ${denyContext}` : \"\";\n log.pushInfo(t(\"app.rejectedEdit\", { path: block.path, context }));\n return `User rejected this edit to ${block.path}${context}. Don't retry the same SEARCH/REPLACE — either try a different approach or ask the user what they want instead.`;\n }\n if (choice === \"apply-rest-of-turn\") {\n turnEditPolicyRef.current = \"apply-all\";\n log.pushInfo(t(\"app.autoApprovingRest\"));\n return applyNow();\n }\n if (choice === \"flip-to-auto\") {\n setEditMode(\"auto\");\n log.pushInfo(t(\"app.flippedAutoSession\"));\n return applyNow();\n }\n // \"apply\"\n return applyNow();\n });\n return () => {\n tools.setToolInterceptor(null);\n };\n }, [tools, codeMode, session, recordEdit, armUndoBanner, syncPendingCount, setEditMode]);\n\n const { codeApply, codeDiscard } = useCodeMode({\n codeMode: !!codeMode,\n pendingEdits,\n currentRootDir,\n session: session ?? null,\n syncPendingCount,\n recordEdit,\n });\n\n const prefixHash = loop.prefix.fingerprint;\n\n const writeTranscript = useTranscriptWriter(transcriptRef, model, prefixHash);\n\n /**\n * Toggle plan mode on the local state AND on the ToolRegistry. The\n * registry's copy is what actually gates dispatch; the local state\n * drives the StatsPanel indicator and slash ergonomics. Kept in sync\n * by funneling every toggle through this setter.\n */\n const togglePlanMode = useCallback(\n (on: boolean) => {\n setPlanMode(on);\n tools?.setPlanMode(on);\n },\n [tools],\n );\n\n const {\n startLoop,\n stopLoop,\n getLoopStatus,\n isLoopActive,\n isLoopFiring,\n clearFiringFlag,\n activeLoop,\n } = useLoopMode({ log, busyRef, handleSubmitRef });\n\n /**\n * Mount the per-block walkthrough modal against the pending-edits\n * queue. Returns the info text the slash handler should display.\n * No-op (with explanatory message) when nothing is pending or we're\n * not in code mode.\n */\n const startWalkthrough = useCallback((): string => {\n if (!codeMode) {\n return \"/walk is only available inside `reasonix code`.\";\n }\n if (pendingEdits.current.length === 0) {\n return \"nothing pending — nothing to walk through.\";\n }\n setWalkthroughActive(true);\n return `▸ walking ${pendingEdits.current.length} edit block(s) — y apply · n reject · a apply rest · A flip to AUTO · Esc cancels (keeps remaining queued).`;\n }, [codeMode]);\n\n // Embedded dashboard server lifecycle. Boot is async (server has to\n // bind a port + read static assets); the slash handler kicks this\n // off and reads the URL out of `dashboardRef` once the promise\n // resolves. Tear-down is also async but cheap — close drains\n // in-flight requests within a 1s grace window.\n const startDashboard = useCallback(async (): Promise<string> => {\n if (dashboardRef.current) return dashboardRef.current.url;\n if (dashboardStartingRef.current) return dashboardStartingRef.current;\n const startup = (async () => {\n const { startDashboardServer } = await import(\"../../server/index.js\");\n const handle = await startDashboardServer({\n mode: \"attached\",\n configPath: defaultConfigPath(),\n usageLogPath: defaultUsageLogPath(),\n loop,\n tools,\n mcpServers: liveMcpServers,\n getCurrentCwd: () => (codeMode ? currentRootDirRef.current : undefined),\n getEditMode: () => (codeMode ? editModeRef.current : undefined),\n getPlanMode: () => planModeRef.current,\n getPendingEditCount: () => pendingEdits.current.length,\n getLatestVersion: () => latestVersionRef.current,\n getSessionName: () => session ?? null,\n setEditMode: (m: EditMode) => {\n setEditMode(m);\n editModeRef.current = m;\n saveEditMode(m);\n return m;\n },\n setPlanMode: (on: boolean) => {\n if (codeMode) togglePlanMode(on);\n },\n applyPresetLive: (name: string) => {\n const settings = resolvePreset(name as PresetName);\n loop.configure({\n model: settings.model,\n autoEscalate: settings.autoEscalate,\n reasoningEffort: settings.reasoningEffort,\n });\n agentStore.dispatch({ type: \"session.model.change\", model: settings.model });\n const canonical: \"auto\" | \"flash\" | \"pro\" =\n settings.model === \"deepseek-v4-pro\" ? \"pro\" : settings.autoEscalate ? \"auto\" : \"flash\";\n setPreset(canonical);\n },\n applyEffortLive: (effort) => {\n loop.configure({ reasoningEffort: effort });\n },\n applyModelLive: (model) => {\n loop.configure({ model });\n agentStore.dispatch({ type: \"session.model.change\", model });\n },\n getModels: () => modelsRef.current,\n setProNextLive: (armed) => {\n if (armed) loop.armProForNextTurn();\n else loop.disarmPro();\n },\n setBudgetUsdLive: (usd) => {\n loop.setBudget(usd);\n },\n getLoopRunStatus: () => getLoopStatus(),\n startAutoLoop: (intervalMs, prompt) => startLoop(intervalMs, prompt),\n stopAutoLoop: () => stopLoop(),\n // ---------- Chat bridge ----------\n getMessages: (): DashboardMessage[] =>\n cardsToDashboardMessages(agentStore.getState().cards),\n subscribeEvents: (handler) => {\n eventSubscribersRef.current.add(handler);\n return () => {\n eventSubscribersRef.current.delete(handler);\n };\n },\n submitPrompt: (text: string): SubmitResult => {\n if (busyRef.current) {\n return { accepted: false, reason: \"loop is busy with a turn\" };\n }\n const fn = handleSubmitRef.current;\n if (!fn) return { accepted: false, reason: \"TUI not ready\" };\n // Fire-and-forget — handleSubmit drives the loop event stream\n // which the web sees via SSE. We don't await it here because\n // a turn can take minutes; the HTTP request would time out.\n fn(text).catch(() => undefined);\n return { accepted: true };\n },\n abortTurn: () => {\n if (busyRef.current) loop.abort();\n },\n isBusy: () => busyRef.current,\n getStats: () => {\n // Pull from the loop's live aggregator (same source the TUI's\n // StatsPanel reads). `balance` comes from useSessionInfo via a\n // ref-mirror so this callback stays cheap.\n const s = loop.stats.summary();\n const ctxCap = DEEPSEEK_CONTEXT_TOKENS[loop.model] ?? DEFAULT_CONTEXT_TOKENS;\n return {\n turns: s.turns,\n totalCostUsd: s.totalCostUsd,\n lastTurnCostUsd: s.lastTurnCostUsd,\n totalInputCostUsd: s.totalInputCostUsd,\n totalOutputCostUsd: s.totalOutputCostUsd,\n cacheHitRatio: s.cacheHitRatio,\n lastPromptTokens: s.lastPromptTokens,\n contextCapTokens: ctxCap,\n // useSessionInfo's Balance is a flat { currency, total }; the\n // dashboard wire shape is the richer DeepSeek BalanceInfo\n // array (granted / topped_up split). Convert as a single-\n // entry array so the SPA always reads `balance[0]` shape.\n balance: balanceRef.current\n ? [\n {\n currency: balanceRef.current.currency,\n total_balance: String(balanceRef.current.total),\n },\n ]\n : null,\n };\n },\n // ---------- Modal mirroring ----------\n getActiveModal: (): ActiveModal | null => {\n // Probe the live state via refs in priority order — only one\n // modal can be up at a time per App invariant.\n const ps = pendingShell;\n if (ps) {\n return {\n kind: \"shell\",\n command: ps.command,\n allowPrefix: derivePrefix(ps.command),\n shellKind: ps.kind,\n };\n }\n const pc = pendingChoice;\n if (pc) {\n return {\n kind: \"choice\",\n question: pc.question,\n options: pc.options,\n allowCustom: pc.allowCustom,\n };\n }\n if (pendingPlanRef.current) {\n return { kind: \"plan\", body: pendingPlanRef.current };\n }\n const er = pendingEditReview;\n if (er) {\n return {\n kind: \"edit-review\",\n path: er.path,\n search: er.search ?? \"\",\n replace: er.replace ?? \"\",\n preview: (er.search || er.replace || \"\").split(\"\\n\").slice(0, 12).join(\"\\n\"),\n total: pendingEdits.current.length,\n remaining: pendingEdits.current.length,\n };\n }\n if (pendingRevision) {\n return {\n kind: \"revision\",\n reason: pendingRevision.reason,\n remainingSteps: pendingRevision.remainingSteps.map((s) => ({\n id: s.id,\n title: s.title,\n action: s.action,\n ...(s.risk ? { risk: s.risk } : {}),\n })),\n ...(pendingRevision.summary ? { summary: pendingRevision.summary } : {}),\n };\n }\n const picker = activePickerSnapshotRef.current;\n if (picker) {\n return { kind: \"picker\", ...picker };\n }\n const viewer = activeViewerSnapshotRef.current;\n if (viewer) {\n return { kind: \"viewer\", ...viewer };\n }\n return null;\n },\n resolveShellConfirm: (choice) => {\n const fn = handleShellConfirmRef.current;\n if (fn) Promise.resolve(fn(choice)).catch(() => undefined);\n },\n resolveChoiceConfirm: (choice) => {\n const fn = handleChoiceConfirmRef.current;\n if (fn) fn(choice).catch(() => undefined);\n },\n resolvePlanConfirm: (choice, text) => {\n if (choice === \"cancel\") {\n handlePlanConfirmRef.current(\"cancel\").catch(() => undefined);\n return;\n }\n const plan = pendingPlanRef.current ?? \"\";\n // Bypass the picker → input two-step on web. The override\n // form of handleStagedInputSubmit takes the plan + mode\n // directly; behaviour matches the TUI's \"user typed feedback +\n // pressed Enter\" path.\n handleStagedInputSubmitRef\n .current(text ?? \"\", { plan, mode: choice })\n .catch(() => undefined);\n },\n resolveEditReview: (choice) => {\n const resolve = editReviewResolveRef.current;\n if (resolve) {\n editReviewResolveRef.current = null;\n setPendingEditReview(null);\n resolve({ choice, denyContext: undefined });\n }\n },\n resolveCheckpointConfirm: (choice, text) => {\n // Web's \"revise\" path sends feedback in one shot; we hand the\n // current pending checkpoint to the submit handler directly,\n // skipping the TUI's staged-input two-step. continue/stop fall\n // through to the regular picker handler.\n if (choice === \"revise\" && typeof text === \"string\") {\n const snap = pendingCheckpoint;\n setPendingCheckpoint(null);\n if (!snap) return;\n Promise.resolve(handleCheckpointReviseSubmitRef.current(text, snap)).catch(\n () => undefined,\n );\n return;\n }\n Promise.resolve(handleCheckpointConfirmRef.current(choice)).catch(() => undefined);\n },\n resolveReviseConfirm: (choice) => {\n Promise.resolve(handleReviseConfirmRef.current(choice)).catch(() => undefined);\n },\n resolvePicker: (resolution) => {\n const fn = activePickerResolverRef.current;\n if (fn) Promise.resolve(fn(resolution)).catch(() => undefined);\n },\n resolveViewer: () => {\n const fn = activeViewerResolverRef.current;\n if (fn) Promise.resolve(fn()).catch(() => undefined);\n },\n // ---------- v0.14 mutation surface ----------\n reloadHooks: () => {\n const fresh = loadHooks({\n projectRoot: codeMode ? currentRootDirRef.current : undefined,\n });\n setHookList(fresh);\n return fresh.length;\n },\n addToolToPrefix: (spec) => loop.prefix.addTool(spec),\n reloadMcp: mcpRuntime\n ? async () => {\n const r = await mcpRuntime.reloadFromConfig(loop);\n setLiveMcpServers(r.summaries);\n return r.summaries.length;\n }\n : undefined,\n });\n dashboardRef.current = handle;\n setDashboardUrlState(handle.url);\n return handle.url;\n })();\n dashboardStartingRef.current = startup;\n try {\n return await startup;\n } finally {\n dashboardStartingRef.current = null;\n }\n }, [\n loop,\n tools,\n liveMcpServers,\n codeMode,\n session,\n togglePlanMode,\n pendingShell,\n pendingChoice,\n pendingCheckpoint,\n pendingEditReview,\n pendingRevision,\n agentStore,\n mcpRuntime,\n getLoopStatus,\n startLoop,\n stopLoop,\n ]);\n\n const stopDashboard = useCallback(async (): Promise<void> => {\n const h = dashboardRef.current;\n if (!h) return;\n dashboardRef.current = null;\n setDashboardUrlState(null);\n try {\n await h.close();\n } catch {\n /* swallow — server going down is best-effort */\n }\n log.pushInfo(t(\"app.dashboardStopped\"));\n }, [log]);\n\n const getDashboardUrl = useCallback((): string | null => {\n return dashboardRef.current?.url ?? null;\n }, []);\n\n // Mirror of the dashboard URL into React state so the StatsPanel\n // header can render a clickable pill the moment the server is up.\n // Updated by both the auto-start effect below and the explicit\n // /dashboard slash path (via startDashboard).\n const [dashboardUrl, setDashboardUrlState] = useState<string | null>(null);\n\n // Auto-start the dashboard once the TUI is mounted unless the user\n // opted out with --no-dashboard. The whole point is discoverability:\n // most users had no idea /dashboard existed, so the URL needs to be\n // visible from the first render. startDashboard updates the React\n // state itself, so we just fire-and-forget. Failures stay silent —\n // a missing dashboard never blocks the TUI.\n useEffect(() => {\n if (noDashboard) return;\n if (dashboardRef.current) return;\n startDashboard().catch((err) => {\n // Auto-start failure surfaces as a visible warn row. The URL\n // itself is shown on the welcome card (when the server is up),\n // so silence here would leave the user with no way to know the\n // web UI is unreachable — port already in use, permission\n // denied, etc. Don't block the TUI; everything else keeps working.\n const reason = err instanceof Error ? err.message : String(err);\n log.pushInfo(t(\"ui.dashboardAutoStartFailed\", { reason }));\n });\n }, [noDashboard, startDashboard, log]);\n\n // Tear the dashboard down on unmount so the port doesn't leak when\n // the TUI exits via /exit, Ctrl+C, etc.\n useEffect(() => {\n return () => {\n const h = dashboardRef.current;\n if (h) {\n dashboardRef.current = null;\n h.close().catch(() => undefined);\n }\n };\n }, []);\n\n /**\n * onChoose for the walkthrough EditConfirm. Each pick mutates\n * pendingEdits via the existing codeApply/codeDiscard helpers, which\n * also bump pendingTick → the modal re-renders with the next block.\n * When no blocks remain, the modal unmounts.\n */\n const handleWalkChoice = useCallback(\n (choice: EditReviewChoice) => {\n if (choice === \"apply\") {\n log.pushInfo(codeApply([1]));\n } else if (choice === \"reject\") {\n log.pushInfo(codeDiscard([1]));\n } else if (choice === \"apply-rest-of-turn\") {\n // \"apply rest\" inside a walkthrough = commit every remaining\n // block at once, then exit. Same end state as if the user had\n // typed `/apply` outside the walk.\n log.pushInfo(codeApply());\n setWalkthroughActive(false);\n return;\n } else if (choice === \"flip-to-auto\") {\n // Flip the gate first, then apply the current block, then exit\n // the walk. Remaining blocks stay pending — the user can keep\n // walking via /walk again or commit them with /apply.\n setEditMode(\"auto\");\n saveEditMode(\"auto\");\n log.pushInfo(codeApply([1]));\n log.pushInfo(t(\"app.flippedAutoWalk\"));\n setWalkthroughActive(false);\n return;\n }\n // After a per-block apply/reject, check if the queue is empty\n // (codeApply/codeDiscard updated pendingEdits.current). If so,\n // exit; otherwise stay mounted and EditConfirm re-renders against\n // the new first block thanks to pendingTick.\n if (pendingEdits.current.length === 0) setWalkthroughActive(false);\n },\n [codeApply, codeDiscard, log],\n );\n\n const handleSubmit = useCallback(\n async (raw: string) => {\n let text = raw.trim();\n if (!text) return;\n // Cancel-on-user-input: any user-typed submit cancels an active\n // /loop, regardless of busy state. Loop-fired submits set the\n // firing flag so the timer's own re-submit doesn't self-cancel.\n if (isLoopActive() && !isLoopFiring()) {\n stopLoop();\n }\n clearFiringFlag();\n if (busy) return;\n\n // @-mention picker intercept. Enter on either a file or a folder\n // commits the path INTO the buffer (with trailing space) — the\n // user almost always types more after a mention. The trailing\n // space dismisses the picker, so the next Enter submits normally.\n // Folders inline as a directory listing at submit time.\n if (atState && atState.entries.length > 0) {\n const sel = atState.entries[atSelected] ?? atState.entries[0];\n if (sel) {\n pickAtMention(sel, \"commit\");\n return;\n }\n }\n\n // Slash-argument picker intercept — same shape as @-picker. For\n // file pickers (/edit) we splice + trailing space so the user\n // keeps typing the instruction. For enum pickers (/preset,\n // /model, /plan, …) we splice without trailing space; those\n // commands take no further args, so the user presses Enter a\n // second time to run.\n if (slashArgMatches && slashArgMatches.length > 0 && slashArgContext) {\n const sel = slashArgMatches[slashArgSelected] ?? slashArgMatches[0];\n if (sel) {\n pickSlashArg(sel);\n return;\n }\n }\n\n // Slash auto-complete on Enter. When the user typed a prefix\n // (e.g. \"/he\") and the suggestion list is visible, substitute\n // the highlighted match so Enter runs it — same effect as Tab\n // + Enter, one keystroke less. Skip substitution if the user\n // already typed a full, exact command name (respect verbatim\n // input when they know what they want).\n if (text.startsWith(\"/\") && !text.includes(\" \")) {\n const typed = text.slice(1).toLowerCase();\n const matches = suggestSlashCommands(typed, !!codeMode);\n const exact = matches.find((m) => m.cmd === typed);\n if (!exact && matches.length > 0) {\n const chosen = matches[slashSelected] ?? matches[0];\n if (chosen) text = `/${chosen.cmd}`;\n }\n }\n\n setInput(\"\");\n resetCursor();\n\n // Y/N fast-path when edits are pending. One keystroke is all it\n // takes to commit or drop — matches the muscle memory of `git\n // add -p` / most prompts. Deliberately scoped: only when there\n // ARE pending edits, so \"y\" as a normal message still works\n // when nothing's waiting.\n if (codeMode && pendingEdits.current.length > 0 && (text === \"y\" || text === \"n\")) {\n log.pushInfo(text === \"y\" ? codeApply() : codeDiscard());\n pushHistory(text);\n return;\n }\n\n // Hash mode — `#note` (project) and `#g note` (global) append to\n // a REASONIX.md so future sessions pin the note in the immutable\n // prefix. No model round-trip. `\\#literal` escape falls through to\n // normal submission with the backslash stripped so the model sees\n // `#literal` verbatim.\n const hashParse = detectHashMemory(text);\n if (hashParse?.kind === \"memory\" || hashParse?.kind === \"memory-global\") {\n const isGlobal = hashParse.kind === \"memory-global\";\n const memRoot = currentRootDir;\n pushHistory(text);\n try {\n const result = isGlobal\n ? appendGlobalMemory(hashParse.note)\n : appendProjectMemory(memRoot, hashParse.note);\n const verb = result.created ? t(\"app.notedVerbCreated\") : t(\"app.notedVerbAppended\");\n const scopeTag = isGlobal ? t(\"app.notedScopeGlobal\") : t(\"app.notedScopeProject\");\n log.pushInfo(t(\"app.notedMemory\", { scope: scopeTag, verb, path: result.path }));\n } catch (err) {\n log.pushWarning(t(\"app.memoryWriteFailed\"), (err as Error).message);\n }\n return;\n }\n if (hashParse?.kind === \"escape\") {\n // Replace the working buffer with the de-escaped form. We don't\n // recurse into handleSubmit to avoid the \"still busy\" race —\n // just rewrite `text` and let the rest of the pipeline (bang /\n // slash / model) see the literal prompt.\n text = hashParse.text;\n }\n\n // Bash mode — `!cmd` runs a shell command in the sandbox root\n // immediately (no allowlist gate: user-typed = explicit consent),\n // surfaces the formatted output in the Historical log, and\n // persists a user-role message so the next model turn sees what\n // happened AND the bang exchange survives session resume.\n const bangCmd = detectBangCommand(text);\n if (bangCmd !== null) {\n const bangRoot = currentRootDir;\n pushHistory(text);\n log.pushUser(text);\n setBusy(true);\n try {\n const result = await runCommand(bangCmd, {\n cwd: bangRoot,\n timeoutSec: 60,\n maxOutputChars: 32_000,\n });\n const formatted = formatCommandResult(bangCmd, result);\n log.pushInfo(formatted);\n loop.appendAndPersist({\n role: \"user\",\n content: formatBangUserMessage(bangCmd, formatted),\n });\n } catch (err) {\n log.pushWarning(t(\"app.commandFailed\"), (err as Error).message);\n } finally {\n setBusy(false);\n }\n return;\n }\n\n // MCP resource / prompt browsers — async calls that don't fit the\n // synchronous handleSlash shape, so we intercept the exact command\n // forms here. The slash-command registry still lists them (for\n // /help + argument-level picker completion), but this branch is\n // what actually runs the read/fetch.\n const mcpBrowseMatch = /^\\/(resource|prompt)(?:\\s+([\\s\\S]*))?$/.exec(text);\n if (mcpBrowseMatch) {\n const kind = mcpBrowseMatch[1] as \"resource\" | \"prompt\";\n const arg = mcpBrowseMatch[2]?.trim() ?? \"\";\n pushHistory(text);\n log.pushUser(text);\n await handleMcpBrowseSlash(kind, arg, liveMcpServers, log);\n return;\n }\n\n const slash = parseSlash(text);\n if (slash) {\n const sink = eventSinkRef.current;\n const eventizer = eventizerRef.current;\n if (sink && eventizer) {\n sink.append(\n eventizer.emitSlashInvoked(loop.currentTurn, slash.cmd, slash.args.join(\" \")),\n );\n }\n setSlashUsage(recordSlashUse(slash.cmd));\n const result = handleSlash(slash.cmd, slash.args, loop, {\n mcpSpecs,\n mcpServers: liveMcpServers,\n codeUndo: codeMode ? codeUndo : undefined,\n codeApply: codeMode ? codeApply : undefined,\n codeDiscard: codeMode ? codeDiscard : undefined,\n codeHistory: codeMode ? codeHistory : undefined,\n codeShowEdit: codeMode ? codeShowEdit : undefined,\n codeRoot: codeMode ? currentRootDir : undefined,\n pendingEditCount: codeMode ? pendingEdits.current.length : undefined,\n memoryRoot: currentRootDir,\n planMode,\n setPlanMode: codeMode ? togglePlanMode : undefined,\n editMode: codeMode ? editMode : undefined,\n setEditMode: codeMode ? setEditMode : undefined,\n touchedFiles: codeMode\n ? () => {\n // Union of (files in completed/undone edit batches) +\n // (paths queued in pendingEdits awaiting /apply). Both\n // represent surface area the user might want to roll\n // back later.\n const set = new Set<string>(touchedPaths());\n for (const b of pendingEdits.current) set.add(b.path);\n return [...set];\n }\n : undefined,\n armPro: () => {\n loop.armProForNextTurn();\n setProArmed(true);\n },\n disarmPro: () => {\n loop.disarmPro();\n setProArmed(false);\n },\n startLoop,\n stopLoop,\n getLoopStatus,\n startWalkthrough: codeMode ? startWalkthrough : undefined,\n startDashboard,\n stopDashboard,\n getDashboardUrl,\n jobs: codeMode?.jobs,\n postInfo: (text: string) => log.pushInfo(text),\n postDoctor: (checks) => log.showDoctor(checks),\n postUsage: (args) => log.showUsageVerbose(args),\n postKeys: (args) =>\n log.pushTip({\n topic: args.topic,\n sections: args.sections,\n footer: args.footer,\n oneTime: false,\n }),\n dispatch: agentStore.dispatch,\n reloadHooks: () => {\n const fresh = loadHooks({ projectRoot: codeMode ? currentRootDir : undefined });\n setHookList(fresh);\n return fresh.length;\n },\n switchCwd: codeMode?.reregisterTools\n ? (newPath: string) => {\n const resolved = resolve(newPath);\n let stat: ReturnType<typeof statSync>;\n try {\n stat = statSync(resolved);\n } catch (err) {\n return { ok: false, info: `/cwd: ${(err as Error).message}` };\n }\n if (!stat.isDirectory()) {\n return { ok: false, info: `/cwd: ${resolved} is not a directory` };\n }\n codeMode.reregisterTools?.(resolved);\n setCurrentRootDir(resolved);\n const fresh = loadHooks({ projectRoot: resolved });\n setHookList(fresh);\n const reBootstrap = codeMode.reBootstrapSemantic;\n if (reBootstrap) {\n void reBootstrap(resolved).then(\n (r) => {\n log.pushInfo(\n r.enabled\n ? `▸ semantic_search re-pointed at ${resolved}`\n : `▸ semantic_search disabled (no compatible index in ${resolved})`,\n );\n },\n (err) => {\n log.pushInfo(\n `▸ semantic_search re-bootstrap failed: ${(err as Error).message}`,\n );\n },\n );\n }\n return { ok: true, info: `▸ workspace switched to ${resolved}` };\n }\n : undefined,\n reloadMcp: mcpRuntime\n ? async () => {\n const r = await mcpRuntime.reloadFromConfig(loop);\n setLiveMcpServers(r.summaries);\n return r;\n }\n : undefined,\n latestVersion,\n refreshLatestVersion,\n models,\n refreshModels,\n });\n if (result.openSessionsPicker) {\n setSessionsPickerList(listSessionsForWorkspace(currentRootDir));\n setPendingSessionsPicker(true);\n pushHistory(text);\n return;\n }\n if (result.openCheckpointPicker) {\n if (!codeMode) {\n log.pushInfo(t(\"app.restoreCodeOnly\"));\n pushHistory(text);\n return;\n }\n setCheckpointPickerList([...listCheckpoints(currentRootDir)].reverse());\n setPendingCheckpointPicker(true);\n pushHistory(text);\n return;\n }\n if (result.openMcpHub) {\n setPendingMcpHub({ tab: result.openMcpHub.tab });\n pushHistory(text);\n return;\n }\n if (result.openModelPicker) {\n setPendingModelPicker(true);\n pushHistory(text);\n return;\n }\n if (result.openArgPickerFor) {\n pushHistory(text);\n setInput(`/${result.openArgPickerFor} `);\n return;\n }\n if (result.replayPlan) {\n const rp = result.replayPlan;\n const titleSuffix = rp.summary ? ` — ${rp.summary}` : \"\";\n const done = new Set(rp.completedStepIds);\n setPendingReplayViewer({\n viewerKind: \"replay-plan\",\n title: `Replay #${rp.index}/${rp.total} · ${rp.relativeTime}${titleSuffix}`,\n body: rp.body,\n steps: rp.steps.map((s) => ({\n id: s.id,\n title: s.title,\n status: done.has(s.id) ? \"done\" : \"queued\",\n })),\n meta: rp.archiveBasename,\n });\n }\n const outcome = applySlashResult(result, {\n log,\n stdoutWrite: (chunk) => stdout?.write(chunk),\n pendingEdits,\n syncPendingCount,\n session: session ?? null,\n codeModeOn: !!codeMode,\n isLoopActive,\n stopLoop,\n quitProcess,\n pushHistory,\n text,\n });\n if (outcome.kind === \"resubmit\") {\n text = outcome.text;\n } else {\n return;\n }\n }\n\n // UserPromptSubmit hooks. Exit code 2 from any matching hook\n // drops the message entirely (the user's text never reaches\n // the model). Other non-zero exits surface as warning rows but\n // the prompt still goes through. We render every non-pass\n // outcome's stderr inline so a \"blocked\" choice has a visible\n // explanation.\n if (hookList.some((h) => h.event === \"UserPromptSubmit\")) {\n const promptReport = await runHooks({\n hooks: hookList,\n payload: { event: \"UserPromptSubmit\", cwd: currentRootDir, prompt: text },\n });\n for (const o of promptReport.outcomes) {\n if (o.decision === \"pass\") continue;\n log.pushWarning(t(\"app.hookUserPromptSubmit\"), formatHookOutcomeMessage(o));\n }\n if (promptReport.blocked) return;\n }\n\n // Large pastes (stack traces, log dumps, file contents) get a\n // collapsed preview in scrollback; the model still receives the full\n // text below via modelInput.\n pushHistory(text);\n const pasteDisplay = formatLongPaste(text);\n const userId = log.pushUser(pasteDisplay.displayText);\n broadcastDashboardEvent({ kind: \"user\", id: userId, text });\n if (session) {\n const existing = loadSessionMeta(session);\n const patch: Parameters<typeof patchSessionMeta>[1] = {};\n if (!existing.summary) patch.summary = text.replace(/\\s+/g, \" \").slice(0, 80);\n if (!existing.branch) patch.branch = detectGitBranch(currentRootDir);\n if (!existing.workspace) patch.workspace = currentRootDir;\n if (Object.keys(patch).length > 0) patchSessionMeta(session, patch);\n }\n\n const assistantId = `a-${Date.now()}`;\n const streamRef: StreamingState = { id: assistantId, text: \"\", reasoning: \"\" };\n const contentBuf = { current: \"\" };\n const reasoningBuf = { current: \"\" };\n const translator = new TurnTranslator(log);\n // Coalesces tool_call_delta events into one re-render per flush tick.\n const toolCallBuildBuf: {\n current: {\n name: string;\n chars: number;\n index?: number;\n readyCount?: number;\n } | null;\n } = {\n current: null,\n };\n\n setBusy(true);\n abortedThisTurn.current = false;\n // Seal the in-progress history entry so this turn's edits open\n // a new one — prior turns are preserved intact for /history and\n // `/undo` to walk back through independently.\n if (codeMode) sealCurrentEntry();\n // Reset per-turn edit policy so \"apply-rest-of-turn\" from the\n // previous turn doesn't carry over silently. User expects each\n // new prompt to start with the normal review gate re-armed.\n turnEditPolicyRef.current = \"ask\";\n // Pro badge state: if /pro was armed, this turn consumes it; the\n // loop emits a \"⇧ /pro armed\" warning we'll catch below. Clear\n // the armed mirror so the badge flips to \"escalated\" (via the\n // warning handler) rather than staying at \"armed\" during the\n // actual run.\n if (proArmed) {\n setProArmed(false);\n setTurnOnPro(true);\n } else {\n setTurnOnPro(false);\n }\n\n const flush = () => {\n if (!contentBuf.current && !reasoningBuf.current && !toolCallBuildBuf.current) return;\n translator.flushBuffers(reasoningBuf.current, contentBuf.current, loop.currentCallModel);\n streamRef.text += contentBuf.current;\n streamRef.reasoning += reasoningBuf.current;\n if (toolCallBuildBuf.current) {\n streamRef.toolCallBuild = toolCallBuildBuf.current;\n }\n contentBuf.current = \"\";\n reasoningBuf.current = \"\";\n toolCallBuildBuf.current = null;\n };\n // In PLAIN mode the streaming row is suppressed, so flushing into\n // streamRef does no visible work — skip the interval entirely.\n const timer = PLAIN_UI ? null : setInterval(flush, FLUSH_INTERVAL_MS);\n\n // Expand `@path/to/file.ts` mentions in code mode: the model\n // gets the inlined content appended under a \"Referenced files\"\n // block; the Historical row above keeps the user's verbatim text\n // so the display doesn't balloon.\n let modelInput = text;\n if (codeMode) {\n const expanded = expandAtMentions(text, currentRootDir);\n if (expanded.expansions.length > 0) {\n modelInput = expanded.text;\n const inlined = expanded.expansions\n .filter((ex) => ex.ok)\n .map((ex) => {\n if (ex.isDirectory) {\n const trunc = ex.truncated ? \"+\" : \"\";\n return `${ex.path}/ (${ex.entries ?? 0}${trunc} entries)`;\n }\n return `${ex.path} (${(ex.bytes ?? 0).toLocaleString()} bytes)`;\n });\n const skipped = expanded.expansions\n .filter((ex) => !ex.ok)\n .map((ex) => `${ex.path} (${ex.skip})`);\n const parts: string[] = [];\n if (inlined.length > 0) parts.push(`inlined ${inlined.join(\", \")}`);\n if (skipped.length > 0) parts.push(`skipped ${skipped.join(\", \")}`);\n if (parts.length > 0) log.pushInfo(t(\"app.atMentions\", { parts: parts.join(\"; \") }));\n }\n }\n // Expand `@http(s)://...` URL mentions. Available in any mode (chat\n // OR code) since fetching a URL doesn't need a sandbox root. Awaits\n // the network sequentially across URLs — for a typical 1-2 URLs in\n // a prompt this is fine; if a user pastes 10 URLs the latency adds\n // up but their prompt is also already huge.\n if (/(?:^|\\s)@https?:\\/\\//.test(text)) {\n try {\n const urlExpanded = await expandAtUrls(modelInput, {\n fetcher: webFetch,\n cache: atUrlCache.current,\n });\n if (urlExpanded.expansions.length > 0) {\n modelInput = urlExpanded.text;\n const inlined = urlExpanded.expansions\n .filter((ex) => ex.ok)\n .map((ex) => {\n const tag = ex.title ? `${ex.title} (${ex.url})` : ex.url;\n const trunc = ex.truncated ? \" · truncated\" : \"\";\n return `${tag} · ${(ex.chars ?? 0).toLocaleString()} chars${trunc}`;\n });\n const skipped = urlExpanded.expansions\n .filter((ex) => !ex.ok)\n .map((ex) => `${ex.url} (${ex.skip ?? \"fetch-error\"})`);\n const parts: string[] = [];\n if (inlined.length > 0) parts.push(`inlined ${inlined.join(\"; \")}`);\n if (skipped.length > 0) parts.push(`skipped ${skipped.join(\"; \")}`);\n if (parts.length > 0) log.pushInfo(t(\"app.atUrl\", { parts: parts.join(\"; \") }));\n }\n } catch (err) {\n // expandAtUrls itself only throws on misconfiguration (no\n // fetcher). Per-URL failures are surfaced via the skip path.\n log.pushWarning(t(\"app.atUrlFailed\"), (err as Error).message);\n }\n }\n\n try {\n for await (const ev of loop.step(modelInput)) {\n writeTranscript(ev);\n // Mirror to the kernel event log sidecar. Pure passthrough —\n // Eventizer holds the small state (turn boundary detection +\n // tool callId correlation) needed to translate LoopEvent\n // shape into typed Event variants. Sink + eventizer share the\n // App's lifetime; nothing reads the artifact yet (future\n // replay / projection consumers will).\n {\n const sink = eventSinkRef.current;\n const eventizer = eventizerRef.current;\n if (sink && eventizer) {\n const ctx = {\n model: ev.stats?.model ?? loop.model ?? model,\n prefixHash,\n reasoningEffort: loop.reasoningEffort ?? \"max\",\n };\n for (const out of eventizer.consume(ev, ctx)) sink.append(out);\n }\n }\n if (eventSubscribersRef.current.size > 0) {\n const dashMsg = loopEventToDashboard(ev, { assistantId });\n if (dashMsg) broadcastDashboardEvent(dashMsg);\n }\n // Status lines are transient — any primary event (streaming\n // starts, a tool fires, etc.) means whatever we were waiting\n // FOR has now arrived, so drop the hint. We do this uniformly\n // at the top of the loop body for every role except \"status\"\n // itself (which SETS the line).\n if (ev.role !== \"status\") {\n setStatusLine((cur) => (cur ? null : cur));\n }\n if (ev.role === \"status\") {\n setStatusLine(ev.content);\n } else if (ev.role === \"assistant_delta\") {\n if (ev.content) contentBuf.current += ev.content;\n if (ev.reasoningDelta) reasoningBuf.current += ev.reasoningDelta;\n } else if (ev.role === \"tool_call_delta\") {\n if (ev.toolName) {\n toolCallBuildBuf.current = {\n name: ev.toolName,\n chars: ev.toolCallArgsChars ?? 0,\n index: ev.toolCallIndex,\n readyCount: ev.toolCallReadyCount,\n };\n }\n } else if (ev.role === \"assistant_final\") {\n handleAssistantFinal(ev, {\n flush,\n translator,\n streamRef,\n contentBuf,\n reasoningBuf,\n toolCallBuildBuf,\n assistantId,\n setSummary,\n log,\n broadcastDashboardEvent,\n getSessionSummary: () => loop.stats.summary(),\n session: session ?? null,\n assistantIterCounter,\n codeModeOn: !!codeMode,\n currentRootDir,\n editModeRef,\n recordEdit,\n armUndoBanner,\n pendingEdits,\n syncPendingCount,\n ctxMax: DEEPSEEK_CONTEXT_TOKENS[loop.model] ?? DEFAULT_CONTEXT_TOKENS,\n });\n if (session) {\n const m = loadSessionMeta(session);\n const cost = (m.totalCostUsd ?? 0) + (ev.stats?.cost ?? 0);\n const turn = (m.turnCount ?? 0) + 1;\n const currency = walletCurrencyRef.current;\n const u = ev.stats?.usage;\n const cacheHitTokens = (m.cacheHitTokens ?? 0) + (u?.promptCacheHitTokens ?? 0);\n const cacheMissTokens = (m.cacheMissTokens ?? 0) + (u?.promptCacheMissTokens ?? 0);\n patchSessionMeta(session, {\n totalCostUsd: cost,\n turnCount: turn,\n cacheHitTokens,\n cacheMissTokens,\n ...(u?.promptTokens ? { lastPromptTokens: u.promptTokens } : {}),\n ...(currency ? { balanceCurrency: currency } : {}),\n });\n }\n } else if (ev.role === \"tool_start\") {\n handleToolStart(ev, {\n setOngoingTool,\n setToolProgress,\n toolStartedAtRef,\n translator,\n codeModeOn: !!codeMode,\n recordRecentFile,\n });\n } else if (ev.role === \"tool\") {\n handleToolEvent(ev, {\n flush,\n translator,\n setOngoingTool,\n setToolProgress,\n toolStartedAtRef,\n setPendingShell,\n setPendingPlan,\n setPendingRevision,\n setPendingChoice,\n planStepsRef,\n completedStepIdsRef,\n planBodyRef,\n planSummaryRef,\n persistPlanState,\n log,\n session: session ?? null,\n codeModeOn: !!codeMode,\n });\n } else if (ev.role === \"error\") {\n handleErrorEvent(ev, { log });\n } else if (ev.role === \"warning\") {\n handleWarningEvent(ev, { log, setTurnOnPro });\n }\n }\n flush();\n\n // Stop hooks — turn has ended (or aborted). Block decisions are\n // meaningless past this point so we treat every non-pass as a\n // warning. Natural place for \"after every turn, run the\n // formatter / lint / tests\" automation.\n if (hookList.some((h) => h.event === \"Stop\")) {\n const stopReport = await runHooks({\n hooks: hookList,\n payload: {\n event: \"Stop\",\n cwd: currentRootDir,\n lastAssistantText: streamRef.text,\n turn: loop.stats.summary().turns,\n },\n });\n for (const o of stopReport.outcomes) {\n if (o.decision === \"pass\") continue;\n log.pushWarning(t(\"app.hookStop\"), formatHookOutcomeMessage(o));\n }\n }\n } finally {\n if (timer) clearInterval(timer);\n // Esc aborted the turn — close any in-flight cards (streaming /\n // reasoning / tool / branch) so they leave the live region. Without\n // this, stranded done=false cards stick in CardStream's live tail.\n if (abortedThisTurn.current) {\n translator.abort();\n }\n setOngoingTool(null);\n setToolProgress(null);\n setStatusLine(null);\n setSummary(loop.stats.summary());\n setBusy(false);\n // Clear pro-on-turn badge; armed-for-next-turn already cleared\n // at turn start when it was consumed.\n setTurnOnPro(false);\n // Refresh balance lazily — don't block the return.\n refreshBalance();\n }\n },\n [\n busy,\n codeApply,\n codeDiscard,\n codeHistory,\n codeMode,\n codeShowEdit,\n codeUndo,\n currentRootDir,\n quitProcess,\n hookList,\n loop,\n latestVersion,\n mcpSpecs,\n liveMcpServers,\n models,\n planMode,\n session,\n slashSelected,\n atState,\n atSelected,\n pickAtMention,\n recordRecentFile,\n slashArgMatches,\n slashArgContext,\n slashArgSelected,\n pickSlashArg,\n togglePlanMode,\n writeTranscript,\n recordEdit,\n armUndoBanner,\n sealCurrentEntry,\n editMode,\n syncPendingCount,\n refreshBalance,\n refreshLatestVersion,\n refreshModels,\n proArmed,\n persistPlanState,\n stdout,\n stopLoop,\n startLoop,\n getLoopStatus,\n isLoopActive,\n isLoopFiring,\n clearFiringFlag,\n startWalkthrough,\n startDashboard,\n stopDashboard,\n getDashboardUrl,\n broadcastDashboardEvent,\n touchedPaths,\n model,\n prefixHash,\n log,\n agentStore.dispatch,\n mcpRuntime,\n pushHistory,\n resetCursor,\n ],\n );\n\n // Mirror the latest handleSubmit so the /loop timer (set up below)\n // calls the freshest closure on each firing — config changes during\n // the loop (model, mode, etc.) take effect immediately.\n useEffect(() => {\n handleSubmitRef.current = handleSubmit;\n }, [handleSubmit]);\n\n /**\n * ShellConfirm callback. Resolves the PauseGate so the\n * blocked tool function can proceed. The tool handles running the\n * command (or throwing on deny) — no synthetic user message needed.\n */\n const handleShellConfirm = useCallback(\n (choice: ShellConfirmChoice, denyContext?: string) => {\n const pending = pendingShell;\n if (!pending || !codeMode) return;\n const { id, command: cmd, kind } = pending;\n setPendingShell(null);\n\n if (choice === \"deny\") {\n const context = denyContext ? ` because: ${denyContext}` : \"\";\n log.pushInfo(t(\"app.denied\", { cmd, context }));\n pauseGate.resolve(id, { type: \"deny\", denyContext });\n } else if (choice === \"always_allow\") {\n const prefix = derivePrefix(cmd);\n log.pushInfo(t(\"app.alwaysAllowed\", { prefix, dir: currentRootDir }));\n pauseGate.resolve(id, { type: \"always_allow\", prefix });\n } else {\n log.pushInfo(\n kind === \"run_background\"\n ? t(\"app.startingBackground\", { cmd })\n : t(\"app.runningCommand\", { cmd }),\n );\n pauseGate.resolve(id, { type: \"run_once\" });\n }\n },\n [pendingShell, codeMode, currentRootDir, log],\n );\n\n /** Holds the PauseGate request id for the current modal so\n * handlePlanConfirm / handleCheckpointResponse / etc. can resolve it. */\n const pendingGateIdRef = useRef<number | null>(null);\n\n // Drain the shell-confirm queue after the in-flight turn tears down.\n // React closure staleness means handleShellConfirm can't just await\n // the abort itself — this effect is the reliable edge detector.\n useEffect(() => {\n if (!busy && queuedSubmit !== null) {\n const text = queuedSubmit;\n setQueuedSubmit(null);\n void handleSubmit(text);\n }\n }, [busy, queuedSubmit, handleSubmit]);\n\n /**\n * PlanConfirm callback. Three outcomes, all ending with a synthetic\n * user message so the model sees the verdict on its next turn:\n * - approve → exit plan mode, tell the model to implement now.\n * - refine → stay in plan mode, tell the model to revise.\n * - cancel → exit plan mode, tell the model to drop the plan.\n * Mirrors handleShellConfirm's busy-queue dance — if the turn is\n * still streaming \"plan submitted, waiting\" chatter when the user\n * picks, we abort it and queue the synthetic for the effect above.\n *\n * `approve` is also callable with no pending plan (via the\n * `/apply-plan` slash fallback, used when the model wrote a plan in\n * assistant text instead of calling submit_plan). In that case we\n * just flip plan mode off and push the implement-now message.\n */\n const handlePlanConfirm = useCallback(\n async (choice: PlanConfirmChoice) => {\n const hadPendingPlan = pendingPlan !== null;\n if (!hadPendingPlan && choice !== \"approve\") {\n // Refine / Cancel without a pending plan is a no-op; only the\n // /apply-plan fallback makes sense without one.\n return;\n }\n\n if (choice === \"refine\" || choice === \"approve\") {\n if (pendingPlan) {\n setStagedInput({ plan: pendingPlan, mode: choice });\n setPendingPlan(null);\n } else if (choice === \"approve\") {\n setStagedInput({ plan: \"\", mode: \"approve\" });\n }\n return;\n }\n\n if (choice === \"revise\") {\n if (pendingPlan) {\n setPendingReviseEditor(pendingPlan);\n setPendingPlan(null);\n }\n return;\n }\n\n // Cancel (\"reject\"). Open the same staged input as approve/refine so\n // the user can tell the model *why* — symmetric with the deny-tool\n // \"press Tab to add reason\" pattern. Empty Enter still cancels cleanly.\n if (pendingPlan) {\n setStagedInput({ plan: pendingPlan, mode: \"reject\" });\n setPendingPlan(null);\n }\n },\n [pendingPlan],\n );\n\n // Ref-wrapped stable alias. `handlePlanConfirm` has deps that churn\n // every turn (busy toggles while the model is still streaming its\n // wrap-up) — passing it directly to `React.memo(PlanConfirm)` breaks\n // the memo's shallow prop compare, so even without the ticker the\n // picker re-rendered on every parent state change. The ref keeps the\n // identity stable across the whole picker lifetime; the callback\n // itself always reads the latest closure via `.current`.\n const handlePlanConfirmRef = useRef(handlePlanConfirm);\n useEffect(() => {\n handlePlanConfirmRef.current = handlePlanConfirm;\n }, [handlePlanConfirm]);\n const stableHandlePlanConfirm = useCallback(\n async (choice: PlanConfirmChoice) => handlePlanConfirmRef.current(choice),\n [],\n );\n\n /**\n * Fired when the user submits feedback from the inline input. The\n * staged `mode` decides whether this is a refine or approve: refine\n * stays in plan mode and asks the model to revise; approve exits\n * plan mode and pushes the implement synthetic, with any user\n * guidance (answers to open questions, last-minute preferences)\n * included verbatim.\n */\n const handleStagedInputSubmit = useCallback(\n async (\n feedback: string,\n override?: { plan: string; mode: \"refine\" | \"approve\" | \"reject\" },\n ) => {\n // `override` lets the web `/dashboard` chat-bridge drive the same\n // dispatch path without first having to setStagedInput() (which\n // is async and would race the read below). When the override is\n // present we also clear pendingPlan ourselves since web flow\n // doesn't go through the picker → input two-step.\n const staged = override ?? stagedInput;\n if (override) {\n setPendingPlan(null);\n } else {\n setStagedInput(null);\n }\n if (!staged) return;\n const trimmed = feedback.trim();\n\n let synthetic: string;\n let marker: string;\n if (staged.mode === \"approve\") {\n togglePlanMode(false);\n // Materialize the approved plan as an \"active\" card so PlanLiveRow\n // can dock it at the bottom — without this dispatch, no card with\n // variant: \"active\" exists and the live strip stays empty.\n const approvedSteps = planStepsRef.current;\n if (approvedSteps && approvedSteps.length > 0) {\n completedStepIdsRef.current = new Set();\n log.showPlan({\n title: planSummaryRef.current ?? \"plan\",\n steps: approvedSteps.map((s) => ({\n id: s.id,\n title: s.title,\n status: \"queued\" as const,\n })),\n variant: \"active\",\n });\n persistPlanState();\n }\n if (trimmed) {\n synthetic = `The plan above has been approved. Implement it now. You are out of plan mode — use edit_file / write_file / run_command as needed.\\n\\nUser's additional instructions / answers to your open questions:\\n\\n${trimmed}\\n\\nFactor these in before the first edit. Stick to the plan unless you discover a concrete reason to deviate; if you do, tell me and wait for a response.`;\n marker = `▸ plan approved + instructions — ${trimmed.length > 50 ? `${trimmed.slice(0, 50)}…` : trimmed}`;\n } else {\n synthetic =\n \"The plan above has been approved. Implement it now. You are out of plan mode — use edit_file / write_file / run_command as needed. If the plan listed open questions and I didn't answer them, default to the safest interpretation and call them out in your first reply. Don't fabricate preferences — if a question is truly unanswerable without me, stop and ask.\";\n marker = \"▸ plan approved — implementing\";\n }\n } else if (staged.mode === \"reject\") {\n // Drop the structured plan state — the user said this path is wrong,\n // no point keeping it around for resume.\n planStepsRef.current = null;\n completedStepIdsRef.current = new Set();\n planBodyRef.current = null;\n planSummaryRef.current = null;\n persistPlanState();\n togglePlanMode(false);\n agentStore.dispatch({ type: \"plan.drop\" });\n if (trimmed) {\n synthetic = `The plan was rejected. User's reason / what they actually want:\\n\\n${trimmed}\\n\\nDrop the proposed plan entirely. Use this guidance to understand what the user is after — ask follow-up questions if anything is still unclear, otherwise propose a different plan that addresses it.`;\n marker = `▸ plan rejected — ${trimmed.length > 50 ? `${trimmed.slice(0, 50)}…` : trimmed}`;\n } else {\n synthetic =\n \"The plan was cancelled. Drop it entirely. Ask me what I actually want before proposing another plan or making any changes.\";\n marker = \"▸ plan cancelled\";\n }\n } else {\n // refine\n if (trimmed) {\n synthetic = `The plan needs refinement. User feedback / answers:\\n\\n${trimmed}\\n\\nStay in plan mode — address the feedback (explore more if needed), then submit an improved submit_plan call. Don't propose a near-identical plan unless you explain why the feedback doesn't apply.`;\n marker = `▸ refining — ${trimmed.length > 50 ? `${trimmed.slice(0, 50)}…` : trimmed}`;\n } else {\n synthetic =\n \"The plan needs refinement, but the user didn't give specifics. Ask them one or two concrete questions — scope, approach, file boundaries, or the risks you flagged — then wait for their answer before submitting an updated plan.\";\n marker = \"▸ refining — asking the model to clarify\";\n }\n }\n\n // Resolve the PauseGate so the blocked submit_plan tool function\n // can return and the model sees the verdict without a synthetic message.\n const gateId = pendingGateIdRef.current;\n if (gateId !== null) {\n if (staged.mode === \"approve\") {\n pauseGate.resolve(gateId, { type: \"approve\" });\n } else if (staged.mode === \"reject\") {\n pauseGate.resolve(gateId, { type: \"cancel\" });\n } else {\n pauseGate.resolve(gateId, { type: \"refine\" });\n }\n }\n },\n [stagedInput, togglePlanMode, persistPlanState, agentStore, log],\n );\n // Ref-mirror so startDashboard's resolvePlanConfirm closure can call\n // the latest function — handleStagedInputSubmit's deps churn on every\n // stagedInput change, which would freeze a captured reference.\n const handleStagedInputSubmitRef = useRef(handleStagedInputSubmit);\n useEffect(() => {\n handleStagedInputSubmitRef.current = handleStagedInputSubmit;\n }, [handleStagedInputSubmit]);\n\n /** Esc on the inline input — restore the picker without resuming. */\n const handleStagedInputCancel = useCallback(() => {\n if (stagedInput?.plan) setPendingPlan(stagedInput.plan);\n setStagedInput(null);\n }, [stagedInput]);\n\n /**\n * ChoiceConfirm callback. Pick fires a synthetic \"user picked <id>\"\n * and lets the model continue down that branch. Custom defers to a\n * free-form input. Cancel drops the question entirely.\n */\n const handleChoiceConfirm = useCallback(\n async (choice: ChoiceConfirmChoice) => {\n const snap = pendingChoice;\n if (!snap) return;\n setPendingChoice(null);\n if (choice.kind === \"custom\") {\n setStagedChoiceCustom(snap);\n return;\n }\n const gateId = pendingGateIdRef.current;\n if (choice.kind === \"cancel\") {\n if (gateId !== null) pauseGate.resolve(gateId, { type: \"cancel\" });\n return;\n }\n const picked = snap.options.find((o) => o.id === choice.optionId);\n if (gateId !== null) {\n pauseGate.resolve(gateId, { type: \"pick\", optionId: choice.optionId });\n }\n },\n [pendingChoice],\n );\n\n // Ref-wrap to keep ChoiceConfirm's React.memo from re-rendering on\n // every parent tick (same pattern as PlanConfirm / CheckpointConfirm).\n // Stable refs over the modal handlers — used by the web chat-bridge\n // to drive the same code path as a TUI button click without\n // dragging the handlers (and their ever-shifting deps) into\n // startDashboard's useCallback closure.\n const handleShellConfirmRef = useRef(handleShellConfirm);\n useEffect(() => {\n handleShellConfirmRef.current = handleShellConfirm;\n }, [handleShellConfirm]);\n // Listen for pause requests from tool functions (via PauseGate).\n // Dispatches to the correct modal based on request.kind.\n // Note: stable deps (none) — codeMode changes don't re-trigger,\n // the listener checks nothing from closure except setState setters.\n useEffect(() => {\n return pauseGate.on((request) => {\n const payload = request.payload as Record<string, unknown>;\n pendingGateIdRef.current = request.id;\n\n switch (request.kind) {\n case \"run_command\":\n case \"run_background\":\n setPendingShell({\n id: request.id,\n command: (payload as { command: string }).command,\n kind: request.kind,\n });\n break;\n case \"plan_proposed\": {\n const p = payload as { plan: string; steps?: PlanStep[]; summary?: string };\n setPendingPlan(p.plan);\n planStepsRef.current = p.steps ?? null;\n planSummaryRef.current = p.summary ?? null;\n planBodyRef.current = p.plan;\n break;\n }\n case \"plan_checkpoint\": {\n const p = payload as {\n stepId: string;\n title?: string;\n result: string;\n notes?: string;\n };\n // completed/total come from planStepsRef — don't have them via gate\n const completed = completedStepIdsRef.current.size;\n const total = planStepsRef.current?.length ?? 0;\n // auto/yolo: user opted out of checkpoints — resolve \"continue\"\n // without prompting. Per-step rollback snapshot still runs so\n // /restore granularity is preserved.\n if (editModeRef.current === \"auto\" || editModeRef.current === \"yolo\") {\n handleAutoCheckpointContinueRef.current(p.stepId, p.title);\n pauseGate.resolve(request.id, { type: \"continue\" });\n break;\n }\n setPendingCheckpoint({\n stepId: p.stepId,\n title: p.title,\n completed,\n total,\n });\n break;\n }\n case \"plan_revision\": {\n const p = payload as {\n reason: string;\n remainingSteps: PlanStep[];\n summary?: string;\n };\n setPendingRevision({\n reason: p.reason,\n remainingSteps: p.remainingSteps,\n summary: p.summary,\n });\n break;\n }\n case \"choice\": {\n const p = payload as {\n question: string;\n options: unknown[];\n allowCustom: boolean;\n };\n setPendingChoice({\n question: p.question,\n options: p.options as ChoiceOption[],\n allowCustom: p.allowCustom,\n });\n break;\n }\n }\n });\n }, []);\n // Ref-mirror of pendingPlan so the web's resolvePlanConfirm callback\n // (registered in startDashboard, frozen at boot) can read the live\n // body when the web resolves an approve/refine.\n const pendingPlanRef = useRef<string | null>(null);\n useEffect(() => {\n pendingPlanRef.current = pendingPlan;\n }, [pendingPlan]);\n const handleChoiceConfirmRef = useRef(handleChoiceConfirm);\n useEffect(() => {\n handleChoiceConfirmRef.current = handleChoiceConfirm;\n }, [handleChoiceConfirm]);\n const stableHandleChoiceConfirm = useCallback(\n async (choice: ChoiceConfirmChoice) => handleChoiceConfirmRef.current(choice),\n [],\n );\n\n /**\n * Checkpoint picker callback. Resolves the PauseGate so the blocked\n * mark_step_complete tool function can return (or throw).\n */\n const handleCheckpointConfirm = useCallback(\n (choice: \"continue\" | \"revise\" | \"stop\") => {\n const snap = pendingCheckpoint;\n if (!snap) return;\n setPendingCheckpoint(null);\n const gid = pendingGateIdRef.current;\n if (choice === \"revise\") {\n // Don't resolve the gate yet — wait for the staged feedback input\n // and let handleCheckpointReviseSubmit resolve with the feedback text.\n setStagedCheckpointRevise(snap);\n return;\n }\n // Auto file-snapshot per plan step\n if (codeMode && choice === \"continue\") {\n const paths = touchedPaths();\n if (paths.length > 0) {\n try {\n const cpName = snap.title ? `${snap.stepId} · ${snap.title}` : snap.stepId;\n const meta = createCheckpoint({\n rootDir: codeMode.rootDir,\n name: cpName.slice(0, 60),\n paths,\n source: \"auto-pre-restore\",\n });\n log.pushInfo(\n t(\"app.checkpointSaved\", {\n id: meta.id,\n count: meta.fileCount,\n s: meta.fileCount === 1 ? \"\" : \"s\",\n }),\n );\n } catch {\n /* best-effort */\n }\n }\n }\n if (gid !== null) {\n pauseGate.resolve(gid, {\n type: choice === \"continue\" ? \"continue\" : \"stop\",\n });\n }\n const label = snap.title ? `${snap.stepId} · ${snap.title}` : snap.stepId;\n const counter = snap.total > 0 ? ` (${snap.completed}/${snap.total})` : \"\";\n log.pushInfo(\n choice === \"continue\"\n ? t(\"app.continuingAfter\", { label, counter })\n : t(\"app.planStoppedAt\", { label, counter }),\n );\n },\n [pendingCheckpoint, codeMode, touchedPaths, log],\n );\n\n const handleCheckpointConfirmRef = useRef(handleCheckpointConfirm);\n useEffect(() => {\n handleCheckpointConfirmRef.current = handleCheckpointConfirm;\n }, [handleCheckpointConfirm]);\n\n const handleAutoCheckpointContinue = useCallback(\n (stepId: string, title?: string) => {\n if (codeMode) {\n const paths = touchedPaths();\n if (paths.length > 0) {\n try {\n const cpName = title ? `${stepId} · ${title}` : stepId;\n createCheckpoint({\n rootDir: codeMode.rootDir,\n name: cpName.slice(0, 60),\n paths,\n source: \"auto-pre-restore\",\n });\n } catch {\n /* best-effort */\n }\n }\n }\n const completed = completedStepIdsRef.current.size;\n const total = planStepsRef.current?.length ?? 0;\n const label = title ? `${stepId} · ${title}` : stepId;\n const counter = total > 0 ? ` (${completed}/${total})` : \"\";\n log.pushInfo(t(\"app.continuingAfter\", { label, counter }));\n },\n [codeMode, touchedPaths, log],\n );\n const handleAutoCheckpointContinueRef = useRef(handleAutoCheckpointContinue);\n useEffect(() => {\n handleAutoCheckpointContinueRef.current = handleAutoCheckpointContinue;\n }, [handleAutoCheckpointContinue]);\n const stableHandleCheckpointConfirm = useCallback(\n (choice: \"continue\" | \"revise\" | \"stop\") => handleCheckpointConfirmRef.current(choice),\n [],\n );\n\n /** Revise feedback submitted — resolves the gate with feedback. */\n const handleCheckpointReviseSubmit = useCallback(\n (feedback: string, snapOverride?: { stepId: string; title?: string }) => {\n const snap = snapOverride;\n setStagedCheckpointRevise(null);\n if (!snap) return;\n const label = snap.title ? `${snap.stepId} · ${snap.title}` : snap.stepId;\n const trimmed = feedback.trim();\n const gid = pendingGateIdRef.current;\n if (gid !== null) {\n pauseGate.resolve(\n gid,\n trimmed ? { type: \"revise\", feedback: trimmed } : { type: \"revise\" },\n );\n }\n const marker = trimmed\n ? t(\"app.revisingAfter\", {\n label,\n feedback: trimmed.length > 50 ? `${trimmed.slice(0, 50)}…` : trimmed,\n })\n : t(\"app.continuingAfter\", { label, counter: \"\" });\n log.pushInfo(marker);\n },\n [log],\n );\n\n const handleCheckpointReviseCancel = useCallback(() => {\n const snap = stagedCheckpointRevise;\n setStagedCheckpointRevise(null);\n if (snap) setPendingCheckpoint(snap);\n }, [stagedCheckpointRevise]);\n\n // Ref-mirrors so the web's resolveXxx callbacks (registered in\n // startDashboard, frozen at boot) keep calling the latest handler.\n const handleCheckpointReviseSubmitRef = useRef(handleCheckpointReviseSubmit);\n useEffect(() => {\n handleCheckpointReviseSubmitRef.current = handleCheckpointReviseSubmit;\n }, [handleCheckpointReviseSubmit]);\n\n /** Custom free-form answer submitted — resolves the PauseGate with the typed text. */\n const handleChoiceCustomSubmit = useCallback((answer: string) => {\n setStagedChoiceCustom(null);\n const trimmed = answer.trim();\n const gateId = pendingGateIdRef.current;\n if (gateId !== null) {\n pauseGate.resolve(gateId, { type: \"text\", text: trimmed || \"\" });\n }\n }, []);\n\n /** Esc on the custom input — restore the choice picker. */\n const handleChoiceCustomCancel = useCallback(() => {\n const snap = stagedChoiceCustom;\n setStagedChoiceCustom(null);\n if (snap) setPendingChoice(snap);\n }, [stagedChoiceCustom]);\n\n /**\n * PlanReviseConfirm callback. Accept splices the new remaining\n * steps onto the done prefix and continues. Reject drops the\n * proposal and tells the model to stick with the original plan.\n */\n const handleReviseConfirm = useCallback(\n (choice: ReviseChoice) => {\n const snap = pendingRevision;\n if (!snap) return;\n setPendingRevision(null);\n const gateId = pendingGateIdRef.current;\n if (choice === \"reject\") {\n if (gateId !== null) pauseGate.resolve(gateId, { type: \"rejected\" });\n return;\n }\n // Accept: keep the done-step prefix from the existing plan, replace\n // the rest with the proposed remainingSteps. completedStepIds\n // stays intact — done work isn't undone.\n const completed = completedStepIdsRef.current;\n const oldSteps = planStepsRef.current ?? [];\n const donePrefix = oldSteps.filter((s) => completed.has(s.id));\n const merged: PlanStep[] = [...donePrefix];\n for (const s of snap.remainingSteps) {\n if (completed.has(s.id)) continue; // already done — don't re-queue\n merged.push(s);\n }\n planStepsRef.current = merged;\n persistPlanState();\n // Replace the live active card so PlanLiveRow shows the new tail —\n // existing card's stale ids would fail subsequent step completes.\n agentStore.dispatch({ type: \"plan.drop\" });\n log.showPlan({\n title: planSummaryRef.current ?? \"plan\",\n steps: merged.map((s) => ({\n id: s.id,\n title: s.title,\n status: completed.has(s.id) ? (\"done\" as const) : (\"queued\" as const),\n })),\n variant: \"active\",\n });\n if (gateId !== null) pauseGate.resolve(gateId, { type: \"accepted\" });\n },\n [pendingRevision, persistPlanState, agentStore, log],\n );\n\n // Ref-wrap to keep PlanReviseConfirm's React.memo from re-rendering.\n const handleReviseConfirmRef = useRef(handleReviseConfirm);\n useEffect(() => {\n handleReviseConfirmRef.current = handleReviseConfirm;\n }, [handleReviseConfirm]);\n const stableHandleReviseConfirm = useCallback(\n async (choice: ReviseChoice) => handleReviseConfirmRef.current(choice),\n [],\n );\n\n // Suspend cosmetic animations during modal interactions and idle so\n // a quiescent TUI is byte-stable. PLAIN_UI is the env-flag opt-out\n // for fragile terminals.\n const tickerSuspended = PLAIN_UI || modalOpen || (!busy && !isStreaming);\n\n return (\n <>\n <TickerProvider disabled={tickerSuspended}>\n <ViewportBudgetProvider>\n <Box flexDirection=\"row\" height={stdout?.rows ?? 24}>\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" flexGrow={1}>\n <LiveExpandContext.Provider value={liveExpand}>\n <CardStream\n suppressLive={modalOpen}\n scrollRows={chatScroll.scrollRows}\n onMaxScrollChange={chatScroll.setMaxScroll}\n />\n </LiveExpandContext.Provider>\n {/*\n Welcome card on the empty state. Visible only when nothing\n has happened yet (no past events, nothing in flight, no\n modal up). Removes the \"what do I type?\" friction without\n surviving past the first turn.\n */}\n {!hasConversation && !busy && !isStreaming ? (\n <WelcomeBanner\n inCodeMode={!!codeMode}\n workspaceRoot={codeMode ? currentRootDir : undefined}\n dashboardUrl={dashboardUrl}\n languageVersion={languageVersion}\n />\n ) : null}\n {/*\n Live rows are hidden while the ShellConfirm modal is up — the\n model's concurrent \"please confirm\" stream is noise the user\n doesn't need, and the picker shouldn't fight it for visual\n attention. They come back naturally once the user chooses and\n the next turn begins.\n */}\n {!PLAIN_UI &&\n !pendingShell &&\n !pendingPlan &&\n !pendingReviseEditor &&\n !pendingSessionsPicker &&\n !pendingCheckpointPicker &&\n !pendingMcpHub &&\n !stagedInput &&\n !pendingEditReview &&\n ongoingTool ? (\n <OngoingToolRow tool={ongoingTool} progress={toolProgress} />\n ) : null}\n {!PLAIN_UI &&\n !pendingShell &&\n !pendingPlan &&\n !pendingReviseEditor &&\n !pendingSessionsPicker &&\n !pendingCheckpointPicker &&\n !pendingMcpHub &&\n !stagedInput &&\n !pendingEditReview &&\n subagentActivities.length > 0 ? (\n <SubagentLiveStack activities={subagentActivities} max={3} />\n ) : null}\n {!PLAIN_UI &&\n !pendingShell &&\n !pendingPlan &&\n !pendingReviseEditor &&\n !pendingSessionsPicker &&\n !pendingCheckpointPicker &&\n !pendingMcpHub &&\n !stagedInput &&\n !pendingEditReview &&\n !ongoingTool &&\n statusLine ? (\n <ThinkingRow text={statusLine} />\n ) : null}\n {!PLAIN_UI &&\n undoBanner &&\n !pendingShell &&\n !pendingPlan &&\n !pendingReviseEditor &&\n !pendingSessionsPicker &&\n !pendingCheckpointPicker &&\n !pendingMcpHub &&\n !stagedInput &&\n !pendingEditReview &&\n !pendingChoice &&\n !stagedChoiceCustom &&\n !pendingRevision &&\n !stagedCheckpointRevise &&\n !pendingCheckpoint ? (\n <UndoBanner banner={undoBanner} />\n ) : null}\n {/*\n Belt-and-suspenders fallback: if we're busy but NONE of the\n specific indicators (streaming, ongoingTool, statusLine) is\n visible, something is still happening — show a generic\n \"processing…\" so the user never stares at a silent ticker\n without a label. Catches micro-gaps between events that the\n targeted status lines don't cover.\n */}\n {!PLAIN_UI &&\n !pendingShell &&\n !pendingPlan &&\n !pendingReviseEditor &&\n !pendingSessionsPicker &&\n !pendingCheckpointPicker &&\n !pendingMcpHub &&\n !stagedInput &&\n !pendingEditReview &&\n busy &&\n !isStreaming &&\n !ongoingTool &&\n !statusLine ? (\n <ThinkingRow text=\"processing…\" />\n ) : null}\n {!PLAIN_UI &&\n !pendingShell &&\n !pendingPlan &&\n !pendingReviseEditor &&\n !pendingSessionsPicker &&\n !pendingCheckpointPicker &&\n !pendingMcpHub &&\n !stagedInput &&\n !pendingEditReview ? (\n <PlanLiveRow />\n ) : null}\n <ToastRail />\n </Box>\n {stagedInput ? (\n <PlanRefineInput\n mode={stagedInput.mode}\n onSubmit={handleStagedInputSubmit}\n onCancel={handleStagedInputCancel}\n />\n ) : stagedChoiceCustom ? (\n <PlanRefineInput\n mode=\"choice-custom\"\n onSubmit={handleChoiceCustomSubmit}\n onCancel={handleChoiceCustomCancel}\n />\n ) : stagedCheckpointRevise ? (\n <PlanRefineInput\n mode=\"checkpoint-revise\"\n onSubmit={(text) => handleCheckpointReviseSubmit(text, stagedCheckpointRevise)}\n onCancel={handleCheckpointReviseCancel}\n />\n ) : pendingChoice ? (\n <ChoiceConfirm\n question={pendingChoice.question}\n options={pendingChoice.options}\n allowCustom={pendingChoice.allowCustom}\n onChoose={stableHandleChoiceConfirm}\n />\n ) : pendingRevision ? (\n <PlanReviseConfirm\n reason={pendingRevision.reason}\n oldRemaining={(planStepsRef.current ?? []).filter(\n (s) => !completedStepIdsRef.current.has(s.id),\n )}\n newRemaining={pendingRevision.remainingSteps}\n summary={pendingRevision.summary}\n onChoose={stableHandleReviseConfirm}\n />\n ) : pendingCheckpoint ? (\n <PlanCheckpointConfirm\n stepId={pendingCheckpoint.stepId}\n title={pendingCheckpoint.title}\n completed={pendingCheckpoint.completed}\n total={pendingCheckpoint.total}\n steps={planStepsRef.current ?? undefined}\n completedStepIds={completedStepIdsRef.current}\n onChoose={stableHandleCheckpointConfirm}\n />\n ) : pendingCheckpointPicker ? (\n <CheckpointPicker\n checkpoints={checkpointPickerList}\n workspace={currentRootDir}\n pickerPorts={pickerPorts}\n onChoose={(outcome) => {\n if (outcome.kind === \"quit\") {\n setPendingCheckpointPicker(false);\n return;\n }\n if (outcome.kind === \"restore\") {\n const target = checkpointPickerList.find((c) => c.id === outcome.id);\n setPendingCheckpointPicker(false);\n if (!target) return;\n const result = restoreCheckpoint(currentRootDir, target.id);\n const lines = [\n `▸ restored \"${target.name}\" (${target.id.slice(0, 7)}, ${fmtAgo(target.createdAt)})`,\n ];\n if (result.restored.length > 0) {\n lines.push(\n ` wrote ${result.restored.length} file${result.restored.length === 1 ? \"\" : \"s\"}`,\n );\n }\n if (result.removed.length > 0) {\n lines.push(\n ` removed ${result.removed.length} file${result.removed.length === 1 ? \"\" : \"s\"}`,\n );\n }\n if (result.skipped.length > 0) {\n lines.push(\n ` skipped ${result.skipped.length} file${result.skipped.length === 1 ? \"\" : \"s\"}`,\n );\n }\n log.pushInfo(lines.join(\"\\n\"));\n return;\n }\n if (outcome.kind === \"delete\") {\n const target = checkpointPickerList.find((c) => c.id === outcome.id);\n if (!target) return;\n deleteCheckpoint(currentRootDir, target.id);\n setCheckpointPickerList([...listCheckpoints(currentRootDir)].reverse());\n }\n }}\n />\n ) : pendingSessionsPicker ? (\n <SessionPicker\n sessions={sessionsPickerList}\n workspace={currentRootDir}\n walletCurrency={walletCurrencyRef.current}\n pickerPorts={pickerPorts}\n onChoose={(outcome) => {\n if (outcome.kind === \"open\") {\n setPendingSessionsPicker(false);\n if (onSwitchSession) {\n onSwitchSession(outcome.name);\n } else {\n log.pushInfo(\n `▸ to switch to \"${outcome.name}\", quit and run: reasonix chat --session ${outcome.name}`,\n );\n }\n return;\n }\n if (outcome.kind === \"new\") {\n setPendingSessionsPicker(false);\n if (onSwitchSession) {\n onSwitchSession(undefined);\n } else {\n log.pushInfo(\n \"▸ to start a fresh session, quit and run: reasonix chat (no --session flag)\",\n );\n }\n return;\n }\n if (outcome.kind === \"delete\") {\n deleteSession(outcome.name);\n setSessionsPickerList(listSessionsForWorkspace(currentRootDir));\n return;\n }\n if (outcome.kind === \"rename\") {\n renameSession(outcome.name, outcome.newName);\n setSessionsPickerList(listSessionsForWorkspace(currentRootDir));\n return;\n }\n if (outcome.kind === \"quit\") {\n setPendingSessionsPicker(false);\n }\n }}\n />\n ) : pendingModelPicker ? (\n <ModelPicker\n models={models}\n current={loop.model}\n currentEffort={loop.reasoningEffort}\n currentAutoEscalate={loop.autoEscalate}\n onRefresh={refreshModels}\n onChoose={(outcome) => {\n setPendingModelPicker(false);\n if (outcome.kind === \"select\") {\n loop.configure({ model: outcome.id });\n agentStore.dispatch({ type: \"session.model.change\", model: outcome.id });\n log.pushInfo(`▸ model: ${outcome.id}`);\n return;\n }\n if (outcome.kind === \"preset\") {\n const p = PRESETS[outcome.name];\n loop.configure({\n model: p.model,\n autoEscalate: p.autoEscalate,\n reasoningEffort: p.reasoningEffort,\n });\n agentStore.dispatch({ type: \"session.model.change\", model: p.model });\n try {\n saveReasoningEffort(p.reasoningEffort);\n } catch {\n /* disk full / perms — runtime change still took effect */\n }\n log.pushInfo(`▸ preset: ${outcome.name} · ${p.model}`);\n }\n }}\n />\n ) : pendingMcpHub ? (\n <McpHub\n initialTab={pendingMcpHub.tab}\n liveServers={liveMcpServers}\n configPath={defaultConfigPath()}\n pickerPorts={pickerPorts}\n onClose={() => setPendingMcpHub(null)}\n postInfo={(text) => log.pushInfo(text)}\n applyAppend={(target, addedTools) => {\n const updated = applyMcpAppend(loop, target, addedTools);\n setLiveMcpServers((prev) => replaceMcpServerSummary(prev, target, updated));\n return updated;\n }}\n reloadMcp={\n mcpRuntime\n ? async () => {\n const r = await mcpRuntime.reloadFromConfig(loop);\n setLiveMcpServers(r.summaries);\n return r;\n }\n : undefined\n }\n />\n ) : pendingPlan ? (\n <PlanConfirm\n plan={pendingPlan}\n steps={planStepsRef.current ?? undefined}\n summary={planSummaryRef.current ?? undefined}\n onChoose={stableHandlePlanConfirm}\n projectRoot={currentRootDir}\n />\n ) : pendingReviseEditor ? (\n <PlanReviseEditor\n steps={planStepsRef.current ?? []}\n completedStepIds={completedStepIdsRef.current}\n onAccept={(revised, skippedIds) => {\n planStepsRef.current = revised;\n for (const id of skippedIds) completedStepIdsRef.current.add(id);\n persistPlanState();\n const planText = pendingReviseEditor;\n setPendingReviseEditor(null);\n setPendingPlan(planText);\n }}\n onCancel={() => {\n const planText = pendingReviseEditor;\n setPendingReviseEditor(null);\n setPendingPlan(planText);\n }}\n />\n ) : pendingShell ? (\n <ShellConfirm\n command={pendingShell.command}\n allowPrefix={derivePrefix(pendingShell.command)}\n kind={pendingShell.kind}\n onChoose={handleShellConfirm}\n />\n ) : pendingEditReview ? (\n <EditConfirm\n block={pendingEditReview}\n onChoose={(choice, denyContext) => {\n const resolve = editReviewResolveRef.current;\n if (resolve) {\n editReviewResolveRef.current = null;\n resolve({ choice, denyContext });\n }\n }}\n />\n ) : walkthroughActive && pendingEdits.current.length > 0 ? (\n <EditConfirm\n // pendingTick re-keys the modal so each apply/discard\n // forces a remount with the NEW first block. Without it,\n // EditConfirm's internal scroll state would persist\n // across blocks, which is the wrong UX.\n key={`walk-${pendingTick}`}\n block={pendingEdits.current[0]!}\n onChoose={handleWalkChoice}\n />\n ) : !chatScroll.pinned ? (\n <Text color={FG.faint}>\n {\" 📖 reading history — End / PgDn to return · ↓ to advance one line\"}\n </Text>\n ) : (\n <>\n {codeMode ? (\n <ModeStatusBar\n editMode={editMode}\n pendingCount={pendingCount}\n flash={modeFlash}\n planMode={planMode}\n undoArmed={!!undoBanner || hasUndoable()}\n jobs={codeMode.jobs}\n />\n ) : null}\n {activeLoop ? <LoopStatusRow loop={activeLoop} /> : null}\n <StatusRow />\n <PromptInput\n value={input}\n onChange={setInput}\n onSubmit={handleSubmit}\n disabled={busy}\n onHistoryPrev={recallPrev}\n onHistoryNext={recallNext}\n />\n {slashMatches !== null ? (\n <SlashSuggestions\n matches={slashMatches}\n selectedIndex={slashSelected}\n groupMode={slashGroupMode}\n advancedHidden={slashAdvancedHidden}\n />\n ) : null}\n {atState !== null ? (\n <AtMentionSuggestions state={atState} selectedIndex={atSelected} />\n ) : null}\n {slashArgContext ? (\n <SlashArgPicker\n matches={slashArgMatches}\n selectedIndex={slashArgSelected}\n spec={slashArgContext.spec}\n kind={slashArgContext.kind}\n partial={slashArgContext.partial}\n />\n ) : null}\n {/* CtxFooter retired — UsageCard auto-emits per turn covers the same data */}\n </>\n )}\n </Box>\n </Box>\n </ViewportBudgetProvider>\n </TickerProvider>\n </>\n );\n}\n","/** One file per checkpoint (not jsonl) so delete/restore is cheap and a corrupt snapshot only loses itself. */\n\nimport { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, relative, resolve, sep } from \"node:path\";\n\n/** One file's state at the time of snapshot. `content === null` → didn't exist. */\nexport interface CheckpointFile {\n path: string;\n content: string | null;\n}\n\nexport interface Checkpoint {\n id: string;\n /** User-given name, or `auto-<reason>` for system-created snapshots. */\n name: string;\n /** Absolute workspace root the snapshot belongs to. */\n rootDir: string;\n createdAt: number;\n source: \"manual\" | \"auto-session-start\" | \"auto-pre-restore\";\n files: CheckpointFile[];\n /** Total bytes of file content captured (sum of `content?.length`). */\n bytes: number;\n}\n\nexport interface CheckpointMeta {\n id: string;\n name: string;\n createdAt: number;\n source: Checkpoint[\"source\"];\n fileCount: number;\n bytes: number;\n}\n\n/** Sanitize a directory path into a safe filesystem name for the store. */\nfunction sanitizeRoot(rootDir: string): string {\n return resolve(rootDir)\n .replace(/[\\\\/:]+/g, \"_\")\n .replace(/^_+/, \"\");\n}\n\nfunction storeRoot(rootDir: string): string {\n return join(homedir(), \".reasonix\", \"sessions\", sanitizeRoot(rootDir), \"checkpoints\");\n}\n\nfunction indexPath(rootDir: string): string {\n return join(storeRoot(rootDir), \"index.json\");\n}\n\nfunction snapshotPath(rootDir: string, id: string): string {\n return join(storeRoot(rootDir), `${id}.json`);\n}\n\n/** Load the index of checkpoint metadata for a workspace. Empty when missing. */\nexport function listCheckpoints(rootDir: string): CheckpointMeta[] {\n const path = indexPath(rootDir);\n if (!existsSync(path)) return [];\n try {\n const raw = readFileSync(path, \"utf8\");\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n // Defensive: filter out malformed entries rather than throwing on\n // a single bad row. A stale entry is annoying; a thrown listCheckpoints\n // would break /checkpoint list entirely.\n return parsed.filter(\n (m): m is CheckpointMeta =>\n typeof m === \"object\" &&\n m !== null &&\n typeof m.id === \"string\" &&\n typeof m.name === \"string\" &&\n typeof m.createdAt === \"number\" &&\n typeof m.source === \"string\" &&\n typeof m.fileCount === \"number\" &&\n typeof m.bytes === \"number\",\n );\n } catch {\n return [];\n }\n}\n\nfunction writeIndex(rootDir: string, items: CheckpointMeta[]): void {\n const path = indexPath(rootDir);\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(items, null, 2), \"utf8\");\n}\n\n/** Read a single checkpoint by id. Returns null when missing or corrupt. */\nexport function loadCheckpoint(rootDir: string, id: string): Checkpoint | null {\n const path = snapshotPath(rootDir, id);\n if (!existsSync(path)) return null;\n try {\n const raw = readFileSync(path, \"utf8\");\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\" && Array.isArray(parsed.files)) {\n return parsed as Checkpoint;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport interface CreateCheckpointOptions {\n rootDir: string;\n name: string;\n source?: Checkpoint[\"source\"];\n paths: readonly string[];\n}\n\n/** Missing files recorded as `content: null` so restore knows to delete; ID has random suffix to avoid same-ms collision. */\nexport function createCheckpoint(opts: CreateCheckpointOptions): CheckpointMeta {\n const absRoot = resolve(opts.rootDir);\n const id = `cp-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;\n const files: CheckpointFile[] = [];\n let bytes = 0;\n const seen = new Set<string>();\n for (const p of opts.paths) {\n if (seen.has(p)) continue;\n seen.add(p);\n const abs = resolve(absRoot, p);\n // Path-escape guard. A snapshot of `../../../etc/passwd` is not\n // something we want — refuse silently rather than abort the whole\n // checkpoint.\n if (abs !== absRoot && !abs.startsWith(`${absRoot}${sep}`)) continue;\n const rel = relative(absRoot, abs).split(sep).join(\"/\");\n if (existsSync(abs)) {\n try {\n const content = readFileSync(abs, \"utf8\");\n files.push({ path: rel, content });\n bytes += content.length;\n } catch {\n // Unreadable (binary, perms) — record as null so restore knows\n // to delete on revert. Wrong for binary files but consistent.\n files.push({ path: rel, content: null });\n }\n } else {\n files.push({ path: rel, content: null });\n }\n }\n\n const checkpoint: Checkpoint = {\n id,\n name: opts.name,\n rootDir: absRoot,\n createdAt: Date.now(),\n source: opts.source ?? \"manual\",\n files,\n bytes,\n };\n const cpPath = snapshotPath(absRoot, id);\n mkdirSync(dirname(cpPath), { recursive: true });\n writeFileSync(cpPath, JSON.stringify(checkpoint), \"utf8\");\n\n const meta: CheckpointMeta = {\n id,\n name: opts.name,\n createdAt: checkpoint.createdAt,\n source: checkpoint.source,\n fileCount: files.length,\n bytes,\n };\n const items = listCheckpoints(absRoot);\n items.push(meta);\n writeIndex(absRoot, items);\n return meta;\n}\n\n/** Most-recent name wins on collision. */\nexport function findCheckpoint(rootDir: string, idOrName: string): CheckpointMeta | null {\n const items = listCheckpoints(rootDir);\n // Prefer exact id match, then most-recent name match.\n const byId = items.find((m) => m.id === idOrName);\n if (byId) return byId;\n const byName = [...items].reverse().find((m) => m.name === idOrName);\n return byName ?? null;\n}\n\nexport interface RestoreResult {\n /** Files we wrote back to disk. */\n restored: string[];\n /** Files we removed (snapshot had `content: null`, file existed). */\n removed: string[];\n /** Files we couldn't touch (errors), with the reason. */\n skipped: Array<{ path: string; reason: string }>;\n}\n\n/** Path-escape rechecked against live `rootDir` since snapshot's may differ (project moved). */\nexport function restoreCheckpoint(rootDir: string, id: string): RestoreResult {\n const cp = loadCheckpoint(rootDir, id);\n const absRoot = resolve(rootDir);\n const result: RestoreResult = { restored: [], removed: [], skipped: [] };\n if (!cp) {\n result.skipped.push({ path: \"(checkpoint)\", reason: `not found: ${id}` });\n return result;\n }\n for (const f of cp.files) {\n const abs = resolve(absRoot, f.path);\n if (abs !== absRoot && !abs.startsWith(`${absRoot}${sep}`)) {\n result.skipped.push({ path: f.path, reason: \"path escapes rootDir\" });\n continue;\n }\n try {\n if (f.content === null) {\n if (existsSync(abs)) {\n rmSync(abs);\n result.removed.push(f.path);\n }\n } else {\n mkdirSync(dirname(abs), { recursive: true });\n writeFileSync(abs, f.content, \"utf8\");\n result.restored.push(f.path);\n }\n } catch (err) {\n result.skipped.push({ path: f.path, reason: (err as Error).message });\n }\n }\n return result;\n}\n\nexport function deleteCheckpoint(rootDir: string, id: string): boolean {\n const cpPath = snapshotPath(rootDir, id);\n let removed = false;\n if (existsSync(cpPath)) {\n try {\n rmSync(cpPath);\n removed = true;\n } catch {\n return false;\n }\n }\n const items = listCheckpoints(rootDir);\n const next = items.filter((m) => m.id !== id);\n if (next.length !== items.length) {\n writeIndex(rootDir, next);\n removed = true;\n }\n return removed;\n}\n\n/** Format ms-timestamp diff as human-readable relative age. */\nexport function fmtAgo(ms: number): string {\n const now = Date.now();\n const diff = Math.max(0, now - ms);\n const s = Math.floor(diff / 1000);\n if (s < 60) return `${s}s ago`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ago`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h ago`;\n const d = Math.floor(h / 24);\n return `${d}d ago`;\n}\n","/** Best-effort overwrite-on-write checkpoint; ephemeral sessions skip persistence. */\n\nimport { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { sanitizeName, sessionsDir } from \"../memory/session.js\";\nimport type { EditBlock } from \"./edit-blocks.js\";\n\n/** Absolute path for the checkpoint file that belongs to this session. */\nexport function pendingEditsPath(sessionName: string): string {\n return join(sessionsDir(), `${sanitizeName(sessionName)}.pending.json`);\n}\n\n/** No-op for ephemeral sessions; empty `blocks` deletes the checkpoint file. */\nexport function savePendingEdits(sessionName: string | null, blocks: EditBlock[]): void {\n if (!sessionName) return;\n const path = pendingEditsPath(sessionName);\n try {\n if (blocks.length === 0) {\n if (existsSync(path)) unlinkSync(path);\n return;\n }\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(blocks, null, 2), \"utf8\");\n } catch {\n /* best-effort — disk full / perms should not break the session */\n }\n}\n\n/** Malformed file → null — silent recovery beats failing to open the session. */\nexport function loadPendingEdits(sessionName: string | null): EditBlock[] | null {\n if (!sessionName) return null;\n const path = pendingEditsPath(sessionName);\n if (!existsSync(path)) return null;\n let raw: string;\n try {\n raw = readFileSync(path, \"utf8\");\n } catch {\n return null;\n }\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return null;\n const out: EditBlock[] = [];\n for (const item of parsed) {\n if (\n item &&\n typeof item === \"object\" &&\n typeof item.path === \"string\" &&\n typeof item.search === \"string\" &&\n typeof item.replace === \"string\" &&\n typeof item.offset === \"number\"\n ) {\n out.push(item as EditBlock);\n }\n }\n return out;\n } catch {\n return null;\n }\n}\n\n/** Delete the checkpoint file unconditionally — called by /apply and /discard. */\nexport function clearPendingEdits(sessionName: string | null): void {\n if (!sessionName) return;\n const path = pendingEditsPath(sessionName);\n try {\n if (existsSync(path)) unlinkSync(path);\n } catch {\n /* best-effort */\n }\n}\n","const SECRET_KEY_RE =\n /(secret|token|password|passphrase|api[-_]?key|authorization|cookie|credential|passwd|pwd)/i;\n\nexport function redactEventValue<T>(value: T): T {\n return redactUnknown(value, null) as T;\n}\n\nfunction redactUnknown(value: unknown, key: string | null): unknown {\n if (Array.isArray(value)) return value.map((item) => redactUnknown(item, null));\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [childKey, childValue] of Object.entries(value)) {\n out[childKey] = redactUnknown(childValue, childKey);\n }\n return out;\n }\n if (typeof value === \"string\") {\n if ((key && SECRET_KEY_RE.test(key)) || /^Bearer\\s+/i.test(value)) return \"[redacted]\";\n }\n return value;\n}\n","import type { LoopEvent } from \"../loop.js\";\nimport type { ChatMessage, RawUsage, ToolCall } from \"../types.js\";\nimport { redactEventValue } from \"./event-redaction.js\";\nimport type {\n Event,\n ErrorEvent as KernelErrorEvent,\n ModelDeltaEvent,\n ModelFinalEvent,\n ModelTurnStartedEvent,\n SessionCompactedEvent,\n SessionOpenedEvent,\n SlashInvokedEvent,\n StatusEvent,\n ToolCallEvent,\n ToolConfirmAllowEvent,\n ToolConfirmAlwaysAllowEvent,\n ToolConfirmDenyEvent,\n ToolDispatchedEvent,\n ToolIntentEvent,\n ToolResultEvent,\n UserMessageEvent,\n} from \"./events.js\";\n\nexport interface EventizeContext {\n model: string;\n prefixHash: string;\n reasoningEffort: \"high\" | \"max\";\n}\n\nexport class Eventizer {\n private nextId = 0;\n private lastTurn = -1;\n private nextToolSeq = 0;\n private pendingCallIds: string[] = [];\n\n consume(ev: LoopEvent, ctx: EventizeContext): Event[] {\n const out: Event[] = [];\n if (ev.turn !== this.lastTurn) {\n this.lastTurn = ev.turn;\n out.push(this.turnStartedEvent(ev.turn, ctx));\n }\n switch (ev.role) {\n case \"assistant_delta\":\n if (ev.content) out.push(this.deltaEvent(ev.turn, \"content\", ev.content));\n if (ev.reasoningDelta) out.push(this.deltaEvent(ev.turn, \"reasoning\", ev.reasoningDelta));\n break;\n case \"tool_call_delta\":\n // Progress signal only; intent + args land on tool_start.\n break;\n case \"assistant_final\":\n out.push(this.finalEvent(ev));\n break;\n case \"tool_start\": {\n const callId = `tc-${++this.nextToolSeq}`;\n this.pendingCallIds.push(callId);\n out.push(this.toolIntentEvent(ev.turn, callId, ev.toolName ?? \"\", ev.toolArgs ?? \"\"));\n out.push(this.toolDispatchedEvent(ev.turn, callId));\n break;\n }\n case \"tool\": {\n const callId = this.pendingCallIds.shift() ?? `tc-orphan-${++this.nextToolSeq}`;\n const ok = !looksLikeToolError(ev.content, ev.toolName);\n out.push(this.toolResultEvent(ev.turn, callId, ok, ev.content, 0));\n break;\n }\n case \"warning\":\n out.push(this.classifyWarning(ev));\n break;\n case \"error\":\n out.push(this.errorEvent(ev.turn, ev.error ?? ev.content, false));\n break;\n case \"status\":\n out.push(this.statusEvent(ev.turn, ev.content));\n break;\n // `done` / `branch_*` intentionally drop — no kernel-level event.\n default:\n break;\n }\n return out;\n }\n\n emitUserMessage(turn: number, text: string): UserMessageEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"user.message\",\n text,\n };\n }\n\n emitSlashInvoked(turn: number, name: string, args: string): SlashInvokedEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"slash.invoked\",\n name,\n args,\n };\n }\n\n emitSessionOpened(turn: number, name: string, resumedFromTurn: number): SessionOpenedEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"session.opened\",\n name,\n resumedFromTurn,\n };\n }\n\n emitSessionCompacted(\n turn: number,\n before: number,\n after: number,\n reason: \"user\" | \"auto-context-pressure\",\n replacementMessages: ReadonlyArray<ChatMessage>,\n ): SessionCompactedEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"session.compacted\",\n beforeMessages: before,\n afterMessages: after,\n reason,\n replacementMessages,\n };\n }\n\n emitToolCall(turn: number, name: string, args: Record<string, unknown>): ToolCallEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"tool.call\",\n name,\n args: redactEventValue(args),\n };\n }\n\n emitToolConfirmAllow(\n turn: number,\n kind: \"run_command\" | \"run_background\",\n payload: { command: string },\n ): ToolConfirmAllowEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"tool.confirm.allow\",\n kind,\n payload: redactEventValue(payload),\n };\n }\n\n emitToolConfirmDeny(\n turn: number,\n kind: \"run_command\" | \"run_background\",\n payload: { command: string },\n denyContext?: string,\n ): ToolConfirmDenyEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"tool.confirm.deny\",\n kind,\n payload: redactEventValue(payload),\n denyContext,\n };\n }\n\n emitToolConfirmAlwaysAllow(\n turn: number,\n kind: \"run_command\" | \"run_background\",\n payload: { command: string },\n prefix: string,\n ): ToolConfirmAlwaysAllowEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"tool.confirm.always_allow\",\n kind,\n payload: redactEventValue(payload),\n prefix,\n };\n }\n\n private turnStartedEvent(turn: number, ctx: EventizeContext): ModelTurnStartedEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"model.turn.started\",\n model: ctx.model,\n reasoningEffort: ctx.reasoningEffort,\n prefixHash: ctx.prefixHash,\n };\n }\n\n private deltaEvent(\n turn: number,\n channel: \"content\" | \"reasoning\" | \"tool_args\",\n text: string,\n ): ModelDeltaEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"model.delta\",\n channel,\n text,\n };\n }\n\n private finalEvent(ev: LoopEvent): ModelFinalEvent {\n const usage: RawUsage = ev.stats\n ? {\n prompt_tokens: ev.stats.usage.promptTokens,\n completion_tokens: ev.stats.usage.completionTokens,\n total_tokens: ev.stats.usage.totalTokens,\n prompt_cache_hit_tokens: ev.stats.usage.promptCacheHitTokens,\n prompt_cache_miss_tokens: ev.stats.usage.promptCacheMissTokens,\n }\n : {};\n const costUsd = ev.stats?.cost ?? 0;\n const out: ModelFinalEvent = {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn: ev.turn,\n type: \"model.final\",\n content: ev.content,\n // toolCalls land later via tool_start → tool.intent — not in this event.\n toolCalls: [] as ReadonlyArray<ToolCall>,\n usage,\n costUsd,\n };\n if (ev.forcedSummary) out.forcedSummary = true;\n return out;\n }\n\n private toolIntentEvent(\n turn: number,\n callId: string,\n name: string,\n args: string,\n ): ToolIntentEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"tool.intent\",\n callId,\n name,\n args,\n };\n }\n\n private toolDispatchedEvent(turn: number, callId: string): ToolDispatchedEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"tool.dispatched\",\n callId,\n };\n }\n\n private toolResultEvent(\n turn: number,\n callId: string,\n ok: boolean,\n output: string,\n durationMs: number,\n ): ToolResultEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"tool.result\",\n callId,\n ok,\n output,\n durationMs,\n };\n }\n\n private statusEvent(turn: number, text: string): StatusEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"status\",\n text,\n };\n }\n\n private errorEvent(turn: number, message: string, recoverable: boolean): KernelErrorEvent {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn,\n type: \"error\",\n message,\n recoverable,\n };\n }\n\n /** Pattern-match warning text since LoopEvent doesn't carry a typed kind. */\n private classifyWarning(ev: LoopEvent): Event {\n const c = ev.content;\n if (/\\bauto-escalating to\\b|\\barmed\\b.*pro|NEEDS_PRO/.test(c)) {\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn: ev.turn,\n type: \"policy.escalated\",\n fromModel: \"\",\n toModel: \"\",\n reason: c.includes(\"armed\") ? \"user-request\" : \"self-report\",\n };\n }\n if (/budget\\b.*\\$|\\$\\d.*\\/\\s*\\$\\d/.test(c)) {\n const blocked = /blocked|exceeded|refus/i.test(c);\n return {\n id: ++this.nextId,\n ts: new Date().toISOString(),\n turn: ev.turn,\n type: blocked ? \"policy.budget.blocked\" : \"policy.budget.warning\",\n spentUsd: 0,\n capUsd: 0,\n };\n }\n return this.errorEvent(ev.turn, c, true);\n }\n}\n\nfunction looksLikeToolError(content: string, _toolName: string | undefined): boolean {\n if (!content) return false;\n if (content.startsWith(\"ERROR:\")) return true;\n if (content.startsWith(\"[hook block]\")) return true;\n if (/^\\{\"error\"\\s*:/.test(content)) return true;\n if (/\\bConfirmationError:|\\bNeedsConfirmationError\\b/.test(content)) return true;\n return false;\n}\n","import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nexport type SlashUsageCounts = Readonly<Record<string, number>>;\n\ninterface UsageFile {\n version: 1;\n counts: Record<string, number>;\n}\n\nexport function slashUsagePath(): string {\n const override = process.env.REASONIX_SLASH_USAGE_PATH;\n if (override) return override;\n return join(homedir(), \".reasonix\", \"slash-usage.json\");\n}\n\nexport function loadSlashUsage(): SlashUsageCounts {\n const path = slashUsagePath();\n if (!existsSync(path)) return {};\n try {\n const raw = readFileSync(path, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<UsageFile> | null;\n if (!parsed || typeof parsed !== \"object\") return {};\n const out: Record<string, number> = {};\n for (const [k, v] of Object.entries(parsed.counts ?? {})) {\n if (typeof v === \"number\" && Number.isFinite(v) && v >= 0) out[k] = v;\n }\n return out;\n } catch {\n return {};\n }\n}\n\nfunction persist(counts: Record<string, number>): void {\n const path = slashUsagePath();\n const tmp = `${path}.tmp`;\n const payload: UsageFile = { version: 1, counts };\n try {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(tmp, JSON.stringify(payload), \"utf8\");\n renameSync(tmp, path);\n } catch {\n /* disk full / perms — non-fatal, in-memory state still increments */\n }\n}\n\n/** Read-modify-write so two concurrent reasonix processes don't clobber each other's counts. */\nexport function recordSlashUse(name: string): SlashUsageCounts {\n const counts: Record<string, number> = { ...loadSlashUsage() };\n counts[name] = (counts[name] ?? 0) + 1;\n persist(counts);\n return counts;\n}\n","/** runAs: inline appends the body to the parent log; subagent spawns an isolated child loop and only returns the final answer. */\n\nimport { type Skill, SkillStore } from \"../skills.js\";\nimport type { ToolRegistry } from \"../tools.js\";\n\n/** Returns serialized tool-result string — dispatch path is pure pass-through. */\nexport type SubagentRunner = (skill: Skill, task: string, signal?: AbortSignal) => Promise<string>;\n\nexport interface SkillToolsOptions {\n /** Override `$HOME` — tests set this to a tmpdir. */\n homeDir?: string;\n projectRoot?: string;\n /** When omitted, subagent skills error rather than silently falling back to inline (loses isolation). */\n subagentRunner?: SubagentRunner;\n /** Hide built-in skills (test-only knob; production callers leave off). */\n disableBuiltins?: boolean;\n}\n\nexport function registerSkillTools(\n registry: ToolRegistry,\n opts: SkillToolsOptions = {},\n): ToolRegistry {\n const store = new SkillStore({\n homeDir: opts.homeDir,\n projectRoot: opts.projectRoot,\n disableBuiltins: opts.disableBuiltins,\n });\n const subagentRunner = opts.subagentRunner;\n\n registry.register({\n name: \"run_skill\",\n description:\n \"Invoke a playbook from the Skills index pinned in the system prompt. Each entry is a self-contained instruction block. Pass `name` as the BARE skill identifier (e.g. 'explore'), NOT the `[🧬 subagent]` tag that appears after it in the index. Entries tagged `[🧬 subagent]` spawn an isolated subagent — only the final distilled answer comes back, the model's tool calls + reasoning during the run never enter your context. Plain skills are inlined: the body becomes a tool result you read and follow. For subagent skills, supply 'arguments' describing the concrete task — they'll be the only context the subagent has.\",\n readOnly: true,\n parallelSafe: true,\n parameters: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description:\n \"Skill identifier as it appears in the pinned Skills index (e.g. 'explore', 'review', 'security-review'). Case-sensitive.\",\n },\n arguments: {\n type: \"string\",\n description:\n \"Free-form arguments the skill should act on. For inline skills: appended to the body as an 'Arguments:' line; the skill's own instructions decide how to consume them. For `[🧬 subagent]` skills: REQUIRED — becomes the entire task description the subagent receives, since it has no other context.\",\n },\n },\n required: [\"name\"],\n },\n fn: async (args: { name?: unknown; arguments?: unknown }, ctx) => {\n const raw = typeof args.name === \"string\" ? args.name.trim() : \"\";\n if (!raw) {\n return JSON.stringify({ error: \"run_skill requires a 'name' argument\" });\n }\n // Defensive: The Skills index writes entries like\n // `explore [🧬 subagent]`, and models sometimes copy the\n // decoration verbatim into the `name` argument instead of just\n // the identifier. Rather than reject those calls:\n // 1. Drop any `[...]` bracketed tag (possibly containing\n // emoji + \"subagent\" label).\n // 2. Find the first whitespace-delimited token whose first\n // char is alphanumeric — that's the skill identifier,\n // whether the tag came before or after the name.\n const stripped = raw.replace(/\\[[^\\]]*\\]/g, \" \").trim();\n const tokens = stripped.split(/\\s+/).filter(Boolean);\n const name = tokens.find((t) => /^[a-zA-Z0-9]/.test(t)) ?? \"\";\n if (!name) {\n return JSON.stringify({\n error: \"run_skill requires a 'name' argument\",\n hint: `'${raw}' is just a marker/tag, not a skill name`,\n });\n }\n const skill = store.read(name);\n if (!skill) {\n const available = store\n .list()\n .map((s) => s.name)\n .join(\", \");\n return JSON.stringify({\n error: `unknown skill: ${JSON.stringify(name)}`,\n available: available || \"(none — user has not defined any skills)\",\n });\n }\n const rawArgs = typeof args.arguments === \"string\" ? args.arguments.trim() : \"\";\n\n if (skill.runAs === \"subagent\") {\n if (!subagentRunner) {\n return JSON.stringify({\n error: `run_skill: skill ${JSON.stringify(name)} is marked runAs=subagent but no subagent runner is configured for this session. Skill authors who need isolation should run inside reasonix code (or a library setup that passes subagentRunner to registerSkillTools).`,\n });\n }\n if (!rawArgs) {\n return JSON.stringify({\n error: `run_skill: skill ${JSON.stringify(name)} is a subagent and requires 'arguments' — the subagent has no other context, so describe the concrete task in the arguments field.`,\n });\n }\n return subagentRunner(skill, rawArgs, ctx?.signal);\n }\n\n // inline path — body becomes the tool result.\n const header = [\n `# Skill: ${skill.name}`,\n skill.description ? `> ${skill.description}` : \"\",\n `(scope: ${skill.scope} · ${skill.path})`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n const argsBlock = rawArgs ? `\\n\\nArguments: ${rawArgs}` : \"\";\n // The body is handed to the model verbatim. No truncation — the\n // user authored it, we trust their length choice. The append-only\n // log pays the token cost exactly once per invocation.\n return `${header}\\n\\n${skill.body}${argsBlock}`;\n },\n });\n\n return registry;\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig.jsx = \"react\" needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { GLYPH, useColor } from \"./theme.js\";\nimport type { AtPickerEntry, AtPickerState } from \"./useCompletionPickers.js\";\n\nexport interface AtMentionSuggestionsProps {\n state: AtPickerState | null;\n selectedIndex: number;\n}\n\nconst ROW_WINDOW = 8;\n\nexport function AtMentionSuggestions({\n state,\n selectedIndex,\n}: AtMentionSuggestionsProps): React.ReactElement | null {\n const color = useColor();\n if (!state) return null;\n\n const isBrowse = state.kind === \"browse\";\n const entries = state.entries;\n const total = entries.length;\n const windowStart =\n total <= ROW_WINDOW\n ? 0\n : Math.max(0, Math.min(selectedIndex - Math.floor(ROW_WINDOW / 2), total - ROW_WINDOW));\n const shown = entries.slice(windowStart, windowStart + ROW_WINDOW);\n const hiddenAbove = windowStart;\n const hiddenBelow = total - windowStart - shown.length;\n\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <HeaderRow state={state} hiddenAbove={hiddenAbove} />\n {total === 0 ? <EmptyRow state={state} color={color} /> : null}\n {shown.map((entry, i) => (\n <EntryRow\n key={`${entry.insertPath}:${entry.isDir ? \"d\" : \"f\"}`}\n entry={entry}\n isSelected={windowStart + i === selectedIndex}\n />\n ))}\n {hiddenBelow > 0 ? <Text dimColor>{` ↓ ${hiddenBelow} below`}</Text> : null}\n <FooterRow isBrowse={isBrowse} hasFolder={shown.some((e) => e.isDir)} />\n </Box>\n );\n}\n\nfunction HeaderRow({\n state,\n hiddenAbove,\n}: {\n state: AtPickerState;\n hiddenAbove: number;\n}) {\n const color = useColor();\n const total = state.entries.length;\n const lead = (\n <Text color={color.primary} bold>\n {\"@ \"}\n </Text>\n );\n if (state.kind === \"browse\") {\n const where = state.baseDir === \"\" ? \"/\" : `${state.baseDir}/`;\n const counter = state.loading ? \"loading…\" : `${total} ${total === 1 ? \"entry\" : \"entries\"}`;\n return (\n <Box>\n {lead}\n <Text dimColor>{`${where} ${counter}`}</Text>\n {hiddenAbove > 0 ? <Text dimColor>{` ↑ ${hiddenAbove} above`}</Text> : null}\n </Box>\n );\n }\n const status = state.searching\n ? `searching… ${state.scanned} scanned · ${total} ${total === 1 ? \"match\" : \"matches\"}`\n : `${total} ${total === 1 ? \"match\" : \"matches\"} for \"${state.filter}\"`;\n return (\n <Box>\n {lead}\n <Text dimColor>{status}</Text>\n {hiddenAbove > 0 ? <Text dimColor>{` ↑ ${hiddenAbove} above`}</Text> : null}\n </Box>\n );\n}\n\nfunction EmptyRow({ state, color }: { state: AtPickerState; color: ReturnType<typeof useColor> }) {\n if (state.kind === \"browse\") {\n if (state.loading) return null;\n return (\n <Box>\n <Text color={color.warn} bold>\n {GLYPH.warn}\n </Text>\n <Text> </Text>\n <Text color={color.warn}>empty directory</Text>\n </Box>\n );\n }\n if (state.searching) {\n return (\n <Box>\n <Text dimColor>scanning the tree…</Text>\n </Box>\n );\n }\n return (\n <Box>\n <Text color={color.warn} bold>\n {GLYPH.warn}\n </Text>\n <Text> </Text>\n <Text color={color.warn}>{`no files match \"${state.filter}\"`}</Text>\n </Box>\n );\n}\n\nfunction EntryRow({ entry, isSelected }: { entry: AtPickerEntry; isSelected: boolean }) {\n const color = useColor();\n const cursor = isSelected ? `${GLYPH.cur} ` : \" \";\n const labelColor = entry.isDir ? color.accent : color.primary;\n const labelText = entry.isDir ? `${entry.label}/` : entry.label;\n return (\n <Box>\n <Text color={isSelected ? color.primary : color.info} bold={isSelected}>\n {cursor}\n </Text>\n <Text color={labelColor} bold={isSelected}>\n {labelText.padEnd(20)}\n </Text>\n {entry.dirSuffix ? <Text dimColor>{` ${entry.dirSuffix}`}</Text> : null}\n </Box>\n );\n}\n\nfunction FooterRow({ isBrowse, hasFolder }: { isBrowse: boolean; hasFolder: boolean }) {\n const hint = isBrowse\n ? hasFolder\n ? \"↑↓ navigate · Tab drill into folder · ⏎ insert · esc cancel\"\n : \"↑↓ navigate · Tab / ⏎ insert as @path · esc cancel\"\n : \"↑↓ navigate · Tab / ⏎ insert as @path · esc cancel\";\n return (\n <Box marginTop={0}>\n <Text dimColor>{` ${hint}`}</Text>\n </Box>\n );\n}\n","import { Box, Text, useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { useMemo, useState } from \"react\";\nimport type { CheckpointMeta } from \"../../code/checkpoints.js\";\nimport { fmtAgo } from \"../../code/checkpoints.js\";\nimport { type PickerBroadcastPorts, usePickerBroadcast } from \"./dashboard/use-picker-broadcast.js\";\nimport { useKeystroke } from \"./keystroke-context.js\";\nimport { FG, TONE } from \"./theme/tokens.js\";\n\nexport type CheckpointPickerOutcome =\n | { kind: \"restore\"; id: string }\n | { kind: \"delete\"; id: string }\n | { kind: \"quit\" };\n\nexport interface CheckpointPickerProps {\n checkpoints: ReadonlyArray<CheckpointMeta>;\n workspace: string;\n onChoose: (outcome: CheckpointPickerOutcome) => void;\n pickerPorts?: PickerBroadcastPorts;\n}\n\nconst PAGE_MARGIN = 6;\n\nexport function CheckpointPicker({\n checkpoints,\n workspace,\n onChoose,\n pickerPorts,\n}: CheckpointPickerProps): React.ReactElement {\n const [focus, setFocus] = useState(0);\n const { stdout } = useStdout();\n const rows = stdout?.rows ?? 40;\n const visibleCount = Math.max(3, rows - PAGE_MARGIN);\n\n const snapshot = useMemo(\n () => ({\n pickerKind: \"checkpoints\",\n title: `restore a checkpoint — ${workspace}`,\n items: checkpoints.map((c) => {\n const sizeKb = (c.bytes / 1024).toFixed(1);\n const tag = c.source === \"manual\" ? \"\" : ` (${c.source})`;\n return {\n id: c.id,\n title: `${c.name}${tag}`,\n subtitle: `${c.fileCount} file${c.fileCount === 1 ? \"\" : \"s\"} · ${sizeKb} KB`,\n badge: c.id.slice(0, 7),\n meta: fmtAgo(c.createdAt),\n };\n }),\n actions: [\"pick\", \"delete\", \"cancel\"] as const,\n hint: \"↑↓ pick · ⏎ restore · [d] forget · esc quit\",\n }),\n [checkpoints, workspace],\n );\n\n usePickerBroadcast(\n !!pickerPorts,\n {\n ...snapshot,\n actions: [...snapshot.actions],\n },\n (res) => {\n if (res.action === \"pick\") return onChoose({ kind: \"restore\", id: res.id });\n if (res.action === \"delete\") return onChoose({ kind: \"delete\", id: res.id });\n if (res.action === \"cancel\") return onChoose({ kind: \"quit\" });\n },\n pickerPorts ?? {\n broadcast: () => undefined,\n resolverRef: { current: null },\n snapshotRef: { current: null },\n },\n );\n\n useKeystroke((ev) => {\n if (ev.escape) return onChoose({ kind: \"quit\" });\n if (ev.upArrow) return setFocus((f) => Math.max(0, f - 1));\n if (ev.downArrow) return setFocus((f) => Math.min(checkpoints.length - 1, f + 1));\n if (checkpoints.length === 0) {\n if (ev.return) return onChoose({ kind: \"quit\" });\n return;\n }\n const target = checkpoints[focus];\n if (!target) return;\n if (ev.return) return onChoose({ kind: \"restore\", id: target.id });\n if (ev.input === \"q\") return onChoose({ kind: \"quit\" });\n if (ev.input === \"d\") return onChoose({ kind: \"delete\", id: target.id });\n });\n\n const start = Math.max(\n 0,\n Math.min(focus - Math.floor(visibleCount / 2), checkpoints.length - visibleCount),\n );\n const end = Math.min(checkpoints.length, start + visibleCount);\n const shown = checkpoints.slice(start, end);\n const hiddenBelow = checkpoints.length - end;\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Box>\n <Text bold color={TONE.brand}>\n {\" ◈ REASONIX · pick a checkpoint \"}\n </Text>\n <Text color={FG.meta}>{` · ${workspace}`}</Text>\n </Box>\n <Box height={1} />\n {checkpoints.length === 0 ? (\n <Box>\n <Text color={FG.faint}>\n {\" no checkpoints in this workspace yet — see /checkpoint to make one\"}\n </Text>\n </Box>\n ) : (\n shown.map((c, i) => <CheckpointRow key={c.id} info={c} focused={start + i === focus} />)\n )}\n {hiddenBelow > 0 ? (\n <Box>\n <Text color={FG.faint}>{` … ${hiddenBelow} more`}</Text>\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text color={FG.faint}>\n {checkpoints.length === 0\n ? \" esc quit\"\n : \" ↑↓ pick · ⏎ restore · [d] forget · esc quit\"}\n </Text>\n </Box>\n </Box>\n );\n}\n\nfunction CheckpointRow({\n info,\n focused,\n}: {\n info: CheckpointMeta;\n focused: boolean;\n}): React.ReactElement {\n const tag = info.source === \"manual\" ? \"\" : ` (${info.source})`;\n const sizeKb = (info.bytes / 1024).toFixed(1);\n const time = fmtAgo(info.createdAt);\n return (\n <Box>\n <Text color={focused ? TONE.brand : FG.faint}>{focused ? \" ▸ \" : \" \"}</Text>\n <Text color={FG.meta}>{info.id.slice(0, 7).padEnd(8)}</Text>\n <Text bold={focused} color={focused ? FG.strong : FG.sub}>\n {info.name}\n </Text>\n <Text color={FG.faint}>{tag}</Text>\n <Box flexGrow={1} />\n <Text color={FG.faint}>{`${time.padStart(8)} · `}</Text>\n <Text\n color={FG.faint}\n >{`${info.fileCount} file${info.fileCount === 1 ? \"\" : \"s\"}, ${sizeKb} KB`}</Text>\n </Box>\n );\n}\n","import type { MutableRefObject } from \"react\";\nimport { useEffect } from \"react\";\nimport type {\n DashboardEvent,\n PickerAction,\n PickerItem,\n PickerResolution,\n} from \"../../../server/context.js\";\n\nexport interface PickerSnapshot {\n pickerKind: string;\n title: string;\n query?: string;\n items: PickerItem[];\n actions: PickerAction[];\n hasMore?: boolean;\n hint?: string;\n}\n\nexport interface ViewerSnapshot {\n viewerKind: string;\n title: string;\n body?: string;\n steps?: Array<{ id: string; title: string; status: \"done\" | \"queued\" }>;\n meta?: string;\n}\n\nexport interface ViewerBroadcastPorts {\n broadcast: (ev: DashboardEvent) => void;\n resolverRef: MutableRefObject<(() => void) | null>;\n snapshotRef: MutableRefObject<ViewerSnapshot | null>;\n}\n\n/** Read-only sibling of `usePickerBroadcast` — viewer modals carry no selection so only `close` flows back. */\nexport function useViewerBroadcast(\n active: boolean,\n snapshot: ViewerSnapshot,\n onClose: () => void,\n ports: ViewerBroadcastPorts,\n): void {\n const { broadcast, resolverRef, snapshotRef } = ports;\n\n useEffect(() => {\n if (!active) return;\n return () => {\n broadcast({ kind: \"modal-down\", modalKind: \"viewer\" });\n if (resolverRef.current) resolverRef.current = null;\n if (snapshotRef.current) snapshotRef.current = null;\n };\n }, [active, broadcast, resolverRef, snapshotRef]);\n\n useEffect(() => {\n if (!active) return;\n snapshotRef.current = snapshot;\n resolverRef.current = onClose;\n broadcast({ kind: \"modal-up\", modal: { kind: \"viewer\", ...snapshot } });\n }, [active, snapshot, onClose, broadcast, resolverRef, snapshotRef]);\n}\n\nexport interface PickerBroadcastPorts {\n broadcast: (ev: DashboardEvent) => void;\n resolverRef: MutableRefObject<((res: PickerResolution) => void) | null>;\n snapshotRef: MutableRefObject<PickerSnapshot | null>;\n}\n\n/** Mirrors a TUI picker into the dashboard via modal-up/down events. Caller passes stable refs from App.tsx so identity does not churn the effect. */\nexport function usePickerBroadcast(\n active: boolean,\n snapshot: PickerSnapshot,\n onResolve: (res: PickerResolution) => void,\n ports: PickerBroadcastPorts,\n): void {\n const { broadcast, resolverRef, snapshotRef } = ports;\n\n useEffect(() => {\n if (!active) return;\n return () => {\n broadcast({ kind: \"modal-down\", modalKind: \"picker\" });\n if (resolverRef.current) resolverRef.current = null;\n if (snapshotRef.current) snapshotRef.current = null;\n };\n }, [active, broadcast, resolverRef, snapshotRef]);\n\n useEffect(() => {\n if (!active) return;\n snapshotRef.current = snapshot;\n resolverRef.current = onResolve;\n broadcast({ kind: \"modal-up\", modal: { kind: \"picker\", ...snapshot } });\n }, [active, snapshot, onResolve, broadcast, resolverRef, snapshotRef]);\n}\n","/** Modal picker for `ask_choice` — options + optional \"type my own\" escape hatch. */\n\nimport React from \"react\";\nimport type { ChoiceOption } from \"../../tools/choice.js\";\nimport { SingleSelect } from \"./Select.js\";\nimport { ApprovalCard } from \"./cards/ApprovalCard.js\";\nimport { useReserveRows } from \"./layout/viewport-budget.js\";\n\nexport type ChoiceConfirmChoice =\n | { kind: \"pick\"; optionId: string }\n | { kind: \"custom\" }\n | { kind: \"cancel\" };\n\nexport interface ChoiceConfirmProps {\n question: string;\n options: ChoiceOption[];\n allowCustom: boolean;\n onChoose: (choice: ChoiceConfirmChoice) => void;\n}\n\nconst CUSTOM_VALUE = \"__custom__\";\nconst CANCEL_VALUE = \"__cancel__\";\n\nfunction ChoiceConfirmInner({ question, options, allowCustom, onChoose }: ChoiceConfirmProps) {\n const optionRows = options.length + (allowCustom ? 1 : 0) + 1; // +1 for cancel\n useReserveRows(\"modal\", { min: 6, max: Math.max(10, optionRows + 6) });\n\n const items: Array<{ value: string; label: string; hint?: string }> = options.map((opt) => ({\n value: opt.id,\n label: `${opt.id} · ${opt.title}`,\n hint: opt.summary,\n }));\n if (allowCustom) {\n items.push({\n value: CUSTOM_VALUE,\n label: \"Let me type my own answer\",\n hint: \"None of the above fits — type a free-form reply. The model reads it verbatim.\",\n });\n }\n items.push({\n value: CANCEL_VALUE,\n label: \"Cancel — drop the question\",\n hint: \"Model stops and asks what you want instead.\",\n });\n\n return (\n <ApprovalCard tone=\"info\" title={question} metaRight=\"awaiting\">\n <SingleSelect\n initialValue={options[0]?.id}\n items={items}\n onSubmit={(v) => {\n if (v === CUSTOM_VALUE) onChoose({ kind: \"custom\" });\n else if (v === CANCEL_VALUE) onChoose({ kind: \"cancel\" });\n else onChoose({ kind: \"pick\", optionId: v });\n }}\n onCancel={() => onChoose({ kind: \"cancel\" })}\n />\n </ApprovalCard>\n );\n}\n\nexport const ChoiceConfirm = React.memo(ChoiceConfirmInner);\n","import { Box, Text, useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { CARD, type CardTone, FG, SURFACE } from \"../theme/tokens.js\";\n\nconst SEPARATOR_PAD = 6;\nconst MIN_SEPARATOR = 20;\n\nexport interface ApprovalCardProps {\n tone:\n | Extract<CardTone, \"warn\" | \"error\" | \"approval\" | \"diff\" | \"memory\" | \"user\">\n | \"ok\"\n | \"accent\"\n | \"info\";\n glyph?: string;\n title: string;\n metaRight?: string;\n /** Override metaRight color — defaults to FG.faint. Use the tone color to match design's status indicator (e.g. \"awaiting\" in accent for plan-confirm). */\n metaRightColor?: string;\n children?: React.ReactNode;\n footerHint?: string;\n}\n\nconst TONE_PALETTE = {\n warn: { color: CARD.warn.color, glyph: \"?\" },\n error: { color: CARD.error.color, glyph: \"✗\" },\n approval: { color: CARD.approval.color, glyph: \"?\" },\n diff: { color: CARD.diff.color, glyph: \"±\" },\n memory: { color: CARD.memory.color, glyph: \"⌑\" },\n user: { color: CARD.user.color, glyph: \"◇\" },\n ok: { color: CARD.diff.color, glyph: \"✓\" },\n accent: { color: CARD.plan.color, glyph: \"⊞\" },\n info: { color: CARD.tool.color, glyph: \"?\" },\n} as const;\n\nconst DEFAULT_FOOTER = \"↑↓ pick · ⏎ confirm · esc cancel\";\n\nexport function ApprovalCard({\n tone,\n glyph,\n title,\n metaRight,\n metaRightColor,\n children,\n footerHint = DEFAULT_FOOTER,\n}: ApprovalCardProps): React.ReactElement {\n const palette = TONE_PALETTE[tone];\n const headerGlyph = glyph ?? palette.glyph;\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const ruleWidth = Math.max(MIN_SEPARATOR, cols - SEPARATOR_PAD);\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Box flexDirection=\"row\">\n <Text color={palette.color} backgroundColor={SURFACE.bgElev}>\n {\" ▎ \"}\n </Text>\n <Text bold color={palette.color} backgroundColor={SURFACE.bgElev}>\n {`${headerGlyph} `}\n </Text>\n <Text bold color={FG.strong} backgroundColor={SURFACE.bgElev}>\n {` ${title} `}\n </Text>\n {metaRight !== undefined && (\n <Text color={metaRightColor ?? FG.faint} backgroundColor={SURFACE.bgElev}>\n {` ${metaRight} `}\n </Text>\n )}\n </Box>\n <Box flexDirection=\"column\" paddingX={2} marginTop={1}>\n {children}\n </Box>\n <Box paddingX={2} marginTop={1}>\n <Text color={FG.faint}>{\"─\".repeat(ruleWidth)}</Text>\n </Box>\n <Box paddingX={2}>\n <Text color={FG.faint}>{footerHint}</Text>\n </Box>\n </Box>\n );\n}\n","/** Single allocator for vertical viewport rows; consumers claim per-zone via useReserveRows. */\n\nimport { useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { createContext, useContext, useEffect, useMemo, useReducer } from \"react\";\n\nexport type ZoneId = \"modal\" | \"status\" | \"input\" | \"stream\" | \"safety\";\n\n/** Higher number = claims rows first. */\nconst ZONE_PRIORITY: Record<ZoneId, number> = {\n modal: 100,\n status: 60,\n input: 50,\n stream: 10,\n safety: 5,\n};\n\nexport interface ClaimSpec {\n /** Smallest acceptable allocation. May exceed total rows on tiny terminals. */\n min: number;\n /** Hard ceiling. `Number.POSITIVE_INFINITY` = \"soak whatever's left\". */\n max: number;\n}\n\ninterface InternalClaim extends ClaimSpec {\n zone: ZoneId;\n priority: number;\n}\n\n/** Pure allocator — used by the provider and tested in isolation. */\nexport function allocateRows(\n claims: ReadonlyArray<InternalClaim>,\n totalRows: number,\n): ReadonlyMap<ZoneId, number> {\n const sorted = [...claims].sort((a, b) => b.priority - a.priority);\n const out = new Map<ZoneId, number>();\n let remaining = Math.max(0, totalRows);\n for (const c of sorted) {\n const want = Math.min(c.max, Math.max(c.min, remaining));\n out.set(c.zone, want);\n remaining = Math.max(0, remaining - want);\n }\n return out;\n}\n\ninterface BudgetState {\n /** Active claims keyed by zone — one consumer per zone. */\n claims: ReadonlyMap<ZoneId, ClaimSpec>;\n totalRows: number;\n}\n\ntype BudgetAction =\n | { type: \"claim\"; zone: ZoneId; spec: ClaimSpec }\n | { type: \"release\"; zone: ZoneId }\n | { type: \"resize\"; rows: number };\n\nfunction reducer(state: BudgetState, action: BudgetAction): BudgetState {\n switch (action.type) {\n case \"claim\": {\n const next = new Map(state.claims);\n next.set(action.zone, action.spec);\n return { ...state, claims: next };\n }\n case \"release\": {\n if (!state.claims.has(action.zone)) return state;\n const next = new Map(state.claims);\n next.delete(action.zone);\n return { ...state, claims: next };\n }\n case \"resize\":\n if (action.rows === state.totalRows) return state;\n return { ...state, totalRows: action.rows };\n }\n}\n\ninterface BudgetContextValue {\n totalRows: number;\n allocations: ReadonlyMap<ZoneId, number>;\n claims: ReadonlyMap<ZoneId, ClaimSpec>;\n dispatch: React.Dispatch<BudgetAction>;\n}\n\nconst BudgetContext = createContext<BudgetContextValue | null>(null);\n\nexport interface ViewportBudgetProviderProps {\n children: React.ReactNode;\n /** Test seam — bypasses useStdout. */\n initialRows?: number;\n}\n\nexport function ViewportBudgetProvider({\n children,\n initialRows,\n}: ViewportBudgetProviderProps): React.ReactElement {\n const { stdout } = useStdout();\n const [state, dispatch] = useReducer(reducer, undefined, () => ({\n claims: new Map<ZoneId, ClaimSpec>(),\n totalRows: initialRows ?? stdout?.rows ?? 40,\n }));\n\n // Single resize listener — children read totalRows from context.\n useEffect(() => {\n if (initialRows !== undefined) return undefined;\n if (!stdout) return undefined;\n const onResize = () => dispatch({ type: \"resize\", rows: stdout.rows ?? 40 });\n onResize();\n stdout.on(\"resize\", onResize);\n return () => {\n stdout.off(\"resize\", onResize);\n };\n }, [stdout, initialRows]);\n\n const allocations = useMemo(() => {\n const list: InternalClaim[] = [];\n for (const [zone, spec] of state.claims) {\n list.push({ zone, priority: ZONE_PRIORITY[zone], ...spec });\n }\n return allocateRows(list, state.totalRows);\n }, [state.claims, state.totalRows]);\n\n const value = useMemo<BudgetContextValue>(\n () => ({\n totalRows: state.totalRows,\n allocations,\n claims: state.claims,\n dispatch,\n }),\n [state.totalRows, allocations, state.claims],\n );\n\n return <BudgetContext.Provider value={value}>{children}</BudgetContext.Provider>;\n}\n\n/** Returns actual allocation; falls back to spec.max when no provider is mounted. */\nexport function useReserveRows(zone: ZoneId, spec: ClaimSpec): number {\n const ctx = useContext(BudgetContext);\n // Deps key off dispatch (stable) + primitives — whole ctx changes every claim and would loop.\n const dispatch = ctx?.dispatch;\n\n useEffect(() => {\n if (!dispatch) return undefined;\n dispatch({ type: \"claim\", zone, spec: { min: spec.min, max: spec.max } });\n return () => {\n dispatch({ type: \"release\", zone });\n };\n }, [dispatch, zone, spec.min, spec.max]);\n\n if (!ctx) return Number.isFinite(spec.max) ? spec.max : 40;\n const allocated = ctx.allocations.get(zone);\n if (allocated !== undefined) return allocated;\n // Optimistic max for pre-effect first render.\n return Number.isFinite(spec.max) ? spec.max : ctx.totalRows;\n}\n\n/** Total terminal rows from the provider; falls back to useStdout if unmounted. */\nexport function useTotalRows(): number {\n const ctx = useContext(BudgetContext);\n const { stdout } = useStdout();\n return ctx?.totalRows ?? stdout?.rows ?? 40;\n}\n","import { Box, Text } from \"ink\";\nimport React, { useMemo, useState } from \"react\";\nimport { formatEditBlockSplit } from \"../../code/diff-preview.js\";\nimport type { EditBlock } from \"../../code/edit-blocks.js\";\nimport { DenyContextInput } from \"./DenyContextInput.js\";\nimport { SplitDiff } from \"./SplitDiff.js\";\nimport { ApprovalCard } from \"./cards/ApprovalCard.js\";\nimport { useKeystroke } from \"./keystroke-context.js\";\nimport { useReserveRows, useTotalRows } from \"./layout/viewport-budget.js\";\n\nexport type EditReviewChoice = \"apply\" | \"reject\" | \"apply-rest-of-turn\" | \"flip-to-auto\";\n\nexport interface EditConfirmProps {\n block: EditBlock;\n onChoose: (choice: EditReviewChoice, denyContext?: string) => void;\n}\n\nconst MODAL_OVERHEAD_ROWS = 18;\nconst MIN_DIFF_ROWS = 8;\n\nconst REVIEW_FOOTER =\n \"[y/Enter] apply · [n] reject with reason · [a] apply rest · [A] flip AUTO · [↑↓/Space] scroll · [Esc] abort\";\n\nexport function EditConfirm({ block, onChoose }: EditConfirmProps) {\n const rows = useTotalRows();\n const allocated = useReserveRows(\"modal\", {\n min: MODAL_OVERHEAD_ROWS + MIN_DIFF_ROWS,\n max: Math.max(MODAL_OVERHEAD_ROWS + MIN_DIFF_ROWS, rows - 4),\n });\n const budget = Math.max(MIN_DIFF_ROWS, allocated - MODAL_OVERHEAD_ROWS);\n\n const allRows = useMemo(\n () => formatEditBlockSplit(block, { contextLines: 2, maxLines: 100_000 }),\n [block],\n );\n\n const [scroll, setScroll] = useState(0);\n const maxScroll = Math.max(0, allRows.length - budget);\n const effectiveScroll = Math.min(scroll, maxScroll);\n\n const [phase, setPhase] = useState<\"review\" | \"context\">(\"review\");\n\n useKeystroke((ev) => {\n if (ev.paste) return;\n if (phase === \"context\") return;\n\n const input = ev.input;\n const key = ev;\n if (key.return || input === \"y\") {\n onChoose(\"apply\");\n return;\n }\n if (input === \"n\") {\n setPhase(\"context\");\n return;\n }\n if (input === \"a\") {\n onChoose(\"apply-rest-of-turn\");\n return;\n }\n if (input === \"A\") {\n onChoose(\"flip-to-auto\");\n return;\n }\n if (key.downArrow || input === \"j\") {\n setScroll((s) => Math.min(maxScroll, s + 1));\n return;\n }\n if (key.upArrow || input === \"k\") {\n setScroll((s) => Math.max(0, s - 1));\n return;\n }\n if (key.pageDown || input === \" \" || input === \"f\") {\n setScroll((s) => Math.min(maxScroll, s + Math.max(1, budget - 2)));\n return;\n }\n if (key.pageUp || input === \"b\") {\n setScroll((s) => Math.max(0, s - Math.max(1, budget - 2)));\n return;\n }\n if (input === \"g\") {\n setScroll(0);\n return;\n }\n if (input === \"G\") {\n setScroll(maxScroll);\n return;\n }\n });\n\n const isNew = block.search === \"\";\n const removed = isNew ? 0 : (block.search.match(/\\n/g)?.length ?? 0) + 1;\n const added = block.replace === \"\" ? 0 : (block.replace.match(/\\n/g)?.length ?? 0) + 1;\n const tag = isNew ? \"NEW\" : \"EDIT\";\n const tone = isNew ? \"ok\" : \"warn\";\n const glyph = isNew ? \"✚\" : \"✎\";\n\n const visibleRows = allRows.slice(effectiveScroll, effectiveScroll + budget);\n const hiddenAbove = effectiveScroll;\n const hiddenBelow = Math.max(0, allRows.length - effectiveScroll - budget);\n const totalLines = allRows.length;\n const showScrollHud = hiddenAbove + hiddenBelow > 0;\n\n const metaParts = [`-${removed} +${added} lines`];\n if (showScrollHud) {\n metaParts.push(\n `viewing ${effectiveScroll + 1}-${effectiveScroll + visibleRows.length}/${totalLines}`,\n );\n }\n\n if (phase === \"context\") {\n return (\n <ApprovalCard\n tone=\"error\"\n glyph=\"✗\"\n title=\"Deny — provide context\"\n metaRight=\"optional\"\n footerHint=\"⏎ submit · esc skip (deny without reason)\"\n >\n <DenyContextInput\n onSubmit={(context) => onChoose(\"reject\", context)}\n onCancel={() => setPhase(\"review\")}\n />\n </ApprovalCard>\n );\n }\n\n return (\n <ApprovalCard\n tone={tone}\n glyph={glyph}\n title={`${tag} ${block.path}`}\n metaRight={metaParts.join(\" · \")}\n footerHint={REVIEW_FOOTER}\n >\n {hiddenAbove > 0 ? (\n <Text\n dimColor\n >{` ↑ ${hiddenAbove} line${hiddenAbove === 1 ? \"\" : \"s\"} above (↑/k or PgUp)`}</Text>\n ) : null}\n <SplitDiff rows={visibleRows} />\n <Box>\n <Text color=\"#fbc8c8\" backgroundColor=\"#2a1212\">\n {\" - old \"}\n </Text>\n <Text>{\" \"}</Text>\n <Text color=\"#bef0c8\" backgroundColor=\"#0c2718\">\n {\" + new \"}\n </Text>\n <Text dimColor>\n {\" side-by-side · removed lines on the left, added on the right · paired by offset\"}\n </Text>\n </Box>\n {hiddenBelow > 0 ? (\n <Text\n dimColor\n >{` ↓ ${hiddenBelow} line${hiddenBelow === 1 ? \"\" : \"s\"} below (↓/j or Space/PgDn)`}</Text>\n ) : null}\n </ApprovalCard>\n );\n}\n","/** Trim shared head/tail; render middle as -/+. NOT Myers — sufficient for SEARCH/REPLACE shape. */\n\nimport type { EditBlock } from \"./edit-blocks.js\";\n\nexport interface DiffPreviewOptions {\n /** How many lines of unchanged context to show at each end. Default 2. */\n contextLines?: number;\n /** Hard cap on total rendered lines. Default 20 — beyond this the preview collapses. */\n maxLines?: number;\n /** Indent applied to every output line. Default 8 spaces — matches the pending-preview nesting. */\n indent?: string;\n}\n\nexport interface AllBlockDiffOptions extends DiffPreviewOptions {\n numbered?: boolean;\n}\n\n/** Render one edit block's diff. Returns an array of formatted lines. */\nexport function formatEditBlockDiff(block: EditBlock, opts: DiffPreviewOptions = {}): string[] {\n const contextLines = Math.max(0, opts.contextLines ?? 2);\n const maxLines = Math.max(4, opts.maxLines ?? 20);\n const indent = opts.indent ?? \" \";\n\n const search = block.search === \"\" ? [] : block.search.split(\"\\n\");\n const replace = block.replace.split(\"\\n\");\n\n // New-file case: no search to compare, show the full new content\n // (capped). Mark every line `+` so the user knows it's all additions.\n if (search.length === 0) {\n return renderAllPlus(replace, indent, maxLines);\n }\n\n // Common leading / trailing lines — shared context we can collapse.\n let leading = 0;\n while (\n leading < search.length &&\n leading < replace.length &&\n search[leading] === replace[leading]\n ) {\n leading++;\n }\n let trailing = 0;\n while (\n trailing < search.length - leading &&\n trailing < replace.length - leading &&\n search[search.length - 1 - trailing] === replace[replace.length - 1 - trailing]\n ) {\n trailing++;\n }\n\n const searchMiddle = search.slice(leading, search.length - trailing);\n const replaceMiddle = replace.slice(leading, replace.length - trailing);\n\n // Trim context to `contextLines` on each side.\n const leadShown = search.slice(Math.max(0, leading - contextLines), leading);\n const leadHidden = leading - leadShown.length;\n const trailShown = search.slice(\n search.length - trailing,\n search.length - trailing + contextLines,\n );\n const trailHidden = trailing - trailShown.length;\n\n const out: string[] = [];\n if (leadHidden > 0) {\n out.push(`${indent} … ${leadHidden} unchanged line${leadHidden === 1 ? \"\" : \"s\"} above`);\n }\n for (const l of leadShown) out.push(`${indent} ${l}`);\n for (const l of searchMiddle) out.push(`${indent}- ${l}`);\n for (const l of replaceMiddle) out.push(`${indent}+ ${l}`);\n for (const l of trailShown) out.push(`${indent} ${l}`);\n if (trailHidden > 0) {\n out.push(`${indent} … ${trailHidden} unchanged line${trailHidden === 1 ? \"\" : \"s\"} below`);\n }\n\n return capLines(out, maxLines, indent);\n}\n\nexport function formatAllBlockDiffs(\n blocks: readonly EditBlock[],\n opts: AllBlockDiffOptions = {},\n): string[] {\n const out: string[] = [];\n for (let i = 0; i < blocks.length; i++) {\n const b = blocks[i]!;\n const removed = b.search === \"\" ? 0 : countLines(b.search);\n const added = countLines(b.replace);\n const tag = b.search === \"\" ? \"NEW \" : \" \";\n if (i > 0) out.push(\"\");\n const label = opts.numbered ? `[${i + 1}] ` : \"\";\n out.push(` ${label}${tag}${b.path} (-${removed} +${added} lines)`);\n out.push(...formatEditBlockDiff(b, opts));\n }\n return out;\n}\n\nfunction countLines(s: string): number {\n if (s.length === 0) return 0;\n return (s.match(/\\n/g)?.length ?? 0) + 1;\n}\n\nexport interface SplitDiffRow {\n left: { num: number | null; text: string; kind: \"ctx\" | \"del\" | \"pad\" };\n right: { num: number | null; text: string; kind: \"ctx\" | \"add\" | \"pad\" };\n}\n\nexport interface SplitDiffOptions extends DiffPreviewOptions {\n /** Starting 1-based line number for the old side. Default 1. */\n startLine?: number;\n}\n\n/** Pairs removed/added by index — visually correct for SEARCH/REPLACE shape, skips Myers' O(N²) LCS. */\nexport function formatEditBlockSplit(\n block: EditBlock,\n opts: SplitDiffOptions = {},\n): SplitDiffRow[] {\n const contextLines = Math.max(0, opts.contextLines ?? 2);\n const maxLines = Math.max(4, opts.maxLines ?? 40);\n const startLine = opts.startLine ?? 1;\n\n const search = block.search === \"\" ? [] : block.search.split(\"\\n\");\n const replace = block.replace.split(\"\\n\");\n\n // New-file case: empty old column, every replace line on the right.\n if (search.length === 0) {\n const rows: SplitDiffRow[] = [];\n let n = startLine;\n for (const l of replace) {\n rows.push({\n left: { num: null, text: \"\", kind: \"pad\" },\n right: { num: n++, text: l, kind: \"add\" },\n });\n }\n return capRows(rows, maxLines);\n }\n\n // Trim shared leading + trailing context — same logic as the\n // unified diff renderer, kept in lockstep so both stay accurate.\n let leading = 0;\n while (\n leading < search.length &&\n leading < replace.length &&\n search[leading] === replace[leading]\n ) {\n leading++;\n }\n let trailing = 0;\n while (\n trailing < search.length - leading &&\n trailing < replace.length - leading &&\n search[search.length - 1 - trailing] === replace[replace.length - 1 - trailing]\n ) {\n trailing++;\n }\n\n const searchMiddle = search.slice(leading, search.length - trailing);\n const replaceMiddle = replace.slice(leading, replace.length - trailing);\n const leadStartIdx = Math.max(0, leading - contextLines);\n const leadShown = search.slice(leadStartIdx, leading);\n const trailShown = search.slice(\n search.length - trailing,\n search.length - trailing + contextLines,\n );\n\n const rows: SplitDiffRow[] = [];\n let leftNum = startLine + leadStartIdx;\n let rightNum = startLine + leadStartIdx;\n\n // Leading context — identical on both sides.\n for (const l of leadShown) {\n rows.push({\n left: { num: leftNum++, text: l, kind: \"ctx\" },\n right: { num: rightNum++, text: l, kind: \"ctx\" },\n });\n }\n\n // Paired removed/added rows (up to min length).\n const pairedCount = Math.min(searchMiddle.length, replaceMiddle.length);\n for (let i = 0; i < pairedCount; i++) {\n rows.push({\n left: { num: leftNum++, text: searchMiddle[i]!, kind: \"del\" },\n right: { num: rightNum++, text: replaceMiddle[i]!, kind: \"add\" },\n });\n }\n // Extra removed lines (more old than new) — left only.\n for (let i = pairedCount; i < searchMiddle.length; i++) {\n rows.push({\n left: { num: leftNum++, text: searchMiddle[i]!, kind: \"del\" },\n right: { num: null, text: \"\", kind: \"pad\" },\n });\n }\n // Extra added lines (more new than old) — right only.\n for (let i = pairedCount; i < replaceMiddle.length; i++) {\n rows.push({\n left: { num: null, text: \"\", kind: \"pad\" },\n right: { num: rightNum++, text: replaceMiddle[i]!, kind: \"add\" },\n });\n }\n\n // Trailing context — identical on both sides.\n for (const l of trailShown) {\n rows.push({\n left: { num: leftNum++, text: l, kind: \"ctx\" },\n right: { num: rightNum++, text: l, kind: \"ctx\" },\n });\n }\n\n return capRows(rows, maxLines);\n}\n\nfunction capRows(rows: SplitDiffRow[], maxRows: number): SplitDiffRow[] {\n if (rows.length <= maxRows) return rows;\n const head = rows.slice(0, maxRows - 1);\n const hidden = rows.length - head.length;\n // Replace the trailing slot with a \"more lines hidden\" marker row,\n // rendered as a pad on both sides with a special text so the\n // renderer can pick it up.\n head.push({\n left: { num: null, text: `… (${hidden} more lines)`, kind: \"pad\" },\n right: { num: null, text: \"\", kind: \"pad\" },\n });\n return head;\n}\n\nfunction renderAllPlus(lines: string[], indent: string, maxLines: number): string[] {\n const out = lines.map((l) => `${indent}+ ${l}`);\n return capLines(out, maxLines, indent);\n}\n\nfunction capLines(lines: string[], maxLines: number, indent: string): string[] {\n if (lines.length <= maxLines) return lines;\n const head = lines.slice(0, maxLines - 1);\n const hidden = lines.length - head.length;\n head.push(`${indent}… (${hidden} more diff lines — full content applies on /apply)`);\n return head;\n}\n","import { Box, Text } from \"ink\";\nimport React, { useState } from \"react\";\nimport { useKeystroke } from \"./keystroke-context.js\";\nimport { FG, TONE } from \"./theme/tokens.js\";\n\nexport interface DenyContextInputProps {\n description?: string;\n onSubmit: (context: string) => void;\n onCancel: () => void;\n}\n\nconst DEFAULT_DESCRIPTION =\n \"Tell the agent why you denied this. The next attempt will see your reason as additional context.\";\n\nexport function DenyContextInput({\n description = DEFAULT_DESCRIPTION,\n onSubmit,\n onCancel,\n}: DenyContextInputProps) {\n const [value, setValue] = useState(\"\");\n\n useKeystroke((ev) => {\n if (ev.paste) {\n setValue((v) => v + ev.input);\n return;\n }\n if (ev.escape) {\n onCancel();\n return;\n }\n if (ev.return) {\n onSubmit(value);\n return;\n }\n if (ev.backspace) {\n setValue((v) => v.slice(0, -1));\n return;\n }\n if (ev.input && !ev.tab && !ev.upArrow && !ev.downArrow && !ev.leftArrow && !ev.rightArrow) {\n setValue((v) => v + ev.input);\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color={FG.sub}>{description}</Text>\n </Box>\n <Box>\n <Text bold color={TONE.brand}>\n {\"› \"}\n </Text>\n <Text color={FG.body}>{value}</Text>\n <Text backgroundColor={TONE.brand} color={\"#000\"}>\n {\" \"}\n </Text>\n </Box>\n </Box>\n );\n}\n","/**\n * Side-by-side diff renderer — git-difftool / delta-style \"old | new\"\n * layout. Each row shows the same logical position on both sides;\n * removed lines have content on the left only with a red wash, added\n * lines on the right with a green wash, common context appears on\n * both sides dim.\n *\n * Layout:\n *\n * 40 function loginUser(...) │ 40 function loginUser(...)\n * 41 - if (!email) throw new Error… │ 41 + if (!email || typeof email…\n * │ 42 + throw new TypeError(…)\n * │ 43 + }\n * 42 return verify(email, …) │ 44 return verify(email, …)\n *\n * Width is derived from the terminal — half each side minus a 3-cell\n * separator (` │ `). Long lines truncate with `…` rather than wrap,\n * so the row count stays predictable for the parent's height budget.\n */\n\nimport { Box, Text, useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for React.Fragment\nimport React from \"react\";\nimport type { SplitDiffRow } from \"../../code/diff-preview.js\";\nimport { COLOR } from \"./theme.js\";\n\nexport interface SplitDiffProps {\n rows: readonly SplitDiffRow[];\n /**\n * Total columns budget. Defaults to terminal width. Modal callers\n * pass a smaller number so the diff fits inside the modal frame.\n */\n totalCols?: number;\n}\n\nexport function SplitDiff({ rows, totalCols }: SplitDiffProps): React.ReactElement {\n const { stdout } = useStdout();\n const cols = totalCols ?? stdout?.columns ?? 80;\n // Reserve ~6 cells for outer border + padding on the modal/log side,\n // 3 cells for the ` │ ` separator. Half the rest per column.\n const innerCols = Math.max(40, cols - 6);\n const halfCols = Math.floor((innerCols - 3) / 2);\n return (\n <Box flexDirection=\"column\">\n {rows.map((row, i) => (\n <Box key={`r-${i}-${row.left.num ?? \"p\"}-${row.right.num ?? \"p\"}`}>\n <Cell side={row.left} width={halfCols} which=\"left\" />\n <Text color={COLOR.info} dimColor>\n {\" │ \"}\n </Text>\n <Cell side={row.right} width={halfCols} which=\"right\" />\n </Box>\n ))}\n </Box>\n );\n}\n\nfunction Cell({\n side,\n width,\n which,\n}: {\n side: SplitDiffRow[\"left\"] | SplitDiffRow[\"right\"];\n width: number;\n which: \"left\" | \"right\";\n}) {\n const numPad = 4; // up to 9999 lines\n const sgnPad = 1; // single-char sign\n const inner = Math.max(8, width - numPad - sgnPad - 2 /* spaces */);\n\n const numStr = side.num !== null ? String(side.num).padStart(numPad) : \" \".repeat(numPad);\n const sign =\n side.kind === \"del\" ? \"-\" : side.kind === \"add\" ? \"+\" : side.kind === \"pad\" ? \" \" : \" \";\n const raw = side.text;\n const truncated = raw.length > inner ? `${raw.slice(0, inner - 1)}…` : raw;\n // Pad to fixed width so the bg color stretches across the whole\n // column even when the text is short — without this the red/green\n // wash would only cover the actual chars and the rest of the row\n // would be terminal default, which looks broken.\n const padded = truncated.padEnd(inner);\n\n if (side.kind === \"del\") {\n return (\n <Text color=\"#fbc8c8\" backgroundColor=\"#2a1212\">\n {`${numStr} ${sign} ${padded}`}\n </Text>\n );\n }\n if (side.kind === \"add\") {\n return (\n <Text color=\"#bef0c8\" backgroundColor=\"#0c2718\">\n {`${numStr} ${sign} ${padded}`}\n </Text>\n );\n }\n if (side.kind === \"pad\") {\n // Empty side — mute everything, no bg, no glyph. The \"… more\n // lines\" capRows marker also rides this kind on the left side\n // when present, so we render its text dim italic.\n return (\n <Text color={COLOR.info} dimColor italic={!!raw}>\n {`${numStr} ${sign} ${padded}`}\n </Text>\n );\n }\n // ctx: same content both sides, dim\n return <Text dimColor>{`${numStr} ${sign} ${padded}`}</Text>;\n}\n","/** `/mcp` slash modal — single hub with two tabs: Live (attached servers) + Marketplace (registry). */\n\nimport { Box, Text } from \"ink\";\nimport React, { useState } from \"react\";\nimport { McpBrowser } from \"./McpBrowser.js\";\nimport { McpMarketplace } from \"./McpMarketplace.js\";\nimport type { PickerBroadcastPorts } from \"./dashboard/use-picker-broadcast.js\";\nimport { useKeystroke } from \"./keystroke-context.js\";\nimport type { ApplyAppend } from \"./mcp-reconnect-kickoff.js\";\nimport type { McpServerSummary } from \"./slash/types.js\";\nimport { COLOR } from \"./theme.js\";\n\nexport type McpHubTab = \"live\" | \"marketplace\";\n\nexport interface McpHubProps {\n initialTab: McpHubTab;\n liveServers: McpServerSummary[];\n configPath: string;\n onClose: () => void;\n postInfo: (text: string) => void;\n applyAppend?: ApplyAppend;\n reloadMcp?: () => Promise<{\n added: string[];\n removed: string[];\n failed: Array<{ spec: string; reason: string }>;\n }>;\n /** Forwarded to the marketplace tab so the web dashboard can drive install / uninstall / refine / load-more. */\n pickerPorts?: PickerBroadcastPorts;\n}\n\nexport function McpHub({\n initialTab,\n liveServers,\n configPath,\n onClose,\n postInfo,\n applyAppend,\n reloadMcp,\n pickerPorts,\n}: McpHubProps) {\n const [tab, setTab] = useState<McpHubTab>(initialTab);\n\n // Hub-level: Tab key cycles tabs. Inner components don't bind Tab\n // (Marketplace rebound to PgDn for load-more) so no conflict.\n useKeystroke((ev) => {\n if (ev.paste) return;\n if (ev.tab) setTab((t) => (t === \"live\" ? \"marketplace\" : \"live\"));\n });\n\n return (\n <Box flexDirection=\"column\">\n <Box paddingX={1}>\n <Text bold color={COLOR.brand}>\n ◈ MCP\n </Text>\n <Text>{\" \"}</Text>\n <TabPill label=\"Live\" count={liveServers.length} active={tab === \"live\"} />\n <Text>{\" \"}</Text>\n <TabPill label=\"Marketplace\" active={tab === \"marketplace\"} />\n <Text dimColor>{\" tab to switch\"}</Text>\n </Box>\n {tab === \"live\" ? (\n <McpBrowser\n servers={liveServers}\n configPath={configPath}\n onClose={onClose}\n postInfo={postInfo}\n applyAppend={applyAppend}\n />\n ) : (\n <McpMarketplace\n onClose={onClose}\n postInfo={postInfo}\n reloadMcp={reloadMcp}\n pickerPorts={pickerPorts}\n />\n )}\n </Box>\n );\n}\n\nfunction TabPill({ label, count, active }: { label: string; count?: number; active: boolean }) {\n const text = count !== undefined ? `${label} (${count})` : label;\n if (active) {\n return (\n <Text bold color={COLOR.brand}>\n [{text}]\n </Text>\n );\n }\n return <Text dimColor>{` ${text} `}</Text>;\n}\n","/** `/mcp` browser modal — keyboard-driven server list per design §24. */\n\nimport { Box, Text } from \"ink\";\nimport React, { useState } from \"react\";\nimport { useKeystroke } from \"./keystroke-context.js\";\nimport { toggleMcpDisabled } from \"./mcp-disable.js\";\nimport { healthBadge } from \"./mcp-health.js\";\nimport { type ApplyAppend, kickOffMcpReconnect } from \"./mcp-reconnect-kickoff.js\";\nimport type { McpServerSummary } from \"./slash/types.js\";\nimport { COLOR } from \"./theme.js\";\n\nexport interface McpBrowserProps {\n servers: McpServerSummary[];\n configPath: string;\n onClose: () => void;\n /** Pushed by the modal when a key triggers async work (`r` reconnect). */\n postInfo: (text: string) => void;\n /** Optional — opt-in to append-drift acceptance on `r`. Without it, append-drift refuses. */\n applyAppend?: ApplyAppend;\n}\n\nexport function McpBrowser({\n servers,\n configPath,\n onClose,\n postInfo,\n applyAppend,\n}: McpBrowserProps) {\n const [index, setIndex] = useState(0);\n const max = Math.max(0, servers.length - 1);\n\n useKeystroke((ev) => {\n if (ev.paste) return;\n if (ev.upArrow) setIndex((i) => Math.max(0, i - 1));\n else if (ev.downArrow) setIndex((i) => Math.min(max, i + 1));\n else if (ev.escape) onClose();\n else if (ev.input === \"r\") {\n const target = servers[index];\n if (!target) return;\n // Hand the \"starting\" lifecycle line to scrollback and let the\n // kickoff schedule the result line via postInfo. Close the modal\n // so the line is visible immediately.\n postInfo(kickOffMcpReconnect(target, postInfo, applyAppend));\n onClose();\n } else if (ev.input === \"d\") {\n const target = servers[index];\n if (!target) return;\n // Persist `mcpDisabled` and close — takes effect on next launch.\n postInfo(toggleMcpDisabled(\"disable\", target.label));\n onClose();\n }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Box>\n <Text bold color={COLOR.brand}>\n ◈ MCP browser\n </Text>\n <Text\n dimColor\n >{` · ${configPath} · ${servers.length} server${servers.length === 1 ? \"\" : \"s\"}`}</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {servers.length === 0 ? (\n <Text dimColor>\n No MCP servers attached. Run `reasonix setup` to pick some, or launch with --mcp.\n </Text>\n ) : (\n servers.map((s, i) => (\n <ServerRow key={s.label + s.spec} server={s} active={i === index} />\n ))\n )}\n </Box>\n <Box marginTop={1}>\n <Text dimColor>↑↓ pick · [r] reconnect · [d] disable · esc quit</Text>\n </Box>\n </Box>\n );\n}\n\nfunction ServerRow({ server, active }: { server: McpServerSummary; active: boolean }) {\n const { label, toolCount, report } = server;\n const resourceCount = report.resources.supported ? report.resources.items.length : 0;\n const promptCount = report.prompts.supported ? report.prompts.items.length : 0;\n const elapsed = report.elapsedMs;\n const health = healthBadge(elapsed);\n const counts = `${toolCount} tools · ${resourceCount} resources · ${promptCount} prompts`;\n\n return (\n <Box flexDirection=\"column\" marginBottom={active ? 1 : 0}>\n <Box>\n <Text color={active ? COLOR.brand : undefined}>{active ? \"▸ \" : \" \"}</Text>\n <Text bold={active} color={active ? \"#e6edf3\" : undefined}>\n {label.padEnd(14)}\n </Text>\n <Text color={health.color}>{`${health.glyph} ${health.label}`}</Text>\n <Text dimColor>{` ${counts}`}</Text>\n </Box>\n {active ? (\n <Box>\n <Text dimColor>{` ${capabilityList(server)}`}</Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n\nfunction capabilityList(s: McpServerSummary): string {\n const caps: string[] = [\"tools/list\", \"tools/call\"];\n if (s.report.resources.supported) caps.push(\"resources/list\");\n if (s.report.prompts.supported) caps.push(\"prompts/list\");\n return caps.join(\" \");\n}\n","/** Persists `mcpDisabled` to ~/.reasonix/config.json — shared between `/mcp disable / enable` slash and the McpBrowser `d` keybind. */\n\nimport { readConfig, writeConfig } from \"../../config.js\";\n\nexport function toggleMcpDisabled(action: \"disable\" | \"enable\", name: string): string {\n const trimmed = name.trim();\n if (!trimmed) {\n return `usage: /mcp ${action} <name> · pick a name shown in /mcp (anonymous servers can't be named-toggled).`;\n }\n const cfg = readConfig();\n const current = new Set(cfg.mcpDisabled ?? []);\n if (action === \"disable\") {\n if (current.has(trimmed)) {\n return `▸ ${trimmed} is already disabled — restart to apply, or /mcp enable ${trimmed}.`;\n }\n current.add(trimmed);\n writeConfig({ ...cfg, mcpDisabled: [...current].sort() });\n return `▸ ${trimmed} disabled — takes effect on next launch. /mcp enable ${trimmed} to revert.`;\n }\n if (!current.has(trimmed)) {\n return `▸ ${trimmed} is not disabled.`;\n }\n current.delete(trimmed);\n writeConfig({ ...cfg, mcpDisabled: current.size > 0 ? [...current].sort() : undefined });\n return `▸ ${trimmed} re-enabled — takes effect on next launch.`;\n}\n","import { COLOR } from \"./theme.js\";\n\nexport interface HealthBadge {\n glyph: string;\n label: string;\n color: string;\n}\n\nexport function healthBadge(elapsedMs: number): HealthBadge {\n if (elapsedMs === 0) return { glyph: \"✗\", label: \"no inspect data\", color: COLOR.err };\n if (elapsedMs < 500) return { glyph: \"●\", label: `healthy · ${elapsedMs}ms`, color: COLOR.ok };\n if (elapsedMs < 3000) return { glyph: \"◌\", label: `slow · ${elapsedMs}ms`, color: COLOR.warn };\n return { glyph: \"✗\", label: `very slow · ${elapsedMs}ms`, color: COLOR.err };\n}\n\n// Preserves original slash thresholds: 0 → \"● healthy · 0ms\" (no === 0 branch)\nexport function slashHealthBadge(elapsedMs: number): string {\n if (elapsedMs < 500) return `● healthy · ${elapsedMs}ms`;\n if (elapsedMs < 3000) return `◌ slow · ${elapsedMs}ms`;\n return `✗ very slow · ${elapsedMs}ms`;\n}\n","/** Classifies a tool-list drift across an MCP reconnect. Drives the policy in `/mcp reconnect`. */\n\nimport type { ToolSpec } from \"../types.js\";\n\n/** Ordered by \"cache cost\" — `identity` and `append` are nearly free; `reorder` is catastrophic. */\nexport type DriftKind = \"identity\" | \"append\" | \"edit\" | \"reorder\" | \"remove\";\n\nexport interface DriftReport {\n kind: DriftKind;\n /** Tool names added by the new spec (relative to `before`). */\n added: string[];\n /** Tool names removed by the new spec (gone from `after`). */\n removed: string[];\n /** Tool names whose name + position match but whose serialized content changed. */\n edited: string[];\n}\n\nexport function classifyToolListDrift(\n before: readonly ToolSpec[],\n after: readonly ToolSpec[],\n): DriftReport {\n const beforeNames = before.map(nameOf);\n const afterNames = after.map(nameOf);\n const beforeSet = new Set(beforeNames);\n const afterSet = new Set(afterNames);\n\n const added = afterNames.filter((n) => !beforeSet.has(n));\n const removed = beforeNames.filter((n) => !afterSet.has(n));\n\n const edited: string[] = [];\n // Same-position-same-name slots whose serialized content differs.\n const sharedLen = Math.min(before.length, after.length);\n for (let i = 0; i < sharedLen; i++) {\n if (beforeNames[i] === afterNames[i] && hash(before[i]!) !== hash(after[i]!)) {\n edited.push(beforeNames[i]!);\n }\n }\n\n // Identity: same length, same names in order, same content.\n if (\n before.length === after.length &&\n edited.length === 0 &&\n beforeNames.every((n, i) => n === afterNames[i])\n ) {\n return { kind: \"identity\", added: [], removed: [], edited: [] };\n }\n\n // Remove anywhere → catastrophic regardless of other changes.\n if (removed.length > 0) {\n return { kind: \"remove\", added, removed, edited };\n }\n\n // Append: every before-tool stays put with identical content, new ones tacked on the end.\n if (\n after.length > before.length &&\n beforeNames.every((n, i) => n === afterNames[i] && hash(before[i]!) === hash(after[i]!))\n ) {\n return { kind: \"append\", added, removed: [], edited: [] };\n }\n\n // Same name set as before? Then positions or content changed.\n const sameNameSet =\n beforeSet.size === afterSet.size && [...beforeSet].every((n) => afterSet.has(n));\n if (sameNameSet) {\n const positionsMatch = beforeNames.every((n, i) => n === afterNames[i]);\n if (positionsMatch) {\n // Names + positions stable, only content edited in place.\n return { kind: \"edit\", added: [], removed: [], edited };\n }\n // Same set, different order — cache-wise as bad as a structural change.\n return { kind: \"reorder\", added: [], removed: [], edited };\n }\n\n // Additions present but NOT clean appends (e.g. inserted in the middle, or\n // appended-but-existing-tools-also-edited). Treat as reorder for safety —\n // the divergence point is no longer the tail of the list.\n return { kind: \"reorder\", added, removed: [], edited };\n}\n\nfunction nameOf(spec: ToolSpec): string {\n return spec.function?.name ?? \"\";\n}\n\nfunction hash(spec: ToolSpec): string {\n return JSON.stringify(spec);\n}\n","/** `/mcp reconnect` — open a fresh client, accept identity (always) and append (opt-in), refuse the rest cleanly. */\n\nimport { McpClient } from \"./client.js\";\nimport { classifyToolListDrift } from \"./drift.js\";\nimport type { McpClientHost } from \"./registry.js\";\nimport { type McpSpec, parseMcpSpec } from \"./spec.js\";\nimport { SseTransport } from \"./sse.js\";\nimport { type McpTransport, StdioTransport } from \"./stdio.js\";\nimport { StreamableHttpTransport } from \"./streamable-http.js\";\nimport type { McpTool } from \"./types.js\";\n\nexport interface ReconnectArgs {\n /** Live host whose `client` will be swapped on success. */\n host: McpClientHost;\n /** Original `--mcp` spec string the server was launched with. Re-parsed to rebuild transport. */\n spec: string;\n /** The current tool list, used as the drift baseline. */\n beforeTools: readonly McpTool[];\n /** Drift kinds the caller is willing to accept. Default: [\"identity\"]. */\n accept?: ReadonlyArray<\"identity\" | \"append\">;\n}\n\nexport type ReconnectResult =\n | {\n ok: true;\n kind: \"identity\" | \"append\";\n afterTools: McpTool[];\n /** Tools present in `afterTools` but not in `beforeTools` (empty for identity). */\n addedTools: McpTool[];\n ms: number;\n }\n | {\n ok: false;\n reason:\n | \"spec_parse\"\n | \"handshake\"\n | \"drift_added\"\n | \"drift_edited\"\n | \"drift_reordered\"\n | \"drift_removed\";\n message: string;\n ms: number;\n };\n\nexport async function reconnectMcpServer(args: ReconnectArgs): Promise<ReconnectResult> {\n const t0 = Date.now();\n const accept = args.accept ?? [\"identity\"];\n let parsed: McpSpec;\n try {\n parsed = parseMcpSpec(args.spec);\n } catch (err) {\n return {\n ok: false,\n reason: \"spec_parse\",\n message: (err as Error).message,\n ms: Date.now() - t0,\n };\n }\n const transport: McpTransport =\n parsed.transport === \"sse\"\n ? new SseTransport({ url: parsed.url })\n : parsed.transport === \"streamable-http\"\n ? new StreamableHttpTransport({ url: parsed.url })\n : new StdioTransport({ command: parsed.command, args: parsed.args });\n const next = new McpClient({ transport });\n try {\n await next.initialize();\n const listed = await next.listTools();\n const drift = classifyToolListDrift(toolsToSpecs(args.beforeTools), toolsToSpecs(listed.tools));\n // Identity is always free — accept it regardless of `accept`. The opt-in\n // controls only whether append-drift also gets through.\n const acceptedKind: \"identity\" | \"append\" | null =\n drift.kind === \"identity\"\n ? \"identity\"\n : drift.kind === \"append\" && accept.includes(\"append\")\n ? \"append\"\n : null;\n if (acceptedKind === null) {\n await next.close().catch(() => {});\n const refused = drift.kind as Exclude<typeof drift.kind, \"identity\">;\n return {\n ok: false,\n reason: driftReason(refused),\n message: driftMessage(drift),\n ms: Date.now() - t0,\n };\n }\n const addedTools =\n acceptedKind === \"append\" ? listed.tools.filter((t) => drift.added.includes(t.name)) : [];\n // Swap.\n const old = args.host.client;\n args.host.client = next;\n await old.close().catch(() => {});\n return {\n ok: true,\n kind: acceptedKind,\n afterTools: listed.tools,\n addedTools,\n ms: Date.now() - t0,\n };\n } catch (err) {\n await next.close().catch(() => {});\n return {\n ok: false,\n reason: \"handshake\",\n message: (err as Error).message,\n ms: Date.now() - t0,\n };\n }\n}\n\nfunction driftReason(\n kind: Exclude<ReturnType<typeof classifyToolListDrift>[\"kind\"], \"identity\">,\n): \"drift_added\" | \"drift_edited\" | \"drift_reordered\" | \"drift_removed\" {\n if (kind === \"append\") return \"drift_added\";\n if (kind === \"edit\") return \"drift_edited\";\n if (kind === \"reorder\") return \"drift_reordered\";\n return \"drift_removed\";\n}\n\nfunction driftMessage(drift: ReturnType<typeof classifyToolListDrift>): string {\n if (drift.kind === \"append\") {\n return `tool list grew (${drift.added.length} added: ${drift.added.join(\", \")}). Restart Reasonix to bridge the new tool(s).`;\n }\n if (drift.kind === \"edit\") {\n return `tool description/schema changed for ${drift.edited.join(\", \")}. Restart Reasonix to apply.`;\n }\n if (drift.kind === \"remove\") {\n return `tool(s) removed: ${drift.removed.join(\", \")}. Restart Reasonix to drop them from the registry.`;\n }\n return \"tool list reordered or restructured — cache prefix would be invalidated. Restart Reasonix.\";\n}\n\nfunction toolsToSpecs(tools: readonly McpTool[]): import(\"../types.js\").ToolSpec[] {\n return tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description ?? \"\",\n parameters: t.inputSchema as unknown as import(\"../types.js\").JSONSchema,\n },\n }));\n}\n","/** Shared async-fire-and-forget reconnect trigger — called by both `/mcp reconnect` and the McpBrowser `r` keybind. */\n\nimport { reconnectMcpServer } from \"../../mcp/reconnect.js\";\nimport type { McpTool } from \"../../mcp/types.js\";\nimport { formatMcpLifecycleEvent } from \"./mcp-lifecycle.js\";\nimport type { McpServerSummary } from \"./slash/types.js\";\n\n/** Applies append-drift mid-session: registers each new MCP tool in the registry + prefix. Returns the updated summary. */\nexport type ApplyAppend = (target: McpServerSummary, addedTools: McpTool[]) => McpServerSummary;\n\n/** Kicks off async reconnect; returns the start-line, schedules result via postInfo. */\nexport function kickOffMcpReconnect(\n target: McpServerSummary,\n postInfo: (text: string) => void,\n applyAppend?: ApplyAppend,\n): string {\n const beforeTools = target.report.tools.supported ? target.report.tools.items : [];\n // Only opt into \"append\" when the caller wired an applyAppend handler;\n // otherwise the reconnect refuses append-drift with a \"restart\" message.\n const accept = applyAppend ? ([\"identity\", \"append\"] as const) : ([\"identity\"] as const);\n // Use a mutable local so the async closure can update it after applyAppend\n // without reassigning the function parameter (linter: noParameterAssign).\n let liveTarget = target;\n void (async () => {\n try {\n const result = await reconnectMcpServer({\n host: liveTarget.host,\n spec: liveTarget.spec,\n beforeTools,\n accept,\n });\n if (result.ok) {\n if (result.kind === \"append\" && applyAppend) {\n liveTarget = applyAppend(liveTarget, result.addedTools);\n }\n postInfo(\n formatMcpLifecycleEvent({\n state: \"connected\",\n name: target.label,\n tools: result.afterTools.length,\n ms: result.ms,\n }),\n );\n if (result.kind === \"append\") {\n const names = result.addedTools.map((t) => t.name).join(\", \");\n postInfo(`▸ ${target.label}: added ${result.addedTools.length} tool(s) — ${names}`);\n }\n } else {\n postInfo(\n formatMcpLifecycleEvent({\n state: \"failed\",\n name: target.label,\n reason: `${result.reason} · ${result.message}`,\n }),\n );\n }\n } catch (err) {\n postInfo(\n formatMcpLifecycleEvent({\n state: \"failed\",\n name: target.label,\n reason: (err as Error).message,\n }),\n );\n }\n })();\n return formatMcpLifecycleEvent({ state: \"reconnect\", name: target.label });\n}\n","/** `/mcp browse` modal — registry marketplace inside the chat session. */\n\nimport { Box, Text } from \"ink\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { readConfig, writeConfig } from \"../../config.js\";\nimport {\n type RegistryHandle,\n fetchSmitheryDetail,\n loadMorePages,\n openRegistry,\n specStringFor,\n} from \"../../mcp/registry-fetch.js\";\nimport type { RegistryEntry } from \"../../mcp/registry-types.js\";\nimport { type PickerBroadcastPorts, usePickerBroadcast } from \"./dashboard/use-picker-broadcast.js\";\nimport { useKeystroke } from \"./keystroke-context.js\";\nimport { COLOR } from \"./theme.js\";\n\nconst VISIBLE_ROWS = 10;\n\nexport interface McpMarketplaceProps {\n onClose: () => void;\n /** Pushed back into the chat scrollback after install/uninstall. */\n postInfo: (text: string) => void;\n /** Optional hot-reload — present in chat session, absent in standalone CLI use. */\n reloadMcp?: () => Promise<{\n added: string[];\n removed: string[];\n failed: Array<{ spec: string; reason: string }>;\n }>;\n pickerPorts?: PickerBroadcastPorts;\n}\n\ninterface State {\n handle: RegistryHandle | null;\n loading: boolean;\n query: string;\n selected: number;\n status: string;\n /** specs currently in config.mcp[] — refreshed after install/uninstall. */\n installedSpecs: string[];\n}\n\nexport function buildMarketplacePickerSnapshot(args: {\n filtered: RegistryEntry[];\n installedSpecs: string[];\n query: string;\n status: string;\n hasMore: boolean;\n}) {\n return {\n pickerKind: \"mcp-marketplace\" as const,\n title: `MCP marketplace · ${args.status}`,\n query: args.query,\n items: args.filtered.map((e) => {\n const installedSpec = isInstalled(args.installedSpecs, e);\n return {\n id: e.name,\n title: e.title || e.name,\n subtitle: e.description?.slice(0, 200) ?? undefined,\n badge: installedSpec\n ? \"installed\"\n : e.source === \"official\"\n ? \"official\"\n : e.source === \"smithery\"\n ? \"smithery\"\n : \"local\",\n meta: e.popularity !== undefined ? `★ ${e.popularity.toLocaleString()}` : undefined,\n };\n }),\n actions: [\"install\", \"uninstall\", \"refine\", \"load-more\", \"cancel\"] as const,\n hasMore: args.hasMore,\n hint: \"type filter · ↑↓ pick · ⏎ install/toggle · PgDn load more · esc close\",\n };\n}\n\nfunction rankAndFilter(entries: RegistryEntry[], query: string): RegistryEntry[] {\n const q = query.trim().toLowerCase();\n const list = q\n ? entries.filter((e) => `${e.name} ${e.title} ${e.description}`.toLowerCase().includes(q))\n : entries;\n return [...list].sort((a, b) => {\n const ap = a.popularity ?? -1;\n const bp = b.popularity ?? -1;\n if (ap !== bp) return bp - ap;\n return a.name.localeCompare(b.name);\n });\n}\n\nfunction readInstalledSpecs(): string[] {\n return readConfig().mcp ?? [];\n}\n\nfunction isInstalled(installedSpecs: string[], entry: RegistryEntry): string | null {\n if (!entry.install) return null;\n try {\n const spec = specStringFor(entry.name, entry.install);\n return installedSpecs.includes(spec) ? spec : null;\n } catch {\n return null;\n }\n}\n\nexport function McpMarketplace({ onClose, postInfo, reloadMcp, pickerPorts }: McpMarketplaceProps) {\n const [state, setState] = useState<State>({\n handle: null,\n loading: true,\n query: \"\",\n selected: 0,\n status: \"opening registry…\",\n installedSpecs: readInstalledSpecs(),\n });\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const handle = await openRegistry({});\n if (cancelled) return;\n setState((s) => ({\n ...s,\n handle,\n loading: false,\n status: `${handle.source} · ${handle.cache.entries.length} entries${\n handle.fromCache ? \" · cached\" : \"\"\n }`,\n }));\n } catch (err) {\n if (cancelled) return;\n setState((s) => ({ ...s, loading: false, status: `error: ${(err as Error).message}` }));\n }\n })();\n return () => {\n cancelled = true;\n };\n }, []);\n\n const filtered = useMemo(() => {\n if (!state.handle) return [];\n return rankAndFilter(state.handle.cache.entries, state.query);\n }, [state.handle, state.query]);\n\n const selected = filtered[state.selected];\n\n const fetchMore = useCallback(async () => {\n if (!state.handle || state.loading) return;\n if (state.handle.cache.pagination.nextCursor === null) {\n setState((s) => ({ ...s, status: \"all pages loaded\" }));\n return;\n }\n setState((s) => ({ ...s, loading: true, status: \"loading more…\" }));\n try {\n const r = await loadMorePages(state.handle, { pages: 5 });\n setState((s) => ({\n ...s,\n loading: false,\n status: `+${r.newEntries} · ${state.handle?.cache.entries.length ?? 0} total${\n r.exhausted ? \" · exhausted\" : \"\"\n }`,\n }));\n } catch (err) {\n setState((s) => ({ ...s, loading: false, status: `error: ${(err as Error).message}` }));\n }\n }, [state.handle, state.loading]);\n\n const doUninstall = useCallback(\n async (entry: RegistryEntry, installed: string) => {\n const cfg = readConfig();\n const next = (cfg.mcp ?? []).filter((s) => s !== installed);\n writeConfig({ ...cfg, mcp: next });\n setState((s) => ({ ...s, installedSpecs: next, status: `uninstalled ${entry.name}` }));\n if (reloadMcp) {\n try {\n await reloadMcp();\n postInfo(`✓ uninstalled ${entry.name} — bridge dropped`);\n } catch (err) {\n postInfo(\n `✓ uninstalled ${entry.name} — restart \\`reasonix code\\` to drop the bridge (reload failed: ${(err as Error).message})`,\n );\n }\n } else {\n postInfo(`✓ uninstalled ${entry.name} — restart \\`reasonix code\\` to drop the bridge`);\n }\n },\n [postInfo, reloadMcp],\n );\n\n const doInstall = useCallback(\n async (entry: RegistryEntry) => {\n let install = entry.install;\n if (!install && entry.source === \"smithery\") {\n setState((s) => ({ ...s, loading: true, status: \"fetching smithery detail…\" }));\n try {\n const detail = await fetchSmitheryDetail(entry.name);\n if (detail) {\n install = detail;\n entry.install = detail;\n }\n } catch {\n /* fall through to error below */\n }\n setState((s) => ({ ...s, loading: false }));\n }\n if (!install) {\n setState((s) => ({\n ...s,\n status: `no install info for ${entry.name} — try \\`npx -y @smithery/cli install ${entry.name}\\``,\n }));\n return;\n }\n try {\n const spec = specStringFor(entry.name, install);\n const cfg = readConfig();\n const existing = cfg.mcp ?? [];\n if (existing.includes(spec)) {\n setState((s) => ({\n ...s,\n installedSpecs: existing,\n status: `already installed: ${spec}`,\n }));\n return;\n }\n const next = [...existing, spec];\n writeConfig({ ...cfg, mcp: next });\n setState((s) => ({ ...s, installedSpecs: next, status: `installed → ${spec}` }));\n const envHint = install.requiredEnv?.length\n ? ` · needs env: ${install.requiredEnv.join(\", \")}`\n : \"\";\n if (reloadMcp) {\n try {\n const r = await reloadMcp();\n const failedHere = r.failed.find((f) => f.spec === spec);\n if (failedHere) {\n postInfo(`▲ installed ${entry.name} — bridge failed: ${failedHere.reason}${envHint}`);\n } else {\n postInfo(`✓ installed ${entry.name} — bridged${envHint}`);\n }\n } catch (err) {\n postInfo(\n `✓ installed ${entry.name} — restart \\`reasonix code\\` to bridge (reload failed: ${(err as Error).message})${envHint}`,\n );\n }\n } else {\n postInfo(`✓ installed ${entry.name} — restart \\`reasonix code\\` to bridge${envHint}`);\n }\n } catch (err) {\n setState((s) => ({ ...s, status: `install failed: ${(err as Error).message}` }));\n }\n },\n [postInfo, reloadMcp],\n );\n\n const installOrToggle = useCallback(\n async (entry: RegistryEntry) => {\n const installed = isInstalled(state.installedSpecs, entry);\n if (installed) await doUninstall(entry, installed);\n else await doInstall(entry);\n },\n [state.installedSpecs, doInstall, doUninstall],\n );\n\n const pickerSnapshot = useMemo(\n () =>\n buildMarketplacePickerSnapshot({\n filtered,\n installedSpecs: state.installedSpecs,\n query: state.query,\n status: state.status,\n hasMore: state.handle?.cache.pagination.nextCursor != null,\n }),\n [filtered, state.installedSpecs, state.handle, state.query, state.status],\n );\n\n usePickerBroadcast(\n !!pickerPorts,\n { ...pickerSnapshot, actions: [...pickerSnapshot.actions] },\n (res) => {\n if (res.action === \"cancel\") return onClose();\n if (res.action === \"refine\") {\n setState((s) => ({ ...s, query: res.query, selected: 0 }));\n return;\n }\n if (res.action === \"load-more\") {\n void fetchMore();\n return;\n }\n if (res.action === \"install\") {\n const entry = state.handle?.cache.entries.find((e) => e.name === res.id);\n if (!entry) return;\n if (isInstalled(state.installedSpecs, entry)) {\n setState((s) => ({ ...s, status: `already installed: ${entry.name}` }));\n return;\n }\n void doInstall(entry);\n return;\n }\n if (res.action === \"uninstall\") {\n const entry = state.handle?.cache.entries.find((e) => e.name === res.id);\n if (!entry) return;\n const installed = isInstalled(state.installedSpecs, entry);\n if (!installed) {\n setState((s) => ({ ...s, status: `not installed: ${entry.name}` }));\n return;\n }\n void doUninstall(entry, installed);\n }\n },\n pickerPorts ?? {\n broadcast: () => undefined,\n resolverRef: { current: null },\n snapshotRef: { current: null },\n },\n );\n\n useKeystroke((ev) => {\n if (ev.paste) return;\n if (ev.escape) {\n onClose();\n return;\n }\n if (ev.upArrow) {\n setState((s) => ({ ...s, selected: Math.max(0, s.selected - 1) }));\n return;\n }\n if (ev.downArrow) {\n setState((s) => ({ ...s, selected: Math.min(filtered.length - 1, s.selected + 1) }));\n return;\n }\n if (ev.return) {\n if (selected) void installOrToggle(selected);\n return;\n }\n if (ev.pageDown) {\n void fetchMore();\n return;\n }\n if (ev.backspace || ev.delete) {\n setState((s) => ({ ...s, query: s.query.slice(0, -1), selected: 0 }));\n return;\n }\n if (ev.input && !ev.ctrl && !ev.meta) {\n setState((s) => ({ ...s, query: s.query + ev.input, selected: 0 }));\n }\n });\n\n const start = Math.max(\n 0,\n Math.min(state.selected - Math.floor(VISIBLE_ROWS / 2), filtered.length - VISIBLE_ROWS),\n );\n const window = filtered.slice(Math.max(0, start), Math.max(0, start) + VISIBLE_ROWS);\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Box>\n <Text bold color={COLOR.brand}>\n ◈ MCP marketplace\n </Text>\n <Text dimColor>{` · ${state.status}`}</Text>\n </Box>\n <Box marginTop={1}>\n <Text>filter: </Text>\n <Text>{state.query || \"(type to filter)\"}</Text>\n <Text dimColor>{` ${filtered.length} match${filtered.length === 1 ? \"\" : \"es\"}`}</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {window.length === 0 ? (\n <Text dimColor>{state.loading ? \"loading…\" : \"no entries\"}</Text>\n ) : (\n window.map((e, i) => {\n const idx = (start || 0) + i;\n const active = idx === state.selected;\n const tag =\n e.source === \"official\" ? \"[off]\" : e.source === \"smithery\" ? \"[smt]\" : \"[loc]\";\n const installedSpec = isInstalled(state.installedSpecs, e);\n const installedBadge = installedSpec ? \" ✓\" : \"\";\n const pop = e.popularity !== undefined ? ` · ${e.popularity.toLocaleString()}` : \"\";\n return (\n <Box key={e.name}>\n <Text color={active ? COLOR.brand : undefined}>{active ? \"▸ \" : \" \"}</Text>\n <Text bold={active}>{e.name.padEnd(38).slice(0, 38)}</Text>\n <Text dimColor>{` ${tag}${pop}${installedBadge}`}</Text>\n </Box>\n );\n })\n )}\n </Box>\n {selected ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>{selected.title}</Text>\n {selected.description ? <Text dimColor>{selected.description.slice(0, 200)}</Text> : null}\n {selected.install ? (\n <Text dimColor>\n {`spec: ${selected.install.runtime} ${selected.install.packageId ?? selected.install.url ?? \"—\"} · ${selected.install.transport}`}\n </Text>\n ) : (\n <Text dimColor>(smithery listing — install detail fetched on Enter)</Text>\n )}\n {selected.install?.requiredEnv?.length ? (\n <Text color=\"yellow\">{`needs: ${selected.install.requiredEnv.join(\", \")}`}</Text>\n ) : null}\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text dimColor>\n type filter · ↑↓ pick · enter{\" \"}\n {selected && isInstalled(state.installedSpecs, selected) ? \"uninstall\" : \"install\"} · PgDn\n load more · esc close\n </Text>\n </Box>\n </Box>\n );\n}\n","import { Box, Text, useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { useState } from \"react\";\nimport { useKeystroke } from \"./keystroke-context.js\";\nimport { PRESETS, PRESET_DESCRIPTIONS } from \"./presets.js\";\nimport { PILL_MODEL, Pill, modelBadgeFor } from \"./primitives/Pill.js\";\nimport { FG, TONE } from \"./theme/tokens.js\";\n\nexport type ModelPickerOutcome =\n | { kind: \"select\"; id: string }\n | { kind: \"preset\"; name: \"auto\" | \"flash\" | \"pro\" }\n | { kind: \"quit\" };\n\nexport interface ModelPickerProps {\n /** API-fetched ids; null means \"still loading / offline\". */\n models: ReadonlyArray<string> | null;\n /** Model id currently active in the loop — marked with the cursor on open. */\n current: string;\n /** Used to detect which preset (if any) the loop currently matches. */\n currentEffort: \"high\" | \"max\";\n currentAutoEscalate: boolean;\n onChoose: (outcome: ModelPickerOutcome) => void;\n /** Triggers a refetch when the catalog is null/empty and the user presses [r]. */\n onRefresh?: () => void;\n}\n\nconst PAGE_MARGIN = 8;\nconst PRESET_NAMES = [\"auto\", \"flash\", \"pro\"] as const;\ntype PresetName = (typeof PRESET_NAMES)[number];\n\ntype Row = { kind: \"preset\"; name: PresetName } | { kind: \"model\"; id: string };\n\nexport function ModelPicker({\n models,\n current,\n currentEffort,\n currentAutoEscalate,\n onChoose,\n onRefresh,\n}: ModelPickerProps): React.ReactElement {\n const modelList = (models && models.length > 0 ? models : FALLBACK_MODELS).slice();\n if (!modelList.includes(current)) modelList.unshift(current);\n const presetRows: Row[] = PRESET_NAMES.map((name) => ({ kind: \"preset\", name }));\n const modelRows: Row[] = modelList.map((id) => ({ kind: \"model\", id }));\n const rows: Row[] = [...presetRows, ...modelRows];\n\n const activePreset = detectActivePreset(current, currentEffort, currentAutoEscalate);\n const initialIndex = activePreset\n ? PRESET_NAMES.indexOf(activePreset)\n : presetRows.length + Math.max(0, modelList.indexOf(current));\n const [focus, setFocus] = useState(initialIndex);\n const { stdout } = useStdout();\n const termRows = stdout?.rows ?? 40;\n const visibleCount = Math.max(6, termRows - PAGE_MARGIN);\n\n useKeystroke((ev) => {\n if (ev.escape) return onChoose({ kind: \"quit\" });\n if (ev.upArrow) return setFocus((f) => Math.max(0, f - 1));\n if (ev.downArrow) return setFocus((f) => Math.min(rows.length - 1, f + 1));\n if (ev.return) {\n const target = rows[focus];\n if (!target) return;\n if (target.kind === \"preset\") return onChoose({ kind: \"preset\", name: target.name });\n return onChoose({ kind: \"select\", id: target.id });\n }\n if (!ev.input) return;\n if (ev.input === \"q\") return onChoose({ kind: \"quit\" });\n if (ev.input === \"r\") onRefresh?.();\n });\n\n const start = Math.max(\n 0,\n Math.min(focus - Math.floor(visibleCount / 2), rows.length - visibleCount),\n );\n const end = Math.min(rows.length, start + visibleCount);\n const shown = rows.slice(start, end);\n const hiddenAbove = start;\n const hiddenBelow = rows.length - end;\n const loading = models === null;\n const empty = models !== null && models.length === 0;\n\n let lastSection: \"preset\" | \"model\" | null = null;\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Box>\n <Text bold color={TONE.brand}>\n {\" ◈ REASONIX · pick a setup \"}\n </Text>\n <Text color={FG.meta}>\n {loading\n ? \" · loading catalog…\"\n : empty\n ? \" · catalog empty — using known fallbacks\"\n : ` · ${modelList.length} models available`}\n </Text>\n </Box>\n <Box height={1} />\n {hiddenAbove > 0 ? (\n <Box>\n <Text color={FG.faint}>{` … ${hiddenAbove} earlier`}</Text>\n </Box>\n ) : null}\n {shown.map((row, i) => {\n const idx = start + i;\n const focused = idx === focus;\n const showHeader = row.kind !== lastSection;\n lastSection = row.kind;\n const header = showHeader ? (\n <Box key={`hdr-${row.kind}`} marginTop={idx === 0 ? 0 : 1}>\n <Text color={FG.meta}>\n {row.kind === \"preset\"\n ? \" PRESETS · recommended — model + effort + auto-escalate\"\n : \" MODELS · raw pick — auto-escalate stays as-is\"}\n </Text>\n </Box>\n ) : null;\n const body =\n row.kind === \"preset\" ? (\n <PresetRow\n key={`p-${row.name}`}\n name={row.name}\n focused={focused}\n active={activePreset === row.name}\n />\n ) : (\n <ModelRow\n key={`m-${row.id}`}\n id={row.id}\n focused={focused}\n active={!activePreset && row.id === current}\n />\n );\n return (\n <React.Fragment key={`row-${idx}`}>\n {header}\n {body}\n </React.Fragment>\n );\n })}\n {hiddenBelow > 0 ? (\n <Box>\n <Text color={FG.faint}>{` … ${hiddenBelow} more`}</Text>\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text color={FG.faint}>{\" ↑↓ pick · ⏎ confirm · [r] refresh · esc cancel\"}</Text>\n </Box>\n </Box>\n );\n}\n\nfunction PresetRow({\n name,\n focused,\n active,\n}: {\n name: PresetName;\n focused: boolean;\n active: boolean;\n}): React.ReactElement {\n const desc = PRESET_DESCRIPTIONS[name];\n return (\n <Box>\n <Text color={focused ? TONE.brand : FG.faint}>{focused ? \" ▸ \" : \" \"}</Text>\n <Text bold={focused} color={focused ? FG.strong : FG.sub}>\n {name.padEnd(8)}\n </Text>\n <Text color={focused ? FG.body : FG.meta}>{desc.headline.padEnd(28)}</Text>\n <Text color={FG.meta}>{` ${desc.cost}`}</Text>\n {active ? <Text color={TONE.brand}>{\" · current\"}</Text> : null}\n </Box>\n );\n}\n\nfunction ModelRow({\n id,\n focused,\n active,\n}: {\n id: string;\n focused: boolean;\n active: boolean;\n}): React.ReactElement {\n const badge = modelBadgeFor(id);\n return (\n <Box>\n <Text color={focused ? TONE.brand : FG.faint}>{focused ? \" ▸ \" : \" \"}</Text>\n <Text bold={focused} color={focused ? FG.strong : FG.sub}>\n {id.padEnd(24)}\n </Text>\n <Text> </Text>\n <Pill label={badge.label} {...PILL_MODEL[badge.kind]} bold={false} />\n {active ? <Text color={TONE.brand}>{\" · current\"}</Text> : null}\n </Box>\n );\n}\n\nfunction detectActivePreset(\n model: string,\n effort: \"high\" | \"max\",\n autoEscalate: boolean,\n): PresetName | null {\n for (const name of PRESET_NAMES) {\n const p = PRESETS[name];\n if (p.model === model && p.reasoningEffort === effort && p.autoEscalate === autoEscalate) {\n return name;\n }\n }\n return null;\n}\n\n/** Hard-coded known DeepSeek ids — used when the API catalog hasn't loaded yet so the picker isn't empty on first open. */\nconst FALLBACK_MODELS: ReadonlyArray<string> = [\n \"deepseek-v4-flash\",\n \"deepseek-v4-pro\",\n \"deepseek-chat\",\n \"deepseek-reasoner\",\n];\n","/** Bg-tinted inline chip — section labels (REASONING / TASK / TOOL) and badges (model / path). */\n\nimport { Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\n\nexport interface PillProps {\n label: string;\n bg: string;\n fg: string;\n bold?: boolean;\n}\n\nexport function Pill({ label, bg, fg, bold = true }: PillProps): React.ReactElement {\n return <Text backgroundColor={bg} color={fg} bold={bold}>{` ${label} `}</Text>;\n}\n\n/** Section pill bg tints — muted accent-of-card-tone, paired with the tone's fg. */\nexport const PILL_SECTION = {\n reason: { bg: \"#2a1f3d\", fg: \"#d2a8ff\" },\n output: { bg: \"#0d1d2e\", fg: \"#79c0ff\" },\n tool: { bg: \"#0f2230\", fg: \"#79c0ff\" },\n shell: { bg: \"#0f2230\", fg: \"#79c0ff\" },\n task: { bg: \"#0d1d2e\", fg: \"#79c0ff\" },\n taskDone: { bg: \"#102815\", fg: \"#7ee787\" },\n taskFailed: { bg: \"#2c1416\", fg: \"#ff8b81\" },\n plan: { bg: \"#2a1f3d\", fg: \"#d2a8ff\" },\n user: { bg: \"#11141a\", fg: \"#8b949e\" },\n} as const;\n\n/** Model pill — neutral bg, color signals model class. */\nexport const PILL_MODEL = {\n flash: { bg: \"#11141a\", fg: \"#79c0ff\" },\n pro: { bg: \"#11141a\", fg: \"#d2a8ff\" },\n r1: { bg: \"#11141a\", fg: \"#b395f5\" },\n unknown: { bg: \"#11141a\", fg: \"#8b949e\" },\n} as const;\n\nexport interface ModelBadge {\n label: string;\n kind: keyof typeof PILL_MODEL;\n}\n\n/** Map full DeepSeek model id to short label + color class. */\nexport function modelBadgeFor(model: string | undefined): ModelBadge {\n if (!model) return { label: \"?\", kind: \"unknown\" };\n const stripped = model.replace(/^deepseek-/, \"\");\n if (stripped === \"v4-flash\" || stripped === \"chat\") return { label: \"v4-flash\", kind: \"flash\" };\n if (stripped === \"v4-pro\") return { label: \"v4-pro\", kind: \"pro\" };\n if (stripped === \"r1\" || stripped === \"reasoner\") return { label: \"r1\", kind: \"r1\" };\n return { label: stripped, kind: \"unknown\" };\n}\n","/** Modal picker for `PlanCheckpointError`: continue / revise / stop. */\n\nimport { Box } from \"ink\";\nimport React from \"react\";\nimport type { PlanStep } from \"../../tools/plan.js\";\nimport { PlanStepList, type StepStatus } from \"./PlanStepList.js\";\nimport { SingleSelect } from \"./Select.js\";\nimport { ApprovalCard } from \"./cards/ApprovalCard.js\";\nimport { useReserveRows } from \"./layout/viewport-budget.js\";\n\nexport type CheckpointChoice = \"continue\" | \"revise\" | \"stop\";\n\nexport interface PlanCheckpointConfirmProps {\n stepId: string;\n title?: string;\n completed: number;\n total: number;\n /** Full step list from the approved plan, when available. */\n steps?: PlanStep[];\n /** Set of stepIds the model has marked complete so far. */\n completedStepIds?: Set<string>;\n onChoose: (choice: CheckpointChoice) => void;\n}\n\nfunction PlanCheckpointConfirmInner({\n stepId,\n title,\n completed,\n total,\n steps,\n completedStepIds,\n onChoose,\n}: PlanCheckpointConfirmProps) {\n const stepRows = steps?.length ?? 0;\n useReserveRows(\"modal\", { min: 10, max: Math.max(14, stepRows + 12) });\n\n const label = title ? `${stepId} · ${title}` : stepId;\n const counter = total > 0 ? `${completed}/${total}` : \"\";\n const isLast = total > 0 && completed >= total;\n const statuses = buildStatusMap(steps, completedStepIds, stepId, isLast);\n const subtitle = counter ? `${counter} · ${label}` : label;\n return (\n <ApprovalCard tone=\"ok\" glyph=\"⛁\" title=\"Checkpoint — step done\" metaRight={subtitle}>\n {steps && steps.length > 0 ? (\n <Box marginBottom={1} flexDirection=\"column\">\n <PlanStepList steps={steps} statuses={statuses} focusStepId={stepId} />\n </Box>\n ) : null}\n <SingleSelect\n initialValue={isLast ? \"stop\" : \"continue\"}\n items={[\n {\n value: \"continue\",\n label: \"Continue — run the next step\",\n hint: \"Model resumes with the next step.\",\n },\n {\n value: \"revise\",\n label: \"Revise — give feedback before the next step\",\n hint: \"Stay paused, type guidance; model adjusts the remaining plan.\",\n },\n {\n value: \"stop\",\n label: \"Stop — end the plan here\",\n hint: \"Model summarizes what was done and ends.\",\n },\n ]}\n onSubmit={(v) => onChoose(v as CheckpointChoice)}\n onCancel={() => onChoose(\"stop\")}\n />\n </ApprovalCard>\n );\n}\n\nexport const PlanCheckpointConfirm = React.memo(PlanCheckpointConfirmInner);\n\n/** Current step renders as \"done\" — flush order isn't guaranteed at picker time. */\nfunction buildStatusMap(\n steps: PlanStep[] | undefined,\n completedStepIds: Set<string> | undefined,\n currentStepId: string,\n isLast: boolean,\n): Map<string, StepStatus> {\n const map = new Map<string, StepStatus>();\n if (!steps) return map;\n for (const step of steps) {\n if (completedStepIds?.has(step.id) || step.id === currentStepId) {\n map.set(step.id, \"done\");\n } else {\n map.set(step.id, \"pending\");\n }\n }\n void isLast;\n return map;\n}\n","/**\n * Compact tree-style renderer for a plan's structured step list. Used\n * by PlanConfirm (on approval) and PlanCheckpointConfirm (mid-execution)\n * so the user always sees the same visual representation.\n *\n * Layout per step:\n *\n * 2/5 done (40%) · est. 5 steps\n * ┣ ✓ step-1 · Extract tokens into a module\n * ┣ ✓ step-2 · Migrate session cookies ⚠ med\n * ┣ ▸ step-3 · Update tests ⚠ high\n * ┣ ○ step-4 · Run regression suite\n * ┗ ○ step-5 · Audit every callsite\n * ████████░░░░░░░░░░░░ 40%\n *\n * Why this shape:\n * - Status icons (✓ ▸ ○ ✗) read at a glance — color + glyph are\n * redundant signals, useful for color-blind users and for\n * terminals where a single bg-color cell is the only contrast.\n * - Tree branch lines (┣ ┗) visually bind the steps as one group\n * and mark \"last step\" with a corner — the eye finds the bottom\n * without counting.\n * - Risk only shown ≥medium. low risk on every line is noise (most\n * steps are low-risk — that's the default). med + high are the\n * ones that deserve attention before approve.\n * - Bottom progress bar (24 cells of █ / ░) makes \"how far in are\n * we\" answerable from the cursor's eye position alone.\n */\n\nimport { Box, Text } from \"ink\";\nimport React from \"react\";\nimport type { PlanStep, PlanStepRisk } from \"../../tools/plan.js\";\nimport { CharBar } from \"./char-bar.js\";\nimport { COLOR, GLYPH } from \"./theme.js\";\n\nexport type StepStatus = \"pending\" | \"running\" | \"done\" | \"skipped\";\n\nexport interface PlanStepListProps {\n steps: PlanStep[];\n /**\n * Map of stepId → status. Missing ids default to \"pending\" so a\n * plan just submitted (no completions yet) renders cleanly.\n */\n statuses?: Map<string, StepStatus> | Record<string, StepStatus>;\n /**\n * Optional current step — rendered with the `cur` (▸) glyph in cyan\n * even when its status is still \"pending\", so the user sees which\n * one's about to run. If the step's status is \"running\" we always\n * use the cur glyph regardless of focusStepId.\n */\n focusStepId?: string;\n}\n\nfunction getStatus(stepId: string, statuses: PlanStepListProps[\"statuses\"]): StepStatus {\n if (!statuses) return \"pending\";\n if (statuses instanceof Map) {\n return statuses.get(stepId) ?? \"pending\";\n }\n return statuses[stepId] ?? \"pending\";\n}\n\ninterface StatusGlyph {\n glyph: string;\n color: string;\n}\n\n/**\n * Map (status, focus) → (glyph, color). Centralized so a future tweak\n * (e.g. add a \"queued for retry\" state) lands in one switch instead of\n * five render branches.\n */\nfunction statusGlyph(status: StepStatus, isCur: boolean): StatusGlyph {\n if (status === \"done\") return { glyph: GLYPH.done, color: COLOR.ok };\n if (status === \"running\") return { glyph: GLYPH.cur, color: COLOR.primary };\n if (status === \"skipped\") return { glyph: GLYPH.fail, color: COLOR.info };\n // pending: focus override gets the cur glyph (▸) in primary color so\n // the active row pops without us needing a separate column.\n if (isCur) return { glyph: GLYPH.cur, color: COLOR.primary };\n return { glyph: GLYPH.pending, color: COLOR.info };\n}\n\nfunction riskLabel(risk: PlanStepRisk | undefined): { text: string; color: string } | null {\n if (risk === \"med\") return { text: `${GLYPH.warn} med`, color: COLOR.warn };\n if (risk === \"high\") return { text: `${GLYPH.warn} high`, color: COLOR.err };\n // low + undefined: omitted entirely (the default reading should be\n // \"low risk\" — surfacing it on every line buries the med/high ones).\n return null;\n}\n\nfunction PlanStepListInner({ steps, statuses, focusStepId }: PlanStepListProps) {\n if (steps.length === 0) return null;\n const statusList = steps.map((s) => getStatus(s.id, statuses));\n const total = steps.length;\n const doneCount = statusList.filter((s) => s === \"done\").length;\n const pct = Math.round((doneCount / total) * 100);\n // Show progress only when the plan has any motion. A freshly-submitted\n // plan with 0/N done renders without the bar to avoid an empty\n // \"░░░░░░░░░░ 0%\" rule that signals nothing.\n const showProgress = doneCount > 0;\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text dimColor>\n {showProgress\n ? `${doneCount}/${total} done (${pct}%) · ${total} step${total === 1 ? \"\" : \"s\"}`\n : `${total} step${total === 1 ? \"\" : \"s\"}`}\n </Text>\n </Box>\n <Box flexDirection=\"column\">\n {steps.map((step, i) => {\n const status = statusList[i]!;\n const isLast = i === total - 1;\n const isCur = focusStepId === step.id;\n const sg = statusGlyph(status, isCur);\n const risk = riskLabel(step.risk);\n const titleDim = status === \"done\" || status === \"skipped\";\n return (\n <Box key={step.id}>\n <Text color={COLOR.info} dimColor>\n {isLast ? GLYPH.branchEnd : GLYPH.branch}\n </Text>\n <Text>{\" \"}</Text>\n <Text color={sg.color} bold={status === \"running\" || isCur}>\n {sg.glyph}\n </Text>\n <Text>{\" \"}</Text>\n <Text\n dimColor={titleDim}\n bold={isCur || status === \"running\"}\n strikethrough={status === \"done\" || status === \"skipped\"}\n >\n {`${step.id} · ${step.title}`}\n </Text>\n {risk ? (\n <>\n <Text>{\" \"}</Text>\n <Text color={risk.color}>{risk.text}</Text>\n </>\n ) : null}\n </Box>\n );\n })}\n </Box>\n {showProgress ? (\n <Box>\n <Text>{\" \"}</Text>\n <CharBar pct={pct} width={24} />\n </Box>\n ) : null}\n </Box>\n );\n}\n\nexport const PlanStepList = React.memo(PlanStepListInner);\n\nexport function riskOf(step: PlanStep): PlanStepRisk | undefined {\n return step.risk;\n}\n","/**\n * Character-cell progress bar — the visual primitive shared across:\n * · cache hit ratio in the status bar\n * · undo banner countdown\n * · /context token-usage breakdown (stacked variant)\n * · plan step progress\n * · MCP progress notifications\n * · walk-through \"block N of M\" position\n *\n * Why one helper: in a TUI you can only convey \"fraction\" by character\n * fill, not by gradient bg. Doing it ad-hoc per call site led to five\n * subtly different bar styles (some used `█/░`, some `■/-`, some\n * inverted bg). Centralizing here means the visual cue is one\n * consistent thing the user reads at-a-glance everywhere.\n *\n * All variants render in 1 row, 1 cell tall. Width defaults to 24\n * which is wide enough for \"10% increments are visible to the eye\"\n * but narrow enough to fit beside other status info.\n */\n\nimport { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { COLOR, GLYPH } from \"./theme.js\";\n\nexport interface CharBarProps {\n /** 0–100 (clamped). Negative or NaN → 0; >100 → 100. */\n pct: number;\n /** Cell count. Default 24. Min 4 enforced so the bar is at least readable. */\n width?: number;\n /** Filled-cell COLOR. Defaults to brand cyan. */\n color?: string;\n /** Empty-cell COLOR. Defaults to dim slate. */\n emptyColor?: string;\n /**\n * Whether to render the percentage label after the bar. Off when the\n * caller wants to put its own meta after (e.g. \"12 of 30 done\").\n */\n showLabel?: boolean;\n /** Optional label override (default: \"{pct}%\"). */\n label?: string;\n}\n\n/**\n * Single-color progress bar. Render shape:\n * `████████████░░░░░░░░░░░░ 50%`\n *\n * Filled section is `█` in `color`, empty section is `░` in\n * `emptyColor`. Label sits in the same row, dim by default.\n */\nexport function CharBar({\n pct,\n width = 24,\n color = COLOR.primary,\n emptyColor,\n showLabel = true,\n label,\n}: CharBarProps): React.ReactElement {\n const total = Math.max(4, width);\n const clamped = Math.max(0, Math.min(100, Number.isFinite(pct) ? pct : 0));\n const filled = Math.round((total * clamped) / 100);\n return (\n <Box>\n <Text color={color}>{GLYPH.block.repeat(filled)}</Text>\n <Text color={emptyColor ?? COLOR.info} dimColor>\n {GLYPH.shade1.repeat(total - filled)}\n </Text>\n {showLabel ? <Text dimColor>{` ${label ?? `${Math.round(clamped)}%`}`}</Text> : null}\n </Box>\n );\n}\n\nexport interface StackedSegment {\n /** Percent of the total width this segment occupies. 0–100. */\n pct: number;\n color: string;\n /** Optional label (used by legend renderer; not rendered in the bar). */\n label?: string;\n}\n\nexport interface StackedCharBarProps {\n segments: readonly StackedSegment[];\n width?: number;\n /** Color of the trailing \"free / unused\" cells. */\n emptyColor?: string;\n}\n\n/**\n * Stacked progress bar. Multiple colored segments + a trailing empty\n * region. Rendered left-to-right in segment order; if the segments'\n * pcts sum >100 the trailing empty just becomes 0.\n *\n * Used by `/context` to break down system / tools / log / input\n * occupancy across the prompt budget.\n */\nexport function StackedCharBar({\n segments,\n width = 32,\n emptyColor,\n}: StackedCharBarProps): React.ReactElement {\n const total = Math.max(4, width);\n const cells = segments.map((s) => Math.max(0, Math.round((total * s.pct) / 100)));\n const used = cells.reduce((acc, n) => acc + n, 0);\n const empty = Math.max(0, total - used);\n return (\n <Box>\n {segments.map((seg, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: ordered, fixed-shape\n <Text key={`seg-${i}`} color={seg.color}>\n {GLYPH.block.repeat(cells[i] ?? 0)}\n </Text>\n ))}\n <Text color={emptyColor ?? COLOR.info} dimColor>\n {GLYPH.shade1.repeat(empty)}\n </Text>\n </Box>\n );\n}\n","/** Modal-style picker for `submit_plan`: accept / refine / cancel. */\n\nimport { Box, Text } from \"ink\";\nimport React from \"react\";\nimport type { PlanStep } from \"../../tools/plan.js\";\nimport { PlanStepList } from \"./PlanStepList.js\";\nimport { SingleSelect } from \"./Select.js\";\nimport { ApprovalCard } from \"./cards/ApprovalCard.js\";\nimport { useReserveRows } from \"./layout/viewport-budget.js\";\nimport { MarkdownView } from \"./markdown-view.js\";\nimport { CARD, FG, TONE } from \"./theme/tokens.js\";\n\nexport type PlanConfirmChoice = \"approve\" | \"refine\" | \"revise\" | \"cancel\";\n\nexport interface PlanConfirmProps {\n plan: string;\n steps?: PlanStep[];\n /** Optional human-friendly title from the model — surfaced in the header. */\n summary?: string;\n onChoose: (choice: PlanConfirmChoice) => void;\n projectRoot?: string;\n}\n\nconst PLAN_BODY_PREVIEW_LINES = 24;\n\nfunction PlanConfirmInner({ plan, steps, onChoose }: PlanConfirmProps) {\n const stepRows = steps?.length ?? 0;\n const hasSteps = stepRows > 0;\n const planLines = plan.split(\"\\n\");\n const truncatedBody = planLines.length > PLAN_BODY_PREVIEW_LINES;\n const previewBody = truncatedBody ? planLines.slice(0, PLAN_BODY_PREVIEW_LINES).join(\"\\n\") : plan;\n const previewRows = truncatedBody\n ? PLAN_BODY_PREVIEW_LINES\n : Math.min(planLines.length, PLAN_BODY_PREVIEW_LINES);\n const reservedFor = hasSteps ? stepRows : previewRows;\n useReserveRows(\"modal\", { min: 10, max: Math.max(16, reservedFor + 14) });\n\n const hasOpenQuestions =\n /^#{1,6}\\s*(open[-\\s]?questions?|risks?|unknowns?|assumptions?|unclear)/im.test(plan) ||\n /^#{1,6}\\s*(待确认|开放问题|风险|未知|假设|不确定)/im.test(plan);\n\n return (\n <ApprovalCard\n tone=\"accent\"\n glyph=\"⊞\"\n title=\"Approve plan\"\n metaRight=\"awaiting\"\n metaRightColor={CARD.plan.color}\n >\n {hasOpenQuestions ? (\n <Box marginBottom={1}>\n <Text color={TONE.warn}>\n ▲ the plan flags open questions or risks — pick <Text bold>refine</Text> to write\n concrete answers before the model moves on.\n </Text>\n </Box>\n ) : null}\n {hasSteps ? (\n <Box marginBottom={1} flexDirection=\"column\">\n <PlanStepList steps={steps!} />\n </Box>\n ) : plan.trim().length > 0 ? (\n <Box marginBottom={1} flexDirection=\"column\">\n <MarkdownView text={previewBody} />\n {truncatedBody ? (\n <Text color={FG.faint}>\n {`… ${planLines.length - PLAN_BODY_PREVIEW_LINES} more line${\n planLines.length - PLAN_BODY_PREVIEW_LINES === 1 ? \"\" : \"s\"\n } above in scrollback`}\n </Text>\n ) : null}\n </Box>\n ) : null}\n <SingleSelect\n initialValue={hasOpenQuestions ? \"refine\" : \"approve\"}\n items={[\n {\n value: \"approve\",\n label: \"accept\",\n hint: \"run it now, in order\",\n },\n {\n value: \"refine\",\n label: \"refine\",\n hint: \"give the agent more guidance, draft a new plan\",\n },\n {\n value: \"revise\",\n label: \"revise\",\n hint: \"edit the plan inline before running (skip / reorder steps)\",\n },\n {\n value: \"cancel\",\n label: \"reject\",\n hint: \"discard, agent will retry from scratch\",\n },\n ]}\n onSubmit={(v) => onChoose(v as PlanConfirmChoice)}\n onCancel={() => onChoose(\"cancel\")}\n />\n </ApprovalCard>\n );\n}\n\n/** Memoized — parent re-renders every tick; props only change on user action. */\nexport const PlanConfirm = React.memo(PlanConfirmInner);\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { type InlineSpan, type MdLine, markdownToLines } from \"./markdown-lines.js\";\n\nconst FG_BODY = \"#c9d1d9\";\nconst FG_FAINT = \"#6e7681\";\nconst FG_STRONG = \"#f0f6fc\";\nconst FG_META = \"#8b949e\";\nconst TONE_BRAND = \"#79c0ff\";\nconst TONE_OK = \"#7ee787\";\nconst TONE_WARN = \"#f0b07d\";\nconst SURFACE_ELEV = \"#161b22\";\n\nexport function MarkdownView({ text }: { text: string }): React.ReactElement {\n return <MarkdownLines lines={markdownToLines(text)} />;\n}\n\nexport function MarkdownLines({\n lines,\n}: {\n lines: ReadonlyArray<MdLine>;\n}): React.ReactElement {\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, i) => (\n <LineRow key={`md-${i}-${line.kind}`} line={line} />\n ))}\n </Box>\n );\n}\n\nfunction LineRow({ line }: { line: MdLine }): React.ReactElement | null {\n switch (line.kind) {\n case \"blank\":\n return <Text> </Text>;\n case \"hr\":\n return <Text color={FG_FAINT}>──────</Text>;\n case \"heading\":\n return (\n <Box>\n <Text bold color={FG_STRONG}>\n {`${\"#\".repeat(line.level)} `}\n </Text>\n <Spans spans={line.spans} bold strongColor />\n </Box>\n );\n case \"paragraph\":\n return (\n <Box>\n <Spans spans={line.spans} />\n </Box>\n );\n case \"list\": {\n const indent = \" \".repeat(line.depth * 2);\n const marker =\n line.task === \"done\"\n ? \"✓\"\n : line.task === \"todo\"\n ? \"○\"\n : line.ordered\n ? `${line.index}.`\n : \"·\";\n const markerColor =\n line.task === \"done\" ? TONE_OK : line.task === \"todo\" ? FG_FAINT : FG_META;\n return (\n <Box>\n <Text color={markerColor}>{`${indent}${marker} `}</Text>\n <Spans spans={line.spans} dim={line.task === \"done\"} strike={line.task === \"done\"} />\n </Box>\n );\n }\n case \"code\":\n return <CodeBlock lang={line.lang} text={line.text} />;\n case \"blockquote\":\n return (\n <Box>\n <Text color={TONE_BRAND}>{\"▎ \"}</Text>\n <Spans spans={line.spans} italic />\n </Box>\n );\n }\n}\n\nfunction spanKey(span: InlineSpan, i: number): string {\n return `${i}-${span.text.length}-${span.bold ? \"b\" : \"\"}${span.italic ? \"i\" : \"\"}${span.code ? \"c\" : \"\"}${span.strike ? \"s\" : \"\"}${span.link ? \"l\" : \"\"}`;\n}\n\nfunction CodeBlock({ lang, text }: { lang: string; text: string }): React.ReactElement {\n const lines = text.split(\"\\n\");\n return (\n <Box flexDirection=\"column\">\n {lang.length > 0 ? <Text color={FG_META}>{` ${lang}`}</Text> : null}\n {lines.map((ln, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: code lines are positional + stable per render\n <Text key={`code-${i}`} backgroundColor={SURFACE_ELEV}>\n {` ${ln} `}\n </Text>\n ))}\n </Box>\n );\n}\n\ninterface SpansProps {\n readonly spans: ReadonlyArray<InlineSpan>;\n readonly bold?: boolean;\n readonly italic?: boolean;\n readonly dim?: boolean;\n readonly strike?: boolean;\n readonly strongColor?: boolean;\n}\n\nfunction Spans({ spans, bold, italic, dim, strike, strongColor }: SpansProps): React.ReactElement {\n if (spans.length === 0) return <Text> </Text>;\n return (\n <>\n {spans.map((span, i) => (\n <SpanText\n key={spanKey(span, i)}\n span={span}\n ambientBold={bold}\n ambientItalic={italic}\n ambientDim={dim}\n ambientStrike={strike}\n strongColor={strongColor}\n />\n ))}\n </>\n );\n}\n\nfunction SpanText({\n span,\n ambientBold,\n ambientItalic,\n ambientDim,\n ambientStrike,\n strongColor,\n}: {\n span: InlineSpan;\n ambientBold?: boolean;\n ambientItalic?: boolean;\n ambientDim?: boolean;\n ambientStrike?: boolean;\n strongColor?: boolean;\n}): React.ReactElement {\n if (span.code) {\n return (\n <Text color={FG_STRONG} backgroundColor={SURFACE_ELEV}>\n {` ${span.text} `}\n </Text>\n );\n }\n const color = span.fileRef\n ? TONE_BRAND\n : span.link\n ? TONE_BRAND\n : strongColor\n ? FG_STRONG\n : FG_BODY;\n return (\n <Text\n color={color}\n bold={!!(span.bold || ambientBold)}\n italic={!!(span.italic || ambientItalic)}\n dimColor={!!ambientDim}\n strikethrough={!!(span.strike || ambientStrike)}\n underline={!!(span.link || span.fileRef)}\n >\n {span.text}\n </Text>\n );\n}\n","import type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Gets the original marked default options.\n */\nexport function _getDefaults(): MarkedOptions {\n return {\n async: false,\n breaks: false,\n extensions: null,\n gfm: true,\n hooks: null,\n pedantic: false,\n renderer: null,\n silent: false,\n tokenizer: null,\n walkTokens: null,\n };\n}\n\nexport let _defaults = _getDefaults();\n\nexport function changeDefaults(newDefaults: MarkedOptions) {\n _defaults = newDefaults;\n}\n","const noopTest = { exec: () => null } as unknown as RegExp;\n\nfunction edit(regex: string | RegExp, opt = '') {\n let source = typeof regex === 'string' ? regex : regex.source;\n const obj = {\n replace: (name: string | RegExp, val: string | RegExp) => {\n let valSource = typeof val === 'string' ? val : val.source;\n valSource = valSource.replace(other.caret, '$1');\n source = source.replace(name, valSource);\n return obj;\n },\n getRegex: () => {\n return new RegExp(source, opt);\n },\n };\n return obj;\n}\n\nexport const other = {\n codeRemoveIndent: /^(?: {1,4}| {0,3}\\t)/gm,\n outputLinkReplace: /\\\\([\\[\\]])/g,\n indentCodeCompensation: /^(\\s+)(?:```)/,\n beginningSpace: /^\\s+/,\n endingHash: /#$/,\n startingSpaceChar: /^ /,\n endingSpaceChar: / $/,\n nonSpaceChar: /[^ ]/,\n newLineCharGlobal: /\\n/g,\n tabCharGlobal: /\\t/g,\n multipleSpaceGlobal: /\\s+/g,\n blankLine: /^[ \\t]*$/,\n doubleBlankLine: /\\n[ \\t]*\\n[ \\t]*$/,\n blockquoteStart: /^ {0,3}>/,\n blockquoteSetextReplace: /\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,\n blockquoteSetextReplace2: /^ {0,3}>[ \\t]?/gm,\n listReplaceTabs: /^\\t+/,\n listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,\n listIsTask: /^\\[[ xX]\\] /,\n listReplaceTask: /^\\[[ xX]\\] +/,\n anyLine: /\\n.*\\n/,\n hrefBrackets: /^<(.*)>$/,\n tableDelimiter: /[:|]/,\n tableAlignChars: /^\\||\\| *$/g,\n tableRowBlankLine: /\\n[ \\t]*$/,\n tableAlignRight: /^ *-+: *$/,\n tableAlignCenter: /^ *:-+: *$/,\n tableAlignLeft: /^ *:-+ *$/,\n startATag: /^<a /i,\n endATag: /^<\\/a>/i,\n startPreScriptTag: /^<(pre|code|kbd|script)(\\s|>)/i,\n endPreScriptTag: /^<\\/(pre|code|kbd|script)(\\s|>)/i,\n startAngleBracket: /^</,\n endAngleBracket: />$/,\n pedanticHrefTitle: /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,\n unicodeAlphaNumeric: /[\\p{L}\\p{N}]/u,\n escapeTest: /[&<>\"']/,\n escapeReplace: /[&<>\"']/g,\n escapeTestNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,\n escapeReplaceNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,\n unescapeTest: /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig,\n caret: /(^|[^\\[])\\^/g,\n percentDecode: /%25/g,\n findPipe: /\\|/g,\n splitPipe: / \\|/,\n slashPipe: /\\\\\\|/g,\n carriageReturn: /\\r\\n|\\r/g,\n spaceLine: /^ +$/gm,\n notSpaceStart: /^\\S*/,\n endingNewline: /\\n$/,\n listItemRegex: (bull: string) => new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`),\n nextBulletRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`),\n hrRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),\n fencesBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`),\n headingBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`),\n htmlBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}<(?:[a-z].*>|!--)`, 'i'),\n};\n\n/**\n * Block-Level Grammar\n */\n\nconst newline = /^(?:[ \\t]*(?:\\n|$))+/;\nconst blockCode = /^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/;\nconst fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nconst hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nconst heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nconst bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nconst lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/;\nconst lheading = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/\\|table/g, '') // table not in commonmark\n .getRegex();\nconst lheadingGfm = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/table/g, / {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/) // table can interrupt\n .getRegex();\nconst _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/;\nconst blockText = /^[^\\n]+/;\nconst _blockLabel = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nconst def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/)\n .replace('label', _blockLabel)\n .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n .getRegex();\n\nconst list = edit(/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/)\n .replace(/bull/g, bullet)\n .getRegex();\n\nconst _tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'\n + '|tr|track|ul';\nconst _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nconst html = edit(\n '^ {0,3}(?:' // optional indentation\n+ '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n+ '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n+ '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n+ '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n+ '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n+ '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (6)\n+ '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) open tag\n+ '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) closing tag\n+ ')', 'i')\n .replace('comment', _comment)\n .replace('tag', _tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nconst paragraph = edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\n\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n .replace('paragraph', paragraph)\n .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nconst blockNormal = {\n blockquote,\n code: blockCode,\n def,\n fences,\n heading,\n hr,\n html,\n lheading,\n list,\n newline,\n paragraph,\n table: noopTest,\n text: blockText,\n};\n\ntype BlockKeys = keyof typeof blockNormal;\n\n/**\n * GFM Block Grammar\n */\n\nconst gfmTable = edit(\n '^ *([^\\\\n ].*)\\\\n' // Header\n+ ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n+ '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)') // Cells\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('blockquote', ' {0,3}>')\n .replace('code', '(?: {4}| {0,3}\\t)[^\\\\n]')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // tables can be interrupted by type (6) html blocks\n .getRegex();\n\nconst blockGfm: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n lheading: lheadingGfm,\n table: gfmTable,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('table', gfmTable) // interrupt paragraphs with table\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex(),\n};\n\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nconst blockPedantic: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n html: edit(\n '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', _comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest, // fences not supported\n lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', lheading)\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .replace('|tag', '')\n .getRegex(),\n};\n\n/**\n * Inline-Level Grammar\n */\n\nconst escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = /[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpace = /[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpace = /[^\\s\\p{P}\\p{S}]/u;\nconst punctuation = edit(/^((?![*_])punctSpace)/, 'u')\n .replace(/punctSpace/g, _punctuationOrSpace).getRegex();\n\n// GFM allows ~ inside strong and em for strikethrough\nconst _punctuationGfmStrongEm = /(?!~)[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpaceGfmStrongEm = /(?!~)[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpaceGfmStrongEm = /(?:[^\\s\\p{P}\\p{S}]|~)/u;\n\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = /\\[[^[\\]]*?\\]\\((?:\\\\.|[^\\\\\\(\\)]|\\((?:\\\\.|[^\\\\\\(\\)])*\\))*\\)|`[^`]*?`|<[^<>]*?>/g;\n\nconst emStrongLDelimCore = /^(?:\\*+(?:((?!\\*)punct)|[^\\s*]))|^_+(?:((?!_)punct)|([^\\s_]))/;\n\nconst emStrongLDelim = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongLDelimGfm = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\nconst emStrongRDelimAstCore =\n '^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n+ '|[^*]+(?=[^*])' // Consume to delim\n+ '|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)' // (2) a***#, a*** can only be a Right Delimiter\n+ '|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)' // (3) #***a, ***a can only be Left Delimiter\n+ '|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)' // (4) ***# can only be Left Delimiter\n+ '|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)' // (5) #***# can be either Left or Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?=notPunctSpace)'; // (6) a***a can be either Left or Right Delimiter\n\nconst emStrongRDelimAst = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm)\n .replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm)\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\n// (6) Not allowed for _\nconst emStrongRDelimUnd = edit(\n '^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n+ '|[^_]+(?=[^_])' // Consume to delim\n+ '|(?!_)punct(_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n+ '|notPunctSpace(_+)(?!_)(?=punctSpace|$)' // (2) a___#, a___ can only be a Right Delimiter\n+ '|(?!_)punctSpace(_+)(?=notPunctSpace)' // (3) #___a, ___a can only be Left Delimiter\n+ '|[\\\\s](_+)(?!_)(?=punct)' // (4) ___# can only be Left Delimiter\n+ '|(?!_)punct(_+)(?!_)(?=punct)', 'gu') // (5) #___# can be either Left or Right Delimiter\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst anyPunctuation = edit(/\\\\(punct)/, 'gu')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/)\n .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)\n .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/)\n .getRegex();\n\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit(\n '^comment'\n + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>') // CDATA section\n .replace('comment', _inlineComment)\n .replace('attribute', /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nconst _inlineLabel = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\n\nconst link = edit(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]*(?:\\n[ \\t]*)?)(title))?\\s*\\)/)\n .replace('label', _inlineLabel)\n .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/)\n .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n .getRegex();\n\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n .replace('label', _inlineLabel)\n .replace('ref', _blockLabel)\n .getRegex();\n\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n .replace('ref', _blockLabel)\n .getRegex();\n\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n .replace('reflink', reflink)\n .replace('nolink', nolink)\n .getRegex();\n\n/**\n * Normal Inline Grammar\n */\n\nconst inlineNormal = {\n _backpedal: noopTest, // only used for GFM url\n anyPunctuation,\n autolink,\n blockSkip,\n br,\n code: inlineCode,\n del: noopTest,\n emStrongLDelim,\n emStrongRDelimAst,\n emStrongRDelimUnd,\n escape,\n link,\n nolink,\n punctuation,\n reflink,\n reflinkSearch,\n tag,\n text: inlineText,\n url: noopTest,\n};\n\ntype InlineKeys = keyof typeof inlineNormal;\n\n/**\n * Pedantic Inline Grammar\n */\n\nconst inlinePedantic: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', _inlineLabel)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', _inlineLabel)\n .getRegex(),\n};\n\n/**\n * GFM Inline Grammar\n */\n\nconst inlineGfm: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n emStrongRDelimAst: emStrongRDelimAstGfm,\n emStrongLDelim: emStrongLDelimGfm,\n url: edit(/^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/, 'i')\n .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/)\n .getRegex(),\n _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])((?:\\\\.|[^\\\\])*?(?:\\\\.|[^\\s~\\\\]))\\1(?=[^~]|$)/,\n text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/,\n};\n\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\nconst inlineBreaks: Record<InlineKeys, RegExp> = {\n ...inlineGfm,\n br: edit(br).replace('{2,}', '*').getRegex(),\n text: edit(inlineGfm.text)\n .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n .replace(/\\{2,\\}/g, '*')\n .getRegex(),\n};\n\n/**\n * exports\n */\n\nexport const block = {\n normal: blockNormal,\n gfm: blockGfm,\n pedantic: blockPedantic,\n};\n\nexport const inline = {\n normal: inlineNormal,\n gfm: inlineGfm,\n breaks: inlineBreaks,\n pedantic: inlinePedantic,\n};\n\nexport interface Rules {\n other: typeof other\n block: Record<BlockKeys, RegExp>\n inline: Record<InlineKeys, RegExp>\n}\n","import { other } from './rules.ts';\n\n/**\n * Helpers\n */\nconst escapeReplacements: { [index: string]: string } = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\nconst getEscapeReplacement = (ch: string) => escapeReplacements[ch];\n\nexport function escape(html: string, encode?: boolean) {\n if (encode) {\n if (other.escapeTest.test(html)) {\n return html.replace(other.escapeReplace, getEscapeReplacement);\n }\n } else {\n if (other.escapeTestNoEncode.test(html)) {\n return html.replace(other.escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n\n return html;\n}\n\nexport function unescape(html: string) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(other.unescapeTest, (_, n) => {\n n = n.toLowerCase();\n if (n === 'colon') return ':';\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x'\n ? String.fromCharCode(parseInt(n.substring(2), 16))\n : String.fromCharCode(+n.substring(1));\n }\n return '';\n });\n}\n\nexport function cleanUrl(href: string) {\n try {\n href = encodeURI(href).replace(other.percentDecode, '%');\n } catch {\n return null;\n }\n return href;\n}\n\nexport function splitCells(tableRow: string, count?: number) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(other.findPipe, (match, offset, str) => {\n let escaped = false;\n let curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n } else {\n // add space before unescaped |\n return ' |';\n }\n }),\n cells = row.split(other.splitPipe);\n let i = 0;\n\n // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n if (!cells[0].trim()) {\n cells.shift();\n }\n if (cells.length > 0 && !cells.at(-1)?.trim()) {\n cells.pop();\n }\n\n if (count) {\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) cells.push('');\n }\n }\n\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(other.slashPipe, '|');\n }\n return cells;\n}\n\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nexport function rtrim(str: string, c: string, invert?: boolean) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n } else if (currChar !== c && invert) {\n suffLen++;\n } else {\n break;\n }\n }\n\n return str.slice(0, l - suffLen);\n}\n\nexport function findClosingBracket(str: string, b: string) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n\n let level = 0;\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '\\\\') {\n i++;\n } else if (str[i] === b[0]) {\n level++;\n } else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n if (level > 0) {\n return -2;\n }\n\n return -1;\n}\n","import { _defaults } from './defaults.ts';\nimport {\n rtrim,\n splitCells,\n findClosingBracket,\n} from './helpers.ts';\nimport type { Rules } from './rules.ts';\nimport type { _Lexer } from './Lexer.ts';\nimport type { Links, Tokens, Token } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\nfunction outputLink(cap: string[], link: Pick<Tokens.Link, 'href' | 'title'>, raw: string, lexer: _Lexer, rules: Rules): Tokens.Link | Tokens.Image {\n const href = link.href;\n const title = link.title || null;\n const text = cap[1].replace(rules.other.outputLinkReplace, '$1');\n\n lexer.state.inLink = true;\n const token: Tokens.Link | Tokens.Image = {\n type: cap[0].charAt(0) === '!' ? 'image' : 'link',\n raw,\n href,\n title,\n text,\n tokens: lexer.inlineTokens(text),\n };\n lexer.state.inLink = false;\n return token;\n}\n\nfunction indentCodeCompensation(raw: string, text: string, rules: Rules) {\n const matchIndentToCode = raw.match(rules.other.indentCodeCompensation);\n\n if (matchIndentToCode === null) {\n return text;\n }\n\n const indentToCode = matchIndentToCode[1];\n\n return text\n .split('\\n')\n .map(node => {\n const matchIndentInNode = node.match(rules.other.beginningSpace);\n if (matchIndentInNode === null) {\n return node;\n }\n\n const [indentInNode] = matchIndentInNode;\n\n if (indentInNode.length >= indentToCode.length) {\n return node.slice(indentToCode.length);\n }\n\n return node;\n })\n .join('\\n');\n}\n\n/**\n * Tokenizer\n */\nexport class _Tokenizer {\n options: MarkedOptions;\n rules!: Rules; // set by the lexer\n lexer!: _Lexer; // set by the lexer\n\n constructor(options?: MarkedOptions) {\n this.options = options || _defaults;\n }\n\n space(src: string): Tokens.Space | undefined {\n const cap = this.rules.block.newline.exec(src);\n if (cap && cap[0].length > 0) {\n return {\n type: 'space',\n raw: cap[0],\n };\n }\n }\n\n code(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.code.exec(src);\n if (cap) {\n const text = cap[0].replace(this.rules.other.codeRemoveIndent, '');\n return {\n type: 'code',\n raw: cap[0],\n codeBlockStyle: 'indented',\n text: !this.options.pedantic\n ? rtrim(text, '\\n')\n : text,\n };\n }\n }\n\n fences(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.fences.exec(src);\n if (cap) {\n const raw = cap[0];\n const text = indentCodeCompensation(raw, cap[3] || '', this.rules);\n\n return {\n type: 'code',\n raw,\n lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],\n text,\n };\n }\n }\n\n heading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.heading.exec(src);\n if (cap) {\n let text = cap[2].trim();\n\n // remove trailing #s\n if (this.rules.other.endingHash.test(text)) {\n const trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n } else if (!trimmed || this.rules.other.endingSpaceChar.test(trimmed)) {\n // CommonMark requires space before trailing #s\n text = trimmed.trim();\n }\n }\n\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[1].length,\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n hr(src: string): Tokens.Hr | undefined {\n const cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: rtrim(cap[0], '\\n'),\n };\n }\n }\n\n blockquote(src: string): Tokens.Blockquote | undefined {\n const cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n let lines = rtrim(cap[0], '\\n').split('\\n');\n let raw = '';\n let text = '';\n const tokens: Token[] = [];\n\n while (lines.length > 0) {\n let inBlockquote = false;\n const currentLines = [];\n\n let i;\n for (i = 0; i < lines.length; i++) {\n // get lines up to a continuation\n if (this.rules.other.blockquoteStart.test(lines[i])) {\n currentLines.push(lines[i]);\n inBlockquote = true;\n } else if (!inBlockquote) {\n currentLines.push(lines[i]);\n } else {\n break;\n }\n }\n lines = lines.slice(i);\n\n const currentRaw = currentLines.join('\\n');\n const currentText = currentRaw\n // precede setext continuation with 4 spaces so it isn't a setext\n .replace(this.rules.other.blockquoteSetextReplace, '\\n $1')\n .replace(this.rules.other.blockquoteSetextReplace2, '');\n raw = raw ? `${raw}\\n${currentRaw}` : currentRaw;\n text = text ? `${text}\\n${currentText}` : currentText;\n\n // parse blockquote lines as top level tokens\n // merge paragraphs if this is a continuation\n const top = this.lexer.state.top;\n this.lexer.state.top = true;\n this.lexer.blockTokens(currentText, tokens, true);\n this.lexer.state.top = top;\n\n // if there is no continuation then we are done\n if (lines.length === 0) {\n break;\n }\n\n const lastToken = tokens.at(-1);\n\n if (lastToken?.type === 'code') {\n // blockquote continuation cannot be preceded by a code block\n break;\n } else if (lastToken?.type === 'blockquote') {\n // include continuation in nested blockquote\n const oldToken = lastToken as Tokens.Blockquote;\n const newText = oldToken.raw + '\\n' + lines.join('\\n');\n const newToken = this.blockquote(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw;\n text = text.substring(0, text.length - oldToken.text.length) + newToken.text;\n break;\n } else if (lastToken?.type === 'list') {\n // include continuation in nested list\n const oldToken = lastToken as Tokens.List;\n const newText = oldToken.raw + '\\n' + lines.join('\\n');\n const newToken = this.list(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;\n text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;\n lines = newText.substring(tokens.at(-1)!.raw.length).split('\\n');\n continue;\n }\n }\n\n return {\n type: 'blockquote',\n raw,\n tokens,\n text,\n };\n }\n }\n\n list(src: string): Tokens.List | undefined {\n let cap = this.rules.block.list.exec(src);\n if (cap) {\n let bull = cap[1].trim();\n const isordered = bull.length > 1;\n\n const list: Tokens.List = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: [],\n };\n\n bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n\n // Get next list item\n const itemRegex = this.rules.other.listItemRegex(bull);\n let endsWithBlankLine = false;\n // Check if current bullet point can start a new List Item\n while (src) {\n let endEarly = false;\n let raw = '';\n let itemContents = '';\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n\n if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n\n raw = cap[0];\n src = src.substring(raw.length);\n\n let line = cap[2].split('\\n', 1)[0].replace(this.rules.other.listReplaceTabs, (t: string) => ' '.repeat(3 * t.length));\n let nextLine = src.split('\\n', 1)[0];\n let blankLine = !line.trim();\n\n let indent = 0;\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimStart();\n } else if (blankLine) {\n indent = cap[1].length + 1;\n } else {\n indent = cap[2].search(this.rules.other.nonSpaceChar); // Find first non-space char\n indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n itemContents = line.slice(indent);\n indent += cap[1].length;\n }\n\n if (blankLine && this.rules.other.blankLine.test(nextLine)) { // Items begin with at most one blank line\n raw += nextLine + '\\n';\n src = src.substring(nextLine.length + 1);\n endEarly = true;\n }\n\n if (!endEarly) {\n const nextBulletRegex = this.rules.other.nextBulletRegex(indent);\n const hrRegex = this.rules.other.hrRegex(indent);\n const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent);\n const headingBeginRegex = this.rules.other.headingBeginRegex(indent);\n const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent);\n\n // Check if following lines should be included in List Item\n while (src) {\n const rawLine = src.split('\\n', 1)[0];\n let nextLineWithoutTabs;\n nextLine = rawLine;\n\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n nextLine = nextLine.replace(this.rules.other.listReplaceNesting, ' ');\n nextLineWithoutTabs = nextLine;\n } else {\n nextLineWithoutTabs = nextLine.replace(this.rules.other.tabCharGlobal, ' ');\n }\n\n // End list item if found code fences\n if (fencesBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new heading\n if (headingBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of html block\n if (htmlBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new bullet\n if (nextBulletRegex.test(nextLine)) {\n break;\n }\n\n // Horizontal rule found\n if (hrRegex.test(nextLine)) {\n break;\n }\n\n if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) { // Dedent if possible\n itemContents += '\\n' + nextLineWithoutTabs.slice(indent);\n } else {\n // not enough indentation\n if (blankLine) {\n break;\n }\n\n // paragraph continuation unless last line was a different block level element\n if (line.replace(this.rules.other.tabCharGlobal, ' ').search(this.rules.other.nonSpaceChar) >= 4) { // indented code block\n break;\n }\n if (fencesBeginRegex.test(line)) {\n break;\n }\n if (headingBeginRegex.test(line)) {\n break;\n }\n if (hrRegex.test(line)) {\n break;\n }\n\n itemContents += '\\n' + nextLine;\n }\n\n if (!blankLine && !nextLine.trim()) { // Check if current line is blank\n blankLine = true;\n }\n\n raw += rawLine + '\\n';\n src = src.substring(rawLine.length + 1);\n line = nextLineWithoutTabs.slice(indent);\n }\n }\n\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n } else if (this.rules.other.doubleBlankLine.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n\n let istask: RegExpExecArray | null = null;\n let ischecked: boolean | undefined;\n // Check for task list items\n if (this.options.gfm) {\n istask = this.rules.other.listIsTask.exec(itemContents);\n if (istask) {\n ischecked = istask[0] !== '[ ] ';\n itemContents = itemContents.replace(this.rules.other.listReplaceTask, '');\n }\n }\n\n list.items.push({\n type: 'list_item',\n raw,\n task: !!istask,\n checked: ischecked,\n loose: false,\n text: itemContents,\n tokens: [],\n });\n\n list.raw += raw;\n }\n\n // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n const lastItem = list.items.at(-1);\n if (lastItem) {\n lastItem.raw = lastItem.raw.trimEnd();\n lastItem.text = lastItem.text.trimEnd();\n } else {\n // not a list since there were no items\n return;\n }\n list.raw = list.raw.trimEnd();\n\n // Item child tokens handled here at end because we needed to have the final item to trim it first\n for (let i = 0; i < list.items.length; i++) {\n this.lexer.state.top = false;\n list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n\n if (!list.loose) {\n // Check if list should be loose\n const spacers = list.items[i].tokens.filter(t => t.type === 'space');\n const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => this.rules.other.anyLine.test(t.raw));\n\n list.loose = hasMultipleLineBreaks;\n }\n }\n\n // Set all items to loose if list is loose\n if (list.loose) {\n for (let i = 0; i < list.items.length; i++) {\n list.items[i].loose = true;\n }\n }\n\n return list;\n }\n }\n\n html(src: string): Tokens.HTML | undefined {\n const cap = this.rules.block.html.exec(src);\n if (cap) {\n const token: Tokens.HTML = {\n type: 'html',\n block: true,\n raw: cap[0],\n pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n text: cap[0],\n };\n return token;\n }\n }\n\n def(src: string): Tokens.Def | undefined {\n const cap = this.rules.block.def.exec(src);\n if (cap) {\n const tag = cap[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, ' ');\n const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';\n const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];\n return {\n type: 'def',\n tag,\n raw: cap[0],\n href,\n title,\n };\n }\n }\n\n table(src: string): Tokens.Table | undefined {\n const cap = this.rules.block.table.exec(src);\n if (!cap) {\n return;\n }\n\n if (!this.rules.other.tableDelimiter.test(cap[2])) {\n // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n return;\n }\n\n const headers = splitCells(cap[1]);\n const aligns = cap[2].replace(this.rules.other.tableAlignChars, '').split('|');\n const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, '').split('\\n') : [];\n\n const item: Tokens.Table = {\n type: 'table',\n raw: cap[0],\n header: [],\n align: [],\n rows: [],\n };\n\n if (headers.length !== aligns.length) {\n // header and align columns must be equal, rows can be different.\n return;\n }\n\n for (const align of aligns) {\n if (this.rules.other.tableAlignRight.test(align)) {\n item.align.push('right');\n } else if (this.rules.other.tableAlignCenter.test(align)) {\n item.align.push('center');\n } else if (this.rules.other.tableAlignLeft.test(align)) {\n item.align.push('left');\n } else {\n item.align.push(null);\n }\n }\n\n for (let i = 0; i < headers.length; i++) {\n item.header.push({\n text: headers[i],\n tokens: this.lexer.inline(headers[i]),\n header: true,\n align: item.align[i],\n });\n }\n\n for (const row of rows) {\n item.rows.push(splitCells(row, item.header.length).map((cell, i) => {\n return {\n text: cell,\n tokens: this.lexer.inline(cell),\n header: false,\n align: item.align[i],\n };\n }));\n }\n\n return item;\n }\n\n lheading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.lheading.exec(src);\n if (cap) {\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text: cap[1],\n tokens: this.lexer.inline(cap[1]),\n };\n }\n }\n\n paragraph(src: string): Tokens.Paragraph | undefined {\n const cap = this.rules.block.paragraph.exec(src);\n if (cap) {\n const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1];\n return {\n type: 'paragraph',\n raw: cap[0],\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n text(src: string): Tokens.Text | undefined {\n const cap = this.rules.block.text.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: this.lexer.inline(cap[0]),\n };\n }\n }\n\n escape(src: string): Tokens.Escape | undefined {\n const cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: cap[1],\n };\n }\n }\n\n tag(src: string): Tokens.Tag | undefined {\n const cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) {\n this.lexer.state.inLink = true;\n } else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n } else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n\n return {\n type: 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n block: false,\n text: cap[0],\n };\n }\n }\n\n link(src: string): Tokens.Link | Tokens.Image | undefined {\n const cap = this.rules.inline.link.exec(src);\n if (cap) {\n const trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) {\n // commonmark requires matching angle brackets\n if (!(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n return;\n }\n\n // ending angle bracket cannot be escaped\n const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n } else {\n // find closing parenthesis\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex === -2) {\n // more open parens than closed\n return;\n }\n\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n let href = cap[2];\n let title = '';\n if (this.options.pedantic) {\n // split pedantic href and title\n const link = this.rules.other.pedanticHrefTitle.exec(href);\n\n if (link) {\n href = link[1];\n title = link[3];\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n\n href = href.trim();\n if (this.rules.other.startAngleBracket.test(href)) {\n if (this.options.pedantic && !(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n } else {\n href = href.slice(1, -1);\n }\n }\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,\n title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title,\n }, cap[0], this.lexer, this.rules);\n }\n }\n\n reflink(src: string, links: Links): Tokens.Link | Tokens.Image | Tokens.Text | undefined {\n let cap;\n if ((cap = this.rules.inline.reflink.exec(src))\n || (cap = this.rules.inline.nolink.exec(src))) {\n const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, ' ');\n const link = links[linkString.toLowerCase()];\n if (!link) {\n const text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text,\n };\n }\n return outputLink(cap, link, cap[0], this.lexer, this.rules);\n }\n }\n\n emStrong(src: string, maskedSrc: string, prevChar = ''): Tokens.Em | Tokens.Strong | undefined {\n let match = this.rules.inline.emStrongLDelim.exec(src);\n if (!match) return;\n\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[3] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return;\n\n const nextChar = match[1] || match[2] || '';\n\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n\n const endReg = match[0][0] === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue; // skip single * in __abc*abc__\n\n rLength = [...rDelim].length;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n } else if (match[5] || match[6]) { // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters. *a*** -> *a*\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n // char length can be >1 for unicode characters;\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n // Create `em` if smallest delimiter has odd char count. *a***\n if (Math.min(lLength, rLength) % 2) {\n const text = raw.slice(1, -1);\n return {\n type: 'em',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n\n // Create 'strong' if smallest delimiter has even char count. **a***\n const text = raw.slice(2, -2);\n return {\n type: 'strong',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n }\n }\n\n codespan(src: string): Tokens.Codespan | undefined {\n const cap = this.rules.inline.code.exec(src);\n if (cap) {\n let text = cap[2].replace(this.rules.other.newLineCharGlobal, ' ');\n const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text);\n const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n return {\n type: 'codespan',\n raw: cap[0],\n text,\n };\n }\n }\n\n br(src: string): Tokens.Br | undefined {\n const cap = this.rules.inline.br.exec(src);\n if (cap) {\n return {\n type: 'br',\n raw: cap[0],\n };\n }\n }\n\n del(src: string): Tokens.Del | undefined {\n const cap = this.rules.inline.del.exec(src);\n if (cap) {\n return {\n type: 'del',\n raw: cap[0],\n text: cap[2],\n tokens: this.lexer.inlineTokens(cap[2]),\n };\n }\n }\n\n autolink(src: string): Tokens.Link | undefined {\n const cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[1];\n href = 'mailto:' + text;\n } else {\n text = cap[1];\n href = text;\n }\n\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text,\n },\n ],\n };\n }\n }\n\n url(src: string): Tokens.Link | undefined {\n let cap;\n if (cap = this.rules.inline.url.exec(src)) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[0];\n href = 'mailto:' + text;\n } else {\n // do extended autolink path validation\n let prevCapZero;\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';\n } while (prevCapZero !== cap[0]);\n text = cap[0];\n if (cap[1] === 'www.') {\n href = 'http://' + cap[0];\n } else {\n href = cap[0];\n }\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text,\n },\n ],\n };\n }\n }\n\n inlineText(src: string): Tokens.Text | undefined {\n const cap = this.rules.inline.text.exec(src);\n if (cap) {\n const escaped = this.lexer.state.inRawBlock;\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n escaped,\n };\n }\n }\n}\n","import { _Tokenizer } from './Tokenizer.ts';\nimport { _defaults } from './defaults.ts';\nimport { other, block, inline } from './rules.ts';\nimport type { Token, TokensList, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Block Lexer\n */\nexport class _Lexer {\n tokens: TokensList;\n options: MarkedOptions;\n state: {\n inLink: boolean;\n inRawBlock: boolean;\n top: boolean;\n };\n\n private tokenizer: _Tokenizer;\n private inlineQueue: { src: string, tokens: Token[] }[];\n\n constructor(options?: MarkedOptions) {\n // TokenList cannot be created in one go\n this.tokens = [] as unknown as TokensList;\n this.tokens.links = Object.create(null);\n this.options = options || _defaults;\n this.options.tokenizer = this.options.tokenizer || new _Tokenizer();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n top: true,\n };\n\n const rules = {\n other,\n block: block.normal,\n inline: inline.normal,\n };\n\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n } else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n } else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n\n /**\n * Expose Rules\n */\n static get rules() {\n return {\n block,\n inline,\n };\n }\n\n /**\n * Static Lex Method\n */\n static lex(src: string, options?: MarkedOptions) {\n const lexer = new _Lexer(options);\n return lexer.lex(src);\n }\n\n /**\n * Static Lex Inline Method\n */\n static lexInline(src: string, options?: MarkedOptions) {\n const lexer = new _Lexer(options);\n return lexer.inlineTokens(src);\n }\n\n /**\n * Preprocessing\n */\n lex(src: string) {\n src = src.replace(other.carriageReturn, '\\n');\n\n this.blockTokens(src, this.tokens);\n\n for (let i = 0; i < this.inlineQueue.length; i++) {\n const next = this.inlineQueue[i];\n this.inlineTokens(next.src, next.tokens);\n }\n this.inlineQueue = [];\n\n return this.tokens;\n }\n\n /**\n * Lexing\n */\n blockTokens(src: string, tokens?: Token[], lastParagraphClipped?: boolean): Token[];\n blockTokens(src: string, tokens?: TokensList, lastParagraphClipped?: boolean): TokensList;\n blockTokens(src: string, tokens: Token[] = [], lastParagraphClipped = false) {\n if (this.options.pedantic) {\n src = src.replace(other.tabCharGlobal, ' ').replace(other.spaceLine, '');\n }\n\n while (src) {\n let token: Tokens.Generic | undefined;\n\n if (this.options.extensions?.block?.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.raw.length === 1 && lastToken !== undefined) {\n // if there's a single \\n as a spacer, it's terminating the last line,\n // so move it there so that we don't get unnecessary paragraph tags\n lastToken.raw += '\\n';\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n // An indented code block cannot interrupt a paragraph.\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // fences\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // hr\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // list\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title,\n };\n }\n continue;\n }\n\n // table (gfm)\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (this.options.extensions?.startBlock) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startBlock.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n const lastToken = tokens.at(-1);\n if (lastParagraphClipped && lastToken?.type === 'paragraph') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n lastParagraphClipped = cutSrc.length !== src.length;\n src = src.substring(token.raw.length);\n continue;\n }\n\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n\n this.state.top = true;\n return tokens;\n }\n\n inline(src: string, tokens: Token[] = []) {\n this.inlineQueue.push({ src, tokens });\n return tokens;\n }\n\n /**\n * Lexing/Compiling\n */\n inlineTokens(src: string, tokens: Token[] = []): Token[] {\n // String with links masked to avoid interference with em and strong\n let maskedSrc = src;\n let match: RegExpExecArray | null = null;\n\n // Mask out reflinks\n if (this.tokens.links) {\n const links = Object.keys(this.tokens.links);\n if (links.length > 0) {\n while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n maskedSrc = maskedSrc.slice(0, match.index)\n + '[' + 'a'.repeat(match[0].length - 2) + ']'\n + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n }\n }\n }\n }\n\n // Mask out escaped characters\n while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n }\n\n // Mask out other blocks\n while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n }\n\n let keepPrevChar = false;\n let prevChar = '';\n while (src) {\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n\n let token: Tokens.Generic | undefined;\n\n // extensions\n if (this.options.extensions?.inline?.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // link\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.type === 'text' && lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // em & strong\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // br\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // del (gfm)\n if (token = this.tokenizer.del(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // autolink\n if (token = this.tokenizer.autolink(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // url (gfm)\n if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (this.options.extensions?.startInline) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startInline.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (token = this.tokenizer.inlineText(cutSrc)) {\n src = src.substring(token.raw.length);\n if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n keepPrevChar = true;\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n\n return tokens;\n }\n}\n","import { _defaults } from './defaults.ts';\nimport {\n cleanUrl,\n escape,\n} from './helpers.ts';\nimport { other } from './rules.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Tokens } from './Tokens.ts';\nimport type { _Parser } from './Parser.ts';\n\n/**\n * Renderer\n */\nexport class _Renderer {\n options: MarkedOptions;\n parser!: _Parser; // set by the parser\n constructor(options?: MarkedOptions) {\n this.options = options || _defaults;\n }\n\n space(token: Tokens.Space): string {\n return '';\n }\n\n code({ text, lang, escaped }: Tokens.Code): string {\n const langString = (lang || '').match(other.notSpaceStart)?.[0];\n\n const code = text.replace(other.endingNewline, '') + '\\n';\n\n if (!langString) {\n return '<pre><code>'\n + (escaped ? code : escape(code, true))\n + '</code></pre>\\n';\n }\n\n return '<pre><code class=\"language-'\n + escape(langString)\n + '\">'\n + (escaped ? code : escape(code, true))\n + '</code></pre>\\n';\n }\n\n blockquote({ tokens }: Tokens.Blockquote): string {\n const body = this.parser.parse(tokens);\n return `<blockquote>\\n${body}</blockquote>\\n`;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag) : string {\n return text;\n }\n\n heading({ tokens, depth }: Tokens.Heading): string {\n return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>\\n`;\n }\n\n hr(token: Tokens.Hr): string {\n return '<hr>\\n';\n }\n\n list(token: Tokens.List): string {\n const ordered = token.ordered;\n const start = token.start;\n\n let body = '';\n for (let j = 0; j < token.items.length; j++) {\n const item = token.items[j];\n body += this.listitem(item);\n }\n\n const type = ordered ? 'ol' : 'ul';\n const startAttr = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startAttr + '>\\n' + body + '</' + type + '>\\n';\n }\n\n listitem(item: Tokens.ListItem): string {\n let itemBody = '';\n if (item.task) {\n const checkbox = this.checkbox({ checked: !!item.checked });\n if (item.loose) {\n if (item.tokens[0]?.type === 'paragraph') {\n item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n item.tokens[0].tokens[0].text = checkbox + ' ' + escape(item.tokens[0].tokens[0].text);\n item.tokens[0].tokens[0].escaped = true;\n }\n } else {\n item.tokens.unshift({\n type: 'text',\n raw: checkbox + ' ',\n text: checkbox + ' ',\n escaped: true,\n });\n }\n } else {\n itemBody += checkbox + ' ';\n }\n }\n\n itemBody += this.parser.parse(item.tokens, !!item.loose);\n\n return `<li>${itemBody}</li>\\n`;\n }\n\n checkbox({ checked }: Tokens.Checkbox): string {\n return '<input '\n + (checked ? 'checked=\"\" ' : '')\n + 'disabled=\"\" type=\"checkbox\">';\n }\n\n paragraph({ tokens }: Tokens.Paragraph): string {\n return `<p>${this.parser.parseInline(tokens)}</p>\\n`;\n }\n\n table(token: Tokens.Table): string {\n let header = '';\n\n // header\n let cell = '';\n for (let j = 0; j < token.header.length; j++) {\n cell += this.tablecell(token.header[j]);\n }\n header += this.tablerow({ text: cell });\n\n let body = '';\n for (let j = 0; j < token.rows.length; j++) {\n const row = token.rows[j];\n\n cell = '';\n for (let k = 0; k < row.length; k++) {\n cell += this.tablecell(row[k]);\n }\n\n body += this.tablerow({ text: cell });\n }\n if (body) body = `<tbody>${body}</tbody>`;\n\n return '<table>\\n'\n + '<thead>\\n'\n + header\n + '</thead>\\n'\n + body\n + '</table>\\n';\n }\n\n tablerow({ text }: Tokens.TableRow): string {\n return `<tr>\\n${text}</tr>\\n`;\n }\n\n tablecell(token: Tokens.TableCell): string {\n const content = this.parser.parseInline(token.tokens);\n const type = token.header ? 'th' : 'td';\n const tag = token.align\n ? `<${type} align=\"${token.align}\">`\n : `<${type}>`;\n return tag + content + `</${type}>\\n`;\n }\n\n /**\n * span level renderer\n */\n strong({ tokens }: Tokens.Strong): string {\n return `<strong>${this.parser.parseInline(tokens)}</strong>`;\n }\n\n em({ tokens }: Tokens.Em): string {\n return `<em>${this.parser.parseInline(tokens)}</em>`;\n }\n\n codespan({ text }: Tokens.Codespan): string {\n return `<code>${escape(text, true)}</code>`;\n }\n\n br(token: Tokens.Br): string {\n return '<br>';\n }\n\n del({ tokens }: Tokens.Del): string {\n return `<del>${this.parser.parseInline(tokens)}</del>`;\n }\n\n link({ href, title, tokens }: Tokens.Link): string {\n const text = this.parser.parseInline(tokens);\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return text;\n }\n href = cleanHref;\n let out = '<a href=\"' + href + '\"';\n if (title) {\n out += ' title=\"' + (escape(title)) + '\"';\n }\n out += '>' + text + '</a>';\n return out;\n }\n\n image({ href, title, text, tokens }: Tokens.Image): string {\n if (tokens) {\n text = this.parser.parseInline(tokens, this.parser.textRenderer);\n }\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return escape(text);\n }\n href = cleanHref;\n\n let out = `<img src=\"${href}\" alt=\"${text}\"`;\n if (title) {\n out += ` title=\"${escape(title)}\"`;\n }\n out += '>';\n return out;\n }\n\n text(token: Tokens.Text | Tokens.Escape) : string {\n return 'tokens' in token && token.tokens\n ? this.parser.parseInline(token.tokens)\n : ('escaped' in token && token.escaped ? token.text : escape(token.text));\n }\n}\n","import type { Tokens } from './Tokens.ts';\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nexport class _TextRenderer {\n // no need for block level renderers\n strong({ text }: Tokens.Strong) {\n return text;\n }\n\n em({ text }: Tokens.Em) {\n return text;\n }\n\n codespan({ text }: Tokens.Codespan) {\n return text;\n }\n\n del({ text }: Tokens.Del) {\n return text;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag) {\n return text;\n }\n\n text({ text }: Tokens.Text | Tokens.Escape | Tokens.Tag) {\n return text;\n }\n\n link({ text }: Tokens.Link) {\n return '' + text;\n }\n\n image({ text }: Tokens.Image) {\n return '' + text;\n }\n\n br() {\n return '';\n }\n}\n","import { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _defaults } from './defaults.ts';\nimport type { MarkedToken, Token, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Parsing & Compiling\n */\nexport class _Parser {\n options: MarkedOptions;\n renderer: _Renderer;\n textRenderer: _TextRenderer;\n constructor(options?: MarkedOptions) {\n this.options = options || _defaults;\n this.options.renderer = this.options.renderer || new _Renderer();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.renderer.parser = this;\n this.textRenderer = new _TextRenderer();\n }\n\n /**\n * Static Parse Method\n */\n static parse(tokens: Token[], options?: MarkedOptions) {\n const parser = new _Parser(options);\n return parser.parse(tokens);\n }\n\n /**\n * Static Parse Inline Method\n */\n static parseInline(tokens: Token[], options?: MarkedOptions) {\n const parser = new _Parser(options);\n return parser.parseInline(tokens);\n }\n\n /**\n * Parse Loop\n */\n parse(tokens: Token[], top = true): string {\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const genericToken = anyToken as Tokens.Generic;\n const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(genericToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'space': {\n out += this.renderer.space(token);\n continue;\n }\n case 'hr': {\n out += this.renderer.hr(token);\n continue;\n }\n case 'heading': {\n out += this.renderer.heading(token);\n continue;\n }\n case 'code': {\n out += this.renderer.code(token);\n continue;\n }\n case 'table': {\n out += this.renderer.table(token);\n continue;\n }\n case 'blockquote': {\n out += this.renderer.blockquote(token);\n continue;\n }\n case 'list': {\n out += this.renderer.list(token);\n continue;\n }\n case 'html': {\n out += this.renderer.html(token);\n continue;\n }\n case 'paragraph': {\n out += this.renderer.paragraph(token);\n continue;\n }\n case 'text': {\n let textToken = token;\n let body = this.renderer.text(textToken);\n while (i + 1 < tokens.length && tokens[i + 1].type === 'text') {\n textToken = tokens[++i] as Tokens.Text;\n body += '\\n' + this.renderer.text(textToken);\n }\n if (top) {\n out += this.renderer.paragraph({\n type: 'paragraph',\n raw: body,\n text: body,\n tokens: [{ type: 'text', raw: body, text: body, escaped: true }],\n });\n } else {\n out += body;\n }\n continue;\n }\n\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '';\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n\n return out;\n }\n\n /**\n * Parse Inline Tokens\n */\n parseInline(tokens: Token[], renderer: _Renderer | _TextRenderer = this.renderer): string {\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(anyToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'escape': {\n out += renderer.text(token);\n break;\n }\n case 'html': {\n out += renderer.html(token);\n break;\n }\n case 'link': {\n out += renderer.link(token);\n break;\n }\n case 'image': {\n out += renderer.image(token);\n break;\n }\n case 'strong': {\n out += renderer.strong(token);\n break;\n }\n case 'em': {\n out += renderer.em(token);\n break;\n }\n case 'codespan': {\n out += renderer.codespan(token);\n break;\n }\n case 'br': {\n out += renderer.br(token);\n break;\n }\n case 'del': {\n out += renderer.del(token);\n break;\n }\n case 'text': {\n out += renderer.text(token);\n break;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '';\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out;\n }\n}\n","import { _defaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\n\nexport class _Hooks {\n options: MarkedOptions;\n block?: boolean;\n\n constructor(options?: MarkedOptions) {\n this.options = options || _defaults;\n }\n\n static passThroughHooks = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens',\n ]);\n\n /**\n * Process markdown before marked\n */\n preprocess(markdown: string) {\n return markdown;\n }\n\n /**\n * Process HTML after marked is finished\n */\n postprocess(html: string) {\n return html;\n }\n\n /**\n * Process all tokens before walk tokens\n */\n processAllTokens(tokens: Token[] | TokensList) {\n return tokens;\n }\n\n /**\n * Provide function to tokenize markdown\n */\n provideLexer() {\n return this.block ? _Lexer.lex : _Lexer.lexInline;\n }\n\n /**\n * Provide function to parse tokens\n */\n provideParser() {\n return this.block ? _Parser.parse : _Parser.parseInline;\n }\n}\n","import { _getDefaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { escape } from './helpers.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, Tokens, TokensList } from './Tokens.ts';\n\nexport type MaybePromise = void | Promise<void>;\n\ntype UnknownFunction = (...args: unknown[]) => unknown;\ntype GenericRendererFunction = (...args: unknown[]) => string | false;\n\nexport class Marked {\n defaults = _getDefaults();\n options = this.setOptions;\n\n parse = this.parseMarkdown(true);\n parseInline = this.parseMarkdown(false);\n\n Parser = _Parser;\n Renderer = _Renderer;\n TextRenderer = _TextRenderer;\n Lexer = _Lexer;\n Tokenizer = _Tokenizer;\n Hooks = _Hooks;\n\n constructor(...args: MarkedExtension[]) {\n this.use(...args);\n }\n\n /**\n * Run callback for every token\n */\n walkTokens(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n let values: MaybePromise[] = [];\n for (const token of tokens) {\n values = values.concat(callback.call(this, token));\n switch (token.type) {\n case 'table': {\n const tableToken = token as Tokens.Table;\n for (const cell of tableToken.header) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n for (const row of tableToken.rows) {\n for (const cell of row) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n }\n break;\n }\n case 'list': {\n const listToken = token as Tokens.List;\n values = values.concat(this.walkTokens(listToken.items, callback));\n break;\n }\n default: {\n const genericToken = token as Tokens.Generic;\n if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n const tokens = genericToken[childTokens].flat(Infinity) as Token[] | TokensList;\n values = values.concat(this.walkTokens(tokens, callback));\n });\n } else if (genericToken.tokens) {\n values = values.concat(this.walkTokens(genericToken.tokens, callback));\n }\n }\n }\n }\n return values;\n }\n\n use(...args: MarkedExtension[]) {\n const extensions: MarkedOptions['extensions'] = this.defaults.extensions || { renderers: {}, childTokens: {} };\n\n args.forEach((pack) => {\n // copy options to new object\n const opts = { ...pack } as MarkedOptions;\n\n // set async to true if it was set to true before\n opts.async = this.defaults.async || opts.async || false;\n\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n pack.extensions.forEach((ext) => {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n if ('renderer' in ext) { // Renderer extensions\n const prevRenderer = extensions.renderers[ext.name];\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function(...args) {\n let ret = ext.renderer.apply(this, args);\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n return ret;\n };\n } else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n if ('tokenizer' in ext) { // Tokenizer Extensions\n if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n const extLevel = extensions[ext.level];\n if (extLevel) {\n extLevel.unshift(ext.tokenizer);\n } else {\n extensions[ext.level] = [ext.tokenizer];\n }\n if (ext.start) { // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n } else {\n extensions.startBlock = [ext.start];\n }\n } else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n } else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n opts.extensions = extensions;\n }\n\n // ==-- Parse \"overwrite\" extensions --== //\n if (pack.renderer) {\n const renderer = this.defaults.renderer || new _Renderer(this.defaults);\n for (const prop in pack.renderer) {\n if (!(prop in renderer)) {\n throw new Error(`renderer '${prop}' does not exist`);\n }\n if (['options', 'parser'].includes(prop)) {\n // ignore options property\n continue;\n }\n const rendererProp = prop as Exclude<keyof _Renderer, 'options' | 'parser'>;\n const rendererFunc = pack.renderer[rendererProp] as GenericRendererFunction;\n const prevRenderer = renderer[rendererProp] as GenericRendererFunction;\n // Replace renderer with func to run extension, but fall back if false\n renderer[rendererProp] = (...args: unknown[]) => {\n let ret = rendererFunc.apply(renderer, args);\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n return ret || '';\n };\n }\n opts.renderer = renderer;\n }\n if (pack.tokenizer) {\n const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);\n for (const prop in pack.tokenizer) {\n if (!(prop in tokenizer)) {\n throw new Error(`tokenizer '${prop}' does not exist`);\n }\n if (['options', 'rules', 'lexer'].includes(prop)) {\n // ignore options, rules, and lexer properties\n continue;\n }\n const tokenizerProp = prop as Exclude<keyof _Tokenizer, 'options' | 'rules' | 'lexer'>;\n const tokenizerFunc = pack.tokenizer[tokenizerProp] as UnknownFunction;\n const prevTokenizer = tokenizer[tokenizerProp] as UnknownFunction;\n // Replace tokenizer with func to run extension, but fall back if false\n // @ts-expect-error cannot type tokenizer function dynamically\n tokenizer[tokenizerProp] = (...args: unknown[]) => {\n let ret = tokenizerFunc.apply(tokenizer, args);\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n return ret;\n };\n }\n opts.tokenizer = tokenizer;\n }\n\n // ==-- Parse Hooks extensions --== //\n if (pack.hooks) {\n const hooks = this.defaults.hooks || new _Hooks();\n for (const prop in pack.hooks) {\n if (!(prop in hooks)) {\n throw new Error(`hook '${prop}' does not exist`);\n }\n if (['options', 'block'].includes(prop)) {\n // ignore options and block properties\n continue;\n }\n const hooksProp = prop as Exclude<keyof _Hooks, 'options' | 'block'>;\n const hooksFunc = pack.hooks[hooksProp] as UnknownFunction;\n const prevHook = hooks[hooksProp] as UnknownFunction;\n if (_Hooks.passThroughHooks.has(prop)) {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (arg: unknown) => {\n if (this.defaults.async) {\n return Promise.resolve(hooksFunc.call(hooks, arg)).then(ret => {\n return prevHook.call(hooks, ret);\n });\n }\n\n const ret = hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n };\n } else {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (...args: unknown[]) => {\n let ret = hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = prevHook.apply(hooks, args);\n }\n return ret;\n };\n }\n }\n opts.hooks = hooks;\n }\n\n // ==-- Parse WalkTokens extensions --== //\n if (pack.walkTokens) {\n const walkTokens = this.defaults.walkTokens;\n const packWalktokens = pack.walkTokens;\n opts.walkTokens = function(token) {\n let values: MaybePromise[] = [];\n values.push(packWalktokens.call(this, token));\n if (walkTokens) {\n values = values.concat(walkTokens.call(this, token));\n }\n return values;\n };\n }\n\n this.defaults = { ...this.defaults, ...opts };\n });\n\n return this;\n }\n\n setOptions(opt: MarkedOptions) {\n this.defaults = { ...this.defaults, ...opt };\n return this;\n }\n\n lexer(src: string, options?: MarkedOptions) {\n return _Lexer.lex(src, options ?? this.defaults);\n }\n\n parser(tokens: Token[], options?: MarkedOptions) {\n return _Parser.parse(tokens, options ?? this.defaults);\n }\n\n private parseMarkdown(blockType: boolean) {\n type overloadedParse = {\n (src: string, options: MarkedOptions & { async: true }): Promise<string>;\n (src: string, options: MarkedOptions & { async: false }): string;\n (src: string, options?: MarkedOptions | null): string | Promise<string>;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parse: overloadedParse = (src: string, options?: MarkedOptions | null): any => {\n const origOpt = { ...options };\n const opt = { ...this.defaults, ...origOpt };\n\n const throwError = this.onError(!!opt.silent, !!opt.async);\n\n // throw error if an extension set async to true but parse was called with async: false\n if (this.defaults.async === true && origOpt.async === false) {\n return throwError(new Error('marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.'));\n }\n\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n return throwError(new Error('marked(): input parameter is undefined or null'));\n }\n if (typeof src !== 'string') {\n return throwError(new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected'));\n }\n\n if (opt.hooks) {\n opt.hooks.options = opt;\n opt.hooks.block = blockType;\n }\n\n const lexer = opt.hooks ? opt.hooks.provideLexer() : (blockType ? _Lexer.lex : _Lexer.lexInline);\n const parser = opt.hooks ? opt.hooks.provideParser() : (blockType ? _Parser.parse : _Parser.parseInline);\n\n if (opt.async) {\n return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src)\n .then(src => lexer(src, opt))\n .then(tokens => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens)\n .then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens)\n .then(tokens => parser(tokens, opt))\n .then(html => opt.hooks ? opt.hooks.postprocess(html) : html)\n .catch(throwError);\n }\n\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src) as string;\n }\n let tokens = lexer(src, opt);\n if (opt.hooks) {\n tokens = opt.hooks.processAllTokens(tokens);\n }\n if (opt.walkTokens) {\n this.walkTokens(tokens, opt.walkTokens);\n }\n let html = parser(tokens, opt);\n if (opt.hooks) {\n html = opt.hooks.postprocess(html) as string;\n }\n return html;\n } catch (e) {\n return throwError(e as Error);\n }\n };\n\n return parse;\n }\n\n private onError(silent: boolean, async: boolean) {\n return (e: Error): string | Promise<string> => {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n\n if (silent) {\n const msg = '<p>An error occurred:</p><pre>'\n + escape(e.message + '', true)\n + '</pre>';\n if (async) {\n return Promise.resolve(msg);\n }\n return msg;\n }\n\n if (async) {\n return Promise.reject(e);\n }\n throw e;\n };\n }\n}\n","import { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { Marked } from './Instance.ts';\nimport {\n _getDefaults,\n changeDefaults,\n _defaults,\n} from './defaults.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\nimport type { MaybePromise } from './Instance.ts';\n\nconst markedInstance = new Marked();\n\n/**\n * Compiles markdown to HTML asynchronously.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options, having async: true\n * @return Promise of string of compiled HTML\n */\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\n\n/**\n * Compiles markdown to HTML.\n *\n * @param src String of markdown source to be compiled\n * @param options Optional hash of options\n * @return String of compiled HTML. Will be a Promise of string if async is set to true by any extensions.\n */\nexport function marked(src: string, options: MarkedOptions & { async: false }): string;\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\nexport function marked(src: string, options?: MarkedOptions | null): string | Promise<string>;\nexport function marked(src: string, opt?: MarkedOptions | null): string | Promise<string> {\n return markedInstance.parse(src, opt);\n}\n\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\nmarked.setOptions = function(options: MarkedOptions) {\n markedInstance.setOptions(options);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n};\n\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\n\nmarked.defaults = _defaults;\n\n/**\n * Use Extension\n */\n\nmarked.use = function(...args: MarkedExtension[]) {\n markedInstance.use(...args);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n};\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n return markedInstance.walkTokens(tokens, callback);\n};\n\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\n\nexport const options = marked.options;\nexport const setOptions = marked.setOptions;\nexport const use = marked.use;\nexport const walkTokens = marked.walkTokens;\nexport const parseInline = marked.parseInline;\nexport const parse = marked;\nexport const parser = _Parser.parse;\nexport const lexer = _Lexer.lex;\nexport { _defaults as defaults, _getDefaults as getDefaults } from './defaults.ts';\nexport { _Lexer as Lexer } from './Lexer.ts';\nexport { _Parser as Parser } from './Parser.ts';\nexport { _Tokenizer as Tokenizer } from './Tokenizer.ts';\nexport { _Renderer as Renderer } from './Renderer.ts';\nexport { _TextRenderer as TextRenderer } from './TextRenderer.ts';\nexport { _Hooks as Hooks } from './Hooks.ts';\nexport { Marked } from './Instance.ts';\nexport type * from './MarkedOptions.ts';\nexport type * from './Tokens.ts';\n","/** Pure markdown → flat MdLine[]. Streaming-safe: marked.lexer tolerates partial input. */\n\nimport { type Token, type Tokens, marked } from \"marked\";\n\nexport interface InlineStyle {\n bold?: boolean;\n italic?: boolean;\n strike?: boolean;\n code?: boolean;\n link?: string;\n fileRef?: { path: string; line?: number; lineEnd?: number };\n}\n\nexport interface InlineSpan extends InlineStyle {\n text: string;\n}\n\nexport type MdLine =\n | { kind: \"blank\" }\n | { kind: \"hr\" }\n | { kind: \"heading\"; level: number; spans: InlineSpan[] }\n | { kind: \"paragraph\"; spans: InlineSpan[] }\n | {\n kind: \"list\";\n ordered: boolean;\n index: number;\n depth: number;\n task?: \"todo\" | \"done\";\n spans: InlineSpan[];\n }\n | { kind: \"code\"; lang: string; text: string }\n | { kind: \"blockquote\"; spans: InlineSpan[] };\n\nconst FILE_REF_RE = /\\b([A-Za-z0-9_./@\\-]+\\.[A-Za-z0-9]{1,6})(?::(\\d+)(?:-(\\d+))?)?\\b/g;\n\nmarked.use({ gfm: true, breaks: false });\n\nexport function markdownToLines(text: string): MdLine[] {\n if (text.length === 0) return [];\n const tokens = marked.lexer(text);\n const out: MdLine[] = [];\n for (const tok of tokens) emitBlock(tok, out, 0);\n return out;\n}\n\nfunction emitBlock(tok: Token, out: MdLine[], depth: number): void {\n switch (tok.type) {\n case \"heading\": {\n const h = tok as Tokens.Heading;\n out.push({ kind: \"heading\", level: h.depth, spans: inline(h.tokens ?? []) });\n return;\n }\n case \"paragraph\": {\n const p = tok as Tokens.Paragraph;\n out.push({ kind: \"paragraph\", spans: inline(p.tokens ?? []) });\n return;\n }\n case \"code\": {\n const c = tok as Tokens.Code;\n out.push({ kind: \"code\", lang: (c.lang ?? \"\").split(/\\s+/)[0] ?? \"\", text: c.text });\n return;\n }\n case \"list\": {\n const l = tok as Tokens.List;\n const startIndex = Number(l.start) || 1;\n l.items.forEach((item, i) => emitListItem(item, out, l.ordered, startIndex + i, depth));\n return;\n }\n case \"hr\":\n out.push({ kind: \"hr\" });\n return;\n case \"blockquote\": {\n const bq = tok as Tokens.Blockquote;\n for (const child of bq.tokens ?? []) {\n if (child.type === \"paragraph\") {\n out.push({ kind: \"blockquote\", spans: inline((child as Tokens.Paragraph).tokens ?? []) });\n } else if (child.type === \"space\") {\n // skip\n } else {\n // For nested non-paragraph blocks (lists, code), fall back to a flat blockquote span.\n const flat = plainTokens(child);\n if (flat.length > 0) out.push({ kind: \"blockquote\", spans: [{ text: flat }] });\n }\n }\n return;\n }\n case \"space\":\n out.push({ kind: \"blank\" });\n return;\n case \"html\": {\n const h = tok as Tokens.HTML;\n out.push({ kind: \"paragraph\", spans: [{ text: h.text }] });\n return;\n }\n default: {\n // Unknown / table / def — render the raw text as a paragraph fallback.\n const raw = (tok as { raw?: string }).raw ?? \"\";\n if (raw.trim().length > 0) out.push({ kind: \"paragraph\", spans: [{ text: raw }] });\n }\n }\n}\n\nfunction emitListItem(\n item: Tokens.ListItem,\n out: MdLine[],\n ordered: boolean,\n index: number,\n depth: number,\n): void {\n const task = item.task ? (item.checked ? \"done\" : \"todo\") : undefined;\n const head: MdLine = {\n kind: \"list\",\n ordered,\n index,\n depth,\n spans: [],\n ...(task ? { task } : {}),\n };\n out.push(head);\n for (const tok of item.tokens) {\n if (tok.type === \"text\") {\n const t = tok as Tokens.Text;\n const spans = t.tokens ? inline(t.tokens) : inlineFromText(t.text);\n head.spans.push(...spans);\n } else if (tok.type === \"list\") {\n const sub = tok as Tokens.List;\n const subStart = Number(sub.start) || 1;\n sub.items.forEach((s, i) => emitListItem(s, out, sub.ordered, subStart + i, depth + 1));\n } else {\n emitBlock(tok, out, depth);\n }\n }\n}\n\nfunction inline(tokens: Token[]): InlineSpan[] {\n const out: InlineSpan[] = [];\n walk(tokens, {}, out);\n return mergeAdjacent(out);\n}\n\nfunction walk(tokens: Token[], style: InlineStyle, out: InlineSpan[]): void {\n for (const tok of tokens) {\n switch (tok.type) {\n case \"text\": {\n const t = tok as Tokens.Text;\n if (t.tokens && t.tokens.length > 0) walk(t.tokens, style, out);\n else pushTextSpans(t.text, style, out);\n break;\n }\n case \"strong\":\n walk((tok as Tokens.Strong).tokens, { ...style, bold: true }, out);\n break;\n case \"em\":\n walk((tok as Tokens.Em).tokens, { ...style, italic: true }, out);\n break;\n case \"del\":\n walk((tok as Tokens.Del).tokens, { ...style, strike: true }, out);\n break;\n case \"codespan\":\n out.push({ text: (tok as Tokens.Codespan).text, code: true, ...style });\n break;\n case \"link\": {\n const l = tok as Tokens.Link;\n // A link's children are still subject to ancestor styles; emit each\n // descendant span with the link href so OSC8 can wrap it later.\n const before = out.length;\n walk(l.tokens, style, out);\n for (let i = before; i < out.length; i++) {\n const span = out[i]!;\n if (!span.link) span.link = l.href;\n }\n break;\n }\n case \"image\": {\n const im = tok as Tokens.Image;\n out.push({ text: `[image: ${im.text || im.href}]`, ...style });\n break;\n }\n case \"br\":\n out.push({ text: \"\\n\", ...style });\n break;\n case \"escape\":\n pushTextSpans((tok as Tokens.Escape).text, style, out);\n break;\n case \"html\":\n pushTextSpans((tok as Tokens.HTML).text, style, out);\n break;\n default:\n pushTextSpans((tok as { raw?: string }).raw ?? \"\", style, out);\n }\n }\n}\n\nfunction pushTextSpans(text: string, style: InlineStyle, out: InlineSpan[]): void {\n if (text.length === 0) return;\n // Split out file refs so the renderer can OSC8-link them.\n let cursor = 0;\n for (const m of text.matchAll(FILE_REF_RE)) {\n const start = m.index ?? 0;\n const end = start + m[0].length;\n if (start > cursor) out.push({ text: text.slice(cursor, start), ...style });\n const path = m[1]!;\n const ln = m[2] ? Number(m[2]) : undefined;\n const lnEnd = m[3] ? Number(m[3]) : undefined;\n out.push({\n text: m[0],\n ...style,\n fileRef: {\n path,\n ...(ln !== undefined ? { line: ln } : {}),\n ...(lnEnd !== undefined ? { lineEnd: lnEnd } : {}),\n },\n });\n cursor = end;\n }\n if (cursor < text.length) out.push({ text: text.slice(cursor), ...style });\n}\n\nfunction inlineFromText(text: string): InlineSpan[] {\n const out: InlineSpan[] = [];\n pushTextSpans(text, {}, out);\n return out;\n}\n\nfunction mergeAdjacent(spans: InlineSpan[]): InlineSpan[] {\n if (spans.length < 2) return spans;\n const out: InlineSpan[] = [];\n for (const s of spans) {\n const last = out[out.length - 1];\n if (last && stylesEqual(last, s)) {\n out[out.length - 1] = { ...last, text: last.text + s.text };\n } else {\n out.push(s);\n }\n }\n return out;\n}\n\nfunction stylesEqual(a: InlineSpan, b: InlineSpan): boolean {\n return (\n !!a.bold === !!b.bold &&\n !!a.italic === !!b.italic &&\n !!a.strike === !!b.strike &&\n !!a.code === !!b.code &&\n a.link === b.link &&\n fileRefEqual(a.fileRef, b.fileRef)\n );\n}\n\nfunction fileRefEqual(a: InlineSpan[\"fileRef\"], b: InlineSpan[\"fileRef\"]): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return a.path === b.path && a.line === b.line && a.lineEnd === b.lineEnd;\n}\n\nfunction plainTokens(tok: Token): string {\n if (\"raw\" in tok && typeof (tok as { raw?: string }).raw === \"string\") {\n return (tok as { raw: string }).raw.trim();\n }\n return \"\";\n}\n\n/** Extract just the visible characters from a span list — handy for tests / previews. */\nexport function spansText(spans: ReadonlyArray<InlineSpan>): string {\n let s = \"\";\n for (const span of spans) s += span.text;\n return s;\n}\n","import { Box, Text } from \"ink\";\nimport React, { useState } from \"react\";\nimport { ApprovalCard, type ApprovalCardProps } from \"./cards/ApprovalCard.js\";\nimport { useKeystroke } from \"./keystroke-context.js\";\nimport { CARD, FG } from \"./theme/tokens.js\";\nimport { useTick } from \"./ticker.js\";\n\nexport interface PlanRefineInputProps {\n mode: \"approve\" | \"refine\" | \"reject\" | \"checkpoint-revise\" | \"choice-custom\";\n onSubmit: (feedback: string) => void;\n onCancel: () => void;\n}\n\ninterface ModeMeta {\n title: string;\n glyph: string;\n tone: ApprovalCardProps[\"tone\"];\n cursorColor: string;\n hint: string;\n blankHint: string;\n}\n\nconst MODES: Record<PlanRefineInputProps[\"mode\"], ModeMeta> = {\n approve: {\n title: \"approving — any last instructions?\",\n glyph: \"◇\",\n tone: \"user\",\n cursorColor: CARD.user.color,\n hint: \"Answer questions the plan raised, add constraints, or just press Enter to approve as-is.\",\n blankHint: \" (Enter with blank = approve without extra instructions.)\",\n },\n refine: {\n title: \"refining — what should the model change?\",\n glyph: \"✎\",\n tone: \"warn\",\n cursorColor: CARD.warn.color,\n hint: \"Describe what's wrong or missing, or answer questions the plan raised.\",\n blankHint: \" (Enter with blank = ask the model to list concrete questions.)\",\n },\n reject: {\n title: \"rejecting — tell the model why (optional)\",\n glyph: \"✗\",\n tone: \"error\",\n cursorColor: CARD.error.color,\n hint: \"Say what the model got wrong about your goal, or what you actually want instead.\",\n blankHint:\n \" (Enter with blank = cancel without explanation; the model will ask what you want.)\",\n },\n \"checkpoint-revise\": {\n title: \"revising — what should change before the next step?\",\n glyph: \"✎\",\n tone: \"warn\",\n cursorColor: CARD.warn.color,\n hint: \"Scope change, skip steps, alternative approach — the model adjusts the remaining plan.\",\n blankHint: \" (Enter with blank = continue with the current plan.)\",\n },\n \"choice-custom\": {\n title: \"custom answer — type whatever fits\",\n glyph: \"⌥\",\n tone: \"accent\",\n cursorColor: CARD.plan.color,\n hint: \"Free-form reply. The model reads it verbatim and proceeds — no need to match the listed options.\",\n blankHint: \" (Enter with blank = ask the model what you actually want.)\",\n },\n};\n\nexport function PlanRefineInput({ mode, onSubmit, onCancel }: PlanRefineInputProps) {\n const [value, setValue] = useState(\"\");\n\n useKeystroke((ev) => {\n if (ev.paste) {\n setValue((v) => v + ev.input.replace(/\\r?\\n/g, \" \"));\n return;\n }\n if (ev.escape) {\n onCancel();\n return;\n }\n if (ev.return) {\n onSubmit(value.trim());\n return;\n }\n if (ev.backspace || ev.delete) {\n setValue((v) => v.slice(0, -1));\n return;\n }\n if (ev.input && !ev.ctrl && !ev.meta) {\n setValue((v) => v + ev.input);\n }\n });\n\n const tick = useTick();\n const cursorOn = Math.floor(tick / 4) % 2 === 0;\n const meta = MODES[mode];\n\n return (\n <ApprovalCard\n tone={meta.tone}\n glyph={meta.glyph}\n title={meta.title}\n footerHint=\"⏎ send · esc return to picker\"\n >\n <Box marginBottom={1}>\n <Text color={FG.sub}>\n {meta.hint}\n {value === \"\" ? meta.blankHint : \"\"}\n </Text>\n </Box>\n <Box>\n <Text color={meta.cursorColor} bold>\n {\"› \"}\n </Text>\n <Text>{value}</Text>\n <Text color={meta.cursorColor} bold>\n {cursorOn ? \"▍\" : \" \"}\n </Text>\n </Box>\n </ApprovalCard>\n );\n}\n","import { useAnimation } from \"ink\";\nimport React, { type ReactNode, createContext, useContext, useState } from \"react\";\n\n/**\n * Two-tier global heartbeat backed by Ink 7's `useAnimation`. The\n * provider only stores an `isActive` boolean; the actual frame timer\n * lives inside Ink and consolidates with every other useAnimation\n * caller into a single shared interval.\n *\n * - FAST_TICK_MS (120ms) — spinners, glyph pulses, anything that\n * visibly animates frame-by-frame.\n * - SLOW_TICK_MS (1000ms) — elapsed-seconds counters, expiry\n * countdowns, polling pollers. Don't need 8Hz re-renders.\n *\n * Setting `disabled` flips `isActive` to `false`, which Ink propagates\n * to every active animation. Repaints stop entirely until isActive\n * flips back, at which point Ink resets the frame counter to 0 (so\n * spinners restart from frame 0 — visually identical to a fresh mount).\n */\nexport const FAST_TICK_MS = 120;\nexport const SLOW_TICK_MS = 1000;\n/** @deprecated kept for callers that import the old name. */\nexport const TICK_MS = FAST_TICK_MS;\n\nconst TickerActiveContext = createContext(true);\n\nexport interface TickerProviderProps {\n children: ReactNode;\n /**\n * When true, every tick-driven animation pauses. Used by PLAIN_UI\n * mode, modal overlays, and the idle-gate so a quiescent TUI is\n * byte-stable (cursor blink and gradient pulses don't re-render).\n */\n disabled?: boolean;\n}\n\nexport function TickerProvider({ children, disabled }: TickerProviderProps) {\n return <TickerActiveContext.Provider value={!disabled}>{children}</TickerActiveContext.Provider>;\n}\n\nfunction useTickerActive(): boolean {\n return useContext(TickerActiveContext);\n}\n\n/**\n * Fast tick — re-renders the calling component every FAST_TICK_MS\n * (120ms). Use for spinner frames, glyph pulses, anything that\n * visibly animates frame-by-frame.\n */\nexport function useTick(): number {\n const isActive = useTickerActive();\n return useAnimation({ interval: FAST_TICK_MS, isActive }).frame;\n}\n\n/**\n * Slow tick — re-renders the calling component every SLOW_TICK_MS\n * (1000ms). Use for elapsed-seconds counters, expiry countdowns,\n * or pollers that just need a \"what's the time NOW?\" trigger once\n * per second.\n */\nexport function useSlowTick(): number {\n const isActive = useTickerActive();\n return useAnimation({ interval: SLOW_TICK_MS, isActive }).frame;\n}\n\n/** Seconds elapsed since mount. Re-renders at 1Hz via the slow tick. */\nexport function useElapsedSeconds(): number {\n const [start] = useState(() => Date.now());\n useSlowTick();\n return Math.floor((Date.now() - start) / 1000);\n}\n","import { Box, Text } from \"ink\";\nimport React from \"react\";\nimport type { PlanStep } from \"../../tools/plan.js\";\nimport { SingleSelect } from \"./Select.js\";\nimport { ApprovalCard } from \"./cards/ApprovalCard.js\";\n\nexport type ReviseChoice = \"accept\" | \"reject\";\n\nexport interface PlanReviseConfirmProps {\n reason: string;\n oldRemaining: PlanStep[];\n newRemaining: PlanStep[];\n summary?: string;\n onChoose: (choice: ReviseChoice) => void;\n}\n\ninterface DiffRow {\n kind: \"kept\" | \"removed\" | \"added\";\n step: PlanStep;\n}\n\nfunction computeDiff(oldSteps: PlanStep[], newSteps: PlanStep[]): DiffRow[] {\n const oldIds = new Set(oldSteps.map((s) => s.id));\n const newIds = new Set(newSteps.map((s) => s.id));\n const rows: DiffRow[] = [];\n for (const s of oldSteps) {\n if (!newIds.has(s.id)) rows.push({ kind: \"removed\", step: s });\n }\n for (const s of newSteps) {\n rows.push({ kind: oldIds.has(s.id) ? \"kept\" : \"added\", step: s });\n }\n return rows;\n}\n\nfunction riskDots(risk: PlanStep[\"risk\"]): { dots: string; color: string } {\n switch (risk) {\n case \"high\":\n return { dots: \"●●●\", color: \"#f87171\" };\n case \"med\":\n return { dots: \"●● \", color: \"#fbbf24\" };\n case \"low\":\n return { dots: \"● \", color: \"#4ade80\" };\n default:\n return { dots: \" \", color: \"#94a3b8\" };\n }\n}\n\nfunction PlanReviseConfirmInner({\n reason,\n oldRemaining,\n newRemaining,\n summary,\n onChoose,\n}: PlanReviseConfirmProps) {\n const rows = computeDiff(oldRemaining, newRemaining);\n const removedCount = rows.filter((r) => r.kind === \"removed\").length;\n const addedCount = rows.filter((r) => r.kind === \"added\").length;\n const keptCount = rows.filter((r) => r.kind === \"kept\").length;\n return (\n <ApprovalCard\n tone=\"warn\"\n glyph=\"✏\"\n title=\"plan revision proposed\"\n metaRight={`−${removedCount} +${addedCount} · ${keptCount} kept`}\n >\n <Box marginBottom={1}>\n <Text>{reason}</Text>\n </Box>\n {summary ? (\n <Box marginBottom={1}>\n <Text dimColor>{`updated summary: ${summary}`}</Text>\n </Box>\n ) : null}\n <Box marginBottom={1} flexDirection=\"column\">\n {rows.map((row) => {\n const risk = riskDots(row.step.risk);\n const prefix = row.kind === \"removed\" ? \"−\" : row.kind === \"added\" ? \"+\" : \" \";\n const prefixColor =\n row.kind === \"removed\" ? \"#f87171\" : row.kind === \"added\" ? \"#4ade80\" : \"#94a3b8\";\n const dim = row.kind === \"kept\";\n const strike = row.kind === \"removed\";\n return (\n <Box key={`${row.kind}-${row.step.id}`}>\n <Text color={prefixColor} bold>\n {`${prefix} `}\n </Text>\n <Text color={risk.color} bold dimColor={dim}>\n {risk.dots}\n </Text>\n <Text dimColor={dim} strikethrough={strike}>\n {` ${row.step.id} · ${row.step.title}`}\n </Text>\n </Box>\n );\n })}\n </Box>\n <SingleSelect\n initialValue=\"accept\"\n items={[\n {\n value: \"accept\",\n label: \"Accept revision — apply the new step list\",\n hint: \"Replaces the remaining plan with the proposed steps. Done steps are untouched.\",\n },\n {\n value: \"reject\",\n label: \"Reject — keep the original plan\",\n hint: \"Drops the proposal. Model continues with the original remaining steps.\",\n },\n ]}\n onSubmit={(v) => onChoose(v as ReviseChoice)}\n onCancel={() => onChoose(\"reject\")}\n />\n </ApprovalCard>\n );\n}\n\nexport const PlanReviseConfirm = React.memo(PlanReviseConfirmInner);\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { useState } from \"react\";\nimport type { PlanStep } from \"../../tools/plan.js\";\nimport { ApprovalCard } from \"./cards/ApprovalCard.js\";\nimport { useKeystroke } from \"./keystroke-context.js\";\nimport { FG, TONE } from \"./theme/tokens.js\";\n\nexport interface PlanReviseEditorProps {\n steps: PlanStep[];\n /** stepId set the model has already marked done — those rows render `[✓]` and are not editable. */\n completedStepIds?: Set<string>;\n onAccept: (revised: PlanStep[], skippedIds: ReadonlyArray<string>) => void;\n onCancel: () => void;\n}\n\ninterface RowState {\n step: PlanStep;\n done: boolean;\n skipped: boolean;\n}\n\nexport function PlanReviseEditor({\n steps,\n completedStepIds,\n onAccept,\n onCancel,\n}: PlanReviseEditorProps): React.ReactElement {\n const [rows, setRows] = useState<RowState[]>(() =>\n steps.map((s) => ({ step: s, done: completedStepIds?.has(s.id) ?? false, skipped: false })),\n );\n const firstEditableIndex = rows.findIndex((r) => !r.done);\n const [focus, setFocus] = useState<number>(firstEditableIndex < 0 ? 0 : firstEditableIndex);\n\n useKeystroke((ev) => {\n if (ev.paste) return;\n if (ev.escape) {\n onCancel();\n return;\n }\n if (ev.return) {\n const revised = rows.map((r) => r.step);\n const skippedIds = rows.filter((r) => r.skipped).map((r) => r.step.id);\n onAccept(revised, skippedIds);\n return;\n }\n if (ev.upArrow) {\n setFocus((f) => Math.max(0, f - 1));\n return;\n }\n if (ev.downArrow) {\n setFocus((f) => Math.min(rows.length - 1, f + 1));\n return;\n }\n const ch = ev.input;\n if (ch === \" \") {\n setRows((prev) => {\n const next = [...prev];\n const cur = next[focus];\n if (!cur || cur.done) return prev;\n next[focus] = { ...cur, skipped: !cur.skipped };\n return next;\n });\n return;\n }\n if (ch === \"k\") {\n // Move focused row up; swap with predecessor (if both editable).\n setRows((prev) => {\n if (focus <= 0) return prev;\n const a = prev[focus - 1];\n const b = prev[focus];\n if (!a || !b || a.done || b.done) return prev;\n const next = [...prev];\n next[focus - 1] = b;\n next[focus] = a;\n return next;\n });\n setFocus((f) => Math.max(0, f - 1));\n return;\n }\n if (ch === \"j\") {\n setRows((prev) => {\n if (focus >= prev.length - 1) return prev;\n const a = prev[focus];\n const b = prev[focus + 1];\n if (!a || !b || a.done || b.done) return prev;\n const next = [...prev];\n next[focus] = b;\n next[focus + 1] = a;\n return next;\n });\n setFocus((f) => Math.min(rows.length - 1, f + 1));\n return;\n }\n });\n\n return (\n <ApprovalCard\n tone=\"accent\"\n glyph=\"✎\"\n title=\"Revise plan\"\n metaRight={`${rows.length} steps`}\n footerHint=\"↑↓ focus · space toggle skip · k/j move · ⏎ accept · esc cancel\"\n >\n {rows.map((r, i) => (\n <ReviseRow key={r.step.id} row={r} index={i} focused={i === focus} />\n ))}\n </ApprovalCard>\n );\n}\n\nfunction ReviseRow({\n row,\n index,\n focused,\n}: {\n row: RowState;\n index: number;\n focused: boolean;\n}): React.ReactElement {\n const marker = row.done ? \"[✓]\" : row.skipped ? \"[s]\" : focused ? \"[ ]\" : \"[ ]\";\n const markerColor = row.done ? TONE.ok : row.skipped ? FG.faint : focused ? TONE.brand : FG.faint;\n const titleColor = row.done ? FG.sub : row.skipped ? FG.faint : focused ? FG.strong : FG.sub;\n const focusGlyph = focused ? <Text color={TONE.brand}>{\"▸ \"}</Text> : <Text>{\" \"}</Text>;\n return (\n <Box>\n {focusGlyph}\n <Text color={markerColor}>{marker}</Text>\n <Text color={titleColor} bold={focused} italic={row.skipped} strikethrough={row.skipped}>\n {` ${index + 1}. ${row.step.title}`}\n </Text>\n {row.skipped ? <Text color={TONE.warn}>{\" ← skipped\"}</Text> : null}\n </Box>\n );\n}\n","import { Box, Text, useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React as a runtime value (classic transform compiles JSX to React.createElement)\nimport React, { useRef, useState } from \"react\";\nimport { useKeystroke } from \"./keystroke-context.js\";\nimport { useReserveRows } from \"./layout/viewport-budget.js\";\nimport { type MultilineKey, lineAndColumn, processMultilineKey } from \"./multiline-keys.js\";\nimport {\n PASTE_SENTINEL_RANGE,\n type PasteEntry,\n decodePasteSentinel,\n encodePasteSentinel,\n expandPasteSentinels,\n formatBytesShort,\n listPasteIdsInBuffer,\n makePasteEntry,\n} from \"./paste-sentinels.js\";\nimport { type Segment, buildViewport, stringCells } from \"./prompt-viewport.js\";\nimport { FG, SURFACE, TONE } from \"./theme/tokens.js\";\n\n/** Raw-stdin keystroke bus → multiline reducer; one logical line per Box row, viewport-clipped. */\n\n/** Pastes shorter than this AND single-line render verbatim; longer ones become a `[paste #N · …]` sentinel chip (#397). */\nexport const INLINE_PASTE_THRESHOLD = 200;\n\nexport function shouldInlinePaste(content: string): boolean {\n return !content.includes(\"\\n\") && content.length <= INLINE_PASTE_THRESHOLD;\n}\n\nexport interface PromptInputProps {\n value: string;\n onChange: (v: string) => void;\n onSubmit: (v: string) => void;\n disabled?: boolean;\n placeholder?: string;\n /** ↑/↓ on an empty buffer or Ctrl+P / Ctrl+N — parent walks history and swaps `value` via `onChange`. */\n onHistoryPrev?: () => void;\n onHistoryNext?: () => void;\n}\n\nexport function PromptInput({\n value,\n onChange,\n onSubmit,\n disabled,\n placeholder,\n onHistoryPrev,\n onHistoryNext,\n}: PromptInputProps) {\n // Cap at 24 — collapseLinesForDisplay hides content past ~20 logical lines.\n // Quantize spec.max to 4-row buckets so per-keystroke line-count changes\n // don't churn viewport-budget; without this every single character that\n // adds/removes a newline re-dispatches the allocator and reflows layout.\n const inputLineCount = value.length > 0 ? value.split(\"\\n\").length : 1;\n const reserveMax = Math.min(Math.ceil(inputLineCount / 4) * 4 + 3, 24);\n useReserveRows(\"input\", { min: 1, max: reserveMax });\n\n const [cursor, setCursor] = useState(value.length);\n\n // Paste registry — keyed by sentinel id, holds original content.\n const pastesRef = useRef<Map<number, PasteEntry>>(new Map());\n const nextPasteIdRef = useRef<number>(0);\n\n // Refs (not props/state) — multiple keystrokes in one stdin chunk dispatch\n // before re-render, so the handler must read the latest value/cursor.\n const lastLocalValueRef = useRef(value);\n const cursorRef = useRef(cursor);\n cursorRef.current = cursor;\n if (value !== lastLocalValueRef.current) {\n lastLocalValueRef.current = value;\n if (cursor !== value.length) {\n cursorRef.current = value.length;\n setCursor(value.length);\n }\n }\n\n const registerPaste = (content: string) => {\n const v = lastLocalValueRef.current;\n const c = cursorRef.current;\n const insertion = shouldInlinePaste(content)\n ? content\n : (() => {\n const id = nextPasteIdRef.current % PASTE_SENTINEL_RANGE;\n nextPasteIdRef.current = id + 1;\n pastesRef.current.set(id, makePasteEntry(id, content));\n return encodePasteSentinel(id);\n })();\n const next = v.slice(0, c) + insertion + v.slice(c);\n lastLocalValueRef.current = next;\n cursorRef.current = c + insertion.length;\n onChange(next);\n setCursor(c + insertion.length);\n };\n\n useKeystroke((ev) => {\n if (disabled) return;\n if (ev.paste) {\n // Bracketed-paste content delivered by the stdin reader.\n if (ev.input.length > 0) registerPaste(ev.input);\n return;\n }\n const key: MultilineKey = {\n input: ev.input,\n return: ev.return,\n shift: ev.shift,\n ctrl: ev.ctrl,\n meta: ev.meta,\n backspace: ev.backspace,\n delete: ev.delete,\n tab: ev.tab,\n upArrow: ev.upArrow,\n downArrow: ev.downArrow,\n leftArrow: ev.leftArrow,\n rightArrow: ev.rightArrow,\n escape: ev.escape,\n pageUp: ev.pageUp,\n pageDown: ev.pageDown,\n home: ev.home,\n end: ev.end,\n };\n const action = processMultilineKey(lastLocalValueRef.current, cursorRef.current, key);\n if (action.pasteRequest) {\n registerPaste(action.pasteRequest.content);\n return;\n }\n if (action.next !== null) {\n lastLocalValueRef.current = action.next;\n onChange(action.next);\n }\n if (action.cursor !== null) {\n cursorRef.current = action.cursor;\n setCursor(action.cursor);\n }\n if (action.submit) {\n const raw = action.submitValue ?? lastLocalValueRef.current;\n const expanded = expandPasteSentinels(raw, pastesRef.current);\n const reachable = new Set(listPasteIdsInBuffer(raw));\n for (const id of pastesRef.current.keys()) {\n if (!reachable.has(id)) pastesRef.current.delete(id);\n }\n onSubmit(expanded);\n }\n if (action.historyHandoff === \"prev\") onHistoryPrev?.();\n if (action.historyHandoff === \"next\") onHistoryNext?.();\n }, !disabled);\n\n // ── Render ──────────────────────────────────────────────────────\n\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const promptPrefix = \"› \";\n const continuationIndent = \" \";\n const prefixCells = promptPrefix.length;\n const visibleCells = Math.max(8, cols - prefixCells - 3);\n\n // Hint avoids literal `/` and `@` glyphs — they render in the same row as\n // a just-cleared buffer and read as residual typed input on dim-poor terminals.\n const effectivePlaceholder = disabled\n ? (placeholder ?? \"…waiting for response…\")\n : (placeholder ?? \"ask anything · slash for commands · at-sign for files\");\n\n const lines = value.length > 0 ? value.split(\"\\n\") : [\"\"];\n const accentColor = disabled ? FG.faint : TONE.brand;\n const cursorVisible = true;\n const { line: cursorLine, col: cursorCol } = lineAndColumn(value, cursor);\n\n const renderItems = collapseLinesForDisplay(lines, cursorLine);\n const showHugeBufferHints = lines.length > 20;\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n {(() => {\n const rows: React.ReactNode[] = [];\n let firstRowEmitted = false;\n for (let renderIdx = 0; renderIdx < renderItems.length; renderIdx++) {\n const item = renderItems[renderIdx]!;\n if (item.kind === \"skip\") {\n rows.push(\n <Box key={`skip-${renderIdx}`}>\n <Text color={FG.faint}>{continuationIndent}</Text>\n <Text color={FG.faint}>\n {`[… ${item.linesHidden} line${item.linesHidden === 1 ? \"\" : \"s\"} hidden — full content kept, submitted on Enter …]`}\n </Text>\n </Box>,\n );\n continue;\n }\n const i = item.originalIndex;\n const line = item.line;\n const isCursorLine = i === cursorLine;\n const showPlaceholder = i === 0 && value.length === 0;\n if (showPlaceholder) {\n rows.push(\n <PromptLine\n key={`ln-${i}-text-0`}\n line=\"\"\n isFirst={true}\n isCursorLine={isCursorLine && !disabled}\n cursorCol={isCursorLine ? cursorCol : null}\n cursorVisible={cursorVisible}\n showPlaceholder\n placeholderText={effectivePlaceholder}\n promptPrefix={promptPrefix}\n continuationIndent={continuationIndent}\n visibleCells={visibleCells}\n accentColor={accentColor}\n pastes={pastesRef.current}\n disabled={disabled === true}\n />,\n );\n firstRowEmitted = true;\n continue;\n }\n const segs = splitLineByPastes(line);\n for (let segIdx = 0; segIdx < segs.length; segIdx++) {\n const seg = segs[segIdx]!;\n const isFirst = !firstRowEmitted;\n firstRowEmitted = true;\n if (seg.kind === \"paste\") {\n const cursorOnIt =\n isCursorLine && cursorCol >= seg.startOffset && cursorCol <= seg.startOffset + 1;\n rows.push(\n <PasteChipRow\n key={`ln-${i}-paste-${segIdx}`}\n entry={pastesRef.current.get(seg.id)}\n pasteId={seg.id}\n isFirst={isFirst}\n active={cursorOnIt && !disabled}\n visibleCells={visibleCells}\n accentColor={accentColor}\n />,\n );\n continue;\n }\n const segHasCursor =\n isCursorLine &&\n cursorCol >= seg.startOffset &&\n cursorCol <= seg.startOffset + seg.text.length;\n rows.push(\n <PromptLine\n key={`ln-${i}-text-${segIdx}`}\n line={seg.text}\n isFirst={isFirst}\n isCursorLine={segHasCursor && !disabled}\n cursorCol={segHasCursor ? cursorCol - seg.startOffset : null}\n cursorVisible={cursorVisible}\n showPlaceholder={false}\n placeholderText=\"\"\n promptPrefix={promptPrefix}\n continuationIndent={continuationIndent}\n visibleCells={visibleCells}\n accentColor={accentColor}\n pastes={pastesRef.current}\n disabled={disabled === true}\n />,\n );\n }\n if (segs.length === 0) {\n const isFirst = !firstRowEmitted;\n firstRowEmitted = true;\n rows.push(\n <PromptLine\n key={`ln-${i}-empty`}\n line=\"\"\n isFirst={isFirst}\n isCursorLine={isCursorLine && !disabled}\n cursorCol={isCursorLine ? 0 : null}\n cursorVisible={cursorVisible}\n showPlaceholder={false}\n placeholderText=\"\"\n promptPrefix={promptPrefix}\n continuationIndent={continuationIndent}\n visibleCells={visibleCells}\n accentColor={accentColor}\n pastes={pastesRef.current}\n disabled={disabled === true}\n />,\n );\n }\n }\n return rows;\n })()}\n {showHugeBufferHints && !disabled ? (\n <Box>\n <Text color={FG.faint}>\n {` [${lines.length} lines · PgUp/PgDn jump · Ctrl+U clear · Ctrl+W del word]`}\n </Text>\n </Box>\n ) : null}\n {!disabled ? (\n <Box marginTop={1}>\n <HintRow />\n </Box>\n ) : (\n <Box marginTop={1}>\n <Text color={FG.faint}>{\" esc to stop\"}</Text>\n </Box>\n )}\n </Box>\n );\n}\n\nfunction HintRow(): React.ReactElement {\n const items: Array<{ key: string; sep: string }> = [\n { key: \"⏎\", sep: \"send\" },\n { key: \"⇧⏎\", sep: \"newline\" },\n { key: \"↑↓\", sep: \"history\" },\n { key: \"esc\", sep: \"abort\" },\n { key: \"^C\", sep: \"quit\" },\n ];\n return (\n <Box flexDirection=\"row\">\n <Text>{\" \"}</Text>\n {items.map((item, i) => (\n <React.Fragment key={item.key}>\n {i > 0 && <Text color={FG.faint}>{\" · \"}</Text>}\n <Text color={FG.meta}>{item.key}</Text>\n <Text color={FG.faint}>{` ${item.sep}`}</Text>\n </React.Fragment>\n ))}\n </Box>\n );\n}\n\ntype LineSegment =\n | { kind: \"text\"; text: string; startOffset: number }\n | { kind: \"paste\"; id: number; startOffset: number };\n\nfunction splitLineByPastes(line: string): LineSegment[] {\n const out: LineSegment[] = [];\n let textBuf = \"\";\n let textStart = 0;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]!;\n const id = decodePasteSentinel(ch);\n if (id === null) {\n if (textBuf === \"\") textStart = i;\n textBuf += ch;\n continue;\n }\n if (textBuf !== \"\") {\n out.push({ kind: \"text\", text: textBuf, startOffset: textStart });\n textBuf = \"\";\n }\n out.push({ kind: \"paste\", id, startOffset: i });\n }\n if (textBuf !== \"\") out.push({ kind: \"text\", text: textBuf, startOffset: textStart });\n return out;\n}\n\ninterface PasteChipRowProps {\n entry: PasteEntry | undefined;\n pasteId: number;\n isFirst: boolean;\n active: boolean;\n visibleCells: number;\n accentColor: string;\n}\n\nfunction PasteChipRow({\n entry,\n pasteId,\n isFirst,\n active,\n visibleCells,\n accentColor,\n}: PasteChipRowProps): React.ReactElement {\n const promptPrefix = \"› \";\n const continuationIndent = \" \";\n const lead = isFirst ? promptPrefix : continuationIndent;\n const leadColor = isFirst ? accentColor : FG.faint;\n const labelText = formatChipLabel(entry, pasteId, visibleCells - 6);\n if (active) {\n return (\n <Box>\n <Text bold color={leadColor}>\n {lead}\n </Text>\n <Text bold color={accentColor}>\n {\"▸ \"}\n </Text>\n <Text bold color=\"black\" backgroundColor={accentColor}>\n {` ${labelText} `}\n </Text>\n </Box>\n );\n }\n return (\n <Box>\n <Text bold color={leadColor}>\n {lead}\n </Text>\n <Text color={FG.faint}>{\" \"}</Text>\n <Text color={FG.meta}>{\"┌ \"}</Text>\n <Text color={FG.body} backgroundColor={SURFACE.bgElev}>\n {`${labelText} `}\n </Text>\n <Text color={FG.meta}>{\" ┐\"}</Text>\n </Box>\n );\n}\n\nfunction formatChipLabel(entry: PasteEntry | undefined, pasteId: number, budget: number): string {\n if (!entry) return `📋 paste #${pasteId + 1} · (missing)`;\n const lines = `${entry.lineCount} line${entry.lineCount === 1 ? \"\" : \"s\"}`;\n const bytes = formatBytesShort(entry.charCount);\n const kind = sniffChipKind(entry.content);\n const full = `📋 pasted ${lines} · ${bytes} · ${kind} ^O expand · ⌫ remove`;\n if (full.length <= Math.max(40, budget)) return full;\n const compact = `📋 pasted ${lines} · ${bytes} · ${kind}`;\n if (compact.length <= Math.max(30, budget)) return compact;\n return `📋 pasted ${lines} · ${bytes}`;\n}\n\nfunction sniffChipKind(content: string): string {\n const head = content.slice(0, 1024);\n if (/^\\s*[{[]/.test(head)) {\n try {\n JSON.parse(head);\n return \"json\";\n } catch {\n /* not parseable; fall through */\n }\n }\n if (/\\n\\s+at\\s+\\S+\\s*\\(/.test(head)) return \"stacktrace\";\n if (/^(diff --git|@@ )/m.test(head)) return \"diff\";\n if (/^\\s*<!doctype|^\\s*<html/i.test(head)) return \"html\";\n if (/^\\s*\\$\\s+\\w/.test(head) || /\\n\\s*\\$\\s+\\w/.test(head)) return \"shell\";\n return \"text\";\n}\n\n// ── PromptLine ────────────────────────────────────────────────────\n\ninterface PromptLineProps {\n line: string;\n isFirst: boolean;\n isCursorLine: boolean;\n cursorCol: number | null;\n cursorVisible: boolean;\n showPlaceholder: boolean;\n placeholderText: string;\n promptPrefix: string;\n continuationIndent: string;\n visibleCells: number;\n accentColor: string;\n pastes: ReadonlyMap<number, PasteEntry>;\n disabled: boolean;\n}\n\nfunction PromptLine({\n line,\n isFirst,\n isCursorLine,\n cursorCol,\n cursorVisible,\n showPlaceholder,\n placeholderText,\n promptPrefix,\n continuationIndent,\n visibleCells,\n accentColor,\n pastes,\n disabled,\n}: PromptLineProps) {\n if (showPlaceholder) {\n return (\n <Box>\n <Text bold color={accentColor}>\n {promptPrefix}\n </Text>\n {!disabled ? <Text color={accentColor}>{cursorVisible ? \"▌\" : \" \"}</Text> : null}\n <Text color={FG.faint}>{placeholderText}</Text>\n </Box>\n );\n }\n\n const viewport = buildViewport(line, isCursorLine ? cursorCol : null, visibleCells, pastes);\n\n return (\n <Box>\n {isFirst ? (\n <Text bold color={accentColor}>\n {promptPrefix}\n </Text>\n ) : (\n <Text color={FG.faint}>{continuationIndent}</Text>\n )}\n {viewport.hiddenLeft ? <Text color={FG.faint}>{\"‹\"}</Text> : null}\n <ViewportContent\n segments={viewport.segments}\n cursorCell={isCursorLine ? viewport.cursorCell : null}\n accentColor={accentColor}\n cursorVisible={cursorVisible}\n />\n {viewport.hiddenRight ? <Text color={FG.faint}>{\"›\"}</Text> : null}\n </Box>\n );\n}\n\n// ── ViewportContent ────────────────────────────────────────────────\n\n/** Cursor splits at most one segment; trailing block when past the last cell. */\nfunction ViewportContent({\n segments,\n cursorCell,\n accentColor,\n cursorVisible,\n}: {\n segments: Segment[];\n cursorCell: number | null;\n accentColor: string;\n cursorVisible: boolean;\n}) {\n // No cursor on this line — straight render.\n if (cursorCell === null) {\n return <>{segments.map((seg, i) => renderSegment(seg, i, false))}</>;\n }\n\n const out: React.ReactNode[] = [];\n let cells = 0;\n let placed = false;\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i]!;\n const segCells = segmentCells(seg);\n if (placed) {\n out.push(renderSegment(seg, i, false));\n continue;\n }\n if (cursorCell >= cells + segCells) {\n out.push(renderSegment(seg, i, false));\n cells += segCells;\n continue;\n }\n if (seg.kind === \"paste\") {\n out.push(\n <Text\n key={`p-${i}-cursor`}\n color={FG.body}\n backgroundColor={SURFACE.bgElev}\n inverse={cursorVisible}\n >\n {seg.label}\n </Text>,\n );\n placed = true;\n cells += segCells;\n continue;\n }\n const offsetIntoSeg = cursorCell - cells;\n const split = splitTextByCells(seg.text, offsetIntoSeg);\n if (split.before.length > 0) {\n out.push(<Text key={`t-${i}-b`}>{split.before}</Text>);\n }\n if (split.atCursor.length > 0) {\n out.push(\n <Text key={`t-${i}-c`} inverse={cursorVisible} color={accentColor}>\n {split.atCursor}\n </Text>,\n );\n } else {\n out.push(\n <Text key={`t-${i}-c-eol`} color={accentColor}>\n {cursorVisible ? \"▌\" : \" \"}\n </Text>,\n );\n }\n if (split.after.length > 0) {\n out.push(<Text key={`t-${i}-a`}>{split.after}</Text>);\n }\n placed = true;\n cells += segCells;\n }\n\n if (!placed) {\n out.push(\n <Text key=\"cursor-eol\" color={accentColor}>\n {cursorVisible ? \"▌\" : \" \"}\n </Text>,\n );\n }\n\n return <>{out}</>;\n}\n\nfunction segmentCells(seg: Segment): number {\n if (seg.kind === \"paste\") return seg.label.length;\n return stringCells(seg.text);\n}\n\n/** Wide char straddling the offset is treated as the cursor's char. */\nfunction splitTextByCells(\n text: string,\n cellOffset: number,\n): { before: string; atCursor: string; after: string } {\n let cells = 0;\n for (let i = 0; i < text.length; i++) {\n const ch = text[i]!;\n const cw = charCellsForText(ch);\n if (cells === cellOffset) {\n return { before: text.slice(0, i), atCursor: ch, after: text.slice(i + 1) };\n }\n if (cells + cw > cellOffset) {\n return { before: text.slice(0, i), atCursor: ch, after: text.slice(i + 1) };\n }\n cells += cw;\n }\n return { before: text, atCursor: \"\", after: \"\" };\n}\n\n/** Inlined cell counter — hot per-keystroke; keep in sync with prompt-viewport. */\nfunction charCellsForText(ch: string): number {\n const code = ch.charCodeAt(0);\n if (code < 0x20 || code === 0x7f) return 0;\n if (code < 0x1100) return 1;\n if (code >= 0x1100 && code <= 0x115f) return 2;\n if (code >= 0x2e80 && code <= 0x303e) return 2;\n if (code >= 0x3041 && code <= 0x33ff) return 2;\n if (code >= 0x3400 && code <= 0x4dbf) return 2;\n if (code >= 0x4e00 && code <= 0x9fff) return 2;\n if (code >= 0xa000 && code <= 0xa4cf) return 2;\n if (code >= 0xac00 && code <= 0xd7a3) return 2;\n if (code >= 0xf900 && code <= 0xfaff) return 2;\n if (code >= 0xfe30 && code <= 0xfe4f) return 2;\n if (code >= 0xff00 && code <= 0xff60) return 2;\n if (code >= 0xffe0 && code <= 0xffe6) return 2;\n return 1;\n}\n\nfunction renderSegment(seg: Segment, key: number, _inverse: boolean): React.ReactNode {\n if (seg.kind === \"text\") {\n return <Text key={`s-${key}`}>{seg.text}</Text>;\n }\n return (\n <Text key={`s-${key}`} backgroundColor={SURFACE.bgElev} color={FG.body}>\n {seg.label}\n </Text>\n );\n}\n\n// ── collapse helper (preserved from v1) ────────────────────────────\n\ntype RenderItem =\n | { kind: \"line\"; line: string; originalIndex: number }\n | { kind: \"skip\"; linesHidden: number };\n\nconst COLLAPSE_THRESHOLD = 20;\nconst COLLAPSE_HEAD_LINES = 3;\nconst COLLAPSE_TAIL_LINES = 2;\n\nexport function collapseLinesForDisplay(lines: string[], cursorLine: number): RenderItem[] {\n if (lines.length <= COLLAPSE_THRESHOLD) {\n return lines.map((line, i) => ({ kind: \"line\" as const, line, originalIndex: i }));\n }\n const keep = new Set<number>();\n for (let i = 0; i < COLLAPSE_HEAD_LINES && i < lines.length; i++) keep.add(i);\n for (let i = Math.max(0, lines.length - COLLAPSE_TAIL_LINES); i < lines.length; i++) keep.add(i);\n if (cursorLine >= 0 && cursorLine < lines.length) keep.add(cursorLine);\n const sorted = [...keep].sort((a, b) => a - b);\n const out: RenderItem[] = [];\n let prev = -1;\n for (const idx of sorted) {\n if (idx - prev > 1) {\n out.push({ kind: \"skip\", linesHidden: idx - prev - 1 });\n }\n out.push({ kind: \"line\", line: lines[idx] ?? \"\", originalIndex: idx });\n prev = idx;\n }\n return out;\n}\n","/** CSI tail recovery for Ink useInput — Windows ConPTY splits `\\x1b[A` across reads; we re-merge. */\n/** Only rewrites when no structured key flag is set AND input matches a known tail exactly. */\n\n/** Structured-flag subset of Ink's Key — optional across Ink versions. */\nexport interface CsiKeyFlags {\n upArrow?: boolean;\n downArrow?: boolean;\n leftArrow?: boolean;\n rightArrow?: boolean;\n pageUp?: boolean;\n pageDown?: boolean;\n delete?: boolean;\n shift?: boolean;\n tab?: boolean;\n}\n\n/** Bracketed-paste `[200~`/`[201~` excluded — handled by PromptInput's paste accumulator. */\nconst CSI_TAIL_TO_FLAGS: ReadonlyArray<{ tail: string; flags: CsiKeyFlags }> = [\n // Arrow keys — the most common ConPTY victim.\n { tail: \"[A\", flags: { upArrow: true } },\n { tail: \"[B\", flags: { downArrow: true } },\n { tail: \"[C\", flags: { rightArrow: true } },\n { tail: \"[D\", flags: { leftArrow: true } },\n // Page navigation.\n { tail: \"[5~\", flags: { pageUp: true } },\n { tail: \"[6~\", flags: { pageDown: true } },\n // Forward-delete (the key labelled Delete on most keyboards).\n { tail: \"[3~\", flags: { delete: true } },\n // Shift+Tab — terminal sends `\\x1b[Z` rather than tab-with-shift.\n // `[1;2Z` is the modifier-encoded variant some Windows PowerShell\n // hosts emit; `[27;2;9~` and `[9;2u` cover modifyOtherKeys / Kitty\n // forms. Issue #373.\n { tail: \"[Z\", flags: { shift: true, tab: true } },\n { tail: \"[1;2Z\", flags: { shift: true, tab: true } },\n { tail: \"[27;2;9~\", flags: { shift: true, tab: true } },\n { tail: \"[9;2u\", flags: { shift: true, tab: true } },\n];\n\nfunction alreadyStructured(flags: CsiKeyFlags): boolean {\n return Boolean(\n flags.upArrow ||\n flags.downArrow ||\n flags.leftArrow ||\n flags.rightArrow ||\n flags.pageUp ||\n flags.pageDown ||\n flags.delete ||\n (flags.tab && flags.shift),\n );\n}\n\n/** Already-structured events short-circuit so a real arrow press isn't rewritten. */\nexport function recoverCsiTail(input: string, existing: CsiKeyFlags = {}): CsiKeyFlags | null {\n if (alreadyStructured(existing)) return null;\n for (const entry of CSI_TAIL_TO_FLAGS) {\n if (input === entry.tail || input === `\\x1b${entry.tail}`) {\n return entry.flags;\n }\n }\n return null;\n}\n\n/** Includes paste `[200~`/`[201~` for the case where their markers chunked across reads. */\nexport const STRIPPABLE_CSI_FRAGMENTS: readonly string[] = [\n \"\\u001b[200~\",\n \"\\u001b[201~\",\n \"[200~\",\n \"[201~\",\n ...CSI_TAIL_TO_FLAGS.flatMap((e) => [`\\u001b${e.tail}`, e.tail]),\n];\n\n/** Remove every recognised CSI fragment from a string. */\nexport function stripCsiFragments(input: string): string {\n let out = input;\n for (const frag of STRIPPABLE_CSI_FRAGMENTS) {\n if (out.includes(frag)) out = out.replaceAll(frag, \"\");\n }\n return out;\n}\n","/** Pure keystroke→action reducer; arrow keys at buffer boundary defer to the parent for history recall. */\n\nexport interface MultilineKey {\n input: string;\n return?: boolean;\n shift?: boolean;\n ctrl?: boolean;\n meta?: boolean;\n backspace?: boolean;\n delete?: boolean;\n tab?: boolean;\n upArrow?: boolean;\n downArrow?: boolean;\n leftArrow?: boolean;\n rightArrow?: boolean;\n escape?: boolean;\n pageUp?: boolean;\n pageDown?: boolean;\n home?: boolean;\n end?: boolean;\n}\n\nexport interface MultilineAction {\n /** New buffer value. `null` = unchanged. */\n next: string | null;\n /** New cursor position (0..value.length). `null` = unchanged. */\n cursor: number | null;\n /** When `true`, fire `onSubmit(submitValue ?? value)`. */\n submit: boolean;\n submitValue?: string;\n /** Set on ↑/↓ at a buffer boundary or Ctrl+P / Ctrl+N — parent recalls prompt history. */\n historyHandoff?: \"prev\" | \"next\";\n /** Reducer is pure — hands raw paste to PromptInput which allocates a sentinel and inserts that. */\n pasteRequest?: { content: string };\n}\n\nimport { recoverCsiTail, stripCsiFragments } from \"./key-normalize.js\";\n\nconst BACKSLASH_SUFFIX = /\\\\$/;\n\nconst NOOP: MultilineAction = { next: null, cursor: null, submit: false };\n\nexport function processMultilineKey(\n value: string,\n cursor: number,\n keyIn: MultilineKey,\n): MultilineAction {\n // CSI recovery — bare `[A` / `[C` / `[Z` / `[5~` / etc. that\n // Windows ConPTY leaves in `input` after parse-keypress eats the\n // leading `\\x1b`. See key-normalize.ts for the long version.\n const recovered = recoverCsiTail(keyIn.input, keyIn);\n const key: MultilineKey = recovered ? { ...keyIn, ...recovered, input: \"\" } : keyIn;\n\n // Parent-owned keys: Tab (slash-complete), Esc (abort).\n if (key.tab || key.escape) {\n return NOOP;\n }\n\n // Buffer-wide navigation. Per-line motion (↑/↓ / Ctrl+A / Ctrl+E)\n // is already covered; PageUp/PageDown are the missing \"jump to\n // top / bottom of the WHOLE buffer\" pair, useful after pasting a\n // 500-line blob where ↑×500 is absurd. Repurposed from the\n // previous NOOP behavior (PageUp/Down had no binding).\n if (key.pageUp) {\n return cursor === 0 ? NOOP : { next: null, cursor: 0, submit: false };\n }\n if (key.pageDown) {\n return cursor === value.length ? NOOP : { next: null, cursor: value.length, submit: false };\n }\n\n // ↑/↓ on an empty buffer recalls prompt history (universal CLI\n // convention — bash, zsh, fish all do this). Ctrl+P / Ctrl+N is the\n // wheel-immune fallback for Windows ConPTY users whose terminal\n // translates mouse-wheel events to arrow keys; bind it on every\n // platform so the muscle memory works the same everywhere.\n if (key.ctrl && key.input === \"p\") {\n return { ...NOOP, historyHandoff: \"prev\" };\n }\n if (key.ctrl && key.input === \"n\") {\n return { ...NOOP, historyHandoff: \"next\" };\n }\n\n if (key.leftArrow) {\n return { next: null, cursor: Math.max(0, cursor - 1), submit: false };\n }\n if (key.rightArrow) {\n return { next: null, cursor: Math.min(value.length, cursor + 1), submit: false };\n }\n if (key.upArrow) {\n if (value.length === 0) return { ...NOOP, historyHandoff: \"prev\" };\n const moved = moveCursorUp(value, cursor);\n return moved === cursor ? NOOP : { next: null, cursor: moved, submit: false };\n }\n if (key.downArrow) {\n if (value.length === 0) return { ...NOOP, historyHandoff: \"next\" };\n const moved = moveCursorDown(value, cursor);\n return moved === cursor ? NOOP : { next: null, cursor: moved, submit: false };\n }\n\n // Emacs-style line jumps. Home/End come through our own stdin reader\n // (see stdin-reader.ts CSI_TAIL_MAP); Ctrl+A/E stay as universal aliases.\n if ((key.ctrl && key.input === \"a\") || key.home) {\n return { next: null, cursor: startOfLine(value, cursor), submit: false };\n }\n if ((key.ctrl && key.input === \"e\") || key.end) {\n return { next: null, cursor: endOfLine(value, cursor), submit: false };\n }\n // Bash / readline conventions:\n // Ctrl+U — clear the whole buffer (readline treats this as\n // \"clear from cursor to start\"; for our text-area we treat it\n // as \"clear all\" because there's no ergonomic way to clear a\n // huge paste otherwise).\n // Ctrl+K — kill from cursor to end of current line.\n // Ctrl+W / Alt+Backspace — delete the word before the cursor.\n // Alt+B / Alt+F — jump cursor backward / forward by one word.\n if (key.ctrl && key.input === \"u\") {\n return value.length === 0 ? NOOP : { next: \"\", cursor: 0, submit: false };\n }\n if (key.ctrl && key.input === \"k\") {\n const lineEnd = endOfLine(value, cursor);\n if (lineEnd === cursor) return NOOP;\n return {\n next: value.slice(0, cursor) + value.slice(lineEnd),\n cursor,\n submit: false,\n };\n }\n if (\n (key.ctrl && key.input === \"w\") ||\n (key.meta && (key.backspace || key.input === \"\\x7f\" || key.input === \"\\b\"))\n ) {\n if (cursor === 0) return NOOP;\n const wordStart = previousWordStart(value, cursor);\n return {\n next: value.slice(0, wordStart) + value.slice(cursor),\n cursor: wordStart,\n submit: false,\n };\n }\n if (key.meta && key.input === \"b\") {\n const target = previousWordStart(value, cursor);\n return target === cursor ? NOOP : { next: null, cursor: target, submit: false };\n }\n if (key.meta && key.input === \"f\") {\n const target = nextWordEnd(value, cursor);\n return target === cursor ? NOOP : { next: null, cursor: target, submit: false };\n }\n\n // Paste-burst detection. If `input` contains a newline (or\n // bracketed-paste markers from a terminal that supports them),\n // this is a paste — surface it as a `pasteRequest` so the parent\n // can register the blob and insert ONE sentinel codepoint instead\n // of the full content. The buffer stays small + readable; the\n // user sees `[paste #N · M lines]` where the paste lives.\n //\n // Always overrides `key.return` for pastes: Ink occasionally sets\n // key.return when a paste's trailing \\n looks like Enter, which\n // would submit the partial buffer mid-paste and silently truncate\n // the content. Pastes always insert; Enter only submits typed\n // content. We normalize \\r\\n and bare \\r to \\n so mixed-line-\n // ending pastes (Windows clipboard, web copy) land cleanly.\n // Strip every recognised CSI fragment (paste markers, arrow tails,\n // etc.) defensively — if any leaked past structured-key recovery\n // they shouldn't get inserted into the buffer as text.\n const stripped = stripCsiFragments(key.input);\n // Paste = newline-containing input with MORE than just the newline\n // itself. A bare \"\\n\" is Ctrl+J / one-keystroke newline (handled\n // below); only multi-char input wrapped around a newline is a real\n // paste burst that warrants a sentinel.\n const looksLikePaste =\n stripped.length > 1 && (stripped.includes(\"\\n\") || stripped.includes(\"\\r\"));\n if (looksLikePaste) {\n const normalized = stripped.replace(/\\r\\n?/g, \"\\n\");\n return {\n next: null,\n cursor: null,\n submit: false,\n pasteRequest: { content: normalized },\n };\n }\n // Single-char Ctrl+J / LF: insert one newline.\n if (key.input === \"\\n\" || (key.ctrl && key.input === \"j\")) {\n return insertAt(value, cursor, \"\\n\");\n }\n\n if (key.return) {\n if (key.shift || key.meta) return insertAt(value, cursor, \"\\n\");\n // Bash-style line continuation: trailing '\\' + Enter (only when the\n // cursor sits at end-of-buffer, so a stray '\\' mid-line doesn't\n // trigger it).\n if (cursor === value.length && BACKSLASH_SUFFIX.test(value)) {\n const replaced = `${value.slice(0, -1)}\\n`;\n return { next: replaced, cursor: replaced.length, submit: false };\n }\n return { next: null, cursor: null, submit: true, submitValue: value };\n }\n\n // Backspace = delete the char BEFORE the cursor. We also accept\n // `key.delete` and the raw DEL (0x7f) / BS (0x08) bytes as backspace\n // for the same purpose — some Windows terminals (cmd.exe, certain\n // winpty configs) report plain Backspace without setting\n // `key.backspace`, which used to leave the user typing into a prompt\n // where the Backspace key did nothing. Reasonix doesn't offer a\n // separate forward-delete operation, so collapsing them is safe.\n if (key.backspace || key.delete || key.input === \"\\x7f\" || key.input === \"\\b\") {\n if (cursor === 0) return NOOP;\n return {\n next: value.slice(0, cursor - 1) + value.slice(cursor),\n cursor: cursor - 1,\n submit: false,\n };\n }\n\n // Bare modifier events (Ctrl/Meta with no printable) and unhandled\n // Ctrl-<letter> chords are dropped so a stray Ctrl+L doesn't insert \"l\".\n if ((key.ctrl || key.meta) && key.input.length === 0) return NOOP;\n if (key.ctrl || key.meta) return NOOP;\n\n // Printable input (may be a multi-char paste; pasted newlines land\n // inside the buffer rather than triggering submit on the first line).\n if (key.input.length > 0) {\n return insertAt(value, cursor, key.input);\n }\n\n return NOOP;\n}\n\nfunction insertAt(value: string, cursor: number, insert: string): MultilineAction {\n return {\n next: value.slice(0, cursor) + insert + value.slice(cursor),\n cursor: cursor + insert.length,\n submit: false,\n };\n}\n\nexport function lineAndColumn(value: string, cursor: number): { line: number; col: number } {\n let line = 0;\n let col = 0;\n const n = Math.min(cursor, value.length);\n for (let i = 0; i < n; i++) {\n if (value[i] === \"\\n\") {\n line++;\n col = 0;\n } else {\n col++;\n }\n }\n return { line, col };\n}\n\nfunction startOfLine(value: string, cursor: number): number {\n return value.lastIndexOf(\"\\n\", cursor - 1) + 1;\n}\n\n/** Skips trailing whitespace first so Ctrl+W after a space still removes the previous word. */\nfunction previousWordStart(value: string, cursor: number): number {\n let i = cursor;\n while (i > 0 && /\\s/.test(value[i - 1] ?? \"\")) i--;\n while (i > 0 && !/\\s/.test(value[i - 1] ?? \"\")) i--;\n return i;\n}\n\n/** Symmetric to previousWordStart: skip leading whitespace, then run to next word boundary. */\nfunction nextWordEnd(value: string, cursor: number): number {\n let i = cursor;\n const n = value.length;\n while (i < n && /\\s/.test(value[i] ?? \"\")) i++;\n while (i < n && !/\\s/.test(value[i] ?? \"\")) i++;\n return i;\n}\n\nfunction endOfLine(value: string, cursor: number): number {\n const nl = value.indexOf(\"\\n\", cursor);\n return nl === -1 ? value.length : nl;\n}\n\nfunction moveCursorUp(value: string, cursor: number): number {\n const curStart = startOfLine(value, cursor);\n if (curStart === 0) return cursor; // already on the first line\n const col = cursor - curStart;\n const prevEnd = curStart - 1; // the '\\n' between the two lines\n const prevStart = value.lastIndexOf(\"\\n\", prevEnd - 1) + 1;\n const prevLen = prevEnd - prevStart;\n return prevStart + Math.min(col, prevLen);\n}\n\nfunction moveCursorDown(value: string, cursor: number): number {\n const nextNl = value.indexOf(\"\\n\", cursor);\n if (nextNl === -1) return cursor; // already on the last line\n const curStart = startOfLine(value, cursor);\n const col = cursor - curStart;\n const nextStart = nextNl + 1;\n const followingNl = value.indexOf(\"\\n\", nextStart);\n const nextLen = (followingNl === -1 ? value.length : followingNl) - nextStart;\n return nextStart + Math.min(col, nextLen);\n}\n","/** PUA range U+E100..U+E1FF (BMP, no surrogate pairs) so each sentinel is one codepoint and cursor arithmetic stays trivial. */\n\nexport const PASTE_SENTINEL_BASE = 0xe100;\nexport const PASTE_SENTINEL_RANGE = 256;\nexport const PASTE_SENTINEL_END = PASTE_SENTINEL_BASE + PASTE_SENTINEL_RANGE;\n\nexport interface PasteEntry {\n id: number;\n content: string;\n lineCount: number;\n charCount: number;\n}\n\nexport function encodePasteSentinel(id: number): string {\n if (id < 0 || id >= PASTE_SENTINEL_RANGE) {\n throw new Error(`paste sentinel id ${id} out of range [0, ${PASTE_SENTINEL_RANGE})`);\n }\n return String.fromCharCode(PASTE_SENTINEL_BASE + id);\n}\n\n/** Returns the paste id, or `null` if `ch` is not a sentinel codepoint. */\nexport function decodePasteSentinel(ch: string): number | null {\n if (ch.length === 0) return null;\n const cp = ch.charCodeAt(0);\n if (cp < PASTE_SENTINEL_BASE || cp >= PASTE_SENTINEL_END) return null;\n return cp - PASTE_SENTINEL_BASE;\n}\n\nexport function isPasteSentinel(ch: string): boolean {\n return decodePasteSentinel(ch) !== null;\n}\n\nexport function makePasteEntry(id: number, content: string): PasteEntry {\n return {\n id,\n content,\n lineCount: content.split(\"\\n\").length,\n charCount: content.length,\n };\n}\n\n/** Unknown sentinels drop to empty — never leak a PUA codepoint into the prompt. */\nexport function expandPasteSentinels(\n text: string,\n pastes: ReadonlyMap<number, PasteEntry>,\n): string {\n let out = \"\";\n for (let i = 0; i < text.length; i++) {\n const ch = text[i]!;\n const id = decodePasteSentinel(ch);\n if (id === null) {\n out += ch;\n continue;\n }\n const entry = pastes.get(id);\n out += entry?.content ?? \"\";\n }\n return out;\n}\n\nexport function bufferHasPaste(text: string): boolean {\n for (let i = 0; i < text.length; i++) {\n if (decodePasteSentinel(text[i]!) !== null) return true;\n }\n return false;\n}\n\nexport function listPasteIdsInBuffer(text: string): number[] {\n const ids: number[] = [];\n for (let i = 0; i < text.length; i++) {\n const id = decodePasteSentinel(text[i]!);\n if (id !== null) ids.push(id);\n }\n return ids;\n}\n\nexport function formatBytesShort(n: number): string {\n if (n < 1024) return `${n}B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(n < 1024 * 10 ? 1 : 0)}KB`;\n return `${(n / (1024 * 1024)).toFixed(1)}MB`;\n}\n","/** Slice each prompt line to a single visual row — Ink/Yoga wrap miscounts on CJK Windows terminals and leaks ghost rows. */\n\nimport { type PasteEntry, decodePasteSentinel, formatBytesShort } from \"./paste-sentinels.js\";\n\nexport type Segment = { kind: \"text\"; text: string } | { kind: \"paste\"; id: number; label: string };\n\nexport interface Viewport {\n /** Segments to render left-to-right. Sum of cells <= visibleCells. */\n segments: Segment[];\n /** `null` when cursor is not on this line. */\n cursorCell: number | null;\n /** True when content was clipped on the left side. */\n hiddenLeft: boolean;\n /** True when content was clipped on the right side. */\n hiddenRight: boolean;\n}\n\n/** Treats Ambiguous=1 to match Ink/Yoga's own miscount — agreement matters more than correctness here. */\nexport function charCells(ch: string): number {\n if (ch.length === 0) return 0;\n const code = ch.charCodeAt(0);\n if (code < 0x20 || code === 0x7f) return 0;\n if (code < 0x1100) return 1;\n // Hangul Jamo\n if (code >= 0x1100 && code <= 0x115f) return 2;\n // CJK Radicals, Kangxi Radicals, Ideographic Description, CJK Symbols\n if (code >= 0x2e80 && code <= 0x303e) return 2;\n // Hiragana, Katakana, Bopomofo, Hangul Compat Jamo, Kanbun\n if (code >= 0x3041 && code <= 0x33ff) return 2;\n // CJK Unified Ext A\n if (code >= 0x3400 && code <= 0x4dbf) return 2;\n // CJK Unified Ideographs\n if (code >= 0x4e00 && code <= 0x9fff) return 2;\n // Yi Syllables\n if (code >= 0xa000 && code <= 0xa4cf) return 2;\n // Hangul Syllables\n if (code >= 0xac00 && code <= 0xd7a3) return 2;\n // CJK Compatibility Ideographs\n if (code >= 0xf900 && code <= 0xfaff) return 2;\n // CJK Compatibility Forms\n if (code >= 0xfe30 && code <= 0xfe4f) return 2;\n // Halfwidth and Fullwidth Forms (fullwidth half is wide)\n if (code >= 0xff00 && code <= 0xff60) return 2;\n // Fullwidth signs\n if (code >= 0xffe0 && code <= 0xffe6) return 2;\n return 1;\n}\n\n/** Total cells of a string, with paste sentinels expanded to placeholder width. */\nexport function stringCells(s: string, pastes?: ReadonlyMap<number, PasteEntry>): number {\n let n = 0;\n for (let i = 0; i < s.length; i++) {\n const ch = s[i]!;\n const id = decodePasteSentinel(ch);\n if (id !== null) {\n n += pasteSentinelCells(id, pastes);\n } else {\n n += charCells(ch);\n }\n }\n return n;\n}\n\n/** Compact placeholder for cell-width arithmetic; the visible chip lives in PasteChipRow. */\nexport function pasteSentinelLabel(id: number, entry: PasteEntry | undefined): string {\n if (!entry) return `[paste #${id + 1} · (missing)]`;\n return `[paste #${id + 1} · ${entry.lineCount}l · ${formatBytesShort(entry.charCount)}]`;\n}\n\nfunction pasteSentinelCells(id: number, pastes?: ReadonlyMap<number, PasteEntry>): number {\n const entry = pastes?.get(id);\n return pasteSentinelLabel(id, entry).length;\n}\n\nexport function buildViewport(\n line: string,\n cursorCol: number | null,\n visibleCells: number,\n pastes?: ReadonlyMap<number, PasteEntry>,\n): Viewport {\n if (visibleCells <= 0) {\n return {\n segments: [],\n cursorCell: cursorCol === null ? null : 0,\n hiddenLeft: false,\n hiddenRight: line.length > 0,\n };\n }\n const totalCells = stringCells(line, pastes);\n\n // Fast path: whole line fits.\n if (totalCells <= visibleCells) {\n const segments = textToSegments(line, pastes);\n let cursorCell: number | null = null;\n if (cursorCol !== null) {\n cursorCell = stringCells(line.slice(0, cursorCol), pastes);\n }\n return { segments, cursorCell, hiddenLeft: false, hiddenRight: false };\n }\n\n // Static viewport (cursor not on this line) — clip from the right.\n if (cursorCol === null) {\n return clipFromLeft(line, visibleCells, pastes);\n }\n\n // Cursor-bearing line: slide a window so cursor stays visible.\n // Reserve 1 cell on each potentially-clipped side for the marker.\n return clipAroundCursor(line, cursorCol, visibleCells, pastes);\n}\n\nfunction clipFromLeft(\n line: string,\n visibleCells: number,\n pastes?: ReadonlyMap<number, PasteEntry>,\n): Viewport {\n // Show as much of the head as fits; mark the right edge as hidden.\n // Reserve 1 cell for the `›` marker.\n const budget = Math.max(1, visibleCells - 1);\n let used = 0;\n let end = 0;\n while (end < line.length) {\n const ch = line[end]!;\n const cw = charCellsAt(line, end, pastes);\n if (used + cw > budget) break;\n used += cw;\n end++;\n }\n const segments = textToSegments(line.slice(0, end), pastes);\n return { segments, cursorCell: null, hiddenLeft: false, hiddenRight: end < line.length };\n}\n\nfunction clipAroundCursor(\n line: string,\n cursorCol: number,\n visibleCells: number,\n pastes?: ReadonlyMap<number, PasteEntry>,\n): Viewport {\n // `cursorCol` is between 0 and line.length (inclusive). The cursor\n // visually sits BEFORE the char at line[cursorCol] (or after the\n // last char when cursorCol === line.length).\n // We want both the char at the cursor (if any) AND a cell of cursor\n // padding visible.\n\n // Budget — leave 1 cell for each marker we may need.\n let budget = visibleCells;\n // Right marker: needed if we don't reach end of line.\n // Left marker: needed if start > 0.\n // We don't know in advance, so allocate conservatively: -2 cells.\n const reservedForMarkers = 2;\n budget = Math.max(1, budget - reservedForMarkers);\n\n // Try to keep cursor roughly centred. Start by aiming `start` ~\n // halfway behind cursorCol.\n const halfBudget = Math.floor(budget / 2);\n\n // Walk left from cursor, accumulating cells, until we've spent\n // halfBudget OR hit the start of the line.\n let start = cursorCol;\n let leftCells = 0;\n while (start > 0 && leftCells < halfBudget) {\n const cw = charCellsAt(line, start - 1, pastes);\n if (leftCells + cw > halfBudget) break;\n start--;\n leftCells += cw;\n }\n\n // Walk right from cursor, filling the remaining budget. We always\n // include a cell for the cursor itself if line[cursorCol] exists\n // (since the cursor block covers that char). At end-of-line we\n // include a phantom cell of cursor space.\n const rightBudget = budget - leftCells;\n let end = cursorCol;\n let rightCells = 0;\n // Include the char at the cursor (1 or 2 cells depending on width)\n // if there is one.\n const cursorChar = cursorCol < line.length ? charCellsAt(line, cursorCol, pastes) : 1;\n if (rightBudget >= cursorChar) {\n if (cursorCol < line.length) end = cursorCol + 1;\n rightCells = cursorChar;\n while (end < line.length && rightCells < rightBudget) {\n const cw = charCellsAt(line, end, pastes);\n if (rightCells + cw > rightBudget) break;\n rightCells += cw;\n end++;\n }\n }\n\n // If we have leftover right-budget and there's still room on the\n // left, expand leftwards more (cursor stays towards the right\n // edge but more left context is shown — common when typing at\n // end of a long line).\n let extraLeftBudget = rightBudget - rightCells;\n while (start > 0 && extraLeftBudget > 0) {\n const cw = charCellsAt(line, start - 1, pastes);\n if (cw > extraLeftBudget) break;\n start--;\n leftCells += cw;\n extraLeftBudget -= cw;\n }\n\n const hiddenLeft = start > 0;\n const hiddenRight = end < line.length;\n const segments = textToSegments(line.slice(start, end), pastes);\n // Cursor cell relative to the start of the slice. Markers are\n // rendered separately by the caller — they don't shift the\n // segment-relative offset so we don't add them here.\n const cursorCell = stringCells(line.slice(start, cursorCol), pastes);\n return { segments, cursorCell, hiddenLeft, hiddenRight };\n}\n\nfunction charCellsAt(line: string, idx: number, pastes?: ReadonlyMap<number, PasteEntry>): number {\n const ch = line[idx]!;\n const id = decodePasteSentinel(ch);\n if (id !== null) {\n const entry = pastes?.get(id);\n return pasteSentinelLabel(id, entry).length;\n }\n return charCells(ch);\n}\n\nexport function textToSegments(line: string, pastes?: ReadonlyMap<number, PasteEntry>): Segment[] {\n const out: Segment[] = [];\n let buf = \"\";\n const flushBuf = () => {\n if (buf.length > 0) {\n out.push({ kind: \"text\", text: buf });\n buf = \"\";\n }\n };\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]!;\n const id = decodePasteSentinel(ch);\n if (id !== null) {\n flushBuf();\n const label = pasteSentinelLabel(id, pastes?.get(id));\n out.push({ kind: \"paste\", id, label });\n } else {\n buf += ch;\n }\n }\n flushBuf();\n return out;\n}\n","import { Box, Text, useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { useMemo, useState } from \"react\";\nimport type { SessionInfo } from \"../../memory/session.js\";\nimport { type PickerBroadcastPorts, usePickerBroadcast } from \"./dashboard/use-picker-broadcast.js\";\nimport { useKeystroke } from \"./keystroke-context.js\";\nimport { FG, TONE, formatCost } from \"./theme/tokens.js\";\n\nexport type SessionPickerOutcome =\n | { kind: \"open\"; name: string }\n | { kind: \"new\" }\n | { kind: \"delete\"; name: string }\n | { kind: \"rename\"; name: string; newName: string }\n | { kind: \"quit\" };\n\nexport interface SessionPickerProps {\n sessions: ReadonlyArray<SessionInfo>;\n workspace: string;\n onChoose: (outcome: SessionPickerOutcome) => void;\n /** Live wallet currency from App.tsx; falls back to each session's stored `meta.balanceCurrency` per row. */\n walletCurrency?: string;\n /** When provided, broadcasts to the web dashboard so it can resolve via `/api/modal/resolve`. */\n pickerPorts?: PickerBroadcastPorts;\n}\n\nconst PAGE_MARGIN = 6;\n\nexport function SessionPicker({\n sessions,\n workspace,\n onChoose,\n walletCurrency,\n pickerPorts,\n}: SessionPickerProps): React.ReactElement {\n const [focus, setFocus] = useState(0);\n const [renaming, setRenaming] = useState<{ from: string; buf: string } | null>(null);\n const { stdout } = useStdout();\n const rows = stdout?.rows ?? 40;\n const visibleCount = Math.max(3, rows - PAGE_MARGIN);\n\n const snapshot = useMemo(\n () => ({\n pickerKind: \"sessions\",\n title: `pick a session — ${workspace}`,\n items: sessions.map((s) => {\n const branch = s.meta.branch ?? \"main\";\n const summary =\n s.meta.summary ?? `${s.messageCount} message${s.messageCount === 1 ? \"\" : \"s\"}`;\n const turns = s.meta.turnCount ?? Math.ceil(s.messageCount / 2);\n const currency = walletCurrency ?? s.meta.balanceCurrency;\n const costLabel =\n s.meta.totalCostUsd !== undefined ? formatCost(s.meta.totalCostUsd, currency, 2) : \"\";\n return {\n id: s.name,\n title: s.name,\n subtitle: summary,\n badge: branch,\n meta: costLabel ? `${turns} turns · ${costLabel}` : `${turns} turns`,\n };\n }),\n actions: [\"pick\", \"delete\", \"rename\", \"new\", \"cancel\"] as const,\n hint: \"↑↓ pick · ⏎ open · [n] new · [d] delete · [r] rename · esc quit\",\n }),\n [sessions, workspace, walletCurrency],\n );\n\n usePickerBroadcast(\n !!pickerPorts,\n {\n ...snapshot,\n actions: [...snapshot.actions],\n },\n (res) => {\n if (res.action === \"pick\") return onChoose({ kind: \"open\", name: res.id });\n if (res.action === \"delete\") return onChoose({ kind: \"delete\", name: res.id });\n if (res.action === \"rename\")\n return onChoose({ kind: \"rename\", name: res.id, newName: res.text });\n if (res.action === \"new\") return onChoose({ kind: \"new\" });\n if (res.action === \"cancel\") return onChoose({ kind: \"quit\" });\n },\n pickerPorts ?? {\n broadcast: () => undefined,\n resolverRef: { current: null },\n snapshotRef: { current: null },\n },\n );\n\n useKeystroke((ev) => {\n if (ev.paste) {\n if (renaming) setRenaming({ ...renaming, buf: renaming.buf + ev.input });\n return;\n }\n if (renaming) {\n if (ev.escape) return setRenaming(null);\n if (ev.return) {\n const newName = renaming.buf.trim();\n if (newName.length === 0 || newName === renaming.from) {\n setRenaming(null);\n return;\n }\n onChoose({ kind: \"rename\", name: renaming.from, newName });\n setRenaming(null);\n return;\n }\n if (ev.backspace) {\n setRenaming({ ...renaming, buf: renaming.buf.slice(0, -1) });\n return;\n }\n if (ev.input && !ev.ctrl && !ev.meta && !ev.tab) {\n setRenaming({ ...renaming, buf: renaming.buf + ev.input });\n }\n return;\n }\n if (ev.escape) return onChoose({ kind: \"quit\" });\n if (ev.upArrow) return setFocus((f) => Math.max(0, f - 1));\n if (ev.downArrow) return setFocus((f) => Math.min(sessions.length, f + 1));\n if (ev.return) {\n if (sessions.length === 0 || focus === sessions.length) return onChoose({ kind: \"new\" });\n const target = sessions[focus]!;\n return onChoose({ kind: \"open\", name: target.name });\n }\n if (!ev.input) return;\n if (ev.input === \"n\") return onChoose({ kind: \"new\" });\n if (ev.input === \"q\") return onChoose({ kind: \"quit\" });\n if (sessions.length === 0) return;\n const target = sessions[focus];\n if (!target) return;\n if (ev.input === \"d\") return onChoose({ kind: \"delete\", name: target.name });\n if (ev.input === \"r\") return setRenaming({ from: target.name, buf: \"\" });\n });\n\n const start = Math.max(\n 0,\n Math.min(focus - Math.floor(visibleCount / 2), sessions.length - visibleCount),\n );\n const end = Math.min(sessions.length, start + visibleCount);\n const shown = sessions.slice(start, end);\n const hiddenBelow = sessions.length - end;\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Box>\n <Text bold color={TONE.brand}>\n {\" ◈ REASONIX · pick a session \"}\n </Text>\n <Text color={FG.meta}>{` · ${workspace}`}</Text>\n </Box>\n <Box height={1} />\n {sessions.length === 0 ? (\n <Box>\n <Text color={FG.faint}>{\" no saved sessions in this workspace yet — press \"}</Text>\n <Text bold color={TONE.brand}>\n {\"⏎\"}\n </Text>\n <Text color={FG.faint}>{\" to start a new one\"}</Text>\n </Box>\n ) : (\n shown.map((s, i) => (\n <SessionRow\n key={s.name}\n info={s}\n focused={start + i === focus}\n walletCurrency={walletCurrency}\n />\n ))\n )}\n {hiddenBelow > 0 ? (\n <Box>\n <Text color={FG.faint}>{` … ${hiddenBelow} more`}</Text>\n </Box>\n ) : null}\n {renaming ? (\n <Box marginTop={1}>\n <Text color={FG.faint}>{` rename \"${renaming.from}\" → `}</Text>\n <Text bold color={TONE.brand}>\n {renaming.buf}\n </Text>\n <Text backgroundColor={TONE.brand} color=\"black\">\n {\" \"}\n </Text>\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text color={FG.faint}>\n {renaming\n ? \" ⏎ confirm rename · esc cancel\"\n : sessions.length === 0\n ? \" ⏎ new session · esc quit\"\n : \" ↑↓ pick · ⏎ open · [n] new · [d] delete · [r] rename · esc quit\"}\n </Text>\n </Box>\n </Box>\n );\n}\n\nfunction SessionRow({\n info,\n focused,\n walletCurrency,\n}: {\n info: SessionInfo;\n focused: boolean;\n walletCurrency?: string;\n}): React.ReactElement {\n const branch = info.meta.branch ?? \"main\";\n const summary =\n info.meta.summary ?? `${info.messageCount} message${info.messageCount === 1 ? \"\" : \"s\"}`;\n const turns = info.meta.turnCount ?? Math.ceil(info.messageCount / 2);\n const currency = walletCurrency ?? info.meta.balanceCurrency;\n const costLabel =\n info.meta.totalCostUsd !== undefined ? formatCost(info.meta.totalCostUsd, currency, 2) : \"\";\n const time = relativeTime(info.mtime);\n return (\n <Box>\n <Text color={focused ? TONE.brand : FG.faint}>{focused ? \" ▸ \" : \" \"}</Text>\n <Text bold={focused} color={focused ? FG.strong : FG.sub}>\n {info.name.padEnd(12)}\n </Text>\n <Text color={FG.meta}>{` · ${branch.padEnd(8)} · `}</Text>\n <Text color={focused ? FG.body : FG.sub}>{truncate(summary, 40)}</Text>\n <Box flexGrow={1} />\n <Text color={FG.faint}>{`${time.padStart(11)} `}</Text>\n <Text color={FG.faint}>{`${turns} turns`}</Text>\n {costLabel ? <Text color={FG.faint}>{` · ${costLabel}`}</Text> : null}\n </Box>\n );\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return `${s.slice(0, max - 1)}…`;\n}\n\nfunction relativeTime(date: Date): string {\n const ms = Date.now() - date.getTime();\n const mins = Math.floor(ms / 60_000);\n if (mins < 1) return \"just now\";\n if (mins < 60) return `${mins} min ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days === 1) return \"yesterday\";\n if (days < 7) return `${days} days ago`;\n return date.toISOString().slice(0, 10);\n}\n","import { Box, Text } from \"ink\";\nimport React, { useState } from \"react\";\nimport { DenyContextInput } from \"./DenyContextInput.js\";\nimport { SingleSelect } from \"./Select.js\";\nimport { ApprovalCard } from \"./cards/ApprovalCard.js\";\nimport { useReserveRows } from \"./layout/viewport-budget.js\";\nimport { FG, TONE } from \"./theme/tokens.js\";\n\nexport type ShellConfirmChoice = \"run_once\" | \"always_allow\" | \"deny\";\n\nexport interface ShellConfirmProps {\n command: string;\n /** Prefix that would be persisted if the user picks \"always allow\". */\n allowPrefix: string;\n /** `run_background` returns early; `run_command` blocks the TUI. */\n kind?: \"run_command\" | \"run_background\";\n onChoose: (choice: ShellConfirmChoice, denyContext?: string) => void;\n}\n\nexport function ShellConfirm({ command, allowPrefix, kind, onChoose }: ShellConfirmProps) {\n useReserveRows(\"modal\", { min: 8, max: 14 });\n\n const isBackground = kind === \"run_background\";\n const subtitle = isBackground\n ? \"long-running process — keeps running after approval, /kill to stop\"\n : \"model wants to run a shell command\";\n\n const [phase, setPhase] = useState<\"pick\" | \"deny\">(\"pick\");\n\n if (phase === \"deny\") {\n return (\n <ApprovalCard\n tone=\"error\"\n glyph=\"✗\"\n title=\"Deny — provide context\"\n metaRight=\"optional\"\n footerHint=\"type context · ⏎ submit with reason · esc skip (deny without reason)\"\n >\n <DenyContextInput\n onSubmit={(context) => onChoose(\"deny\", context || undefined)}\n onCancel={() => onChoose(\"deny\")}\n />\n </ApprovalCard>\n );\n }\n\n return (\n <ApprovalCard\n tone=\"warn\"\n glyph={isBackground ? \"⏱\" : \"?\"}\n title={isBackground ? \"Background process\" : \"Shell command\"}\n metaRight=\"awaiting\"\n footerHint=\"↑↓ pick · ⏎ confirm · Tab add context · esc cancel\"\n >\n <Box marginBottom={1}>\n <Text color={FG.faint}>{subtitle}</Text>\n </Box>\n <Box marginBottom={1}>\n <Text bold color={TONE.err}>\n {\"$ \"}\n </Text>\n <Text bold color={FG.strong}>\n {command}\n </Text>\n </Box>\n <SingleSelect\n initialValue=\"run_once\"\n items={[\n {\n value: \"run_once\",\n label: \"allow once\",\n hint: \"run this command, ask again next time\",\n },\n {\n value: \"always_allow\",\n label: \"allow always\",\n hint: `remember \\`${allowPrefix}\\` for this project`,\n },\n {\n value: \"deny\",\n label: \"deny\",\n hint: \"press Tab to add context telling the model why\",\n },\n ]}\n onSubmit={(v) => {\n if (v === \"deny\") setPhase(\"deny\");\n else onChoose(v as ShellConfirmChoice);\n }}\n onTab={(v) => {\n if (v === \"deny\") setPhase(\"deny\");\n }}\n onCancel={() => onChoose(\"deny\")}\n />\n </ApprovalCard>\n );\n}\n\n/** First two tokens for known wrappers (`npm install`, `git commit`, …); else first token only. */\nexport function derivePrefix(command: string): string {\n const tokens = command.trim().split(/\\s+/).filter(Boolean);\n if (tokens.length === 0) return \"\";\n if (tokens.length === 1) return tokens[0]!;\n const first = tokens[0]!;\n const TWO_TOKEN_WRAPPERS = new Set([\n \"npm\",\n \"npx\",\n \"pnpm\",\n \"yarn\",\n \"bun\",\n \"git\",\n \"cargo\",\n \"go\",\n \"docker\",\n \"kubectl\",\n \"python\",\n \"python3\",\n \"deno\",\n \"pip\",\n \"pip3\",\n \"make\",\n \"rake\",\n \"bundle\",\n \"gem\",\n ]);\n return TWO_TOKEN_WRAPPERS.has(first) ? `${first} ${tokens[1]}` : first;\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig.jsx = \"react\" needs React in value scope for JSX compilation\nimport React from \"react\";\nimport type { SlashCommandSpec } from \"./slash.js\";\nimport { GLYPH, useColor } from \"./theme.js\";\n\nexport interface SlashArgPickerProps {\n /**\n * When set, render a picker with these matches (filter already\n * applied upstream). Null → not in picker mode; check `hintSpec`\n * for a usage hint instead.\n */\n matches: readonly string[] | null;\n /** Highlighted row within `matches`. */\n selectedIndex: number;\n /**\n * Spec of the command the user is typing args for. Used to render\n * the header label (\"/edit <file>\") even when matches is empty or\n * the caller wants a hint instead of a picker.\n */\n spec: SlashCommandSpec;\n /** What kind of arg guidance to render. */\n kind: \"picker\" | \"hint\";\n /** The user's partial input — shown in the \"no matches\" hint. */\n partial: string;\n}\n\n/**\n * Argument-level picker for a slash command. Mirrors the visual\n * layout of SlashSuggestions / AtMentionSuggestions so the UI stays\n * consistent across all three picker surfaces.\n */\nexport function SlashArgPicker({\n matches,\n selectedIndex,\n spec,\n kind,\n partial,\n}: SlashArgPickerProps): React.ReactElement | null {\n const color = useColor();\n const headerRow = (\n <Box>\n <Text color={color.accent} bold>\n {\"/ \"}\n </Text>\n <Text color={color.accent} bold>\n {`/${spec.cmd}`}\n </Text>\n {spec.argsHint ? <Text dimColor>{` ${spec.argsHint}`}</Text> : null}\n <Text dimColor>{` ${spec.summary}`}</Text>\n </Box>\n );\n\n if (kind === \"hint\") {\n return (\n <Box paddingX={1} marginTop={1}>\n {headerRow}\n </Box>\n );\n }\n\n if (matches === null) return null;\n if (matches.length === 0) {\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n {headerRow}\n <Box>\n <Text color={color.warn} bold>\n {GLYPH.warn}\n </Text>\n <Text color={color.warn}>{` no match for \"${partial}\"`}</Text>\n <Text dimColor>{\" — keep typing, or Backspace to edit\"}</Text>\n </Box>\n </Box>\n );\n }\n\n const MAX = 8;\n const total = matches.length;\n const windowStart =\n total <= MAX ? 0 : Math.max(0, Math.min(selectedIndex - Math.floor(MAX / 2), total - MAX));\n const shown = matches.slice(windowStart, windowStart + MAX);\n const hiddenAbove = windowStart;\n const hiddenBelow = total - windowStart - shown.length;\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n {headerRow}\n {hiddenAbove > 0 ? <Text dimColor>{` ↑ ${hiddenAbove} above`}</Text> : null}\n {shown.map((value, i) => (\n <ArgRow key={value} value={value} isSelected={windowStart + i === selectedIndex} />\n ))}\n {hiddenBelow > 0 ? <Text dimColor>{` ↓ ${hiddenBelow} below`}</Text> : null}\n <Box marginTop={0}>\n <Text dimColor>{\" ↑↓ navigate · Tab / ⏎ pick · esc cancel\"}</Text>\n </Box>\n </Box>\n );\n}\n\nfunction ArgRow({ value, isSelected }: { value: string; isSelected: boolean }) {\n const color = useColor();\n return (\n <Box>\n <Text color={isSelected ? color.primary : color.info} bold={isSelected}>\n {isSelected ? `${GLYPH.cur} ` : \" \"}\n </Text>\n <Text color={isSelected ? color.user : color.info} bold={isSelected} dimColor={!isSelected}>\n {value}\n </Text>\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig.jsx = \"react\" needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { t } from \"../../i18n/index.js\";\nimport type { SlashCommandSpec, SlashGroup } from \"./slash.js\";\nimport { GLYPH, useColor } from \"./theme.js\";\n\nexport interface SlashSuggestionsProps {\n matches: SlashCommandSpec[] | null;\n selectedIndex: number;\n /** True when input is a bare `/` — render section headers + advanced footer. */\n groupMode?: boolean;\n /** Count of hidden `advanced` commands; rendered as a footer hint when groupMode is true. */\n advancedHidden?: number;\n}\n\nconst GROUP_LABEL: Record<SlashGroup, string> = {\n chat: \"CHAT\",\n setup: \"SETUP\",\n info: \"INFO\",\n session: \"SESSION\",\n extend: \"EXTEND\",\n code: \"CODE\",\n jobs: \"JOBS\",\n advanced: \"ADVANCED\",\n};\n\nexport function SlashSuggestions({\n matches,\n selectedIndex,\n groupMode,\n advancedHidden,\n}: SlashSuggestionsProps): React.ReactElement | null {\n const color = useColor();\n\n if (matches === null) return null;\n if (matches.length === 0) {\n return (\n <Box paddingX={1} marginTop={1}>\n <Text color={color.warn} bold>\n {GLYPH.warn}\n </Text>\n <Text> </Text>\n <Text color={color.warn}>no slash command matches that prefix</Text>\n <Text dimColor>{\" — Backspace to edit, or /help for the full list\"}</Text>\n </Box>\n );\n }\n const MAX = groupMode ? 24 : 8;\n const total = matches.length;\n const windowStart =\n total <= MAX ? 0 : Math.max(0, Math.min(selectedIndex - Math.floor(MAX / 2), total - MAX));\n const shown = matches.slice(windowStart, windowStart + MAX);\n const hiddenAbove = windowStart;\n const hiddenBelow = total - windowStart - shown.length;\n let lastGroup: SlashGroup | null = null;\n if (windowStart > 0) lastGroup = matches[windowStart - 1]?.group ?? null;\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Box>\n <Text color={color.accent} bold>\n {\"/ \"}\n </Text>\n <Text dimColor>{`${total} command${total === 1 ? \"\" : \"s\"}`}</Text>\n {hiddenAbove > 0 ? <Text dimColor>{` ↑ ${hiddenAbove} above`}</Text> : null}\n </Box>\n {shown.map((spec, i) => {\n const idx = windowStart + i;\n const showHeader = groupMode && spec.group !== lastGroup;\n lastGroup = spec.group;\n return (\n <React.Fragment key={spec.cmd}>\n {showHeader ? (\n <Box marginTop={idx === 0 ? 0 : 1}>\n <Text dimColor>{` ${GROUP_LABEL[spec.group]}`}</Text>\n </Box>\n ) : null}\n <SuggestionRow spec={spec} isSelected={idx === selectedIndex} />\n </React.Fragment>\n );\n })}\n {hiddenBelow > 0 ? <Text dimColor>{` ↓ ${hiddenBelow} below`}</Text> : null}\n {groupMode && advancedHidden && advancedHidden > 0 ? (\n <Box marginTop={1}>\n <Text dimColor>{` + ${advancedHidden} advanced · type a letter to search`}</Text>\n </Box>\n ) : null}\n <Box marginTop={0}>\n <Text dimColor>{\" ↑↓ navigate · Tab / ⏎ pick · esc cancel\"}</Text>\n </Box>\n </Box>\n );\n}\n\nfunction SuggestionRow({ spec, isSelected }: { spec: SlashCommandSpec; isSelected: boolean }) {\n const color = useColor();\n const name = `/${spec.cmd}`;\n const argsSuffix = spec.argsHint ? spec.argsHint : \"\";\n const key = `slash.${spec.cmd}.description`;\n const translated = t(key);\n const summary = translated === key ? spec.summary : translated;\n const aliasHint = spec.aliases?.length ? ` · /${spec.aliases.join(\" /\")}` : \"\";\n return (\n <Box>\n <Text color={isSelected ? color.primary : color.info} bold={isSelected}>\n {isSelected ? `${GLYPH.cur} ` : \" \"}\n </Text>\n <Text color={color.accent} bold={isSelected}>\n {name.padEnd(14)}\n </Text>\n <Text dimColor>{argsSuffix.padEnd(14)}</Text>\n <Text>{\" \"}</Text>\n <Text color={isSelected ? color.user : color.info} dimColor={!isSelected}>\n {summary}\n </Text>\n {aliasHint ? <Text dimColor>{aliasHint}</Text> : null}\n </Box>\n );\n}\n","/** Empty-session welcome card — REASONIX × 🐋 DeepSeek brand row + tagline + starter slash commands. */\n\nimport { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { t } from \"../../i18n/index.js\";\nimport { FG, TONE } from \"./theme/tokens.js\";\n\nexport interface WelcomeBannerProps {\n /** True when running `reasonix code`. Surfaces code-mode hints. */\n inCodeMode?: boolean;\n /** Pinned workspace root — only meaningful in code mode. Surfaced so first-time users see they can pass --dir at next launch. */\n workspaceRoot?: string;\n /** Live URL of the embedded dashboard, or null when it isn't running. */\n dashboardUrl?: string | null;\n /** Bumped on language change; forces re-render so t() picks up new locale. */\n languageVersion?: number;\n}\n\nconst HINTS = [\"/help\", \"/init\", \"/memory\", \"/cost\"] as const;\n\nexport function WelcomeBanner({\n inCodeMode,\n workspaceRoot,\n dashboardUrl,\n}: WelcomeBannerProps): React.ReactElement {\n const tagline = inCodeMode ? t(\"ui.taglineCode\") : t(\"ui.taglineChat\");\n const taglineSub = t(\"ui.taglineSub\");\n const startTextRaw = t(\"ui.startSessionHint\");\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" marginY={1}>\n <Box\n flexDirection=\"column\"\n alignItems=\"center\"\n borderStyle=\"round\"\n borderColor={TONE.brand}\n paddingX={4}\n paddingY={1}\n >\n <Box flexDirection=\"row\" gap={2}>\n <Text color={TONE.brand} bold>\n {\"REASONIX\"}\n </Text>\n <Text color={FG.faint}>{\"×\"}</Text>\n <Box flexDirection=\"row\" gap={1}>\n <Text>{\"🐋\"}</Text>\n <Text color={TONE.accent} bold>\n {\"DeepSeek\"}\n </Text>\n </Box>\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\" alignItems=\"center\">\n <Text color={FG.body}>{tagline}</Text>\n <Text color={FG.meta}>{taglineSub}</Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text color={FG.sub}>{startTextRaw}</Text>\n </Box>\n\n <Box marginTop={1} flexDirection=\"row\" gap={3}>\n {HINTS.map((cmd) => (\n <Text key={cmd} color={FG.meta}>\n {cmd}\n </Text>\n ))}\n </Box>\n\n {inCodeMode && workspaceRoot ? (\n <Box marginTop={1} flexDirection=\"row\" gap={1}>\n <Text color={TONE.brand}>{\"▸ workspace\"}</Text>\n <Text color={FG.faint}>{\"·\"}</Text>\n <Text color={FG.body}>{workspaceRoot}</Text>\n <Text color={FG.faint}>{\" (relaunch with --dir <path> to switch)\"}</Text>\n </Box>\n ) : null}\n\n {dashboardUrl ? (\n <Box marginTop={1} flexDirection=\"row\" gap={1}>\n <Text color={TONE.brand} bold>\n {\"▸ web\"}\n </Text>\n <Text color={FG.faint}>{\"·\"}</Text>\n <Text color={TONE.accent}>{dashboardUrl}</Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n","/** User-typed `!cmd` skips the allowlist — that gate is for the MODEL, not the user. */\n\nexport function detectBangCommand(text: string): string | null {\n if (!text.startsWith(\"!\")) return null;\n const body = text.slice(1).trim();\n if (!body) return null;\n return body;\n}\n\nexport function formatBangUserMessage(cmd: string, output: string): string {\n return `[!${cmd}]\\n${output}`;\n}\n","import { formatAllBlockDiffs } from \"../../code/diff-preview.js\";\nimport type { ApplyResult, EditBlock, EditSnapshot } from \"../../code/edit-blocks.js\";\n\n/** Session-only — restoring pre-apply content across restarts is git's job, not ours. */\nexport interface EditHistoryEntry {\n /** Sequence number within the session, stable for `/show <id>`. */\n id: number;\n /** Epoch ms when the entry was opened (first edit landed). */\n at: number;\n /** Tag for what produced the batch — \"auto\" / \"auto-text\" / \"review-apply\". */\n source: string;\n /** Edit blocks included in this batch, in arrival order. */\n blocks: EditBlock[];\n /** Per-block outcome — some may be \"not-found\" if SEARCH drifted. */\n results: ApplyResult[];\n /** First-snapshot-per-path wins — multi-edit turns roll back to pre-turn state. */\n snapshots: EditSnapshot[];\n /** Per-path so a multi-file batch can be partially undone. */\n undoneFiles: Set<string>;\n}\n\n/** True when every path in the entry has been undone. */\nexport function isEntryFullyUndone(e: EditHistoryEntry): boolean {\n return e.snapshots.length > 0 && e.snapshots.every((s) => e.undoneFiles.has(s.path));\n}\n\n/** Per-entry three-state status label for display. */\nexport function entryStatus(e: EditHistoryEntry): \"applied\" | \"UNDONE\" | \"PARTIAL\" {\n if (e.undoneFiles.size === 0) return \"applied\";\n if (isEntryFullyUndone(e)) return \"UNDONE\";\n return \"PARTIAL\";\n}\n\n/** Status prefix is `✓`/`✗` so the line reads without color (piped, screenshots). */\nexport function formatEditResults(results: ApplyResult[]): string {\n const lines = results.map((r) => {\n const mark = r.status === \"applied\" || r.status === \"created\" ? \"✓\" : \"✗\";\n const detail = r.message ? ` (${r.message})` : \"\";\n return ` ${mark} ${r.status.padEnd(11)} ${r.path}${detail}`;\n });\n const ok = results.filter((r) => r.status === \"applied\" || r.status === \"created\").length;\n const total = results.length;\n const header = `▸ edit blocks: ${ok}/${total} applied — /undo to roll back, or \\`git diff\\` to review`;\n return [header, ...lines].join(\"\\n\");\n}\n\n/** `[N]` labels so users can `/apply 1,3-4` instead of all-or-nothing. */\nexport function formatPendingPreview(blocks: EditBlock[]): string {\n const partial = blocks.length > 1 ? \" · /apply N or 1,3-4 for partial\" : \"\";\n const header = `▸ ${blocks.length} pending edit block(s) — /apply (or y) to commit · /discard (or n) to drop${partial}`;\n const diffLines = formatAllBlockDiffs(blocks, { numbered: blocks.length > 1 });\n return [header, ...diffLines].join(\"\\n\");\n}\n\n/** Empty input → `{ ok: [] }` so callers detect \"no indices\" → default to all-blocks. */\nexport function parseEditIndices(raw: string, max: number): { ok: number[] } | { error: string } {\n const trimmed = raw.trim();\n if (!trimmed) return { ok: [] };\n if (max <= 0) return { error: \"no pending edits to address\" };\n const seen = new Set<number>();\n const tokens = trimmed\n .split(\",\")\n .map((t) => t.trim())\n .filter((t) => t.length > 0);\n if (tokens.length === 0) return { ok: [] };\n for (const tok of tokens) {\n const range = tok.match(/^(\\d+)-(\\d+)$/);\n if (range) {\n const a = Number.parseInt(range[1] ?? \"\", 10);\n const b = Number.parseInt(range[2] ?? \"\", 10);\n if (!Number.isFinite(a) || !Number.isFinite(b) || a < 1 || b < 1) {\n return { error: `invalid range: \"${tok}\"` };\n }\n const lo = Math.min(a, b);\n const hi = Math.max(a, b);\n if (hi > max) return { error: `index ${hi} out of range (max ${max})` };\n for (let i = lo; i <= hi; i++) seen.add(i);\n continue;\n }\n if (!/^\\d+$/.test(tok)) return { error: `invalid index: \"${tok}\"` };\n const n = Number.parseInt(tok, 10);\n if (!Number.isFinite(n) || n < 1) return { error: `invalid index: \"${tok}\"` };\n if (n > max) return { error: `index ${n} out of range (max ${max})` };\n seen.add(n);\n }\n return { ok: [...seen].sort((a, b) => a - b) };\n}\n\nexport function partitionEdits<T>(\n edits: readonly T[],\n indices1Based: readonly number[],\n): { selected: T[]; remaining: T[] } {\n const picked = new Set(indices1Based);\n const selected: T[] = [];\n const remaining: T[] = [];\n for (let i = 0; i < edits.length; i++) {\n if (picked.has(i + 1)) selected.push(edits[i] as T);\n else remaining.push(edits[i] as T);\n }\n return { selected, remaining };\n}\n\nexport function formatUndoRows(results: ApplyResult[]): string[] {\n return results.map((r) => {\n const mark = r.status === \"applied\" ? \"✓\" : \"✗\";\n const detail = r.message ? ` (${r.message})` : \"\";\n return ` ${mark} ${r.path}${detail}`;\n });\n}\n\nexport function describeRepair(repair: {\n scavenged: number;\n truncationsFixed: number;\n stormsBroken: number;\n}): string {\n const parts: string[] = [];\n if (repair.scavenged) parts.push(`scavenged ${repair.scavenged}`);\n if (repair.truncationsFixed) parts.push(`repaired ${repair.truncationsFixed} truncation`);\n if (repair.stormsBroken) parts.push(`broke ${repair.stormsBroken} storm`);\n return parts.length ? `[repair] ${parts.join(\", \")}` : \"\";\n}\n","import type { LoopEvent } from \"../../../loop.js\";\nimport type { DashboardEvent } from \"../../../server/context.js\";\n\nexport function loopEventToDashboard(\n ev: LoopEvent,\n ctx: { assistantId: string },\n): DashboardEvent | null {\n const id = `${ctx.assistantId}-${ev.role}-${Date.now()}`;\n switch (ev.role) {\n case \"assistant_delta\":\n return {\n kind: \"assistant_delta\",\n id: ctx.assistantId,\n contentDelta: ev.content || undefined,\n reasoningDelta: ev.reasoningDelta,\n };\n case \"tool_start\":\n if (!ev.toolName) return null;\n return { kind: \"tool_start\", id, toolName: ev.toolName, args: ev.toolArgs };\n case \"tool\":\n if (!ev.toolName) return null;\n return {\n kind: \"tool\",\n id,\n toolName: ev.toolName,\n content: ev.content,\n args: ev.toolArgs,\n };\n case \"warning\":\n return { kind: \"warning\", id, text: ev.content };\n case \"error\":\n return { kind: \"error\", id, text: ev.content };\n case \"status\":\n return { kind: \"status\", text: ev.content };\n default:\n return null;\n }\n}\n","/** `#` writes project memory, `#g` global; `##+` stays a markdown heading; `\\#` escapes and submits the literal `#`. */\n\nimport { closeSync, fstatSync, mkdirSync, openSync, readSync, writeSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { PROJECT_MEMORY_FILE } from \"../../memory/project.js\";\n\nconst PROJECT_HEADER = `# Reasonix project memory\n\nNotes the user pinned via the \\`#\\` prompt prefix. The whole file is\nloaded into the immutable system prefix every session — keep it terse.\n\n`;\n\nconst GLOBAL_HEADER = `# Reasonix global memory\n\nCross-project notes the user pinned via the \\`#g\\` prompt prefix. Loaded\ninto every Reasonix session's prefix regardless of working directory.\nPrivate to this machine — not committed anywhere.\n\n`;\n\nexport type HashMemoryParse =\n | { kind: \"memory\"; note: string }\n | { kind: \"memory-global\"; note: string }\n | { kind: \"escape\"; text: string };\n\n/** Order: escape > `##` heading > `#g <body>` (mandatory space) > `#<body>` project. */\nexport function detectHashMemory(text: string): HashMemoryParse | null {\n if (text.startsWith(\"\\\\#\")) {\n return { kind: \"escape\", text: text.slice(1) };\n }\n if (!text.startsWith(\"#\")) return null;\n // Markdown headings of level 2+ pass through to the model unchanged.\n // Only a single leading `#` (level-1 heading shape) is ambiguous; we\n // resolve that ambiguity in favor of memory write and document the\n // `\\#` escape for users who want a literal H1 in the prompt.\n if (text.startsWith(\"##\")) return null;\n // `#g <note>` — global memory. The space after `g` is mandatory so\n // notes like `#golang preference` route to project memory, not global.\n // `#g` alone (or `#g` + only whitespace) is treated as null — the\n // user clearly wanted the global form but typed no body, so we don't\n // silently fall back to project memory with body=`g`.\n if (/^#g\\s*$/.test(text)) return null;\n const globalMatch = /^#g\\s+(.+)$/s.exec(text);\n if (globalMatch) {\n const body = globalMatch[1]!.trim();\n if (!body) return null;\n return { kind: \"memory-global\", note: body };\n }\n const body = text.slice(1).trim();\n if (!body) return null;\n return { kind: \"memory\", note: body };\n}\n\nexport interface AppendMemoryResult {\n /** Absolute path written to. */\n path: string;\n /** True iff the file did not exist before this call. */\n created: boolean;\n}\n\nexport function appendProjectMemory(rootDir: string, note: string): AppendMemoryResult {\n return appendBulletToFile(join(rootDir, PROJECT_MEMORY_FILE), note, PROJECT_HEADER);\n}\n\nexport const GLOBAL_MEMORY_DIR = \".reasonix\";\nexport const GLOBAL_MEMORY_FILE = \"REASONIX.md\";\n\nexport function globalMemoryPath(homeDir: string = homedir()): string {\n return join(homeDir, GLOBAL_MEMORY_DIR, GLOBAL_MEMORY_FILE);\n}\n\nexport function appendGlobalMemory(note: string, homeDir?: string): AppendMemoryResult {\n return appendBulletToFile(globalMemoryPath(homeDir), note, GLOBAL_HEADER);\n}\n\nfunction appendBulletToFile(path: string, note: string, newFileHeader: string): AppendMemoryResult {\n const trimmed = note.trim();\n if (!trimmed) throw new Error(\"note body cannot be empty\");\n const bullet = `- ${trimmed}\\n`;\n mkdirSync(dirname(path), { recursive: true });\n // One `a+` open covers both branches: O_APPEND lands every write\n // atomically at end-of-file (concurrent appenders interleave whole\n // bullets), O_CREAT creates the file when it's missing, and we use\n // `fstat().size === 0` as the \"we just created it\" signal to decide\n // whether to emit the file header. Single fd from open through\n // write — no path-based check between (CodeQL js/file-system-race).\n const fd = openSync(path, \"a+\");\n try {\n const stat = fstatSync(fd);\n if (stat.size === 0) {\n writeSync(fd, `${newFileHeader}${bullet}`);\n return { path, created: true };\n }\n // Existing file — peek the trailing byte to decide whether to\n // insert a leading newline. Same fd → no separate stat→read race.\n const tail = Buffer.alloc(1);\n readSync(fd, tail, 0, 1, stat.size - 1);\n const prefix = tail[0] !== 0x0a ? \"\\n\" : \"\";\n writeSync(fd, `${prefix}${bullet}`);\n return { path, created: false };\n } finally {\n closeSync(fd);\n }\n}\n","import type { MutableRefObject } from \"react\";\nimport type { EditBlock } from \"../../../code/edit-blocks.js\";\nimport { clearPendingEdits } from \"../../../code/pending-edits.js\";\nimport type { SlashResult } from \"../slash.js\";\nimport type { Scrollback } from \"./useScrollback.js\";\n\nexport type SlashOutcome = { kind: \"consumed\" } | { kind: \"resubmit\"; text: string };\n\nexport interface ApplySlashResultContext {\n log: Scrollback;\n stdoutWrite: (chunk: string) => void;\n pendingEdits: MutableRefObject<EditBlock[]>;\n syncPendingCount: () => void;\n session: string | null;\n codeModeOn: boolean;\n isLoopActive: () => boolean;\n stopLoop: () => void;\n quitProcess: () => void;\n pushHistory: (text: string) => void;\n /** The verbatim text the user typed; used for promptHistory bookkeeping. */\n text: string;\n}\n\nexport function applySlashResult(result: SlashResult, ctx: ApplySlashResultContext): SlashOutcome {\n if (result.exit) {\n // Tear down /loop before quitProcess so the timer doesn't fire after\n // the process is exiting. Use quitProcess (process.exit) rather than\n // Ink's exit(): the singleton stdin reader keeps a `data` listener\n // attached, so exit() unmounts React but leaves the event loop alive.\n if (ctx.isLoopActive()) ctx.stopLoop();\n ctx.quitProcess();\n return { kind: \"consumed\" };\n }\n if (result.clear) {\n // 2J + 3J + H: visible buffer + scrollback + cursor home.\n ctx.stdoutWrite(\"\\x1b[2J\\x1b[3J\\x1b[H\");\n ctx.log.reset();\n if (result.info) ctx.log.pushInfo(result.info);\n if (ctx.codeModeOn) {\n ctx.pendingEdits.current = [];\n clearPendingEdits(ctx.session);\n ctx.syncPendingCount();\n }\n if (ctx.isLoopActive()) ctx.stopLoop();\n return { kind: \"consumed\" };\n }\n if (result.info) {\n if (result.ctxBreakdown) {\n ctx.log.showCtx({ text: result.info, ...result.ctxBreakdown });\n } else {\n ctx.log.pushInfo(result.info);\n }\n }\n if (result.replayPlan) {\n const rp = result.replayPlan;\n const done = new Set(rp.completedStepIds);\n const titleSuffix = rp.summary ? ` — ${rp.summary}` : \"\";\n ctx.log.showPlan({\n title: `Replay #${rp.index}/${rp.total} · ${rp.relativeTime}${titleSuffix}`,\n steps: rp.steps.map((s) => ({\n id: s.id,\n title: s.title,\n status: done.has(s.id) ? \"done\" : \"queued\",\n })),\n variant: \"replay\",\n });\n }\n if (result.resubmit) {\n return { kind: \"resubmit\", text: result.resubmit };\n }\n ctx.pushHistory(ctx.text);\n return { kind: \"consumed\" };\n}\n","import type { Dispatch, MutableRefObject, SetStateAction } from \"react\";\nimport {\n type ApplyResult,\n type EditBlock,\n type EditSnapshot,\n applyEditBlocks,\n parseEditBlocks,\n snapshotBeforeEdits,\n} from \"../../../code/edit-blocks.js\";\nimport { savePendingEdits } from \"../../../code/pending-edits.js\";\nimport type { EditMode } from \"../../../config.js\";\nimport type { LoopEvent } from \"../../../loop.js\";\nimport type { DashboardEvent } from \"../../../server/context.js\";\nimport type { SessionSummary } from \"../../../telemetry/stats.js\";\nimport { appendUsage } from \"../../../telemetry/usage.js\";\nimport { formatEditResults, formatPendingPreview } from \"../edit-history.js\";\nimport type { TurnTranslator } from \"../state/TurnTranslator.js\";\nimport type { Scrollback } from \"./useScrollback.js\";\n\nexport interface AssistantFinalContext {\n flush: () => void;\n translator: TurnTranslator;\n streamRef: { text: string; reasoning: string; toolCallBuild?: { name: string; chars: number } };\n contentBuf: { current: string };\n reasoningBuf: { current: string };\n toolCallBuildBuf: {\n current: { name: string; chars: number; index?: number; readyCount?: number } | null;\n };\n assistantId: string;\n setSummary: Dispatch<SetStateAction<SessionSummary>>;\n log: Scrollback;\n broadcastDashboardEvent: (ev: DashboardEvent) => void;\n getSessionSummary: () => SessionSummary;\n session: string | null;\n assistantIterCounter: MutableRefObject<number>;\n codeModeOn: boolean;\n currentRootDir: string;\n editModeRef: MutableRefObject<EditMode>;\n recordEdit: (\n source: string,\n blocks: readonly EditBlock[],\n results: readonly ApplyResult[],\n snaps: readonly EditSnapshot[],\n ) => void;\n armUndoBanner: (results: ApplyResult[]) => void;\n pendingEdits: MutableRefObject<EditBlock[]>;\n syncPendingCount: () => void;\n /** Used to gate the ctx-pressure warn/err cards; 0 disables the check. */\n ctxMax: number;\n}\n\nexport function handleAssistantFinal(ev: LoopEvent, ctx: AssistantFinalContext): void {\n ctx.flush();\n ctx.translator.reasoningDone(ctx.streamRef.reasoning);\n ctx.translator.streamingDone();\n ctx.broadcastDashboardEvent({\n kind: \"assistant_final\",\n id: ctx.assistantId,\n text: ev.content || ctx.streamRef.text,\n reasoning: ctx.streamRef.reasoning || undefined,\n });\n // Keep the live stats panel current with per-iter usage. Without this,\n // cost/ctx/cache/hit stay at the prior turn's numbers until the whole\n // step resolves — confusing in multi-iter tool-call chains.\n ctx.setSummary(ctx.getSessionSummary());\n if (ev.stats?.usage) {\n appendUsage({\n session: ctx.session,\n model: ev.stats.model,\n usage: ev.stats.usage,\n });\n ctx.translator.turnEnd(ev.stats, ctx.streamRef.reasoning, {\n promptCap: ctx.ctxMax > 0 ? ctx.ctxMax : undefined,\n });\n if (ctx.ctxMax > 0) {\n ctx.log.pushCtxPressureIfHigh(ev.stats.usage.promptTokens, ctx.ctxMax);\n }\n }\n const finalText = ev.content || ctx.streamRef.text;\n ctx.assistantIterCounter.current++;\n // streamRef is scoped to the whole handleSubmit call; reset between iters\n // so deltas don't bleed into the next.\n ctx.streamRef.text = \"\";\n ctx.streamRef.reasoning = \"\";\n ctx.streamRef.toolCallBuild = undefined;\n ctx.contentBuf.current = \"\";\n ctx.reasoningBuf.current = \"\";\n ctx.toolCallBuildBuf.current = null;\n\n if (!ctx.codeModeOn || !finalText || ev.forcedSummary) return;\n // ev.forcedSummary gates us out: forced summaries are wrap-ups, not plans\n // to execute, so SEARCH/REPLACE blocks inside are display-only.\n const blocks = parseEditBlocks(finalText);\n if (blocks.length === 0) return;\n\n if (ctx.editModeRef.current === \"auto\" || ctx.editModeRef.current === \"yolo\") {\n const snaps = snapshotBeforeEdits(blocks, ctx.currentRootDir);\n const results = applyEditBlocks(blocks, ctx.currentRootDir);\n const good = results.some((r) => r.status === \"applied\" || r.status === \"created\");\n if (good) {\n ctx.recordEdit(\"auto-text\", blocks, results, snaps);\n ctx.armUndoBanner(results);\n }\n ctx.log.pushInfo(formatEditResults(results));\n } else {\n // Append, don't replace — tool-call edits earlier in the same turn\n // may already be queued via the registry interceptor.\n ctx.pendingEdits.current = [...ctx.pendingEdits.current, ...blocks];\n // Checkpoint the queue so a crash between \"blocks parsed\" and \"user\n // /apply\" doesn't lose the edits.\n savePendingEdits(ctx.session, ctx.pendingEdits.current);\n ctx.syncPendingCount();\n ctx.log.pushInfo(formatPendingPreview(ctx.pendingEdits.current));\n }\n}\n","import type { Dispatch, MutableRefObject, SetStateAction } from \"react\";\nimport type { LoopEvent } from \"../../../loop.js\";\nimport type { TurnTranslator } from \"../state/TurnTranslator.js\";\nimport type { Scrollback } from \"./useScrollback.js\";\n\nfunction parseJsonOrRaw(input: string | undefined): unknown {\n if (!input) return undefined;\n try {\n return JSON.parse(input);\n } catch {\n return input;\n }\n}\n\nexport interface ToolStartContext {\n setOngoingTool: Dispatch<SetStateAction<{ name: string; args?: string } | null>>;\n setToolProgress: Dispatch<\n SetStateAction<{ progress: number; total?: number; message?: string } | null>\n >;\n toolStartedAtRef: MutableRefObject<number | null>;\n translator: TurnTranslator;\n codeModeOn: boolean;\n recordRecentFile: (path: string) => void;\n}\n\nexport function handleToolStart(ev: LoopEvent, ctx: ToolStartContext): void {\n ctx.setOngoingTool({ name: ev.toolName ?? \"?\", args: ev.toolArgs });\n ctx.setToolProgress(null);\n ctx.toolStartedAtRef.current = Date.now();\n ctx.translator.toolStart(ev.toolName ?? \"?\", parseJsonOrRaw(ev.toolArgs));\n // Feed the `@` picker's recency LRU from any path-shaped field in the\n // tool args. Picker surfaces these next time `@` is typed, even if mtime\n // is stale.\n if (!ctx.codeModeOn || !ev.toolArgs) return;\n try {\n const parsed = JSON.parse(ev.toolArgs) as {\n path?: unknown;\n file_path?: unknown;\n file?: unknown;\n };\n for (const k of [\"path\", \"file_path\", \"file\"] as const) {\n const v = parsed[k];\n if (typeof v === \"string\" && v.trim()) {\n ctx.recordRecentFile(v.trim());\n break;\n }\n }\n } catch {\n /* malformed args — skip recency tracking */\n }\n}\n\nexport interface ErrorContext {\n log: Scrollback;\n}\n\nexport function handleErrorEvent(ev: LoopEvent, ctx: ErrorContext): void {\n ctx.log.pushError(\"tool error\", ev.error ?? ev.content);\n}\n\nexport interface WarningContext {\n log: Scrollback;\n setTurnOnPro: Dispatch<SetStateAction<boolean>>;\n}\n\nexport function handleWarningEvent(ev: LoopEvent, ctx: WarningContext): void {\n ctx.log.pushWarning(\"warning\", ev.content);\n // Loop emits warnings starting with \"⇧\" whenever this turn is (or just\n // became) running on pro — flip the badge so the escalation shows.\n if (ev.content?.startsWith(\"⇧ \")) ctx.setTurnOnPro(true);\n}\n","import type { Dispatch, MutableRefObject, SetStateAction } from \"react\";\nimport { archivePlanState } from \"../../../code/plan-store.js\";\nimport type { LoopEvent } from \"../../../loop.js\";\nimport type { ChoiceOption } from \"../../../tools/choice.js\";\nimport type { PlanStep, StepCompletion } from \"../../../tools/plan.js\";\nimport type { TurnTranslator } from \"../state/TurnTranslator.js\";\nimport type { Scrollback } from \"./useScrollback.js\";\n\nexport interface ToolEventContext {\n flush: () => void;\n translator: TurnTranslator;\n setOngoingTool: Dispatch<SetStateAction<{ name: string; args?: string } | null>>;\n setToolProgress: Dispatch<\n SetStateAction<{ progress: number; total?: number; message?: string } | null>\n >;\n toolStartedAtRef: MutableRefObject<number | null>;\n setPendingShell: Dispatch<\n SetStateAction<{ id: number; command: string; kind: \"run_command\" | \"run_background\" } | null>\n >;\n setPendingPlan: Dispatch<SetStateAction<string | null>>;\n setPendingRevision: Dispatch<\n SetStateAction<{ reason: string; remainingSteps: PlanStep[]; summary?: string } | null>\n >;\n setPendingChoice: Dispatch<\n SetStateAction<{ question: string; options: ChoiceOption[]; allowCustom: boolean } | null>\n >;\n planStepsRef: MutableRefObject<PlanStep[] | null>;\n completedStepIdsRef: MutableRefObject<Set<string>>;\n planBodyRef: MutableRefObject<string | null>;\n planSummaryRef: MutableRefObject<string | null>;\n persistPlanState: () => void;\n log: Scrollback;\n session: string | null;\n codeModeOn: boolean;\n}\n\nexport function handleToolEvent(ev: LoopEvent, ctx: ToolEventContext): void {\n ctx.flush();\n ctx.setOngoingTool(null);\n ctx.setToolProgress(null);\n ctx.translator.toolEnd(ev.content);\n\n ctx.toolStartedAtRef.current = null;\n\n if (ev.toolName === \"mark_step_complete\") {\n try {\n const parsed = JSON.parse(ev.content) as Partial<StepCompletion>;\n const stepId = parsed.stepId;\n if (parsed.kind === \"step_completed\" && typeof stepId === \"string\") {\n ctx.completedStepIdsRef.current.add(stepId);\n ctx.persistPlanState();\n ctx.log.completePlanStep(stepId);\n const total = ctx.planStepsRef.current?.length ?? 0;\n const completed = ctx.completedStepIdsRef.current.size;\n const stepFromPlan = ctx.planStepsRef.current?.find((s) => s.id === stepId);\n const title = parsed.title ?? stepFromPlan?.title;\n if (title) ctx.log.pushStepProgress(completed, total, title);\n if (ctx.session && total > 0 && completed >= total) {\n const archive = archivePlanState(ctx.session);\n if (archive) {\n ctx.log.pushInfo(\n `▸ plan complete — all ${total} step${total === 1 ? \"\" : \"s\"} done · archived`,\n );\n }\n }\n }\n } catch {\n /* malformed payload — skip the progress row */\n }\n }\n}\n","import { useMemo } from \"react\";\nimport type { SessionInfo } from \"../state/state.js\";\n\nexport interface UseAgentSessionInput {\n readonly sessionId: string | undefined;\n readonly model: string;\n readonly workspace: string;\n readonly branch?: string;\n}\n\nexport function useAgentSession({\n sessionId,\n model,\n workspace,\n branch,\n}: UseAgentSessionInput): SessionInfo {\n return useMemo(\n () => ({\n id: sessionId ?? \"default\",\n branch: branch ?? \"main\",\n workspace,\n model,\n }),\n [sessionId, branch, workspace, model],\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\n/** Rows advanced per PgUp / PgDn / arrow / wheel — small for smooth feel. */\nexport const SCROLL_PAGE_ROWS = 3;\nconst COALESCE_MS = 16;\n\nexport interface ChatScrollState {\n /** How many rows of content are above the visible viewport. */\n scrollRows: number;\n /** True when the user is following the bottom (auto-advances on new content). */\n pinned: boolean;\n scrollUp: () => void;\n scrollDown: () => void;\n /** Jump straight to the latest content and resume auto-follow (End key). */\n jumpToBottom: () => void;\n /** CardStream calls this once it has measured inner/outer Box heights. */\n setMaxScroll: (rows: number) => void;\n}\n\n/** Row-precision scroll state. CardStream reports maxScroll back via setMaxScroll once Ink has laid out the inner column. */\nexport function useChatScroll(): ChatScrollState {\n const [scrollRows, setScrollRows] = useState(0);\n const [pinned, setPinned] = useState(true);\n const [maxScroll, setMaxScrollState] = useState(0);\n const maxScrollRef = useRef(0);\n\n const pendingDelta = useRef(0);\n const flushTimer = useRef<NodeJS.Timeout | null>(null);\n\n const flush = useCallback(() => {\n flushTimer.current = null;\n const d = pendingDelta.current;\n pendingDelta.current = 0;\n if (d === 0) return;\n if (d < 0) setPinned(false);\n setScrollRows((o) => {\n const next = Math.max(0, Math.min(maxScrollRef.current, o + d));\n if (next >= maxScrollRef.current) setPinned(true);\n return next;\n });\n }, []);\n\n const schedule = useCallback(\n (delta: number) => {\n pendingDelta.current += delta;\n if (flushTimer.current !== null) return;\n flushTimer.current = setTimeout(flush, COALESCE_MS);\n },\n [flush],\n );\n\n useEffect(() => {\n return () => {\n if (flushTimer.current !== null) {\n clearTimeout(flushTimer.current);\n flushTimer.current = null;\n }\n };\n }, []);\n\n useEffect(() => {\n if (pinned) setScrollRows(maxScroll);\n }, [pinned, maxScroll]);\n\n useEffect(() => {\n if (scrollRows > maxScroll) setScrollRows(maxScroll);\n }, [scrollRows, maxScroll]);\n\n const scrollUp = useCallback(() => schedule(-SCROLL_PAGE_ROWS), [schedule]);\n const scrollDown = useCallback(() => schedule(SCROLL_PAGE_ROWS), [schedule]);\n\n const jumpToBottom = useCallback(() => {\n pendingDelta.current = 0;\n if (flushTimer.current !== null) {\n clearTimeout(flushTimer.current);\n flushTimer.current = null;\n }\n setPinned(true);\n }, []);\n\n const setMaxScroll = useCallback((rows: number) => {\n maxScrollRef.current = rows;\n setMaxScrollState(rows);\n }, []);\n\n return { scrollRows, pinned, scrollUp, scrollDown, jumpToBottom, setMaxScroll };\n}\n","import { type MutableRefObject, useCallback } from \"react\";\nimport {\n type ApplyResult,\n type EditBlock,\n type EditSnapshot,\n applyEditBlocks,\n snapshotBeforeEdits,\n} from \"../../../code/edit-blocks.js\";\nimport { clearPendingEdits, savePendingEdits } from \"../../../code/pending-edits.js\";\nimport { formatEditResults, partitionEdits } from \"../edit-history.js\";\n\nexport interface UseCodeModeResult {\n /** /apply callback. Empty `indices` means \"all\"; specific 1-based indices apply only those. */\n codeApply: (indices?: readonly number[]) => string;\n /** /discard callback. Same indices semantics as codeApply. */\n codeDiscard: (indices?: readonly number[]) => string;\n}\n\nexport interface UseCodeModeOptions {\n codeMode: boolean;\n pendingEdits: MutableRefObject<EditBlock[]>;\n currentRootDir: string;\n session: string | null;\n syncPendingCount: () => void;\n recordEdit: (\n source: string,\n blocks: readonly EditBlock[],\n results: readonly ApplyResult[],\n snaps: readonly EditSnapshot[],\n ) => void;\n}\n\n/** Slash-command callbacks for `/apply` and `/discard` over the pending-edits queue. Owns the partition / snapshot / save / sync sequence; AppInner just forwards the strings to its log. */\nexport function useCodeMode(opts: UseCodeModeOptions): UseCodeModeResult {\n const { codeMode, pendingEdits, currentRootDir, session, syncPendingCount, recordEdit } = opts;\n\n const codeApply = useCallback(\n (indices?: readonly number[]): string => {\n if (!codeMode) return \"not in code mode\";\n const blocks = pendingEdits.current;\n if (blocks.length === 0) {\n return \"nothing pending — the model hasn't proposed edits since the last /apply or /discard.\";\n }\n const useSubset = indices !== undefined && indices.length > 0;\n const { selected, remaining } = useSubset\n ? partitionEdits(blocks, indices)\n : { selected: blocks, remaining: [] as EditBlock[] };\n if (selected.length === 0) {\n return \"▸ no edits matched those indices — nothing applied. Use /apply with no args to commit them all.\";\n }\n const snaps = snapshotBeforeEdits(selected, currentRootDir);\n const results = applyEditBlocks(selected, currentRootDir);\n const anyApplied = results.some((r) => r.status === \"applied\" || r.status === \"created\");\n if (anyApplied) recordEdit(\"review-apply\", selected, results, snaps);\n pendingEdits.current = remaining;\n if (remaining.length === 0) clearPendingEdits(session ?? null);\n else savePendingEdits(session ?? null, remaining);\n syncPendingCount();\n const tail =\n remaining.length > 0\n ? `\\n▸ ${remaining.length} edit block(s) still pending — /apply or /discard to clear them.`\n : \"\";\n return formatEditResults(results) + tail;\n },\n [codeMode, currentRootDir, session, syncPendingCount, recordEdit, pendingEdits],\n );\n\n const codeDiscard = useCallback(\n (indices?: readonly number[]): string => {\n const blocks = pendingEdits.current;\n if (blocks.length === 0) return \"nothing pending to discard.\";\n const useSubset = indices !== undefined && indices.length > 0;\n const { selected, remaining } = useSubset\n ? partitionEdits(blocks, indices)\n : { selected: blocks, remaining: [] as EditBlock[] };\n if (selected.length === 0) {\n return \"▸ no edits matched those indices — nothing discarded.\";\n }\n pendingEdits.current = remaining;\n if (remaining.length === 0) clearPendingEdits(session ?? null);\n else savePendingEdits(session ?? null, remaining);\n syncPendingCount();\n const tail =\n remaining.length > 0\n ? ` (${remaining.length} block(s) still pending)`\n : \". Nothing was written to disk.\";\n return `▸ discarded ${selected.length} pending edit block(s)${tail}`;\n },\n [session, syncPendingCount, pendingEdits],\n );\n\n return { codeApply, codeDiscard };\n}\n","import { useCallback, useRef } from \"react\";\n\nexport interface UseInputRecallResult {\n recallPrev: () => void;\n recallNext: () => void;\n pushHistory: (text: string) => void;\n /** Reset cursor to the \"fresh input\" position — call after a successful submit. */\n resetCursor: () => void;\n}\n\n/** Bash-style ↑/↓ recall over a turn-local prompt history. Cursor is `useRef` so toggles don't re-render. */\nexport function useInputRecall(setInput: (s: string) => void): UseInputRecallResult {\n const promptHistory = useRef<string[]>([]);\n const historyCursor = useRef<number>(-1);\n\n const recallPrev = useCallback(() => {\n const hist = promptHistory.current;\n if (hist.length === 0) return;\n const nextCursor = Math.min(historyCursor.current + 1, hist.length - 1);\n historyCursor.current = nextCursor;\n setInput(hist[hist.length - 1 - nextCursor] ?? \"\");\n }, [setInput]);\n\n const recallNext = useCallback(() => {\n if (historyCursor.current < 0) return;\n const hist = promptHistory.current;\n const nextCursor = historyCursor.current - 1;\n historyCursor.current = nextCursor;\n setInput(nextCursor < 0 ? \"\" : (hist[hist.length - 1 - nextCursor] ?? \"\"));\n }, [setInput]);\n\n const pushHistory = useCallback((text: string) => {\n promptHistory.current.push(text);\n }, []);\n\n const resetCursor = useCallback(() => {\n historyCursor.current = -1;\n }, []);\n\n return { recallPrev, recallNext, pushHistory, resetCursor };\n}\n","import { type MutableRefObject, useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Scrollback } from \"./useScrollback.js\";\n\ninterface ActiveLoop {\n prompt: string;\n intervalMs: number;\n nextFireAt: number;\n iter: number;\n}\n\nexport interface ActiveLoopSnapshot {\n prompt: string;\n intervalMs: number;\n iter: number;\n nextFireMs: number;\n}\n\nexport interface UseLoopModeResult {\n startLoop: (intervalMs: number, prompt: string) => void;\n stopLoop: () => void;\n /** Snapshot for the `/loop` (no-arg) status branch. Returns null when no loop is active. */\n getLoopStatus: () => ActiveLoopSnapshot | null;\n /** Cheap predicate — used by handleSubmit's cancel-on-user-input guard and by apply-slash-result. */\n isLoopActive: () => boolean;\n /** True only during the timer's `handleSubmit` invocation — tells handleSubmit's cancel guard to skip itself so the loop's own re-submit doesn't kill the loop. */\n isLoopFiring: () => boolean;\n /** Reset by handleSubmit at the top of every call so the firing flag is one-shot. */\n clearFiringFlag: () => void;\n /** Reactive state for the LoopStatusRow render — null when no loop is active. */\n activeLoop: ActiveLoop | null;\n}\n\nexport interface UseLoopModeOptions {\n log: Scrollback;\n busyRef: MutableRefObject<boolean>;\n /** Forward-ref to the latest `handleSubmit` — the closure shifts as state changes, so the timer dereferences fresh on each fire. */\n handleSubmitRef: MutableRefObject<((raw: string) => Promise<void>) | null>;\n}\n\n/** Owns the active /loop config + its setTimeout-based scheduler. Re-issuing /loop replaces the slot; cancellation is centralized in stopLoop. */\nexport function useLoopMode(opts: UseLoopModeOptions): UseLoopModeResult {\n const { log, busyRef, handleSubmitRef } = opts;\n const [activeLoop, setActiveLoop] = useState<ActiveLoop | null>(null);\n const activeLoopRef = useRef<ActiveLoop | null>(null);\n const loopTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const loopFiringRef = useRef<boolean>(false);\n\n useEffect(() => {\n activeLoopRef.current = activeLoop;\n }, [activeLoop]);\n\n const stopLoop = useCallback(() => {\n if (loopTimerRef.current) {\n clearTimeout(loopTimerRef.current);\n loopTimerRef.current = null;\n }\n const cur = activeLoopRef.current;\n if (!cur) return;\n setActiveLoop(null);\n log.pushInfo(`▸ loop stopped (after ${cur.iter} iter${cur.iter === 1 ? \"\" : \"s\"}).`);\n }, [log]);\n\n const startLoop = useCallback((intervalMs: number, prompt: string) => {\n if (loopTimerRef.current) {\n clearTimeout(loopTimerRef.current);\n loopTimerRef.current = null;\n }\n setActiveLoop({\n prompt,\n intervalMs,\n nextFireAt: Date.now() + intervalMs,\n iter: 0,\n });\n }, []);\n\n const getLoopStatus = useCallback((): ActiveLoopSnapshot | null => {\n const cur = activeLoopRef.current;\n if (!cur) return null;\n return {\n prompt: cur.prompt,\n intervalMs: cur.intervalMs,\n iter: cur.iter,\n nextFireMs: Math.max(0, cur.nextFireAt - Date.now()),\n };\n }, []);\n\n const isLoopActive = useCallback(() => activeLoopRef.current !== null, []);\n const isLoopFiring = useCallback(() => loopFiringRef.current, []);\n const clearFiringFlag = useCallback(() => {\n loopFiringRef.current = false;\n }, []);\n\n // /loop scheduler. Re-runs whenever activeLoop's `nextFireAt` shifts —\n // either because startLoop set a fresh schedule or because a previous\n // firing bumped the next-fire time. Cleanup clears the in-flight\n // timer so a stopLoop / replacement doesn't leak a fire after cancel.\n useEffect(() => {\n if (!activeLoop) return;\n const delay = Math.max(0, activeLoop.nextFireAt - Date.now());\n const timer = setTimeout(async () => {\n loopTimerRef.current = null;\n // Skip the firing entirely when a prior turn is still running.\n // Re-arm in 1s so the loop catches up the moment busy clears,\n // rather than waiting a full interval after a slow turn.\n if (busyRef.current) {\n setActiveLoop((cur) => (cur ? { ...cur, nextFireAt: Date.now() + 1000 } : cur));\n return;\n }\n const cur = activeLoopRef.current;\n if (!cur) return;\n const nextIter = cur.iter + 1;\n // Schedule the NEXT firing now (independent of how long this turn\n // takes). Keeps the cadence honest even when individual turns run\n // long.\n setActiveLoop((c) =>\n c ? { ...c, iter: nextIter, nextFireAt: Date.now() + cur.intervalMs } : c,\n );\n log.pushInfo(`▸ /loop iter ${nextIter} → ${cur.prompt}`);\n loopFiringRef.current = true;\n try {\n await handleSubmitRef.current?.(cur.prompt);\n } catch {\n // Persistent submission errors → kill the loop rather than spam\n // the screen. User can re-issue /loop once they fix the cause.\n stopLoop();\n } finally {\n loopFiringRef.current = false;\n }\n }, delay);\n loopTimerRef.current = timer;\n return () => clearTimeout(timer);\n }, [activeLoop, stopLoop, log, busyRef, handleSubmitRef]);\n\n return {\n startLoop,\n stopLoop,\n getLoopStatus,\n isLoopActive,\n isLoopFiring,\n clearFiringFlag,\n activeLoop,\n };\n}\n","import type { WriteStream } from \"node:fs\";\nimport { type MutableRefObject, useCallback, useEffect } from \"react\";\n\n/** Ctrl+C / SIGINT → flush transcript + `process.exit(0)`. We call `process.exit` directly rather than Ink's `exit()` because the singleton stdin reader keeps a `data` listener attached — `exit()` would unmount the React tree but leave the event loop alive and the terminal would hang. */\nexport function useQuit(transcriptRef: MutableRefObject<WriteStream | null>): () => void {\n const quitProcess = useCallback(() => {\n transcriptRef.current?.end();\n process.exit(0);\n }, [transcriptRef]);\n\n useEffect(() => {\n process.on(\"SIGINT\", quitProcess);\n return () => {\n process.off(\"SIGINT\", quitProcess);\n };\n }, [quitProcess]);\n\n return quitProcess;\n}\n","import { useMemo } from \"react\";\nimport type { DoctorCheckEntry, PlanStep, TipSection } from \"../state/cards.js\";\nimport { useDispatch } from \"../state/provider.js\";\n\nlet seq = 0;\nfunction nextId(prefix: string): string {\n seq += 1;\n return `${prefix}-${Date.now()}-${seq}`;\n}\n\nfunction formatTok(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${Math.round(n / 1_000)}K`;\n return String(n);\n}\n\nexport interface Scrollback {\n pushUser(text: string): string;\n pushWarning(title: string, message: string): string;\n pushError(title: string, message: string, stack?: string): string;\n pushInfo(\n text: string,\n tone?: \"info\" | \"ok\" | \"warn\" | \"err\" | \"ghost\" | \"brand\" | \"accent\",\n ): string;\n /** Structured onboarding-tip card — replaces multi-line TIP strings stuffed into pushInfo. */\n pushTip(args: {\n topic: string;\n sections: ReadonlyArray<TipSection>;\n footer?: string;\n oneTime?: boolean;\n }): string;\n /** Emits a `ctxPressure` live card when usedTokens crosses 80% (warn) or 95% (err) of ctxMax. */\n pushCtxPressureIfHigh(usedTokens: number, ctxMax: number): void;\n pushStepProgress(stepIndex: number, total: number, title: string, elapsedMs?: number): string;\n pushPlanAnnounce(text: string): string;\n showDoctor(checks: ReadonlyArray<DoctorCheckEntry>): string;\n /** Emits a verbose Usage card (full bars) — used by `/cost`; auto-emitted per-turn cards stay compact. */\n showUsageVerbose(args: {\n turn: number;\n promptTokens: number;\n reasonTokens: number;\n outputTokens: number;\n promptCap: number;\n cacheHit: number;\n cost: number;\n sessionCost: number;\n balance?: number;\n balanceCurrency?: string;\n elapsedMs?: number;\n }): string;\n showPlan(args: {\n title: string;\n steps: PlanStep[];\n variant: \"active\" | \"resumed\" | \"replay\";\n }): string;\n completePlanStep(stepId: string): void;\n showCtx(args: {\n text: string;\n systemTokens: number;\n toolsTokens: number;\n logTokens: number;\n inputTokens: number;\n ctxMax: number;\n toolsCount: number;\n logMessages: number;\n topTools: ReadonlyArray<{ name: string; tokens: number; turn: number }>;\n }): string;\n\n startReasoning(model?: string): string;\n appendReasoning(id: string, chunk: string): void;\n endReasoning(id: string, paragraphs: number, tokens: number, aborted?: boolean): void;\n\n startStreaming(model?: string): string;\n appendStreaming(id: string, chunk: string): void;\n endStreaming(id: string, aborted?: boolean): void;\n\n startTool(name: string, args: unknown): string;\n appendToolOutput(id: string, chunk: string): void;\n endTool(\n id: string,\n info: { output?: string; exitCode?: number; elapsedMs: number; aborted?: boolean },\n ): void;\n retryTool(id: string, attempt: number, max: number): void;\n\n thinking(): string;\n abortTurn(): void;\n endTurn(\n usage: {\n prompt: number;\n reason: number;\n output: number;\n cacheHit: number;\n cost: number;\n },\n extras?: { promptCap?: number; elapsedMs?: number },\n ): void;\n /** Wipe every card + toast — used by /clear and /new. */\n reset(): void;\n}\n\nexport function useScrollback(): Scrollback {\n const dispatch = useDispatch();\n\n return useMemo<Scrollback>(\n () => ({\n pushUser(text) {\n const id = nextId(\"u\");\n dispatch({ type: \"user.submit\", text });\n return id;\n },\n pushWarning(title, message) {\n const id = nextId(\"warn\");\n dispatch({\n type: \"live.show\",\n id,\n ts: Date.now(),\n variant: \"ctxPressure\",\n tone: \"warn\",\n text: title,\n meta: message,\n });\n return id;\n },\n pushError(title, message, stack) {\n const id = nextId(\"err\");\n dispatch({\n type: \"live.show\",\n id,\n ts: Date.now(),\n variant: \"aborted\",\n tone: \"err\",\n text: title,\n meta: stack ? `${message}\\n${stack}` : message,\n });\n return id;\n },\n pushInfo(text, tone = \"info\") {\n const id = nextId(\"info\");\n dispatch({\n type: \"live.show\",\n id,\n ts: Date.now(),\n variant: \"stepProgress\",\n tone,\n text,\n });\n return id;\n },\n pushTip({ topic, sections, footer, oneTime = true }) {\n const id = nextId(\"tip\");\n dispatch({\n type: \"tip.show\",\n id,\n ts: Date.now(),\n topic,\n sections: sections.map((s) => ({\n title: s.title,\n rows: s.rows.map((r) => ({ key: r.key, text: r.text })),\n })),\n footer,\n oneTime,\n });\n return id;\n },\n pushCtxPressureIfHigh(usedTokens, ctxMax) {\n if (ctxMax <= 0) return;\n const pct = (usedTokens / ctxMax) * 100;\n if (pct < 80) return;\n const tone: \"warn\" | \"err\" = pct >= 95 ? \"err\" : \"warn\";\n const used = formatTok(usedTokens);\n const max = formatTok(ctxMax);\n dispatch({\n type: \"live.show\",\n id: nextId(\"ctxp\"),\n ts: Date.now(),\n variant: \"ctxPressure\",\n tone,\n text: `Context ${used} / ${max} · ${pct.toFixed(0)}%`,\n meta:\n pct >= 95\n ? \"trimming oldest turns to fit; expect short-term memory loss\"\n : \"approaching the budget; older turns will be dropped past 95%\",\n });\n },\n pushStepProgress(stepIndex, total, title, elapsedMs) {\n const id = nextId(\"step\");\n const meta = elapsedMs !== undefined ? `${(elapsedMs / 1000).toFixed(1)}s · done` : \"done\";\n dispatch({\n type: \"live.show\",\n id,\n ts: Date.now(),\n variant: \"stepProgress\",\n tone: \"ok\",\n text: `Step ${stepIndex} of ${total} · ${title}`,\n meta,\n });\n return id;\n },\n pushPlanAnnounce(text) {\n const id = nextId(\"plan\");\n dispatch({\n type: \"live.show\",\n id,\n ts: Date.now(),\n variant: \"stepProgress\",\n tone: \"accent\",\n text: \"⊞ Plan submitted\",\n meta: text.slice(0, 80),\n });\n return id;\n },\n showDoctor(checks) {\n const id = nextId(\"doc\");\n dispatch({ type: \"doctor.show\", id, checks: [...checks] });\n return id;\n },\n showUsageVerbose(args) {\n const id = nextId(\"cost\");\n dispatch({\n type: \"usage.show\",\n id,\n turn: args.turn,\n tokens: {\n prompt: args.promptTokens,\n reason: args.reasonTokens,\n output: args.outputTokens,\n promptCap: args.promptCap,\n },\n cacheHit: args.cacheHit,\n cost: args.cost,\n sessionCost: args.sessionCost,\n balance: args.balance,\n balanceCurrency: args.balanceCurrency,\n elapsedMs: args.elapsedMs,\n });\n return id;\n },\n showPlan({ title, steps, variant }) {\n const id = nextId(\"plan\");\n dispatch({ type: \"plan.show\", id, title, steps, variant });\n return id;\n },\n completePlanStep(stepId) {\n dispatch({ type: \"plan.step.complete\", stepId });\n },\n showCtx(args) {\n const id = nextId(\"ctx\");\n dispatch({ type: \"ctx.show\", id, ...args, topTools: [...args.topTools] });\n return id;\n },\n startReasoning(model) {\n const id = nextId(\"r\");\n dispatch({ type: \"reasoning.start\", id, ...(model ? { model } : {}) });\n return id;\n },\n appendReasoning(id, chunk) {\n if (chunk.length > 0) dispatch({ type: \"reasoning.chunk\", id, text: chunk });\n },\n endReasoning(id, paragraphs, tokens, aborted) {\n dispatch({ type: \"reasoning.end\", id, paragraphs, tokens, aborted });\n },\n startStreaming(model) {\n const id = nextId(\"s\");\n dispatch({ type: \"streaming.start\", id, ...(model ? { model } : {}) });\n return id;\n },\n appendStreaming(id, chunk) {\n if (chunk.length > 0) dispatch({ type: \"streaming.chunk\", id, text: chunk });\n },\n endStreaming(id, aborted) {\n dispatch({ type: \"streaming.end\", id, aborted });\n },\n startTool(name, args) {\n const id = nextId(\"tool\");\n dispatch({ type: \"tool.start\", id, name, args });\n return id;\n },\n appendToolOutput(id, chunk) {\n if (chunk.length > 0) dispatch({ type: \"tool.chunk\", id, text: chunk });\n },\n endTool(id, info) {\n dispatch({\n type: \"tool.end\",\n id,\n output: info.output,\n exitCode: info.exitCode,\n elapsedMs: info.elapsedMs,\n aborted: info.aborted,\n });\n },\n retryTool(id, attempt, max) {\n dispatch({ type: \"tool.retry\", id, attempt, max });\n },\n thinking() {\n const id = nextId(\"think\");\n dispatch({ type: \"turn.thinking\" });\n return id;\n },\n abortTurn() {\n dispatch({ type: \"turn.abort\" });\n },\n endTurn(usage, extras) {\n dispatch({\n type: \"turn.end\",\n usage,\n promptCap: extras?.promptCap,\n elapsedMs: extras?.elapsedMs,\n });\n },\n reset() {\n dispatch({ type: \"session.reset\" });\n },\n }),\n [dispatch],\n );\n}\n","import React from \"react\";\nimport type { Card } from \"./cards.js\";\nimport type { AgentEvent } from \"./events.js\";\nimport type { AgentState, SessionInfo } from \"./state.js\";\nimport { type AgentStore, createStore } from \"./store.js\";\n\nconst StoreCtx = React.createContext<AgentStore | null>(null);\n\nexport function AgentStoreProvider({\n session,\n initialCards,\n children,\n}: {\n session: SessionInfo;\n initialCards?: ReadonlyArray<Card>;\n children: React.ReactNode;\n}): React.ReactElement {\n // initialCards captured at first mount — parent uses `key=session` to force a fresh provider on switch.\n const initialCardsRef = React.useRef(initialCards);\n const store = React.useMemo(() => createStore(session, initialCardsRef.current), [session]);\n return <StoreCtx.Provider value={store}>{children}</StoreCtx.Provider>;\n}\n\nexport function useAgentStore(): AgentStore {\n const store = React.useContext(StoreCtx);\n if (!store) throw new Error(\"useAgentStore must be used inside AgentStoreProvider\");\n return store;\n}\n\nexport function useAgentState<T>(selector: (state: AgentState) => T): T {\n const store = useAgentStore();\n const subscribe = React.useCallback((cb: () => void) => store.subscribe(cb), [store]);\n const getSnapshot = React.useCallback(() => selector(store.getState()), [store, selector]);\n return React.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n\nexport function useDispatch(): (event: AgentEvent) => void {\n return useAgentStore().dispatch;\n}\n","import type {\n Card,\n CardId,\n LiveCard,\n ReasoningCard,\n StreamingCard,\n ToolCard,\n UserCard,\n} from \"./cards.js\";\nimport type { AgentEvent } from \"./events.js\";\nimport type { AgentState, Toast } from \"./state.js\";\n\nexport function reduce(state: AgentState, event: AgentEvent): AgentState {\n switch (event.type) {\n case \"user.submit\":\n return appendCard(state, makeUserCard(event.text));\n\n case \"turn.start\":\n return { ...state, turnInProgress: true };\n\n case \"turn.thinking\":\n return appendCard(\n state,\n makeLiveCard(\"thinking\", `thinking · ${state.session.model}`, \"brand\"),\n );\n\n case \"reasoning.start\":\n return appendCard(state, makeReasoningCard(event.id, event.model ?? state.session.model));\n\n case \"reasoning.chunk\":\n return mutateCard(state, event.id, \"reasoning\", (c) => ({ ...c, text: c.text + event.text }));\n\n case \"reasoning.end\":\n return mutateCard(state, event.id, \"reasoning\", (c) => ({\n ...c,\n paragraphs: event.paragraphs,\n tokens: event.tokens,\n streaming: false,\n endedAt: Date.now(),\n ...(event.aborted ? { aborted: true } : {}),\n }));\n\n case \"streaming.start\":\n return appendCard(state, makeStreamingCard(event.id, event.model ?? state.session.model));\n\n case \"streaming.chunk\":\n return mutateCard(state, event.id, \"streaming\", (c) => ({ ...c, text: c.text + event.text }));\n\n case \"streaming.end\":\n return mutateCard(state, event.id, \"streaming\", (c) => ({\n ...c,\n done: true,\n endedAt: Date.now(),\n ...(event.aborted ? { aborted: true } : {}),\n }));\n\n case \"tool.start\":\n return appendCard(state, makeToolCard(event.id, event.name, event.args));\n\n case \"tool.chunk\":\n return mutateCard(state, event.id, \"tool\", (c) => ({ ...c, output: c.output + event.text }));\n\n case \"tool.end\": {\n const finalOutput = event.output ?? \"\";\n const rejected = isPlanModeRejection(finalOutput);\n return mutateCard(state, event.id, \"tool\", (c) => ({\n ...c,\n done: true,\n output: event.output ?? c.output,\n exitCode: event.exitCode,\n elapsedMs: event.elapsedMs,\n ...(event.aborted ? { aborted: true } : {}),\n ...(rejected ? { rejected: true } : {}),\n }));\n }\n\n case \"tool.retry\":\n return mutateCard(state, event.id, \"tool\", (c) => ({\n ...c,\n retry: { attempt: event.attempt, max: event.max },\n }));\n\n case \"turn.abort\":\n return {\n ...state,\n turnInProgress: false,\n composer: { ...state.composer, abortedHint: true },\n };\n\n case \"turn.end\": {\n const sessionCost = state.status.sessionCost + event.usage.cost;\n return {\n ...state,\n turnInProgress: false,\n status: {\n ...state.status,\n cost: event.usage.cost,\n sessionCost,\n cacheHit: event.usage.cacheHit,\n },\n };\n }\n\n case \"mode.change\":\n return { ...state, status: { ...state.status, mode: event.mode } };\n\n case \"network.change\":\n return {\n ...state,\n status: { ...state.status, network: event.state, networkDetail: event.detail },\n };\n\n case \"language.change\":\n return { ...state, lang: event.lang as any };\n\n case \"session.update\":\n return { ...state, status: { ...state.status, ...event.patch } };\n\n case \"session.model.change\":\n return state.session.model === event.model\n ? state\n : { ...state, session: { ...state.session, model: event.model } };\n\n case \"focus.move\":\n return {\n ...state,\n focusedCardId: moveFocus(state.cards, state.focusedCardId, event.direction),\n };\n\n case \"focus.set\":\n return { ...state, focusedCardId: event.cardId };\n\n case \"card.toggle\":\n return state;\n\n case \"composer.input\":\n return {\n ...state,\n composer: {\n ...state.composer,\n value: event.value,\n cursor: event.value.length,\n abortedHint: false,\n },\n };\n\n case \"composer.cursor\":\n return { ...state, composer: { ...state.composer, cursor: event.index } };\n\n case \"composer.history\":\n return state;\n\n case \"picker.open\":\n return { ...state, composer: { ...state.composer, picker: event.kind } };\n\n case \"picker.close\":\n return { ...state, composer: { ...state.composer, picker: null } };\n\n case \"toast.show\":\n return { ...state, toasts: [...state.toasts, makeToast(event)] };\n\n case \"toast.hide\":\n return { ...state, toasts: state.toasts.filter((t) => t.id !== event.id) };\n\n case \"live.show\":\n return appendCard(state, {\n kind: \"live\",\n id: event.id,\n ts: event.ts,\n variant: event.variant,\n tone: event.tone,\n text: event.text,\n meta: event.meta,\n });\n\n case \"tip.show\":\n return appendCard(state, {\n kind: \"tip\",\n id: event.id,\n ts: event.ts,\n topic: event.topic,\n sections: event.sections,\n footer: event.footer,\n oneTime: event.oneTime,\n });\n\n case \"session.reset\":\n return { ...state, cards: [], focusedCardId: null, toasts: [] };\n\n case \"plan.show\":\n return appendCard(state, {\n kind: \"plan\",\n id: event.id,\n ts: Date.now(),\n title: event.title,\n steps: event.steps,\n variant: event.variant,\n });\n\n case \"plan.drop\": {\n // Latest still-active plan flips to \"replay\" — preserves it in scrollback\n // but signals \"no longer the live plan\" to selectors and UI.\n let dropped = false;\n const cards = state.cards.map((c, i) => {\n if (dropped) return c;\n if (c.kind !== \"plan\" || c.variant !== \"active\") return c;\n // Walk from end — only the LAST active plan should drop.\n if (state.cards.slice(i + 1).some((cc) => cc.kind === \"plan\" && cc.variant === \"active\")) {\n return c;\n }\n dropped = true;\n return { ...c, variant: \"replay\" as const };\n });\n return dropped ? { ...state, cards } : state;\n }\n\n case \"plan.step.complete\": {\n let changed = false;\n const cards = state.cards.map((c) => {\n if (c.kind !== \"plan\") return c;\n let stepChanged = false;\n const next = c.steps.map((s) => {\n if (s.id !== event.stepId || s.status === \"done\") return s;\n stepChanged = true;\n return { ...s, status: \"done\" as const };\n });\n if (!stepChanged) return c;\n changed = true;\n return { ...c, steps: next };\n });\n return changed ? { ...state, cards } : state;\n }\n\n case \"ctx.show\":\n return appendCard(state, {\n kind: \"ctx\",\n id: event.id,\n ts: Date.now(),\n text: event.text,\n systemTokens: event.systemTokens,\n toolsTokens: event.toolsTokens,\n logTokens: event.logTokens,\n inputTokens: event.inputTokens,\n ctxMax: event.ctxMax,\n toolsCount: event.toolsCount,\n logMessages: event.logMessages,\n topTools: event.topTools,\n });\n\n case \"doctor.show\":\n return appendCard(state, {\n kind: \"doctor\",\n id: event.id,\n ts: Date.now(),\n checks: event.checks,\n });\n\n case \"usage.show\":\n return appendCard(state, {\n kind: \"usage\",\n id: event.id,\n ts: Date.now(),\n turn: event.turn,\n tokens: event.tokens,\n cacheHit: event.cacheHit,\n cost: event.cost,\n sessionCost: event.sessionCost,\n balance: event.balance,\n balanceCurrency: event.balanceCurrency,\n elapsedMs: event.elapsedMs,\n });\n }\n}\n\nfunction appendCard(state: AgentState, card: Card): AgentState {\n return { ...state, cards: [...state.cards, card] };\n}\n\nfunction mutateCard<K extends Card[\"kind\"]>(\n state: AgentState,\n id: CardId,\n kind: K,\n patch: (card: Extract<Card, { kind: K }>) => Extract<Card, { kind: K }>,\n): AgentState {\n const idx = state.cards.findIndex((c) => c.id === id && c.kind === kind);\n if (idx < 0) return state;\n const next = state.cards.slice();\n next[idx] = patch(state.cards[idx] as Extract<Card, { kind: K }>);\n return { ...state, cards: next };\n}\n\nfunction moveFocus(\n cards: ReadonlyArray<Card>,\n current: CardId | null,\n dir: \"next\" | \"prev\" | \"first\" | \"last\",\n): CardId | null {\n const last = cards.length - 1;\n if (last < 0) return null;\n if (dir === \"first\") return cards[0]!.id;\n if (dir === \"last\") return cards[last]!.id;\n const idx = current ? cards.findIndex((c) => c.id === current) : -1;\n if (idx < 0) return cards[last]!.id;\n const next = dir === \"next\" ? Math.min(idx + 1, last) : Math.max(idx - 1, 0);\n return cards[next]!.id;\n}\n\nlet toastSeq = 0;\nfunction makeToast(event: Extract<AgentEvent, { type: \"toast.show\" }>): Toast {\n toastSeq += 1;\n return {\n id: `toast-${toastSeq}`,\n tone: event.tone,\n title: event.title,\n detail: event.detail,\n bornAt: Date.now(),\n ttlMs: event.ttlMs,\n };\n}\n\nlet cardSeq = 0;\nfunction nextId(prefix: string): string {\n cardSeq += 1;\n return `${prefix}-${cardSeq}`;\n}\n\nfunction makeUserCard(text: string): UserCard {\n return { kind: \"user\", id: nextId(\"user\"), ts: Date.now(), text };\n}\n\nfunction makeReasoningCard(id: string, model?: string): ReasoningCard {\n return {\n kind: \"reasoning\",\n id,\n ts: Date.now(),\n text: \"\",\n paragraphs: 0,\n tokens: 0,\n streaming: true,\n ...(model ? { model } : {}),\n };\n}\n\nfunction makeStreamingCard(id: string, model?: string): StreamingCard {\n return {\n kind: \"streaming\",\n id,\n ts: Date.now(),\n text: \"\",\n done: false,\n ...(model ? { model } : {}),\n };\n}\n\nfunction makeToolCard(id: string, name: string, args: unknown): ToolCard {\n return {\n kind: \"tool\",\n id,\n ts: Date.now(),\n name,\n args,\n output: \"\",\n done: false,\n elapsedMs: 0,\n };\n}\n\nfunction makeLiveCard(\n variant: LiveCard[\"variant\"],\n text: string,\n tone: LiveCard[\"tone\"],\n): LiveCard {\n return { kind: \"live\", id: nextId(\"live\"), ts: Date.now(), variant, text, tone };\n}\n\n/** Detect the plan-mode bounce marker emitted by ToolRegistry.dispatch when refusing a write tool. */\nfunction isPlanModeRejection(output: string): boolean {\n if (!output) return false;\n try {\n const parsed = JSON.parse(output);\n return parsed?.rejectedReason === \"plan-mode\";\n } catch {\n return false;\n }\n}\n","import { getLanguage } from \"../../../i18n/index.js\";\nimport type { LanguageCode } from \"../../../i18n/types.js\";\nimport type { Card, CardId } from \"./cards.js\";\n\nexport type Mode = \"auto\" | \"ask\" | \"plan\" | \"edit\";\nexport type NetworkState = \"online\" | \"slow\" | \"disconnected\" | \"reconnecting\";\nexport type ToastTone = \"ok\" | \"info\" | \"warn\" | \"err\";\n\nexport interface SessionInfo {\n readonly id: string;\n readonly branch: string;\n readonly workspace: string;\n readonly model: string;\n}\n\nexport interface ComposerState {\n value: string;\n cursor: number;\n picker: \"slash\" | \"mention\" | \"history\" | \"slasharg\" | null;\n shell: boolean;\n abortedHint: boolean;\n}\n\nexport interface StatusBar {\n mode: Mode;\n network: NetworkState;\n networkDetail?: string;\n cost: number;\n sessionCost: number;\n balance?: number;\n balanceCurrency?: string;\n cacheHit: number;\n countdownSeconds?: number;\n recording?: { sizeBytes: number; events: number; path: string };\n}\n\nexport interface Toast {\n readonly id: string;\n readonly tone: ToastTone;\n readonly title: string;\n readonly detail?: string;\n readonly bornAt: number;\n readonly ttlMs: number;\n}\n\nexport interface AgentState {\n readonly lang: LanguageCode;\n readonly session: SessionInfo;\n readonly cards: ReadonlyArray<Card>;\n readonly composer: ComposerState;\n readonly status: StatusBar;\n readonly focusedCardId: CardId | null;\n readonly toasts: ReadonlyArray<Toast>;\n readonly turnInProgress: boolean;\n}\n\nexport function initialState(session: SessionInfo, cards: ReadonlyArray<Card> = []): AgentState {\n return {\n lang: getLanguage(),\n session,\n cards,\n composer: {\n value: \"\",\n cursor: 0,\n picker: null,\n shell: false,\n abortedHint: false,\n },\n status: {\n mode: \"auto\",\n network: \"online\",\n cost: 0,\n sessionCost: 0,\n cacheHit: 0,\n },\n focusedCardId: null,\n toasts: [],\n turnInProgress: false,\n };\n}\n","import type { Card } from \"./cards.js\";\nimport type { AgentEvent } from \"./events.js\";\nimport { reduce } from \"./reducer.js\";\nimport { type AgentState, type SessionInfo, initialState } from \"./state.js\";\n\nexport type StateListener = () => void;\nexport type EventListener = (event: AgentEvent) => void;\n\nexport interface AgentStore {\n getState(): AgentState;\n dispatch(event: AgentEvent): void;\n subscribe(listener: StateListener): () => void;\n onEvent(listener: EventListener): () => void;\n}\n\nexport function createStore(session: SessionInfo, initialCards?: ReadonlyArray<Card>): AgentStore {\n let state = initialState(session, initialCards);\n const stateListeners = new Set<StateListener>();\n const eventListeners = new Set<EventListener>();\n\n return {\n getState() {\n return state;\n },\n dispatch(event) {\n state = reduce(state, event);\n for (const listener of stateListeners) listener();\n for (const listener of eventListeners) listener(event);\n },\n subscribe(listener) {\n stateListeners.add(listener);\n return () => {\n stateListeners.delete(listener);\n };\n },\n onEvent(listener) {\n eventListeners.add(listener);\n return () => {\n eventListeners.delete(listener);\n };\n },\n };\n}\n","import type { WriteStream } from \"node:fs\";\nimport { type MutableRefObject, useCallback } from \"react\";\nimport type { LoopEvent } from \"../../../loop.js\";\nimport { recordFromLoopEvent, writeRecord } from \"../../../transcript/log.js\";\n\n/** Returns a `LoopEvent` writer that no-ops when no transcript was opened. Wraps `recordFromLoopEvent` + `writeRecord` so callers don't carry the model/prefix metadata. */\nexport function useTranscriptWriter(\n transcriptRef: MutableRefObject<WriteStream | null>,\n model: string,\n prefixHash: string,\n): (ev: LoopEvent) => void {\n return useCallback(\n (ev: LoopEvent) => {\n const stream = transcriptRef.current;\n if (!stream) return;\n writeRecord(stream, recordFromLoopEvent(ev, { model, prefixHash }));\n },\n [transcriptRef, model, prefixHash],\n );\n}\n","import { Box, type DOMElement, Text, useBoxMetrics } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { useEffect, useRef } from \"react\";\nimport { CardRenderer } from \"../cards/CardRenderer.js\";\nimport type { Card } from \"../state/cards.js\";\nimport { useAgentState } from \"../state/provider.js\";\nimport { FG } from \"../theme/tokens.js\";\n\n/**\n * Row-precision virtual scroll: outer Box clips with overflow=\"hidden\",\n * inner Box holds all cards and slides up via negative marginTop. Yoga\n * computes inner height from card layout; useBoxMetrics reports it back\n * so App can clamp scroll bounds. New cards arriving while the user is\n * scrolled up sit below the visible window — bytes outside outer bounds\n * aren't written, so terminal text selection survives streaming activity.\n */\nexport function CardStream({\n scrollRows,\n onMaxScrollChange,\n suppressLive = false,\n}: {\n scrollRows: number;\n onMaxScrollChange: (rows: number) => void;\n suppressLive?: boolean;\n}): React.ReactElement {\n const cards = useAgentState((s) => s.cards);\n // useBoxMetrics types its ref as RefObject<DOMElement> (non-null); the\n // null! assertion satisfies the signature — Ink populates the ref on\n // mount before the metrics hook reads it.\n const outerRef = useRef<DOMElement>(null!);\n const innerRef = useRef<DOMElement>(null!);\n const outer = useBoxMetrics(outerRef);\n const inner = useBoxMetrics(innerRef);\n const maxScroll = Math.max(0, inner.height - outer.height);\n\n useEffect(() => {\n onMaxScrollChange(maxScroll);\n }, [maxScroll, onMaxScrollChange]);\n\n let visible = cards;\n if (suppressLive && cards.length > 0 && !isFullySettled(cards[cards.length - 1]!)) {\n visible = cards.slice(0, -1);\n }\n\n return (\n <>\n {scrollRows > 0 ? <Text color={FG.faint}>{\" ↑ earlier — PgUp / wheel / ↑\"}</Text> : null}\n <Box ref={outerRef} flexDirection=\"column\" flexGrow={1} overflow=\"hidden\">\n <Box ref={innerRef} flexDirection=\"column\" marginTop={-scrollRows} flexShrink={0}>\n {visible.map((card) => (\n <CardRenderer key={card.id} card={card} />\n ))}\n </Box>\n </Box>\n </>\n );\n}\n\nfunction isFullySettled(card: Card): boolean {\n switch (card.kind) {\n case \"streaming\":\n case \"tool\":\n return card.done || !!card.aborted;\n case \"reasoning\":\n return !card.streaming || !!card.aborted;\n case \"task\":\n case \"subagent\":\n return card.status !== \"running\";\n case \"plan\":\n return card.steps.every((s) => s.status === \"done\" || s.status === \"skipped\");\n default:\n return true;\n }\n}\n","import { Box, Text } from \"ink\";\nimport React from \"react\";\nimport type { Card } from \"../state/cards.js\";\nimport { FG } from \"../theme/tokens.js\";\nimport { CtxCard } from \"./CtxCard.js\";\nimport { DiffCard } from \"./DiffCard.js\";\nimport { DoctorCard } from \"./DoctorCard.js\";\nimport { ErrorCard } from \"./ErrorCard.js\";\nimport { LiveCard } from \"./LiveCard.js\";\nimport { MemoryCard } from \"./MemoryCard.js\";\nimport { PlanCard } from \"./PlanCard.js\";\nimport { ReasoningCard } from \"./ReasoningCard.js\";\nimport { SearchCard } from \"./SearchCard.js\";\nimport { StreamingCard } from \"./StreamingCard.js\";\nimport { SubAgentCard } from \"./SubAgentCard.js\";\nimport { TaskCard } from \"./TaskCard.js\";\nimport { TipCard } from \"./TipCard.js\";\nimport { ToolCard } from \"./ToolCard.js\";\nimport { UsageCard } from \"./UsageCard.js\";\nimport { UserCard } from \"./UserCard.js\";\nimport { WarnCard } from \"./WarnCard.js\";\n\n// Memoized so the cards array re-rendering (every store update) only\n// reconciles cards whose object identity actually changed — the reducer\n// keeps prior cards reference-stable, so unchanged history skips work.\nexport const CardRenderer = React.memo(function CardRenderer({\n card,\n}: { card: Card }): React.ReactElement {\n return <Box flexDirection=\"column\">{renderCard(card)}</Box>;\n});\n\nfunction renderCard(card: Card): React.ReactElement {\n switch (card.kind) {\n case \"user\":\n return <UserCard card={card} />;\n case \"reasoning\":\n return <ReasoningCard card={card} expanded={true} />;\n case \"streaming\":\n return <StreamingCard card={card} />;\n case \"tool\":\n return <ToolCard card={card} />;\n case \"task\":\n return <TaskCard card={card} />;\n case \"plan\":\n return <PlanCard card={card} />;\n case \"diff\":\n return <DiffCard card={card} />;\n case \"error\":\n return <ErrorCard card={card} />;\n case \"warn\":\n return <WarnCard card={card} />;\n case \"usage\":\n return <UsageCard card={card} />;\n case \"memory\":\n return <MemoryCard card={card} />;\n case \"subagent\":\n return <SubAgentCard card={card} />;\n case \"search\":\n return <SearchCard card={card} />;\n case \"live\":\n return <LiveCard card={card} />;\n case \"tip\":\n return <TipCard card={card} />;\n case \"ctx\":\n return <CtxCard card={card} />;\n case \"doctor\":\n return <DoctorCard card={card} />;\n default:\n return <FallbackCard card={card} />;\n }\n}\n\nfunction FallbackCard({ card }: { card: Card }): React.ReactElement {\n return (\n <Box flexDirection=\"row\">\n <Text color={FG.faint}>{` · ${card.kind} card · not yet migrated`}</Text>\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader } from \"../primitives/CardHeader.js\";\nimport type { CtxCard as CtxCardData } from \"../state/cards.js\";\nimport { FG, TONE } from \"../theme/tokens.js\";\n\nconst BAR_CELLS = 32;\n\nfunction row(label: string, tokens: number, ratio: number, color: string): React.ReactElement {\n const filled = Math.max(0, Math.min(BAR_CELLS, Math.round(ratio * BAR_CELLS)));\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text color={FG.sub}>{label.padEnd(7)}</Text>\n <Text color={color}>{\"█\".repeat(filled)}</Text>\n <Text color={FG.faint}>{\"░\".repeat(BAR_CELLS - filled)}</Text>\n <Text bold color={FG.body}>\n {tokens.toLocaleString()}\n </Text>\n <Text color={FG.faint}>{`· ${(ratio * 100).toFixed(1)}%`}</Text>\n </Box>\n );\n}\n\nexport function CtxCard({ card }: { card: CtxCardData }): React.ReactElement {\n const cap = Math.max(1, card.ctxMax);\n const used = card.systemTokens + card.toolsTokens + card.logTokens + card.inputTokens;\n const usedPct = (used / cap) * 100;\n\n return (\n <Card tone={TONE.brand}>\n <CardHeader\n glyph=\"⌘\"\n tone={TONE.brand}\n title=\"context\"\n meta={[`${used.toLocaleString()} / ${cap.toLocaleString()} (${usedPct.toFixed(1)}%)`]}\n />\n {row(\"system\", card.systemTokens, card.systemTokens / cap, TONE.brand)}\n {row(\"tools\", card.toolsTokens, card.toolsTokens / cap, TONE.warn)}\n {row(\"log\", card.logTokens, card.logTokens / cap, TONE.ok)}\n {row(\"input\", card.inputTokens, card.inputTokens / cap, TONE.accent)}\n {card.topTools.length > 0 ? (\n <>\n <Text color={FG.faint}>\n {`top tools · ${card.toolsCount} total · ${card.logMessages} log msgs`}\n </Text>\n {card.topTools.slice(0, 5).map((t) => (\n <Box key={`${t.turn}-${t.name}`} flexDirection=\"row\" gap={1}>\n <Text color={FG.sub}>{t.name}</Text>\n <Text color={FG.faint}>{`· turn ${t.turn} · ${t.tokens.toLocaleString()}`}</Text>\n </Box>\n ))}\n </>\n ) : null}\n </Card>\n );\n}\n","import { Box } from \"ink\";\nimport React, { useContext } from \"react\";\n\n/** Settled cards (in scrollback) drop border + padding + margin so history collapses to flat lines. */\nexport const ActiveCardContext = React.createContext(true);\n\nexport interface CardProps {\n tone: string;\n children: React.ReactNode;\n}\n\nconst STRIPE_BORDER = {\n topLeft: \" \",\n top: \" \",\n topRight: \" \",\n left: \"▎\",\n right: \" \",\n bottomLeft: \" \",\n bottom: \" \",\n bottomRight: \" \",\n} as const;\n\nexport function Card({ tone, children }: CardProps): React.ReactElement {\n const active = useContext(ActiveCardContext);\n if (!active) {\n return <Box flexDirection=\"column\">{children}</Box>;\n }\n return (\n <Box\n flexDirection=\"column\"\n borderStyle={STRIPE_BORDER}\n borderColor={tone}\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n paddingLeft={1}\n marginTop={1}\n width=\"100%\"\n >\n {children}\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\nimport React, { useContext } from \"react\";\nimport { FG } from \"../theme/tokens.js\";\nimport { ActiveCardContext } from \"./Card.js\";\n\nexport type MetaItem = string | { text: string; color: string };\n\nexport interface CardHeaderProps {\n glyph: string;\n tone: string;\n title: string;\n /** Override the default tone-colored bold title (e.g. demoted cards use FG.sub). */\n titleColor?: string;\n /** When set, render the title as a backgrounded pill (e.g. `▎ ◆ reasoning ` with a tinted block). */\n titleBg?: string;\n /** Body-tone text after the title, separated by a space (no `·`). */\n subtitle?: string;\n /** Faint trailing fields, prefixed with ` · ` and joined by ` · `. */\n meta?: ReadonlyArray<MetaItem>;\n /** Inline ad-hoc element after meta — for spinners, badges, anything outside the meta vocabulary. */\n right?: React.ReactNode;\n}\n\nexport function CardHeader({\n glyph,\n tone,\n title,\n titleColor,\n titleBg,\n subtitle,\n meta,\n right,\n}: CardHeaderProps): React.ReactElement {\n const active = useContext(ActiveCardContext);\n // Settled scrollback drops faint string meta + spinners; colored badges (rejected, retry) stay.\n const visibleMeta = active ? meta : meta?.filter((item) => typeof item !== \"string\");\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text color={tone}>{glyph}</Text>\n {titleBg ? (\n <Text backgroundColor={titleBg} color={titleColor ?? tone} bold>\n {` ${title} `}\n </Text>\n ) : (\n <Text bold color={titleColor ?? tone}>\n {title}\n </Text>\n )}\n {subtitle ? <Text color={FG.body}>{subtitle}</Text> : null}\n {visibleMeta?.map((item, i) => {\n const isStr = typeof item === \"string\";\n const text = isStr ? item : item.text;\n const color = isStr ? FG.faint : item.color;\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey: meta items are positional\n <React.Fragment key={`m-${i}`}>\n <Text color={FG.faint}>·</Text>\n <Text color={color}>{text}</Text>\n </React.Fragment>\n );\n })}\n {active ? right : null}\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader } from \"../primitives/CardHeader.js\";\nimport type { DiffCard as DiffCardData } from \"../state/cards.js\";\nimport { FG, TONE } from \"../theme/tokens.js\";\n\nconst LINE_COLOR = {\n ctx: FG.sub,\n add: TONE.ok,\n del: TONE.err,\n fold: FG.faint,\n} as const;\n\nconst LINE_GLYPH = {\n ctx: \" \",\n add: \"+\",\n del: \"-\",\n fold: \"⋮\",\n} as const;\n\nexport function DiffCard({ card }: { card: DiffCardData }): React.ReactElement {\n const showFooter = card.hunks.length > 0;\n return (\n <Card tone={TONE.ok}>\n <CardHeader\n glyph=\"±\"\n tone={TONE.ok}\n title={card.file}\n titleColor={FG.body}\n meta={[\n { text: `+${card.stats.add}`, color: TONE.ok },\n { text: `-${card.stats.del}`, color: TONE.err },\n ]}\n />\n {card.hunks.map((hunk) => (\n <Box key={`${card.id}:${hunk.header}`} flexDirection=\"column\">\n <Text italic color={FG.faint}>\n {hunk.header}\n </Text>\n {hunk.lines.map((line, li) => (\n <Box key={`${card.id}:${hunk.header}:${li}`} flexDirection=\"row\" gap={1}>\n <Text color={LINE_COLOR[line.kind]}>{LINE_GLYPH[line.kind]}</Text>\n <Text color={LINE_COLOR[line.kind]} dimColor={line.kind === \"ctx\"}>\n {line.text}\n </Text>\n </Box>\n ))}\n </Box>\n ))}\n {showFooter && (\n <Box flexDirection=\"row\" gap={2}>\n <Text bold color={TONE.ok}>\n [a] apply\n </Text>\n <Text color={FG.sub}>[s] skip</Text>\n <Text bold color={TONE.err}>\n [r] reject\n </Text>\n </Box>\n )}\n </Card>\n );\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader } from \"../primitives/CardHeader.js\";\nimport type { DoctorCard as DoctorCardData, DoctorCheckEntry } from \"../state/cards.js\";\nimport { useThemeTokens } from \"../theme/context.js\";\nimport { CARD } from \"../theme/tokens.js\";\n\nconst LEVEL_GLYPH: Record<DoctorCheckEntry[\"level\"], string> = {\n ok: \"✓\",\n warn: \"⚠\",\n fail: \"✖\",\n};\n\nconst LEVEL_TAG: Record<DoctorCheckEntry[\"level\"], string> = {\n ok: \"OK\",\n warn: \"warn\",\n fail: \"FAIL\",\n};\n\nexport function DoctorCard({ card }: { card: DoctorCardData }): React.ReactElement {\n const { fg, tone } = useThemeTokens();\n const levelColor: Record<DoctorCheckEntry[\"level\"], string> = {\n ok: tone.ok,\n warn: tone.warn,\n fail: tone.err,\n };\n const ok = card.checks.filter((c) => c.level === \"ok\").length;\n const warn = card.checks.filter((c) => c.level === \"warn\").length;\n const fail = card.checks.filter((c) => c.level === \"fail\").length;\n const labelWidth = card.checks.reduce((m, c) => Math.max(m, c.label.length), 0);\n const summary = `${card.checks.length} checks · ${ok} passed${warn > 0 ? ` · ${warn} warn` : \"\"}${fail > 0 ? ` · ${fail} fail` : \"\"}`;\n\n return (\n <Card tone={CARD.tool.color}>\n <CardHeader glyph=\"⚕\" tone={CARD.tool.color} title=\"doctor\" meta={[summary]} />\n {card.checks.map((c) => (\n <Box key={c.label} flexDirection=\"row\" gap={1}>\n <Text color={levelColor[c.level]}>{LEVEL_GLYPH[c.level]}</Text>\n <Text bold color={fg.body}>\n {c.label.padEnd(labelWidth + 1)}\n </Text>\n <Text color={fg.sub}>{c.detail}</Text>\n <Text color={levelColor[c.level]}>{LEVEL_TAG[c.level]}</Text>\n </Box>\n ))}\n </Card>\n );\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader } from \"../primitives/CardHeader.js\";\nimport type { ErrorCard as ErrorCardData } from \"../state/cards.js\";\nimport { FG, TONE } from \"../theme/tokens.js\";\n\nconst STACK_TAIL = 5;\n\nexport function ErrorCard({ card }: { card: ErrorCardData }): React.ReactElement {\n const retryNote =\n card.retries !== undefined && card.retries > 0\n ? `${card.retries} retr${card.retries === 1 ? \"y\" : \"ies\"}`\n : null;\n const stackLines = card.stack ? card.stack.split(\"\\n\") : [];\n const stackTrunc = stackLines.length > STACK_TAIL;\n const stackVisible = stackTrunc ? stackLines.slice(-STACK_TAIL) : stackLines;\n const stackHidden = stackTrunc ? stackLines.length - stackVisible.length : 0;\n const hasStack = stackVisible.length > 0;\n const messageLines = card.message.split(\"\\n\");\n\n return (\n <Card tone={TONE.err}>\n <CardHeader\n glyph=\"✖\"\n tone={TONE.err}\n title={card.title || \"error\"}\n meta={retryNote ? [retryNote] : undefined}\n />\n {messageLines.map((line, i) => (\n <Text key={`${card.id}:msg:${i}`} color={TONE.err}>\n {line || \" \"}\n </Text>\n ))}\n {hasStack ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={FG.meta}>stack trace</Text>\n {stackHidden > 0 ? (\n <Text color={FG.faint}>\n {`⋮ ${stackHidden} earlier stack line${stackHidden === 1 ? \"\" : \"s\"} hidden`}\n </Text>\n ) : null}\n {stackVisible.map((line, i) => (\n <Text key={`${card.id}:stk:${stackHidden + i}`} color={FG.meta}>\n {line || \" \"}\n </Text>\n ))}\n </Box>\n ) : null}\n </Card>\n );\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { Spinner } from \"../primitives/Spinner.js\";\nimport type { LiveCard as LiveCardData } from \"../state/cards.js\";\nimport { FG, TONE } from \"../theme/tokens.js\";\n\nconst TONE_TO_COLOR = {\n ok: TONE.ok,\n warn: TONE.warn,\n err: TONE.err,\n info: TONE.info,\n brand: TONE.brand,\n accent: TONE.accent,\n ghost: FG.meta,\n} as const;\n\nconst VARIANT_GLYPH = {\n thinking: null,\n undo: \"↶\",\n ctxPressure: \"⚠\",\n aborted: \"—\",\n retry: \"↻\",\n checkpoint: \"⛁\",\n stepProgress: \"✓\",\n mcpEvent: \"⌘\",\n sessionOp: \"◍\",\n} as const;\n\nexport function LiveCard({ card }: { card: LiveCardData }): React.ReactElement {\n const color = TONE_TO_COLOR[card.tone];\n const glyph = VARIANT_GLYPH[card.variant];\n return (\n <Box paddingLeft={2} flexDirection=\"row\" gap={1}>\n {card.variant === \"thinking\" ? (\n <Spinner kind=\"circle\" color={color} bold />\n ) : (\n <Text bold color={color}>\n {glyph}\n </Text>\n )}\n <Text color={FG.body}>{card.text}</Text>\n {card.meta !== undefined ? <Text color={FG.faint}>{`· ${card.meta}`}</Text> : null}\n </Box>\n );\n}\n","import { Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { useTick } from \"../ticker.js\";\n\nconst FRAMES = {\n circle: [\"◐\", \"◓\", \"◑\", \"◒\"] as const,\n braille: [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\"] as const,\n};\n\nexport interface SpinnerProps {\n kind?: keyof typeof FRAMES;\n color?: string;\n bold?: boolean;\n}\n\nexport function Spinner({ kind = \"circle\", color, bold }: SpinnerProps): React.ReactElement {\n const frames = FRAMES[kind];\n const tick = useTick();\n const frame = tick % frames.length;\n\n return (\n <Text bold={bold} color={color}>\n {frames[frame]}\n </Text>\n );\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader } from \"../primitives/CardHeader.js\";\nimport type { MemoryCard as MemoryCardData, MemoryEntry } from \"../state/cards.js\";\nimport { FG, TONE } from \"../theme/tokens.js\";\n\nconst CATEGORY_ORDER: ReadonlyArray<MemoryEntry[\"category\"]> = [\n \"user\",\n \"feedback\",\n \"project\",\n \"reference\",\n];\n\nconst CATEGORY_LABEL: Record<MemoryEntry[\"category\"], string> = {\n user: \"user\",\n feedback: \"feedback\",\n project: \"project\",\n reference: \"reference\",\n};\n\nconst CATEGORY_GLYPH: Record<MemoryEntry[\"category\"], string> = {\n user: \"◇\",\n feedback: \"✦\",\n project: \"◇\",\n reference: \"→\",\n};\n\nconst CATEGORY_GLYPH_COLOR: Record<MemoryEntry[\"category\"], string> = {\n user: FG.meta,\n feedback: TONE.warn,\n project: FG.meta,\n reference: TONE.info,\n};\n\nexport function MemoryCard({ card }: { card: MemoryCardData }): React.ReactElement {\n const counts = countByCategory(card.entries);\n const summary = CATEGORY_ORDER.filter((c) => counts[c] > 0)\n .map((c) => `${counts[c]} ${c}`)\n .join(\" · \");\n const tokens =\n card.tokens > 1024 ? `~${(card.tokens / 1024).toFixed(1)}K tok` : `~${card.tokens} tok`;\n return (\n <Card tone={FG.meta}>\n <CardHeader\n glyph=\"⌑\"\n tone={FG.meta}\n title=\"context\"\n titleColor={FG.sub}\n meta={summary ? [summary, tokens] : [tokens]}\n />\n {CATEGORY_ORDER.filter((c) => counts[c] > 0).map((category) => {\n const all = card.entries.filter((e) => e.category === category);\n const shown = all.slice(0, 5);\n const remaining = all.length - shown.length;\n return (\n <Box key={category} flexDirection=\"column\">\n <Text color={FG.faint}>{`${CATEGORY_LABEL[category]} (${counts[category]})`}</Text>\n {shown.map((entry) => (\n <Box key={`${category}:${entry.summary}`} flexDirection=\"row\" gap={1}>\n <Text color={CATEGORY_GLYPH_COLOR[category]}>{CATEGORY_GLYPH[category]}</Text>\n <Text color={FG.sub}>{entry.summary}</Text>\n </Box>\n ))}\n {remaining > 0 ? <Text color={FG.faint}>{`⋮ +${remaining} more`}</Text> : null}\n </Box>\n );\n })}\n </Card>\n );\n}\n\nfunction countByCategory(\n entries: ReadonlyArray<MemoryEntry>,\n): Record<MemoryEntry[\"category\"], number> {\n const out: Record<MemoryEntry[\"category\"], number> = {\n user: 0,\n feedback: 0,\n project: 0,\n reference: 0,\n };\n for (const e of entries) out[e.category] += 1;\n return out;\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader } from \"../primitives/CardHeader.js\";\nimport type { PlanCard as PlanCardData, PlanStep } from \"../state/cards.js\";\nimport { useThemeTokens } from \"../theme/context.js\";\n\nconst STATUS_GLYPH: Record<PlanStep[\"status\"], string> = {\n queued: \"○\",\n running: \"▶\",\n done: \"✓\",\n failed: \"✗\",\n blocked: \"!\",\n skipped: \"s\",\n};\n\nconst VISIBLE_WINDOW = 5;\n\nexport function PlanCard({ card }: { card: PlanCardData }): React.ReactElement {\n const { fg, tone, toneActive } = useThemeTokens();\n const statusColor: Record<PlanStep[\"status\"], string> = {\n queued: fg.faint,\n running: toneActive.brand,\n done: tone.ok,\n failed: tone.err,\n blocked: tone.warn,\n skipped: fg.faint,\n };\n const doneCount = card.steps.filter((s) => s.status === \"done\").length;\n const variantTag =\n card.variant === \"resumed\" ? \"resumed · \" : card.variant === \"replay\" ? \"⏪ archive · \" : \"\";\n const progress = `${variantTag}${doneCount}/${card.steps.length} done`;\n const hasRunning = card.steps.some((s) => s.status === \"running\");\n const cardTone = hasRunning ? toneActive.accent : tone.accent;\n\n const window = pickWindow(card.steps);\n\n return (\n <Card tone={cardTone}>\n <CardHeader glyph=\"⊞\" tone={cardTone} title={card.title} meta={[progress]} />\n {window.hiddenBefore > 0 ? (\n <Box flexDirection=\"row\" gap={1}>\n <Text color={tone.ok}>✓</Text>\n <Text color={fg.faint}>{`⋯ ${window.hiddenBefore} done`}</Text>\n </Box>\n ) : null}\n {window.steps.map((step) => {\n const isActive = step.status === \"running\";\n const titleColor = isActive ? fg.strong : fg.sub;\n return (\n <Box key={step.id} flexDirection=\"row\" gap={1}>\n <Text color={statusColor[step.status]}>{STATUS_GLYPH[step.status]}</Text>\n <Text bold={isActive} color={titleColor}>\n {`${step.indexLabel}. ${step.title}`}\n </Text>\n {isActive ? <Text color={toneActive.brand}>← in progress</Text> : null}\n </Box>\n );\n })}\n {window.hiddenAfter > 0 ? (\n <Box flexDirection=\"row\" gap={1}>\n <Text color={fg.faint}>○</Text>\n <Text color={fg.faint}>{`⋯ ${window.hiddenAfter} upcoming`}</Text>\n </Box>\n ) : null}\n </Card>\n );\n}\n\ninterface WindowedStep extends PlanStep {\n indexLabel: number;\n}\n\ninterface StepWindow {\n steps: WindowedStep[];\n hiddenBefore: number;\n hiddenAfter: number;\n}\n\n/** Fixed window keeps the live strip's height constant — variable-height plan cards in the live region cause Yoga to thrash on every step transition. */\nfunction pickWindow(steps: ReadonlyArray<PlanStep>): StepWindow {\n if (steps.length <= VISIBLE_WINDOW) {\n return {\n steps: steps.map((s, i) => ({ ...s, indexLabel: i + 1 })),\n hiddenBefore: 0,\n hiddenAfter: 0,\n };\n }\n const anchor = anchorIndex(steps);\n const start = Math.max(0, Math.min(anchor, steps.length - VISIBLE_WINDOW));\n const end = start + VISIBLE_WINDOW;\n return {\n steps: steps.slice(start, end).map((s, i) => ({ ...s, indexLabel: start + i + 1 })),\n hiddenBefore: start,\n hiddenAfter: Math.max(0, steps.length - end),\n };\n}\n\nfunction anchorIndex(steps: ReadonlyArray<PlanStep>): number {\n const runningIdx = steps.findIndex((s) => s.status === \"running\");\n if (runningIdx >= 0) return runningIdx;\n const firstPending = steps.findIndex((s) => s.status === \"queued\" || s.status === \"blocked\");\n if (firstPending >= 0) return firstPending;\n return Math.max(0, steps.length - VISIBLE_WINDOW);\n}\n","import { Box, Text, useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { clipToCells, wrapToCells } from \"../../../frame/width.js\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader, type MetaItem } from \"../primitives/CardHeader.js\";\nimport { CursorBlock } from \"../primitives/CursorBlock.js\";\nimport { PILL_MODEL, PILL_SECTION, Pill, modelBadgeFor } from \"../primitives/Pill.js\";\nimport { Spinner } from \"../primitives/Spinner.js\";\nimport type { ReasoningCard as ReasoningCardData } from \"../state/cards.js\";\nimport { FG, TONE, TONE_ACTIVE } from \"../theme/tokens.js\";\n\n/** Streaming preview tail length — wide enough to feel responsive, small enough not to thrash on every chunk. Full body lives in the events log. */\nconst STREAMING_PREVIEW_LINES = 4;\n/** Once settled, only the conclusion is actionable; the rest is in `/reasoning last`. */\nconst SETTLED_TAIL_LINES = 2;\n\nexport function ReasoningCard({\n card,\n expanded,\n}: {\n card: ReasoningCardData;\n expanded: boolean;\n}): React.ReactElement {\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const lineCells = Math.max(20, cols - 4);\n\n const allLines = card.text.length > 0 ? card.text.split(\"\\n\") : [];\n const showBody = expanded && (allLines.length > 0 || card.streaming);\n const tone = card.aborted ? TONE.err : card.streaming ? TONE_ACTIVE.accent : TONE.accent;\n\n return (\n <Card tone={tone}>\n <ReasoningHeader card={card} />\n {showBody &&\n (card.streaming ? (\n <StreamingPreview card={card} allLines={allLines} lineCells={lineCells} />\n ) : (\n <SettledPreview card={card} allLines={allLines} lineCells={lineCells} />\n ))}\n </Card>\n );\n}\n\nfunction ReasoningHeader({ card }: { card: ReasoningCardData }): React.ReactElement {\n const streamingActive = card.streaming && !card.aborted;\n const headColor = card.aborted ? TONE.err : streamingActive ? TONE_ACTIVE.accent : TONE.accent;\n const glyph = streamingActive ? \"◇\" : \"◆\";\n const title = streamingActive ? \"reasoning…\" : card.aborted ? \"reasoning (aborted)\" : \"reasoning\";\n const meta: MetaItem[] = [];\n const m = headerMeta(card);\n if (m) meta.push(m);\n const duration = headerDuration(card);\n if (duration) meta.push(duration);\n const modelBadge = card.model ? modelBadgeFor(card.model) : null;\n return (\n <CardHeader\n glyph={glyph}\n tone={headColor}\n title={title}\n titleColor={PILL_SECTION.reason.fg}\n titleBg={PILL_SECTION.reason.bg}\n meta={meta.length > 0 ? meta : undefined}\n right={\n <>\n {streamingActive ? <Spinner kind=\"braille\" color={TONE_ACTIVE.accent} /> : null}\n {modelBadge ? (\n <Pill label={modelBadge.label} {...PILL_MODEL[modelBadge.kind]} bold={false} />\n ) : null}\n </>\n }\n />\n );\n}\n\nfunction headerMeta(card: ReasoningCardData): string {\n if (card.streaming) {\n return card.tokens > 0 ? `${card.tokens.toLocaleString()} tok` : \"\";\n }\n const parts: string[] = [];\n if (card.tokens > 0) parts.push(`${card.tokens.toLocaleString()} tok`);\n if (card.paragraphs > 0) parts.push(`${card.paragraphs} ¶`);\n return parts.join(\" · \");\n}\n\nfunction headerDuration(card: ReasoningCardData): string {\n if (card.streaming || !card.endedAt) return \"\";\n const seconds = Math.max(0, (card.endedAt - card.ts) / 1000);\n return `${seconds.toFixed(1)}s`;\n}\n\ninterface BodyProps {\n card: ReasoningCardData;\n allLines: string[];\n lineCells: number;\n}\n\nfunction StreamingPreview({ card, allLines, lineCells }: BodyProps): React.ReactElement {\n const visualLines = allLines.flatMap((l) => wrapToCells(l, lineCells));\n const visible = visualLines.slice(-STREAMING_PREVIEW_LINES);\n return <BodyLines card={card} lines={visible} lineCells={lineCells} cursorOnLast />;\n}\n\nfunction SettledPreview({ card, allLines, lineCells }: BodyProps): React.ReactElement {\n const visualLines = allLines.flatMap((l) => wrapToCells(l, lineCells));\n const visible = visualLines.slice(-SETTLED_TAIL_LINES);\n const droppedLines = Math.max(0, visualLines.length - visible.length);\n return (\n <>\n {droppedLines > 0 ? <ElisionHint droppedLines={droppedLines} card={card} /> : null}\n <BodyLines card={card} lines={visible} lineCells={lineCells} indexOffset={droppedLines} />\n </>\n );\n}\n\ninterface BodyLinesProps {\n card: ReasoningCardData;\n lines: string[];\n lineCells: number;\n cursorOnLast?: boolean;\n indexOffset?: number;\n}\n\nfunction BodyLines({\n card,\n lines,\n lineCells,\n cursorOnLast = false,\n indexOffset = 0,\n}: BodyLinesProps): React.ReactElement {\n return (\n <>\n {lines.map((line, i) => {\n const isLast = i === lines.length - 1;\n return (\n <Box key={`${card.id}:b:${indexOffset + i}`} flexDirection=\"row\">\n <Text italic color={FG.meta}>\n {clipToCells(line, lineCells)}\n </Text>\n {isLast && cursorOnLast && <CursorBlock />}\n </Box>\n );\n })}\n </>\n );\n}\n\nfunction ElisionHint({\n droppedLines,\n card,\n}: {\n droppedLines: number;\n card: ReasoningCardData;\n}): React.ReactElement {\n const parts: string[] = [];\n if (card.paragraphs > 1) {\n parts.push(`${card.paragraphs} ¶`);\n } else {\n parts.push(`${droppedLines} line${droppedLines === 1 ? \"\" : \"s\"}`);\n }\n if (card.tokens > 0) parts.push(`${card.tokens.toLocaleString()} tok`);\n return <Text color={FG.faint}>{`⋯ ${parts.join(\" · \")} above · /reasoning last`}</Text>;\n}\n","import stringWidthLib from \"string-width\";\n\nconst segmenter = new Intl.Segmenter(\"en\", { granularity: \"grapheme\" });\n\n/** Grapheme split — keeps ZWJ emoji + combining marks intact. */\nexport function graphemes(s: string): string[] {\n return Array.from(segmenter.segment(s), (seg) => seg.segment);\n}\n\n/** Clamp into {0,1,2} — Frame grid only knows narrow + wide cells. */\nexport function graphemeWidth(g: string): 0 | 1 | 2 {\n if (g.length === 0) return 0;\n const w = stringWidthLib(g);\n if (w <= 0) return 0;\n if (w >= 2) return 2;\n return 1;\n}\n\n/** Total visual width of a string. Direct passthrough to `string-width`. */\nexport function stringWidth(s: string): number {\n return stringWidthLib(s);\n}\n\n/** Clip to `maxCells` visual cells; appends `…` if cut. Grapheme-safe. */\nexport function clipToCells(s: string, maxCells: number): string {\n if (maxCells <= 0) return \"\";\n if (stringWidthLib(s) <= maxCells) return s;\n const cap = maxCells - 1;\n let out = \"\";\n let cells = 0;\n for (const g of graphemes(s)) {\n const w = graphemeWidth(g);\n if (cells + w > cap) break;\n out += g;\n cells += w;\n }\n return `${out}…`;\n}\n\n/** Wrap to `maxCells`-wide chunks for tail-window semantics — caller can `slice(-N)` to pull true visual last lines. Empty input yields one empty chunk so paragraph breaks survive the round-trip. */\nexport function wrapToCells(s: string, maxCells: number): string[] {\n if (maxCells <= 0) return [];\n if (s.length === 0) return [\"\"];\n const out: string[] = [];\n let cur = \"\";\n let cells = 0;\n for (const g of graphemes(s)) {\n const w = graphemeWidth(g);\n if (cells + w > maxCells) {\n out.push(cur);\n cur = g;\n cells = w;\n } else {\n cur += g;\n cells += w;\n }\n }\n if (cur.length > 0 || out.length === 0) out.push(cur);\n return out;\n}\n","import { Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { CARD } from \"../theme/tokens.js\";\nimport { useTick } from \"../ticker.js\";\n\nexport function CursorBlock(): React.ReactElement {\n const tick = useTick();\n const on = Math.floor(tick / 4) % 2 === 0;\n return (\n <Text inverse={on} color={CARD.streaming.color}>\n {\" \"}\n </Text>\n );\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader } from \"../primitives/CardHeader.js\";\nimport type { SearchCard as SearchCardData, SearchHit } from \"../state/cards.js\";\nimport { FG, TONE } from \"../theme/tokens.js\";\n\nexport function SearchCard({ card }: { card: SearchCardData }): React.ReactElement {\n const fileCount = new Set(card.hits.map((h) => h.file)).size;\n const elapsed = `${(card.elapsedMs / 1000).toFixed(2)}s`;\n const stats = `${card.hits.length} hit${card.hits.length === 1 ? \"\" : \"s\"} · ${fileCount} file${\n fileCount === 1 ? \"\" : \"s\"\n }`;\n\n const grouped = groupByFile(card.hits.slice(0, 10));\n\n return (\n <Card tone={TONE.info}>\n <CardHeader\n glyph=\"⊙\"\n tone={TONE.info}\n title=\"search\"\n subtitle={`\"${card.query}\"`}\n meta={[stats, elapsed]}\n />\n {grouped.map(([file, hits]) => (\n <Box key={file} flexDirection=\"column\">\n <Text bold color={FG.strong}>\n {file}\n </Text>\n {hits.map((h, i) => (\n <Box key={`${file}:${h.line}:${i}`} flexDirection=\"row\" gap={1}>\n <Text color={FG.faint}>{`${h.line.toString().padStart(4)} │`}</Text>\n <HighlightedLine text={h.preview} start={h.matchStart} end={h.matchEnd} />\n </Box>\n ))}\n </Box>\n ))}\n {card.hits.length > 10 ? (\n <Text color={FG.faint}>{`⋮ +${card.hits.length - 10} more hits`}</Text>\n ) : null}\n </Card>\n );\n}\n\nfunction HighlightedLine({\n text,\n start,\n end,\n}: {\n text: string;\n start: number;\n end: number;\n}): React.ReactElement {\n if (start < 0 || end <= start || end > text.length) {\n return <Text color={FG.sub}>{text}</Text>;\n }\n return (\n <>\n <Text color={FG.sub}>{text.slice(0, start)}</Text>\n <Text bold inverse>\n {text.slice(start, end)}\n </Text>\n <Text color={FG.sub}>{text.slice(end)}</Text>\n </>\n );\n}\n\nfunction groupByFile(hits: ReadonlyArray<SearchHit>): Array<[string, SearchHit[]]> {\n const map = new Map<string, SearchHit[]>();\n for (const h of hits) {\n const list = map.get(h.file) ?? [];\n list.push(h);\n map.set(h.file, list);\n }\n return Array.from(map.entries());\n}\n","import { Box, Text, useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { useContext } from \"react\";\nimport { clipToCells, wrapToCells } from \"../../../frame/width.js\";\nimport { countTokens } from \"../../../tokenizer.js\";\nimport { LiveExpandContext } from \"../layout/LiveExpandContext.js\";\nimport { useReserveRows } from \"../layout/viewport-budget.js\";\nimport { Markdown } from \"../markdown.js\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader } from \"../primitives/CardHeader.js\";\nimport { PILL_MODEL, Pill, modelBadgeFor } from \"../primitives/Pill.js\";\nimport { Spinner } from \"../primitives/Spinner.js\";\nimport type { StreamingCard as StreamingCardData } from \"../state/cards.js\";\nimport { FG, TONE, TONE_ACTIVE } from \"../theme/tokens.js\";\nimport { useSlowTick } from \"../ticker.js\";\n\n/** Streaming preview tail length — bounded live region so chunks don't thrash whole-card layout. */\nconst STREAMING_PREVIEW_LINES = 4;\n/** Expanded mode shows up to this many lines so the card can't swallow the whole viewport. */\nconst EXPANDED_MAX_LINES = 60;\n\nconst MIN_ELAPSED_MS_FOR_RATE = 500;\nconst MIN_TOKENS_FOR_RATE = 4;\n\nfunction formatTokenCount(n: number): string {\n if (n >= 10000) return `${(n / 1000).toFixed(1)}k`;\n if (n >= 1000) return `${(n / 1000).toFixed(2)}k`;\n return String(n);\n}\n\nfunction tokenRate(\n text: string,\n startTs: number,\n endTs: number,\n): { tokens: number; tps: number | null } {\n const tokens = countTokens(text);\n const elapsedMs = endTs - startTs;\n if (elapsedMs < MIN_ELAPSED_MS_FOR_RATE || tokens < MIN_TOKENS_FOR_RATE) {\n return { tokens, tps: null };\n }\n return { tokens, tps: Math.round((tokens * 1000) / elapsedMs) };\n}\n\nconst PILL_RATE = { bg: \"#11141a\", fg: \"#8b949e\" } as const;\n\nexport function StreamingCard({ card }: { card: StreamingCardData }): React.ReactElement {\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const expanded = useContext(LiveExpandContext);\n const reserveCap = expanded ? EXPANDED_MAX_LINES + 2 : STREAMING_PREVIEW_LINES + 2;\n useReserveRows(\"stream\", {\n min: STREAMING_PREVIEW_LINES + 1,\n max: reserveCap,\n });\n // Re-render at 1Hz so the rate keeps updating even when chunks stall.\n // Frozen once `card.done` is true — settled cards render via Static.\n useSlowTick();\n\n const modelBadge = card.model ? modelBadgeFor(card.model) : null;\n const modelPill = modelBadge ? (\n <Pill label={modelBadge.label} {...PILL_MODEL[modelBadge.kind]} bold={false} />\n ) : null;\n\n if (card.done && !card.aborted) {\n const { tokens, tps } = tokenRate(card.text, card.ts, card.endedAt ?? Date.now());\n const ratePill =\n tokens >= MIN_TOKENS_FOR_RATE && tps !== null ? (\n <Pill label={`${formatTokenCount(tokens)} tok · ${tps} t/s`} {...PILL_RATE} bold={false} />\n ) : null;\n return (\n <Card tone={TONE.ok}>\n <CardHeader\n glyph=\"‹\"\n tone={TONE.ok}\n title=\"reply\"\n right={\n <>\n {ratePill}\n {modelPill}\n </>\n }\n />\n <Markdown text={card.text} />\n </Card>\n );\n }\n\n const lineCells = Math.max(20, cols - 4);\n const allLines = card.text.length > 0 ? card.text.split(\"\\n\") : [\"\"];\n const visualLines = allLines.flatMap((l) => wrapToCells(l, lineCells));\n const cap = expanded ? EXPANDED_MAX_LINES : STREAMING_PREVIEW_LINES;\n const visible = visualLines.slice(-cap);\n const droppedAbove = Math.max(0, visualLines.length - visible.length);\n const aborted = !!card.aborted;\n const headColor = aborted ? TONE.err : TONE_ACTIVE.brand;\n const glyph = aborted ? \"‹\" : \"◈\";\n const headLabel = aborted ? \"aborted\" : \"writing…\";\n\n const { tokens: liveTokens, tps: liveTps } = tokenRate(card.text, card.ts, Date.now());\n const liveRatePill =\n !aborted && liveTokens >= MIN_TOKENS_FOR_RATE && liveTps !== null ? (\n <Pill label={`${liveTps} t/s`} {...PILL_RATE} bold={false} />\n ) : null;\n const expandPill = !aborted ? (\n <Pill label={expanded ? \"expanded ⌃o\" : \"preview ⌃o\"} {...PILL_RATE} bold={false} />\n ) : null;\n\n return (\n <Card tone={headColor}>\n <CardHeader\n glyph={glyph}\n tone={headColor}\n title={headLabel}\n right={\n <>\n {liveRatePill}\n {expandPill}\n {aborted ? null : <Spinner kind=\"braille\" color={TONE_ACTIVE.brand} />}\n {modelPill}\n </>\n }\n />\n {expanded && droppedAbove > 0 ? (\n <Text\n color={FG.faint}\n >{`⋯ ${droppedAbove} earlier line${droppedAbove === 1 ? \"\" : \"s\"} above`}</Text>\n ) : null}\n {visible.map((line, i) => (\n <Box key={`${card.id}:${visualLines.length - visible.length + i}`} flexDirection=\"row\">\n <Text color={aborted ? FG.meta : FG.body}>{clipToCells(line, lineCells)}</Text>\n </Box>\n ))}\n {aborted ? <Text color={FG.faint}>[truncated by esc]</Text> : null}\n </Card>\n );\n}\n","import { createContext } from \"react\";\n\n/** ctrl-o toggles this; live streaming card swaps 4-line tail for full-tail view. */\nexport const LiveExpandContext = createContext<boolean>(false);\n","/** Markdown → Ink. Parsing via marked; visual mapping mirrors dashboard/app.css `.md` rules. Code blocks pass through cli-highlight for ANSI syntax coloring. */\n\nimport { highlight, supportsLanguage } from \"cli-highlight\";\nimport { Box, Text, useStdout } from \"ink\";\nimport { type Token, type Tokens, marked } from \"marked\";\nimport React from \"react\";\nimport stringWidth from \"string-width\";\nimport { wrapToCells } from \"../../frame/width.js\";\nimport { FG, SURFACE, TONE } from \"./theme/tokens.js\";\n\n/** Left margin consumed by card outer marginLeft + body paddingLeft + safety. */\nconst BODY_LEFT_CELLS = 7;\n\nconst MarkdownWidthCtx = React.createContext<number | undefined>(undefined);\n\nfunction useWidth(): number {\n const ctx = React.useContext(MarkdownWidthCtx);\n if (ctx !== undefined) return ctx;\n return (useStdout()?.stdout?.columns ?? process.stdout.columns ?? 80) - BODY_LEFT_CELLS;\n}\n\nmarked.setOptions({ gfm: true, breaks: false });\n\nexport function Markdown({ text, width }: { text: string; width?: number }): React.ReactElement {\n const tokens = React.useMemo(() => marked.lexer(text), [text]);\n const ctxWidth = width !== undefined ? Math.max(1, width) : undefined;\n return (\n <MarkdownWidthCtx.Provider value={ctxWidth}>\n <Box flexDirection=\"column\" gap={1}>\n {tokens.map((token, i) => (\n <BlockToken key={`${i}-${token.type}`} token={token} />\n ))}\n </Box>\n </MarkdownWidthCtx.Provider>\n );\n}\n\nfunction BlockToken({ token }: { token: Token }): React.ReactElement | null {\n switch (token.type) {\n case \"heading\":\n return <Heading token={token as Tokens.Heading} />;\n case \"paragraph\":\n return <Paragraph token={token as Tokens.Paragraph} />;\n case \"list\":\n return <List token={token as Tokens.List} depth={0} />;\n case \"code\":\n return <CodeBlock token={token as Tokens.Code} />;\n case \"blockquote\":\n return <Blockquote token={token as Tokens.Blockquote} />;\n case \"hr\":\n return <HorizontalRule />;\n case \"table\":\n return <Table token={token as Tokens.Table} />;\n case \"html\":\n return <Text color={FG.body}>{(token as Tokens.HTML).text}</Text>;\n case \"space\":\n return null;\n default:\n return <Text color={FG.body}>{(token as { raw?: string }).raw ?? \"\"}</Text>;\n }\n}\n\nfunction Heading({ token }: { token: Tokens.Heading }): React.ReactElement {\n return (\n <Box>\n <Text bold color={FG.strong} backgroundColor={SURFACE.bgElev}>\n {` ${plainText(token.tokens)} `}\n </Text>\n </Box>\n );\n}\n\nfunction Paragraph({ token }: { token: Tokens.Paragraph }): React.ReactElement {\n return (\n <Text color={FG.body}>\n <Inline tokens={token.tokens ?? []} />\n </Text>\n );\n}\n\nfunction List({ token, depth }: { token: Tokens.List; depth: number }): React.ReactElement {\n return (\n <Box flexDirection=\"column\">\n {token.items.map((item, i) => (\n <ListItem\n key={`${i}-${item.text.slice(0, 24)}`}\n item={item}\n ordered={token.ordered}\n index={i + (Number(token.start) || 1)}\n depth={depth}\n />\n ))}\n </Box>\n );\n}\n\nfunction ListItem({\n item,\n ordered,\n index,\n depth,\n}: {\n item: Tokens.ListItem;\n ordered: boolean;\n index: number;\n depth: number;\n}): React.ReactElement {\n const marker = item.task ? (item.checked ? \"✓\" : \"○\") : ordered ? `${index}.` : \"·\";\n const markerColor = item.task ? (item.checked ? TONE.ok : FG.faint) : FG.meta;\n const dim = item.task && item.checked === true;\n const indent = \" \".repeat(depth + 1);\n return (\n <Box>\n <Text color={markerColor}>{`${indent}${marker} `}</Text>\n <Box flexDirection=\"column\">\n {item.tokens.map((tok, i) => {\n if (tok.type === \"text\") {\n const inner = (tok as Tokens.Text).tokens;\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey: list-item children are positional and stable per render\n <Text key={`t-${i}`} color={dim ? FG.faint : FG.body} strikethrough={dim}>\n {inner ? <Inline tokens={inner} /> : (tok as Tokens.Text).text}\n </Text>\n );\n }\n if (tok.type === \"list\") {\n // biome-ignore lint/suspicious/noArrayIndexKey: list-item children are positional and stable per render\n return <List key={`l-${i}`} token={tok as Tokens.List} depth={depth + 1} />;\n }\n return <BlockToken key={`b-${i}-${tok.type}`} token={tok} />;\n })}\n </Box>\n </Box>\n );\n}\n\nfunction CodeBlock({ token }: { token: Tokens.Code }): React.ReactElement {\n const lang = token.lang?.split(/\\s+/)[0] ?? \"\";\n const colored = highlightCode(token.text, lang);\n const lines = colored.split(\"\\n\");\n return (\n <Box flexDirection=\"column\">\n {lang ? (\n <Box>\n <Text color={FG.meta}>{` ${lang}`}</Text>\n </Box>\n ) : null}\n <Box flexDirection=\"column\">\n {lines.map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: code lines are positional and stable per render\n <Text key={`code-${i}`} backgroundColor={SURFACE.bgElev}>\n {` ${line} `}\n </Text>\n ))}\n </Box>\n </Box>\n );\n}\n\nfunction highlightCode(source: string, lang: string): string {\n if (!lang) return source;\n try {\n if (supportsLanguage(lang)) return highlight(source, { language: lang, ignoreIllegals: true });\n return highlight(source, { ignoreIllegals: true });\n } catch {\n return source;\n }\n}\n\nfunction Blockquote({ token }: { token: Tokens.Blockquote }): React.ReactElement {\n return (\n <Box flexDirection=\"column\">\n {(token.tokens ?? []).map((child, i) => (\n <Box key={`${i}-${child.type}`} flexDirection=\"row\">\n <Text color={TONE.brand}>{\" ▎ \"}</Text>\n <Box flexDirection=\"column\" flexGrow={1}>\n {child.type === \"paragraph\" ? (\n <Text italic color={FG.sub}>\n <Inline tokens={(child as Tokens.Paragraph).tokens ?? []} />\n </Text>\n ) : (\n <BlockToken token={child} />\n )}\n </Box>\n </Box>\n ))}\n </Box>\n );\n}\n\n/** Right-pad to `cells` visual columns — wide chars (CJK, emoji) count as 2. */\nfunction padToCells(text: string, cells: number): string {\n const w = stringWidth(text);\n if (w >= cells) return text;\n return text + \" \".repeat(cells - w);\n}\n\nfunction HorizontalRule(): React.ReactElement {\n const width = useWidth();\n const rule = \"─\".repeat(Math.max(width, 1));\n return <Text color={FG.faint}>{` ${rule}`}</Text>;\n}\n\n/** Pure function — no React deps. */\nexport function tableLayout(\n headerCells: string[],\n bodyCells: string[][],\n availableWidth: number,\n): ColumnarLayout | FallbackLayout {\n const colCount = headerCells.length;\n const GAP = \" \";\n const GAP_W = stringWidth(GAP);\n const widths = new Array<number>(colCount).fill(0);\n for (let c = 0; c < colCount; c++) {\n widths[c] = Math.max(\n stringWidth(headerCells[c] ?? \"\"),\n ...bodyCells.map((r) => stringWidth(r[c] ?? \"\")),\n );\n }\n const totalWidth = widths.reduce((s, w) => s + w, 0) + GAP_W * (colCount - 1);\n if (totalWidth <= availableWidth) {\n return { fallback: false, widths, colCount, gap: GAP };\n }\n // Fallback: key/value pairs, label column = widest header, value gets the rest.\n const rawLabel = Math.max(...headerCells.map((h) => stringWidth(h))) + 2; // label + \": \"\n const labelPad = Math.min(rawLabel, availableWidth - 1);\n const valueCells = availableWidth - labelPad;\n return { fallback: true, labelPad, valueCells };\n}\n\ninterface ColumnarLayout {\n fallback: false;\n widths: number[];\n colCount: number;\n gap: string;\n}\ninterface FallbackLayout {\n fallback: true;\n labelPad: number;\n valueCells: number;\n}\n\nfunction Table({ token }: { token: Tokens.Table }): React.ReactElement {\n const width = useWidth();\n const headerCells = token.header.map((c) => plainText(c.tokens));\n const bodyCells = token.rows.map((row) => row.map((c) => plainText(c.tokens)));\n const layout = tableLayout(headerCells, bodyCells, width);\n if (!layout.fallback)\n return (\n <ColumnarTable\n headerCells={headerCells}\n bodyCells={bodyCells}\n widths={layout.widths}\n colCount={headerCells.length}\n gap={layout.gap}\n />\n );\n return (\n <FallbackTable\n headerCells={headerCells}\n bodyCells={bodyCells}\n labelPad={layout.labelPad}\n valueCells={layout.valueCells}\n />\n );\n}\n\nfunction ColumnarTable({\n headerCells,\n bodyCells,\n widths,\n colCount,\n gap,\n}: {\n headerCells: string[];\n bodyCells: string[][];\n widths: number[];\n colCount: number;\n gap: string;\n}): React.ReactElement {\n const ruleRow = widths.map((w) => \"─\".repeat(w)).join(gap);\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text> </Text>\n {headerCells.map((cell, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: header cells positional\n <React.Fragment key={`h-${i}`}>\n <Text bold color={FG.sub}>\n {padToCells(cell, widths[i]!)}\n </Text>\n {i < colCount - 1 ? <Text>{gap}</Text> : null}\n </React.Fragment>\n ))}\n </Box>\n <Box>\n <Text> </Text>\n <Text color={FG.faint}>{ruleRow}</Text>\n </Box>\n {bodyCells.map((row, ri) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: body rows positional\n <Box key={`tr-${ri}`}>\n <Text> </Text>\n {row.map((cell, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: cells positional\n <React.Fragment key={`c-${ri}-${i}`}>\n <Text color={FG.body}>{padToCells(cell ?? \"\", widths[i]!)}</Text>\n {i < colCount - 1 ? <Text>{gap}</Text> : null}\n </React.Fragment>\n ))}\n </Box>\n ))}\n </Box>\n );\n}\n\nfunction FallbackTable({\n headerCells,\n bodyCells,\n labelPad,\n valueCells,\n}: {\n headerCells: string[];\n bodyCells: string[][];\n labelPad: number;\n valueCells: number;\n}): React.ReactElement {\n return (\n <Box flexDirection=\"column\">\n {bodyCells.map((row, ri) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: body rows positional\n <Box key={`fr-${ri}`} flexDirection=\"column\">\n {ri > 0 ? <Text> </Text> : null}\n {headerCells.map((h, ci) => {\n const label = `${padToCells(h, labelPad - 2)}: `;\n const lines = wrapToCells(row[ci] ?? \"\", valueCells);\n return lines.map((line, li) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: fallback table lines are positional\n <Box key={`fc-${ri}-${ci}-${li}`}>\n {li === 0 ? (\n <Text bold color={FG.sub}>\n {label}\n </Text>\n ) : (\n <Text>{padToCells(\"\", labelPad)}</Text>\n )}\n <Text color={FG.body}>{line}</Text>\n </Box>\n ));\n })}\n </Box>\n ))}\n </Box>\n );\n}\n\nfunction Inline({ tokens }: { tokens: Token[] }): React.ReactElement {\n return (\n <>\n {tokens.map((tok, i) => (\n <InlineToken key={`${i}-${tok.type}`} token={tok} />\n ))}\n </>\n );\n}\n\nconst FILE_REF_RE = /\\b([A-Za-z0-9_./@\\-]+\\.[A-Za-z0-9]{1,6})(?::(\\d+)(?:-(\\d+))?)?\\b/g;\nconst MENTION_RE = /(?<![A-Za-z0-9_])@([A-Za-z0-9_./\\-]+\\.[A-Za-z0-9]{1,6})/g;\n\nfunction looksLikeFileRef(path: string, hasLine: boolean): boolean {\n if (hasLine) return true;\n if (path.includes(\"/\")) return true;\n const ext = path.split(\".\").pop() ?? \"\";\n return ext.length >= 2;\n}\n\nfunction osc8(label: string, _target: string, color: string): React.ReactElement {\n return (\n <Text color={color} underline>\n {label}\n </Text>\n );\n}\n\nfunction renderInlineText(raw: string): React.ReactElement {\n if (!raw) return <Text>{raw}</Text>;\n const out: React.ReactNode[] = [];\n let cursor = 0;\n type Hit = { start: number; end: number; node: React.ReactElement };\n const hits: Hit[] = [];\n for (const m of raw.matchAll(MENTION_RE)) {\n const start = m.index ?? 0;\n const end = start + m[0].length;\n const path = m[1]!;\n hits.push({\n start,\n end,\n node: <Text color={TONE.warn} underline>{`@${path}`}</Text>,\n });\n }\n for (const m of raw.matchAll(FILE_REF_RE)) {\n const start = m.index ?? 0;\n const end = start + m[0].length;\n if (hits.some((h) => start < h.end && end > h.start)) continue;\n const path = m[1]!;\n const line = m[2];\n if (!looksLikeFileRef(path, line !== undefined)) continue;\n const target = line ? `file://${path}:${line}` : `file://${path}`;\n hits.push({ start, end, node: osc8(m[0], target, TONE.brand) });\n }\n hits.sort((a, b) => a.start - b.start);\n let key = 0;\n for (const h of hits) {\n if (h.start > cursor) {\n out.push(<Text key={`t-${key++}`}>{raw.slice(cursor, h.start)}</Text>);\n }\n out.push(<React.Fragment key={`r-${key++}`}>{h.node}</React.Fragment>);\n cursor = h.end;\n }\n if (cursor < raw.length) out.push(<Text key={`t-${key++}`}>{raw.slice(cursor)}</Text>);\n return <>{out}</>;\n}\n\nfunction InlineToken({ token }: { token: Token }): React.ReactElement {\n switch (token.type) {\n case \"text\": {\n const t = token as Tokens.Text;\n return t.tokens ? <Inline tokens={t.tokens} /> : renderInlineText(t.text);\n }\n case \"strong\":\n return (\n <Text bold color={FG.strong}>\n <Inline tokens={(token as Tokens.Strong).tokens} />\n </Text>\n );\n case \"em\":\n return (\n <Text italic>\n <Inline tokens={(token as Tokens.Em).tokens} />\n </Text>\n );\n case \"codespan\":\n return (\n <Text color={FG.strong} backgroundColor={SURFACE.bgElev}>\n {` ${(token as Tokens.Codespan).text} `}\n </Text>\n );\n case \"del\":\n return (\n <Text color={TONE.err} strikethrough>\n <Inline tokens={(token as Tokens.Del).tokens} />\n </Text>\n );\n case \"link\": {\n const l = token as Tokens.Link;\n return (\n <Text color={TONE.brand} underline>\n <Inline tokens={l.tokens} />\n </Text>\n );\n }\n case \"image\": {\n const im = token as Tokens.Image;\n return <Text color={TONE.brand}>{`[image: ${im.text || im.href}]`}</Text>;\n }\n case \"br\":\n return <Text>{\"\\n\"}</Text>;\n case \"escape\":\n return <Text>{(token as Tokens.Escape).text}</Text>;\n case \"html\":\n return <Text>{(token as Tokens.HTML).text}</Text>;\n default:\n return <Text>{(token as { raw?: string }).raw ?? \"\"}</Text>;\n }\n}\n\nexport function plainText(tokens: Token[] | undefined): string {\n if (!tokens) return \"\";\n let out = \"\";\n for (const t of tokens) {\n switch (t.type) {\n case \"text\":\n out += (t as Tokens.Text).text;\n break;\n case \"strong\":\n case \"em\":\n case \"del\":\n case \"link\":\n out += plainText((t as { tokens?: Token[] }).tokens ?? []);\n break;\n case \"codespan\":\n out += (t as Tokens.Codespan).text;\n break;\n case \"br\":\n out += \"\\n\";\n break;\n case \"escape\":\n out += (t as Tokens.Escape).text;\n break;\n default:\n out += (t as { raw?: string }).raw ?? \"\";\n }\n }\n return out;\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { useContext } from \"react\";\nimport { ActiveCardContext, Card as CardWrap } from \"../primitives/Card.js\";\nimport { CardHeader } from \"../primitives/CardHeader.js\";\nimport { Spinner } from \"../primitives/Spinner.js\";\nimport type { Card, SubAgentCard as SubAgentCardData } from \"../state/cards.js\";\nimport { useThemeTokens } from \"../theme/context.js\";\nimport { CARD } from \"../theme/tokens.js\";\n\nexport function SubAgentCard({ card }: { card: SubAgentCardData }): React.ReactElement {\n const { fg, tone, toneActive } = useThemeTokens();\n const statusColor: Record<SubAgentCardData[\"status\"], string> = {\n running: toneActive.violet,\n done: tone.ok,\n failed: tone.err,\n };\n const headColor = statusColor[card.status];\n const headGlyph = card.status === \"failed\" ? \"✖\" : \"⌬\";\n const runningChildren = card.children.filter((c) => !isChildDone(c)).length;\n const isRunning = card.status === \"running\";\n const inLive = useContext(ActiveCardContext);\n const headerMeta = isRunning\n ? runningChildren > 0\n ? [`${runningChildren} running`]\n : [\"working\"]\n : [{ text: card.status, color: headColor }];\n return (\n <CardWrap tone={headColor}>\n <CardHeader\n glyph={headGlyph}\n tone={headColor}\n title=\"subagent\"\n titleColor={tone.violet}\n subtitle={card.task}\n meta={headerMeta}\n />\n {card.name ? <Text color={fg.faint}>{`agent · ${card.name}`}</Text> : null}\n {card.tools && card.tools.length > 0 && (\n <Text color={fg.faint}>{`tools · ${card.tools.join(\", \")}`}</Text>\n )}\n {card.children.map((child) => (\n <Box key={child.id} flexDirection=\"row\" gap={1}>\n {inLive ? null : <Text color={tone.violet}>▎</Text>}\n <ChildRow card={child} />\n </Box>\n ))}\n </CardWrap>\n );\n}\n\nfunction isChildDone(card: Card): boolean {\n switch (card.kind) {\n case \"tool\":\n case \"streaming\":\n return card.done;\n case \"reasoning\":\n return !card.streaming;\n default:\n return true;\n }\n}\n\ninterface ChildVisual {\n statusGlyph: React.ReactElement;\n kindGlyph: string;\n kindColor: string;\n text: string;\n}\n\nfunction ChildRow({ card }: { card: Card }): React.ReactElement {\n const { fg, tone } = useThemeTokens();\n const v = childVisual(card, tone.ok, tone.err, fg.faint);\n const isDone = isChildDone(card);\n return (\n <>\n {v.statusGlyph}\n <Text color={v.kindColor}>{v.kindGlyph}</Text>\n <Text dimColor={isDone} color={fg.body}>\n {v.text}\n </Text>\n </>\n );\n}\n\nfunction runningGlyph(color: string): React.ReactElement {\n return <Spinner kind=\"circle\" color={color} />;\n}\n\nfunction doneGlyph(color: string): React.ReactElement {\n return <Text color={color}>✓</Text>;\n}\n\nfunction failedGlyph(color: string): React.ReactElement {\n return <Text color={color}>✖</Text>;\n}\n\nfunction childVisual(\n card: Card,\n doneColor: string,\n failedColor: string,\n fallbackColor: string,\n): ChildVisual {\n switch (card.kind) {\n case \"reasoning\": {\n const done = !card.streaming;\n return {\n statusGlyph: done ? doneGlyph(doneColor) : runningGlyph(CARD.reasoning.color),\n kindGlyph: \"◆\",\n kindColor: CARD.reasoning.color,\n text: `reasoning · ${card.paragraphs} ¶`,\n };\n }\n case \"tool\": {\n const elapsed = card.elapsedMs > 0 ? ` · ${(card.elapsedMs / 1000).toFixed(2)}s` : \"\";\n return {\n statusGlyph: card.done ? doneGlyph(doneColor) : runningGlyph(CARD.tool.color),\n kindGlyph: \"▣\",\n kindColor: CARD.tool.color,\n text: `${card.name}${elapsed}`,\n };\n }\n case \"streaming\":\n return {\n statusGlyph: card.done ? doneGlyph(doneColor) : runningGlyph(CARD.streaming.color),\n kindGlyph: \"◈\",\n kindColor: CARD.streaming.color,\n text: card.done ? \"response\" : \"writing …\",\n };\n case \"diff\":\n return {\n statusGlyph: doneGlyph(doneColor),\n kindGlyph: \"±\",\n kindColor: CARD.diff.color,\n text: card.file,\n };\n case \"error\":\n return {\n statusGlyph: failedGlyph(failedColor),\n kindGlyph: \"✖\",\n kindColor: CARD.error.color,\n text: card.title,\n };\n default:\n return {\n statusGlyph: <Text color={fallbackColor}>·</Text>,\n kindGlyph: \"·\",\n kindColor: fallbackColor,\n text: card.kind,\n };\n }\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader } from \"../primitives/CardHeader.js\";\nimport type { TaskCard as TaskCardData, TaskStep } from \"../state/cards.js\";\nimport { useThemeTokens } from \"../theme/context.js\";\n\nconst STEP_GLYPH: Record<TaskStep[\"status\"], string> = {\n queued: \"○\",\n running: \"▶\",\n done: \"✓\",\n failed: \"✗\",\n};\n\nconst TASK_GLYPH: Record<TaskCardData[\"status\"], string> = {\n running: \"▶\",\n done: \"✓\",\n failed: \"✗\",\n};\n\nexport function TaskCard({ card }: { card: TaskCardData }): React.ReactElement {\n const { fg, tone } = useThemeTokens();\n const stepColor: Record<TaskStep[\"status\"], string> = {\n queued: fg.faint,\n running: tone.warn,\n done: tone.ok,\n failed: tone.err,\n };\n const taskColor: Record<TaskCardData[\"status\"], string> = {\n running: tone.warn,\n done: tone.ok,\n failed: tone.err,\n };\n const elapsed = `${(card.elapsedMs / 1000).toFixed(1)}s`;\n return (\n <Card tone={taskColor[card.status]}>\n <CardHeader\n glyph={TASK_GLYPH[card.status]}\n tone={taskColor[card.status]}\n title={`step ${card.index}/${card.total}`}\n subtitle={card.title}\n meta={[elapsed, card.status]}\n />\n {card.steps.map((step) => (\n <Box key={step.id} flexDirection=\"row\" gap={1}>\n <Text color={stepColor[step.status]}>{STEP_GLYPH[step.status]}</Text>\n <Text bold color={fg.body}>\n {(step.toolName ?? \"step\").padEnd(7)}\n </Text>\n <Text color={fg.sub}>{step.title}</Text>\n {step.detail ? <Text color={fg.faint}>{step.detail}</Text> : null}\n {step.elapsedMs !== undefined ? (\n <Text color={fg.faint}>{`${(step.elapsedMs / 1000).toFixed(2)}s`}</Text>\n ) : null}\n </Box>\n ))}\n </Card>\n );\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport stringWidth from \"string-width\";\nimport { t } from \"../../../i18n/index.js\";\nimport type { TipCard as TipCardData, TipRow as TipRowData } from \"../state/cards.js\";\nimport { FG, TONE } from \"../theme/tokens.js\";\n\nconst KEY_GUTTER = 4;\n\nexport function TipCard({ card }: { card: TipCardData }): React.ReactElement {\n const keyWidth = card.sections.reduce(\n (max, sec) => sec.rows.reduce((m, r) => Math.max(m, stringWidth(r.key)), max),\n 0,\n );\n return (\n <Box flexDirection=\"column\" paddingLeft={2} marginY={1}>\n <Box flexDirection=\"row\" justifyContent=\"space-between\">\n <Box flexDirection=\"row\" gap={1}>\n <Text color={TONE.accent} bold>\n ⓘ\n </Text>\n <Text color={FG.body} bold>\n {card.topic}\n </Text>\n </Box>\n {card.oneTime ? <Text color={FG.faint}>{t(\"ui.tipShownOnce\")}</Text> : null}\n </Box>\n {card.sections.map((section, i) => (\n <Box key={section.title ?? `section-${i}`} flexDirection=\"column\" marginTop={1}>\n {section.title ? (\n <Box marginBottom={0}>\n <Text color={FG.sub}>{section.title}</Text>\n </Box>\n ) : null}\n {section.rows.map((row) => (\n <TipRowRender\n key={row.key}\n row={row}\n keyWidth={keyWidth}\n indent={section.title ? 2 : 0}\n />\n ))}\n </Box>\n ))}\n {card.footer ? (\n <Box marginTop={1}>\n <Text color={FG.faint}>{card.footer}</Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n\nfunction TipRowRender({\n row,\n keyWidth,\n indent,\n}: {\n row: TipRowData;\n keyWidth: number;\n indent: number;\n}) {\n const pad = \" \".repeat(Math.max(0, keyWidth - stringWidth(row.key) + KEY_GUTTER));\n const lead = indent > 0 ? \" \".repeat(indent) : \"\";\n return (\n <Box flexDirection=\"row\">\n {lead ? <Text>{lead}</Text> : null}\n <Text color={TONE.accent}>{row.key}</Text>\n <Text>{pad}</Text>\n <Text color={FG.body}>{row.text}</Text>\n </Box>\n );\n}\n","import { Box, Text, useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { clipToCells } from \"../../../frame/width.js\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader, type MetaItem } from \"../primitives/CardHeader.js\";\nimport { Spinner } from \"../primitives/Spinner.js\";\nimport type { ToolCard as ToolCardData } from \"../state/cards.js\";\nimport { FG, TONE, TONE_ACTIVE } from \"../theme/tokens.js\";\n\nconst READ_TAIL = 2;\nconst OTHER_TAIL = 5;\n\n/** Read-style tools dump file/list bodies — short tail is enough; the model already has the full text in context. */\nfunction tailLinesFor(name: string): number {\n const lower = name.toLowerCase();\n return /(?:^|_)(read|search|list|tree|get|status|diff|fetch|grep)(_|$)/.test(lower) ||\n lower === \"job_output\"\n ? READ_TAIL\n : OTHER_TAIL;\n}\n\nexport function ToolCard({ card }: { card: ToolCardData }): React.ReactElement {\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const lineCells = Math.max(20, cols - 4);\n const argsLabel = formatArgsSummary(card.args);\n const allLines = card.output.length > 0 ? card.output.split(\"\\n\") : [];\n const tail = tailLinesFor(card.name);\n const truncated = allLines.length > tail;\n const visible = truncated ? allLines.slice(-tail) : allLines;\n const hidden = truncated ? allLines.length - visible.length : 0;\n const status = toolStatus(card);\n const headColor = headerColorFor(status);\n const errColor = card.exitCode && card.exitCode !== 0 ? TONE.err : FG.sub;\n // Rejected calls show a single trailing badge — the verbose JSON error body\n // is already conveyed by the badge, so dropping the body keeps the card tight.\n const showBody = !card.rejected && visible.length > 0;\n\n const meta: MetaItem[] = [];\n if (card.retry) {\n meta.push({ text: `↻ ${card.retry.attempt}/${card.retry.max}`, color: TONE.warn });\n }\n if (card.rejected) {\n meta.push({ text: \"rejected\", color: TONE.err });\n }\n for (const part of metaTrail(card)) meta.push(part);\n\n return (\n <Card tone={headColor}>\n <CardHeader\n glyph={statusGlyph(status)}\n tone={headColor}\n title={card.name}\n subtitle={argsLabel || undefined}\n meta={meta.length > 0 ? meta : undefined}\n right={\n status === \"running\" ? (\n <Spinner kind=\"braille\" color={TONE_ACTIVE.brand} bold />\n ) : undefined\n }\n />\n {showBody && (\n <>\n {hidden > 0 ? (\n <Text color={FG.faint}>\n {`⋮ ${hidden} earlier line${hidden === 1 ? \"\" : \"s\"} (use /tool to read full)`}\n </Text>\n ) : null}\n {visible.map((line, i) => (\n <Text\n key={`${card.id}:${hidden + i}`}\n color={errColor}\n dimColor={!card.exitCode || card.exitCode === 0}\n >\n {clipToCells(line, lineCells) || \" \"}\n </Text>\n ))}\n </>\n )}\n </Card>\n );\n}\n\ntype ToolStatus = \"running\" | \"ok\" | \"rejected\" | \"error\" | \"aborted\";\n\nfunction toolStatus(card: ToolCardData): ToolStatus {\n if (card.rejected) return \"rejected\";\n if (card.aborted) return \"aborted\";\n if (!card.done) return \"running\";\n if (card.exitCode !== undefined && card.exitCode !== 0) return \"error\";\n return \"ok\";\n}\n\nfunction statusGlyph(s: ToolStatus): string {\n switch (s) {\n case \"running\":\n return \"▢\";\n case \"ok\":\n return \"✓\";\n case \"rejected\":\n return \"✗\";\n case \"error\":\n return \"✖\";\n case \"aborted\":\n return \"⊘\";\n }\n}\n\nfunction headerColorFor(s: ToolStatus): string {\n switch (s) {\n case \"ok\":\n return TONE.ok;\n case \"rejected\":\n case \"error\":\n case \"aborted\":\n return TONE.err;\n case \"running\":\n return TONE_ACTIVE.brand;\n }\n}\n\nfunction metaTrail(card: ToolCardData): string[] {\n const parts: string[] = [];\n const inputBytes = largestStringInputBytes(card.args);\n if (inputBytes !== null) parts.push(`${formatBytes(inputBytes)} in`);\n if (card.elapsedMs > 0) parts.push(`${(card.elapsedMs / 1000).toFixed(2)}s`);\n if (\n card.done &&\n !card.rejected &&\n !card.aborted &&\n card.exitCode !== undefined &&\n card.exitCode !== 0\n ) {\n parts.push(`exit ${card.exitCode}`);\n }\n return parts;\n}\n\nfunction formatArgsSummary(args: unknown): string {\n if (typeof args === \"string\") return args.length > 60 ? `${args.slice(0, 60)}…` : args;\n if (args && typeof args === \"object\") {\n const keys = Object.keys(args as Record<string, unknown>);\n if (keys.length === 0) return \"\";\n const first = keys[0]!;\n const value = (args as Record<string, unknown>)[first];\n if (typeof value === \"string\") {\n const trimmed = value.length > 40 ? `${value.slice(0, 40)}…` : value;\n return keys.length === 1 ? trimmed : `${trimmed} +${keys.length - 1}`;\n }\n return keys.join(\" \");\n }\n return \"\";\n}\n\nconst INPUT_SIZE_THRESHOLD = 1024;\n\n/** Largest string field on args, when above threshold. Surfaces input bulk for write_file (content), edit_file (replace), run_command (long stdin), etc. without per-tool special cases. */\nexport function largestStringInputBytes(args: unknown): number | null {\n let max = 0;\n if (typeof args === \"string\") {\n max = args.length;\n } else if (args && typeof args === \"object\") {\n for (const v of Object.values(args as Record<string, unknown>)) {\n if (typeof v === \"string\" && v.length > max) max = v.length;\n }\n }\n return max >= INPUT_SIZE_THRESHOLD ? max : null;\n}\n\nfunction formatBytes(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","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader } from \"../primitives/CardHeader.js\";\nimport type { UsageCard as UsageCardData } from \"../state/cards.js\";\nimport { FG, TONE, formatBalance, formatCost } from \"../theme/tokens.js\";\n\nconst BAR_CELLS = 30;\n\nfunction compactNum(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(n >= 10_000 ? 0 : 1)}K`;\n return String(n);\n}\n\nfunction bar(ratio: number, color: string): React.ReactElement {\n const filled = Math.max(0, Math.min(BAR_CELLS, Math.round(ratio * BAR_CELLS)));\n const empty = BAR_CELLS - filled;\n return (\n <>\n <Text color={color}>{\"█\".repeat(filled)}</Text>\n <Text color={FG.faint}>{\"░\".repeat(empty)}</Text>\n </>\n );\n}\n\nexport function UsageCard({ card }: { card: UsageCardData }): React.ReactElement {\n if (card.compact) return <CompactUsageRow card={card} />;\n const cap = Math.max(1, card.tokens.promptCap);\n const promptRatio = card.tokens.prompt / cap;\n const reasonRatio = card.tokens.reason / cap;\n const outputRatio = card.tokens.output / cap;\n\n const headerMeta: string[] = [`turn ${card.turn}`, formatCost(card.cost, card.balanceCurrency)];\n if (card.elapsedMs !== undefined) headerMeta.push(`${(card.elapsedMs / 1000).toFixed(1)}s`);\n return (\n <Card tone={FG.meta}>\n <CardHeader glyph=\"Σ\" tone={FG.meta} title=\"usage\" meta={headerMeta} />\n <Box flexDirection=\"row\" gap={1}>\n <Text color={FG.sub}>prompt</Text>\n {bar(promptRatio, TONE.brand)}\n <Text bold color={FG.body}>\n {card.tokens.prompt.toLocaleString()}\n </Text>\n <Text color={FG.faint}>{`/ 1M · ${(promptRatio * 100).toFixed(1)}%`}</Text>\n </Box>\n <Box flexDirection=\"row\" gap={1}>\n <Text color={FG.sub}>reason</Text>\n {bar(reasonRatio, TONE.accent)}\n <Text bold color={FG.body}>\n {card.tokens.reason.toLocaleString()}\n </Text>\n </Box>\n <Box flexDirection=\"row\" gap={1}>\n <Text color={FG.sub}>output</Text>\n {bar(outputRatio, TONE.brand)}\n <Text bold color={FG.body}>\n {card.tokens.output.toLocaleString()}\n </Text>\n </Box>\n <Box flexDirection=\"row\" gap={1}>\n <Text color={FG.sub}>cache </Text>\n {bar(card.cacheHit, TONE.ok)}\n <Text bold color={TONE.ok}>{`${(card.cacheHit * 100).toFixed(1)}%`}</Text>\n </Box>\n <Box flexDirection=\"row\" gap={1}>\n <Text color={FG.faint}>session</Text>\n <Text bold color={FG.body}>\n {`⛁ ${formatCost(card.sessionCost, card.balanceCurrency, 3)}`}\n </Text>\n {card.balance !== undefined ? (\n <>\n <Text color={FG.faint}>· balance</Text>\n <Text bold color={TONE.brand}>\n {formatBalance(card.balance, card.balanceCurrency)}\n </Text>\n </>\n ) : null}\n </Box>\n </Card>\n );\n}\n\nfunction CompactUsageRow({ card }: { card: UsageCardData }): React.ReactElement {\n const elapsed = card.elapsedMs !== undefined ? ` · ${(card.elapsedMs / 1000).toFixed(1)}s` : \"\";\n return (\n <Box flexDirection=\"row\" gap={1} marginTop={1}>\n <Text color={FG.meta}>Σ</Text>\n <Text color={FG.faint}>{`turn ${card.turn}`}</Text>\n <Text color={FG.meta}>\n {`· ${compactNum(card.tokens.prompt)} prompt · ${compactNum(card.tokens.output)} out`}\n </Text>\n <Text color={FG.faint}>· cache</Text>\n <Text color={TONE.ok}>{`${(card.cacheHit * 100).toFixed(0)}%`}</Text>\n <Text color={FG.faint}>{`· ${formatCost(card.cost, card.balanceCurrency)}${elapsed}`}</Text>\n {card.balance !== undefined ? (\n <Text color={TONE.brand}>{`· ${formatBalance(card.balance, card.balanceCurrency)}`}</Text>\n ) : null}\n </Box>\n );\n}\n","// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { Markdown } from \"../markdown.js\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader } from \"../primitives/CardHeader.js\";\nimport type { UserCard as UserCardData } from \"../state/cards.js\";\nimport { FG, TONE } from \"../theme/tokens.js\";\nimport { formatRelativeTime } from \"./time.js\";\n\nexport function UserCard({ card }: { card: UserCardData }): React.ReactElement {\n return (\n <Card tone={TONE.accent}>\n <CardHeader\n glyph=\"›\"\n tone={TONE.accent}\n title=\"you\"\n titleColor={FG.sub}\n meta={[formatRelativeTime(card.ts)]}\n />\n <Markdown text={card.text} />\n </Card>\n );\n}\n","export function formatRelativeTime(ts: number, now: number = Date.now()): string {\n const diffSec = Math.max(0, Math.floor((now - ts) / 1000));\n if (diffSec < 5) return \"just now\";\n if (diffSec < 60) return `${diffSec}s ago`;\n const diffMin = Math.floor(diffSec / 60);\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return `${diffHr}h ago`;\n const diffDay = Math.floor(diffHr / 24);\n return `${diffDay}d ago`;\n}\n","import { Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader } from \"../primitives/CardHeader.js\";\nimport type { WarnCard as WarnCardData } from \"../state/cards.js\";\nimport { FG, TONE } from \"../theme/tokens.js\";\n\nexport function WarnCard({ card }: { card: WarnCardData }): React.ReactElement {\n const messageLines = card.message.length > 0 ? card.message.split(\"\\n\") : [];\n return (\n <Card tone={TONE.warn}>\n <CardHeader\n glyph=\"⚠\"\n tone={TONE.warn}\n title={card.title}\n meta={card.detail ? [card.detail] : undefined}\n />\n {messageLines.map((line, i) => (\n <Text key={`${card.id}:${i}`} color={FG.body}>\n {line || \" \"}\n </Text>\n ))}\n </Card>\n );\n}\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React as a runtime value (classic transform)\nimport React from \"react\";\nimport type { ApplyResult } from \"../../../code/edit-blocks.js\";\nimport type { EditMode } from \"../../../config.js\";\nimport type { JobRegistry } from \"../../../tools/jobs.js\";\nimport { CharBar } from \"../char-bar.js\";\nimport { Card } from \"../primitives/Card.js\";\nimport { CardHeader } from \"../primitives/CardHeader.js\";\nimport { PILL_MODEL, PILL_SECTION, Pill, modelBadgeFor } from \"../primitives/Pill.js\";\nimport { Spinner } from \"../primitives/Spinner.js\";\nimport { useThemeTokens } from \"../theme/context.js\";\nimport { CARD, FG, TONE } from \"../theme/tokens.js\";\nimport { useElapsedSeconds, useSlowTick, useTick } from \"../ticker.js\";\nimport type { SubagentActivity } from \"../useSubagent.js\";\n\nexport const SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\n/** \"Thinking\" row — soft pulse + italic label (model wait, not tool call). */\nexport function ThinkingRow({ text }: { text: string }) {\n const elapsed = useElapsedSeconds();\n const { fg, tone } = useThemeTokens();\n return (\n <Box marginY={1} paddingX={1} gap={1}>\n <Spinner kind=\"circle\" color={TONE.accent} />\n <Text italic color={FG.sub}>\n {text}\n </Text>\n <Text color={FG.faint}>{`${elapsed}s`}</Text>\n </Box>\n );\n}\n\n/** Bottom mode bar above PromptInput; plan-mode pill takes precedence over edit-mode. */\nexport function ModeStatusBar({\n editMode,\n pendingCount,\n flash,\n planMode,\n undoArmed,\n jobs,\n}: {\n editMode: EditMode;\n pendingCount: number;\n flash: boolean;\n planMode: boolean;\n undoArmed: boolean;\n jobs?: JobRegistry;\n}) {\n useSlowTick();\n const running = jobs?.runningCount() ?? 0;\n const jobsTag =\n running > 0 ? (\n <Text color={TONE.warn} bold>{` · ⏵ ${running} job${running === 1 ? \"\" : \"s\"}`}</Text>\n ) : null;\n if (planMode) {\n return (\n <ModeBarFrame>\n <ModePill label=\"PLAN MODE\" color={TONE.err} flash={flash} />\n <Text color={FG.faint}>{\" writes gated · /plan off to leave\"}</Text>\n {jobsTag}\n </ModeBarFrame>\n );\n }\n const label = editMode === \"yolo\" ? \"YOLO\" : editMode === \"auto\" ? \"AUTO\" : \"REVIEW\";\n const pillColor = editMode === \"yolo\" ? TONE.err : editMode === \"auto\" ? TONE.accent : TONE.brand;\n const mid =\n editMode === \"yolo\"\n ? \"edits + shell auto · /undo to roll back\"\n : editMode === \"auto\"\n ? \"edits land now · u to undo\"\n : pendingCount > 0\n ? `${pendingCount} queued · y apply · n discard`\n : \"edits queued · y apply · n discard\";\n return (\n <ModeBarFrame>\n <ModePill label={label} color={pillColor} flash={flash} />\n <Text color={FG.faint}>{` ${mid} · Shift+Tab to flip`}</Text>\n {jobsTag}\n </ModeBarFrame>\n );\n}\n\nfunction ModeBarFrame({ children }: { children: React.ReactNode }) {\n return <Box paddingX={1}>{children}</Box>;\n}\n\nfunction ModePill({\n label,\n color,\n flash,\n}: {\n label: string;\n color: string;\n flash: boolean;\n}) {\n return (\n <Text color={color} bold inverse={flash}>\n {`[${label}]`}\n </Text>\n );\n}\n\n/** Auto-mode \"applied N edits — u to undo\" banner; cleanup in parent's setTimeout. */\nexport function UndoBanner({\n banner,\n}: {\n banner: { results: ApplyResult[]; expiresAt: number; pausedRemainingMs: number | null };\n}) {\n useTick();\n const totalMs = 5000;\n const paused = banner.pausedRemainingMs !== null;\n const remainingMs = paused\n ? (banner.pausedRemainingMs ?? 0)\n : Math.max(0, banner.expiresAt - Date.now());\n const remainingSec = Math.ceil(remainingMs / 1000);\n const ok = banner.results.filter((r) => r.status === \"applied\" || r.status === \"created\").length;\n const total = banner.results.length;\n const urgent = !paused && remainingSec <= 1;\n const pct = (remainingMs / totalMs) * 100;\n const tone = paused ? TONE.warn : urgent ? TONE.err : TONE.accent;\n return (\n <Box marginY={1} paddingX={1}>\n <Text backgroundColor={TONE.accent} color=\"black\" bold>\n {` ✓ AUTO-APPLIED ${ok}/${total} `}\n </Text>\n <Text color={FG.faint}>{\" press \"}</Text>\n <Text backgroundColor={TONE.brand} color=\"black\" bold>\n {\" u \"}\n </Text>\n <Text color={FG.faint}>{paused ? \" to undo · \" : \" to undo · \"}</Text>\n <Text backgroundColor={paused ? TONE.warn : FG.faint} color=\"black\" bold>\n {\" space \"}\n </Text>\n <Text color={FG.faint}>{paused ? \" to resume \" : \" to pause \"}</Text>\n <CharBar pct={pct} width={20} color={tone} showLabel={false} />\n <Text color={FG.faint}>{\" \"}</Text>\n <Text color={tone} bold={urgent || paused}>\n {paused ? `${remainingSec}s · paused` : `${remainingSec}s`}\n </Text>\n </Box>\n );\n}\n\nfunction subagentPhaseLabel(\n phase: \"exploring\" | \"summarising\" | undefined,\n iter: number,\n elapsedMs: number,\n): string {\n if (phase === \"summarising\") return \"summarising findings…\";\n if (iter === 0 && elapsedMs < 2000) return \"exploring task…\";\n if (iter === 0) return \"thinking…\";\n return \"working through tools…\";\n}\n\nfunction subagentTitle(skillName: string | undefined, task: string): string {\n if (skillName) return `Sub-agent · ${skillName}`;\n const short = task.length > 32 ? `${task.slice(0, 32)}…` : task;\n return `Sub-agent · ${short || \"anonymous\"}`;\n}\n\n/** Live block for a single in-flight subagent — rich layout, used when only one is running. */\nexport function SubagentRow({ activity }: { activity: SubagentActivity }) {\n useTick();\n const seconds = (activity.elapsedMs / 1000).toFixed(1);\n const phase = subagentPhaseLabel(activity.phase, activity.iter, activity.elapsedMs);\n const last = activity.lastInner;\n const subtitle = activity.skillName ?? truncate(activity.task, 48);\n const modelBadge = activity.model ? modelBadgeFor(activity.model) : null;\n return (\n <Card tone={CARD.subagent.color}>\n <CardHeader\n glyph=\"⌬\"\n tone={CARD.subagent.color}\n title=\"subagent\"\n titleColor={PILL_SECTION.plan.fg}\n titleBg={PILL_SECTION.plan.bg}\n subtitle={subtitle}\n meta={[`iter ${activity.iter}`, `${seconds}s`]}\n right={\n <>\n {modelBadge ? (\n <Pill label={modelBadge.label} {...PILL_MODEL[modelBadge.kind]} bold={false} />\n ) : null}\n <Spinner kind=\"braille\" color={CARD.subagent.color} />\n </>\n }\n />\n <Text color={FG.faint}>\n {\"task \"}\n <Text color={FG.sub}>{activity.task}</Text>\n </Text>\n <Text color={FG.faint}>\n {\"last \"}\n {last ? (\n <>\n <Text color={last.color}>{`${last.glyph} `}</Text>\n <Text color={FG.body}>{last.label}</Text>\n {last.meta ? <Text color={FG.faint}>{` ${last.meta}`}</Text> : null}\n </>\n ) : (\n <Text color={FG.faint}>queued…</Text>\n )}\n </Text>\n <Text color={TONE.brand}>\n {\"▶ \"}\n {phase}\n </Text>\n </Card>\n );\n}\n\n/** 1 → rich; 2-max → compact rows; >max → compact + \"+N more\" fold. */\nexport function SubagentLiveStack({\n activities,\n max = 3,\n}: {\n activities: ReadonlyArray<SubagentActivity>;\n max?: number;\n}) {\n const tick = useTick();\n if (activities.length === 0) return null;\n if (activities.length === 1) return <SubagentRow activity={activities[0]!} />;\n const visible = activities.slice(0, max);\n const overflow = activities.length - visible.length;\n const summarising = activities.filter((a) => a.phase === \"summarising\").length;\n const metaParts = [`${activities.length} running`];\n if (summarising > 0) metaParts.push(`${summarising} summarising`);\n return (\n <Card tone={CARD.subagent.color}>\n <CardHeader\n glyph=\"⌬\"\n tone={CARD.subagent.color}\n title=\"subagents\"\n titleColor={PILL_SECTION.plan.fg}\n titleBg={PILL_SECTION.plan.bg}\n subtitle={metaParts.join(\" · \")}\n right={<Spinner kind=\"braille\" color={CARD.subagent.color} />}\n />\n {visible.map((a, i) => (\n <CompactSubagentLine key={a.runId} activity={a} tick={tick} index={i} />\n ))}\n {overflow > 0 ? <Text color={FG.faint}>{` +${overflow} more running…`}</Text> : null}\n </Card>\n );\n}\n\nfunction CompactSubagentLine({\n activity,\n tick,\n index,\n}: {\n activity: SubagentActivity;\n tick: number;\n index: number;\n}) {\n const summarising = activity.phase === \"summarising\";\n const spinnerFrame = SPINNER_FRAMES[(tick + index) % SPINNER_FRAMES.length] ?? \"·\";\n const glyph = summarising ? \"▶\" : spinnerFrame;\n const glyphColor = summarising ? TONE.brand : CARD.subagent.color;\n const seconds = (activity.elapsedMs / 1000).toFixed(1).padStart(5);\n const title = activity.skillName ?? truncate(activity.task, 28);\n const titlePadded = title.padEnd(28);\n const last = activity.lastInner;\n return (\n <Box flexDirection=\"row\">\n <Text color={glyphColor} bold>\n {` ${glyph} `}\n </Text>\n <Text color={FG.body}>{titlePadded}</Text>\n <Text color={FG.faint}>{` iter ${String(activity.iter).padStart(2)} · ${seconds}s · `}</Text>\n {last ? (\n <>\n <Text color={last.color}>{`${last.glyph} `}</Text>\n <Text color={FG.body}>{truncate(last.label, 18)}</Text>\n {last.meta ? <Text color={FG.faint}>{` ${last.meta}`}</Text> : null}\n </>\n ) : (\n <Text color={FG.faint}>queued…</Text>\n )}\n </Box>\n );\n}\n\nfunction truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max)}…` : text;\n}\n\n/** Live spinner + arg summary while a tool call is in flight; absorbs MCP progress frames. */\nexport function OngoingToolRow({\n tool,\n progress,\n}: {\n tool: { name: string; args?: string };\n progress: { progress: number; total?: number; message?: string } | null;\n}) {\n const tick = useTick();\n const elapsed = useElapsedSeconds();\n const summary = summarizeToolArgs(tool.name, tool.args);\n return (\n <Box marginY={1} flexDirection=\"column\" paddingX={1}>\n <Box>\n <Text color={CARD.tool.color} bold>\n {SPINNER_FRAMES[tick % SPINNER_FRAMES.length]}\n </Text>\n <Text>{\" \"}</Text>\n <Text color={CARD.tool.color} bold>\n {`▣ ${tool.name}`}\n </Text>\n <Text color={FG.faint}>{` running · ${elapsed}s`}</Text>\n </Box>\n {progress ? (\n <Box paddingLeft={3}>\n <Text color={TONE.brand}>{renderProgressLine(progress)}</Text>\n </Box>\n ) : null}\n {summary ? (\n <Box paddingLeft={3}>\n <Text color={FG.faint}>{summary}</Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n\n/** With `total`: bar + \"n/total pct%\". Without: \"progress: n\" + optional message. */\nfunction renderProgressLine(p: { progress: number; total?: number; message?: string }): string {\n const msg = p.message ? ` ${p.message}` : \"\";\n if (p.total && p.total > 0) {\n const ratio = Math.max(0, Math.min(1, p.progress / p.total));\n const width = 20;\n const filled = Math.round(ratio * width);\n const bar = \"█\".repeat(filled) + \"░\".repeat(width - filled);\n const pct = (ratio * 100).toFixed(0);\n return `[${bar}] ${p.progress}/${p.total} ${pct}%${msg}`;\n }\n return `progress: ${p.progress}${msg}`;\n}\n\n/** Match on suffix (e.g. `_read_file`) — MCP bridge prepends server namespace. */\nfunction summarizeToolArgs(name: string, args?: string): string {\n if (!args || args === \"{}\") return \"\";\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(args) as Record<string, unknown>;\n } catch {\n return args.length > 80 ? `${args.slice(0, 80)}…` : args;\n }\n const hasSuffix = (s: string) => name === s || name.endsWith(`_${s}`);\n const path = typeof parsed.path === \"string\" ? parsed.path : undefined;\n if (hasSuffix(\"read_file\")) {\n const head = typeof parsed.head === \"number\" ? `, head=${parsed.head}` : \"\";\n const tail = typeof parsed.tail === \"number\" ? `, tail=${parsed.tail}` : \"\";\n return `path: ${path ?? \"?\"}${head}${tail}`;\n }\n if (hasSuffix(\"write_file\")) {\n const content = typeof parsed.content === \"string\" ? parsed.content : \"\";\n return `path: ${path ?? \"?\"} (${content.length} chars)`;\n }\n if (hasSuffix(\"edit_file\")) {\n const edits = Array.isArray(parsed.edits) ? parsed.edits.length : 0;\n return `path: ${path ?? \"?\"} (${edits} edit${edits === 1 ? \"\" : \"s\"})`;\n }\n if (hasSuffix(\"list_directory\") || hasSuffix(\"directory_tree\")) {\n return `path: ${path ?? \"?\"}`;\n }\n if (hasSuffix(\"search_files\")) {\n const pattern = typeof parsed.pattern === \"string\" ? parsed.pattern : \"?\";\n return `path: ${path ?? \"?\"} · pattern: ${pattern}`;\n }\n if (hasSuffix(\"move_file\")) {\n const src = typeof parsed.source === \"string\" ? parsed.source : \"?\";\n const dst = typeof parsed.destination === \"string\" ? parsed.destination : \"?\";\n return `${src} → ${dst}`;\n }\n if (hasSuffix(\"get_file_info\")) {\n return `path: ${path ?? \"?\"}`;\n }\n return args.length > 80 ? `${args.slice(0, 80)}…` : args;\n}\n","import { Box, Text, useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { Countdown } from \"../primitives/Countdown.js\";\nimport { useAgentState } from \"../state/provider.js\";\nimport type { Mode, NetworkState, StatusBar } from \"../state/state.js\";\nimport { FG, TONE, balanceColor, formatBalance, formatCost } from \"../theme/tokens.js\";\n\nconst RULE_PAD = 4;\nconst RULE_MIN = 20;\nconst WALLET_MIN_COLS = 90;\n\nexport function StatusRow(): React.ReactElement {\n const status = useAgentState((s) => s.status);\n const session = useAgentState((s) => s.session);\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const ruleWidth = Math.max(RULE_MIN, cols - RULE_PAD);\n const hasTurn = status.cost > 0;\n const hasSession = status.sessionCost > 0;\n const hasBalance = typeof status.balance === \"number\";\n const showWallet = cols >= WALLET_MIN_COLS && (hasSession || hasBalance);\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text>{\" \"}</Text>\n <Text color={FG.faint}>{\"─\".repeat(ruleWidth)}</Text>\n </Box>\n <Box flexDirection=\"row\">\n <Text>{\" \"}</Text>\n {status.recording ? (\n <RecordingPill rec={status.recording} />\n ) : status.countdownSeconds !== undefined ? (\n <CountdownRow mode={status.mode} secondsLeft={status.countdownSeconds} />\n ) : (\n <ModePill mode={status.mode} network={status.network} detail={status.networkDetail} />\n )}\n <Sep />\n <Text color={FG.sub}>{`${session.id} · ${session.branch}`}</Text>\n {hasTurn && (\n <>\n <Sep />\n <Text bold color={TONE.brand}>\n {\"▸ \"}\n </Text>\n <Text bold color={FG.body}>\n {`${formatCost(status.cost, status.balanceCurrency)} turn`}\n </Text>\n </>\n )}\n <Sep />\n <Text color={TONE.accent}>{`cache ${Math.round(status.cacheHit * 100)}%`}</Text>\n {showWallet && (\n <WalletPill\n sessionCostUsd={status.sessionCost}\n balance={status.balance}\n currency={status.balanceCurrency}\n />\n )}\n </Box>\n </Box>\n );\n}\n\nfunction WalletPill({\n sessionCostUsd,\n balance,\n currency,\n}: {\n sessionCostUsd: number;\n balance?: number;\n currency?: string;\n}): React.ReactElement {\n const showSpent = sessionCostUsd > 0;\n const showBalance = typeof balance === \"number\";\n return (\n <>\n <Sep />\n <Text color={FG.meta}>{\"⛁ \"}</Text>\n {showSpent && (\n <Text color={FG.body}>{`${formatCost(sessionCostUsd, currency, 2)} spent`}</Text>\n )}\n {showSpent && showBalance && <Text color={FG.meta}>{\" / \"}</Text>}\n {showBalance && (\n <Text bold color={balanceColor(balance, currency)}>\n {formatBalance(balance, currency, { fractionDigits: 2 })}\n </Text>\n )}\n {showBalance && <Text color={FG.faint}>{\" left\"}</Text>}\n </>\n );\n}\n\nfunction ModePill({\n mode,\n network,\n detail,\n}: {\n mode: Mode;\n network: NetworkState;\n detail?: string;\n}): React.ReactElement {\n if (network === \"online\") {\n const pill = modeGlyph(mode);\n return (\n <Box flexDirection=\"row\">\n <Text color={pill.color}>{pill.glyph}</Text>\n <Text color={FG.sub}>{` ${mode}`}</Text>\n </Box>\n );\n }\n const dot = networkDot(network);\n if (network === \"slow\") {\n const tail = detail ? ` · ${detail}` : \"\";\n return (\n <Box flexDirection=\"row\">\n <Text color={dot.color}>{dot.glyph}</Text>\n <Text color={dot.color}>{` ${mode} · slow${tail}`}</Text>\n </Box>\n );\n }\n if (network === \"disconnected\") {\n const tail = detail ? ` · ${detail}` : \"\";\n return (\n <Box flexDirection=\"row\">\n <Text color={dot.color}>{dot.glyph}</Text>\n <Text color={dot.color}>{` disconnect${tail}`}</Text>\n </Box>\n );\n }\n return (\n <Box flexDirection=\"row\">\n <Text color={dot.color}>{dot.glyph}</Text>\n <Text color={dot.color}>{\" reconnecting…\"}</Text>\n </Box>\n );\n}\n\nfunction CountdownRow({\n mode,\n secondsLeft,\n}: {\n mode: Mode;\n secondsLeft: number;\n}): React.ReactElement {\n const pill = modeGlyph(mode);\n const endsAt = Date.now() + secondsLeft * 1000;\n return (\n <Box flexDirection=\"row\">\n <Text color={pill.color}>{pill.glyph}</Text>\n <Text color={FG.sub}>{` ${mode} · `}</Text>\n <Text color={TONE.warn}>{\"approving in \"}</Text>\n <Countdown endsAt={endsAt} />\n <Text color={TONE.warn}>{\"s · esc to interrupt\"}</Text>\n </Box>\n );\n}\n\nfunction RecordingPill({ rec }: { rec: NonNullable<StatusBar[\"recording\"]> }): React.ReactElement {\n const sizeMb = (rec.sizeBytes / (1024 * 1024)).toFixed(1);\n return (\n <Box flexDirection=\"row\">\n <Text bold color={TONE.err}>\n {\"●REC\"}\n </Text>\n <Text color={TONE.err}>{` ${sizeMb} MB · ${rec.events} evt`}</Text>\n </Box>\n );\n}\n\nfunction Sep(): React.ReactElement {\n return <Text color={FG.meta}>{\" · \"}</Text>;\n}\n\nfunction modeGlyph(mode: Mode): { glyph: string; color: string } {\n switch (mode) {\n case \"auto\":\n return { glyph: \"●\", color: TONE.ok };\n case \"ask\":\n return { glyph: \"◐\", color: TONE.warn };\n case \"plan\":\n return { glyph: \"⊞\", color: TONE.accent };\n case \"edit\":\n return { glyph: \"±\", color: TONE.ok };\n }\n}\n\nfunction networkDot(state: NetworkState): { glyph: string; color: string } {\n switch (state) {\n case \"online\":\n return { glyph: \"●\", color: TONE.ok };\n case \"slow\":\n return { glyph: \"◌\", color: TONE.warn };\n case \"disconnected\":\n return { glyph: \"✗\", color: TONE.err };\n case \"reconnecting\":\n return { glyph: \"↻\", color: TONE.brand };\n }\n}\n\nexport type { StatusBar };\n","import { Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { TONE } from \"../theme/tokens.js\";\nimport { useSlowTick } from \"../ticker.js\";\n\nexport interface CountdownProps {\n /** Absolute timestamp (ms since epoch) when the countdown reaches zero. */\n endsAt: number;\n /** Override digit color — default brand sky. */\n color?: string;\n}\n\nexport function Countdown({ endsAt, color = TONE.brand }: CountdownProps): React.ReactElement {\n useSlowTick();\n const remainingSec = Math.max(0, Math.ceil((endsAt - Date.now()) / 1000));\n return (\n <Text bold color={color}>\n {String(remainingSec)}\n </Text>\n );\n}\n","import { Box, Text, useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { useEffect } from \"react\";\nimport { useAgentState, useDispatch } from \"../state/provider.js\";\nimport type { Toast } from \"../state/state.js\";\nimport { FG, TONE } from \"../theme/tokens.js\";\nimport { useSlowTick } from \"../ticker.js\";\n\nconst TONE_COLOR = {\n ok: TONE.ok,\n info: TONE.brand,\n warn: TONE.warn,\n err: TONE.err,\n} as const;\n\nconst TONE_GLYPH = {\n ok: \"✓\",\n info: \"ⓘ\",\n warn: \"⚠\",\n err: \"✗\",\n} as const;\n\nfunction bodyColor(toast: Toast, now: number): string {\n const elapsed = now - toast.bornAt;\n const remaining = toast.ttlMs - elapsed;\n return remaining < toast.ttlMs / 3 ? FG.meta : FG.body;\n}\n\nexport function ToastRail(): React.ReactElement | null {\n const toasts = useAgentState((s) => s.toasts);\n const dispatch = useDispatch();\n useSlowTick();\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const rule = \"━\".repeat(Math.max(20, cols - 4));\n const now = Date.now();\n\n /** One-shot per-toast cleanup; effect re-runs only when the toast set changes (not every render). */\n useEffect(() => {\n const timers: ReturnType<typeof setTimeout>[] = [];\n for (const t of toasts) {\n const remaining = Math.max(0, t.ttlMs - (Date.now() - t.bornAt));\n timers.push(setTimeout(() => dispatch({ type: \"toast.hide\", id: t.id }), remaining));\n }\n return () => {\n for (const id of timers) clearTimeout(id);\n };\n }, [toasts, dispatch]);\n\n const visible = toasts.filter((t) => now - t.bornAt < t.ttlMs);\n if (visible.length === 0) return null;\n\n return (\n <Box flexDirection=\"column\">\n {visible.map((t) => {\n const color = TONE_COLOR[t.tone];\n const glyph = TONE_GLYPH[t.tone];\n const body = bodyColor(t, now);\n const remainingSec = Math.max(0, Math.ceil((t.ttlMs - (now - t.bornAt)) / 1000));\n return (\n <Box key={t.id} flexDirection=\"column\" paddingX={1}>\n <Text color={color}>{rule}</Text>\n <Box flexDirection=\"row\">\n <Text color={color}>{glyph}</Text>\n <Text bold color={body}>{` ${t.title}`}</Text>\n {t.detail !== undefined && <Text color={FG.sub}>{` · ${t.detail}`}</Text>}\n <Box flexGrow={1} />\n <Text color={FG.faint}>{`${remainingSec}s`}</Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n );\n}\n","// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { PlanCard } from \"../cards/PlanCard.js\";\nimport type { Card, PlanCard as PlanCardData } from \"../state/cards.js\";\nimport { useAgentState } from \"../state/provider.js\";\n\nexport function isActivePlanInFlight(card: Card): boolean {\n if (card.kind !== \"plan\") return false;\n if (card.variant !== \"active\") return false;\n return !card.steps.every((s) => s.status === \"done\" || s.status === \"skipped\");\n}\n\nexport function PlanLiveRow(): React.ReactElement | null {\n const planCard = useAgentState((s) => {\n for (let i = s.cards.length - 1; i >= 0; i--) {\n const c = s.cards[i] as Card;\n if (isActivePlanInFlight(c)) return c as PlanCardData;\n }\n return null;\n });\n if (!planCard) return null;\n return <PlanCard card={planCard} />;\n}\n","/** Pure parsing for `/loop <interval> <prompt>`; cancellation contract is enforced in App.tsx. */\n\n/** Lower bound on loop interval (ms). Faster than this would queue submits faster than turns finish. */\nexport const MIN_LOOP_INTERVAL_MS = 5_000;\n/** Upper bound on loop interval (ms). Beyond a few hours, use cron. */\nexport const MAX_LOOP_INTERVAL_MS = 6 * 60 * 60_000;\n\n/** Returns null on bad shape OR out-of-range; caller surfaces as usage hint. */\nexport function parseLoopInterval(raw: string): { ms: number } | null {\n const s = raw.trim().toLowerCase();\n if (!s) return null;\n const m = /^([0-9]+(?:\\.[0-9]+)?)(s|sec|secs|m|min|mins|h|hr|hrs)?$/.exec(s);\n if (!m) return null;\n const n = Number.parseFloat(m[1] ?? \"\");\n if (!Number.isFinite(n) || n <= 0) return null;\n const unit = m[2] ?? \"s\";\n let ms: number;\n if (unit === \"s\" || unit === \"sec\" || unit === \"secs\") ms = Math.round(n * 1000);\n else if (unit === \"m\" || unit === \"min\" || unit === \"mins\") ms = Math.round(n * 60_000);\n else if (unit === \"h\" || unit === \"hr\" || unit === \"hrs\") ms = Math.round(n * 60 * 60_000);\n else return null;\n if (ms < MIN_LOOP_INTERVAL_MS) return null;\n if (ms > MAX_LOOP_INTERVAL_MS) return null;\n return { ms };\n}\n\nexport interface ParsedLoopArgs {\n intervalMs: number;\n prompt: string;\n}\n\nexport type LoopCommand =\n | { kind: \"start\"; intervalMs: number; prompt: string }\n | { kind: \"stop\" }\n | { kind: \"status\" }\n | { kind: \"error\"; message: string };\n\nexport function parseLoopCommand(args: readonly string[]): LoopCommand {\n if (args.length === 0) return { kind: \"status\" };\n const first = (args[0] ?? \"\").toLowerCase();\n if (args.length === 1 && (first === \"stop\" || first === \"off\" || first === \"cancel\")) {\n return { kind: \"stop\" };\n }\n const interval = parseLoopInterval(args[0] ?? \"\");\n if (!interval) {\n return {\n kind: \"error\",\n message:\n \"usage: /loop <interval> <prompt> (interval = 5s..6h, e.g. 30s, 5m, 1h)\\n\" +\n \" /loop stop (cancel an active loop)\\n\" +\n \" /loop (show active-loop status)\",\n };\n }\n const prompt = args.slice(1).join(\" \").trim();\n if (!prompt) {\n return {\n kind: \"error\",\n message: `usage: /loop ${args[0]} <prompt> — interval is fine but the prompt is missing.`,\n };\n }\n return { kind: \"start\", intervalMs: interval.ms, prompt };\n}\n\nexport function formatLoopStatus(prompt: string, nextFireMs: number, iter: number): string {\n const preview = prompt.length > 36 ? `${prompt.slice(0, 33)}…` : prompt;\n const when = nextFireMs <= 0 ? \"firing now\" : `next in ${formatDuration(nextFireMs)}`;\n return `loop: \\`${preview}\\` · ${when} · iter ${iter}`;\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const totalSec = Math.round(ms / 1000);\n if (totalSec < 60) return `${totalSec}s`;\n const m = Math.floor(totalSec / 60);\n const s = totalSec % 60;\n if (m < 60) return s === 0 ? `${m}m` : `${m}m${s}s`;\n const h = Math.floor(m / 60);\n const mm = m % 60;\n return mm === 0 ? `${h}h` : `${h}h${mm}m`;\n}\n","/** Applies an MCP append-drift mid-session: registers each new tool in the loop's registry + prefix, and returns an updated summary. Immutable — does not mutate the input `target`. */\n\nimport type { CacheFirstLoop } from \"../../loop.js\";\nimport { registerSingleMcpTool } from \"../../mcp/registry.js\";\nimport type { McpTool } from \"../../mcp/types.js\";\nimport type { JSONSchema, ToolSpec } from \"../../types.js\";\nimport type { McpServerSummary } from \"./slash/types.js\";\n\nexport function applyMcpAppend(\n loop: CacheFirstLoop,\n target: McpServerSummary,\n addedTools: McpTool[],\n): McpServerSummary {\n const accepted: McpTool[] = [];\n for (const mcpTool of addedTools) {\n if (!mcpTool.name) continue;\n const registeredName = registerSingleMcpTool(mcpTool, target.bridgeEnv);\n if (!registeredName) continue;\n const spec: ToolSpec = {\n type: \"function\",\n function: {\n name: registeredName,\n description: mcpTool.description ?? \"\",\n parameters: mcpTool.inputSchema as unknown as JSONSchema,\n },\n };\n loop.prefix.addTool(spec);\n accepted.push(mcpTool);\n }\n if (accepted.length === 0 || !target.report.tools.supported) return target;\n\n const merged = [...target.report.tools.items, ...accepted];\n return {\n ...target,\n toolCount: merged.length,\n report: {\n ...target.report,\n tools: {\n supported: true as const,\n items: merged,\n },\n },\n };\n}\n","/** `/resource` + `/prompt` handlers — async (round-trip to MCP server), so App.tsx calls directly instead of `handleSlash`. */\n\nimport type {\n GetPromptResult,\n McpPromptMessage,\n McpResourceContents,\n ReadResourceResult,\n} from \"../../mcp/types.js\";\nimport type { Scrollback } from \"./hooks/useScrollback.js\";\nimport type { McpServerSummary } from \"./slash.js\";\n\nexport function formatResourceList(servers: readonly McpServerSummary[]): string {\n const lines: string[] = [];\n let total = 0;\n for (const s of servers) {\n if (!s.report.resources.supported) continue;\n const items = s.report.resources.items;\n if (items.length === 0) continue;\n lines.push(`[${s.label}] ${items.length} resource(s):`);\n for (const r of items.slice(0, 20)) {\n const name = r.name && r.name !== r.uri ? ` ${r.name}` : \"\";\n const mime = r.mimeType ? ` · ${r.mimeType}` : \"\";\n lines.push(` · ${r.uri}${name}${mime}`);\n total++;\n }\n if (items.length > 20) lines.push(` (+${items.length - 20} more)`);\n lines.push(\"\");\n }\n if (total === 0) {\n return \"No resources on any connected MCP server (or no servers connected). `/mcp` shows the current set.\";\n }\n lines.push(\"Read one: `/resource <uri>` — or use Tab in the picker.\");\n return lines.join(\"\\n\");\n}\n\nexport function formatPromptList(servers: readonly McpServerSummary[]): string {\n const lines: string[] = [];\n let total = 0;\n for (const s of servers) {\n if (!s.report.prompts.supported) continue;\n const items = s.report.prompts.items;\n if (items.length === 0) continue;\n lines.push(`[${s.label}] ${items.length} prompt(s):`);\n for (const p of items.slice(0, 20)) {\n const desc = p.description ? ` — ${p.description}` : \"\";\n const argHint =\n p.arguments && p.arguments.length > 0\n ? ` (args: ${p.arguments.map((a) => a.name + (a.required ? \"*\" : \"?\")).join(\", \")})`\n : \"\";\n lines.push(` · ${p.name}${argHint}${desc}`);\n total++;\n }\n if (items.length > 20) lines.push(` (+${items.length - 20} more)`);\n lines.push(\"\");\n }\n if (total === 0) {\n return \"No prompts on any connected MCP server (or no servers connected). `/mcp` shows the current set.\";\n }\n lines.push(\n \"Fetch one: `/prompt <name>` — args are not supported yet; prompts with required args will surface an error from the server.\",\n );\n return lines.join(\"\\n\");\n}\n\nexport function findServerForResource(\n servers: readonly McpServerSummary[],\n uri: string,\n): McpServerSummary | null {\n for (const s of servers) {\n if (!s.report.resources.supported) continue;\n if (s.report.resources.items.some((r) => r.uri === uri)) return s;\n }\n return null;\n}\n\nexport function findServerForPrompt(\n servers: readonly McpServerSummary[],\n name: string,\n): McpServerSummary | null {\n for (const s of servers) {\n if (!s.report.prompts.supported) continue;\n if (s.report.prompts.items.some((p) => p.name === name)) return s;\n }\n return null;\n}\n\nexport function formatResourceContents(uri: string, result: ReadResourceResult): string {\n const lines: string[] = [`Resource ${uri} (${result.contents.length} content block(s)):`, \"\"];\n for (let i = 0; i < result.contents.length; i++) {\n const c = result.contents[i]!;\n const header = `— block ${i + 1}${c.mimeType ? ` · ${c.mimeType}` : \"\"}`;\n lines.push(header);\n lines.push(formatOneResourceContent(c));\n lines.push(\"\");\n }\n return lines.join(\"\\n\").trimEnd();\n}\n\nfunction formatOneResourceContent(c: McpResourceContents): string {\n if (\"text\" in c) {\n const MAX = 8_000;\n if (c.text.length > MAX) {\n return `${c.text.slice(0, MAX)}\\n\\n[…truncated ${c.text.length - MAX} chars; full contents available via McpClient.readResource in library mode.]`;\n }\n return c.text;\n }\n // blob — we can't render arbitrary binary in the TUI; give the size.\n const bytes = typeof c.blob === \"string\" ? approximateBase64ByteSize(c.blob) : 0;\n return `[binary · ~${bytes.toLocaleString()} bytes · base64]`;\n}\n\nfunction approximateBase64ByteSize(b64: string): number {\n // 4 base64 chars encode 3 bytes; padding `=` trims the output.\n const padding = b64.endsWith(\"==\") ? 2 : b64.endsWith(\"=\") ? 1 : 0;\n return Math.floor((b64.length * 3) / 4) - padding;\n}\n\nexport function formatPromptMessages(name: string, result: GetPromptResult): string {\n const lines: string[] = [\n `Prompt ${name}${result.description ? ` — ${result.description}` : \"\"}`,\n `(${result.messages.length} message(s))`,\n \"\",\n ];\n for (let i = 0; i < result.messages.length; i++) {\n const m = result.messages[i]!;\n lines.push(`— ${i + 1}. ${m.role}`);\n lines.push(formatOnePromptMessage(m));\n lines.push(\"\");\n }\n return lines.join(\"\\n\").trimEnd();\n}\n\nfunction formatOnePromptMessage(m: McpPromptMessage): string {\n const block = m.content as { type?: string; text?: string; resource?: McpResourceContents };\n if (block.type === \"text\" && typeof block.text === \"string\") return block.text;\n if (block.type === \"resource\" && block.resource) {\n return `[resource: ${block.resource.uri}]\\n${formatOneResourceContent(block.resource)}`;\n }\n return `[non-text content: ${block.type ?? \"unknown\"}]`;\n}\n\nexport async function handleMcpBrowseSlash(\n kind: \"resource\" | \"prompt\",\n arg: string,\n servers: readonly McpServerSummary[],\n log: Scrollback,\n): Promise<void> {\n // No arg → list mode.\n if (!arg) {\n log.pushInfo(kind === \"resource\" ? formatResourceList(servers) : formatPromptList(servers));\n return;\n }\n\n if (kind === \"resource\") {\n const server = findServerForResource(servers, arg);\n if (!server) {\n log.pushWarning(\n `no server exposes resource \"${arg}\"`,\n \"`/resource` with no arg lists what's available.\",\n );\n return;\n }\n try {\n const result = await server.readResource(arg);\n log.pushInfo(formatResourceContents(arg, result));\n } catch (err) {\n log.pushWarning(\"readResource failed\", (err as Error).message);\n }\n return;\n }\n\n // prompt\n const server = findServerForPrompt(servers, arg);\n if (!server) {\n log.pushWarning(\n `no server exposes prompt \"${arg}\"`,\n \"`/prompt` with no arg lists what's available.\",\n );\n return;\n }\n try {\n const result = await server.getPrompt(arg);\n log.pushInfo(formatPromptMessages(arg, result));\n } catch (err) {\n log.pushWarning(\"getPrompt failed\", (err as Error).message);\n }\n}\n","import type { McpServerSummary } from \"./slash/types.js\";\n\nexport function sameMcpServerSummary(a: McpServerSummary, b: McpServerSummary): boolean {\n return a === b || (a.label === b.label && a.spec === b.spec);\n}\n\nexport function replaceMcpServerSummary(\n servers: McpServerSummary[],\n target: McpServerSummary,\n updated: McpServerSummary,\n): McpServerSummary[] {\n return servers.map((server) => (sameMcpServerSummary(server, target) ? updated : server));\n}\n","/** Display-only — the MODEL always receives full paste text. */\n\nexport const DEFAULT_PASTE_LINE_THRESHOLD = 40;\nexport const DEFAULT_PASTE_CHAR_THRESHOLD = 2000;\n/** Lines kept visible at the head of a collapsed paste. */\nexport const DEFAULT_PASTE_HEAD_LINES = 10;\n\nexport interface PasteCollapseOptions {\n lineThreshold?: number;\n charThreshold?: number;\n headLines?: number;\n}\n\nexport interface PasteCollapseResult {\n /** Text to render in the Historical row (possibly collapsed). */\n displayText: string;\n /** True when collapsing happened. False = input passed through verbatim. */\n collapsed: boolean;\n /** Original char length — exposed so callers can log/annotate. */\n originalChars: number;\n /** Original line count. */\n originalLines: number;\n}\n\nexport function formatLongPaste(\n input: string,\n opts: PasteCollapseOptions = {},\n): PasteCollapseResult {\n const lineCap = opts.lineThreshold ?? DEFAULT_PASTE_LINE_THRESHOLD;\n const charCap = opts.charThreshold ?? DEFAULT_PASTE_CHAR_THRESHOLD;\n const headN = Math.max(1, opts.headLines ?? DEFAULT_PASTE_HEAD_LINES);\n\n const originalChars = input.length;\n const lines = input.split(\"\\n\");\n const originalLines = lines.length;\n\n if (originalChars <= charCap && originalLines <= lineCap) {\n return { displayText: input, collapsed: false, originalChars, originalLines };\n }\n\n const header = `▸ pasted ${formatBytes(originalChars)} (${originalLines} lines) — first ${Math.min(headN, originalLines)} shown, full text sent to model`;\n const head = lines.slice(0, headN).join(\"\\n\");\n const remaining = originalLines - headN;\n const footer = remaining > 0 ? `… (${remaining} more line${remaining === 1 ? \"\" : \"s\"})` : \"\";\n const displayText = footer ? `${header}\\n${head}\\n${footer}` : `${header}\\n${head}`;\n return { displayText, collapsed: true, originalChars, originalLines };\n}\n\nfunction formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n const kb = n / 1024;\n if (kb < 1024) return `${kb.toFixed(kb >= 10 ? 0 : 1)} KB`;\n const mb = kb / 1024;\n return `${mb.toFixed(mb >= 10 ? 0 : 1)} MB`;\n}\n","import {\n HOOK_EVENTS,\n type HookEvent,\n type ResolvedHook,\n globalSettingsPath,\n projectSettingsPath,\n} from \"@/hooks.js\";\nimport { t } from \"@/i18n/index.js\";\nimport { aggregateUsage, defaultUsageLogPath, readUsageLog } from \"@/telemetry/usage.js\";\nimport { VERSION, compareVersions, isNpxInstall } from \"@/version.js\";\nimport { runDoctorChecks } from \"../../../commands/doctor.js\";\nimport { renderDashboard } from \"../../../commands/stats.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\n\nconst doctor: SlashHandler = (_args, _loop, ctx) => {\n const root = ctx.codeRoot ?? process.cwd();\n if (!ctx.postDoctor) return { info: t(\"handlers.admin.doctorNeedsTui\") };\n void (async () => {\n const checks = await runDoctorChecks(root);\n ctx.postDoctor!(\n checks.map((c) => ({ label: c.label.trim(), level: c.level, detail: c.detail })),\n );\n })();\n return { info: t(\"handlers.admin.doctorRunning\") };\n};\n\nconst hooks: SlashHandler = (args, loop, ctx) => {\n const sub = (args[0] ?? \"\").toLowerCase();\n\n if (sub === \"reload\") {\n if (!ctx.reloadHooks) {\n return { info: t(\"handlers.admin.hooksReloadUnavailable\") };\n }\n const count = ctx.reloadHooks();\n return { info: t(\"handlers.admin.hooksReloaded\", { count }) };\n }\n\n if (sub !== \"\" && sub !== \"list\" && sub !== \"ls\") {\n return { info: t(\"handlers.admin.hooksUsage\") };\n }\n\n const all = loop.hooks;\n const projPath = ctx.codeRoot ? projectSettingsPath(ctx.codeRoot) : undefined;\n const globPath = globalSettingsPath();\n if (all.length === 0) {\n const lines = [\n t(\"handlers.admin.hooksNone\"),\n \"\",\n t(\"handlers.admin.hooksDropHint\"),\n ctx.codeRoot\n ? t(\"handlers.admin.hooksProject\", { path: projPath! })\n : t(\"handlers.admin.hooksProjectFallback\"),\n t(\"handlers.admin.hooksGlobal\", { path: globPath }),\n \"\",\n t(\"handlers.admin.hooksEvents\"),\n t(\"handlers.admin.hooksExitCodes\"),\n ];\n return { info: lines.join(\"\\n\") };\n }\n\n const grouped = new Map<HookEvent, ResolvedHook[]>();\n for (const event of HOOK_EVENTS) grouped.set(event, []);\n for (const h of all) grouped.get(h.event)?.push(h);\n\n const lines: string[] = [t(\"handlers.admin.hooksLoaded\", { count: all.length })];\n for (const event of HOOK_EVENTS) {\n const list = grouped.get(event) ?? [];\n if (list.length === 0) continue;\n lines.push(\"\", `${event}:`);\n for (const h of list) {\n const match = h.match && h.match !== \"*\" ? ` match=${h.match}` : \"\";\n const desc = h.description ? ` — ${h.description}` : \"\";\n lines.push(` [${h.scope}]${match} ${h.command}${desc}`);\n }\n }\n lines.push(\n \"\",\n t(\"handlers.admin.hooksSources\", {\n project: projPath ?? \"(none — chat mode)\",\n global: globPath,\n }),\n );\n return { info: lines.join(\"\\n\") };\n};\n\nconst update: SlashHandler = (_args, _loop, ctx) => {\n const latest = ctx.latestVersion ?? null;\n const lines: string[] = [t(\"handlers.admin.updateCurrent\", { version: VERSION })];\n if (latest === null) {\n ctx.refreshLatestVersion?.();\n lines.push(\n t(\"handlers.admin.updateLatestPending\"),\n \"\",\n t(\"handlers.admin.updateRetryHint\"),\n t(\"handlers.admin.updateRetryHint2\"),\n );\n return { info: lines.join(\"\\n\") };\n }\n lines.push(t(\"handlers.admin.updateLatest\", { version: latest }));\n const diff = compareVersions(VERSION, latest);\n if (diff >= 0) {\n lines.push(\"\", t(\"handlers.admin.updateUpToDate\"));\n return { info: lines.join(\"\\n\") };\n }\n if (isNpxInstall()) {\n lines.push(\"\", t(\"handlers.admin.updateNpxHint\"), t(\"handlers.admin.updateNpxForce\"));\n } else {\n lines.push(\n \"\",\n t(\"handlers.admin.updateUpgradeHint\"),\n t(\"handlers.admin.updateUpgradeCmd1\"),\n t(\"handlers.admin.updateUpgradeCmd2\"),\n \"\",\n t(\"handlers.admin.updateInSessionDisabled\"),\n t(\"handlers.admin.updateInSessionDisabled2\"),\n );\n }\n return { info: lines.join(\"\\n\") };\n};\n\nconst stats: SlashHandler = () => {\n const path = defaultUsageLogPath();\n const records = readUsageLog(path);\n if (records.length === 0) {\n return {\n info: [\n t(\"handlers.admin.statsNoData\"),\n \"\",\n ` ${path}`,\n \"\",\n t(\"handlers.admin.statsEveryTurn\"),\n t(\"handlers.admin.statsWillAppear\"),\n ].join(\"\\n\"),\n };\n }\n const agg = aggregateUsage(records);\n return { info: renderDashboard(agg, path) };\n};\n\nexport const handlers: Record<string, SlashHandler> = {\n hook: hooks,\n hooks,\n update,\n stats,\n doctor,\n};\n","import { t, tObj } from \"@/i18n/index.js\";\nimport { formatDuration, formatLoopStatus, parseLoopCommand } from \"../../loop.js\";\nimport { SLASH_COMMANDS } from \"../commands.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\nimport type { SlashCommandSpec, SlashGroup } from \"../types.js\";\n\nconst exit: SlashHandler = () => ({ exit: true });\n\nconst resetLog: SlashHandler = (_args, loop) => {\n const { dropped } = loop.clearLog();\n return {\n clear: true,\n info: t(\"handlers.basic.newInfo\", { count: dropped }),\n };\n};\n\nconst GROUP_ORDER: ReadonlyArray<SlashGroup> = [\n \"chat\",\n \"setup\",\n \"info\",\n \"session\",\n \"extend\",\n \"code\",\n \"jobs\",\n \"advanced\",\n];\n\nconst GROUP_HEADER: Record<SlashGroup, string> = {\n chat: \"CHAT · daily turn ops\",\n setup: \"SETUP · model + cost\",\n info: \"INFO · current state\",\n session: \"SESSION · saved sessions\",\n extend: \"EXTEND · MCP, memory, skills\",\n code: \"CODE · edits + plans (code mode)\",\n jobs: \"JOBS · background processes (code mode)\",\n advanced: \"ADVANCED · rare or set-and-forget\",\n};\n\nfunction renderRow(spec: SlashCommandSpec): string {\n const name = `/${spec.cmd}${spec.argsHint ? ` ${spec.argsHint}` : \"\"}`;\n const desc = t(`slash.${spec.cmd}.description`);\n const summary = desc === `slash.${spec.cmd}.description` ? spec.summary : desc;\n return ` ${name.padEnd(28)} ${summary}`;\n}\n\nconst help: SlashHandler = () => {\n const lines: string[] = [t(\"handlers.basic.helpTitle\"), \"\"];\n for (const group of GROUP_ORDER) {\n const rows = SLASH_COMMANDS.filter((c) => c.group === group);\n if (rows.length === 0) continue;\n lines.push(` ${GROUP_HEADER[group]}`);\n for (const r of rows) lines.push(renderRow(r));\n lines.push(\"\");\n }\n lines.push(\n t(\"handlers.basic.helpShellTitle\"),\n t(\"handlers.basic.helpShell\"),\n t(\"handlers.basic.helpShellDetail\"),\n t(\"handlers.basic.helpShellConsent\"),\n t(\"handlers.basic.helpShellExample\"),\n \"\",\n t(\"handlers.basic.helpMemoryTitle\"),\n t(\"handlers.basic.helpMemoryPin\"),\n t(\"handlers.basic.helpMemoryPinEx\"),\n t(\"handlers.basic.helpMemoryGlobal\"),\n t(\"handlers.basic.helpMemoryGlobalEx\"),\n t(\"handlers.basic.helpMemoryPinBoth\"),\n t(\"handlers.basic.helpMemoryEscape\"),\n \"\",\n t(\"handlers.basic.helpFileTitle\"),\n t(\"handlers.basic.helpFile\"),\n t(\"handlers.basic.helpFilePicker\"),\n \"\",\n t(\"handlers.basic.helpUrlTitle\"),\n t(\"handlers.basic.helpUrl\"),\n t(\"handlers.basic.helpUrlCache\"),\n t(\"handlers.basic.helpUrlPunct\"),\n \"\",\n t(\"handlers.basic.helpPresetsTitle\"),\n t(\"handlers.basic.helpPresetAuto\"),\n t(\"handlers.basic.helpPresetFlash\"),\n t(\"handlers.basic.helpPresetPro\"),\n \"\",\n t(\"handlers.basic.helpSessionsTitle\"),\n t(\"handlers.basic.helpSessionCustom\"),\n t(\"handlers.basic.helpSessionNone\"),\n );\n return { info: lines.join(\"\\n\") };\n};\n\nconst retry: SlashHandler = (_args, loop) => {\n const prev = loop.retryLastUser();\n if (!prev) {\n return { info: t(\"handlers.basic.retryNone\") };\n }\n const preview = prev.length > 80 ? `${prev.slice(0, 80)}…` : prev;\n return {\n info: t(\"handlers.basic.retryInfo\", { preview }),\n resubmit: prev,\n };\n};\n\nconst loop: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.startLoop || !ctx.stopLoop || !ctx.getLoopStatus) {\n return { info: t(\"handlers.basic.loopTuiOnly\") };\n }\n const cmd = parseLoopCommand(args);\n if (cmd.kind === \"error\") return { info: cmd.message };\n if (cmd.kind === \"stop\") {\n const wasActive = ctx.getLoopStatus() !== null;\n ctx.stopLoop();\n return {\n info: wasActive ? t(\"handlers.basic.loopStopped\") : t(\"handlers.basic.loopNoActive\"),\n };\n }\n if (cmd.kind === \"status\") {\n const status = ctx.getLoopStatus();\n if (!status) {\n return { info: t(\"handlers.basic.loopNoActiveHint\") };\n }\n return { info: `▸ ${formatLoopStatus(status.prompt, status.nextFireMs, status.iter)}` };\n }\n ctx.startLoop(cmd.intervalMs, cmd.prompt);\n return {\n info: t(\"handlers.basic.loopStarted\", {\n prompt: cmd.prompt,\n duration: formatDuration(cmd.intervalMs),\n }),\n };\n};\n\nconst keys: SlashHandler = (_args, _loop, ctx) => {\n if (!ctx.postKeys) return { info: t(\"handlers.basic.keysNeedsTui\") };\n const ref = tObj<{\n topic: string;\n sections: ReadonlyArray<{\n title?: string;\n rows: ReadonlyArray<{ key: string; text: string }>;\n }>;\n footer: string;\n }>(\"ui.keysReference\");\n ctx.postKeys({ topic: ref.topic, sections: ref.sections, footer: ref.footer });\n return {};\n};\n\nexport const handlers: Record<string, SlashHandler> = {\n exit,\n new: resetLog,\n help,\n retry,\n loop,\n keys,\n};\n","import { t } from \"@/i18n/index.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\n\nconst dashboard: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.startDashboard || !ctx.getDashboardUrl) {\n return { info: t(\"handlers.dashboard.notAvailable\") };\n }\n\n const sub = (args[0] ?? \"\").toLowerCase();\n\n if (sub === \"stop\" || sub === \"off\") {\n if (!ctx.stopDashboard) {\n return { info: t(\"handlers.dashboard.stopNoCallback\") };\n }\n const url = ctx.getDashboardUrl();\n if (!url) return { info: t(\"handlers.dashboard.notRunning\") };\n ctx.stopDashboard();\n return { info: t(\"handlers.dashboard.stopping\") };\n }\n\n const existing = ctx.getDashboardUrl();\n if (existing) {\n return {\n info: [\n t(\"handlers.dashboard.alreadyRunning\"),\n ` ${existing}`,\n \"\",\n t(\"handlers.dashboard.alreadyRunningHint\"),\n ].join(\"\\n\"),\n };\n }\n\n ctx\n .startDashboard()\n .then((url) => {\n ctx.postInfo?.(\n [t(\"handlers.dashboard.ready\"), ` ${url}`, \"\", t(\"handlers.dashboard.readyHint\")].join(\n \"\\n\",\n ),\n );\n })\n .catch((err: Error) => {\n ctx.postInfo?.(t(\"handlers.dashboard.failed\", { reason: err.message }));\n });\n\n return { info: t(\"handlers.dashboard.starting\") };\n};\n\nexport const handlers: Record<string, SlashHandler> = { dashboard };\n","import { spawnSync } from \"node:child_process\";\nimport type { MemoryScope, MemoryStore } from \"../../../memory/user.js\";\nimport type { SlashResult } from \"./types.js\";\n\n/** Bare names try project scope first (more specific) before falling back to global. */\nexport function resolveMemoryTarget(\n store: MemoryStore,\n raw: string,\n): { scope: MemoryScope; name: string } | null {\n const slash = raw.indexOf(\"/\");\n if (slash > 0) {\n const scopeRaw = raw.slice(0, slash).toLowerCase();\n const name = raw.slice(slash + 1);\n if (scopeRaw !== \"global\" && scopeRaw !== \"project\") return null;\n const scope = scopeRaw as MemoryScope;\n if (scope === \"project\" && !store.hasProjectScope()) return null;\n return { scope, name };\n }\n for (const scope of [\"project\", \"global\"] as MemoryScope[]) {\n if (scope === \"project\" && !store.hasProjectScope()) continue;\n try {\n store.read(scope, raw);\n return { scope, name: raw };\n } catch {\n /* next scope */\n }\n }\n return null;\n}\n\nexport function appendSection(\n lines: string[],\n label: string,\n section:\n | { supported: true; items: Array<{ name: string }> }\n | { supported: false; reason: string }\n | undefined,\n): void {\n if (!section || !section.supported) {\n lines.push(\n ` ${label.trim()} ${section?.supported === false ? \"(not supported)\" : \"(none)\"}`,\n );\n return;\n }\n const names = section.items.map((i) => i.name);\n if (names.length === 0) {\n lines.push(` ${label.trim()} (none)`);\n return;\n }\n const head = names.slice(0, 5).join(\", \");\n const more = names.length > 5 ? ` +${names.length - 5} more` : \"\";\n lines.push(` ${label.trim()} ${names.length} [${head}${more}]`);\n}\n\n/** Binary-K to match DeepSeek docs; do NOT reuse for non-token counts. */\nexport function compactNum(n: number): string {\n if (n < 1024) return String(n);\n const k = n / 1024;\n return k >= 100 ? `${Math.round(k)}K` : `${k.toFixed(1)}K`;\n}\n\nexport function stripOuterQuotes(s: string): string {\n if (s.length >= 2 && s.startsWith('\"') && s.endsWith('\"')) {\n return s.slice(1, -1);\n }\n return s;\n}\n\nexport function runGitCommit(rootDir: string, message: string): SlashResult {\n const add = spawnSync(\"git\", [\"add\", \"-A\"], { cwd: rootDir, encoding: \"utf8\" });\n if (add.error || add.status !== 0) {\n return { info: `git add failed (${add.status ?? \"?\"}):\\n${gitTail(add)}` };\n }\n const commit = spawnSync(\"git\", [\"commit\", \"-m\", message], {\n cwd: rootDir,\n encoding: \"utf8\",\n });\n if (commit.error || commit.status !== 0) {\n return { info: `git commit failed (${commit.status ?? \"?\"}):\\n${gitTail(commit)}` };\n }\n const firstLine = (commit.stdout || \"\").split(/\\r?\\n/)[0] ?? \"\";\n return { info: `▸ committed: ${message}${firstLine ? `\\n ${firstLine}` : \"\"}` };\n}\n\n/** On Windows or missing cwd, stderr/stdout can be undefined — fall back to error.message. */\nexport function gitTail(res: ReturnType<typeof spawnSync>): string {\n const stderr = (res.stderr as string | undefined) ?? \"\";\n const stdout = (res.stdout as string | undefined) ?? \"\";\n const body = stderr.trim() || stdout.trim();\n if (body) return body;\n if (res.error) return (res.error as Error).message;\n return \"(no output from git)\";\n}\n","import {\n createCheckpoint,\n deleteCheckpoint,\n findCheckpoint,\n fmtAgo,\n listCheckpoints,\n restoreCheckpoint,\n} from \"@/code/checkpoints.js\";\nimport type { EditMode } from \"@/config.js\";\nimport { t } from \"@/i18n/index.js\";\nimport { parseEditIndices } from \"../../edit-history.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\nimport { runGitCommit, stripOuterQuotes } from \"../helpers.js\";\n\nconst undo: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.codeUndo) {\n return { info: t(\"handlers.edits.undoCodeOnly\") };\n }\n return { info: ctx.codeUndo(args) };\n};\n\nconst history: SlashHandler = (_args, _loop, ctx) => {\n if (!ctx.codeHistory) {\n return { info: t(\"handlers.edits.historyCodeOnly\") };\n }\n return { info: ctx.codeHistory() };\n};\n\nconst show: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.codeShowEdit) {\n return { info: t(\"handlers.edits.showCodeOnly\") };\n }\n return { info: ctx.codeShowEdit(args) };\n};\n\nconst apply: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.codeApply) {\n return { info: t(\"handlers.edits.applyCodeOnly\") };\n }\n const parsed = parseIndicesArg(args, ctx.pendingEditCount ?? 0);\n if (\"error\" in parsed) return { info: `/apply: ${parsed.error}` };\n return { info: ctx.codeApply(parsed.indices) };\n};\n\nconst discard: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.codeDiscard) {\n return { info: t(\"handlers.edits.discardCodeOnly\") };\n }\n const parsed = parseIndicesArg(args, ctx.pendingEditCount ?? 0);\n if (\"error\" in parsed) return { info: `/discard: ${parsed.error}` };\n return { info: ctx.codeDiscard(parsed.indices) };\n};\n\nfunction parseIndicesArg(\n args: readonly string[],\n max: number,\n): { indices: readonly number[] } | { error: string } {\n const raw = args.join(\",\").replace(/,+/g, \",\").replace(/^,|,$/g, \"\");\n if (!raw) return { indices: [] };\n const parsed = parseEditIndices(raw, max);\n if (\"error\" in parsed) return { error: parsed.error };\n return { indices: parsed.ok };\n}\n\nconst plan: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.setPlanMode) {\n return { info: t(\"handlers.edits.planCodeOnly\") };\n }\n const currentOn = Boolean(ctx.planMode);\n const raw = (args[0] ?? \"\").toLowerCase();\n let target: boolean;\n if (raw === \"on\" || raw === \"true\" || raw === \"1\") target = true;\n else if (raw === \"off\" || raw === \"false\" || raw === \"0\") target = false;\n else target = !currentOn;\n ctx.setPlanMode(target);\n if (target) {\n return { info: t(\"handlers.edits.planOn\") };\n }\n return { info: t(\"handlers.edits.planOff\") };\n};\n\nconst mode: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.setEditMode) {\n return { info: t(\"handlers.edits.modeCodeOnly\") };\n }\n const raw = (args[0] ?? \"\").toLowerCase();\n const current = ctx.editMode ?? \"review\";\n let target: EditMode;\n if (raw === \"review\") target = \"review\";\n else if (raw === \"auto\") target = \"auto\";\n else if (raw === \"yolo\") target = \"yolo\";\n else if (raw === \"\") {\n target = current === \"review\" ? \"auto\" : current === \"auto\" ? \"yolo\" : \"review\";\n } else {\n return { info: t(\"handlers.edits.modeUsage\") };\n }\n ctx.setEditMode(target);\n const banner =\n target === \"yolo\"\n ? t(\"handlers.edits.modeYolo\")\n : target === \"auto\"\n ? t(\"handlers.edits.modeAuto\")\n : t(\"handlers.edits.modeReview\");\n return { info: banner };\n};\n\nconst commit: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.codeRoot) {\n return { info: t(\"handlers.edits.commitCodeOnly\") };\n }\n const raw = args.join(\" \").trim();\n const message = stripOuterQuotes(raw);\n if (!message) {\n return { info: t(\"handlers.edits.commitUsage\", { root: ctx.codeRoot }) };\n }\n return runGitCommit(ctx.codeRoot, message);\n};\n\nconst walk: SlashHandler = (_args, _loop, ctx) => {\n if (!ctx.startWalkthrough) {\n return { info: t(\"handlers.edits.walkCodeOnly\") };\n }\n return { info: ctx.startWalkthrough() };\n};\n\nconst checkpoint: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.codeRoot || !ctx.touchedFiles) {\n return { info: t(\"handlers.edits.checkpointCodeOnly\") };\n }\n const sub = (args[0] ?? \"\").toLowerCase();\n const rest = args.slice(1).join(\" \").trim();\n\n if (sub === \"\" || sub === \"list\") {\n const items = [...listCheckpoints(ctx.codeRoot)].reverse();\n if (items.length === 0) {\n return { info: t(\"handlers.edits.checkpointNone\") };\n }\n const lines = [t(\"handlers.edits.checkpointHeader\", { count: items.length }), \"\"];\n for (const m of items) {\n const sizeKb = (m.bytes / 1024).toFixed(1);\n const tag = m.source === \"manual\" ? \"\" : ` (${m.source})`;\n lines.push(\n ` ${m.id} ${fmtAgo(m.createdAt).padEnd(8)} ${m.name}${tag} · ${m.fileCount} file${m.fileCount === 1 ? \"\" : \"s\"}, ${sizeKb} KB`,\n );\n }\n lines.push(\"\");\n lines.push(t(\"handlers.edits.checkpointRestoreHint\"));\n return { info: lines.join(\"\\n\") };\n }\n\n if (sub === \"forget\" || sub === \"rm\" || sub === \"delete\") {\n if (!rest) return { info: t(\"handlers.edits.checkpointForgetUsage\") };\n const found = findCheckpoint(ctx.codeRoot, rest);\n if (!found) return { info: t(\"handlers.edits.checkpointNoMatch\", { name: rest }) };\n const ok = deleteCheckpoint(ctx.codeRoot, found.id);\n return {\n info: ok\n ? t(\"handlers.edits.checkpointDeleted\", { id: found.id, name: found.name })\n : t(\"handlers.edits.checkpointDeleteFailed\", { id: found.id }),\n };\n }\n\n const name = args.join(\" \").trim();\n if (!name) {\n return { info: t(\"handlers.edits.checkpointSaveUsage\") };\n }\n const paths = ctx.touchedFiles();\n const meta = createCheckpoint({\n rootDir: ctx.codeRoot,\n name,\n paths,\n source: \"manual\",\n });\n if (paths.length === 0) {\n return {\n info: t(\"handlers.edits.checkpointSavedEmpty\", { name, id: meta.id }),\n };\n }\n return {\n info: t(\"handlers.edits.checkpointSaved\", {\n name,\n id: meta.id,\n files: meta.fileCount,\n s: meta.fileCount === 1 ? \"\" : \"s\",\n size: (meta.bytes / 1024).toFixed(1),\n }),\n };\n};\n\nconst restore: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.codeRoot) {\n return { info: t(\"handlers.edits.restoreCodeOnly\") };\n }\n const target = args.join(\" \").trim();\n if (!target) {\n return { openCheckpointPicker: true };\n }\n const found = findCheckpoint(ctx.codeRoot, target);\n if (!found) {\n return { info: t(\"handlers.edits.restoreNoMatch\", { target }) };\n }\n const result = restoreCheckpoint(ctx.codeRoot, found.id);\n const lines = [\n t(\"handlers.edits.restoreInfo\", {\n name: found.name,\n id: found.id,\n when: fmtAgo(found.createdAt),\n }),\n ];\n if (result.restored.length > 0) {\n lines.push(\n t(\"handlers.edits.restoreWrote\", {\n count: result.restored.length,\n s: result.restored.length === 1 ? \"\" : \"s\",\n }),\n );\n }\n if (result.removed.length > 0) {\n lines.push(\n t(\"handlers.edits.restoreRemoved\", {\n count: result.removed.length,\n s: result.removed.length === 1 ? \"\" : \"s\",\n }),\n );\n }\n if (result.skipped.length > 0) {\n lines.push(\n t(\"handlers.edits.restoreSkipped\", {\n count: result.skipped.length,\n s: result.skipped.length === 1 ? \"\" : \"s\",\n }),\n );\n for (const s of result.skipped.slice(0, 5)) {\n lines.push(` ${s.path} — ${s.reason}`);\n }\n if (result.skipped.length > 5) {\n lines.push(` … ${result.skipped.length - 5} more`);\n }\n }\n return { info: lines.join(\"\\n\") };\n};\n\nconst cwd: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.switchCwd) {\n return { info: t(\"handlers.edits.cwdCodeOnly\") };\n }\n const target = args.join(\" \").trim();\n if (!target) {\n return {\n info:\n ctx.codeRoot != null\n ? t(\"handlers.edits.cwdUsage\", { current: ctx.codeRoot })\n : t(\"handlers.edits.cwdUsageNoCurrent\"),\n };\n }\n const result = ctx.switchCwd(stripOuterQuotes(target));\n return { info: result.info };\n};\n\nexport const handlers: Record<string, SlashHandler> = {\n undo,\n history,\n show,\n apply,\n discard,\n plan,\n mode,\n commit,\n walk,\n checkpoint,\n restore,\n cwd,\n};\n","import { existsSync } from \"node:fs\";\nimport * as pathMod from \"node:path\";\nimport { t } from \"@/i18n/index.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\n\nconst INIT_PROMPT = [\n \"# Task: Initialize REASONIX.md\",\n \"\",\n \"I want you to generate a REASONIX.md at the project root that captures\",\n \"the working knowledge a future Reasonix session needs to be productive\",\n \"here. This file is auto-pinned into your system prompt every launch,\",\n \"so its size and accuracy matter.\",\n \"\",\n \"## Hard constraints (do NOT relax these)\",\n \"\",\n \"- **Length cap: ≤ 80 lines / 3KB total.** Be concise. If you can't fit a\",\n \" section, drop it.\",\n \"- **Only document things you can verify by reading files.** Do NOT\",\n \" speculate about architectural intent, future roadmap, or design\",\n \" rationale. If it isn't obvious from the code, leave it out.\",\n \"- **No placeholder text.** No 'TODO: describe X', no 'Add more here'.\",\n \" Either state a fact or omit the section.\",\n \"\",\n \"## Procedure\",\n \"\",\n \"1. Read the top of any existing README* file.\",\n \"2. Read the manifest (package.json / Cargo.toml / pyproject.toml /\",\n \" go.mod / etc.) — pick whichever exists.\",\n \"3. `directory_tree` 1-2 levels deep on the project root, skipping\",\n \" common build/dependency dirs (node_modules, dist, target, .git,\",\n \" venv, __pycache__).\",\n \"4. Identify: primary language + framework, top-level layout, test\",\n \" runner, lint/format setup, build/run/test scripts, any non-obvious\",\n \" convention with visible evidence (commit message format, import\",\n \" order, naming pattern).\",\n \"5. Write REASONIX.md with the sections below, skipping any you can't\",\n \" fill from evidence.\",\n \"\",\n \"## Sections to use (skip ones with no evidence)\",\n \"\",\n \"- **Stack** — language + framework + 3-5 key deps. One line each.\",\n \"- **Layout** — top-level dirs and what lives in each. One line each.\",\n \"- **Commands** — verbatim from `scripts` block (or equivalent):\",\n \" build / test / lint / typecheck / dev / format. Whatever exists.\",\n \"- **Conventions** — only things visible in the code. Examples:\",\n \" '*.test.ts colocated with source', 'named exports only',\",\n \" 'commits use Conventional Commits prefix'. If you can't find any\",\n \" CONVENTION evidence, omit the whole section.\",\n \"- **Watch out for** — gotchas a new contributor would benefit from\",\n \" knowing BEFORE editing. Examples: 'edit_file SEARCH must match\",\n \" byte-for-byte', 'this dir is generated, don't edit by hand'.\",\n \" Omit if you find nothing concrete.\",\n \"\",\n \"## Output\",\n \"\",\n \"Write the result to `REASONIX.md` in the project root using the\",\n \"filesystem tools (edit_file with empty SEARCH if creating new,\",\n \"write_file if overwriting). After writing, STOP — do not summarize\",\n \"what you did, do not propose follow-up tasks. The user will review\",\n \"the pending edit via /apply.\",\n \"\",\n \"Start now.\",\n].join(\"\\n\");\n\nconst init: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.codeRoot) {\n return { info: t(\"handlers.init.codeOnly\") };\n }\n const force = (args[0] ?? \"\").toLowerCase() === \"force\";\n const target = pathMod.join(ctx.codeRoot, \"REASONIX.md\");\n if (existsSync(target) && !force) {\n return {\n info: [\n t(\"handlers.init.exists\", { path: target }),\n \"\",\n t(\"handlers.init.existsForce\"),\n \"\",\n t(\"handlers.init.existsEdit\"),\n t(\"handlers.init.existsPinned\"),\n ].join(\"\\n\"),\n };\n }\n return {\n info: t(\"handlers.init.info\"),\n resubmit: INIT_PROMPT,\n };\n};\n\nexport const handlers: Record<string, SlashHandler> = {\n init,\n};\n","import { t } from \"@/i18n/index.js\";\nimport type { JobRecord } from \"@/tools/jobs.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\n\nfunction statusIcon(r: JobRecord): string {\n if (r.running) return \"●\";\n if (r.spawnError) return \"✗\";\n if (r.exitCode === 0) return \"✓\";\n if (r.exitCode !== null) return \"✗\";\n return \"○\";\n}\n\nfunction fmtAge(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h`;\n return `${Math.floor(h / 24)}d`;\n}\n\nfunction detectPorts(output: string): number[] {\n if (!output) return [];\n const found = new Set<number>();\n const patterns = [\n /(?:localhost|127\\.0\\.0\\.1|0\\.0\\.0\\.0):(\\d{2,5})\\b/g,\n /(?:listening|listening on|bound to|port|on port)[\\s:=]+(\\d{2,5})\\b/gi,\n ];\n for (const re of patterns) {\n let m: RegExpExecArray | null;\n // biome-ignore lint/suspicious/noAssignInExpressions: standard regex iteration pattern\n while ((m = re.exec(output)) !== null) {\n const port = Number.parseInt(m[1] ?? \"\", 10);\n if (port >= 80 && port <= 65535) found.add(port);\n if (found.size >= 3) break;\n }\n if (found.size >= 3) break;\n }\n return [...found];\n}\n\nfunction fmtMeta(r: JobRecord): string {\n if (r.running) {\n const ports = detectPorts(r.output);\n if (ports.length > 0) return ports.map((p) => `:${p}`).join(\" \");\n return r.pid !== null ? `pid ${r.pid}` : \"\";\n }\n if (r.spawnError) return r.spawnError;\n if (r.exitCode !== null) return `exit ${r.exitCode}`;\n return \"stopped\";\n}\n\nconst jobs: SlashHandler = (_args, _loop, ctx) => {\n if (!ctx.jobs) {\n return { info: t(\"handlers.jobs.codeOnly\") };\n }\n const rows = ctx.jobs.list();\n if (rows.length === 0) {\n return { info: t(\"handlers.jobs.empty\") };\n }\n const running = rows.filter((r) => r.running).length;\n const lines: string[] = [t(\"handlers.jobs.header\", { running, total: rows.length }), \"\"];\n const cmdWidth = Math.min(44, Math.max(8, ...rows.map((r) => r.command.length)));\n for (const r of rows) {\n const ico = statusIcon(r);\n const id = `#${String(r.id).padEnd(3)}`;\n const cmd =\n r.command.length > cmdWidth\n ? `${r.command.slice(0, cmdWidth - 1)}…`\n : r.command.padEnd(cmdWidth);\n const meta = fmtMeta(r).padEnd(20);\n const age = fmtAge(Date.now() - r.startedAt).padStart(4);\n lines.push(` ${ico} ${id} ${cmd} ${meta} ${age}`);\n }\n lines.push(\"\");\n lines.push(t(\"handlers.jobs.footer\"));\n return { info: lines.join(\"\\n\") };\n};\n\nconst kill: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.jobs) return { info: t(\"handlers.jobs.killCodeOnly\") };\n const id = Number.parseInt(args[0] ?? \"\", 10);\n if (!Number.isFinite(id)) return { info: t(\"handlers.jobs.killUsage\") };\n const rec = ctx.jobs.list().find((r) => r.id === id);\n if (!rec) return { info: t(\"handlers.jobs.killNotFound\", { id }) };\n if (!rec.running)\n return { info: t(\"handlers.jobs.killAlreadyExited\", { id, code: rec.exitCode ?? \"?\" }) };\n const jobsRef = ctx.jobs;\n void (async () => {\n const final = await jobsRef.stop(id);\n if (!final) return;\n const status = final.running\n ? t(\"handlers.jobs.killStillAlive\")\n : final.exitCode !== null\n ? `exit ${final.exitCode}`\n : \"stopped\";\n ctx.postInfo?.(t(\"handlers.jobs.killStatus\", { id, status }));\n })();\n return { info: t(\"handlers.jobs.killStopping\", { id }) };\n};\n\nconst logs: SlashHandler = (args, _loop, ctx) => {\n if (!ctx.jobs) return { info: t(\"handlers.jobs.logsCodeOnly\") };\n const id = Number.parseInt(args[0] ?? \"\", 10);\n if (!Number.isFinite(id)) {\n return { info: t(\"handlers.jobs.logsUsage\") };\n }\n const requested = Number.parseInt(args[1] ?? \"\", 10);\n const tail = Number.isFinite(requested) && requested > 0 ? requested : 80;\n const out = ctx.jobs.read(id, { tailLines: tail });\n if (!out) return { info: t(\"handlers.jobs.logsNotFound\", { id }) };\n const status = out.running\n ? t(\"handlers.jobs.logsRunning\", { pid: out.pid ?? \"?\" })\n : out.exitCode !== null\n ? t(\"handlers.jobs.logsExited\", { code: out.exitCode })\n : out.spawnError\n ? t(\"handlers.jobs.logsFailed\", { reason: out.spawnError })\n : t(\"handlers.jobs.logsStopped\");\n const header = t(\"handlers.jobs.logsStatus\", { id, status, command: out.command });\n return { info: out.output ? `${header}\\n${out.output}` : header };\n};\n\nexport const handlers: Record<string, SlashHandler> = {\n jobs,\n kill,\n logs,\n};\n","import { getSupportedLanguages, notifyLanguageChange, setLanguage, t } from \"@/i18n/index.js\";\nimport type { LanguageCode } from \"@/i18n/types.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\n\nexport const handlers: Record<string, SlashHandler> = {\n language: (args, _loop, ctx) => {\n const lang = args[0];\n if (!lang) {\n return { openArgPickerFor: \"language\" };\n }\n\n const supported = getSupportedLanguages();\n if (!supported.includes(lang as LanguageCode)) {\n return {\n info: t(\"slash.language.unsupported\", {\n code: lang,\n supported: supported.join(\", \"),\n }),\n };\n }\n\n setLanguage(lang as LanguageCode);\n notifyLanguageChange();\n ctx.dispatch?.({ type: \"language.change\", lang });\n\n return { info: t(\"slash.language.success\") };\n },\n};\n","import { t } from \"@/i18n/index.js\";\nimport type { CacheFirstLoop } from \"@/loop.js\";\nimport { applyMcpAppend } from \"../../mcp-append.js\";\nimport { toggleMcpDisabled } from \"../../mcp-disable.js\";\nimport { slashHealthBadge } from \"../../mcp-health.js\";\nimport { kickOffMcpReconnect } from \"../../mcp-reconnect-kickoff.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\nimport { appendSection } from \"../helpers.js\";\nimport type { McpServerSummary } from \"../types.js\";\n\nconst mcp: SlashHandler = (args, loop, ctx) => {\n const servers = ctx.mcpServers ?? [];\n const specs = ctx.mcpSpecs ?? [];\n const toolSpecs = loop.prefix.toolSpecs ?? [];\n const sub = args[0];\n if (sub === \"disable\" || sub === \"enable\") {\n return toggleDisabled(sub, args[1], { servers, specs });\n }\n if (sub === \"reconnect\") {\n return triggerReconnect(args[1], servers, ctx.postInfo, loop);\n }\n if (sub === \"browse\" || sub === \"install\" || sub === \"marketplace\") {\n return { openMcpHub: { tab: \"marketplace\" } };\n }\n // Interactive default: ALWAYS open the hub. Live tab when servers\n // are bridged, Marketplace tab otherwise (so a fresh user lands on\n // \"discover + install\" instead of an empty list). `/mcp text` is the\n // only path to the printed-card dump — used by replay / non-TTY.\n const wantsTextDump = sub === \"text\";\n if (!wantsTextDump) {\n return { openMcpHub: { tab: servers.length > 0 ? \"live\" : \"marketplace\" } };\n }\n if (servers.length === 0 && specs.length === 0 && toolSpecs.length === 0) {\n return { info: t(\"handlers.mcp.noServers\") };\n }\n // Rich path — we have full inspection reports, so show each server\n // with its tools / resources / prompts grouped together.\n if (servers.length > 0) {\n const lines: string[] = [];\n let anyResources = false;\n let anyPrompts = false;\n for (const s of servers) {\n const { report } = s;\n const serverName = report.serverInfo.name || \"(unknown)\";\n const serverVer = report.serverInfo.version ? ` v${report.serverInfo.version}` : \"\";\n const health = slashHealthBadge(report.elapsedMs);\n lines.push(`${health} [${s.label}] ${serverName}${serverVer} — ${s.spec}`);\n lines.push(t(\"handlers.mcp.toolsLabel\", { count: s.toolCount }));\n appendSection(lines, \"resources\", report.resources);\n appendSection(lines, \"prompts \", report.prompts);\n if (report.resources.supported && report.resources.items.length > 0) anyResources = true;\n if (report.prompts.supported && report.prompts.items.length > 0) anyPrompts = true;\n lines.push(\"\");\n }\n if (anyResources || anyPrompts) {\n const hints: string[] = [];\n if (anyResources) hints.push(t(\"handlers.mcp.resourcesHint\"));\n if (anyPrompts) hints.push(t(\"handlers.mcp.promptsHint\"));\n lines.push(hints.join(\" · \"));\n } else {\n lines.push(t(\"handlers.mcp.awarenessOnly\"));\n }\n lines.push(t(\"handlers.mcp.catalogHint\"));\n return { info: lines.join(\"\\n\") };\n }\n const lines: string[] = [];\n if (specs.length > 0) {\n lines.push(t(\"handlers.mcp.fallbackServers\", { count: specs.length }));\n for (const spec of specs) lines.push(` · ${spec}`);\n lines.push(\"\");\n }\n if (toolSpecs.length > 0) {\n lines.push(t(\"handlers.mcp.fallbackTools\", { count: toolSpecs.length }));\n for (const tool of toolSpecs) lines.push(` · ${tool.function.name}`);\n }\n lines.push(\"\");\n lines.push(t(\"handlers.mcp.fallbackChange\"));\n return { info: lines.join(\"\\n\") };\n};\n\nfunction toggleDisabled(\n action: \"disable\" | \"enable\",\n rawName: string | undefined,\n ctx: { servers: ReadonlyArray<{ label: string }>; specs: ReadonlyArray<string> },\n): { info: string } {\n const name = rawName?.trim();\n if (!name) {\n return { info: t(\"handlers.mcp.usageDisableEnable\", { action }) };\n }\n const known = new Set<string>([\n ...ctx.servers.map((s) => s.label),\n ...ctx.specs.map((spec) => parseLabelFromSpec(spec)).filter((n): n is string => n !== null),\n ]);\n if (!known.has(name)) {\n const list = [...known].sort().join(\", \") || t(\"handlers.mcp.noneList\");\n return { info: t(\"handlers.mcp.unknownServer\", { name, list }) };\n }\n return { info: toggleMcpDisabled(action, name) };\n}\n\nfunction parseLabelFromSpec(spec: string): string | null {\n const match = spec.match(/^([a-zA-Z_][a-zA-Z0-9_-]*)=/);\n return match ? (match[1] ?? null) : null;\n}\n\nfunction triggerReconnect(\n rawName: string | undefined,\n servers: ReadonlyArray<McpServerSummary>,\n postInfo: ((text: string) => void) | undefined,\n loop: CacheFirstLoop,\n): { info: string } {\n const name = rawName?.trim();\n if (!name) {\n return { info: t(\"handlers.mcp.usageReconnect\") };\n }\n const target = servers.find((s) => s.label === name);\n if (!target) {\n const list =\n servers\n .map((s) => s.label)\n .sort()\n .join(\", \") || t(\"handlers.mcp.noneList\");\n return { info: t(\"handlers.mcp.unknownServer\", { name, list }) };\n }\n if (!postInfo) {\n return { info: t(\"handlers.mcp.reconnectNoTui\") };\n }\n // Append-drift accepted automatically: server added new tools, we register them\n // and call addTool on the prefix (cache miss only on the appended chunks per the\n // benchmarks/spike-mcp-reconnect data — typically <5% loss).\n return {\n info: kickOffMcpReconnect(target, postInfo, (t, addedTools) =>\n applyMcpAppend(loop, t, addedTools),\n ),\n };\n}\n\nexport const handlers: Record<string, SlashHandler> = { mcp };\n","import { t } from \"@/i18n/index.js\";\nimport { PROJECT_MEMORY_FILE, memoryEnabled, readProjectMemory } from \"@/memory/project.js\";\nimport { type MemoryScope, MemoryStore } from \"@/memory/user.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\nimport { resolveMemoryTarget } from \"../helpers.js\";\n\nconst memory: SlashHandler = (args, _loop, ctx) => {\n if (!memoryEnabled()) {\n return { info: t(\"handlers.memory.disabled\") };\n }\n if (!ctx.memoryRoot) {\n return { info: t(\"handlers.memory.noRoot\") };\n }\n const store = new MemoryStore({ projectRoot: ctx.codeRoot });\n const sub = (args[0] ?? \"\").toLowerCase();\n\n if (sub === \"list\" || sub === \"ls\") {\n const entries = store.list();\n if (entries.length === 0) {\n return { info: t(\"handlers.memory.listEmpty\") };\n }\n const lines = [t(\"handlers.memory.listHeader\", { count: entries.length })];\n for (const e of entries) {\n const tag = `${e.scope}/${e.type}`.padEnd(18);\n const name = e.name.padEnd(28);\n const desc = e.description.length > 70 ? `${e.description.slice(0, 69)}…` : e.description;\n lines.push(` ${tag} ${name} ${desc}`);\n }\n lines.push(\"\");\n lines.push(t(\"handlers.memory.listFooter\"));\n return { info: lines.join(\"\\n\") };\n }\n\n if (sub === \"show\" || sub === \"cat\") {\n const target = args[1];\n if (!target) return { info: t(\"handlers.memory.showUsage\") };\n const resolved = resolveMemoryTarget(store, target);\n if (!resolved) return { info: t(\"handlers.memory.showNotFound\", { target }) };\n try {\n const entry = store.read(resolved.scope, resolved.name);\n return {\n info: [\n `▸ ${entry.scope}/${entry.name} (${entry.type}, created ${entry.createdAt || \"?\"})`,\n entry.description ? ` ${entry.description}` : \"\",\n \"\",\n entry.body,\n ]\n .filter((l) => l !== \"\")\n .concat(\"\")\n .join(\"\\n\"),\n };\n } catch (err) {\n return { info: t(\"handlers.memory.showFailed\", { reason: (err as Error).message }) };\n }\n }\n\n if (sub === \"forget\" || sub === \"rm\" || sub === \"delete\") {\n const target = args[1];\n if (!target) return { info: t(\"handlers.memory.forgetUsage\") };\n const resolved = resolveMemoryTarget(store, target);\n if (!resolved) return { info: t(\"handlers.memory.forgetNotFound\", { target }) };\n try {\n const ok = store.delete(resolved.scope, resolved.name);\n return {\n info: ok\n ? t(\"handlers.memory.forgetInfo\", { scope: resolved.scope, name: resolved.name })\n : t(\"handlers.memory.forgetFailed\", { scope: resolved.scope, name: resolved.name }),\n };\n } catch (err) {\n return { info: t(\"handlers.memory.forgetError\", { reason: (err as Error).message }) };\n }\n }\n\n if (sub === \"clear\") {\n const rawScope = (args[1] ?? \"\").toLowerCase();\n if (rawScope !== \"global\" && rawScope !== \"project\") {\n return { info: t(\"handlers.memory.clearUsage\") };\n }\n if ((args[2] ?? \"\").toLowerCase() !== \"confirm\") {\n return {\n info: t(\"handlers.memory.clearConfirm\", { scope: rawScope }),\n };\n }\n const scope = rawScope as MemoryScope;\n const entries = store.list().filter((e) => e.scope === scope);\n let deleted = 0;\n for (const e of entries) {\n try {\n if (store.delete(scope, e.name)) deleted++;\n } catch {\n /* skip */\n }\n }\n return { info: t(\"handlers.memory.cleared\", { scope, count: deleted }) };\n }\n\n const parts: string[] = [];\n const projMem = readProjectMemory(ctx.memoryRoot);\n if (projMem) {\n const hdr = projMem.truncated\n ? `▸ ${PROJECT_MEMORY_FILE}: ${projMem.path} (${projMem.originalChars.toLocaleString()} chars, truncated)`\n : `▸ ${PROJECT_MEMORY_FILE}: ${projMem.path} (${projMem.originalChars.toLocaleString()} chars)`;\n parts.push(hdr, \"\", projMem.content);\n }\n const globalIdx = store.loadIndex(\"global\");\n if (globalIdx) {\n parts.push(\n \"\",\n `▸ global memory (${globalIdx.originalChars.toLocaleString()} chars${globalIdx.truncated ? \", truncated\" : \"\"})`,\n \"\",\n globalIdx.content,\n );\n }\n const projectIdx = store.loadIndex(\"project\");\n if (projectIdx) {\n parts.push(\n \"\",\n `▸ project memory (${projectIdx.originalChars.toLocaleString()} chars${projectIdx.truncated ? \", truncated\" : \"\"})`,\n \"\",\n projectIdx.content,\n );\n }\n if (parts.length === 0) {\n return {\n info: [\n t(\"handlers.memory.noMemory\", { root: ctx.memoryRoot }),\n \"\",\n t(\"handlers.memory.layers\"),\n t(\"handlers.memory.layerProject\", { file: PROJECT_MEMORY_FILE }),\n t(\"handlers.memory.layerGlobal\"),\n t(\"handlers.memory.layerProjectHash\"),\n \"\",\n t(\"handlers.memory.askModel\"),\n t(\"handlers.memory.changesNote\"),\n \"\",\n t(\"handlers.memory.subcommands\"),\n ].join(\"\\n\"),\n };\n }\n parts.push(\"\", t(\"handlers.memory.changesNoteShort\"));\n return { info: parts.join(\"\\n\") };\n};\n\nexport const handlers: Record<string, SlashHandler> = { memory };\n","import { saveReasoningEffort } from \"@/config.js\";\nimport { t } from \"@/i18n/index.js\";\nimport { PRESETS } from \"../../presets.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\n\nconst model: SlashHandler = (args, loop, ctx) => {\n const id = args[0];\n const known = ctx.models ?? null;\n if (!id) {\n return { openModelPicker: true };\n }\n loop.configure({ model: id });\n ctx.dispatch?.({ type: \"session.model.change\", model: id });\n if (known && known.length > 0 && !known.includes(id)) {\n return {\n info: t(\"handlers.model.modelNotInCatalog\", { id, list: known.join(\", \") }),\n };\n }\n return { info: t(\"handlers.model.modelSet\", { id }) };\n};\n\nconst preset: SlashHandler = (args, loop, ctx) => {\n const name = (args[0] ?? \"\").toLowerCase();\n const applyAndPersist = (effort: \"high\" | \"max\") => {\n try {\n saveReasoningEffort(effort);\n } catch {\n /* disk full / perms — runtime change still took effect */\n }\n };\n const apply = (p: (typeof PRESETS)[keyof typeof PRESETS]) => {\n loop.configure({\n model: p.model,\n autoEscalate: p.autoEscalate,\n reasoningEffort: p.reasoningEffort,\n });\n ctx.dispatch?.({ type: \"session.model.change\", model: p.model });\n applyAndPersist(p.reasoningEffort);\n };\n if (name === \"auto\") {\n apply(PRESETS.auto);\n return { info: t(\"handlers.model.presetAuto\") };\n }\n if (name === \"flash\") {\n apply(PRESETS.flash);\n return { info: t(\"handlers.model.presetFlash\") };\n }\n if (name === \"pro\") {\n apply(PRESETS.pro);\n return { info: t(\"handlers.model.presetPro\") };\n }\n if (name === \"\") {\n return { openModelPicker: true };\n }\n return { info: t(\"handlers.model.presetUsage\") };\n};\n\nconst ESCALATION_MODEL_ID = \"deepseek-v4-pro\";\n\nconst pro: SlashHandler = (args, loop, ctx) => {\n const arg = (args[0] ?? \"\").toLowerCase();\n if (arg === \"off\" || arg === \"cancel\" || arg === \"disarm\") {\n if (!loop.proArmed) {\n return { info: t(\"handlers.model.proNothingArmed\") };\n }\n if (ctx.disarmPro) ctx.disarmPro();\n else loop.disarmPro();\n return { info: t(\"handlers.model.proDisarmed\") };\n }\n if (arg && arg !== \"on\" && arg !== \"arm\") {\n return { info: t(\"handlers.model.proUsage\") };\n }\n if (ctx.armPro) ctx.armPro();\n else loop.armProForNextTurn();\n return {\n info: t(\"handlers.model.proArmed\", { model: ESCALATION_MODEL_ID }),\n };\n};\n\nconst budget: SlashHandler = (args, loop) => {\n const arg = args[0]?.trim() ?? \"\";\n if (arg === \"\") {\n if (loop.budgetUsd === null) {\n return { info: t(\"handlers.model.budgetNoCap\") };\n }\n const spent = loop.stats.totalCost;\n const pct = (spent / loop.budgetUsd) * 100;\n return {\n info: t(\"handlers.model.budgetStatus\", {\n spent: spent.toFixed(4),\n cap: loop.budgetUsd.toFixed(2),\n pct: pct.toFixed(1),\n }),\n };\n }\n if (arg === \"off\" || arg === \"none\" || arg === \"0\") {\n loop.setBudget(null);\n return { info: t(\"handlers.model.budgetOff\") };\n }\n const cleaned = arg.replace(/^\\$/, \"\");\n const usd = Number(cleaned);\n if (!Number.isFinite(usd) || usd <= 0) {\n return { info: t(\"handlers.model.budgetUsage\", { arg }) };\n }\n loop.setBudget(usd);\n const spent = loop.stats.totalCost;\n if (spent >= usd) {\n return {\n info: t(\"handlers.model.budgetExhausted\", {\n cap: usd.toFixed(2),\n spent: spent.toFixed(4),\n }),\n };\n }\n return {\n info: t(\"handlers.model.budgetSet\", {\n cap: usd.toFixed(2),\n spent: spent.toFixed(4),\n }),\n };\n};\n\nexport const handlers: Record<string, SlashHandler> = {\n model,\n preset,\n pro,\n budget,\n};\n","import { Box, Text } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport type { CacheFirstLoop } from \"../../loop.js\";\nimport { DEEPSEEK_CONTEXT_TOKENS, DEFAULT_CONTEXT_TOKENS } from \"../../telemetry/stats.js\";\nimport { countTokens } from \"../../tokenizer.js\";\nimport { formatTokens } from \"./primitives.js\";\nimport { COLOR } from \"./theme.js\";\n\nexport interface CtxBreakdownData {\n systemTokens: number;\n toolsTokens: number;\n logTokens: number;\n inputTokens: number;\n ctxMax: number;\n toolsCount: number;\n logMessages: number;\n topTools: Array<{ name: string; tokens: number; turn: number }>;\n}\n\n/**\n * Walk the loop's prefix + log and tally tokens per category. Cheap\n * after the tokenizer warm-up (~100 ms first call, sub-ms after).\n * Memoize at the call site if used inside a render path.\n */\nexport function computeCtxBreakdown(loop: CacheFirstLoop): CtxBreakdownData {\n const systemTokens = countTokens(loop.prefix.system);\n const toolsTokens = countTokens(JSON.stringify(loop.prefix.toolSpecs));\n const entries = loop.log.toMessages();\n let userTokens = 0;\n let assistantTokens = 0;\n let toolResultTokens = 0;\n let toolCallTokens = 0;\n const toolBreakdown: Array<{ name: string; tokens: number; turn: number }> = [];\n let logTurn = 0;\n for (const e of entries) {\n const content = typeof e.content === \"string\" ? e.content : \"\";\n if (e.role === \"user\") {\n userTokens += countTokens(content);\n logTurn += 1;\n } else if (e.role === \"assistant\") {\n assistantTokens += countTokens(content);\n if (Array.isArray(e.tool_calls) && e.tool_calls.length > 0) {\n toolCallTokens += countTokens(JSON.stringify(e.tool_calls));\n }\n } else if (e.role === \"tool\") {\n const n = countTokens(content);\n toolResultTokens += n;\n toolBreakdown.push({ name: e.name ?? \"?\", tokens: n, turn: logTurn });\n }\n }\n const logTokens = userTokens + assistantTokens + toolResultTokens + toolCallTokens;\n const ctxMax = DEEPSEEK_CONTEXT_TOKENS[loop.model] ?? DEFAULT_CONTEXT_TOKENS;\n const topTools = [...toolBreakdown].sort((a, b) => b.tokens - a.tokens).slice(0, 5);\n return {\n systemTokens,\n toolsTokens,\n logTokens,\n inputTokens: 0,\n ctxMax,\n toolsCount: loop.prefix.toolSpecs.length,\n logMessages: entries.length,\n topTools,\n };\n}\n\n/**\n * 4-segment stacked bar with legend + top-tools list. Pushed to\n * scrollback by the `/context` slash; the always-on bottom footer\n * uses its own slim 1-row layout in `CtxFooter`.\n */\nexport function CtxBreakdownBlock({ data }: { data: CtxBreakdownData }): React.ReactElement {\n const total = data.systemTokens + data.toolsTokens + data.logTokens + data.inputTokens;\n const winPct = data.ctxMax > 0 ? Math.round((total / data.ctxMax) * 100) : 0;\n const barWidth = 48;\n const cellOf = (n: number) => (data.ctxMax > 0 ? Math.round((n / data.ctxMax) * barWidth) : 0);\n const sysCells = cellOf(data.systemTokens);\n const toolsCells = cellOf(data.toolsTokens);\n const logCells = cellOf(data.logTokens);\n const inputCells = cellOf(data.inputTokens);\n const used = sysCells + toolsCells + logCells + inputCells;\n const freeCells = Math.max(0, barWidth - used);\n const sevColor = winPct >= 80 ? COLOR.err : winPct >= 60 ? COLOR.warn : COLOR.ok;\n\n return (\n <Box\n flexDirection=\"column\"\n marginY={1}\n borderStyle=\"single\"\n borderTop={false}\n borderRight={false}\n borderBottom={false}\n borderColor={COLOR.brand}\n paddingLeft={1}\n >\n <Box>\n <Text color={COLOR.brand} bold>\n ▣ context\n </Text>\n <Text dimColor>{` ${formatTokens(total)} of ${formatTokens(data.ctxMax)}`}</Text>\n <Text dimColor>{\" · \"}</Text>\n <Text color={sevColor} bold>\n {`${winPct}%`}\n </Text>\n {winPct >= 80 ? (\n <Text color={COLOR.err} bold>\n {\" · /compact\"}\n </Text>\n ) : null}\n </Box>\n <Box>\n <Text color={COLOR.brand}>{\"█\".repeat(sysCells)}</Text>\n <Text color={COLOR.accent}>{\"█\".repeat(toolsCells)}</Text>\n <Text color={COLOR.primary}>{\"█\".repeat(logCells)}</Text>\n <Text color={COLOR.tool}>{\"█\".repeat(inputCells)}</Text>\n <Text color={COLOR.info} dimColor>\n {\"░\".repeat(freeCells)}\n </Text>\n </Box>\n <Box>\n <Text color={COLOR.brand}>■</Text>\n <Text dimColor>{` system ${formatTokens(data.systemTokens)}`}</Text>\n <Text>{\" \"}</Text>\n <Text color={COLOR.accent}>■</Text>\n <Text dimColor>{` tools ${formatTokens(data.toolsTokens)}`}</Text>\n <Text dimColor>{` (${data.toolsCount})`}</Text>\n <Text>{\" \"}</Text>\n <Text color={COLOR.primary}>■</Text>\n <Text dimColor>{` log ${formatTokens(data.logTokens)}`}</Text>\n <Text dimColor>{` (${data.logMessages} msg)`}</Text>\n <Text>{\" \"}</Text>\n <Text color={COLOR.tool}>■</Text>\n <Text dimColor>{` input ${formatTokens(data.inputTokens)}`}</Text>\n </Box>\n {data.topTools.length > 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>{` top tool results by cost (${data.topTools.length}):`}</Text>\n {data.topTools.map((t) => (\n <Box key={`${t.turn}-${t.name}`}>\n <Text dimColor>{` turn ${String(t.turn).padStart(3)} `}</Text>\n <Text color={COLOR.info}>{t.name.padEnd(22)}</Text>\n <Text dimColor>{` ${formatTokens(t.tokens).padStart(8)}`}</Text>\n </Box>\n ))}\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text dimColor>{\" /compact folds (auto at 50%) · /new wipes log\"}</Text>\n </Box>\n </Box>\n );\n}\n","import { t } from \"@/i18n/index.js\";\nimport {\n DEEPSEEK_CONTEXT_TOKENS,\n DEEPSEEK_PRICING,\n DEFAULT_CONTEXT_TOKENS,\n} from \"@/telemetry/stats.js\";\nimport { countTokens } from \"@/tokenizer.js\";\nimport { computeCtxBreakdown } from \"../../ctx-breakdown.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\nimport { compactNum } from \"../helpers.js\";\n\nconst context: SlashHandler = (_args, loop) => {\n const breakdown = computeCtxBreakdown(loop);\n const total =\n breakdown.systemTokens + breakdown.toolsTokens + breakdown.logTokens + breakdown.inputTokens;\n const winPct = breakdown.ctxMax > 0 ? Math.round((total / breakdown.ctxMax) * 100) : 0;\n const fallbackInfo = t(\"handlers.observability.contextInfo\", {\n total: compactNum(total),\n max: compactNum(breakdown.ctxMax),\n pct: winPct,\n sys: compactNum(breakdown.systemTokens),\n tools: compactNum(breakdown.toolsTokens),\n log: compactNum(breakdown.logTokens),\n });\n return { info: fallbackInfo, ctxBreakdown: breakdown };\n};\n\nconst status: SlashHandler = (_args, loop, ctx) => {\n const ctxMax = DEEPSEEK_CONTEXT_TOKENS[loop.model] ?? DEFAULT_CONTEXT_TOKENS;\n const summary = loop.stats.summary();\n const lastPromptTokens = summary.lastPromptTokens;\n const ctxPct = ctxMax > 0 ? Math.round((lastPromptTokens / ctxMax) * 100) : 0;\n const ctxBar = lastPromptTokens > 0 ? renderTinyBar(ctxPct, 16) : \"\";\n const ctxLine =\n lastPromptTokens > 0\n ? t(\"handlers.observability.statusCtx\", {\n bar: ctxBar,\n used: compactNum(lastPromptTokens),\n max: compactNum(ctxMax),\n pct: ctxPct,\n })\n : t(\"handlers.observability.statusCtxNone\");\n\n const cost = summary.totalCostUsd;\n const cacheLine =\n summary.turns > 3\n ? (() => {\n const cachePct = Math.round(summary.cacheHitRatio * 100);\n return t(\"handlers.observability.statusCost\", {\n cost: cost.toFixed(4),\n bar: renderTinyBar(cachePct, 12),\n pct: cachePct,\n turns: summary.turns,\n });\n })()\n : t(\"handlers.observability.statusCostCold\", {\n cost: cost.toFixed(4),\n turns: summary.turns,\n });\n\n const budgetLine =\n typeof loop.budgetUsd === \"number\"\n ? (() => {\n const pct = Math.round((cost / loop.budgetUsd!) * 100);\n const tag = pct >= 100 ? \" ▲ EXHAUSTED\" : pct >= 80 ? \" ▲ 80%+\" : \"\";\n return t(\"handlers.observability.statusBudget\", {\n spent: cost.toFixed(4),\n cap: loop.budgetUsd!.toFixed(2),\n pct,\n tag,\n });\n })()\n : \"\";\n\n const pending = ctx.pendingEditCount ?? 0;\n const sessionLine = loop.sessionName\n ? t(\"handlers.observability.statusSession\", {\n name: loop.sessionName,\n count: loop.log.length,\n resumed: loop.resumedMessageCount,\n })\n : t(\"handlers.observability.statusSessionEphemeral\");\n const mcpCount = ctx.mcpSpecs?.length ?? 0;\n const toolCount = loop.prefix.toolSpecs.length;\n const mcpLine = t(\"handlers.observability.statusMcp\", { servers: mcpCount, tools: toolCount });\n const pendingLine =\n pending > 0 ? t(\"handlers.observability.statusEdits\", { count: pending }) : \"\";\n const planLine = ctx.planMode ? t(\"handlers.observability.statusPlan\") : \"\";\n const modeLine =\n ctx.editMode === \"yolo\"\n ? t(\"handlers.observability.statusModeYolo\")\n : ctx.editMode === \"auto\"\n ? t(\"handlers.observability.statusModeAuto\")\n : ctx.editMode === \"review\"\n ? t(\"handlers.observability.statusModeReview\")\n : \"\";\n const dashUrl = ctx.getDashboardUrl?.();\n const dashLine = dashUrl ? t(\"handlers.observability.statusDash\", { url: dashUrl }) : \"\";\n const workspaceLine = ctx.codeRoot\n ? t(\"handlers.observability.statusWorkspace\", { path: ctx.codeRoot })\n : \"\";\n const lines = [\n t(\"handlers.observability.statusModel\", { model: loop.model }),\n t(\"handlers.observability.statusFlags\", {\n stream: loop.stream ? \"on\" : \"off\",\n effort: loop.reasoningEffort,\n }),\n cacheLine,\n ctxLine,\n mcpLine,\n sessionLine,\n ];\n if (workspaceLine) lines.push(workspaceLine);\n if (budgetLine) lines.push(budgetLine);\n if (pendingLine) lines.push(pendingLine);\n if (planLine) lines.push(planLine);\n if (modeLine) lines.push(modeLine);\n if (dashLine) lines.push(dashLine);\n return { info: lines.join(\"\\n\") };\n};\n\nfunction renderTinyBar(pct: number, width: number): string {\n const w = Math.max(4, width);\n const clamped = Math.max(0, Math.min(100, pct));\n const filled = Math.round((w * clamped) / 100);\n return `[${\"█\".repeat(filled)}${\"░\".repeat(w - filled)}]`;\n}\n\nconst compact: SlashHandler = (_args, loop, ctx) => {\n void loop\n .compactHistory()\n .then((r) => {\n if (!r.folded) {\n ctx.postInfo?.(t(\"handlers.observability.compactNoop\"));\n return;\n }\n ctx.postInfo?.(\n t(\"handlers.observability.compactDone\", {\n before: r.beforeMessages,\n after: r.afterMessages,\n chars: r.summaryChars.toLocaleString(),\n }),\n );\n })\n .catch((err: Error) => {\n ctx.postInfo?.(t(\"handlers.observability.compactFailed\", { reason: err.message }));\n });\n return { info: t(\"handlers.observability.compactStarting\") };\n};\n\nconst cost: SlashHandler = (args, loop, ctx) => {\n if (args.length > 0) {\n return estimateCost(args.join(\" \"), loop);\n }\n const turn = loop.stats.turns[loop.stats.turns.length - 1];\n if (!turn) {\n return { info: t(\"handlers.observability.costNoTurn\") };\n }\n if (!ctx.postUsage) {\n return { info: t(\"handlers.observability.costNeedsTui\") };\n }\n const summary = loop.stats.summary();\n const ctxMax = DEEPSEEK_CONTEXT_TOKENS[loop.model] ?? DEFAULT_CONTEXT_TOKENS;\n ctx.postUsage({\n turn: turn.turn,\n promptTokens: turn.usage.promptTokens,\n reasonTokens: 0,\n outputTokens: turn.usage.completionTokens,\n promptCap: ctxMax,\n cacheHit: turn.cacheHitRatio,\n cost: turn.cost,\n sessionCost: summary.totalCostUsd,\n });\n return {};\n};\n\nfunction estimateCost(userText: string, loop: import(\"@/loop.js\").CacheFirstLoop) {\n const pricing = DEEPSEEK_PRICING[loop.model];\n if (!pricing) {\n return { info: t(\"handlers.observability.costNoPricing\", { model: loop.model }) };\n }\n const userTokens = countTokens(userText);\n const breakdown = computeCtxBreakdown(loop);\n const promptTokens =\n breakdown.systemTokens + breakdown.toolsTokens + breakdown.logTokens + userTokens;\n\n const turns = loop.stats.turns;\n const avgOutput =\n turns.length > 0\n ? Math.round(turns.reduce((s, tk) => s + tk.usage.completionTokens, 0) / turns.length)\n : 800;\n const cacheHit = loop.stats.summary().cacheHitRatio;\n\n const inputUsdMiss = (promptTokens * pricing.inputCacheMiss) / 1_000_000;\n const inputUsdLikely =\n (promptTokens * ((1 - cacheHit) * pricing.inputCacheMiss + cacheHit * pricing.inputCacheHit)) /\n 1_000_000;\n const outputUsd = (avgOutput * pricing.output) / 1_000_000;\n\n const fmt = (n: number) => `$${n < 0.01 ? n.toFixed(5) : n.toFixed(4)}`;\n const lines = [\n t(\"handlers.observability.costEstimate\", {\n model: loop.model,\n prompt: promptTokens.toLocaleString(),\n sys: compactNum(breakdown.systemTokens),\n tools: compactNum(breakdown.toolsTokens),\n log: compactNum(breakdown.logTokens),\n msg: compactNum(userTokens),\n }),\n t(\"handlers.observability.costWorstCase\", {\n input: fmt(inputUsdMiss),\n output: fmt(outputUsd),\n avg: avgOutput.toLocaleString(),\n total: fmt(inputUsdMiss + outputUsd),\n }),\n turns.length > 0\n ? t(\"handlers.observability.costLikely\", {\n pct: Math.round(cacheHit * 100),\n input: fmt(inputUsdLikely),\n output: fmt(outputUsd),\n total: fmt(inputUsdLikely + outputUsd),\n })\n : t(\"handlers.observability.costLikelyCold\"),\n ];\n return { info: lines.join(\"\\n\") };\n}\n\nexport const handlers: Record<string, SlashHandler> = {\n context,\n status,\n compact,\n cost,\n};\n","import {\n addProjectShellAllowed,\n clearProjectShellAllowed,\n loadProjectShellAllowed,\n removeProjectShellAllowed,\n} from \"@/config.js\";\nimport { t } from \"@/i18n/index.js\";\nimport { BUILTIN_ALLOWLIST } from \"@/tools/shell.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\n\nconst permissions: SlashHandler = (args, _loop, ctx) => {\n const sub = (args[0] ?? \"\").toLowerCase();\n const root = ctx.codeRoot;\n const mode = ctx.editMode ?? null;\n\n if (sub === \"\" || sub === \"list\" || sub === \"ls\") {\n return { info: renderListing(root, mode) };\n }\n\n if (!root) {\n return { info: t(\"handlers.permissions.mutateCodeOnly\") };\n }\n\n if (sub === \"add\") {\n const prefix = args.slice(1).join(\" \").trim();\n if (!prefix) {\n return { info: t(\"handlers.permissions.addUsage\") };\n }\n const before = loadProjectShellAllowed(root);\n if (before.includes(prefix)) {\n return { info: t(\"handlers.permissions.addAlready\", { prefix }) };\n }\n if (BUILTIN_ALLOWLIST.includes(prefix)) {\n return { info: t(\"handlers.permissions.addBuiltin\", { prefix }) };\n }\n addProjectShellAllowed(root, prefix);\n return { info: t(\"handlers.permissions.addInfo\", { prefix }) };\n }\n\n if (sub === \"remove\" || sub === \"rm\" || sub === \"delete\") {\n const target = args.slice(1).join(\" \").trim();\n if (!target) {\n return { info: t(\"handlers.permissions.removeUsage\") };\n }\n const existing = loadProjectShellAllowed(root);\n let prefix: string | null = null;\n if (/^\\d+$/.test(target)) {\n const idx = Number.parseInt(target, 10);\n if (idx < 1 || idx > existing.length) {\n return {\n info:\n existing.length === 0\n ? t(\"handlers.permissions.removeEmpty\")\n : t(\"handlers.permissions.removeIndexOob\", { idx, count: existing.length }),\n };\n }\n prefix = existing[idx - 1] ?? null;\n } else {\n prefix = target;\n }\n if (prefix === null) return { info: t(\"handlers.permissions.removeNothing\") };\n if (BUILTIN_ALLOWLIST.includes(prefix) && !existing.includes(prefix)) {\n return { info: t(\"handlers.permissions.removeBuiltin\", { prefix }) };\n }\n const ok = removeProjectShellAllowed(root, prefix);\n return {\n info: ok\n ? t(\"handlers.permissions.removeInfo\", { prefix })\n : t(\"handlers.permissions.removeNotFound\", { prefix }),\n };\n }\n\n if (sub === \"clear\") {\n if ((args[1] ?? \"\").toLowerCase() !== \"confirm\") {\n const count = loadProjectShellAllowed(root).length;\n return {\n info:\n count === 0\n ? t(\"handlers.permissions.clearAlready\")\n : t(\"handlers.permissions.clearConfirm\", {\n count,\n plural: count === 1 ? \"y\" : \"ies\",\n root,\n }),\n };\n }\n const dropped = clearProjectShellAllowed(root);\n return {\n info:\n dropped === 0\n ? t(\"handlers.permissions.clearedNone\")\n : t(\"handlers.permissions.cleared\", {\n count: dropped,\n plural: dropped === 1 ? \"y\" : \"ies\",\n }),\n };\n }\n\n return { info: t(\"handlers.permissions.usage\") };\n};\n\nfunction renderListing(root: string | undefined, mode: string | null): string {\n const lines: string[] = [];\n if (mode === \"yolo\") {\n lines.push(t(\"handlers.permissions.modeYolo\"));\n } else if (mode === \"auto\") {\n lines.push(t(\"handlers.permissions.modeAuto\"));\n } else if (mode === \"review\") {\n lines.push(t(\"handlers.permissions.modeReview\"));\n }\n lines.push(\"\");\n\n if (root) {\n const project = loadProjectShellAllowed(root);\n lines.push(t(\"handlers.permissions.projectHeader\", { count: project.length, root }));\n if (project.length === 0) {\n lines.push(t(\"handlers.permissions.projectNone1\"));\n lines.push(t(\"handlers.permissions.projectNone2\"));\n } else {\n project.forEach((p, i) => {\n lines.push(` ${String(i + 1).padStart(2)}. ${p}`);\n });\n }\n } else {\n lines.push(t(\"handlers.permissions.projectNoRoot\"));\n }\n lines.push(\"\");\n\n lines.push(t(\"handlers.permissions.builtinHeader\", { count: BUILTIN_ALLOWLIST.length }));\n const grouped = new Map<string, string[]>();\n for (const entry of BUILTIN_ALLOWLIST) {\n const head = entry.split(\" \")[0] ?? entry;\n if (!grouped.has(head)) grouped.set(head, []);\n grouped.get(head)!.push(entry);\n }\n for (const [head, items] of grouped) {\n if (items.length === 1 && items[0] === head) {\n lines.push(` · ${head}`);\n } else {\n const tail = items.map((i) => i.slice(head.length).trim() || \"(bare)\").join(\", \");\n lines.push(` · ${head}: ${tail}`);\n }\n }\n lines.push(\"\");\n lines.push(t(\"handlers.permissions.subcommands\"));\n return lines.join(\"\\n\");\n}\n\nexport const handlers: Record<string, SlashHandler> = {\n permissions,\n perms: permissions,\n};\n","import { basename } from \"node:path\";\nimport { listPlanArchives, loadPlanState, relativeTime } from \"@/code/plan-store.js\";\nimport { t } from \"@/i18n/index.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\n\nconst plans: SlashHandler = (_args, loop) => {\n const sessionName = loop.sessionName;\n if (!sessionName) {\n return { info: t(\"handlers.plans.noSession\") };\n }\n const lines: string[] = [];\n const active = loadPlanState(sessionName);\n if (active && active.steps.length > 0) {\n const total = active.steps.length;\n const done = active.completedStepIds.length;\n const when = relativeTime(active.updatedAt);\n const label = active.summary ? `: ${active.summary}` : \"\";\n lines.push(\n t(\"handlers.plans.activePlan\", {\n label,\n done,\n total,\n s: total === 1 ? \"\" : \"s\",\n when,\n }),\n );\n } else {\n lines.push(t(\"handlers.plans.activeNone\"));\n }\n\n const archives = listPlanArchives(sessionName);\n if (archives.length === 0) {\n lines.push(\"\");\n lines.push(t(\"handlers.plans.noArchives\"));\n return { info: lines.join(\"\\n\") };\n }\n lines.push(\"\");\n lines.push(t(\"handlers.plans.archivedHeader\", { count: archives.length }));\n for (const a of archives) {\n const when = relativeTime(a.completedAt);\n const total = a.steps.length;\n const done = a.completedStepIds.length;\n const completion = done >= total ? t(\"handlers.plans.completionComplete\") : `${done}/${total}`;\n const label = a.summary ?? a.path.split(/[\\\\/]/).pop() ?? a.path;\n lines.push(\n t(\"handlers.plans.archivedRow\", {\n when: when.padEnd(10),\n total,\n s: total === 1 ? \"\" : \"s\",\n completion,\n label,\n }),\n );\n }\n return { info: lines.join(\"\\n\") };\n};\n\nconst replay: SlashHandler = (args, loop) => {\n const sessionName = loop.sessionName;\n if (!sessionName) {\n return { info: t(\"handlers.plans.replayNoSession\") };\n }\n const archives = listPlanArchives(sessionName);\n if (archives.length === 0) {\n return { info: t(\"handlers.plans.replayNoArchives\") };\n }\n const arg = args[0]?.trim() ?? \"\";\n const index = arg ? Number.parseInt(arg, 10) : 1;\n if (!Number.isFinite(index) || index < 1 || index > archives.length) {\n return {\n info: t(\"handlers.plans.replayInvalidIndex\", { max: archives.length }),\n };\n }\n const a = archives[index - 1]!;\n return {\n replayPlan: {\n summary: a.summary,\n body: a.body,\n steps: a.steps,\n completedStepIds: a.completedStepIds,\n completedAt: a.completedAt,\n relativeTime: relativeTime(a.completedAt),\n archiveBasename: basename(a.path),\n index,\n total: archives.length,\n },\n };\n};\n\nconst stop: SlashHandler = (_args, loop) => {\n loop.abort();\n return { info: t(\"handlers.plans.stopAborted\") };\n};\n\nexport const handlers: Record<string, SlashHandler> = {\n plans,\n replay,\n stop,\n};\n","import type { SlashHandler } from \"../dispatch.js\";\n\nconst sessions: SlashHandler = () => ({ openSessionsPicker: true });\n\nexport const handlers: Record<string, SlashHandler> = {\n sessions,\n};\n","import { t } from \"@/i18n/index.js\";\nimport { SkillStore } from \"@/skills.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\n\nconst skill: SlashHandler = (args, _loop, ctx) => {\n const store = new SkillStore({ projectRoot: ctx.codeRoot });\n const sub = (args[0] ?? \"\").toLowerCase();\n\n if (sub === \"new\" || sub === \"init\") {\n const name = args[1];\n if (!name) return { info: t(\"handlers.skill.newUsage\") };\n const wantsGlobal = args.slice(2).includes(\"--global\") || !ctx.codeRoot;\n const result = store.create(name, wantsGlobal ? \"global\" : \"project\");\n if (\"error\" in result) {\n return { info: t(\"handlers.skill.newError\", { reason: result.error }) };\n }\n return { info: t(\"handlers.skill.newCreated\", { name, path: result.path }) };\n }\n\n if (sub === \"\" || sub === \"list\" || sub === \"ls\") {\n const skills = store.list();\n if (skills.length === 0) {\n const lines = [t(\"handlers.skill.listEmpty\")];\n if (store.hasProjectScope()) {\n lines.push(t(\"handlers.skill.listProjectScope\"));\n }\n lines.push(t(\"handlers.skill.listGlobalScope\"));\n if (!store.hasProjectScope()) {\n lines.push(t(\"handlers.skill.listProjectOnly\"));\n }\n lines.push(\n \"\",\n t(\"handlers.skill.listFrontmatter\"),\n t(\"handlers.skill.listInvoke\"),\n \"\",\n t(\"handlers.skill.listEmptyNewHint\"),\n );\n return { info: lines.join(\"\\n\") };\n }\n const lines = [t(\"handlers.skill.listHeader\", { count: skills.length })];\n for (const s of skills) {\n const scope = `(${s.scope})`.padEnd(11);\n const name = s.name.padEnd(24);\n const desc = s.description.length > 70 ? `${s.description.slice(0, 69)}…` : s.description;\n lines.push(` ${scope} ${name} ${desc}`);\n }\n lines.push(\"\");\n lines.push(t(\"handlers.skill.listFooter\"));\n return { info: lines.join(\"\\n\") };\n }\n\n if (sub === \"show\" || sub === \"cat\") {\n const target = args[1];\n if (!target) return { info: t(\"handlers.skill.showUsage\") };\n const found = store.read(target);\n if (!found) return { info: t(\"handlers.skill.showNotFound\", { name: target }) };\n return {\n info: [\n `▸ ${found.name} (${found.scope})`,\n found.description ? ` ${found.description}` : \"\",\n ` ${found.path}`,\n \"\",\n found.body,\n ]\n .filter((l) => l !== \"\")\n .join(\"\\n\"),\n };\n }\n\n const name = args[0] ?? \"\";\n const found = store.read(name);\n if (!found) {\n return { info: t(\"handlers.skill.runNotFound\", { name }) };\n }\n const extra = args.slice(1).join(\" \").trim();\n const header = `# Skill: ${found.name}${found.description ? `\\n> ${found.description}` : \"\"}`;\n const argsLine = extra ? `\\n\\nArguments: ${extra}` : \"\";\n const payload = `${header}\\n\\n${found.body}${argsLine}`;\n return {\n info: t(\"handlers.skill.runInfo\", {\n name: found.name,\n args: extra ? ` — ${extra}` : \"\",\n }),\n resubmit: payload,\n };\n};\n\nexport const handlers: Record<string, SlashHandler> = {\n skill,\n skills: skill,\n};\n","import { loadTheme, resolveThemePreference, saveTheme } from \"@/config.js\";\nimport { type ThemeName, isThemeName, listThemeNames } from \"../../theme/tokens.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\n\nconst themeChoices = [\"auto\", ...listThemeNames()] as const;\n\nfunction formatThemeStatus(): string {\n const configured = loadTheme();\n const active = resolveThemePreference(configured, process.env.REASONIX_THEME);\n const source = configured && configured !== \"auto\" ? \"config\" : \"env/default\";\n\n return [\n `theme: ${active} (${source})`,\n `configured: ${configured ?? \"unset\"}`,\n `available: ${themeChoices.join(\", \")}`,\n \"usage: /theme <name|auto>\",\n ].join(\"\\n\");\n}\n\nfunction isThemeChoice(value: string): value is ThemeName | \"auto\" {\n return value === \"auto\" || isThemeName(value);\n}\n\nconst theme: SlashHandler = (args) => {\n const next = args[0];\n if (!next) return { info: formatThemeStatus() };\n\n if (!isThemeChoice(next)) {\n return { info: `unknown theme: ${next}\\navailable: ${themeChoices.join(\", \")}` };\n }\n\n saveTheme(next);\n const active = resolveThemePreference(next, process.env.REASONIX_THEME);\n return { info: `theme saved: ${next}\\nactive on next launch: ${active}` };\n};\n\nexport const handlers: Record<string, SlashHandler> = {\n theme,\n};\n","import { readConfig, webSearchEndpoint, webSearchEngine, writeConfig } from \"../../../../config.js\";\nimport { t } from \"../../../../i18n/index.js\";\nimport type { SlashHandler } from \"../dispatch.js\";\n\nexport const handlers: Record<string, SlashHandler> = {\n \"search-engine\": (args, _loop, ctx) => {\n const engine = args[0];\n if (!engine || (engine !== \"mojeek\" && engine !== \"searxng\")) {\n return {\n info: [\n t(\"handlers.webSearchEngine.currentEngine\", { engine: webSearchEngine() }),\n t(\"handlers.webSearchEngine.endpoint\", { url: webSearchEndpoint() }),\n \"\",\n t(\"handlers.webSearchEngine.usageHeader\"),\n t(\"handlers.webSearchEngine.usageMojeek\"),\n t(\"handlers.webSearchEngine.usageSearxng\"),\n t(\"handlers.webSearchEngine.usageSearxngUrl\"),\n \"\",\n t(\"handlers.webSearchEngine.alias\"),\n \"\",\n t(\"handlers.webSearchEngine.searxngInfo\"),\n t(\"handlers.webSearchEngine.searxngInstall\"),\n ].join(\"\\n\"),\n };\n }\n\n const cfg = readConfig();\n cfg.webSearchEngine = engine;\n if (engine === \"searxng\" && args[1]) {\n const raw = args[1];\n cfg.webSearchEndpoint = raw.includes(\"://\") ? raw : `http://${raw}`;\n }\n writeConfig(cfg);\n\n const note =\n engine === \"searxng\"\n ? t(\"handlers.webSearchEngine.switchedSearxngNote\", { endpoint: webSearchEndpoint() })\n : \"\";\n ctx.postInfo?.(t(\"handlers.webSearchEngine.switched\", { engine, note }));\n\n const detail =\n engine === \"searxng\"\n ? t(\"handlers.webSearchEngine.confirmedDetail\", { endpoint: webSearchEndpoint() })\n : \"\";\n return { info: t(\"handlers.webSearchEngine.confirmed\", { engine, detail }) };\n },\n se: (args, loop, ctx) => handlers[\"search-engine\"]!(args, loop, ctx),\n};\n","import type { CacheFirstLoop } from \"../../../loop.js\";\nimport { resolveSlashAlias } from \"./commands.js\";\nimport { handlers as adminHandlers } from \"./handlers/admin.js\";\nimport { handlers as basicHandlers } from \"./handlers/basic.js\";\nimport { handlers as dashboardHandlers } from \"./handlers/dashboard.js\";\nimport { handlers as editsHandlers } from \"./handlers/edits.js\";\nimport { handlers as initHandlers } from \"./handlers/init.js\";\nimport { handlers as jobsHandlers } from \"./handlers/jobs.js\";\nimport { handlers as languageHandlers } from \"./handlers/language.js\";\nimport { handlers as mcpHandlers } from \"./handlers/mcp.js\";\nimport { handlers as memoryHandlers } from \"./handlers/memory.js\";\nimport { handlers as modelHandlers } from \"./handlers/model.js\";\nimport { handlers as observabilityHandlers } from \"./handlers/observability.js\";\nimport { handlers as permissionsHandlers } from \"./handlers/permissions.js\";\nimport { handlers as plansHandlers } from \"./handlers/plans.js\";\nimport { handlers as sessionsHandlers } from \"./handlers/sessions.js\";\nimport { handlers as skillHandlers } from \"./handlers/skill.js\";\nimport { handlers as themeHandlers } from \"./handlers/theme.js\";\nimport { handlers as webSearchEngineHandlers } from \"./handlers/web-search-engine.js\";\nimport type { SlashContext, SlashResult } from \"./types.js\";\n\n/** Synchronous return — async work fires-and-forgets via `ctx.postInfo` to keep input non-blocking. */\nexport type SlashHandler = (args: string[], loop: CacheFirstLoop, ctx: SlashContext) => SlashResult;\n\nconst HANDLERS: Record<string, SlashHandler> = {\n ...adminHandlers,\n ...basicHandlers,\n ...dashboardHandlers,\n ...editsHandlers,\n ...initHandlers,\n ...jobsHandlers,\n ...languageHandlers,\n ...mcpHandlers,\n ...memoryHandlers,\n ...modelHandlers,\n ...observabilityHandlers,\n ...permissionsHandlers,\n ...plansHandlers,\n ...sessionsHandlers,\n ...themeHandlers,\n ...skillHandlers,\n ...webSearchEngineHandlers,\n};\n\nexport function handleSlash(\n cmd: string,\n args: string[],\n loop: CacheFirstLoop,\n ctx: SlashContext = {},\n): SlashResult {\n const h = HANDLERS[resolveSlashAlias(cmd)];\n if (h) return h(args, loop, ctx);\n return { unknown: true, info: `unknown command: /${cmd} (try /help)` };\n}\n","import type { TurnStats } from \"../../../telemetry/stats.js\";\nimport type { Scrollback } from \"../hooks/useScrollback.js\";\n\nexport class TurnTranslator {\n private reasoningCardId: string | null = null;\n private streamingCardId: string | null = null;\n private toolCardId: string | null = null;\n private toolStartedAt = 0;\n\n constructor(private readonly log: Scrollback) {}\n\n flushBuffers(reasoningChunk: string, contentChunk: string, model?: string): void {\n if (reasoningChunk) {\n if (!this.reasoningCardId) this.reasoningCardId = this.log.startReasoning(model);\n this.log.appendReasoning(this.reasoningCardId, reasoningChunk);\n }\n if (contentChunk) {\n if (!this.streamingCardId) this.streamingCardId = this.log.startStreaming(model);\n this.log.appendStreaming(this.streamingCardId, contentChunk);\n }\n }\n\n toolStart(name: string, args: unknown): void {\n this.toolStartedAt = Date.now();\n this.toolCardId = this.log.startTool(name, args);\n }\n\n toolEnd(output: string): void {\n if (this.toolCardId) {\n this.log.endTool(this.toolCardId, {\n output,\n elapsedMs: Date.now() - this.toolStartedAt,\n });\n this.toolCardId = null;\n }\n }\n\n toolRetry(attempt: number, max: number): void {\n if (this.toolCardId) this.log.retryTool(this.toolCardId, attempt, max);\n }\n\n reasoningDone(reasoningText: string): void {\n if (!this.reasoningCardId) return;\n const paragraphs = reasoningText ? reasoningText.split(/\\n\\s*\\n/).length : 0;\n const tokens = Math.round(reasoningText.length / 4);\n this.log.endReasoning(this.reasoningCardId, paragraphs, tokens);\n this.reasoningCardId = null;\n }\n\n streamingDone(): void {\n if (!this.streamingCardId) return;\n this.log.endStreaming(this.streamingCardId);\n this.streamingCardId = null;\n }\n\n turnEnd(\n stats: TurnStats,\n reasoningText: string,\n extras?: { promptCap?: number; elapsedMs?: number },\n ): void {\n this.log.endTurn(\n {\n prompt: stats.usage.promptTokens,\n reason: Math.round(reasoningText.length / 4),\n output: stats.usage.completionTokens,\n cacheHit: stats.cacheHitRatio,\n cost: stats.cost,\n },\n extras,\n );\n }\n\n abort(): void {\n if (this.streamingCardId) {\n this.log.endStreaming(this.streamingCardId, true);\n this.streamingCardId = null;\n }\n if (this.reasoningCardId) {\n this.log.endReasoning(this.reasoningCardId, 0, 0, true);\n this.reasoningCardId = null;\n }\n if (this.toolCardId) {\n this.log.endTool(this.toolCardId, {\n elapsedMs: Date.now() - this.toolStartedAt,\n aborted: true,\n });\n this.toolCardId = null;\n }\n this.log.abortTurn();\n }\n}\n","import type { DashboardMessage } from \"../../../server/context.js\";\nimport type { Card, ReasoningCard } from \"./cards.js\";\n\n/** Project state.cards onto the wire shape /api/messages serves to the web SPA. */\nexport function cardsToDashboardMessages(cards: ReadonlyArray<Card>): DashboardMessage[] {\n const out: DashboardMessage[] = [];\n let pendingReasoning: ReasoningCard | null = null;\n\n for (const card of cards) {\n switch (card.kind) {\n case \"reasoning\":\n pendingReasoning = card;\n break;\n case \"user\":\n out.push({ id: card.id, role: \"user\", text: card.text });\n break;\n case \"streaming\": {\n const msg: DashboardMessage = { id: card.id, role: \"assistant\", text: card.text };\n if (pendingReasoning?.text) msg.reasoning = pendingReasoning.text;\n pendingReasoning = null;\n out.push(msg);\n break;\n }\n case \"tool\": {\n const msg: DashboardMessage = {\n id: card.id,\n role: \"tool\",\n text: card.output,\n toolName: card.name,\n };\n if (card.args !== undefined) msg.toolArgs = JSON.stringify(card.args);\n out.push(msg);\n break;\n }\n case \"live\":\n // Persistent surface only — drop transient hints (thinking / aborted /\n // retry / checkpoint / mcpEvent) that don't belong in chat scrollback.\n if (card.variant === \"stepProgress\" || card.variant === \"sessionOp\") {\n out.push({\n id: card.id,\n role: card.tone === \"warn\" ? \"warning\" : \"info\",\n text: card.meta ? `${card.text}\\n${card.meta}` : card.text,\n });\n } else if (card.tone === \"warn\" || card.tone === \"err\") {\n out.push({\n id: card.id,\n role: \"warning\",\n text: card.meta ? `${card.text}: ${card.meta}` : card.text,\n });\n }\n break;\n case \"ctx\":\n out.push({ id: card.id, role: \"info\", text: card.text });\n break;\n case \"tip\": {\n const sectionTexts = card.sections.map((sec) => {\n const body = sec.rows.map((r) => `${r.key}\\t${r.text}`).join(\"\\n\");\n return sec.title ? `[${sec.title}]\\n${body}` : body;\n });\n const body = sectionTexts.join(\"\\n\\n\");\n const text = card.footer\n ? `${card.topic}\\n${body}\\n${card.footer}`\n : `${card.topic}\\n${body}`;\n out.push({ id: card.id, role: \"info\", text });\n break;\n }\n case \"plan\": {\n const done = card.steps.filter((s) => s.status === \"done\").length;\n const tag =\n card.variant === \"resumed\" ? \"[resumed]\" : card.variant === \"replay\" ? \"[replay]\" : \"\";\n const head = `▸ ${card.title}${tag ? ` ${tag}` : \"\"} — ${done}/${card.steps.length} done`;\n out.push({ id: card.id, role: \"info\", text: head });\n break;\n }\n default:\n // approval / diff / task / usage / memory / subagent / search /\n // error / warn — surfaced through other dashboard channels (modals,\n // SSE), not the boot snapshot.\n break;\n }\n }\n return out;\n}\n","import type { ChatMessage } from \"../../../types.js\";\nimport type { Card, ToolCard } from \"./cards.js\";\n\n/** Rebuild cards from a persisted ChatMessage[] so resumed sessions render their history. */\nexport function hydrateCardsFromMessages(messages: ReadonlyArray<ChatMessage>): Card[] {\n const cards: Card[] = [];\n const toolCardByCallId = new Map<string, ToolCard>();\n let seq = 0;\n const ts = Date.now();\n const id = (k: string) => `hyd-${k}-${++seq}`;\n\n for (const m of messages) {\n if (m.role === \"system\") continue;\n\n if (m.role === \"user\") {\n const text = typeof m.content === \"string\" ? m.content : \"\";\n if (text) cards.push({ kind: \"user\", id: id(\"user\"), ts, text });\n continue;\n }\n\n if (m.role === \"assistant\") {\n const reasoning = m.reasoning_content;\n if (typeof reasoning === \"string\" && reasoning.length > 0) {\n cards.push({\n kind: \"reasoning\",\n id: id(\"reasoning\"),\n ts,\n text: reasoning,\n paragraphs: reasoning.split(/\\n\\n+/).length,\n tokens: 0,\n streaming: false,\n });\n }\n const text = typeof m.content === \"string\" ? m.content : \"\";\n if (text) {\n cards.push({ kind: \"streaming\", id: id(\"streaming\"), ts, text, done: true });\n }\n if (m.tool_calls?.length) {\n for (const tc of m.tool_calls) {\n let parsedArgs: unknown = tc.function.arguments;\n try {\n parsedArgs = JSON.parse(tc.function.arguments);\n } catch {\n /* keep raw string when args aren't valid JSON */\n }\n const card: ToolCard = {\n kind: \"tool\",\n id: id(\"tool\"),\n ts,\n name: tc.function.name,\n args: parsedArgs,\n output: \"\",\n done: false,\n elapsedMs: 0,\n };\n cards.push(card);\n if (tc.id) toolCardByCallId.set(tc.id, card);\n }\n }\n continue;\n }\n\n if (m.role === \"tool\") {\n const callId = m.tool_call_id;\n const card = callId ? toolCardByCallId.get(callId) : undefined;\n const text = typeof m.content === \"string\" ? m.content : \"\";\n if (card) {\n card.output = text;\n card.done = true;\n }\n }\n }\n\n return cards;\n}\n","import { useCallback, useEffect, useMemo, useReducer, useRef, useState } from \"react\";\nimport {\n type DirEntry,\n type FileWithStats,\n type ParsedAtQuery,\n detectAtPicker,\n listDirectory,\n parseAtQuery,\n rankPickerCandidates,\n walkFilesStream,\n} from \"../../at-mentions.js\";\nimport {\n type McpServerSummary,\n type SlashArgContext,\n type SlashCommandSpec,\n countAdvancedCommands,\n detectSlashArgContext,\n suggestSlashCommands,\n} from \"./slash.js\";\n\nexport interface UseCompletionPickersParams {\n input: string;\n setInput: (v: string) => void;\n codeMode: { rootDir: string } | undefined;\n /** May differ from `codeMode.rootDir` after `/cwd` — drives file listing, not the mode check. */\n rootDir: string;\n models: string[] | null;\n mcpServers: McpServerSummary[] | undefined;\n /** Cross-session slash invocation counts — used to sort suggestions by frequency. */\n slashUsage?: Readonly<Record<string, number>>;\n}\n\nexport interface AtPickerEntry {\n /** Basename — what the row leads with. */\n label: string;\n /** Path the picker substitutes into the buffer (no leading @). */\n insertPath: string;\n /** Dim suffix shown after the label (\"src/auth/\" for \"src/auth/login.ts\" search hits). Empty in browse mode. */\n dirSuffix: string;\n isDir: boolean;\n}\n\nexport type AtPickerState =\n | { kind: \"browse\"; baseDir: string; entries: readonly AtPickerEntry[]; loading: boolean }\n | {\n kind: \"search\";\n filter: string;\n entries: readonly AtPickerEntry[];\n scanned: number;\n searching: boolean;\n };\n\nexport interface UseCompletionPickersResult {\n // ── slash-name picker ──\n slashMatches: SlashCommandSpec[] | null;\n slashSelected: number;\n setSlashSelected: React.Dispatch<React.SetStateAction<number>>;\n /** True when the input is exactly `/` — palette renders group headers. */\n slashGroupMode: boolean;\n /** Count of advanced commands hidden behind the \"type to search\" footer hint. */\n slashAdvancedHidden: number;\n\n // ── @-mention picker ──\n atState: AtPickerState | null;\n atSelected: number;\n setAtSelected: React.Dispatch<React.SetStateAction<number>>;\n pickAtMention: (entry: AtPickerEntry, action: \"commit\" | \"drill\") => void;\n recordRecentFile: (path: string) => void;\n\n // ── slash-arg picker ──\n slashArgContext: SlashArgContext | null;\n slashArgMatches: readonly string[] | null;\n slashArgSelected: number;\n setSlashArgSelected: React.Dispatch<React.SetStateAction<number>>;\n pickSlashArg: (chosen: string) => void;\n}\n\nconst SEARCH_DEBOUNCE_MS = 80;\nconst SEARCH_FLUSH_MS = 50;\nconst SEARCH_RESULT_CAP = 200;\n\n/** Picker priority: @ > slash-arg > slash-name. Detection already disambiguates by buffer shape. */\nexport function useCompletionPickers({\n input,\n setInput,\n codeMode,\n rootDir,\n models,\n mcpServers,\n slashUsage,\n}: UseCompletionPickersParams): UseCompletionPickersResult {\n // ── slash-name picker ──\n const [slashSelected, setSlashSelected] = useState(0);\n const slashMatches = useMemo(() => {\n if (!input.startsWith(\"/\") || input.includes(\" \")) return null;\n return suggestSlashCommands(input.slice(1), !!codeMode, slashUsage);\n }, [input, codeMode, slashUsage]);\n const slashGroupMode = input === \"/\";\n const slashAdvancedHidden = useMemo(\n () => (slashGroupMode ? countAdvancedCommands(!!codeMode) : 0),\n [slashGroupMode, codeMode],\n );\n useEffect(() => {\n setSlashSelected((prev) => {\n if (!slashMatches || slashMatches.length === 0) return 0;\n if (prev >= slashMatches.length) return slashMatches.length - 1;\n return prev;\n });\n }, [slashMatches]);\n\n // ── @-mention picker ──\n const [atSelected, setAtSelected] = useState(0);\n const recentFilesRef = useRef<string[]>([]);\n const recordRecentFile = useCallback((p: string) => {\n const list = recentFilesRef.current;\n const i = list.indexOf(p);\n if (i >= 0) list.splice(i, 1);\n list.unshift(p);\n if (list.length > 20) list.length = 20;\n }, []);\n\n const atPicker = useMemo(() => {\n if (!codeMode) return null;\n if (slashMatches !== null) return null;\n return detectAtPicker(input);\n }, [codeMode, input, slashMatches]);\n\n const parsed = useMemo<ParsedAtQuery | null>(\n () => (atPicker ? parseAtQuery(atPicker.query) : null),\n [atPicker],\n );\n\n const atMode: \"browse\" | \"search\" | null = parsed\n ? parsed.trailingSlash || parsed.filter === \"\"\n ? \"browse\"\n : \"search\"\n : null;\n\n const browseDir = parsed && atMode === \"browse\" ? parsed.dir : \"\";\n const browse = useBrowseListing(rootDir, atMode === \"browse\" ? browseDir : null);\n const search = useStreamingSearch(\n rootDir,\n atMode === \"search\" && parsed ? parsed.filter : null,\n recentFilesRef,\n );\n\n const atState = useMemo<AtPickerState | null>(() => {\n if (!parsed) return null;\n if (atMode === \"browse\") {\n return {\n kind: \"browse\",\n baseDir: browseDir,\n entries: browse.entries,\n loading: browse.loading,\n };\n }\n return {\n kind: \"search\",\n filter: parsed.filter,\n entries: search.entries,\n scanned: search.scanned,\n searching: search.searching,\n };\n }, [parsed, atMode, browseDir, browse, search]);\n\n useEffect(() => {\n setAtSelected((prev) => {\n const len = atState?.entries.length ?? 0;\n if (len === 0) return 0;\n if (prev >= len) return len - 1;\n return prev;\n });\n }, [atState]);\n\n const pickAtMention = useCallback(\n (entry: AtPickerEntry, action: \"commit\" | \"drill\") => {\n if (!atPicker) return;\n const before = input.slice(0, atPicker.atOffset);\n const tail =\n action === \"drill\" && entry.isDir ? `${entry.insertPath}/` : `${entry.insertPath} `;\n setInput(`${before}@${tail}`);\n },\n [atPicker, input, setInput],\n );\n\n // ── slash-arg picker ──\n const [slashArgSelected, setSlashArgSelected] = useState(0);\n const slashArgContext = useMemo<SlashArgContext | null>(() => {\n if (!input.startsWith(\"/\")) return null;\n if (slashMatches !== null) return null;\n return detectSlashArgContext(input, !!codeMode);\n }, [input, slashMatches, codeMode]);\n const slashArgMatches = useMemo<readonly string[] | null>(() => {\n if (!slashArgContext || slashArgContext.kind !== \"picker\") return null;\n const completer = slashArgContext.spec.argCompleter;\n const partial = slashArgContext.partial;\n const needle = partial.toLowerCase();\n if (Array.isArray(completer)) {\n if (partial && completer.some((v) => v.toLowerCase() === needle)) return null;\n if (!partial) return completer.slice();\n return completer.filter((v) => v.toLowerCase().startsWith(needle));\n }\n if (completer === \"models\") {\n const all = models ?? [];\n if (partial && all.some((m) => m.toLowerCase() === needle)) return null;\n if (!partial) return all.slice(0, 40);\n return all.filter((m) => m.toLowerCase().includes(needle)).slice(0, 40);\n }\n if (completer === \"mcp-resources\") {\n const uris: string[] = [];\n const servers = mcpServers ?? [];\n for (const s of servers) {\n if (!s.report.resources.supported) continue;\n for (const r of s.report.resources.items) uris.push(r.uri);\n }\n if (partial && uris.some((u) => u.toLowerCase() === needle)) return null;\n if (!partial) return uris.slice(0, 40);\n return uris.filter((u) => u.toLowerCase().includes(needle)).slice(0, 40);\n }\n if (completer === \"mcp-prompts\") {\n const names: string[] = [];\n const servers = mcpServers ?? [];\n for (const s of servers) {\n if (!s.report.prompts.supported) continue;\n for (const p of s.report.prompts.items) names.push(p.name);\n }\n if (partial && names.some((n) => n.toLowerCase() === needle)) return null;\n if (!partial) return names.slice(0, 40);\n return names.filter((n) => n.toLowerCase().includes(needle)).slice(0, 40);\n }\n return null;\n }, [slashArgContext, models, mcpServers]);\n useEffect(() => {\n setSlashArgSelected((prev) => {\n if (!slashArgMatches || slashArgMatches.length === 0) return 0;\n if (prev >= slashArgMatches.length) return slashArgMatches.length - 1;\n return prev;\n });\n }, [slashArgMatches]);\n const pickSlashArg = useCallback(\n (chosen: string) => {\n if (!slashArgContext) return;\n const before = input.slice(0, slashArgContext.partialOffset);\n setInput(`${before}${chosen}`);\n },\n [slashArgContext, input, setInput],\n );\n\n return {\n slashMatches,\n slashSelected,\n setSlashSelected,\n slashGroupMode,\n slashAdvancedHidden,\n atState,\n atSelected,\n setAtSelected,\n pickAtMention,\n recordRecentFile,\n slashArgContext,\n slashArgMatches,\n slashArgSelected,\n setSlashArgSelected,\n pickSlashArg,\n };\n}\n\nfunction useBrowseListing(rootDir: string, dir: string | null) {\n const [entries, setEntries] = useState<readonly AtPickerEntry[]>([]);\n const [loading, setLoading] = useState(false);\n useEffect(() => {\n if (dir === null) {\n setEntries([]);\n setLoading(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n listDirectory(rootDir, dir).then(\n (raw) => {\n if (cancelled) return;\n setEntries(raw.map(toBrowseEntry));\n setLoading(false);\n },\n () => {\n if (cancelled) return;\n setEntries([]);\n setLoading(false);\n },\n );\n return () => {\n cancelled = true;\n };\n }, [rootDir, dir]);\n return { entries, loading };\n}\n\nfunction toBrowseEntry(d: DirEntry): AtPickerEntry {\n return { label: d.name, insertPath: d.path, dirSuffix: \"\", isDir: d.isDir };\n}\n\nfunction useStreamingSearch(\n rootDir: string,\n filter: string | null,\n recentFilesRef: React.RefObject<string[]>,\n) {\n const [, bumpRender] = useReducer((x: number) => x + 1, 0);\n const hitsRef = useRef<FileWithStats[]>([]);\n const scannedRef = useRef(0);\n const searchingRef = useRef(false);\n const rankedRef = useRef<readonly AtPickerEntry[]>([]);\n\n useEffect(() => {\n if (filter === null) {\n hitsRef.current = [];\n scannedRef.current = 0;\n searchingRef.current = false;\n rankedRef.current = [];\n bumpRender();\n return;\n }\n hitsRef.current = [];\n scannedRef.current = 0;\n searchingRef.current = true;\n rankedRef.current = [];\n bumpRender();\n\n const ac = new AbortController();\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n const scheduleFlush = () => {\n if (flushTimer) return;\n flushTimer = setTimeout(() => {\n flushTimer = null;\n rankedRef.current = rankSearchHits(hitsRef.current, filter, recentFilesRef.current ?? []);\n bumpRender();\n }, SEARCH_FLUSH_MS);\n };\n\n const debounce = setTimeout(() => {\n walkFilesStream(rootDir, {\n signal: ac.signal,\n onEntry: (e) => {\n hitsRef.current.push(e);\n if (hitsRef.current.length >= SEARCH_RESULT_CAP * 8) return false;\n scheduleFlush();\n },\n onProgress: (n) => {\n scannedRef.current = n;\n scheduleFlush();\n },\n }).then(() => {\n searchingRef.current = false;\n rankedRef.current = rankSearchHits(hitsRef.current, filter, recentFilesRef.current ?? []);\n bumpRender();\n });\n }, SEARCH_DEBOUNCE_MS);\n\n return () => {\n clearTimeout(debounce);\n if (flushTimer) clearTimeout(flushTimer);\n ac.abort();\n };\n }, [rootDir, filter, recentFilesRef]);\n\n return {\n entries: rankedRef.current,\n scanned: scannedRef.current,\n searching: searchingRef.current,\n };\n}\n\nfunction rankSearchHits(\n hits: readonly FileWithStats[],\n filter: string,\n recent: readonly string[],\n): readonly AtPickerEntry[] {\n const ranked = rankPickerCandidates(hits, filter, {\n limit: SEARCH_RESULT_CAP,\n recentlyUsed: recent,\n });\n return ranked.map((path) => {\n const slash = path.lastIndexOf(\"/\");\n return {\n label: slash >= 0 ? path.slice(slash + 1) : path,\n insertPath: path,\n dirSuffix: slash >= 0 ? `${path.slice(0, slash)}/` : \"\",\n isDir: false,\n };\n });\n}\n","import { useCallback, useRef, useState } from \"react\";\nimport { formatAllBlockDiffs } from \"../../code/diff-preview.js\";\nimport {\n type ApplyResult,\n type EditBlock,\n type EditSnapshot,\n restoreSnapshots,\n} from \"../../code/edit-blocks.js\";\nimport {\n type EditHistoryEntry,\n entryStatus,\n formatUndoRows,\n isEntryFullyUndone,\n} from \"./edit-history.js\";\n\nexport interface UndoBannerState {\n results: ApplyResult[];\n expiresAt: number;\n /** Set when the user paused the countdown; banner stays up until they resume or hit `u`. */\n pausedRemainingMs: number | null;\n}\n\nexport interface UseEditHistoryResult {\n /** Post-auto-apply banner state — rendered at the bottom for 5s. */\n undoBanner: UndoBannerState | null;\n /** First-wins-per-path within an open turn — `/undo` restores pre-turn state, not a half-edit. */\n recordEdit: (\n source: string,\n blocks: readonly EditBlock[],\n results: readonly ApplyResult[],\n snaps: readonly EditSnapshot[],\n ) => void;\n /** Replaces the dismiss timer so multiple edits in one turn don't prematurely expire the window. */\n armUndoBanner: (results: ApplyResult[]) => void;\n /** Pause / resume the active undo countdown. No-ops if the banner is already settled. */\n toggleUndoPause: () => void;\n codeUndo: (args?: readonly string[]) => string;\n codeHistory: () => string;\n codeShowEdit: (args?: readonly string[]) => string;\n /** Sealed at handleSubmit start so prior turns stay intact for independent /history walks. */\n sealCurrentEntry: () => void;\n /** Reads the ref fresh — callers must re-read each time. */\n hasUndoable: () => boolean;\n /** Includes paths from undone batches — they're still files the user was thinking about. */\n touchedPaths: () => string[];\n}\n\n/** `codeMode` undefined → all handlers no-op (hook is always mounted). */\nexport function useEditHistory(codeMode: { rootDir: string } | undefined): UseEditHistoryResult {\n const editHistory = useRef<EditHistoryEntry[]>([]);\n const nextHistoryId = useRef(1);\n const currentTurnEntry = useRef<EditHistoryEntry | null>(null);\n const [undoBanner, setUndoBanner] = useState<UndoBannerState | null>(null);\n const undoTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const recordEdit = useCallback<UseEditHistoryResult[\"recordEdit\"]>(\n (source, blocks, results, snaps) => {\n if (snaps.length === 0) return;\n let entry = currentTurnEntry.current;\n if (!entry) {\n entry = {\n id: nextHistoryId.current++,\n at: Date.now(),\n source,\n blocks: [],\n results: [],\n snapshots: [],\n undoneFiles: new Set<string>(),\n };\n currentTurnEntry.current = entry;\n editHistory.current.push(entry);\n }\n entry.blocks.push(...blocks);\n entry.results.push(...results);\n const seen = new Set(entry.snapshots.map((s) => s.path));\n for (const s of snaps) {\n if (!seen.has(s.path)) entry.snapshots.push(s);\n }\n },\n [],\n );\n\n const armUndoBanner = useCallback<UseEditHistoryResult[\"armUndoBanner\"]>((results) => {\n setUndoBanner({ results, expiresAt: Date.now() + 5000, pausedRemainingMs: null });\n if (undoTimeoutRef.current) clearTimeout(undoTimeoutRef.current);\n undoTimeoutRef.current = setTimeout(() => {\n setUndoBanner(null);\n undoTimeoutRef.current = null;\n }, 5000);\n }, []);\n\n const toggleUndoPause = useCallback<UseEditHistoryResult[\"toggleUndoPause\"]>(() => {\n setUndoBanner((prev) => {\n if (!prev) return prev;\n if (prev.pausedRemainingMs === null) {\n const remaining = Math.max(0, prev.expiresAt - Date.now());\n if (undoTimeoutRef.current) {\n clearTimeout(undoTimeoutRef.current);\n undoTimeoutRef.current = null;\n }\n return { ...prev, pausedRemainingMs: remaining };\n }\n const remaining = prev.pausedRemainingMs;\n undoTimeoutRef.current = setTimeout(() => {\n setUndoBanner(null);\n undoTimeoutRef.current = null;\n }, remaining);\n return { ...prev, expiresAt: Date.now() + remaining, pausedRemainingMs: null };\n });\n }, []);\n\n const codeUndo = useCallback<UseEditHistoryResult[\"codeUndo\"]>(\n (args = []) => {\n if (!codeMode) return \"not in code mode\";\n const root = codeMode.rootDir;\n\n const revert = (entry: EditHistoryEntry, paths: readonly string[]): string => {\n const subset = entry.snapshots.filter((s) => paths.includes(s.path));\n if (subset.length === 0) {\n return `batch #${entry.id}: nothing to undo (already restored or path not in batch)`;\n }\n const results = restoreSnapshots(subset, root);\n for (const s of subset) entry.undoneFiles.add(s.path);\n if (currentTurnEntry.current === entry && isEntryFullyUndone(entry)) {\n currentTurnEntry.current = null;\n }\n if (undoTimeoutRef.current) {\n clearTimeout(undoTimeoutRef.current);\n undoTimeoutRef.current = null;\n }\n setUndoBanner(null);\n const when = new Date(entry.at).toISOString().replace(\"T\", \" \").slice(11, 19);\n const scope = subset.length === 1 ? subset[0]!.path : `${subset.length} file(s)`;\n const header = `▸ undo: reverted ${scope} from batch #${entry.id} (${when})`;\n return [header, ...formatUndoRows(results)].join(\"\\n\");\n };\n\n const idArg = args[0];\n const pathArg = args[1];\n\n if (!idArg) {\n for (let i = editHistory.current.length - 1; i >= 0; i--) {\n const e = editHistory.current[i]!;\n if (isEntryFullyUndone(e)) continue;\n const remaining = e.snapshots.map((s) => s.path).filter((p) => !e.undoneFiles.has(p));\n return revert(e, remaining);\n }\n return \"nothing to undo — every batch in the session history is already undone\";\n }\n\n const id = Number.parseInt(idArg, 10);\n if (!Number.isFinite(id)) {\n return \"usage: /undo [id] [path] (omit id for newest; id from /history; path from /show <id>)\";\n }\n const entry = editHistory.current.find((e) => e.id === id);\n if (!entry) return `no edit #${id} — run /history to see valid ids`;\n\n if (!pathArg) {\n const remaining = entry.snapshots\n .map((s) => s.path)\n .filter((p) => !entry.undoneFiles.has(p));\n if (remaining.length === 0) return `batch #${id} is already fully undone`;\n return revert(entry, remaining);\n }\n\n const snap = entry.snapshots.find((s) => s.path === pathArg);\n if (!snap) {\n const files = [...new Set(entry.blocks.map((b) => b.path))];\n return `batch #${id} doesn't include \"${pathArg}\" — files in this batch: ${files.join(\", \")}`;\n }\n if (entry.undoneFiles.has(pathArg)) {\n return `${pathArg} in batch #${id} is already undone`;\n }\n return revert(entry, [pathArg]);\n },\n [codeMode],\n );\n\n const codeHistory = useCallback<UseEditHistoryResult[\"codeHistory\"]>(() => {\n if (!codeMode) return \"not in code mode\";\n const entries = editHistory.current;\n if (entries.length === 0) return \"no edits recorded this session yet\";\n const lines = [\"Edit history (oldest first):\"];\n for (const e of entries) {\n const when = new Date(e.at).toISOString().replace(\"T\", \" \").slice(11, 19);\n const files = new Set(e.blocks.map((b) => b.path));\n const fileList = [...files].join(\", \");\n const fileSummary = fileList.length > 60 ? `${fileList.slice(0, 60)}…` : fileList;\n const status = entryStatus(e);\n const statusText =\n status === \"applied\" ? \"applied\" : status === \"PARTIAL\" ? \"PARTIAL\" : \"UNDONE \";\n lines.push(\n ` #${String(e.id).padStart(3)} ${when} ${statusText} ${e.source.padEnd(12)} ${files.size} file · ${e.blocks.length} block ${fileSummary}`,\n );\n }\n lines.push(\"\");\n lines.push(\n \"/show <id> → per-file summary · /show <id> <path> → full diff of one file\",\n );\n lines.push(\n \"/undo → newest non-undone · /undo <id> [path] → target a specific batch or file\",\n );\n return lines.join(\"\\n\");\n }, [codeMode]);\n\n const codeShowEdit = useCallback<UseEditHistoryResult[\"codeShowEdit\"]>(\n (args = []) => {\n if (!codeMode) return \"not in code mode\";\n const entries = editHistory.current;\n if (entries.length === 0) return \"no edits recorded this session — /history is empty\";\n\n const idArg = args[0];\n const pathArg = args[1];\n\n let entry: EditHistoryEntry | undefined;\n if (!idArg) {\n entry =\n [...entries].reverse().find((e) => !isEntryFullyUndone(e)) ?? entries[entries.length - 1];\n } else {\n const id = Number.parseInt(idArg, 10);\n if (!Number.isFinite(id)) {\n return \"usage: /show [id] [path] (omit id for newest; path from the per-file summary)\";\n }\n entry = entries.find((e) => e.id === id);\n if (!entry) return `no edit #${id} — run /history to see valid ids`;\n }\n if (!entry) return \"unexpected: history lookup failed\";\n\n if (pathArg) {\n const fileBlocks = entry.blocks.filter((b) => b.path === pathArg);\n if (fileBlocks.length === 0) {\n const files = [...new Set(entry.blocks.map((b) => b.path))];\n return `batch #${entry.id} doesn't include \"${pathArg}\" — files in this batch: ${files.join(\", \")}`;\n }\n const when = new Date(entry.at).toISOString().replace(\"T\", \" \").slice(11, 19);\n const state = entry.undoneFiles.has(pathArg) ? \"UNDONE\" : \"applied\";\n const header = `▸ edit #${entry.id} · ${when} · ${pathArg} · ${state} · ${fileBlocks.length} block(s)`;\n const diff = formatAllBlockDiffs(fileBlocks, { maxLines: 60, contextLines: 2 });\n const footer = entry.undoneFiles.has(pathArg)\n ? \"(already reverted — /history shows the batch-level status)\"\n : `/undo ${entry.id} ${pathArg} → revert just this file`;\n return [header, ...diff, \"\", footer].join(\"\\n\");\n }\n\n const when = new Date(entry.at).toISOString().replace(\"T\", \" \").slice(11, 19);\n const files = [...new Set(entry.blocks.map((b) => b.path))];\n const status = entryStatus(entry);\n const header = `▸ edit #${entry.id} · ${when} · ${entry.source} · ${status} · ${files.length} file(s)`;\n const countLines = (s: string) => (s.length === 0 ? 0 : (s.match(/\\n/g)?.length ?? 0) + 1);\n const fileLines = files.map((path) => {\n const fileBlocks = entry!.blocks.filter((b) => b.path === path);\n let removed = 0;\n let added = 0;\n for (const b of fileBlocks) {\n removed += countLines(b.search);\n added += countLines(b.replace);\n }\n const state = entry!.undoneFiles.has(path) ? \"UNDONE\" : \"applied\";\n return ` ${state.padEnd(7)} -${String(removed).padStart(3)}/+${String(added).padStart(3)} ${path} (${fileBlocks.length} block${fileBlocks.length === 1 ? \"\" : \"s\"})`;\n });\n return [\n header,\n ...fileLines,\n \"\",\n `/show ${entry.id} <path> → full diff of one file`,\n `/undo ${entry.id} <path> → revert just that file · /undo ${entry.id} → revert whole batch`,\n ].join(\"\\n\");\n },\n [codeMode],\n );\n\n const sealCurrentEntry = useCallback(() => {\n currentTurnEntry.current = null;\n }, []);\n\n const hasUndoable = useCallback(\n () => editHistory.current.some((e) => !isEntryFullyUndone(e)),\n [],\n );\n\n const touchedPaths = useCallback<UseEditHistoryResult[\"touchedPaths\"]>(() => {\n const seen = new Set<string>();\n for (const entry of editHistory.current) {\n for (const b of entry.blocks) seen.add(b.path);\n }\n return [...seen];\n }, []);\n\n return {\n undoBanner,\n recordEdit,\n armUndoBanner,\n toggleUndoPause,\n codeUndo,\n codeHistory,\n codeShowEdit,\n sealCurrentEntry,\n hasUndoable,\n touchedPaths,\n };\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport type { CacheFirstLoop } from \"../../loop.js\";\nimport { VERSION, compareVersions, getLatestVersion } from \"../../version.js\";\n\nexport interface Balance {\n currency: string;\n total: number;\n}\n\nexport interface UseSessionInfoResult {\n balance: Balance | null;\n models: string[] | null;\n latestVersion: string | null;\n /** Strictly-newer version string (for the header badge) — else `null`. */\n updateAvailable: string | null;\n refreshBalance: () => void;\n refreshModels: () => void;\n refreshLatestVersion: () => void;\n}\n\n/** All values best-effort — `null` means \"not loaded or endpoint failed\"; StatsPanel hides those cells. */\nexport function useSessionInfo(loop: CacheFirstLoop): UseSessionInfoResult {\n const [balance, setBalance] = useState<Balance | null>(null);\n const [models, setModels] = useState<string[] | null>(null);\n const [latestVersion, setLatestVersion] = useState<string | null>(null);\n\n // Fetch balance on mount. Non-blocking — the session works without\n // it; `null` hides the cell. handleSubmit calls refreshBalance in\n // its finally so the number tracks actual spend rather than\n // freezing at mount-time.\n useEffect(() => {\n let cancelled = false;\n void (async () => {\n const bal = await loop.client.getBalance().catch(() => null);\n if (cancelled || !bal || !bal.balance_infos.length) return;\n const primary = bal.balance_infos[0]!;\n setBalance({ currency: primary.currency, total: Number(primary.total_balance) });\n })();\n return () => {\n cancelled = true;\n };\n }, [loop]);\n\n // Fetch the model catalog from DeepSeek once. Silent degrade on\n // failure (stays null), so `/models` can tell \"still loading /\n // offline\" apart from \"loaded, here's the list.\"\n useEffect(() => {\n let cancelled = false;\n void (async () => {\n const list = await loop.client.listModels().catch(() => null);\n if (cancelled || !list) return;\n setModels(list.data.map((m) => m.id));\n })();\n return () => {\n cancelled = true;\n };\n }, [loop]);\n\n // Background registry check — 24h disk cache absorbs repeated\n // launches, timeout bounded so a flaky network doesn't delay the\n // notification. `null` on failure (silent). We store the raw version\n // regardless of whether it's newer; the header badge's newer-only\n // check happens at the `updateAvailable` derivation below.\n useEffect(() => {\n let cancelled = false;\n void (async () => {\n const latest = await getLatestVersion();\n if (cancelled || !latest) return;\n setLatestVersion(latest);\n })();\n return () => {\n cancelled = true;\n };\n }, []);\n\n const updateAvailable =\n latestVersion && compareVersions(VERSION, latestVersion) < 0 ? latestVersion : null;\n\n const refreshBalance = useCallback(() => {\n void (async () => {\n const bal = await loop.client.getBalance().catch(() => null);\n if (bal?.balance_infos.length) {\n const p = bal.balance_infos[0]!;\n setBalance({ currency: p.currency, total: Number(p.total_balance) });\n }\n })();\n }, [loop]);\n\n const refreshModels = useCallback(() => {\n void (async () => {\n const list = await loop.client.listModels().catch(() => null);\n if (list) setModels(list.data.map((m) => m.id));\n })();\n }, [loop]);\n\n const refreshLatestVersion = useCallback(() => {\n void (async () => {\n const fresh = await getLatestVersion({ force: true });\n if (fresh) setLatestVersion(fresh);\n })();\n }, []);\n\n return {\n balance,\n models,\n latestVersion,\n updateAvailable,\n refreshBalance,\n refreshModels,\n refreshLatestVersion,\n };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { LoopEvent } from \"../../loop.js\";\nimport { appendUsage } from \"../../telemetry/usage.js\";\nimport type { SubagentEvent, SubagentSink } from \"../../tools/subagent.js\";\nimport type { Scrollback } from \"./hooks/useScrollback.js\";\nimport { CARD, TONE, formatCost } from \"./theme/tokens.js\";\n\nfunction summariseInner(ev: LoopEvent): SubagentInnerSummary | null {\n if (ev.role === \"tool_start\") {\n return {\n glyph: \"▣\",\n color: CARD.tool.color,\n label: ev.toolName ?? \"tool\",\n meta: \"running\",\n };\n }\n if (ev.role === \"tool\") {\n return {\n glyph: \"▣\",\n color: CARD.tool.color,\n label: ev.toolName ?? \"tool\",\n meta: \"done\",\n };\n }\n if (ev.role === \"warning\") {\n return { glyph: \"⚠\", color: TONE.warn, label: \"warning\", meta: ev.content?.slice(0, 40) };\n }\n if (ev.role === \"error\") {\n return { glyph: \"✖\", color: TONE.err, label: ev.error ?? \"error\" };\n }\n return null;\n}\n\nexport interface SubagentInnerSummary {\n /** Card-kind-ish glyph (◆ reasoning, ▣ tool, ▶ streaming, ✖ error). */\n glyph: string;\n color: string;\n label: string;\n meta?: string;\n}\n\nexport interface SubagentActivity {\n /** Stable per-spawn id; key for parallel-row rendering. */\n runId: string;\n /** Wall-clock start so the stack stays in launch order even when events arrive interleaved. */\n startedAt: number;\n task: string;\n iter: number;\n elapsedMs: number;\n skillName?: string;\n model?: string;\n phase?: \"exploring\" | \"summarising\";\n lastInner: SubagentInnerSummary | null;\n}\n\nexport interface UseSubagentParams {\n session: string | undefined;\n log: Scrollback;\n /** Read live wallet currency at end-event time so the cost suffix follows the wallet symbol. */\n getWalletCurrency?: () => string | undefined;\n}\n\nexport interface UseSubagentResult {\n /** In-flight runs, oldest first. Empty when none active. */\n activities: ReadonlyArray<SubagentActivity>;\n sinkRef: React.MutableRefObject<SubagentSink>;\n}\n\nexport function useSubagent({\n session,\n log,\n getWalletCurrency,\n}: UseSubagentParams): UseSubagentResult {\n const [activities, setActivities] = useState<ReadonlyArray<SubagentActivity>>([]);\n const sinkRef = useRef<SubagentSink>({ current: null });\n // Subagent runs can outlive a balance refresh; the thunk lives in a ref so the\n // sink callback (installed once at mount) always reads the latest wallet currency.\n const getWalletCurrencyRef = useRef(getWalletCurrency);\n useEffect(() => {\n getWalletCurrencyRef.current = getWalletCurrency;\n }, [getWalletCurrency]);\n\n useEffect(() => {\n sinkRef.current.current = (ev: SubagentEvent) => {\n if (ev.kind === \"start\") {\n setActivities((prev) => {\n if (prev.some((a) => a.runId === ev.runId)) return prev;\n const next: SubagentActivity = {\n runId: ev.runId,\n startedAt: Date.now() - (ev.elapsedMs ?? 0),\n task: ev.task,\n iter: ev.iter ?? 0,\n elapsedMs: ev.elapsedMs ?? 0,\n skillName: ev.skillName,\n model: ev.model,\n phase: \"exploring\",\n lastInner: null,\n };\n return [...prev, next];\n });\n return;\n }\n if (ev.kind === \"end\") {\n setActivities((prev) => prev.filter((a) => a.runId !== ev.runId));\n const seconds = ((ev.elapsedMs ?? 0) / 1000).toFixed(1);\n const costTail =\n ev.costUsd !== undefined && ev.costUsd > 0\n ? ` · ${formatCost(ev.costUsd, getWalletCurrencyRef.current?.())}`\n : \"\";\n const summary = ev.error\n ? `⌬ subagent \"${ev.task}\" failed after ${seconds}s · ${ev.iter ?? 0} tool call(s) — ${ev.error}`\n : `⌬ subagent \"${ev.task}\" done in ${seconds}s · ${ev.iter ?? 0} tool call(s) · ${ev.turns ?? 0} turn(s)${costTail}`;\n log.pushInfo(summary);\n if (!ev.error && ev.usage && ev.model) {\n appendUsage({\n session: session ?? null,\n model: ev.model,\n usage: ev.usage,\n kind: \"subagent\",\n subagent: {\n skillName: ev.skillName,\n taskPreview: ev.task.slice(0, 60),\n toolIters: ev.iter ?? 0,\n durationMs: ev.elapsedMs ?? 0,\n },\n });\n }\n return;\n }\n // progress / phase / inner — patch the matching row, ignore stragglers from runs we never saw `start` for.\n setActivities((prev) =>\n prev.map((a) => {\n if (a.runId !== ev.runId) return a;\n if (ev.kind === \"progress\") {\n return {\n ...a,\n iter: ev.iter ?? a.iter,\n elapsedMs: ev.elapsedMs ?? a.elapsedMs,\n };\n }\n if (ev.kind === \"phase\") {\n return { ...a, phase: ev.phase ?? a.phase };\n }\n if (ev.kind === \"inner\" && ev.inner) {\n const summary = summariseInner(ev.inner);\n return summary ? { ...a, lastInner: summary } : a;\n }\n return a;\n }),\n );\n };\n return () => {\n sinkRef.current.current = null;\n };\n }, [session, log]);\n\n return { activities, sinkRef };\n}\n","import { Box, Text, useApp } from \"ink\";\nimport React, { useState } from \"react\";\nimport { defaultConfigPath, isPlausibleKey, redactKey, saveApiKey } from \"../../config.js\";\nimport { MaskedInput } from \"./MaskedInput.js\";\nimport { COLOR, GLYPH, GRADIENT } from \"./theme.js\";\n\nexport interface SetupProps {\n onReady: (apiKey: string) => void;\n}\n\nexport function Setup({ onReady }: SetupProps) {\n const [value, setValue] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const { exit } = useApp();\n\n const handleSubmit = (raw: string) => {\n const trimmed = raw.trim();\n if (trimmed === \"/exit\" || trimmed === \"/quit\") {\n exit();\n return;\n }\n if (!isPlausibleKey(trimmed)) {\n setError(\"Doesn't look like a DeepSeek key. They start with 'sk-' and are 30+ chars.\");\n setValue(\"\");\n return;\n }\n try {\n saveApiKey(trimmed);\n } catch (err) {\n setError(`Could not save key: ${(err as Error).message}`);\n return;\n }\n onReady(trimmed);\n };\n\n return (\n <Box flexDirection=\"column\" paddingX={1} marginY={1}>\n <Box>\n <Text bold color={GRADIENT[0]}>\n {GLYPH.brand}\n </Text>\n <Text>{\" \"}</Text>\n <Text bold>Welcome to </Text>\n <Text bold color={GRADIENT[2]}>\n REASONIX\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color={COLOR.info}>Paste your DeepSeek API key to get started.</Text>\n </Box>\n <Box>\n <Text dimColor>{\" sign up at · \"}</Text>\n <Text color={COLOR.primary}>https://platform.deepseek.com/api_keys</Text>\n </Box>\n <Box>\n <Text dimColor>{\" saved to \"}</Text>\n <Text dimColor>{defaultConfigPath()}</Text>\n </Box>\n <Box marginTop={1}>\n <Text bold color={COLOR.brand}>\n {GLYPH.bar}\n </Text>\n <Text bold color={COLOR.primary}>\n {\" › \"}\n </Text>\n <MaskedInput\n value={value}\n onChange={setValue}\n onSubmit={handleSubmit}\n mask=\"•\"\n placeholder=\"sk-...\"\n />\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color={COLOR.err} bold>\n {GLYPH.err}\n </Text>\n <Text color={COLOR.err}>{` ${error}`}</Text>\n </Box>\n ) : value ? (\n <Box marginTop={1}>\n <Text dimColor>{` preview · ${redactKey(value)}`}</Text>\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text dimColor>{\" /exit to abort\"}</Text>\n </Box>\n </Box>\n );\n}\n","import { Text, useInput } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { useRef } from \"react\";\nimport { FG } from \"./theme/tokens.js\";\n\nexport interface MaskedInputProps {\n value: string;\n onChange: (next: string) => void;\n onSubmit: (final: string) => void;\n mask?: string;\n placeholder?: string;\n}\n\n/** Windows ConPTY splits bracketed-paste wrappers across stdin chunks; Ink's parser sees them as printable `[`, `2`, `0`, `0`, `~` and they leak into the buffer. Strip them at the input boundary and again at submit. */\nfunction stripPasteMarkers(s: string): string {\n // biome-ignore lint/suspicious/noControlCharactersInRegex: ESC (0x1b) is exactly what we're stripping — bracketed-paste wrappers and stray escape bytes leaked from Ink's parser.\n return s.replace(/\\u001b?\\[20[01]~/g, \"\").replace(/\\u001b/g, \"\");\n}\n\nexport function MaskedInput({\n value,\n onChange,\n onSubmit,\n mask = \"•\",\n placeholder = \"\",\n}: MaskedInputProps): React.ReactElement {\n const valueRef = useRef(value);\n valueRef.current = value;\n\n useInput((input, key) => {\n if (key.return) {\n onSubmit(stripPasteMarkers(valueRef.current));\n return;\n }\n if (key.backspace || key.delete) {\n if (valueRef.current.length === 0) return;\n const next = valueRef.current.slice(0, -1);\n valueRef.current = next;\n onChange(next);\n return;\n }\n if (input && !key.ctrl && !key.meta && !key.escape) {\n const cleaned = stripPasteMarkers(input);\n if (cleaned.length === 0) return;\n const next = stripPasteMarkers(valueRef.current + cleaned);\n valueRef.current = next;\n onChange(next);\n }\n });\n\n if (value.length === 0) {\n if (placeholder.length === 0) {\n return <Text inverse> </Text>;\n }\n return (\n <>\n <Text inverse>{placeholder[0]}</Text>\n <Text color={FG.faint}>{placeholder.slice(1)}</Text>\n </>\n );\n }\n\n return (\n <>\n <Text>{mask.repeat(value.length)}</Text>\n <Text inverse> </Text>\n </>\n );\n}\n","/** stdin-queue drain on exit — eats stuck terminal-feature-detection responses (#365). */\n\nimport process from \"node:process\";\n\n/** Eats stuck OSC/CPR/DA replies on exit so fish/bash don't print them as input (#365). */\nexport async function drainTtyResponses(timeoutMs = 50): Promise<void> {\n const stdin = process.stdin;\n if (!stdin.isTTY && typeof (stdin as { setRawMode?: unknown }).setRawMode !== \"function\") {\n return;\n }\n let raised = false;\n try {\n stdin.setRawMode(true);\n raised = true;\n } catch {\n return;\n }\n stdin.resume();\n\n await new Promise<void>((resolve) => {\n const onData = (_chunk: Buffer | string): void => {\n // Discard — anything pending here is a terminal-feature reply.\n };\n stdin.on(\"data\", onData);\n const timer = setTimeout(() => {\n stdin.off(\"data\", onData);\n stdin.pause();\n if (raised) {\n try {\n stdin.setRawMode(false);\n } catch {\n /* stdin may already be closed; ignore */\n }\n }\n resolve();\n }, timeoutMs);\n timer.unref();\n });\n}\n"],"mappings":"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","names":["React","useState","resolve","Box","Text","useStdout","React","useCallback","useEffect","useMemo","useRef","useState","checkpoint","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","join","existsSync","mkdirSync","dirname","writeFileSync","readFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","t","skill","status","Box","Text","React","tag","React","Box","Text","React","Box","Text","useStdout","React","useStdout","React","Box","Text","useStdout","React","useEffect","useMemo","list","options","React","Box","Text","React","useMemo","useState","block","tag","rows","Box","Text","React","useState","useState","React","Box","Text","Box","Text","useStdout","React","useStdout","React","Box","row","Text","block","budget","useMemo","useState","tag","React","context","Text","Box","Box","Text","React","useState","Box","Text","React","useState","t","t","useState","React","Box","Text","Box","Text","React","useEffect","useMemo","useState","list","useState","useEffect","useMemo","React","Box","Text","tag","useState","t","React","Box","Text","Box","Text","useStdout","React","useState","Text","React","model","PAGE_MARGIN","useState","useStdout","React","Box","Text","row","model","Box","React","Box","Text","React","Box","Text","React","React","Box","Text","status","React","Box","Text","React","Box","Box","Text","React","Box","Text","React","escape","html","row","link","lexer","options","list","t","tag","text","parser","tokens","args","hooks","ret","walkTokens","parse","src","inline","t","React","Box","Text","plan","React","Box","Text","Box","Text","React","useState","React","createContext","useContext","useState","createContext","React","useContext","useState","mode","useState","React","Box","Text","Box","Text","React","React","Box","Text","row","Box","Text","React","useState","useState","React","row","Text","Box","Box","Text","useStdout","React","useState","budget","useState","useStdout","React","Box","Text","budget","compact","Box","Text","useStdout","React","useMemo","useState","PAGE_MARGIN","sessions","useState","useStdout","useMemo","target","React","Box","Text","relativeTime","Box","Text","React","useState","useState","React","context","Box","Text","Box","Text","React","React","Box","Text","Box","Text","React","React","Box","Text","Box","Text","React","React","Box","Text","t","mkdirSync","homedir","dirname","join","body","join","homedir","bullet","mkdirSync","dirname","useMemo","model","useCallback","useEffect","useRef","useState","useCallback","useCallback","useCallback","useRef","useCallback","useEffect","useRef","useState","cur","useCallback","useEffect","useMemo","React","t","model","React","nextId","useMemo","model","useCallback","model","useCallback","Box","Text","React","useEffect","useRef","Box","Text","React","Box","Text","React","Box","React","useContext","Box","Text","React","useContext","useContext","React","Box","Text","React","Box","Text","t","Box","Text","React","React","Box","Text","Box","Text","React","React","Box","Text","Box","Text","React","React","Text","Box","Box","Text","React","Text","React","React","Text","React","Box","Text","Box","Text","React","React","Box","Text","Box","Text","React","React","Box","Text","Box","Text","useStdout","React","Text","React","React","Text","useStdout","React","Box","Text","Box","Text","React","stats","React","Box","Text","list","Box","Text","useStdout","React","useContext","createContext","Box","Text","useStdout","React","React","useStdout","Box","CodeBlock","Text","row","FILE_REF_RE","t","STREAMING_PREVIEW_LINES","useStdout","useContext","React","Text","Box","Box","Text","React","useContext","useContext","headerMeta","React","Text","Box","Box","Text","React","React","Box","Text","Box","Text","React","stringWidth","stringWidth","React","Box","Text","row","Text","useStdout","React","useStdout","status","React","statusGlyph","Text","keys","Box","Text","React","BAR_CELLS","React","Text","headerMeta","Box","React","React","Text","React","React","Text","React","CardRenderer","Box","Text","useRef","useEffect","React","Text","Box","Box","Text","React","React","Box","Text","jobs","truncate","React","Text","Box","bar","Box","Text","useStdout","React","Text","React","React","Text","status","useStdout","React","Box","Text","ModePill","mode","Box","Text","useStdout","React","useEffect","useStdout","useEffect","t","React","Box","Text","React","React","loop","block","server","formatBytes","loop","lines","list","loop","status","handlers","handlers","compactNum","commit","walk","tag","handlers","existsSync","existsSync","handlers","status","handlers","handlers","loop","lines","list","t","handlers","tag","handlers","loop","apply","spent","handlers","Box","Text","React","loop","loop","compactNum","cost","tag","handlers","mode","handlers","loop","handlers","handlers","name","lines","found","handlers","handlers","handlers","loop","handlers","loop","model","stats","body","tag","seq","useCallback","useEffect","useMemo","useReducer","useRef","useState","useState","useMemo","useEffect","useRef","useCallback","list","useReducer","useCallback","useRef","useState","useRef","useState","useCallback","remaining","entry","status","files","when","header","countLines","useCallback","useEffect","useState","loop","useState","useEffect","list","useCallback","useEffect","useRef","useState","useState","useRef","useEffect","loop","React","t","Box","Text","model","useState","useEffect","useRef","useStdout","useCallback","preset","useMemo","skill","summary","resolve","block","context","plan","text","tag","cost","Box","Text","React","useState","Text","React","useRef","useRef","React","Text","useState","exit","React","Box","Text","process","resolve","loop","mcp","useState","sessions","React"]}