flavor-code 1.2.3 → 1.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +208 -931
  2. package/dist/{app-SCHNJSXI.js → app-N3655H2E.js} +6 -7
  3. package/dist/{chunk-MVIMQEQT.js → chunk-HFR2WS6T.js} +0 -1
  4. package/dist/{chunk-DM64TM4Z.js → chunk-KKIBYDJI.js} +0 -1
  5. package/dist/{chunk-AHUOGT4I.js → chunk-L5A2NDMT.js} +1 -2
  6. package/dist/{chunk-XGCFBGBB.js → chunk-MRISY6KK.js} +10 -10
  7. package/dist/{chunk-VOCZVFP7.js → chunk-N2S7USST.js} +0 -1
  8. package/dist/{chunk-XS2JU6S3.js → chunk-NVLYFU6P.js} +3 -4
  9. package/dist/{chunk-JZ322RCJ.js → chunk-S32JRDZK.js} +0 -1
  10. package/dist/{claude-ink-ZL4UZMFY.js → claude-ink-WPWPEL5A.js} +3 -4
  11. package/dist/cli.js +9 -10
  12. package/dist/desktop/main.js +8 -8
  13. package/dist/desktop/preload.cjs +0 -1
  14. package/dist/desktop-renderer/assets/index-C66pDvHs.js +1 -2
  15. package/dist/desktop-renderer/index.html +14 -14
  16. package/dist/{devtools-SXJBSV2N.js → devtools-4QTPKBKK.js} +0 -1
  17. package/dist/{load-WQGNTCHC.js → load-XC5JYYBQ.js} +2 -3
  18. package/dist/sdk/index.js +5 -6
  19. package/package.json +6 -1
  20. package//346/212/200/346/234/257/346/226/271/346/241/210/346/212/245/345/221/212.md +1 -1
  21. package/dist/app-SCHNJSXI.js.map +0 -1
  22. package/dist/chunk-AHUOGT4I.js.map +0 -1
  23. package/dist/chunk-DM64TM4Z.js.map +0 -1
  24. package/dist/chunk-JZ322RCJ.js.map +0 -1
  25. package/dist/chunk-MVIMQEQT.js.map +0 -1
  26. package/dist/chunk-VOCZVFP7.js.map +0 -1
  27. package/dist/chunk-XGCFBGBB.js.map +0 -1
  28. package/dist/chunk-XS2JU6S3.js.map +0 -1
  29. package/dist/claude-ink-ZL4UZMFY.js.map +0 -1
  30. package/dist/cli.js.map +0 -1
  31. package/dist/desktop/main.js.map +0 -1
  32. package/dist/desktop/preload.cjs.map +0 -1
  33. package/dist/desktop-renderer/assets/index-C66pDvHs.js.map +0 -1
  34. package/dist/devtools-SXJBSV2N.js.map +0 -1
  35. package/dist/load-WQGNTCHC.js.map +0 -1
  36. package/dist/sdk/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ui/app.tsx","../src/claude-ink/hooks/use-animation-frame.ts","../src/claude-ink/hooks/use-terminal-viewport.ts","../src/claude-ink/hooks/use-selection.ts","../src/claude-ink/hooks/use-terminal-title.ts","../src/ui/assistant-text.tsx","../src/ui/markdown.tsx","../src/ui/highlight.ts","../src/ui/char-width.ts","../src/ui/signals.ts","../src/ui/wrap-prompt.ts","../src/ui/task-progress.tsx","../src/ui/file-diff-style.ts","../src/ui/slash-completion.ts","../src/ui/compact-progress.ts","../src/ui/mention-completion.ts","../src/ui/welcome.tsx","../src/session/assets.ts","../src/ui/clipboard-image.ts"],"sourcesContent":["import { basename } from \"node:path\";\r\nimport React, { useEffect, useReducer, useRef, useState } from \"react\";\r\nimport {\r\n Box,\r\n ScrollBox,\r\n Text,\r\n useApp,\r\n useInput,\r\n useStdout,\r\n type Key,\r\n type ScrollBoxHandle,\r\n} from \"../claude-ink/index.js\";\r\nimport { useAnimationFrame } from \"../claude-ink/hooks/use-animation-frame.js\";\r\nimport { useHasSelection, useSelection } from \"../claude-ink/hooks/use-selection.js\";\r\nimport { useTerminalTitle } from \"../claude-ink/hooks/use-terminal-title.js\";\r\nimport type { ClickEvent } from \"../claude-ink/events/click-event.js\";\r\n\r\nimport { createProductionRuntime, type ProductionRuntime } from \"../production.js\";\r\nimport { isDestructiveTool } from \"../permissions/engine.js\";\r\nimport { AssistantText } from \"./assistant-text.js\";\r\nimport type { SessionOutput } from \"./session.js\";\r\nimport type { Question } from \"../tools/ask-user-question.js\";\r\nimport type { MemoryReviewItem } from \"../memory/review.js\";\r\nimport { createSessionInterruptHandler, installSigintHandler } from \"./signals.js\";\r\nimport {\r\n createTranscriptState,\r\n transcriptReducer,\r\n type TranscriptBlock,\r\n type TranscriptTurn,\r\n} from \"./transcript.js\";\r\nimport { wrapPromptInput } from \"./wrap-prompt.js\";\r\nimport { charWidth } from \"./char-width.js\";\r\nimport { TaskProgressPanel, TaskStatusLine } from \"./task-progress.js\";\r\nimport type { FileChangePresentation, FileDiffLine } from \"../tools/types.js\";\r\nimport { fileDiffLineStyle } from \"./file-diff-style.js\";\r\nimport { COMMAND_DESCRIPTIONS, MVP_COMMANDS } from \"./commands.js\";\r\nimport {\r\n buildSlashCandidates,\r\n completeSlashSelection,\r\n completedSlashTokenLength,\r\n completedSlashTokenPresentation,\r\n deriveSlashCompletion,\r\n matchRanges,\r\n moveSlashSelection,\r\n slashCandidatePresentation,\r\n type SlashCandidate,\r\n type SlashCompletion,\r\n} from \"./slash-completion.js\";\r\nimport { message } from \"../utils/error.js\";\r\nimport { redactErrorText } from \"../utils/redact.js\";\r\nimport { compactProgressPresentation } from \"./compact-progress.js\";\r\nimport { createGlobTool, type SearchResult } from \"../tools/search.js\";\r\nimport {\r\n buildMentionCandidates,\r\n completeMentionSelection,\r\n deriveMentionCompletion,\r\n mentionCandidatePresentation,\r\n moveMentionSelection,\r\n type MentionCompletion,\r\n} from \"./mention-completion.js\";\r\nimport { WelcomeCard } from \"./welcome.js\";\r\nimport {\r\n DEFAULT_MAX_IMAGES,\r\n DEFAULT_MAX_TOTAL_IMAGE_BYTES,\r\n SessionAssetStore,\r\n} from \"../session/assets.js\";\r\nimport {\r\n modelContentTranscriptText,\r\n type ModelContentBlock,\r\n type ModelImageContentBlock,\r\n} from \"../models/types.js\";\r\nimport {\r\n readClipboardImage,\r\n shouldReadClipboardImage,\r\n} from \"./clipboard-image.js\";\r\nimport type { IdeEditorContext } from \"../ide/client.js\";\r\n\r\nexport const HISTORY_CAP = 200;\r\nconst BUILTIN_SLASH_CANDIDATES = MVP_COMMANDS.map((name) => ({ name, description: COMMAND_DESCRIPTIONS[name] }));\r\nconst PROMPT_HORIZONTAL_PADDING = 1;\r\n\r\nexport interface PastedBlock {\r\n id: number;\r\n text: string;\r\n}\r\n\r\nexport function removeLastCliImageOnBackspace(\r\n input: string,\r\n cursor: number,\r\n images: readonly ModelImageContentBlock[],\r\n): { handled: boolean; images: ModelImageContentBlock[] } {\r\n if (input.length === 0 && cursor === 0 && images.length > 0) {\r\n return { handled: true, images: images.slice(0, -1) };\r\n }\r\n return { handled: false, images: [...images] };\r\n}\r\n\r\nexport type CliSubmissionPreparation =\r\n | { kind: \"empty\" }\r\n | { kind: \"error\"; message: string }\r\n | {\r\n kind: \"ready\";\r\n text: string;\r\n displayText: string;\r\n content?: ModelContentBlock[];\r\n };\r\n\r\nexport function prepareCliSubmission(\r\n input: string,\r\n images: readonly ModelImageContentBlock[],\r\n activeSession: boolean,\r\n): CliSubmissionPreparation {\r\n const entered = input.trim();\r\n if (entered.length === 0 && images.length === 0) return { kind: \"empty\" };\r\n if (images.length > 0 && entered.startsWith(\"/\")) {\r\n return { kind: \"error\", message: \"Image attachments cannot be used with slash commands.\" };\r\n }\r\n if (images.length > 0 && activeSession) {\r\n return { kind: \"error\", message: \"Images can only be attached to a new prompt.\" };\r\n }\r\n\r\n const text = entered || \"Analyze the attached image(s).\";\r\n if (images.length === 0) return { kind: \"ready\", text, displayText: text };\r\n const content: ModelContentBlock[] = [{ type: \"text\", text }, ...images];\r\n return {\r\n kind: \"ready\",\r\n text,\r\n displayText: modelContentTranscriptText(content),\r\n content,\r\n };\r\n}\r\n\r\nexport type TerminalInputAction =\r\n | { type: \"scroll\"; rows: number }\r\n | { type: \"page\"; fraction: number }\r\n | { type: \"history\"; direction: \"up\" | \"down\" };\r\n\r\nexport type PromptDelivery = \"prompt\" | \"steer\" | \"followUp\";\r\n\r\nexport function promptDelivery(\r\n activeSession: boolean,\r\n key: Pick<Key, \"meta\">,\r\n): PromptDelivery {\r\n if (!activeSession) return \"prompt\";\r\n return \"followUp\";\r\n}\r\n\r\nexport function resolvePromptDelivery(\r\n activeSession: boolean,\r\n key: Pick<Key, \"meta\">,\r\n input: string,\r\n): { delivery: PromptDelivery; prompt: string } {\r\n if (activeSession) {\r\n const followUp = input.match(/^\\/follow-?up\\s+([\\s\\S]+)$/iu);\r\n if (followUp !== null) return { delivery: \"followUp\", prompt: followUp[1]!.trim() };\r\n const steer = input.match(/^\\/steer\\s+([\\s\\S]+)$/iu);\r\n if (steer !== null) return { delivery: \"steer\", prompt: steer[1]!.trim() };\r\n }\r\n return { delivery: promptDelivery(activeSession, key), prompt: input };\r\n}\r\n\r\nexport class SinglePendingPrompt {\r\n #value: string | undefined;\r\n\r\n get value(): string | undefined { return this.#value; }\r\n\r\n queue(prompt: string): boolean {\r\n const value = prompt.trim();\r\n if (value.length === 0 || this.#value !== undefined) return false;\r\n this.#value = value;\r\n return true;\r\n }\r\n\r\n cancel(): string | undefined {\r\n const value = this.#value;\r\n this.#value = undefined;\r\n return value;\r\n }\r\n\r\n take(): string | undefined { return this.cancel(); }\r\n}\r\n\r\nexport async function runTerminalSubmissionChain(options: {\r\n session: { submit(prompt: string): Promise<void> };\r\n initialPrompt: string;\r\n initialDisplayPrompt?: string;\r\n initialSubmit?(prompt: string): Promise<void>;\r\n pending: SinglePendingPrompt;\r\n onStart(prompt: string): void;\r\n onFinish(): void;\r\n onPendingConsumed(): void;\r\n report(message: string): void;\r\n shouldContinue?(): boolean;\r\n}): Promise<void> {\r\n let prompt: string | undefined = options.initialPrompt;\r\n let initial = true;\r\n while (prompt !== undefined) {\r\n options.onStart(initial ? options.initialDisplayPrompt ?? prompt : prompt);\r\n if (initial && options.initialSubmit !== undefined) {\r\n try { await options.initialSubmit(prompt); }\r\n catch (error) { safeReport(options.report, safeUiError(error)); }\r\n } else {\r\n await submitSafely(options.session, prompt, options.report);\r\n }\r\n options.onFinish();\r\n if (options.shouldContinue?.() === false) return;\r\n prompt = options.pending.take();\r\n if (prompt !== undefined) options.onPendingConsumed();\r\n initial = false;\r\n }\r\n}\r\n\r\nexport function classifyTerminalInput(key: Pick<Key, \"wheelUp\" | \"wheelDown\" | \"pageUp\" | \"pageDown\" | \"upArrow\" | \"downArrow\">): TerminalInputAction | null {\r\n if (key.wheelUp) return { type: \"scroll\", rows: -3 };\r\n if (key.wheelDown) return { type: \"scroll\", rows: 3 };\r\n if (key.pageUp) return { type: \"page\", fraction: -0.5 };\r\n if (key.pageDown) return { type: \"page\", fraction: 0.5 };\r\n if (key.upArrow) return { type: \"history\", direction: \"up\" };\r\n if (key.downArrow) return { type: \"history\", direction: \"down\" };\r\n return null;\r\n}\r\n\r\nexport type CompletionKeyAction =\r\n | { type: \"select\"; delta: -1 | 1 }\r\n | { type: \"complete\" }\r\n | { type: \"dismiss\" };\r\n\r\nexport type SlashKeyAction = CompletionKeyAction;\r\n\r\nexport function completionKeyAction(\r\n key: Pick<Key, \"upArrow\" | \"downArrow\" | \"tab\" | \"escape\">,\r\n menuOpen: boolean,\r\n): CompletionKeyAction | null {\r\n if (!menuOpen) return null;\r\n if (key.upArrow) return { type: \"select\", delta: -1 };\r\n if (key.downArrow) return { type: \"select\", delta: 1 };\r\n if (key.tab) return { type: \"complete\" };\r\n if (key.escape) return { type: \"dismiss\" };\r\n return null;\r\n}\r\n\r\nexport function slashKeyAction(\r\n key: Pick<Key, \"upArrow\" | \"downArrow\" | \"tab\" | \"escape\">,\r\n completion: SlashCompletion | null,\r\n): SlashKeyAction | null {\r\n return completionKeyAction(key, completion !== null);\r\n}\r\n\r\nexport interface FlavorAppProps { workspace: string; home?: string; resumeSession?: string | true }\r\n\r\nexport function App({ workspace, home, resumeSession }: FlavorAppProps): React.JSX.Element {\r\n const { exit } = useApp();\r\n const { stdout } = useStdout();\r\n const [runtime, setRuntime] = useState<ProductionRuntime>();\r\n const [input, setInput] = useState(\"\");\r\n const [pastedBlocks, setPastedBlocks] = useState<PastedBlock[]>([]);\r\n const [imageAttachments, setImageAttachments] = useState<ModelImageContentBlock[]>([]);\r\n const [clipboardNotice, setClipboardNotice] = useState<string>();\r\n const [history, setHistory] = useState<string[]>([]);\r\n const [historyCursor, setHistoryCursor] = useState(0);\r\n const [promptCursor, setPromptCursor] = useState(0);\r\n const [slashCandidates, setSlashCandidates] = useState<SlashCandidate[]>(\r\n () => buildSlashCandidates(BUILTIN_SLASH_CANDIDATES, [], []),\r\n );\r\n const [slashSelection, setSlashSelection] = useState(0);\r\n const [dismissedSlashInput, setDismissedSlashInput] = useState<string>();\r\n const [mentionCandidates, setMentionCandidates] = useState<string[]>([]);\r\n const [mentionSelection, setMentionSelection] = useState(0);\r\n const [dismissedMentionInput, setDismissedMentionInput] = useState<string>();\r\n const [pendingPrompt, setPendingPrompt] = useState<string>();\r\n const [revision, setRevision] = useState(0);\r\n const [ideContext, setIdeContext] = useState<IdeEditorContext>();\r\n const [questionIndex, setQuestionIndex] = useState(0);\r\n const [questionAnswers, setQuestionAnswers] = useState<Record<number, string>>({});\r\n const [customQuestionActive, setCustomQuestionActive] = useState(false);\r\n const [columns, setColumns] = useState(stdout?.columns ?? 80);\r\n const [rows, setRows] = useState(stdout?.rows ?? 24);\r\n const [transcript, dispatch] = useReducer(transcriptReducer, undefined, createTranscriptState);\r\n const scrollRef = useRef<ScrollBoxHandle>(null);\r\n const taskScrollRef = useRef<ScrollBoxHandle>(null);\r\n const taskPanelHovered = useRef(false);\r\n const runtimeRef = useRef<ProductionRuntime | undefined>(undefined);\r\n const pendingPromptRef = useRef<SinglePendingPrompt | undefined>(undefined);\r\n pendingPromptRef.current ??= new SinglePendingPrompt();\r\n const closing = useRef(false);\r\n const clipboardBusy = useRef(false);\r\n const textBuf = useRef<{ pending: string; timer: ReturnType<typeof setTimeout> | null }>({ pending: \"\", timer: null });\r\n\r\n useTerminalTitle(\"Flavor Code\");\r\n\r\n const flushText = (): void => {\r\n const t = textBuf.current;\r\n if (t.timer !== null) { clearTimeout(t.timer); t.timer = null; }\r\n if (t.pending.length > 0) {\r\n dispatch({ type: \"session\", event: { type: \"text\", text: t.pending } });\r\n t.pending = \"\";\r\n }\r\n };\r\n\r\n const shutdown = async (active: ProductionRuntime | undefined) => {\r\n if (closing.current) return;\r\n closing.current = true;\r\n await shutdownRuntime(active, exit, (error) => {\r\n dispatch({ type: \"submit-error\", message: error });\r\n });\r\n };\r\n const shutdownRef = useRef(shutdown);\r\n shutdownRef.current = shutdown;\r\n const interruptRef = useRef<(() => void) | undefined>(undefined);\r\n interruptRef.current ??= createSessionInterruptHandler(\r\n () => runtimeRef.current?.session,\r\n () => shutdownRef.current(runtimeRef.current),\r\n );\r\n const interrupt = interruptRef.current;\r\n\r\n useEffect(() => {\r\n let disposed = false;\r\n const FLUSH_MS = 100;\r\n const receive = (event: SessionOutput): void => {\r\n if (event.type === \"exit\") {\r\n flushText();\r\n void shutdownRef.current(runtimeRef.current);\r\n return;\r\n }\r\n if (event.type === \"clear\") {\r\n flushText();\r\n dispatch({ type: \"clear\" });\r\n return;\r\n }\r\n if (event.type === \"text\") {\r\n const t = textBuf.current;\r\n t.pending += event.text;\r\n if (t.timer === null) t.timer = setTimeout(flushText, FLUSH_MS);\r\n return;\r\n }\r\n flushText();\r\n dispatch({ type: \"session\", event });\r\n };\r\n void createProductionRuntime({\r\n workspace,\r\n ...(home === undefined ? {} : { home }),\r\n ...(resumeSession === undefined ? {} : { resumeSession }),\r\n output: receive,\r\n onApprovalChange: () => setRevision((value) => value + 1),\r\n }).then(async (created) => {\r\n if (disposed) { await created.dispose(); return; }\r\n dispatch({ type: \"restore\", state: created.restoredTranscript });\r\n runtimeRef.current = created;\r\n setSlashCandidates(buildSlashCandidates(BUILTIN_SLASH_CANDIDATES, created.services.pluginCommands(), []));\r\n setRuntime(created);\r\n await created.session.start();\r\n try {\r\n const skills = await created.services.skills();\r\n if (!disposed) {\r\n setSlashCandidates(buildSlashCandidates(BUILTIN_SLASH_CANDIDATES, created.services.pluginCommands(), skills));\r\n }\r\n } catch {\r\n // Invalid skill files are reported by runtime diagnostics; static candidates remain usable.\r\n }\r\n }).catch((error: unknown) => {\r\n dispatch({ type: \"submit\", prompt: \"startup\" });\r\n dispatch({ type: \"submit-error\", message: safeUiError(error) });\r\n });\r\n return () => {\r\n disposed = true;\r\n flushText();\r\n void closeAndDisposeRuntime(runtimeRef.current, (error) => process.stderr.write(`flavor cleanup: ${error}\\n`));\r\n };\r\n }, [workspace, home, resumeSession]);\r\n\r\n useEffect(() => installSigintHandler(process, interrupt), [interrupt]);\r\n\r\n useEffect(() => {\r\n if (runtime?.services.ideContext === undefined) {\r\n setIdeContext(undefined);\r\n return;\r\n }\r\n let disposed = false;\r\n let refreshing = false;\r\n let previous = \"\";\r\n const refresh = async (): Promise<void> => {\r\n if (refreshing) return;\r\n refreshing = true;\r\n try {\r\n const next = await runtime.services.ideContext!().catch(() => undefined);\r\n if (disposed) return;\r\n const serialized = JSON.stringify(next);\r\n if (serialized !== previous) {\r\n previous = serialized;\r\n setIdeContext(next);\r\n }\r\n } finally {\r\n refreshing = false;\r\n }\r\n };\r\n void refresh();\r\n const timer = setInterval(() => void refresh(), 400);\r\n return () => {\r\n disposed = true;\r\n clearInterval(timer);\r\n };\r\n }, [runtime]);\r\n\r\n useEffect(() => {\r\n const controller = new AbortController();\r\n let disposed = false;\r\n void createGlobTool(workspace, { defaultLimit: 10_000 })\r\n .execute({ pattern: \"**\", limit: 10_000 }, controller.signal)\r\n .then((result) => {\r\n if (!disposed) {\r\n setMentionCandidates(buildMentionCandidates((result as SearchResult<string>).matches));\r\n }\r\n })\r\n .catch(() => {\r\n // File completion is optional; discovery failure must not block prompt input.\r\n });\r\n return () => {\r\n disposed = true;\r\n controller.abort();\r\n };\r\n }, [workspace]);\r\n\r\n useEffect(() => {\r\n if (!stdout || typeof stdout.on !== \"function\") return;\r\n const onResize = (): void => {\r\n setColumns(stdout.columns ?? 80);\r\n setRows(stdout.rows ?? 24);\r\n };\r\n stdout.on(\"resize\", onResize);\r\n onResize();\r\n return (): void => { stdout.off(\"resize\", onResize); };\r\n }, [stdout]);\r\n\r\n const approval = runtime?.approvals.pending;\r\n const questions = runtime?.services.questions.pending;\r\n const memoryReviews = runtime?.memoryReviews.pending ?? [];\r\n const memoryAutoDismissSeconds = runtime?.memoryReviews.autoDismissSeconds ?? 0;\r\n useEffect(() => {\r\n setQuestionIndex(0);\r\n setQuestionAnswers({});\r\n setCustomQuestionActive(false);\r\n }, [questions]);\r\n const derivedSlashCompletion = deriveSlashCompletion(input, promptCursor, slashCandidates, slashSelection);\r\n const slashCompletion = dismissedSlashInput === input || transcript.active !== undefined || approval !== undefined || questions !== undefined\r\n ? null\r\n : derivedSlashCompletion;\r\n const derivedMentionCompletion = slashCompletion === null\r\n ? deriveMentionCompletion(input, promptCursor, mentionCandidates, mentionSelection)\r\n : null;\r\n const mentionCompletion = dismissedMentionInput === input || transcript.active !== undefined || approval !== undefined || questions !== undefined\r\n ? null\r\n : derivedMentionCompletion;\r\n const completedTokenLength = completedSlashTokenLength(input, slashCandidates, slashCompletion !== null);\r\n const selection = useSelection();\r\n\r\n const selectMention = (path: string): void => {\r\n const next = completeMentionSelection(input, promptCursor, path);\r\n setInput(next.text);\r\n setPromptCursor(next.cursor);\r\n setMentionSelection(0);\r\n setDismissedMentionInput(next.text);\r\n };\r\n\r\n const pasteClipboardImage = async (): Promise<void> => {\r\n const active = runtimeRef.current;\r\n if (active === undefined) {\r\n setClipboardNotice(\"Flavor is still starting; try pasting the image again.\");\r\n return;\r\n }\r\n if (transcript.active !== undefined) {\r\n setClipboardNotice(\"Images can only be attached to a new prompt.\");\r\n return;\r\n }\r\n if (imageAttachments.length >= DEFAULT_MAX_IMAGES) {\r\n setClipboardNotice(`A prompt can contain at most ${DEFAULT_MAX_IMAGES} images.`);\r\n return;\r\n }\r\n if (clipboardBusy.current) return;\r\n\r\n clipboardBusy.current = true;\r\n setClipboardNotice(\"Reading image from clipboard...\");\r\n try {\r\n const attachment = await readClipboardImage();\r\n if (attachment === undefined) {\r\n setClipboardNotice(\"Clipboard does not contain an image.\");\r\n return;\r\n }\r\n const incomingBytes = Buffer.byteLength(attachment.dataBase64, \"base64\");\r\n const currentBytes = imageAttachments.reduce((sum, image) => sum + image.bytes, 0);\r\n if (currentBytes + incomingBytes > DEFAULT_MAX_TOTAL_IMAGE_BYTES) {\r\n throw new Error(`Image attachments exceed the maximum total size of ${DEFAULT_MAX_TOTAL_IMAGE_BYTES} bytes`);\r\n }\r\n const [stored] = await new SessionAssetStore({ workspace }).store(active.sessionId, [attachment]);\r\n if (stored === undefined) throw new Error(\"Clipboard image could not be stored\");\r\n setImageAttachments((current) => [...current, stored]);\r\n setClipboardNotice(`Added [Image #${imageAttachments.length + 1}] ${stored.name ?? basename(stored.source.path)}`);\r\n } catch (error) {\r\n setClipboardNotice(safeUiError(error));\r\n } finally {\r\n clipboardBusy.current = false;\r\n }\r\n };\r\n\r\n useInput((character, key, event) => {\r\n const terminalAction = classifyTerminalInput(key);\r\n if (terminalAction?.type === \"scroll\") {\r\n const scroll = selectWheelScrollTarget(scrollRef.current, taskScrollRef.current, taskPanelHovered.current);\r\n if (scroll !== null) {\r\n if (terminalAction.rows < 0) scrollUp(scroll, -terminalAction.rows);\r\n else scrollDown(scroll, terminalAction.rows);\r\n }\r\n return;\r\n }\r\n if (terminalAction?.type === \"page\") {\r\n const scroll = scrollRef.current;\r\n if (scroll !== null) jumpScroll(scroll, Math.floor(scroll.getViewportHeight() * terminalAction.fraction));\r\n return;\r\n }\r\n\r\n const active = runtimeRef.current;\r\n if (key.ctrl && character === \"c\") {\r\n if (selection.hasSelection()) { selection.copySelection(); }\r\n else { interrupt(); }\r\n return;\r\n }\r\n if (shouldReadClipboardImage(character, key, event.keypress.isPasted)) {\r\n void pasteClipboardImage();\r\n return;\r\n }\r\n if (active?.approvals.pending !== undefined) {\r\n if (character.toLowerCase() === \"y\") active.approvals.resolve(\"once\");\r\n if (character.toLowerCase() === \"n\" || key.escape) active.approvals.resolve(\"deny\");\r\n if (character.toLowerCase() === \"a\") {\r\n if (isDestructiveTool(active.approvals.pending.tool)) {\r\n active.approvals.resolve(\"once\");\r\n } else {\r\n active.approvals.resolve(\"always\");\r\n }\r\n }\r\n return;\r\n }\r\n const pendingMemory = active?.memoryReviews.pending[0];\r\n if (pendingMemory !== undefined && key.ctrl && (character.toLowerCase() === \"y\" || character.toLowerCase() === \"n\")) {\r\n if (character.toLowerCase() === \"y\") {\r\n void active!.memoryReviews.accept(pendingMemory.id).catch((error) => {\r\n dispatch({ type: \"submit-error\", message: safeUiError(error) });\r\n });\r\n } else active!.memoryReviews.dismiss(pendingMemory.id);\r\n return;\r\n }\r\n const qs = active?.services.questions.pending;\r\n if (qs !== undefined && qs.length > 0) {\r\n const questionsService = active!.services.questions;\r\n const currentIndex = Math.min(questionIndex, qs.length - 1);\r\n const question = qs[currentIndex]!;\r\n const commitQuestionAnswer = (answer: string): void => {\r\n const next = { ...questionAnswers, [currentIndex]: answer };\r\n setInput(\"\"); setPromptCursor(0); setCustomQuestionActive(false);\r\n if (currentIndex === qs.length - 1) {\r\n setQuestionAnswers({}); setQuestionIndex(0);\r\n questionsService.answer(next);\r\n } else {\r\n setQuestionAnswers(next); setQuestionIndex(currentIndex + 1);\r\n }\r\n };\r\n if (key.escape) {\r\n if (customQuestionActive) {\r\n setCustomQuestionActive(false); setInput(\"\"); setPromptCursor(0);\r\n } else questionsService.cancel();\r\n return;\r\n }\r\n if (customQuestionActive) {\r\n if (key.return) {\r\n const answer = input.trim();\r\n if (answer) commitQuestionAnswer(answer);\r\n return;\r\n }\r\n // Let the ordinary prompt editor below collect the custom answer.\r\n } else {\r\n const digit = parseInt(character, 10);\r\n if (digit >= 1 && digit <= question.options.length) {\r\n commitQuestionAnswer(question.options[digit - 1]!.label);\r\n return;\r\n }\r\n if (digit === question.options.length + 1) {\r\n setCustomQuestionActive(true); setInput(\"\"); setPromptCursor(0);\r\n return;\r\n }\r\n if (!key.ctrl && !key.meta && character) setCustomQuestionActive(true);\r\n else return;\r\n }\r\n }\r\n if (key.escape && transcript.active !== undefined) {\r\n const restored = pendingPromptRef.current!.cancel();\r\n if (restored !== undefined) {\r\n setPendingPrompt(undefined);\r\n setInput(restored);\r\n setPastedBlocks([]);\r\n setPromptCursor([...restored].length);\r\n setSlashSelection(0);\r\n setDismissedSlashInput(undefined);\r\n setMentionSelection(0);\r\n setDismissedMentionInput(undefined);\r\n return;\r\n }\r\n }\r\n const menuAction = slashKeyAction(key, slashCompletion);\r\n if (menuAction?.type === \"select\" && slashCompletion !== null) {\r\n setSlashSelection((value) => moveSlashSelection(value, menuAction.delta, slashCompletion.items.length));\r\n return;\r\n }\r\n if (menuAction?.type === \"complete\" && slashCompletion !== null) {\r\n const selected = slashCompletion.items[slashCompletion.selectedIndex];\r\n if (selected !== undefined) {\r\n const next = completeSlashSelection(input, promptCursor, selected.name);\r\n setInput(next.text);\r\n setPromptCursor(next.cursor);\r\n setDismissedSlashInput(next.text);\r\n }\r\n return;\r\n }\r\n if (menuAction?.type === \"dismiss\") {\r\n setDismissedSlashInput(input);\r\n return;\r\n }\r\n const mentionAction = completionKeyAction(key, mentionCompletion !== null);\r\n if (mentionAction?.type === \"select\" && mentionCompletion !== null) {\r\n setMentionSelection((value) => moveMentionSelection(value, mentionAction.delta, mentionCompletion.items.length));\r\n return;\r\n }\r\n if (mentionAction?.type === \"complete\" && mentionCompletion !== null) {\r\n const selected = mentionCompletion.items[mentionCompletion.selectedIndex];\r\n if (selected !== undefined) selectMention(selected);\r\n return;\r\n }\r\n if (mentionAction?.type === \"dismiss\") {\r\n setDismissedMentionInput(input);\r\n return;\r\n }\r\n if (key.return) {\r\n const images = [...imageAttachments];\r\n const prepared = prepareCliSubmission(input, images, transcript.active !== undefined);\r\n if (prepared.kind === \"empty\" || active === undefined) return;\r\n if (prepared.kind === \"error\") {\r\n setClipboardNotice(prepared.message);\r\n return;\r\n }\r\n const submittedText = prepared.text;\r\n const { delivery, prompt } = resolvePromptDelivery(transcript.active !== undefined, key, submittedText);\r\n if (!prompt) return;\r\n if (delivery === \"followUp\" && transcript.active !== undefined) {\r\n if (!pendingPromptRef.current!.queue(prompt)) return;\r\n setPendingPrompt(prompt);\r\n }\r\n scrollRef.current?.scrollToBottom();\r\n setHistory((current) => [...current, submittedText].slice(-HISTORY_CAP));\r\n setHistoryCursor(history.length + 1);\r\n setInput(\"\");\r\n setPastedBlocks([]);\r\n setImageAttachments([]);\r\n setClipboardNotice(undefined);\r\n setPromptCursor(0);\r\n setSlashSelection(0);\r\n setDismissedSlashInput(undefined);\r\n setMentionSelection(0);\r\n setDismissedMentionInput(undefined);\r\n if (delivery === \"prompt\") {\r\n void runTerminalSubmissionChain({\r\n session: active.session,\r\n initialPrompt: prompt,\r\n ...(prepared.content === undefined ? {} : {\r\n initialDisplayPrompt: prepared.displayText,\r\n initialSubmit: (text: string) => active.session.submit({\r\n text,\r\n content: prepared.content!,\r\n }),\r\n }),\r\n pending: pendingPromptRef.current!,\r\n onStart: (next) => dispatch({ type: \"submit\", prompt: next }),\r\n onFinish: () => dispatch({ type: \"finish\" }),\r\n onPendingConsumed: () => setPendingPrompt(undefined),\r\n report: (error) => dispatch({ type: \"submit-error\", message: error }),\r\n shouldContinue: () => !closing.current,\r\n });\r\n } else if (delivery === \"steer\") {\r\n try {\r\n active.session.steer(prompt);\r\n } catch (error) {\r\n dispatch({ type: \"submit-error\", message: safeUiError(error) });\r\n }\r\n }\r\n return;\r\n }\r\n if (key.backspace) {\r\n const imageEdit = removeLastCliImageOnBackspace(input, promptCursor, imageAttachments);\r\n if (imageEdit.handled) {\r\n setImageAttachments(imageEdit.images);\r\n setClipboardNotice(imageEdit.images.length === 0\r\n ? \"Removed image attachment.\"\r\n : `Removed image attachment; ${imageEdit.images.length} remaining.`);\r\n return;\r\n }\r\n const next = editPromptWithPastedBlocks(\r\n { text: input, cursor: promptCursor },\r\n { type: \"backspace\" },\r\n pastedBlocks,\r\n );\r\n setInput(next.text);\r\n setPromptCursor(next.cursor);\r\n setPastedBlocks(next.pastedBlocks);\r\n setSlashSelection(0); setDismissedSlashInput(undefined);\r\n setMentionSelection(0); setDismissedMentionInput(undefined);\r\n } else if (key.delete) {\r\n updatePrompt({ type: \"delete\" }, input, promptCursor, setInput, setPromptCursor);\r\n setSlashSelection(0); setDismissedSlashInput(undefined);\r\n setMentionSelection(0); setDismissedMentionInput(undefined);\r\n }\r\n else if (key.leftArrow) setPromptCursor((value) => Math.max(0, value - 1));\r\n else if (key.rightArrow) setPromptCursor((value) => Math.min([...input].length, value + 1));\r\n else if (terminalAction?.type === \"history\" && terminalAction.direction === \"up\" && history.length) {\r\n const next = navigateHistory({ history, cursor: historyCursor }, \"up\");\r\n setHistoryCursor(next.cursor); setInput(next.input); setPromptCursor(next.promptCursor);\r\n setSlashSelection(0); setDismissedSlashInput(undefined);\r\n setMentionSelection(0); setDismissedMentionInput(undefined);\r\n } else if (terminalAction?.type === \"history\" && terminalAction.direction === \"down\" && history.length) {\r\n const next = navigateHistory({ history, cursor: historyCursor }, \"down\");\r\n setHistoryCursor(next.cursor); setInput(next.input); setPromptCursor(next.promptCursor);\r\n setSlashSelection(0); setDismissedSlashInput(undefined);\r\n setMentionSelection(0); setDismissedMentionInput(undefined);\r\n } else if (!key.ctrl && !key.meta && character) {\r\n updatePrompt({ type: \"insert\", value: character }, input, promptCursor, setInput, setPromptCursor);\r\n if (/[\\r\\n]/u.test(character)) {\r\n setPastedBlocks((current) => [...current, { id: current.length + 1, text: character }]);\r\n }\r\n setSlashSelection(0); setDismissedSlashInput(undefined);\r\n setMentionSelection(0); setDismissedMentionInput(undefined);\r\n }\r\n });\r\n\r\n void revision;\r\n if (runtime === undefined) return <StartingLayout\r\n workspaceName={basename(workspace)}\r\n completed={transcript.completed}\r\n {...(transcript.active === undefined ? {} : { active: transcript.active })}\r\n columns={columns}\r\n rows={rows}\r\n />;\r\n const llmServiceName = runtime.services.llmServiceName?.();\r\n return <TerminalLayout\r\n model={runtime.services.mainModel()}\r\n {...(llmServiceName === undefined ? {} : { serviceName: llmServiceName })}\r\n workspaceName={basename(workspace)}\r\n completed={transcript.completed}\r\n {...(transcript.active === undefined ? {} : { active: transcript.active })}\r\n input={input}\r\n pastedBlocks={pastedBlocks}\r\n imageAttachments={imageAttachments}\r\n {...(clipboardNotice === undefined ? {} : { clipboardNotice })}\r\n promptCursor={promptCursor}\r\n onPromptCursorChange={setPromptCursor}\r\n columns={columns}\r\n rows={rows}\r\n activeSession={transcript.active !== undefined}\r\n {...(ideContext === undefined ? {} : { ideContext })}\r\n completedSlashTokenLength={completedTokenLength}\r\n scrollRef={scrollRef}\r\n taskScrollRef={taskScrollRef}\r\n onTaskPanelHoverChange={(hovered) => { taskPanelHovered.current = hovered; }}\r\n {...(slashCompletion === null ? {} : { completion: slashCompletion })}\r\n {...(mentionCompletion === null ? {} : { mentionCompletion, onMentionSelect: selectMention })}\r\n {...(approval === undefined ? {} : { approval })}\r\n {...(questions === undefined ? {} : { questions })}\r\n memoryReviews={memoryReviews}\r\n memoryAutoDismissSeconds={memoryAutoDismissSeconds}\r\n {...(pendingPrompt === undefined ? {} : { pendingPrompt })}\r\n questionIndex={questionIndex}\r\n questionAnswers={questionAnswers}\r\n customQuestionActive={customQuestionActive}\r\n />;\r\n}\r\n\r\nfunction StartingLayout({\r\n workspaceName, completed, active, columns, rows,\r\n}: Pick<TerminalLayoutProps, \"workspaceName\" | \"completed\" | \"active\" | \"columns\"> & { rows: number }): React.JSX.Element {\r\n return <TerminalLayout\r\n model=\"starting\"\r\n workspaceName={workspaceName}\r\n completed={completed}\r\n {...(active === undefined ? {} : { active })}\r\n input=\"\"\r\n promptCursor={0}\r\n columns={columns}\r\n rows={rows}\r\n activeSession={false}\r\n />;\r\n}\r\n\r\nexport interface TerminalLayoutProps {\r\n model: string;\r\n serviceName?: string;\r\n workspaceName: string;\r\n completed: TranscriptTurn[];\r\n active?: TranscriptTurn;\r\n input: string;\r\n pastedBlocks?: readonly PastedBlock[];\r\n imageAttachments?: readonly ModelImageContentBlock[];\r\n clipboardNotice?: string;\r\n promptCursor: number;\r\n onPromptCursorChange?: (cursor: number) => void;\r\n columns: number;\r\n rows?: number;\r\n activeSession: boolean;\r\n ideContext?: IdeEditorContext;\r\n pendingPrompt?: string;\r\n completedSlashTokenLength?: number;\r\n completion?: SlashCompletion;\r\n mentionCompletion?: MentionCompletion;\r\n onMentionSelect?: (path: string) => void;\r\n approval?: { tool: string; reason?: string };\r\n questions?: readonly Question[];\r\n memoryReviews?: readonly MemoryReviewItem[];\r\n memoryAutoDismissSeconds?: number;\r\n questionIndex?: number;\r\n questionAnswers?: Readonly<Record<number, string>>;\r\n customQuestionActive?: boolean;\r\n scrollRef?: React.Ref<ScrollBoxHandle>;\r\n taskScrollRef?: React.Ref<ScrollBoxHandle>;\r\n onTaskPanelHoverChange?: (hovered: boolean) => void;\r\n}\r\n\r\nexport function TerminalLayout({\r\n model, serviceName, workspaceName, completed, active, input, pastedBlocks = [], imageAttachments = [], clipboardNotice,\r\n promptCursor, columns, rows = 24, activeSession, pendingPrompt, approval,\r\n questions, memoryReviews = [], memoryAutoDismissSeconds = 0, questionIndex = 0, questionAnswers = {}, customQuestionActive = false,\r\n completion, mentionCompletion, onMentionSelect, completedSlashTokenLength: tokenLength = 0, scrollRef,\r\n taskScrollRef, onTaskPanelHoverChange, onPromptCursorChange, ideContext,\r\n}: TerminalLayoutProps): React.JSX.Element {\r\n const dividerWidth = Math.max(1, columns - 1);\r\n const showWelcome = completed.length === 0 && active === undefined;\r\n const activeCompletion = completion ?? mentionCompletion;\r\n const menuRows = activeCompletion === undefined ? 0 : Math.min(6, activeCompletion.items.length - activeCompletion.windowStart);\r\n\r\n const activeTaskBlocks = active?.blocks.filter(\r\n (block): block is Extract<TranscriptBlock, { kind: \"status\" }> =>\r\n block.kind === \"status\" && block.task !== undefined,\r\n ) ?? [];\r\n const activeWithoutTasks = active === undefined ? undefined : {\r\n ...active,\r\n blocks: active.blocks.filter((block) =>\r\n !(block.kind === \"status\" && block.task !== undefined),\r\n ),\r\n };\r\n\r\n const questionRows = questions === undefined ? 0\r\n : 4 + (questions[questionIndex]?.options.length ?? 0) + questions.length * 2;\r\n const memoryReviewRows = memoryReviews.length === 0 ? 0 : 5;\r\n\r\n const fixedBottomRows = (approval === undefined ? 0 : 3) + questionRows + memoryReviewRows + menuRows\r\n + (pendingPrompt === undefined ? 0 : 1) + imageAttachments.length\r\n + (clipboardNotice === undefined ? 0 : 1) + 2;\r\n const taskPanelRows = taskPanelViewportRows(rows, fixedBottomRows, activeTaskBlocks.length > 0);\r\n const availableBottomRows = Math.max(1, rows - taskPanelRows - 1);\r\n const bottomMaxRows = Math.min(availableBottomRows, Math.max(Math.floor(rows / 2), fixedBottomRows + 1));\r\n const promptMaxLines = Math.max(1, bottomMaxRows - fixedBottomRows);\r\n return <Box height={rows} width=\"100%\" flexDirection=\"column\" overflow=\"hidden\">\r\n <ScrollBox {...(scrollRef === undefined ? {} : { ref: scrollRef })} flexGrow={1} flexDirection=\"column\" stickyScroll>\r\n {showWelcome\r\n ? <WelcomeCard model={model} {...(serviceName === undefined ? {} : { serviceName })} workspaceName={workspaceName} columns={columns} />\r\n : <Text dimColor>{\"flavor · \"}{model}{\" · \"}{workspaceName}</Text>}\r\n <Box height={1} />\r\n {completed.map((turn, index) => (\r\n <Box key={turn.id} flexDirection=\"column\">\r\n {index > 0 ? <TurnSeparator width={columns} /> : null}\r\n <TurnView turn={turn} interactive={false} />\r\n </Box>\r\n ))}\r\n {activeWithoutTasks === undefined ? null : (\r\n <Box flexDirection=\"column\">\r\n {completed.length > 0 ? <TurnSeparator width={columns} /> : null}\r\n <TurnView turn={activeWithoutTasks} interactive={activeSession} />\r\n </Box>\r\n )}\r\n </ScrollBox>\r\n <TaskProgressPanel\r\n blocks={activeTaskBlocks}\r\n interactive={activeSession}\r\n maxHeight={taskPanelRows}\r\n {...(taskScrollRef === undefined ? {} : { scrollRef: taskScrollRef })}\r\n {...(onTaskPanelHoverChange === undefined ? {} : { onHoverChange: onTaskPanelHoverChange })}\r\n />\r\n <Box flexDirection=\"column\" flexShrink={0} maxHeight={bottomMaxRows} width=\"100%\" overflowY=\"hidden\">\r\n {approval === undefined ? null : <Box flexDirection=\"column\" marginBottom={1}>\r\n <Text color=\"magenta\">┌─ approval · {approval.tool}</Text>\r\n <Text wrap=\"truncate-end\" color=\"magentaBright\">│ {approval.reason ?? \"This action needs permission.\"}</Text>\r\n {isDestructiveTool(approval.tool)\r\n ? <Text bold color=\"magenta\">└─ Allow? <Text color=\"green\">y</Text>=once / <Text color=\"red\">n</Text>=deny</Text>\r\n : <Text bold color=\"magenta\">└─ Allow? <Text color=\"green\">y</Text>=once / <Text color=\"yellow\">a</Text>=same-type / <Text color=\"red\">n</Text>=deny</Text>\r\n }\r\n </Box>}\r\n {!questions || questions.length === 0 ? null : (\r\n <QuestionCards questions={questions} activeIndex={questionIndex} answers={questionAnswers} customActive={customQuestionActive} />\r\n )}\r\n {memoryReviews.length === 0 ? null : <MemoryReviewCards reviews={memoryReviews} autoDismissSeconds={memoryAutoDismissSeconds} />}\r\n {completion === undefined ? null : <SlashMenu completion={completion} />}\r\n {mentionCompletion === undefined ? null : (\r\n <MentionMenu completion={mentionCompletion} {...(onMentionSelect === undefined ? {} : { onSelect: onMentionSelect })} />\r\n )}\r\n {pendingPrompt === undefined ? null : (\r\n <Text color=\"yellow\" wrap=\"truncate-end\">Pending · {pendingPrompt} · Esc edit</Text>\r\n )}\r\n <Text dimColor>{\"─\".repeat(dividerWidth)}</Text>\r\n {imageAttachments.map((image, index) => (\r\n <Text key={`${image.sha256}:${index}`} color=\"cyan\" wrap=\"truncate-end\">\r\n [Image #{index + 1}] {image.name ?? basename(image.source.path)}\r\n </Text>\r\n ))}\r\n {clipboardNotice === undefined ? null : (\r\n <Text color=\"yellow\" wrap=\"truncate-end\">{clipboardNotice}</Text>\r\n )}\r\n <PromptLine\r\n input={input}\r\n pastedBlocks={pastedBlocks}\r\n cursor={promptCursor}\r\n columns={columns}\r\n maxVisibleLines={promptMaxLines}\r\n completedSlashTokenLength={tokenLength}\r\n {...(onPromptCursorChange === undefined ? {} : { onCursorChange: onPromptCursorChange })}\r\n />\r\n <FooterStatus\r\n hint={activeSession\r\n ? \"Ctrl+C cancel · Enter queue · Esc edit pending · /steer sends now\"\r\n : completion !== undefined\r\n ? \"↑/↓ select · Tab complete · Esc close\"\r\n : mentionCompletion !== undefined\r\n ? \"↑/↓ select · Tab complete · click choose · Esc close\"\r\n : \"Enter send · Ctrl/Cmd+V image · ↑↓ history · Ctrl+C exit\"}\r\n {...(ideContext === undefined ? {} : { ideContext })}\r\n />\r\n </Box>\r\n </Box>;\r\n}\r\n\r\nexport function FooterStatus({\r\n hint,\r\n ideContext,\r\n}: {\r\n hint: string;\r\n ideContext?: IdeEditorContext;\r\n}): React.JSX.Element {\r\n const ide = ideFooterPresentation(ideContext);\r\n return <Box flexDirection=\"row\" width=\"100%\" justifyContent=\"space-between\">\r\n <Box flexGrow={1} flexShrink={1}>\r\n <Text dimColor wrap=\"truncate-end\">{hint}</Text>\r\n </Box>\r\n {ide === undefined ? null : (\r\n <Box flexShrink={0} marginLeft={1}>\r\n <Text color=\"cyan\" wrap=\"truncate-end\">⧉ {ide}</Text>\r\n </Box>\r\n )}\r\n </Box>;\r\n}\r\n\r\nexport function ideFooterPresentation(context: IdeEditorContext | undefined): string | undefined {\r\n if (context?.filePath === undefined) return undefined;\r\n if (context.selection.isEmpty || !context.selectedText) return `In ${basename(context.filePath)}`;\r\n const endLine = context.selection.end.character === 0\r\n && context.selection.end.line > context.selection.start.line\r\n ? context.selection.end.line - 1\r\n : context.selection.end.line;\r\n const count = Math.max(1, endLine - context.selection.start.line + 1);\r\n return `${count} ${count === 1 ? \"line\" : \"lines\"} selected`;\r\n}\r\n\r\nfunction QuestionCards({ questions, activeIndex, answers, customActive }: {\r\n questions: readonly Question[];\r\n activeIndex: number;\r\n answers: Readonly<Record<number, string>>;\r\n customActive: boolean;\r\n}): React.JSX.Element {\r\n return (\r\n <Box flexDirection=\"column\" marginBottom={1}>\r\n {questions.map((q, qi) => (\r\n <Box key={qi} flexDirection=\"column\" marginBottom={qi < questions.length - 1 ? 1 : 0}>\r\n <Text bold color=\"cyan\">┌─ {q.header}</Text>\r\n <Text wrap=\"truncate-end\" color=\"cyanBright\">│ {q.question}</Text>\r\n {qi < activeIndex ? <Text color=\"green\">│ ✓ {answers[qi]}</Text> : qi > activeIndex ? null : q.options.map((opt, oi) => (\r\n <Text key={oi} color=\"cyan\">\r\n │ <Text bold color=\"green\">{oi + 1}</Text>. {opt.label}\r\n <Text dimColor> {opt.description}</Text>\r\n </Text>\r\n ))}\r\n {qi === activeIndex ? <>\r\n <Text color=\"cyan\">│ <Text bold color=\"green\">{q.options.length + 1}</Text>. Custom input<Text dimColor> Type your own answer</Text></Text>\r\n <Text dimColor color=\"cyan\">└─ {customActive\r\n ? \"Type below and press Enter; Esc returns to choices\"\r\n : `Press 1-${q.options.length + 1} to choose; Esc dismisses`}</Text>\r\n </> : null}\r\n </Box>\r\n ))}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction MemoryReviewCards({ reviews, autoDismissSeconds }: {\r\n reviews: readonly MemoryReviewItem[];\r\n autoDismissSeconds: number;\r\n}): React.JSX.Element {\r\n const review = reviews[0]!;\r\n const [remaining, setRemaining] = useState(autoDismissSeconds);\r\n useEffect(() => {\r\n if (autoDismissSeconds <= 0) return;\r\n setRemaining(autoDismissSeconds);\r\n const timer = setInterval(() => setRemaining((current) => Math.max(0, current - 1)), 1_000);\r\n return (): void => clearInterval(timer);\r\n }, [review.id, autoDismissSeconds]);\r\n return <Box flexDirection=\"column\" marginBottom={1}>\r\n <Text bold color=\"yellow\">┌─ Long-term memory requires confirmation ({reviews.length})</Text>\r\n <Text color=\"yellowBright\" wrap=\"truncate-end\">│ [{review.type}] {review.content}</Text>\r\n <Text dimColor>│ Model-generated content is not stored until you approve it.</Text>\r\n <Text color=\"yellow\">└─ <Text bold>Ctrl+Y</Text> save / <Text bold>Ctrl+N</Text> ignore{autoDismissSeconds > 0\r\n ? <Text bold color=\"cyanBright\">{` (auto-dismiss in ${remaining}s)`}</Text>\r\n : \" (conversation remains available)\"}</Text>\r\n </Box>;\r\n}\r\n\r\nfunction SlashMenu({ completion }: { completion: SlashCompletion }): React.JSX.Element {\r\n const visible = completion.items.slice(completion.windowStart, completion.windowStart + 6);\r\n return <Box flexDirection=\"column\" width=\"100%\">\r\n {visible.map((candidate, visibleIndex) => {\r\n const index = completion.windowStart + visibleIndex;\r\n const presentation = slashCandidatePresentation(index === completion.selectedIndex);\r\n return <Text key={`${candidate.kind}:${candidate.name}`} {...presentation.rowStyle} wrap=\"truncate-end\">\r\n {presentation.marker}\r\n <HighlightedName name={candidate.name} query={completion.query} matchStyle={presentation.matchStyle} />\r\n {candidate.description === undefined ? null : <Text dimColor>{` ${candidate.description}`}</Text>}\r\n </Text>;\r\n })}\r\n </Box>;\r\n}\r\n\r\nexport function MentionMenu({\r\n completion,\r\n onSelect,\r\n}: {\r\n completion: MentionCompletion;\r\n onSelect?: (path: string) => void;\r\n}): React.JSX.Element {\r\n const visible = completion.items.slice(completion.windowStart, completion.windowStart + 6);\r\n return <Box flexDirection=\"column\" width=\"100%\">\r\n {visible.map((path, visibleIndex) => {\r\n const index = completion.windowStart + visibleIndex;\r\n const presentation = mentionCandidatePresentation(index === completion.selectedIndex);\r\n return <Box\r\n key={path}\r\n width=\"100%\"\r\n onClick={(event: ClickEvent) => {\r\n if (!event.cellIsBlank) onSelect?.(path);\r\n }}\r\n >\r\n <Text {...presentation.textStyle} wrap=\"truncate-end\">\r\n {presentation.marker}\r\n {presentation.highlightMatches\r\n ? <HighlightedName name={path} query={completion.query} matchStyle={presentation.matchStyle} />\r\n : path}\r\n </Text>\r\n </Box>;\r\n })}\r\n </Box>;\r\n}\r\n\r\nfunction HighlightedName({\r\n name, query, matchStyle,\r\n}: {\r\n name: string;\r\n query: string;\r\n matchStyle: { color: \"ansi:cyan\"; bold: true };\r\n}): React.JSX.Element {\r\n const ranges = matchRanges(name, query);\r\n if (ranges.length === 0) return <Text>{name}</Text>;\r\n const parts: React.ReactNode[] = [];\r\n let cursor = 0;\r\n for (const [start, end] of ranges) {\r\n if (start > cursor) parts.push(name.slice(cursor, start));\r\n parts.push(<Text key={`${start}:${end}`} {...matchStyle}>{name.slice(start, end)}</Text>);\r\n cursor = end;\r\n }\r\n if (cursor < name.length) parts.push(name.slice(cursor));\r\n return <Text>{parts}</Text>;\r\n}\r\n\r\nfunction jumpScroll(scroll: ScrollBoxHandle, delta: number): void {\r\n const maximum = Math.max(0, scroll.getScrollHeight() - scroll.getViewportHeight());\r\n const target = scroll.getScrollTop() + scroll.getPendingDelta() + delta;\r\n if (target >= maximum) {\r\n scroll.scrollTo(maximum);\r\n scroll.scrollToBottom();\r\n } else {\r\n scroll.scrollTo(Math.max(0, target));\r\n }\r\n}\r\n\r\nexport function selectWheelScrollTarget(\r\n transcript: ScrollBoxHandle | null,\r\n tasks: ScrollBoxHandle | null,\r\n taskPanelHovered: boolean,\r\n): ScrollBoxHandle | null {\r\n return taskPanelHovered && tasks !== null ? tasks : transcript;\r\n}\r\n\r\nexport function taskPanelViewportRows(rows: number, reservedBottomRows: number, hasTasks: boolean): number {\r\n if (!hasTasks) return 0;\r\n const terminalRows = Math.max(0, Math.floor(rows));\r\n const reserved = Math.max(0, Math.floor(reservedBottomRows));\r\n const available = Math.max(0, terminalRows - reserved - 1);\r\n return Math.min(8, Math.max(1, Math.floor(terminalRows / 3)), available);\r\n}\r\n\r\nfunction scrollDown(scroll: ScrollBoxHandle, amount: number): void {\r\n const maximum = Math.max(0, scroll.getScrollHeight() - scroll.getViewportHeight());\r\n if (scroll.getScrollTop() + scroll.getPendingDelta() + amount >= maximum) scroll.scrollToBottom();\r\n else scroll.scrollBy(amount);\r\n}\r\n\r\nfunction scrollUp(scroll: ScrollBoxHandle, amount: number): void {\r\n if (scroll.getScrollTop() + scroll.getPendingDelta() - amount <= 0) scroll.scrollTo(0);\r\n else scroll.scrollBy(-amount);\r\n}\r\n\r\nfunction TurnSeparator({ width }: { width: number }): React.JSX.Element {\r\n return <Text dimColor>{\"─\".repeat(Math.max(1, width - 1))}</Text>;\r\n}\r\n\r\nfunction TurnView({ turn, interactive }: { turn: TranscriptTurn; interactive: boolean }): React.JSX.Element {\r\n if (turn.kind === \"compaction\") {\r\n return <Box flexDirection=\"column\" marginBottom={1} borderStyle=\"round\" borderColor=\"ansi:yellowBright\" paddingX={1}>\r\n <Text color=\"ansi:yellowBright\" bold>{turn.prompt}</Text>\r\n {turn.blocks.map((block, index) => block.kind === \"status\"\r\n ? <StatusBlockView key={block.id} block={block} interactive={interactive} />\r\n : <Box key={`${turn.id}-text-${index}`}><AssistantText text={block.text} /></Box>)}\r\n </Box>;\r\n }\r\n return <Box flexDirection=\"column\" marginBottom={1}>\r\n {/* User prompt: left-aligned with white chevron, light gray background */}\r\n <Box flexDirection=\"row\" backgroundColor=\"#3a3a3a\" paddingX={1} paddingY={0}>\r\n <Text color=\"ansi:whiteBright\" bold backgroundColor=\"#3a3a3a\">❯</Text>\r\n <Text color=\"ansi:whiteBright\" bold backgroundColor=\"#3a3a3a\"> {turn.prompt}</Text>\r\n </Box>\r\n {/* Model output: indented to create clear visual hierarchy */}\r\n <Box flexDirection=\"column\" paddingLeft={2} marginTop={1}>\r\n {turn.blocks.map((block, index) => block.kind === \"status\"\r\n ? <StatusBlockView key={block.id} block={block} interactive={interactive} />\r\n : <Box key={`${turn.id}-text-${index}`} marginBottom={1}><AssistantText text={block.text} /></Box>)}\r\n </Box>\r\n </Box>;\r\n}\r\n\r\nconst DIFF_CONTENT = fileDiffLineStyle(\"context\").contentColor;\r\nconst DIFF_REMOVED_MARKER = fileDiffLineStyle(\"removed\").markerColor;\r\nconst DIFF_ADDED_MARKER = fileDiffLineStyle(\"added\").markerColor;\r\n\r\nfunction FileDiffView({ presentation }: { presentation: FileChangePresentation }): React.JSX.Element {\r\n const operation = presentation.operation === \"create\" ? \"Create\"\r\n : presentation.operation === \"delete\" ? \"Delete\"\r\n : \"Update\";\r\n if (presentation.operation === \"delete\") {\r\n return <Box flexDirection=\"row\">\r\n <Text color={DIFF_REMOVED_MARKER}>●</Text>\r\n <Text color={DIFF_CONTENT}> <Text bold>{operation}</Text>({basename(presentation.path)})</Text>\r\n </Box>;\r\n }\r\n const lineWidth = Math.max(1, ...presentation.lines.map((line) => Math.max(line.oldLine ?? 0, line.newLine ?? 0)))\r\n .toString().length;\r\n return <Box flexDirection=\"column\" width=\"100%\">\r\n <Box flexDirection=\"row\">\r\n <Text color={DIFF_ADDED_MARKER}>●</Text>\r\n <Text color={DIFF_CONTENT}> <Text bold>{operation}</Text>({basename(presentation.path)})</Text>\r\n </Box>\r\n <Text color={DIFF_CONTENT}> └ Added {lineCount(presentation.added)}, removed {lineCount(presentation.removed)}</Text>\r\n {presentation.lines.map((line, index) => (\r\n <FileDiffRow key={`${line.kind}:${line.oldLine ?? \"\"}:${line.newLine ?? \"\"}:${index}`} line={line} lineWidth={lineWidth} />\r\n ))}\r\n </Box>;\r\n}\r\n\r\nfunction FileDiffRow({ line, lineWidth }: { line: FileDiffLine; lineWidth: number }): React.JSX.Element {\r\n if (line.kind === \"omitted\") {\r\n return <Text color={DIFF_CONTENT} dimColor>{\" \".repeat(lineWidth + 4)}{line.text}</Text>;\r\n }\r\n const number = line.newLine ?? line.oldLine;\r\n const marker = line.kind === \"removed\" ? \"-\" : line.kind === \"added\" ? \"+\" : \" \";\r\n const { backgroundColor, markerColor, contentColor } = fileDiffLineStyle(line.kind);\r\n const prefix = `${String(number ?? \"\").padStart(lineWidth)} ${marker}| `;\r\n return <Box\r\n flexDirection=\"row\"\r\n width=\"100%\"\r\n {...(backgroundColor === undefined ? {} : { backgroundColor })}\r\n >\r\n <Text\r\n color={markerColor}\r\n {...(line.kind === \"context\" ? { dimColor: true } : {})}\r\n {...(backgroundColor === undefined ? {} : { backgroundColor })}\r\n >{prefix}</Text>\r\n <Text\r\n color={contentColor}\r\n {...(backgroundColor === undefined ? {} : { backgroundColor })}\r\n >{line.text}</Text>\r\n </Box>;\r\n}\r\n\r\nfunction lineCount(count: number): string {\r\n return `${count} ${count === 1 ? \"line\" : \"lines\"}`;\r\n}\r\n\r\nfunction StatusLine({ block, interactive }: { block: Extract<TranscriptBlock, { kind: \"status\" }>; interactive: boolean }): React.JSX.Element {\r\n if (block.progress !== undefined) return <CompactProgressLine progress={block.progress} />;\r\n const running = block.state === \"running\";\r\n const [ref, time] = useAnimationFrame(running && interactive ? 120 : null);\r\n const color = statusLineColor(block);\r\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\r\n const spinner = running && interactive ? frames[Math.floor(Math.max(0, time) / 120) % frames.length] + \" \" : \"\";\r\n return <Box ref={ref} flexDirection=\"row\">\r\n <Text {...(color === undefined ? { dimColor: true } : { color })}>{spinner}{block.text}</Text>\r\n {block.hint === undefined ? null\r\n : <Text dimColor wrap=\"truncate-end\"> ({block.hint})</Text>}\r\n </Box>;\r\n}\r\n\r\nexport function statusLineColor(\r\n block: Extract<TranscriptBlock, { kind: \"status\" }>,\r\n): \"ansi:yellowBright\" | \"ansi:green\" | \"#d77757\" | \"#e06c50\" | undefined {\r\n if (block.tone === \"retry\" || block.tone === \"warning\") return \"ansi:yellowBright\";\r\n if (block.state === \"running\") return \"#d77757\";\r\n if (block.state === \"completed\") return \"ansi:green\";\r\n if (block.state === \"failed\" || block.state === \"cancelled\") return \"#e06c50\";\r\n return undefined;\r\n}\r\n\r\nfunction CompactProgressLine({ progress }: { progress: number }): React.JSX.Element {\r\n const presentation = compactProgressPresentation(progress);\r\n return <Box flexDirection=\"row\">\r\n <Text>Compacting context </Text>\r\n {presentation.cells.map((cell, index) => (\r\n <Text key={index} color={cell.color}>\r\n ■{index === presentation.cells.length - 1 ? \"\" : \" \"}\r\n </Text>\r\n ))}\r\n <Text dimColor> {presentation.progress}%</Text>\r\n </Box>;\r\n}\r\n\r\nexport function PromptLine({\r\n input,\r\n pastedBlocks,\r\n cursor,\r\n columns,\r\n maxVisibleLines,\r\n completedSlashTokenLength: tokenLength = 0,\r\n onCursorChange,\r\n}: {\r\n input: string;\r\n pastedBlocks: readonly PastedBlock[];\r\n cursor: number;\r\n columns: number;\r\n maxVisibleLines?: number;\r\n completedSlashTokenLength?: number;\r\n onCursorChange?: (cursor: number) => void;\r\n}): React.JSX.Element {\r\n // The prompt container consumes one column of padding on each side. Feed\r\n // only its inner width to the wrapper so Yoga does not wrap the Text a\r\n // second time and leave a phantom row between prompt lines.\r\n const innerColumns = Math.max(1, columns - PROMPT_HORIZONTAL_PADDING * 2);\r\n const presentation = pastedDraftPresentation(input, cursor, pastedBlocks);\r\n const wrap = wrapPromptInput(presentation.text, presentation.cursor, { columns: innerColumns, indent: 2 });\r\n const visibleCount = Math.max(1, maxVisibleLines ?? wrap.lines.length);\r\n const windowStart = Math.min(\r\n Math.max(0, wrap.cursor.line - visibleCount + 1),\r\n Math.max(0, wrap.lines.length - visibleCount),\r\n );\r\n const visibleLines = wrap.lines.slice(windowStart, windowStart + visibleCount);\r\n const lineStarts: number[] = [];\r\n let nextLineStart = 0;\r\n for (const line of wrap.lines) {\r\n lineStarts.push(nextLineStart);\r\n nextLineStart += [...line].length;\r\n }\r\n return <Box width=\"100%\" flexDirection=\"column\" paddingX={PROMPT_HORIZONTAL_PADDING}>\r\n {visibleLines.map((line, visibleIndex) => {\r\n const lineIndex = windowStart + visibleIndex;\r\n const isCursorLine = lineIndex === wrap.cursor.line;\r\n const points = [...line];\r\n const cursorCol = wrap.cursor.column;\r\n const styledCount = Math.max(0, Math.min(points.length, tokenLength - (lineStarts[lineIndex] ?? 0)));\r\n return <Box\r\n key={lineIndex}\r\n {...(onCursorChange === undefined ? {} : {\r\n onClick: (event: ClickEvent) => {\r\n onCursorChange(promptCursorFromClick(input, pastedBlocks, {\r\n columns: innerColumns,\r\n lineIndex,\r\n localColumn: event.localCol,\r\n }));\r\n event.stopImmediatePropagation();\r\n },\r\n })}\r\n >\r\n <Text color=\"yellow\" bold>{lineIndex === 0 ? \"❯ \" : \" \"}</Text>\r\n <PromptLineContent points={points} cursor={cursorCol} cursorVisible={isCursorLine} styledCount={styledCount} />\r\n </Box>;\r\n })}\r\n </Box>;\r\n}\r\n\r\ninterface PastedDraftMatch {\r\n sourceStartPoint: number;\r\n sourceEndPoint: number;\r\n displayStartPoint: number;\r\n displayEndPoint: number;\r\n label: string;\r\n}\r\n\r\nfunction StatusBlockView({\r\n block,\r\n interactive,\r\n}: {\r\n block: Extract<TranscriptBlock, { kind: \"status\" }>;\r\n interactive: boolean;\r\n}): React.JSX.Element {\r\n const visibleBlock = cliToolTitle(block);\r\n const outcome = cliToolOutcome(block);\r\n const primary = visibleBlock.activity === \"model\" || visibleBlock.task !== undefined\r\n ? <TaskStatusLine block={visibleBlock} interactive={interactive} />\r\n : visibleBlock.state === \"completed\" && visibleBlock.presentation !== undefined\r\n ? <FileDiffView presentation={visibleBlock.presentation} />\r\n : <StatusLine block={visibleBlock} interactive={interactive} />;\r\n return <Box flexDirection=\"column\">\r\n {primary}\r\n {outcome === undefined ? null : <Box paddingLeft={2}><Text dimColor>└ {outcome}</Text></Box>}\r\n {block.details === undefined ? null : <Box paddingLeft={2}><AssistantText text={block.details} /></Box>}\r\n </Box>;\r\n}\r\n\r\nfunction cliToolTitle(\r\n block: Extract<TranscriptBlock, { kind: \"status\" }>,\r\n): Extract<TranscriptBlock, { kind: \"status\" }> {\r\n if (block.tool === undefined || block.presentation !== undefined) return block;\r\n const input = record(block.tool.input);\r\n const path = typeof input?.path === \"string\" ? basename(input.path) : undefined;\r\n if (path === undefined || block.text.includes(path)) return block;\r\n return { ...block, text: `${block.text} ${path}` };\r\n}\r\n\r\nfunction cliToolOutcome(block: Extract<TranscriptBlock, { kind: \"status\" }>): string | undefined {\r\n const result = block.tool?.result;\r\n if (result === undefined || block.presentation !== undefined) return undefined;\r\n if (!result.ok) return truncateInline(result.error?.message ?? \"Tool call failed\");\r\n const output = record(result.output);\r\n if (output === undefined) return undefined;\r\n if (typeof output.exitCode === \"number\" || output.exitCode === null) {\r\n const exit = output.exitCode === null ? \"no exit code\" : `exit ${output.exitCode}`;\r\n return output.truncated === true ? `${exit} · output truncated` : exit;\r\n }\r\n if (typeof output.replacements === \"number\") return `${output.replacements} replacement${output.replacements === 1 ? \"\" : \"s\"}`;\r\n if (typeof output.bytes === \"number\") return `${formatBytes(output.bytes)} written`;\r\n if (Array.isArray(output.matches)) return `${output.matches.length} match${output.matches.length === 1 ? \"\" : \"es\"}${output.truncated === true ? \" · truncated\" : \"\"}`;\r\n if (Array.isArray(output.paths)) return `${output.paths.length} file${output.paths.length === 1 ? \"\" : \"s\"}${output.truncated === true ? \" · truncated\" : \"\"}`;\r\n if (Array.isArray(output.files)) return `${output.files.length} file${output.files.length === 1 ? \"\" : \"s\"} changed`;\r\n return undefined;\r\n}\r\n\r\nfunction record(value: unknown): Record<string, unknown> | undefined {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\r\n ? value as Record<string, unknown>\r\n : undefined;\r\n}\r\n\r\nfunction truncateInline(value: string, maxChars = 180): string {\r\n const text = value.replace(/\\s+/gu, \" \").trim();\r\n return text.length <= maxChars ? text : `${text.slice(0, maxChars - 1)}…`;\r\n}\r\n\r\nfunction formatBytes(bytes: number): string {\r\n if (bytes < 1_024) return `${bytes} B`;\r\n if (bytes < 1_048_576) return `${(bytes / 1_024).toFixed(bytes < 10_240 ? 1 : 0)} KB`;\r\n return `${(bytes / 1_048_576).toFixed(1)} MB`;\r\n}\r\n\r\ninterface PastedDraftModel extends PromptEditState {\r\n matches: PastedDraftMatch[];\r\n}\r\n\r\nfunction pastedDraftModel(\r\n input: string,\r\n cursor: number,\r\n blocks: readonly PastedBlock[],\r\n): PastedDraftModel {\r\n const sourceMatches: Array<{\r\n start: number;\r\n end: number;\r\n startPoint: number;\r\n endPoint: number;\r\n label: string;\r\n }> = [];\r\n\r\n for (const block of blocks) {\r\n const extraLines = block.text.split(/\\r\\n|\\r|\\n/u).length - 1;\r\n if (extraLines === 0 || block.text.length === 0) continue;\r\n\r\n let start = input.indexOf(block.text);\r\n while (start >= 0) {\r\n const end = start + block.text.length;\r\n const overlaps = sourceMatches.some((match) => start < match.end && end > match.start);\r\n if (!overlaps) {\r\n sourceMatches.push({\r\n start,\r\n end,\r\n startPoint: [...input.slice(0, start)].length,\r\n endPoint: [...input.slice(0, end)].length,\r\n label: `[Pasted text #${block.id} +${extraLines} lines]`,\r\n });\r\n break;\r\n }\r\n start = input.indexOf(block.text, start + 1);\r\n }\r\n }\r\n\r\n if (sourceMatches.length === 0) return { text: input, cursor, matches: [] };\r\n sourceMatches.sort((left, right) => left.start - right.start);\r\n\r\n let text = \"\";\r\n let sourceOffset = 0;\r\n const matches: PastedDraftMatch[] = [];\r\n for (const match of sourceMatches) {\r\n text += input.slice(sourceOffset, match.start);\r\n const displayStartPoint = [...text].length;\r\n text += match.label;\r\n const displayEndPoint = [...text].length;\r\n matches.push({\r\n sourceStartPoint: match.startPoint,\r\n sourceEndPoint: match.endPoint,\r\n displayStartPoint,\r\n displayEndPoint,\r\n label: match.label,\r\n });\r\n sourceOffset = match.end;\r\n }\r\n text += input.slice(sourceOffset);\r\n\r\n let pointDelta = 0;\r\n let mappedCursor = cursor;\r\n for (const match of matches) {\r\n const labelLength = match.displayEndPoint - match.displayStartPoint;\r\n if (cursor <= match.sourceStartPoint) break;\r\n if (cursor < match.sourceEndPoint) {\r\n mappedCursor = match.displayEndPoint;\r\n break;\r\n }\r\n pointDelta += labelLength - (match.sourceEndPoint - match.sourceStartPoint);\r\n mappedCursor = cursor + pointDelta;\r\n }\r\n\r\n return { text, cursor: mappedCursor, matches };\r\n}\r\n\r\nexport function pastedDraftPresentation(\r\n input: string,\r\n cursor: number,\r\n blocks: readonly PastedBlock[],\r\n): PromptEditState {\r\n const model = pastedDraftModel(input, cursor, blocks);\r\n return { text: model.text, cursor: model.cursor };\r\n}\r\n\r\nexport interface PromptClickPosition {\r\n columns: number;\r\n lineIndex: number;\r\n localColumn: number;\r\n}\r\n\r\nfunction codePointIndexAtVisualColumn(line: string, targetColumn: number): number {\r\n const points = [...line];\r\n const target = Math.max(0, targetColumn);\r\n let visualColumn = 0;\r\n\r\n for (let index = 0; index < points.length; index += 1) {\r\n const width = charWidth(points[index]!.codePointAt(0) ?? 0);\r\n if (target <= visualColumn) return index;\r\n if (target < visualColumn + width) {\r\n return target - visualColumn < width / 2 ? index : index + 1;\r\n }\r\n visualColumn += width;\r\n }\r\n\r\n return points.length;\r\n}\r\n\r\nfunction sourceCursorFromDisplayed(model: PastedDraftModel, displayedCursor: number): number {\r\n let sourceOffset = 0;\r\n let displayOffset = 0;\r\n\r\n for (const match of model.matches) {\r\n if (displayedCursor < match.displayStartPoint) {\r\n return sourceOffset + displayedCursor - displayOffset;\r\n }\r\n if (displayedCursor <= match.displayEndPoint) return match.sourceEndPoint;\r\n sourceOffset = match.sourceEndPoint;\r\n displayOffset = match.displayEndPoint;\r\n }\r\n\r\n return sourceOffset + displayedCursor - displayOffset;\r\n}\r\n\r\nexport function promptCursorFromClick(\r\n input: string,\r\n blocks: readonly PastedBlock[],\r\n position: PromptClickPosition,\r\n): number {\r\n const model = pastedDraftModel(input, 0, blocks);\r\n const wrap = wrapPromptInput(model.text, 0, { columns: position.columns, indent: 2 });\r\n const lineIndex = Math.max(0, Math.min(wrap.lines.length - 1, position.lineIndex));\r\n const beforeLine = wrap.lines\r\n .slice(0, lineIndex)\r\n .reduce((total, line) => total + [...line].length, 0);\r\n const withinLine = codePointIndexAtVisualColumn(\r\n wrap.lines[lineIndex] ?? \"\",\r\n position.localColumn - 2,\r\n );\r\n const sourceCursor = sourceCursorFromDisplayed(model, beforeLine + withinLine);\r\n return Math.max(0, Math.min([...input].length, sourceCursor));\r\n}\r\n\r\nfunction PromptLineContent({\r\n points, cursor, cursorVisible, styledCount,\r\n}: {\r\n points: string[];\r\n cursor: number;\r\n cursorVisible: boolean;\r\n styledCount: number;\r\n}): React.JSX.Element {\r\n const tokenStyle = completedSlashTokenPresentation();\r\n return <Text>\r\n {points.map((point, index) => {\r\n const styled = index < styledCount;\r\n const caret = cursorVisible && index === cursor;\r\n return <Text\r\n key={index}\r\n {...(styled ? tokenStyle : {})}\r\n {...(caret ? { inverse: true } : {})}\r\n >{point}</Text>;\r\n })}\r\n {cursorVisible && cursor >= points.length ? <Text inverse>{\" \"}</Text> : null}\r\n </Text>;\r\n}\r\n\r\nexport interface PromptEditState { text: string; cursor: number }\r\nexport interface PastedPromptEditState extends PromptEditState { pastedBlocks: PastedBlock[] }\r\nexport type PromptEdit = { type: \"insert\"; value: string } | { type: \"backspace\" | \"delete\" | \"left\" | \"right\" };\r\nexport function editPrompt(state: PromptEditState, edit: PromptEdit): PromptEditState {\r\n const points = [...state.text];\r\n const cursor = Math.max(0, Math.min(points.length, state.cursor));\r\n if (edit.type === \"insert\") {\r\n const inserted = [...edit.value]; points.splice(cursor, 0, ...inserted);\r\n return { text: points.join(\"\"), cursor: cursor + inserted.length };\r\n }\r\n if (edit.type === \"left\") return { text: state.text, cursor: Math.max(0, cursor - 1) };\r\n if (edit.type === \"right\") return { text: state.text, cursor: Math.min(points.length, cursor + 1) };\r\n if (edit.type === \"backspace\") {\r\n if (cursor === 0) return { text: state.text, cursor };\r\n points.splice(cursor - 1, 1); return { text: points.join(\"\"), cursor: cursor - 1 };\r\n }\r\n if (edit.type === \"delete\") { points.splice(cursor, 1); return { text: points.join(\"\"), cursor }; }\r\n return { text: state.text, cursor };\r\n}\r\n\r\nexport function editPromptWithPastedBlocks(\r\n state: PromptEditState,\r\n edit: PromptEdit,\r\n pastedBlocks: readonly PastedBlock[],\r\n): PastedPromptEditState {\r\n const points = [...state.text];\r\n const cursor = Math.max(0, Math.min(points.length, state.cursor));\r\n const latest = pastedBlocks.at(-1);\r\n\r\n if (edit.type === \"backspace\" && latest !== undefined) {\r\n const pastedPoints = [...latest.text];\r\n const start = cursor - pastedPoints.length;\r\n if (start >= 0 && points.slice(start, cursor).join(\"\") === latest.text) {\r\n points.splice(start, pastedPoints.length);\r\n return {\r\n text: points.join(\"\"),\r\n cursor: start,\r\n pastedBlocks: pastedBlocks.slice(0, -1),\r\n };\r\n }\r\n }\r\n\r\n return { ...editPrompt({ text: state.text, cursor }, edit), pastedBlocks: [...pastedBlocks] };\r\n}\r\n\r\nexport interface HistoryNavigationState { history: readonly string[]; cursor: number }\r\nexport interface HistoryNavigationResult { cursor: number; input: string; promptCursor: number }\r\nexport function navigateHistory(state: HistoryNavigationState, direction: \"up\" | \"down\"): HistoryNavigationResult {\r\n const cursor = direction === \"up\"\r\n ? Math.max(0, state.cursor - 1)\r\n : Math.min(state.history.length, state.cursor + 1);\r\n const input = state.history[cursor] ?? \"\";\r\n return { cursor, input, promptCursor: [...input].length };\r\n}\r\n\r\nfunction updatePrompt(\r\n edit: PromptEdit, text: string, cursor: number,\r\n setText: React.Dispatch<React.SetStateAction<string>>, setCursor: React.Dispatch<React.SetStateAction<number>>,\r\n): void {\r\n const next = editPrompt({ text, cursor }, edit); setText(next.text); setCursor(next.cursor);\r\n}\r\n\r\n\r\n\r\nexport async function submitSafely(\r\n session: { submit(prompt: string): Promise<void> }, prompt: string, report: (message: string) => void,\r\n): Promise<void> {\r\n try { await session.submit(prompt); }\r\n catch (error) { safeReport(report, safeUiError(error)); }\r\n}\r\n\r\nexport async function shutdownRuntime(\r\n runtime: ProductionRuntime | undefined, exit: () => void, report: (message: string) => void,\r\n): Promise<void> {\r\n try { await closeAndDisposeRuntime(runtime, report); }\r\n finally { exit(); }\r\n}\r\n\r\nexport async function closeAndDisposeRuntime(\r\n runtime: ProductionRuntime | undefined, report: (message: string) => void,\r\n): Promise<void> {\r\n if (runtime === undefined) return;\r\n try { await runtime.session.close(); }\r\n catch (error) { safeReport(report, safeUiError(error)); }\r\n finally {\r\n try { await runtime.dispose(); }\r\n catch (error) { safeReport(report, safeUiError(error)); }\r\n }\r\n}\r\n\r\nfunction safeUiError(error: unknown): string {\r\n return redactErrorText(message(error)).slice(0, 2_000);\r\n}\r\nfunction safeReport(report: (message: string) => void, value: string): void {\r\n try { report(value); } catch { /* Cleanup and exit must not depend on diagnostics. */ }\r\n}\r\n","// @ts-nocheck\nimport { useContext, useEffect, useState } from 'react'\r\nimport { ClockContext } from '../components/ClockContext.js'\r\nimport type { DOMElement } from '../dom.js'\r\nimport { useTerminalViewport } from './use-terminal-viewport.js'\r\n\r\n/**\r\n * Hook for synchronized animations that pause when offscreen.\r\n *\r\n * Returns a ref to attach to the animated element and the current animation time.\r\n * All instances share the same clock, so animations stay in sync.\r\n * The clock only runs when at least one keepAlive subscriber exists.\r\n *\r\n * Pass `null` to pause — unsubscribes from the clock so no ticks fire.\r\n * Time freezes at the last value and resumes from the current clock time\r\n * when a number is passed again.\r\n *\r\n * @param intervalMs - How often to update, or null to pause\r\n * @returns [ref, time] - Ref to attach to element, elapsed time in ms\r\n *\r\n * @example\r\n * function Spinner() {\r\n * const [ref, time] = useAnimationFrame(120)\r\n * const frame = Math.floor(time / 120) % FRAMES.length\r\n * return <Box ref={ref}>{FRAMES[frame]}</Box>\r\n * }\r\n *\r\n * The clock automatically slows when the terminal is blurred,\r\n * so consumers don't need to handle focus state.\r\n */\r\nexport function useAnimationFrame(\r\n intervalMs: number | null = 16,\r\n): [ref: (element: DOMElement | null) => void, time: number] {\r\n const clock = useContext(ClockContext)\r\n const [viewportRef, { isVisible }] = useTerminalViewport()\r\n const [time, setTime] = useState(() => clock?.now() ?? 0)\r\n\r\n const active = isVisible && intervalMs !== null\r\n\r\n useEffect(() => {\r\n if (!clock || !active) return\r\n\r\n let lastUpdate = clock.now()\r\n\r\n const onChange = (): void => {\r\n const now = clock.now()\r\n if (now - lastUpdate >= intervalMs!) {\r\n lastUpdate = now\r\n setTime(now)\r\n }\r\n }\r\n\r\n // keepAlive: true — visible animations drive the clock\r\n return clock.subscribe(onChange, true)\r\n }, [clock, intervalMs, active])\r\n\r\n return [viewportRef, time]\r\n}\r\n","// @ts-nocheck\nimport { useCallback, useContext, useLayoutEffect, useRef } from 'react'\r\nimport { TerminalSizeContext } from '../components/TerminalSizeContext.js'\r\nimport type { DOMElement } from '../dom.js'\r\n\r\ntype ViewportEntry = {\r\n /**\r\n * Whether the element is currently within the terminal viewport\r\n */\r\n isVisible: boolean\r\n}\r\n\r\n/**\r\n * Hook to detect if a component is within the terminal viewport.\r\n *\r\n * Returns a callback ref and a viewport entry object.\r\n * Attach the ref to the component you want to track.\r\n *\r\n * The entry is updated during the layout phase (useLayoutEffect) so callers\r\n * always read fresh values during render. Visibility changes do NOT trigger\r\n * re-renders on their own — callers that re-render for other reasons (e.g.\r\n * animation ticks, state changes) will pick up the latest value naturally.\r\n * This avoids infinite update loops when combined with other layout effects\r\n * that also call setState.\r\n *\r\n * @example\r\n * const [ref, entry] = useTerminalViewport()\r\n * return <Box ref={ref}><Animation enabled={entry.isVisible}>...</Animation></Box>\r\n */\r\nexport function useTerminalViewport(): [\r\n ref: (element: DOMElement | null) => void,\r\n entry: ViewportEntry,\r\n] {\r\n const terminalSize = useContext(TerminalSizeContext)\r\n const elementRef = useRef<DOMElement | null>(null)\r\n const entryRef = useRef<ViewportEntry>({ isVisible: true })\r\n\r\n const setElement = useCallback((el: DOMElement | null) => {\r\n elementRef.current = el\r\n }, [])\r\n\r\n // Runs on every render because yoga layout values can change\r\n // without React being aware. Only updates the ref — no setState\r\n // to avoid cascading re-renders during the commit phase.\r\n // Walks the DOM ancestor chain fresh each time to avoid holding stale\r\n // references after yoga tree rebuilds.\r\n useLayoutEffect(() => {\r\n const element = elementRef.current\r\n if (!element?.yogaNode || !terminalSize) {\r\n return\r\n }\r\n\r\n const height = element.yogaNode.getComputedHeight()\r\n const rows = terminalSize.rows\r\n\r\n // Walk the DOM parent chain (not yoga.getParent()) so we can detect\r\n // scroll containers and subtract their scrollTop. Yoga computes layout\r\n // positions without scroll offset — scrollTop is applied at render time.\r\n // Without this, an element inside a ScrollBox whose yoga position exceeds\r\n // terminalRows would be considered offscreen even when scrolled into view\r\n // (e.g., the spinner in fullscreen mode after enough messages accumulate).\r\n let absoluteTop = element.yogaNode.getComputedTop()\r\n let parent: DOMElement | undefined = element.parentNode\r\n let root = element.yogaNode\r\n while (parent) {\r\n if (parent.yogaNode) {\r\n absoluteTop += parent.yogaNode.getComputedTop()\r\n root = parent.yogaNode\r\n }\r\n // scrollTop is only ever set on scroll containers (by ScrollBox + renderer).\r\n // Non-scroll nodes have undefined scrollTop → falsy fast-path.\r\n if (parent.scrollTop) absoluteTop -= parent.scrollTop\r\n parent = parent.parentNode\r\n }\r\n\r\n // Only the root's height matters\r\n const screenHeight = root.getComputedHeight()\r\n\r\n const bottom = absoluteTop + height\r\n // When content overflows the viewport (screenHeight > rows), the\r\n // cursor-restore at frame end scrolls one extra row into scrollback.\r\n // log-update.ts accounts for this with scrollbackRows = viewportY + 1.\r\n // We must match, otherwise an element at the boundary is considered\r\n // \"visible\" here (animation keeps ticking) but its row is treated as\r\n // scrollback by log-update (content change → full reset → flicker).\r\n const cursorRestoreScroll = screenHeight > rows ? 1 : 0\r\n const viewportY = Math.max(0, screenHeight - rows) + cursorRestoreScroll\r\n const viewportBottom = viewportY + rows\r\n const visible = bottom > viewportY && absoluteTop < viewportBottom\r\n\r\n if (visible !== entryRef.current.isVisible) {\r\n entryRef.current = { isVisible: visible }\r\n }\r\n })\r\n\r\n return [setElement, entryRef.current]\r\n}\r\n","// @ts-nocheck\nimport { useContext, useMemo, useSyncExternalStore } from 'react'\r\nimport StdinContext from '../components/StdinContext.js'\r\nimport instances from '../instances.js'\r\nimport {\r\n type FocusMove,\r\n type SelectionState,\r\n shiftAnchor,\r\n} from '../selection.js'\r\n\r\n/**\r\n * Access to text selection operations on the Ink instance (fullscreen only).\r\n * Returns no-op functions when fullscreen mode is disabled.\r\n */\r\nexport function useSelection(): {\r\n copySelection: () => string\r\n /** Copy without clearing the highlight (for copy-on-select). */\r\n copySelectionNoClear: () => string\r\n clearSelection: () => void\r\n hasSelection: () => boolean\r\n /** Read the raw mutable selection state (for drag-to-scroll). */\r\n getState: () => SelectionState | null\r\n /** Subscribe to selection mutations (start/update/finish/clear). */\r\n subscribe: (cb: () => void) => () => void\r\n /** Shift the anchor row by dRow, clamped to [minRow, maxRow]. */\r\n shiftAnchor: (dRow: number, minRow: number, maxRow: number) => void\r\n /** Shift anchor AND focus by dRow (keyboard scroll: whole selection\r\n * tracks content). Clamped points get col reset to the full-width edge\r\n * since their content was captured by captureScrolledRows. Reads\r\n * screen.width from the ink instance for the col-reset boundary. */\r\n shiftSelection: (dRow: number, minRow: number, maxRow: number) => void\r\n /** Keyboard selection extension (shift+arrow): move focus, anchor fixed.\r\n * Left/right wrap across rows; up/down clamp at viewport edges. */\r\n moveFocus: (move: FocusMove) => void\r\n /** Capture text from rows about to scroll out of the viewport (call\r\n * BEFORE scrollBy so the screen buffer still has the outgoing rows). */\r\n captureScrolledRows: (\r\n firstRow: number,\r\n lastRow: number,\r\n side: 'above' | 'below',\r\n ) => void\r\n /** Set the selection highlight bg color (theme-piping; solid bg\r\n * replaces the old SGR-7 inverse so syntax highlighting stays readable\r\n * under selection). Call once on mount + whenever theme changes. */\r\n setSelectionBgColor: (color: string) => void\r\n} {\r\n // Look up the Ink instance via stdout — same pattern as instances map.\r\n // StdinContext is available (it's always provided), and the Ink instance\r\n // is keyed by stdout which we can get from process.stdout since there's\r\n // only one Ink instance per process in practice.\r\n useContext(StdinContext) // anchor to App subtree for hook rules\r\n const ink = instances.get(process.stdout)\r\n // Memoize so callers can safely use the return value in dependency arrays.\r\n // ink is a singleton per stdout — stable across renders.\r\n return useMemo(() => {\r\n if (!ink) {\r\n return {\r\n copySelection: () => '',\r\n copySelectionNoClear: () => '',\r\n clearSelection: () => {},\r\n hasSelection: () => false,\r\n getState: () => null,\r\n subscribe: () => () => {},\r\n shiftAnchor: () => {},\r\n shiftSelection: () => {},\r\n moveFocus: () => {},\r\n captureScrolledRows: () => {},\r\n setSelectionBgColor: () => {},\r\n }\r\n }\r\n return {\r\n copySelection: () => ink.copySelection(),\r\n copySelectionNoClear: () => ink.copySelectionNoClear(),\r\n clearSelection: () => ink.clearTextSelection(),\r\n hasSelection: () => ink.hasTextSelection(),\r\n getState: () => ink.selection,\r\n subscribe: (cb: () => void) => ink.subscribeToSelectionChange(cb),\r\n shiftAnchor: (dRow: number, minRow: number, maxRow: number) =>\r\n shiftAnchor(ink.selection, dRow, minRow, maxRow),\r\n shiftSelection: (dRow, minRow, maxRow) =>\r\n ink.shiftSelectionForScroll(dRow, minRow, maxRow),\r\n moveFocus: (move: FocusMove) => ink.moveSelectionFocus(move),\r\n captureScrolledRows: (firstRow, lastRow, side) =>\r\n ink.captureScrolledRows(firstRow, lastRow, side),\r\n setSelectionBgColor: (color: string) => ink.setSelectionBgColor(color),\r\n }\r\n }, [ink])\r\n}\r\n\r\nconst NO_SUBSCRIBE = () => () => {}\r\nconst ALWAYS_FALSE = () => false\r\n\r\n/**\r\n * Reactive selection-exists state. Re-renders the caller when a text\r\n * selection is created or cleared. Always returns false outside\r\n * fullscreen mode (selection is only available in alt-screen).\r\n */\r\nexport function useHasSelection(): boolean {\r\n useContext(StdinContext)\r\n const ink = instances.get(process.stdout)\r\n return useSyncExternalStore(\r\n ink ? ink.subscribeToSelectionChange : NO_SUBSCRIBE,\r\n ink ? ink.hasTextSelection : ALWAYS_FALSE,\r\n )\r\n}\r\n","// @ts-nocheck\r\nimport { useContext, useEffect } from 'react'\r\nimport stripAnsi from 'strip-ansi'\r\nimport { OSC, osc } from '../termio/osc.js'\r\nimport { TerminalWriteContext } from '../useTerminalNotification.js'\r\n\r\n/**\r\n * Declaratively set the terminal tab/window title.\r\n *\r\n * Pass a string to set the title. ANSI escape sequences are stripped\r\n * automatically so callers don't need to know about terminal encoding.\r\n * Pass `null` to opt out — the hook becomes a no-op and leaves the\r\n * terminal title untouched.\r\n *\r\n * Writes OSC 0 (set title+icon) via Ink's stdout. Works in VS Code,\r\n * Windows Terminal, and all modern terminal emulators.\r\n */\r\nexport function useTerminalTitle(title: string | null): void {\r\n const writeRaw = useContext(TerminalWriteContext)\r\n\r\n useEffect(() => {\r\n if (title === null || !writeRaw) return\r\n\r\n const clean = stripAnsi(title)\r\n\r\n writeRaw(osc(OSC.SET_TITLE_AND_ICON, clean))\r\n }, [title, writeRaw])\r\n}\r\n","import React from \"react\";\r\n\r\nimport { MarkdownView } from \"./markdown.js\";\r\n\r\n/**\r\n * Claude-style terminal output: Markdown is interpreted for presentation,\r\n * so control markers are not printed while prose, lists and code remain.\r\n */\r\nexport interface AssistantTextProps { text: string }\r\n\r\nfunction AssistantTextInner({ text }: AssistantTextProps): React.JSX.Element {\r\n return <MarkdownView text={text} />;\r\n}\r\n\r\nexport const AssistantText = React.memo(AssistantTextInner);\r\n","import React, { useMemo, useRef } from \"react\";\r\nimport { Box, Text, useStdout } from \"../claude-ink/index.js\";\nimport chalk from \"chalk\";\r\nimport { marked } from \"marked\";\r\nimport type { Token, Tokens } from \"marked\";\r\n\r\nimport { highlightCode } from \"./highlight.js\";\r\nimport { charWidth } from \"./char-width.js\";\r\n\r\n/* ------------------------------------------------------------------ */\r\n/* Public component */\r\n/* ------------------------------------------------------------------ */\r\n\r\nexport interface MarkdownViewProps { text: string }\n\n/**\r\n * Render markdown text as styled Ink components, modelled on the visual\r\n * feel of Claude Code. Streams markdown from the moment the first chunk\r\n * lands; partial input that does not yet close a code block or list still\r\n * parses to a sensible token tree via marked.lexer and degrades cleanly.\r\n *\r\n * Pure render — no side effects, no state outside the input props. The\r\n * component is wrapped in `React.memo` so unchanged frozen lines skip the\r\n * React reconciliation cost.\r\n */\r\nfunction MarkdownViewInner({ text }: MarkdownViewProps): React.JSX.Element {\n // Claude Code's StreamingMarkdown algorithm: the last top-level block is\n // allowed to grow while the completed prefix is kept as a stable subtree.\n const stablePrefixRef = useRef(\"\");\n if (!text.startsWith(stablePrefixRef.current)) stablePrefixRef.current = \"\";\n\n const boundary = stablePrefixRef.current.length;\n const suffixTokens = useMemo(() => {\n try {\n return marked.lexer(text.substring(boundary), { gfm: true, async: false });\n } catch {\n return [];\n }\n }, [text, boundary]);\n\n let lastContentIndex = suffixTokens.length - 1;\n while (lastContentIndex >= 0 && suffixTokens[lastContentIndex]?.type === \"space\") lastContentIndex--;\n let advance = 0;\n for (let index = 0; index < lastContentIndex; index++) advance += suffixTokens[index]?.raw.length ?? 0;\n if (advance > 0) stablePrefixRef.current = text.substring(0, boundary + advance);\n\n const stablePrefix = stablePrefixRef.current;\n const unstableSuffix = text.substring(stablePrefix.length);\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {stablePrefix.length > 0 ? <MarkdownSegment text={stablePrefix} /> : null}\n {unstableSuffix.length > 0 ? <MarkdownSegment text={unstableSuffix} /> : null}\n </Box>\n );\n}\n\nconst MarkdownSegment = React.memo(function MarkdownSegment({ text }: { text: string }): React.JSX.Element {\n const tokens = useMemo(() => {\n try {\n return marked.lexer(text, { gfm: true, async: false });\n } catch {\n return [];\n }\n }, [text]);\n return <>{tokens.map((token, index) => <BlockToken key={index} token={token} />)}</>;\n});\n\r\nexport const MarkdownView = React.memo(MarkdownViewInner);\r\n\r\n/* ------------------------------------------------------------------ */\r\n/* Block-level renderer */\r\n/* ------------------------------------------------------------------ */\r\n\r\nconst BlockToken = React.memo(function BlockToken({ token }: { token: Token }): React.JSX.Element | null {\n switch (token.type) {\r\n case \"space\":\r\n return <Box height={1} />;\r\n case \"heading\":\r\n return <HeadingView token={token as Tokens.Heading} />;\r\n case \"paragraph\":\r\n return (\r\n <Text>\r\n <InlineTokens tokens={token.tokens ?? []} />\r\n </Text>\r\n );\r\n case \"code\":\r\n return <CodeBlock token={token as Tokens.Code} />;\r\n case \"blockquote\":\r\n return <BlockquoteView token={token as Tokens.Blockquote} />;\r\n case \"list\":\r\n return <ListView token={token as Tokens.List} />;\r\n case \"hr\":\r\n return <HrView />;\r\n case \"table\":\r\n return <TableView token={token as Tokens.Table} />;\r\n case \"html\":\r\n return <Text dimColor>[html]</Text>;\r\n default:\r\n if (\"text\" in token && typeof token.text === \"string\") {\r\n return <Text>{token.text}</Text>;\r\n }\r\n return null;\r\n }\n});\n\r\n/* ------------------------------------------------------------------ */\r\n/* Block views */\r\n/* ------------------------------------------------------------------ */\r\n\r\nfunction HeadingView({ token }: { token: Tokens.Heading }): React.JSX.Element {\r\n const styled = useMemo(() => {\r\n const inner = renderInlineText(token.tokens);\r\n switch (token.depth) {\r\n case 1: return chalk.bold.hex(\"#7dd3fc\")(inner);\r\n case 2: return chalk.bold.hex(\"#67e8f9\")(inner);\r\n case 3: return chalk.bold.hex(\"#93c5fd\")(inner);\r\n default: return chalk.italic.hex(\"#93c5fd\")(inner);\r\n }\r\n }, [token.depth, token.tokens]);\r\n return <Text>{styled}</Text>;\r\n}\r\n\r\nfunction CodeBlock({ token }: { token: Tokens.Code }): React.JSX.Element {\r\n const { stdout } = useStdout();\r\n const columns = stdout?.columns ?? 80;\r\n const innerWidth = Math.max(20, columns - 6); // 2 indent each side + 2 border\r\n const styledSource = useMemo(() => highlightCode(token.text, token.lang), [token.text, token.lang]);\r\n const lines = useMemo(() => styledSource.split(\"\\n\"), [styledSource]);\r\n const truncated = useMemo(() => lines.map((line) => truncateToWidth(line, innerWidth - 2)), [lines, innerWidth]);\r\n const langLabel = token.lang?.trim();\r\n const label = langLabel && langLabel.length > 0 ? langLabel : \"code\";\r\n const topBarWidth = Math.max(0, columns - 4 - label.length - 4);\r\n return (\r\n <Box flexDirection=\"column\" paddingX={1}>\r\n <Text color=\"gray\">{\"╭─ \"}<Text color=\"cyan\">{label}</Text>{\" \"}{\"─\".repeat(topBarWidth)}{\"╮\"}</Text>\r\n <Box flexDirection=\"column\" paddingX={1}>\r\n {truncated.map((line, i) => (\r\n <Text key={i} color=\"gray\">{line}</Text>\r\n ))}\r\n </Box>\r\n <Text color=\"gray\">{\"╰\"}{\"─\".repeat(Math.max(0, columns - 6))}{\"╯\"}</Text>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction BlockquoteView({ token }: { token: Tokens.Blockquote }): React.JSX.Element {\r\n return (\r\n <Box flexDirection=\"column\">\r\n {token.tokens.map((child, i) => {\r\n const inline = \"tokens\" in child ? (child as Tokens.Paragraph).tokens ?? [] : [];\r\n return (\r\n <Text key={i}>\r\n <Text color=\"gray\">│ </Text>\r\n <InlineTokens tokens={inline} />\r\n </Text>\r\n );\r\n })}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction HrView(): React.JSX.Element {\r\n const { stdout } = useStdout();\r\n const width = Math.max(8, (stdout?.columns ?? 80) - 4);\r\n return <Text color=\"gray\">{\"─\".repeat(width)}</Text>;\r\n}\r\n\r\n/* ------------------------------------------------------------------ */\r\n/* List */\r\n/* ------------------------------------------------------------------ */\r\n\r\nfunction ListView({ token }: { token: Tokens.List }): React.JSX.Element {\r\n const start = typeof token.start === \"number\" ? token.start : 1;\r\n return (\r\n <Box flexDirection=\"column\">\r\n {token.items.map((item, i) => (\r\n <ListItemView key={i} item={item} index={start + i} ordered={token.ordered} />\r\n ))}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction ListItemView({\r\n item,\r\n index,\r\n ordered,\r\n}: {\r\n item: Tokens.ListItem;\r\n index: number;\r\n ordered: boolean | undefined;\r\n}): React.JSX.Element {\r\n const bullet = ordered ? `${index}.` : \"-\";\r\n // Split the item's children into the leading inline line (the bullet row)\r\n // and any subsequent block-level children (code, sublist, paragraph break).\r\n // Wrapping the whole item in a `<Box>` keeps Ink happy — block children\r\n // cannot legally live inside a `<Text>` parent.\r\n const inlineTokens: Array<Tokens.Paragraph | Tokens.Text> = [];\r\n const blockTokens: Token[] = [];\r\n let firstParagraphConsumed = false;\r\n for (const child of item.tokens) {\r\n if (child.type === \"paragraph\") {\r\n const paragraph = child as Tokens.Paragraph;\r\n if (!firstParagraphConsumed) {\r\n inlineTokens.push(paragraph);\r\n firstParagraphConsumed = true;\r\n } else {\r\n blockTokens.push(child);\r\n }\r\n } else if (child.type === \"text\") {\r\n inlineTokens.push(child as Tokens.Text);\r\n } else {\r\n blockTokens.push(child);\r\n }\r\n }\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text>\r\n <Text color=\"cyan\">{bullet} </Text>\r\n {inlineTokens.map((child, i) => {\r\n if (child.type === \"paragraph\") {\r\n return <InlineTokens key={i} tokens={(child as Tokens.Paragraph).tokens ?? []} />;\r\n }\r\n const tokens = (child as Tokens.Text).tokens ?? [];\n return tokens.length > 0\n ? <InlineTokens key={i} tokens={tokens} />\n : <Text key={i}>{child.text}</Text>;\n })}\r\n </Text>\r\n {blockTokens.map((child, i) => (\r\n <Box key={i} marginLeft={2}>\r\n <BlockToken token={child} />\r\n </Box>\r\n ))}\r\n </Box>\r\n );\r\n}\r\n\r\n/* ------------------------------------------------------------------ */\r\n/* Table */\r\n/* ------------------------------------------------------------------ */\r\n\r\nfunction TableView({ token }: { token: Tokens.Table }): React.JSX.Element {\r\n const { stdout } = useStdout();\r\n const maxWidth = stdout?.columns ?? 80;\r\n const colCount = token.header.length;\r\n if (colCount === 0) return <Text dimColor>[empty table]</Text>;\r\n\r\n const colWidth = Math.max(8, Math.floor((maxWidth - colCount * 3) / colCount));\r\n const pad = (value: string, w: number, align: \"left\" | \"right\" | \"center\" | null): string => {\r\n const stripped = stripAnsi(value);\r\n const width = Math.max(0, w);\r\n if (stripped.length > width) return stripped.slice(0, width - 1) + \"…\";\r\n const diff = width - stripped.length;\r\n if (align === \"right\") return \" \".repeat(diff) + stripped;\r\n if (align === \"center\") {\r\n const left = Math.floor(diff / 2);\r\n const right = diff - left;\r\n return \" \".repeat(left) + stripped + \" \".repeat(right);\r\n }\r\n return stripped + \" \".repeat(diff);\r\n };\r\n\r\n const separator = token.header.map((cell) => {\r\n const align = cell.align;\r\n if (align === \"left\") return \":\" + \"─\".repeat(colWidth - 2) + \" \";\r\n if (align === \"right\") return \" \" + \"─\".repeat(colWidth - 2) + \":\";\r\n if (align === \"center\") return \":\" + \"─\".repeat(colWidth - 2) + \":\";\r\n return \"─\".repeat(colWidth);\r\n });\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text>\r\n {token.header.map((cell, i) => pad(cell.text, colWidth, cell.align ?? \"left\")).join(\" │ \")}\r\n </Text>\r\n <Text dimColor>{separator.join(\" │ \")}</Text>\r\n {token.rows.map((row, ri) => (\r\n <Text key={ri}>\r\n {row.map((cell, i) => pad(cell.text, colWidth, token.header[i]?.align ?? \"left\")).join(\" │ \")}\r\n </Text>\r\n ))}\r\n </Box>\r\n );\r\n}\r\n\r\n/* ------------------------------------------------------------------ */\r\n/* Inline renderer */\r\n/* ------------------------------------------------------------------ */\r\n\r\nfunction InlineTokens({ tokens }: { tokens: Token[] }): React.JSX.Element {\r\n return (\r\n <Text>\r\n {tokens.map((token, i) => (\r\n <InlineToken key={i} token={token} />\r\n ))}\r\n </Text>\r\n );\r\n}\r\n\r\nfunction InlineToken({ token }: { token: Token }): React.JSX.Element | null {\r\n switch (token.type) {\r\n case \"text\":\r\n return <Text>{(token as Tokens.Text).raw ?? token.text}</Text>;\r\n case \"strong\":\r\n return <Text bold>{renderInlineText((token as Tokens.Strong).tokens)}</Text>;\r\n case \"em\":\r\n return <Text italic>{renderInlineText((token as Tokens.Em).tokens)}</Text>;\r\n case \"del\":\r\n return <Text strikethrough>{renderInlineText((token as Tokens.Del).tokens)}</Text>;\r\n case \"codespan\":\r\n return <Text color=\"black\" backgroundColor=\"gray\">{(token as Tokens.Codespan).text}</Text>;\r\n case \"link\": {\r\n const link = token as Tokens.Link;\r\n const inner = renderInlineText(link.tokens);\r\n return (\r\n <Text>\r\n {inner}\r\n <Text dimColor color=\"blue\"> ({link.href})</Text>\r\n </Text>\r\n );\r\n }\r\n case \"image\": {\r\n const img = token as Tokens.Image;\r\n return <Text dimColor>[image: {img.text}]</Text>;\r\n }\r\n case \"br\":\r\n return <Text>{\"\\n\"}</Text>;\r\n case \"escape\":\r\n return <Text>{(token as Tokens.Escape).text}</Text>;\r\n case \"html\":\r\n return null;\r\n default:\r\n if (\"text\" in token && typeof token.text === \"string\") {\r\n return <Text>{token.text}</Text>;\r\n }\r\n return null;\r\n }\r\n}\r\n\r\n/* ------------------------------------------------------------------ */\r\n/* Helpers */\r\n/* ------------------------------------------------------------------ */\r\n\r\nconst ANSI_RE = /\\x1B\\[[0-?]*[ -/]*[@-~]/g;\r\nfunction stripAnsi(value: string): string {\r\n return value.replace(ANSI_RE, \"\");\r\n}\r\n\r\nfunction visibleWidth(value: string): number {\r\n // Strip ANSI then sum the display width of each code point so CJK and\r\n // emoji (2 columns) are counted correctly.\r\n let width = 0;\r\n for (const ch of stripAnsi(value)) {\r\n width += charWidth(ch.codePointAt(0) ?? 0);\r\n }\r\n return width;\r\n}\r\n\r\nfunction truncateToWidth(value: string, width: number): string {\r\n if (width <= 0) return \"\";\r\n const stripped = stripAnsi(value);\r\n if (visibleWidth(stripped) <= width) return value;\r\n const prefix = (value.match(/^\\x1B\\[[0-?]*[ -/]*[@-~]*/)?.[0]) ?? \"\";\r\n const suffix = \"\\x1B[0m\";\r\n let out = \"\";\r\n let visual = 0;\r\n for (const ch of stripped) {\r\n const cw = charWidth(ch.codePointAt(0) ?? 0);\r\n if (visual + cw > width - 1) break; // reserve 1 col for \"…\"\r\n out += ch;\r\n visual += cw;\r\n }\r\n return prefix + out + \"…\" + suffix;\r\n}\r\n\r\nfunction renderInlineText(tokens: readonly Token[]): string {\r\n let out = \"\";\r\n for (const tok of tokens) {\r\n out += inlineTokenToString(tok);\r\n }\r\n return out;\r\n}\r\n\r\nfunction inlineTokenToString(token: Token): string {\r\n switch (token.type) {\r\n case \"text\":\r\n return (token as Tokens.Text).raw ?? token.text;\r\n case \"strong\":\r\n return chalk.bold(renderInlineText((token as Tokens.Strong).tokens));\r\n case \"em\":\r\n return chalk.italic(renderInlineText((token as Tokens.Em).tokens));\r\n case \"del\":\r\n return chalk.strikethrough(renderInlineText((token as Tokens.Del).tokens));\r\n case \"codespan\":\r\n return chalk.bgGray.black(` ${(token as Tokens.Codespan).text} `);\r\n case \"escape\":\r\n return (token as Tokens.Escape).text;\r\n case \"br\":\r\n return \"\\n\";\r\n case \"link\": {\r\n const link = token as Tokens.Link;\r\n const inner = renderInlineText(link.tokens);\r\n return `${inner} ${chalk.blue.underline.dim(`(${link.href})`)}`;\r\n }\r\n default:\r\n if (\"text\" in token && typeof token.text === \"string\") return token.text;\r\n return \"\";\r\n }\r\n}\r\n\r\n// visibleWidth now used by truncateToWidth above.\r\n","import chalk from \"chalk\";\n\n// The highlighter is only useful in a context where the output is rendered\n// to a terminal that interprets SGR sequences. Force TrueColor so that the\n// hex palettes below are emitted even when tests / pipeline invocations\n// strip Chalk's TTY detection.\nchalk.level = Math.max(chalk.level, 3) as 0 | 1 | 2 | 3;\n\n/**\n * Lightweight terminal-friendly syntax highlighter.\n *\n * Returns the source code with ANSI escape codes baked in. Designed for\n * rendering as a single string inside an Ink `<Text>` block — no spans, no\n * offsets, no token trees. Adds colour for keywords, strings, comments,\n * numbers, decorators, and function-call identifiers across the most common\n * languages, and gracefully degrades for unknown ones.\n */\n\ntype Lang = \"javascript\" | \"typescript\" | \"python\" | \"bash\" | \"json\" | \"rust\" | \"go\";\n\nconst KEYWORD = chalk.hex(\"#c586c0\");\nconst STRING = chalk.hex(\"#ce9178\");\nconst COMMENT = chalk.gray.italic;\nconst NUMBER = chalk.hex(\"#b5cea8\");\nconst FUNCTION = chalk.hex(\"#dcdcaa\");\nconst ATTRIBUTE = chalk.hex(\"#d7ba7d\");\n\nconst KEYWORDS: Record<Lang, ReadonlySet<string>> = {\n javascript: new Set([\n \"await\", \"async\", \"break\", \"case\", \"catch\", \"class\", \"const\", \"continue\",\n \"default\", \"delete\", \"do\", \"else\", \"export\", \"extends\", \"finally\", \"for\", \"from\",\n \"function\", \"if\", \"import\", \"in\", \"instanceof\", \"let\", \"new\", \"of\", \"return\",\n \"static\", \"super\", \"switch\", \"this\", \"throw\", \"true\", \"false\", \"null\", \"try\",\n \"typeof\", \"undefined\", \"var\", \"void\", \"while\", \"with\", \"yield\",\n ]),\n typescript: new Set([\n \"abstract\", \"any\", \"as\", \"async\", \"await\", \"boolean\", \"break\", \"case\", \"catch\",\n \"class\", \"const\", \"constructor\", \"continue\", \"declare\", \"default\", \"delete\",\n \"do\", \"else\", \"enum\", \"export\", \"extends\", \"false\", \"finally\", \"for\", \"from\",\n \"function\", \"get\", \"if\", \"implements\", \"import\", \"in\", \"instanceof\", \"interface\",\n \"is\", \"keyof\", \"let\", \"namespace\", \"never\", \"new\", \"null\", \"number\", \"object\",\n \"of\", \"private\", \"protected\", \"public\", \"readonly\", \"return\", \"set\", \"static\",\n \"string\", \"super\", \"switch\", \"this\", \"throw\", \"true\", \"try\", \"type\", \"typeof\",\n \"undefined\", \"unique\", \"unknown\", \"var\", \"void\", \"while\", \"with\", \"yield\",\n ]),\n python: new Set([\n \"False\", \"None\", \"True\", \"and\", \"as\", \"assert\", \"async\", \"await\", \"break\",\n \"class\", \"continue\", \"def\", \"del\", \"elif\", \"else\", \"except\", \"finally\",\n \"for\", \"from\", \"global\", \"if\", \"import\", \"in\", \"is\", \"lambda\", \"nonlocal\",\n \"not\", \"or\", \"pass\", \"raise\", \"return\", \"try\", \"while\", \"with\", \"yield\", \"self\",\n ]),\n bash: new Set([\n \"if\", \"then\", \"else\", \"elif\", \"fi\", \"for\", \"while\", \"until\", \"do\", \"done\",\n \"case\", \"esac\", \"in\", \"function\", \"return\", \"export\", \"local\", \"echo\",\n \"printf\", \"test\",\n ]),\n json: new Set([\"true\", \"false\", \"null\"]),\n rust: new Set([\n \"as\", \"async\", \"await\", \"break\", \"const\", \"continue\", \"crate\", \"dyn\", \"else\",\n \"enum\", \"extern\", \"false\", \"fn\", \"for\", \"if\", \"impl\", \"in\", \"let\", \"loop\",\n \"match\", \"mod\", \"move\", \"mut\", \"pub\", \"ref\", \"return\", \"self\", \"Self\", \"static\",\n \"struct\", \"super\", \"trait\", \"true\", \"type\", \"unsafe\", \"use\", \"where\", \"while\",\n ]),\n go: new Set([\n \"break\", \"case\", \"chan\", \"const\", \"continue\", \"default\", \"defer\", \"else\",\n \"fallthrough\", \"for\", \"func\", \"go\", \"goto\", \"if\", \"import\", \"interface\", \"map\",\n \"package\", \"range\", \"return\", \"select\", \"struct\", \"switch\", \"type\", \"var\",\n \"true\", \"false\", \"nil\",\n ]),\n};\n\nfunction normalizeLanguage(input: string | undefined): Lang | undefined {\n if (input === undefined) return undefined;\n const lower = input.trim().toLowerCase();\n switch (lower) {\n case \"js\": case \"jsx\": case \"javascript\": return \"javascript\";\n case \"ts\": case \"tsx\": case \"typescript\": return \"typescript\";\n case \"py\": case \"python\": return \"python\";\n case \"sh\": case \"shell\": case \"bash\": case \"zsh\": return \"bash\";\n case \"json\": return \"json\";\n case \"rs\": case \"rust\": return \"rust\";\n case \"go\": case \"golang\": return \"go\";\n default: return undefined;\n }\n}\n\nfunction isIdentifierStart(ch: string): boolean {\n return /[A-Za-z_]/.test(ch) || ch === \"@\";\n}\n\nfunction isIdentifierPart(ch: string): boolean {\n return /[A-Za-z0-9_]/.test(ch);\n}\n\nfunction isDigit(ch: string): boolean {\n return ch >= \"0\" && ch <= \"9\";\n}\n\nfunction isNumberPrefix(line: string, i: number): boolean {\n const ch = line[i] ?? \"\";\n if (isDigit(ch)) return true;\n if (ch === \".\" && isDigit(line[i + 1] ?? \"\")) return true;\n if (ch === \"0\" && (line[i + 1] === \"x\" || line[i + 1] === \"X\")) return true;\n return false;\n}\n\nfunction readNumberToken(line: string, i: number): number {\n let j = i + 1;\n const len = line.length;\n while (j < len) {\n const cj = line[j] ?? \"\";\n if (isDigit(cj)) { j += 1; continue; }\n if (cj === \".\" && isDigit(line[j + 1] ?? \"\")) { j += 1; continue; }\n if (cj === \"_\") { j += 1; continue; }\n if ((cj === \"e\" || cj === \"E\") && /[+\\-0-9]/.test(line[j + 1] ?? \"\")) {\n j += 1;\n if (line[j] === \"+\" || line[j] === \"-\") j += 1;\n while (j < len && isDigit(line[j] ?? \"\")) j += 1;\n continue;\n }\n break;\n }\n return j;\n}\n\nfunction readIdentifierToken(line: string, i: number): number {\n let j = i + 1;\n while (j < line.length && isIdentifierPart(line[j] ?? \"\")) j += 1;\n return j;\n}\n\nfunction readStringToken(line: string, i: number): number {\n const quote = line[i] ?? \"\";\n let j = i + 1;\n const len = line.length;\n while (j < len) {\n const cj = line[j] ?? \"\";\n if (cj === \"\\\\\") { j += 2; continue; }\n if (cj === quote) { j += 1; return j; }\n j += 1;\n }\n return j;\n}\n\nfunction readBlockCommentToken(line: string, i: number): number {\n let j = i + 2;\n const len = line.length;\n while (j < len) {\n if (line[j] === \"*\" && line[j + 1] === \"/\") return j + 2;\n j += 1;\n }\n return len;\n}\n\nfunction highlightSingleLine(line: string, keywords: ReadonlySet<string>): string {\n const tokens: Array<{ text: string; paint: (s: string) => string }> = [];\n let i = 0;\n const len = line.length;\n\n // Determine line-comment opener for this language.\n const commentStart = (line[0] === \"#\");\n\n while (i < len) {\n const ch = line[i] ?? \"\";\n\n // Block comment /* ... */\n if (ch === \"/\" && line[i + 1] === \"*\") {\n const end = readBlockCommentToken(line, i);\n tokens.push({ text: line.slice(i, end), paint: COMMENT });\n i = end;\n continue;\n }\n\n // Line comments.\n if (commentStart && ch === \"#\") {\n tokens.push({ text: line.slice(i), paint: COMMENT });\n i = len;\n continue;\n }\n if (ch === \"/\" && line[i + 1] === \"/\") {\n tokens.push({ text: line.slice(i), paint: COMMENT });\n i = len;\n continue;\n }\n\n // Strings.\n if (ch === \"'\" || ch === '\"' || ch === \"`\") {\n const end = readStringToken(line, i);\n tokens.push({ text: line.slice(i, end), paint: STRING });\n i = end;\n continue;\n }\n\n // Numbers.\n if (isNumberPrefix(line, i)) {\n const end = readNumberToken(line, i);\n tokens.push({ text: line.slice(i, end), paint: NUMBER });\n i = end;\n continue;\n }\n\n // Identifiers / keywords / decorators.\n if (isIdentifierStart(ch)) {\n const end = readIdentifierToken(line, i);\n const word = line.slice(i, end);\n if (ch === \"@\") {\n tokens.push({ text: word, paint: ATTRIBUTE });\n } else if (keywords.has(word)) {\n tokens.push({ text: word, paint: KEYWORD });\n } else if (line[end] === \"(\") {\n tokens.push({ text: word, paint: FUNCTION });\n } else {\n tokens.push({ text: word, paint: (s) => s });\n }\n i = end;\n continue;\n }\n\n // Single-char punctuation / operator: capture run of similar punctuation.\n let j = i + 1;\n while (j < len) {\n const cj = line[j] ?? \"\";\n if (isIdentifierStart(cj) || isDigit(cj) || cj === \"'\" || cj === '\"' || cj === \"`\" || cj === \"@\" || cj === \"/\") break;\n j += 1;\n }\n tokens.push({ text: line.slice(i, j), paint: (s) => s });\n i = j;\n }\n\n let out = \"\";\n for (const token of tokens) {\n out += token.paint(token.text);\n }\n return out;\n}\n\n/**\n * Apply terminal ANSI styling to a code block body. Returns a string with\n * embedded escape codes; pass directly to a terminal renderer.\n */\nexport function highlightCode(source: string, language: string | undefined = undefined): string {\n if (source.length === 0) return \"\";\n const lang = normalizeLanguage(language);\n const keywords = lang !== undefined ? KEYWORDS[lang] : KEYWORDS.javascript;\n // For unknown languages we still highlight comments, strings, and numbers\n // (using a JS-flavoured fallback so `//` and quotes still receive colour).\n return source.split(\"\\n\").map((line) => highlightSingleLine(line, keywords)).join(\"\\n\");\n}\n","/**\n * Return the display width of a Unicode code point in a fixed-width terminal.\n *\n * - 2 for CJK ideographs, fullwidth forms, Hangul, Kana, and most emoji.\n * - 0 for combining marks, zero-width joiners, and other invisible characters.\n * - 1 for everything else (ASCII, Latin, Cyrillic, etc.).\n *\n * This is a heuristic based on Unicode East Asian Width conventions. It covers\n * the most common ranges and is intentionally zero-dependency so it stays fast\n * and reviewable.\n */\nexport function charWidth(codePoint: number): number {\n // Zero-width characters\n if (\n codePoint === 0x200B || // ZERO WIDTH SPACE\n codePoint === 0x200C || // ZERO WIDTH NON-JOINER\n codePoint === 0x200D || // ZERO WIDTH JOINER\n codePoint === 0xFEFF || // BOM / ZERO WIDTH NO-BREAK SPACE\n (codePoint >= 0x0300 && codePoint <= 0x036F) || // Combining Diacritical Marks\n (codePoint >= 0x0483 && codePoint <= 0x0489) || // Cyrillic combining marks\n (codePoint >= 0x0591 && codePoint <= 0x05BD) || // Hebrew combining marks\n (codePoint >= 0x0610 && codePoint <= 0x061A) || // Arabic combining marks\n (codePoint >= 0x064B && codePoint <= 0x065F) || // Arabic combining marks\n (codePoint >= 0x0670 && codePoint <= 0x0670) || // Arabic combining marks\n (codePoint >= 0x06D6 && codePoint <= 0x06DC) || // Arabic combining marks\n (codePoint >= 0x06DF && codePoint <= 0x06E4) || // Arabic combining marks\n (codePoint >= 0x06E7 && codePoint <= 0x06E8) || // Arabic combining marks\n (codePoint >= 0x06EA && codePoint <= 0x06ED) || // Arabic combining marks\n (codePoint >= 0x0711 && codePoint <= 0x0711) || // Syriac combining marks\n (codePoint >= 0x0730 && codePoint <= 0x074A) || // Syriac combining marks\n (codePoint >= 0x07A6 && codePoint <= 0x07B0) || // Thaana combining marks\n (codePoint >= 0x0900 && codePoint <= 0x0902) || // Devanagari combining marks\n (codePoint >= 0x093A && codePoint <= 0x093A) || // Devanagari combining marks\n (codePoint >= 0x093C && codePoint <= 0x093C) || // Devanagari combining marks\n (codePoint >= 0x0941 && codePoint <= 0x0948) || // Devanagari combining marks\n (codePoint >= 0x094D && codePoint <= 0x094D) || // Devanagari combining marks\n (codePoint >= 0x0951 && codePoint <= 0x0957) || // Devanagari combining marks\n (codePoint >= 0x0962 && codePoint <= 0x0963) || // Devanagari combining marks\n (codePoint >= 0x0981 && codePoint <= 0x0981) || // Bengali combining marks\n (codePoint >= 0x09BC && codePoint <= 0x09BC) || // Bengali combining marks\n (codePoint >= 0x09C1 && codePoint <= 0x09C4) || // Bengali combining marks\n (codePoint >= 0x09CD && codePoint <= 0x09CD) || // Bengali combining marks\n (codePoint >= 0x09E2 && codePoint <= 0x09E3) || // Bengali combining marks\n (codePoint >= 0x0A01 && codePoint <= 0x0A02) || // Gurmukhi combining marks\n (codePoint >= 0x0A3C && codePoint <= 0x0A3C) || // Gurmukhi combining marks\n (codePoint >= 0x0A41 && codePoint <= 0x0A42) || // Gurmukhi combining marks\n (codePoint >= 0x0A47 && codePoint <= 0x0A48) || // Gurmukhi combining marks\n (codePoint >= 0x0A4B && codePoint <= 0x0A4D) || // Gurmukhi combining marks\n (codePoint >= 0x0A70 && codePoint <= 0x0A71) || // Gurmukhi combining marks\n (codePoint >= 0x0A81 && codePoint <= 0x0A82) || // Gujarati combining marks\n (codePoint >= 0x0ABC && codePoint <= 0x0ABC) || // Gujarati combining marks\n (codePoint >= 0x0AC1 && codePoint <= 0x0AC5) || // Gujarati combining marks\n (codePoint >= 0x0AC7 && codePoint <= 0x0AC8) || // Gujarati combining marks\n (codePoint >= 0x0ACD && codePoint <= 0x0ACD) || // Gujarati combining marks\n (codePoint >= 0x0AE2 && codePoint <= 0x0AE3) || // Gujarati combining marks\n (codePoint >= 0x0B01 && codePoint <= 0x0B01) || // Oriya combining marks\n (codePoint >= 0x0B3C && codePoint <= 0x0B3C) || // Oriya combining marks\n (codePoint >= 0x0B3F && codePoint <= 0x0B3F) || // Oriya combining marks\n (codePoint >= 0x0B41 && codePoint <= 0x0B43) || // Oriya combining marks\n (codePoint >= 0x0B4D && codePoint <= 0x0B4D) || // Oriya combining marks\n (codePoint >= 0x0B56 && codePoint <= 0x0B56) || // Oriya combining marks\n (codePoint >= 0x0B82 && codePoint <= 0x0B82) || // Tamil combining marks\n (codePoint >= 0x0BC0 && codePoint <= 0x0BC0) || // Tamil combining marks\n (codePoint >= 0x0BCD && codePoint <= 0x0BCD) || // Tamil combining marks\n (codePoint >= 0x0C3E && codePoint <= 0x0C40) || // Telugu combining marks\n (codePoint >= 0x0C46 && codePoint <= 0x0C48) || // Telugu combining marks\n (codePoint >= 0x0C4A && codePoint <= 0x0C4D) || // Telugu combining marks\n (codePoint >= 0x0C55 && codePoint <= 0x0C56) || // Telugu combining marks\n (codePoint >= 0x0CBC && codePoint <= 0x0CBC) || // Kannada combining marks\n (codePoint >= 0x0CBF && codePoint <= 0x0CBF) || // Kannada combining marks\n (codePoint >= 0x0CC6 && codePoint <= 0x0CC6) || // Kannada combining marks\n (codePoint >= 0x0CCC && codePoint <= 0x0CCD) || // Kannada combining marks\n (codePoint >= 0x0CE2 && codePoint <= 0x0CE3) || // Kannada combining marks\n (codePoint >= 0x0D41 && codePoint <= 0x0D43) || // Malayalam combining marks\n (codePoint >= 0x0D4D && codePoint <= 0x0D4D) || // Malayalam combining marks\n (codePoint >= 0x0DCA && codePoint <= 0x0DCA) || // Sinhala combining marks\n (codePoint >= 0x0DD2 && codePoint <= 0x0DD4) || // Sinhala combining marks\n (codePoint >= 0x0DD6 && codePoint <= 0x0DD6) || // Sinhala combining marks\n (codePoint >= 0x0E31 && codePoint <= 0x0E31) || // Thai combining marks\n (codePoint >= 0x0E34 && codePoint <= 0x0E3A) || // Thai combining marks\n (codePoint >= 0x0E47 && codePoint <= 0x0E4E) || // Thai combining marks\n (codePoint >= 0x0EB1 && codePoint <= 0x0EB1) || // Lao combining marks\n (codePoint >= 0x0EB4 && codePoint <= 0x0EB9) || // Lao combining marks\n (codePoint >= 0x0EBB && codePoint <= 0x0EBC) || // Lao combining marks\n (codePoint >= 0x0EC8 && codePoint <= 0x0ECD) || // Lao combining marks\n (codePoint >= 0x0F18 && codePoint <= 0x0F19) || // Tibetan combining marks\n (codePoint >= 0x0F35 && codePoint <= 0x0F35) || // Tibetan combining marks\n (codePoint >= 0x0F37 && codePoint <= 0x0F37) || // Tibetan combining marks\n (codePoint >= 0x0F39 && codePoint <= 0x0F39) || // Tibetan combining marks\n (codePoint >= 0x0F71 && codePoint <= 0x0F7E) || // Tibetan combining marks\n (codePoint >= 0x0F80 && codePoint <= 0x0F84) || // Tibetan combining marks\n (codePoint >= 0x0F86 && codePoint <= 0x0F87) || // Tibetan combining marks\n (codePoint >= 0x0F90 && codePoint <= 0x0F97) || // Tibetan combining marks\n (codePoint >= 0x0F99 && codePoint <= 0x0FBC) || // Tibetan combining marks\n (codePoint >= 0x0FC6 && codePoint <= 0x0FC6) || // Tibetan combining marks\n (codePoint >= 0x1032 && codePoint <= 0x1037) || // Myanmar combining marks\n (codePoint >= 0x1039 && codePoint <= 0x103A) || // Myanmar combining marks\n (codePoint >= 0x103D && codePoint <= 0x103E) || // Myanmar combining marks\n (codePoint >= 0x1058 && codePoint <= 0x1059) || // Myanmar combining marks\n (codePoint >= 0x105E && codePoint <= 0x1060) || // Myanmar combining marks\n (codePoint >= 0x1071 && codePoint <= 0x1074) || // Myanmar combining marks\n (codePoint >= 0x1082 && codePoint <= 0x1082) || // Myanmar combining marks\n (codePoint >= 0x1085 && codePoint <= 0x1086) || // Myanmar combining marks\n (codePoint >= 0x108D && codePoint <= 0x108D) || // Myanmar combining marks\n (codePoint >= 0x135D && codePoint <= 0x135F) || // Ethiopic combining marks\n (codePoint >= 0x1712 && codePoint <= 0x1714) || // Tagalog combining marks\n (codePoint >= 0x1732 && codePoint <= 0x1734) || // Hanunoo combining marks\n (codePoint >= 0x1752 && codePoint <= 0x1753) || // Buhid combining marks\n (codePoint >= 0x1772 && codePoint <= 0x1773) || // Tagbanwa combining marks\n (codePoint >= 0x17B4 && codePoint <= 0x17B5) || // Khmer combining marks\n (codePoint >= 0x17B7 && codePoint <= 0x17BD) || // Khmer combining marks\n (codePoint >= 0x17C6 && codePoint <= 0x17C6) || // Khmer combining marks\n (codePoint >= 0x17C9 && codePoint <= 0x17D3) || // Khmer combining marks\n (codePoint >= 0x17DD && codePoint <= 0x17DD) || // Khmer combining marks\n (codePoint >= 0x180B && codePoint <= 0x180D) || // Mongolian combining marks\n (codePoint >= 0x18A9 && codePoint <= 0x18A9) || // Mongolian combining marks\n (codePoint >= 0x1920 && codePoint <= 0x1922) || // Limbu combining marks\n (codePoint >= 0x1927 && codePoint <= 0x1928) || // Limbu combining marks\n (codePoint >= 0x1932 && codePoint <= 0x1932) || // Limbu combining marks\n (codePoint >= 0x1939 && codePoint <= 0x193B) || // Limbu combining marks\n (codePoint >= 0x1A17 && codePoint <= 0x1A18) || // Buginese combining marks\n (codePoint >= 0x1B00 && codePoint <= 0x1B03) || // Balinese combining marks\n (codePoint >= 0x1B34 && codePoint <= 0x1B34) || // Balinese combining marks\n (codePoint >= 0x1B36 && codePoint <= 0x1B3A) || // Balinese combining marks\n (codePoint >= 0x1B3C && codePoint <= 0x1B3C) || // Balinese combining marks\n (codePoint >= 0x1B42 && codePoint <= 0x1B42) || // Balinese combining marks\n (codePoint >= 0x1B6B && codePoint <= 0x1B73) || // Balinese combining marks\n (codePoint >= 0x1DC0 && codePoint <= 0x1DFF) || // Combining Diacritical Marks Supplement\n (codePoint >= 0x20D0 && codePoint <= 0x20F0) || // Combining Diacritical Marks for Symbols\n (codePoint >= 0x2CEF && codePoint <= 0x2CF1) || // Coptic combining marks\n (codePoint >= 0x2D7F && codePoint <= 0x2D7F) || // Tifinagh combining marks\n (codePoint >= 0x2DE0 && codePoint <= 0x2DFF) || // Cyrillic Extended-A combining marks\n (codePoint >= 0xA66F && codePoint <= 0xA672) || // Cyrillic Extended-B combining marks\n (codePoint >= 0xA674 && codePoint <= 0xA67D) || // Cyrillic Extended-B combining marks\n (codePoint >= 0xA69E && codePoint <= 0xA69F) || // Cyrillic Extended-B combining marks\n (codePoint >= 0xA6F0 && codePoint <= 0xA6F1) || // Bamum combining marks\n (codePoint >= 0xA802 && codePoint <= 0xA802) || // Syloti Nagri combining marks\n (codePoint >= 0xA806 && codePoint <= 0xA806) || // Syloti Nagri combining marks\n (codePoint >= 0xA80B && codePoint <= 0xA80B) || // Syloti Nagri combining marks\n (codePoint >= 0xA825 && codePoint <= 0xA826) || // Syloti Nagri combining marks\n (codePoint >= 0xA8C4 && codePoint <= 0xA8C4) || // Saurashtra combining marks\n (codePoint >= 0xA8E0 && codePoint <= 0xA8F1) || // Devanagari Extended combining marks\n (codePoint >= 0xA926 && codePoint <= 0xA92D) || // Kayah Li combining marks\n (codePoint >= 0xA947 && codePoint <= 0xA951) || // Rejang combining marks\n (codePoint >= 0xA980 && codePoint <= 0xA982) || // Javanese combining marks\n (codePoint >= 0xA9B3 && codePoint <= 0xA9B3) || // Javanese combining marks\n (codePoint >= 0xA9B6 && codePoint <= 0xA9B9) || // Javanese combining marks\n (codePoint >= 0xA9BC && codePoint <= 0xA9BC) || // Javanese combining marks\n (codePoint >= 0xAA29 && codePoint <= 0xAA2E) || // Cham combining marks\n (codePoint >= 0xAA31 && codePoint <= 0xAA32) || // Cham combining marks\n (codePoint >= 0xAA35 && codePoint <= 0xAA36) || // Cham combining marks\n (codePoint >= 0xAA43 && codePoint <= 0xAA43) || // Cham combining marks\n (codePoint >= 0xAA4C && codePoint <= 0xAA4C) || // Cham combining marks\n (codePoint >= 0xAAB0 && codePoint <= 0xAAB0) || // Tai Viet combining marks\n (codePoint >= 0xAAB2 && codePoint <= 0xAAB4) || // Tai Viet combining marks\n (codePoint >= 0xAAB7 && codePoint <= 0xAAB8) || // Tai Viet combining marks\n (codePoint >= 0xAABE && codePoint <= 0xAABF) || // Tai Viet combining marks\n (codePoint >= 0xAAC1 && codePoint <= 0xAAC1) || // Tai Viet combining marks\n (codePoint >= 0xABE5 && codePoint <= 0xABE5) || // Meetei Mayek combining marks\n (codePoint >= 0xABE8 && codePoint <= 0xABE8) || // Meetei Mayek combining marks\n (codePoint >= 0xABED && codePoint <= 0xABED) || // Meetei Mayek combining marks\n (codePoint >= 0xFB1E && codePoint <= 0xFB1E) || // Hebrew combining marks\n (codePoint >= 0xFE00 && codePoint <= 0xFE0F) || // Variation Selectors\n (codePoint >= 0xFE20 && codePoint <= 0xFE2F) || // Combining Half Marks\n (codePoint >= 0xE0100 && codePoint <= 0xE01EF) // Variation Selectors Supplement\n ) {\n return 0;\n }\n\n // Wide characters (2 columns)\n if (\n (codePoint >= 0x1100 && codePoint <= 0x115F) || // Hangul Jamo\n (codePoint >= 0x2329 && codePoint <= 0x232A) || // Left/Right-pointing angle bracket\n (codePoint >= 0x2E80 && codePoint <= 0x303E) || // CJK Radicals Supplement, Kangxi Radicals, CJK Symbols\n (codePoint >= 0x3040 && codePoint <= 0x33BF) || // Hiragana, Katakana, Bopomofo, Hangul Compatibility, Kanbun, CJK Strokes, Enclosed CJK\n (codePoint >= 0x3400 && codePoint <= 0x4DBF) || // CJK Unified Ideographs Extension A\n (codePoint >= 0x4E00 && codePoint <= 0xA4CF) || // CJK Unified Ideographs, Yi Syllables, Yi Radicals\n (codePoint >= 0xA960 && codePoint <= 0xA97C) || // Hangul Jamo Extended-A\n (codePoint >= 0xAC00 && codePoint <= 0xD7A3) || // Hangul Syllables\n (codePoint >= 0xF900 && codePoint <= 0xFAFF) || // CJK Compatibility Ideographs\n (codePoint >= 0xFE10 && codePoint <= 0xFE19) || // Vertical forms\n (codePoint >= 0xFE30 && codePoint <= 0xFE6F) || // CJK Compatibility Forms, Small Form Variants\n (codePoint >= 0xFF01 && codePoint <= 0xFF60) || // Fullwidth Forms\n (codePoint >= 0xFFE0 && codePoint <= 0xFFE6) || // Fullwidth Signs\n (codePoint >= 0x1B000 && codePoint <= 0x1B2FF) || // Kana Supplement, Kana Extended-A, Small Kana Extension\n (codePoint >= 0x1F004 && codePoint <= 0x1F004) || // Mahjong tile\n (codePoint >= 0x1F0CF && codePoint <= 0x1F0CF) || // Playing card\n (codePoint >= 0x1F100 && codePoint <= 0x1F9FF) || // Enclosed Alphanumeric Supplement, Emoticons, Transport, etc.\n (codePoint >= 0x1FA00 && codePoint <= 0x1FA6F) || // Chess Symbols\n (codePoint >= 0x1FA70 && codePoint <= 0x1FAFF) || // Symbols and Pictographs Extended-A\n (codePoint >= 0x20000 && codePoint <= 0x2FFFD) || // CJK Unified Ideographs Extension B–G, CJK Compatibility Supplement\n (codePoint >= 0x30000 && codePoint <= 0x3FFFD) // CJK Unified Ideographs Extension H\n ) {\n return 2;\n }\n\n // Narrow / neutral characters (1 column)\n return 1;\n}\n","export interface InterruptibleSession { interrupt(): \"cancelled\" | \"exit\" }\n\nexport function createSessionInterruptHandler(\n getSession: () => InterruptibleSession | undefined,\n shutdown: () => void | Promise<void>,\n): () => void {\n return () => {\n if (getSession()?.interrupt() === \"cancelled\") return;\n void shutdown();\n };\n}\n\nexport function installSigintHandler(\n source: { on(event: \"SIGINT\", handler: () => void): unknown; off(event: \"SIGINT\", handler: () => void): unknown },\n handler: () => void,\n): () => void {\n source.on(\"SIGINT\", handler);\n return () => { source.off(\"SIGINT\", handler); };\n}\n","/**\n * Wrap an input string into the available terminal columns for the prompt\n * line. Computes the visual line and column of the cursor so callers can\n * place the inverse cursor in exactly the right cell.\n *\n * Code-point based — full Unicode (emoji, CJK, etc.) is preserved. Column\n * tracking uses {@link charWidth} so CJK ideographs and emoji (2 columns)\n * are accounted for correctly.\n *\n * Exported as a pure helper so it can be unit-tested without rendering.\n */\n\nimport { charWidth } from \"./char-width.js\";\n\nexport interface WrapCursor { line: number; column: number; }\nexport interface WrapPrompt {\n lines: string[];\n cursor: WrapCursor;\n /** Total visual height consumed by the wrapped content (in terminal rows). */\n height: number;\n}\n\nexport interface WrapPromptOptions {\n /** Usable width in columns (terminal width minus the \"› \" prompt gutter). */\n columns: number;\n /** Hint for the prompt's left-side gutter; default 2 (\"› \"). */\n indent?: number;\n}\n\nexport function wrapPromptInput(\n input: string,\n codePointCursor: number,\n options: WrapPromptOptions,\n): WrapPrompt {\n const indent = Math.max(0, options.indent ?? 2);\n const columns = Math.max(1, options.columns);\n const usable = Math.max(1, columns - indent);\n const points = [...input];\n const len = points.length;\n const clamped = Math.max(0, Math.min(len, codePointCursor));\n\n const lines: string[] = [];\n let i = 0;\n while (i < len) {\n let lineVisualWidth = 0;\n const lineStart = i;\n while (i < len) {\n const cp = points[i]!.codePointAt(0) ?? 0;\n const cw = charWidth(cp);\n if (lineVisualWidth + cw > usable) break;\n lineVisualWidth += cw;\n i += 1;\n }\n // Safety: if a single character is wider than the usable width\n // (rare, but prevents an infinite loop on extremely narrow terminals),\n // force it onto its own line.\n if (i === lineStart) i += 1;\n lines.push(points.slice(lineStart, i).join(\"\"));\n }\n if (lines.length === 0) lines.push(\"\");\n\n // Locate the cursor's line + column.\n let cursor: WrapCursor = { line: 0, column: 0 };\n let consumed = 0;\n for (let line = 0; line < lines.length; line += 1) {\n const lineLength = [...lines[line] ?? \"\"].length;\n const next = consumed + lineLength;\n if (clamped <= next) {\n cursor = { line, column: clamped - consumed };\n break;\n }\n consumed = next;\n }\n\n return { lines, cursor, height: lines.length };\n}\n\n/** Compute the inverse-cursor glyph at a given visual position. */\nexport function cursorGlyph(input: string, columns: number, codePointCursor: number, indent = 2): {\n line: string;\n column: number;\n glyph: string;\n remainder: string;\n prefix: string;\n} {\n const wrap = wrapPromptInput(input, codePointCursor, { columns, indent });\n const idx = wrap.cursor.line;\n const lines = wrap.lines;\n const line = lines[idx] ?? \"\";\n const points = [...line];\n const col = wrap.cursor.column;\n const prefix = points.slice(0, col).join(\"\");\n const glyph = points[col] ?? \" \";\n const remainder = points.slice(col + 1).join(\"\");\n return { line, column: col, glyph, remainder, prefix };\n}\n","import React, { useRef, type Ref } from \"react\";\n\nimport { Box, ScrollBox, Text, type ScrollBoxHandle } from \"../claude-ink/index.js\";\nimport { useAnimationFrame } from \"../claude-ink/hooks/use-animation-frame.js\";\nimport type { TranscriptBlock } from \"./transcript.js\";\nimport { statusPresentation } from \"./task-progress-model.js\";\n\nexport interface TaskStatusLineProps {\n block: Extract<TranscriptBlock, { kind: \"status\" }>;\n interactive: boolean;\n}\n\nexport function TaskStatusLine({ block, interactive }: TaskStatusLineProps): React.JSX.Element {\n const running = block.state === \"running\";\n const foreground = interactive && (block.activity === \"model\" || block.task?.role === \"main\");\n const [ref, time] = useAnimationFrame(running && foreground ? 120 : null);\n const startedAt = useRef<number | undefined>(undefined);\n const previousState = useRef(block.state);\n if (running && (startedAt.current === undefined || previousState.current !== \"running\")) startedAt.current = time;\n if (!running) startedAt.current = undefined;\n previousState.current = block.state;\n const elapsed = block.startedAt === undefined\n ? startedAt.current === undefined ? 0 : Math.max(0, time - startedAt.current)\n : Math.max(0, Date.now() - block.startedAt);\n const presentation = statusPresentation(block, elapsed, foreground);\n\n // Split the text so the status word can be colorized independently.\n const { statusLabel, statusColor, text } = presentation;\n let before = text;\n let after = \"\";\n if (statusLabel !== undefined) {\n const marker = ` · ${statusLabel}`;\n const idx = before.indexOf(marker);\n if (idx >= 0) {\n after = before.slice(idx + marker.length);\n before = before.slice(0, idx);\n }\n }\n\n return <Box ref={ref} flexDirection=\"row\">\n <Text {...(presentation.color === undefined ? {} : { color: presentation.color })}>\n {presentation.glyph}{\" \"}\n </Text>\n {presentation.badge ? <Text color={presentation.badgeColor}>{presentation.badge} </Text> : null}\n <Text {...(presentation.color === undefined ? {} : { color: presentation.color })}>\n {before}\n </Text>\n {statusLabel !== undefined ? (\n <>\n <Text {...(presentation.color === undefined ? {} : { color: presentation.color })}> · </Text>\n <Text color={statusColor ?? presentation.color}>{statusLabel}</Text>\n </>\n ) : null}\n {after ? <Text {...(presentation.color === undefined ? {} : { color: presentation.color })}>{after}</Text> : null}\n </Box>;\n}\n\nexport type TaskBlock = Extract<TranscriptBlock, { kind: \"status\" }>;\n\nexport interface TaskProgressPanelProps {\n blocks: TaskBlock[];\n interactive: boolean;\n maxHeight?: number;\n scrollRef?: Ref<ScrollBoxHandle>;\n onHoverChange?: (hovered: boolean) => void;\n}\n\nexport function TaskProgressPanel({\n blocks,\n interactive,\n maxHeight = 8,\n scrollRef,\n onHoverChange,\n}: TaskProgressPanelProps): React.JSX.Element | null {\n if (blocks.length === 0 || maxHeight <= 0) return null;\n return <Box\n flexDirection=\"column\"\n flexShrink={0}\n maxHeight={maxHeight}\n onMouseEnter={() => onHoverChange?.(true)}\n onMouseLeave={() => onHoverChange?.(false)}\n >\n <Text dimColor>── task progress ──</Text>\n {maxHeight > 1 ? <ScrollBox\n {...(scrollRef === undefined ? {} : { ref: scrollRef })}\n flexDirection=\"column\"\n flexShrink={1}\n maxHeight={maxHeight - 1}\n >\n {blocks.map((block) => (\n <TaskStatusLine key={block.id} block={block} interactive={interactive} />\n ))}\n </ScrollBox> : null}\n </Box>;\n}\n","import type { FileDiffLine } from \"../tools/types.js\";\n\nexport interface FileDiffLineStyle {\n backgroundColor?: string;\n markerColor: string;\n contentColor: string;\n}\n\nconst CONTENT = \"#f8f8f2\";\n\nexport function fileDiffLineStyle(kind: FileDiffLine[\"kind\"]): FileDiffLineStyle {\n if (kind === \"removed\") {\n return { backgroundColor: \"#3d0100\", markerColor: \"#ff5f56\", contentColor: CONTENT };\n }\n if (kind === \"added\") {\n return { backgroundColor: \"#022800\", markerColor: \"#50c878\", contentColor: CONTENT };\n }\n return { markerColor: CONTENT, contentColor: CONTENT };\n}\n","export type SlashCandidateKind = \"command\" | \"plugin\" | \"skill\";\n\nexport interface SlashCandidate {\n name: string;\n kind: SlashCandidateKind;\n description?: string;\n source?: string;\n}\n\nexport interface SlashCompletion {\n query: string;\n items: SlashCandidate[];\n selectedIndex: number;\n windowStart: number;\n}\n\nexport interface SlashCandidatePresentation {\n marker: \"› \" | \" \";\n rowStyle: Record<string, never>;\n matchStyle: { color: \"ansi:cyan\"; bold: true };\n}\n\nexport function slashCandidatePresentation(selected: boolean): SlashCandidatePresentation {\n return {\n marker: selected ? \"› \" : \" \",\n rowStyle: {},\n matchStyle: { color: \"ansi:cyan\", bold: true },\n };\n}\n\nexport function buildSlashCandidates(\n commands: readonly { name: string; description: string }[],\n plugins: readonly string[],\n skills: readonly { name: string; description: string; source: string }[],\n): SlashCandidate[] {\n const candidates = new Map<string, SlashCandidate>();\n for (const command of commands) {\n candidates.set(command.name, { name: command.name, kind: \"command\", description: command.description });\n }\n for (const name of plugins) {\n if (!candidates.has(name)) candidates.set(name, { name, kind: \"plugin\" });\n }\n for (const skill of skills) {\n if (!candidates.has(skill.name)) {\n candidates.set(skill.name, {\n name: skill.name,\n kind: \"skill\",\n description: skill.description,\n source: skill.source,\n });\n }\n }\n return [...candidates.values()];\n}\n\nexport function completedSlashTokenLength(\n input: string,\n candidates: readonly SlashCandidate[],\n menuOpen: boolean,\n): number {\n if (menuOpen) return 0;\n const points = [...input];\n if (points[0] !== \"/\") return 0;\n const whitespace = points.findIndex((point) => /\\s/u.test(point));\n let tokenEnd = whitespace < 0 ? points.length : whitespace;\n const name = points.slice(1, tokenEnd).join(\"\");\n const matches = candidates.some((candidate) => candidate.name === name);\n return matches ? tokenEnd : 0;\n}\n\nexport function completedSlashTokenPresentation(): { color: \"rgb(120,155,255)\"; bold: true } {\n return { color: \"rgb(120,155,255)\", bold: true };\n}\n\nexport function deriveSlashCompletion(\n input: string,\n cursor: number,\n candidates: readonly SlashCandidate[],\n selectedIndex: number,\n visibleLimit = 6,\n): SlashCompletion | null {\n const points = [...input];\n const safeCursor = Math.max(0, Math.min(points.length, cursor));\n if (points[0] !== \"/\") return null;\n const whitespace = points.findIndex((point) => /\\s/u.test(point));\n const tokenEnd = whitespace < 0 ? points.length : whitespace;\n if (safeCursor < 1 || safeCursor > tokenEnd) return null;\n\n const query = points.slice(1, tokenEnd).join(\"\");\n const normalized = query.toLowerCase();\n const items = candidates\n .filter(({ name }) => name.toLowerCase().includes(normalized))\n .sort((left, right) => {\n const leftPrefix = left.name.toLowerCase().startsWith(normalized);\n const rightPrefix = right.name.toLowerCase().startsWith(normalized);\n if (leftPrefix !== rightPrefix) return leftPrefix ? -1 : 1;\n return left.name.localeCompare(right.name);\n });\n if (items.length === 0) return null;\n\n const selected = Math.max(0, Math.min(items.length - 1, selectedIndex));\n const limit = Math.max(1, visibleLimit);\n const windowStart = Math.max(0, Math.min(selected, items.length - limit));\n return { query, items, selectedIndex: selected, windowStart };\n}\n\nexport function moveSlashSelection(index: number, delta: -1 | 1, count: number): number {\n if (count <= 0) return 0;\n return (index + delta + count) % count;\n}\n\nexport function completeSlashSelection(\n input: string,\n cursor: number,\n name: string,\n): { text: string; cursor: number } {\n const points = [...input];\n const safeCursor = Math.max(0, Math.min(points.length, cursor));\n const tokenEndOffset = points.slice(safeCursor).findIndex((point) => /\\s/u.test(point));\n const tokenEnd = tokenEndOffset < 0 ? points.length : safeCursor + tokenEndOffset;\n const suffix = points.slice(tokenEnd).join(\"\").replace(/^\\s*/u, \"\");\n const prefix = `/${name} `;\n return { text: prefix + suffix, cursor: [...prefix].length };\n}\n\nexport function removeCompletedSlashSelection(\n input: string,\n tokenLength: number,\n cursor: number,\n): { text: string; cursor: number } | null {\n if (tokenLength <= 0) return null;\n const points = [...input];\n const safeTokenLength = Math.min(points.length, tokenLength);\n const safeCursor = Math.max(safeTokenLength, Math.min(points.length, cursor));\n const textBetweenTokenAndCursor = points.slice(safeTokenLength, safeCursor).join(\"\");\n if (!/^\\s*$/u.test(textBetweenTokenAndCursor)) return null;\n\n return {\n text: points.slice(safeCursor).join(\"\"),\n cursor: 0,\n };\n}\n\nexport function matchRanges(value: string, query: string): Array<[number, number]> {\n if (query.length === 0) return [];\n const normalizedValue = value.toLowerCase();\n const normalizedQuery = query.toLowerCase();\n const ranges: Array<[number, number]> = [];\n let start = 0;\n while (start < normalizedValue.length) {\n const index = normalizedValue.indexOf(normalizedQuery, start);\n if (index < 0) break;\n ranges.push([index, index + normalizedQuery.length]);\n start = index + normalizedQuery.length;\n }\n return ranges;\n}\n","export const COMPACT_PROGRESS_CELLS = 10;\nexport const COMPACT_PROGRESS_COMPLETE = \"#5b8cff\";\nexport const COMPACT_PROGRESS_REMAINING = \"#525761\";\n\nexport interface CompactProgressPresentation {\n progress: number;\n cells: Array<{ completed: boolean; color: string }>;\n}\n\nexport function compactProgressPresentation(progress: number): CompactProgressPresentation {\n const normalized = Math.max(0, Math.min(100, Math.floor(progress / 10) * 10));\n const completed = normalized / 10;\n return {\n progress: normalized,\n cells: Array.from({ length: COMPACT_PROGRESS_CELLS }, (_, index) => ({\n completed: index < completed,\n color: index < completed ? COMPACT_PROGRESS_COMPLETE : COMPACT_PROGRESS_REMAINING,\n })),\n };\n}\n","function basename(path: string): string {\n const normalized = path.replaceAll(\"\\\\\", \"/\");\n const index = normalized.lastIndexOf(\"/\");\n return index < 0 ? path : normalized.slice(index + 1);\n}\n\nexport interface MentionCompletion {\n query: string;\n items: string[];\n selectedIndex: number;\n windowStart: number;\n}\n\nexport interface MentionCandidatePresentation {\n marker: \"› \" | \" \";\n textStyle: Record<string, never> | { color: \"rgb(120,155,255)\"; bold: true };\n highlightMatches: boolean;\n matchStyle: { color: \"ansi:cyan\"; bold: true };\n}\n\nexport function mentionCandidatePresentation(selected: boolean): MentionCandidatePresentation {\n if (selected) {\n const selectedText = { color: \"rgb(120,155,255)\", bold: true } as const;\n return {\n marker: \"› \",\n textStyle: selectedText,\n highlightMatches: false,\n matchStyle: { color: \"ansi:cyan\", bold: true },\n };\n }\n return {\n marker: \" \",\n textStyle: {},\n highlightMatches: true,\n matchStyle: { color: \"ansi:cyan\", bold: true },\n };\n}\n\ninterface MentionToken {\n start: number;\n end: number;\n query: string;\n}\n\nexport function buildMentionCandidates(paths: readonly string[]): string[] {\n return [...new Set(paths.map((path) => path.replaceAll(\"\\\\\", \"/\")))]\n .sort(comparePaths);\n}\n\nexport function deriveMentionCompletion(\n input: string,\n cursor: number,\n candidates: readonly string[],\n selectedIndex: number,\n visibleLimit = 6,\n): MentionCompletion | null {\n const token = mentionTokenAtCursor(input, cursor);\n if (token === null) return null;\n const normalizedQuery = token.query.toLowerCase();\n const items = candidates\n .filter((path) => path.toLowerCase().includes(normalizedQuery))\n .sort((left, right) => {\n const rankDelta = mentionRank(left, normalizedQuery) - mentionRank(right, normalizedQuery);\n return rankDelta || comparePaths(left, right);\n });\n if (items.length === 0) return null;\n\n const selected = Math.max(0, Math.min(items.length - 1, selectedIndex));\n const limit = Math.max(1, visibleLimit);\n const windowStart = Math.max(0, Math.min(selected, items.length - limit));\n return { query: token.query, items, selectedIndex: selected, windowStart };\n}\n\nexport function moveMentionSelection(index: number, delta: -1 | 1, count: number): number {\n if (count <= 0) return 0;\n return (index + delta + count) % count;\n}\n\nexport function completeMentionSelection(\n input: string,\n cursor: number,\n path: string,\n): { text: string; cursor: number; span?: { start: number; end: number } } {\n const points = [...input];\n const token = mentionTokenAtCursor(input, cursor);\n const safeCursor = Math.max(0, Math.min(points.length, cursor));\n if (token === null) return { text: input, cursor: safeCursor };\n\n const escapedPath = path.replaceAll(\"\\\\\", \"/\").replaceAll(\" \", \"\\\\ \");\n const inserted = `@${escapedPath} `;\n const prefix = points.slice(0, token.start).join(\"\");\n const suffix = points.slice(token.end).join(\"\").replace(/^\\s*/u, \"\");\n return {\n text: prefix + inserted + suffix,\n cursor: [...prefix + inserted].length,\n span: { start: [...prefix].length, end: [...prefix + inserted].length },\n };\n}\n\nfunction mentionTokenAtCursor(input: string, cursor: number): MentionToken | null {\n const points = [...input];\n const safeCursor = Math.max(0, Math.min(points.length, cursor));\n let start = safeCursor;\n while (start > 0 && !isTokenBoundary(points, start - 1)) start -= 1;\n if (points[start] !== \"@\" || safeCursor <= start) return null;\n\n let end = safeCursor;\n while (end < points.length && !isTokenBoundary(points, end)) end += 1;\n return {\n start,\n end,\n query: unescapeQuery(points.slice(start + 1, end).join(\"\")),\n };\n}\n\nfunction isTokenBoundary(points: readonly string[], index: number): boolean {\n if (!/\\s/u.test(points[index] ?? \"\")) return false;\n let slashCount = 0;\n for (let cursor = index - 1; cursor >= 0 && points[cursor] === \"\\\\\"; cursor -= 1) slashCount += 1;\n return slashCount % 2 === 0;\n}\n\nfunction unescapeQuery(value: string): string {\n return value.replace(/\\\\(\\s)/gu, \"$1\");\n}\n\nfunction mentionRank(path: string, query: string): number {\n const normalizedPath = path.toLowerCase();\n const filename = basename(normalizedPath);\n if (filename.startsWith(query)) return 0;\n if (normalizedPath.startsWith(query)) return 1;\n return 2;\n}\n\nfunction comparePaths(left: string, right: string): number {\n return left.localeCompare(right, \"en\");\n}\n","import React from \"react\";\n\nimport { Box, Text } from \"../claude-ink/index.js\";\n\nexport interface WelcomeCardProps {\n model: string;\n serviceName?: string;\n workspaceName: string;\n columns: number;\n}\n\nconst WIDE_WELCOME_COLUMNS = 72;\nconst FLAVOR_ACCENT = \"#67D4FF\";\nconst FLAVOR_WORDMARK = [\n \"┌─┐┬ ┌─┐┬ ┬┌─┐┬─┐\",\n \"├┤ │ ├─┤└┐┌┘│ │├┬┘\",\n \"└ ┴─┘┴ ┴ └┘ └─┘┴└─\",\n].join(\"\\n\");\n\nexport function WelcomeCard({ model, serviceName, workspaceName, columns }: WelcomeCardProps): React.JSX.Element {\n const wide = Math.max(1, Math.floor(columns)) >= WIDE_WELCOME_COLUMNS;\n\n return <Box width=\"100%\" borderStyle=\"round\" borderColor=\"yellow\" paddingX={1}>\n {wide ? <Box width=\"100%\" flexDirection=\"row\">\n <Box\n width=\"36%\"\n flexDirection=\"column\"\n alignItems=\"center\"\n borderStyle=\"single\"\n borderTop={false}\n borderBottom={false}\n borderLeft={false}\n borderColor=\"yellow\"\n paddingRight={1}\n >\n <Text bold color=\"yellowBright\">Welcome back!</Text>\n <Text color={FLAVOR_ACCENT}>{FLAVOR_WORDMARK}</Text>\n {serviceName === undefined ? null : <Text color=\"cyan\" wrap=\"truncate-end\">{serviceName}</Text>}\n <Text dimColor wrap=\"truncate-end\">{model}</Text>\n <Text dimColor wrap=\"truncate-end\">{workspaceName}</Text>\n </Box>\n <Box flexGrow={1} flexDirection=\"column\" paddingLeft={1}>\n <Text bold color=\"yellowBright\">Tips for getting started</Text>\n <Text>Run <Text color=\"cyan\">/init</Text> to create or refresh FLAVOR.md</Text>\n <Text>Type <Text color=\"cyan\">@</Text> to attach a project file</Text>\n <Box height={1} />\n <Text bold color=\"yellowBright\">Quick commands</Text>\n <Text>\n <Text color=\"cyan\">/help</Text>{\" · \"}\n <Text color=\"cyan\">/config</Text>{\" · \"}\n <Text color=\"cyan\">/tasks</Text>\n </Text>\n </Box>\n </Box> : <Box width=\"100%\" flexDirection=\"column\">\n <Text bold color={FLAVOR_ACCENT}>◆ Flavor Code</Text>\n <Text>Welcome back!</Text>\n <Text dimColor wrap=\"truncate-end\">{model}{\" · \"}{workspaceName}</Text>\n <Text><Text color=\"cyan\">/init</Text>{\" setup · \"}<Text color=\"cyan\">/help</Text>{\" commands\"}</Text>\n </Box>}\n </Box>;\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { mkdir, open, rename, rm } from \"node:fs/promises\";\nimport { basename, join, resolve } from \"node:path\";\n\nimport type { ModelImageContentBlock, ModelImageMediaType } from \"../models/types.js\";\n\nexport const DEFAULT_MAX_IMAGES = 5;\nexport const DEFAULT_MAX_IMAGE_BYTES = 5 * 1024 * 1024;\nexport const DEFAULT_MAX_TOTAL_IMAGE_BYTES = 20 * 1024 * 1024;\n\nconst SESSION_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;\nconst BASE64 = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;\n\nexport interface ImageAttachmentInput {\n name: string;\n mediaType: ModelImageMediaType;\n dataBase64: string;\n}\n\nexport interface SessionAssetStoreOptions {\n workspace: string;\n maxImages?: number;\n maxImageBytes?: number;\n maxTotalBytes?: number;\n}\n\nexport class SessionAssetStore {\n readonly #root: string;\n readonly #maxImages: number;\n readonly #maxImageBytes: number;\n readonly #maxTotalBytes: number;\n\n constructor(options: SessionAssetStoreOptions) {\n this.#root = join(resolve(options.workspace), \".flavor\", \"session-assets\");\n this.#maxImages = positiveInteger(options.maxImages ?? DEFAULT_MAX_IMAGES, \"maxImages\");\n this.#maxImageBytes = positiveInteger(options.maxImageBytes ?? DEFAULT_MAX_IMAGE_BYTES, \"maxImageBytes\");\n this.#maxTotalBytes = positiveInteger(options.maxTotalBytes ?? DEFAULT_MAX_TOTAL_IMAGE_BYTES, \"maxTotalBytes\");\n }\n\n async store(sessionId: string, inputs: readonly ImageAttachmentInput[]): Promise<ModelImageContentBlock[]> {\n if (!SESSION_ID.test(sessionId)) throw new Error(\"Invalid session id\");\n if (inputs.length > this.#maxImages) {\n throw new Error(`A prompt can contain at most ${this.#maxImages} images`);\n }\n const decoded = inputs.map((input) => decodeAttachment(input, this.#maxImageBytes));\n const total = decoded.reduce((sum, item) => sum + item.data.byteLength, 0);\n if (total > this.#maxTotalBytes) {\n throw new Error(`Image attachments exceed the maximum total size of ${this.#maxTotalBytes} bytes`);\n }\n if (decoded.length === 0) return [];\n\n const directory = join(this.#root, sessionId);\n await mkdir(directory, { recursive: true, mode: 0o700 });\n const output: ModelImageContentBlock[] = [];\n for (const item of decoded) {\n const sha256 = createHash(\"sha256\").update(item.data).digest(\"hex\");\n const target = join(directory, `${sha256}${extension(item.mediaType)}`);\n await writeOnce(target, item.data);\n output.push({\n type: \"image\",\n source: { type: \"file\", path: target },\n mediaType: item.mediaType,\n sha256,\n bytes: item.data.byteLength,\n name: safeName(item.name),\n });\n }\n return output;\n }\n}\n\nfunction decodeAttachment(input: ImageAttachmentInput, maxBytes: number): ImageAttachmentInput & { data: Buffer } {\n if (!input.name || input.name.length > 255) throw new Error(\"Image name must be between 1 and 255 characters\");\n if (![\"image/png\", \"image/jpeg\", \"image/webp\"].includes(input.mediaType)) {\n throw new Error(`Unsupported image media type: ${String(input.mediaType)}`);\n }\n if (!input.dataBase64 || !BASE64.test(input.dataBase64)) throw new Error(\"Image data is not valid base64\");\n const data = Buffer.from(input.dataBase64, \"base64\");\n if (data.toString(\"base64\") !== input.dataBase64) throw new Error(\"Image data is not canonical base64\");\n if (data.byteLength > maxBytes) throw new Error(`Image exceeds the maximum size of ${maxBytes} bytes`);\n const detected = detectMediaType(data);\n if (detected !== input.mediaType) {\n throw new Error(`Image media type ${input.mediaType} does not match file bytes`);\n }\n return { ...input, data };\n}\n\nfunction detectMediaType(data: Buffer): ModelImageMediaType | undefined {\n if (data.length >= 8\n && data.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))) {\n return \"image/png\";\n }\n if (data.length >= 3 && data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff) return \"image/jpeg\";\n if (data.length >= 12 && data.subarray(0, 4).toString(\"ascii\") === \"RIFF\"\n && data.subarray(8, 12).toString(\"ascii\") === \"WEBP\") return \"image/webp\";\n return undefined;\n}\n\nfunction extension(mediaType: ModelImageMediaType): string {\n if (mediaType === \"image/png\") return \".png\";\n if (mediaType === \"image/jpeg\") return \".jpg\";\n return \".webp\";\n}\n\nfunction safeName(name: string): string {\n return basename(name).replace(/[\\u0000-\\u001f\\u007f]/g, \"_\").slice(0, 255) || \"image\";\n}\n\nasync function writeOnce(target: string, data: Buffer): Promise<void> {\n const temporary = `${target}.${process.pid}.${randomUUID()}.tmp`;\n let handle;\n try {\n handle = await open(temporary, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY, 0o600);\n await handle.writeFile(data);\n await handle.sync();\n await handle.close();\n handle = undefined;\n try {\n await rename(temporary, target);\n } catch (error) {\n if (!isCode(error, \"EEXIST\") && !isCode(error, \"EPERM\")) throw error;\n }\n } finally {\n await handle?.close().catch(() => undefined);\n await rm(temporary, { force: true }).catch(() => undefined);\n }\n}\n\nfunction positiveInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value <= 0) throw new Error(`${name} must be a positive integer`);\n return value;\n}\n\nfunction isCode(error: unknown, code: string): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error\n && (error as { code?: unknown }).code === code;\n}\n","import { execFileNoThrow } from \"../utils/execFileNoThrow.js\";\nimport type { ImageAttachmentInput } from \"../session/assets.js\";\n\nconst CLIPBOARD_TIMEOUT_MS = 10_000;\nconst NO_IMAGE_EXIT_CODE = 3;\n\nconst READ_WINDOWS_CLIPBOARD_IMAGE = String.raw`\nAdd-Type -AssemblyName System.Windows.Forms\nAdd-Type -AssemblyName System.Drawing\n$image = [Windows.Forms.Clipboard]::GetImage()\nif ($null -eq $image) { exit 3 }\n$stream = New-Object System.IO.MemoryStream\ntry {\n $image.Save($stream, [System.Drawing.Imaging.ImageFormat]::Png)\n [Console]::Out.Write([Convert]::ToBase64String($stream.ToArray()))\n} finally {\n $stream.Dispose()\n $image.Dispose()\n}\n`.trim();\n\nconst READ_MAC_CLIPBOARD_IMAGE = String.raw`\nObjC.import(\"AppKit\");\nObjC.import(\"Foundation\");\nObjC.import(\"stdlib\");\n\nconst pasteboard = $.NSPasteboard.generalPasteboard;\nlet data = pasteboard.dataForType($.NSPasteboardTypePNG);\nif (!data) {\n const tiff = pasteboard.dataForType($.NSPasteboardTypeTIFF);\n if (tiff) {\n const representation = $.NSBitmapImageRep.imageRepWithData(tiff);\n if (representation) {\n data = representation.representationUsingTypeProperties(\n $.NSBitmapImageFileTypePNG,\n $({})\n );\n }\n }\n}\nif (!data) {\n $.exit(3);\n}\nconst encoded = data.base64EncodedStringWithOptions(0);\nconsole.log(ObjC.unwrap(encoded));\n`.trim();\n\ntype ClipboardRunner = typeof execFileNoThrow;\n\nexport interface ClipboardImageReadOptions {\n platform?: NodeJS.Platform | string;\n run?: ClipboardRunner;\n now?: () => Date;\n}\n\nexport function shouldReadClipboardImage(\n input: string,\n key: { ctrl: boolean; meta?: boolean },\n isPasted: boolean,\n): boolean {\n return ((key.ctrl || key.meta === true) && input.toLowerCase() === \"v\")\n || (isPasted && input.length === 0);\n}\n\nexport async function readClipboardImage(\n options: ClipboardImageReadOptions = {},\n): Promise<ImageAttachmentInput | undefined> {\n const platform = options.platform ?? process.platform;\n if (platform === \"win32\") return readWindowsClipboardImage({ ...options, platform });\n if (platform === \"darwin\") return readMacClipboardImage({ ...options, platform });\n throw new Error(\"Pasting clipboard images is currently supported on Windows and macOS only\");\n}\n\nexport async function readWindowsClipboardImage(\n options: ClipboardImageReadOptions = {},\n): Promise<ImageAttachmentInput | undefined> {\n const platform = options.platform ?? process.platform;\n if (platform !== \"win32\") {\n throw new Error(\"Pasting clipboard images is currently supported on Windows only\");\n }\n\n const result = await (options.run ?? execFileNoThrow)(\n \"powershell.exe\",\n [\"-NoProfile\", \"-NonInteractive\", \"-STA\", \"-Command\", READ_WINDOWS_CLIPBOARD_IMAGE],\n { timeout: CLIPBOARD_TIMEOUT_MS, useCwd: false },\n );\n return attachmentFromResult(result, options.now?.() ?? new Date());\n}\n\nexport async function readMacClipboardImage(\n options: ClipboardImageReadOptions = {},\n): Promise<ImageAttachmentInput | undefined> {\n const platform = options.platform ?? process.platform;\n if (platform !== \"darwin\") {\n throw new Error(\"Pasting clipboard images through AppKit is supported on macOS only\");\n }\n\n const result = await (options.run ?? execFileNoThrow)(\n \"osascript\",\n [\"-l\", \"JavaScript\", \"-e\", READ_MAC_CLIPBOARD_IMAGE],\n { timeout: CLIPBOARD_TIMEOUT_MS, useCwd: false },\n );\n return attachmentFromResult(result, options.now?.() ?? new Date());\n}\n\nfunction attachmentFromResult(\n result: Awaited<ReturnType<ClipboardRunner>>,\n now: Date,\n): ImageAttachmentInput | undefined {\n if (result.code === NO_IMAGE_EXIT_CODE) return undefined;\n if (result.code !== 0) {\n const detail = result.stderr.trim() || result.error?.trim();\n throw new Error(detail\n ? `Could not read the clipboard image: ${detail}`\n : \"Could not read the clipboard image\");\n }\n\n const dataBase64 = result.stdout.trim();\n if (dataBase64.length === 0) return undefined;\n return {\n name: `clipboard-${timestamp(now)}.png`,\n mediaType: \"image/png\",\n dataBase64,\n };\n}\n\nfunction timestamp(value: Date): string {\n const year = value.getUTCFullYear();\n const month = String(value.getUTCMonth() + 1).padStart(2, \"0\");\n const day = String(value.getUTCDate()).padStart(2, \"0\");\n const hour = String(value.getUTCHours()).padStart(2, \"0\");\n const minute = String(value.getUTCMinutes()).padStart(2, \"0\");\n const second = String(value.getUTCSeconds()).padStart(2, \"0\");\n return `${year}${month}${day}-${hour}${minute}${second}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAAA,iBAAgB;AACzB,SAAgB,aAAAC,YAAW,YAAY,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACA/D,SAAS,cAAAC,aAAY,WAAW,gBAAgB;;;ACAhD,SAAS,aAAa,YAAY,iBAAiB,cAAc;AA4B1D,SAAS,sBAGd;AACA,QAAM,eAAe,WAAW,mBAAmB;AACnD,QAAM,aAAa,OAA0B,IAAI;AACjD,QAAM,WAAW,OAAsB,EAAE,WAAW,KAAK,CAAC;AAE1D,QAAM,aAAa,YAAY,CAAC,OAA0B;AACxD,eAAW,UAAU;AAAA,EACvB,GAAG,CAAC,CAAC;AAOL,kBAAgB,MAAM;AACpB,UAAM,UAAU,WAAW;AAC3B,QAAI,CAAC,SAAS,YAAY,CAAC,cAAc;AACvC;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ,SAAS,kBAAkB;AAClD,UAAM,OAAO,aAAa;AAQ1B,QAAI,cAAc,QAAQ,SAAS,eAAe;AAClD,QAAI,SAAiC,QAAQ;AAC7C,QAAI,OAAO,QAAQ;AACnB,WAAO,QAAQ;AACb,UAAI,OAAO,UAAU;AACnB,uBAAe,OAAO,SAAS,eAAe;AAC9C,eAAO,OAAO;AAAA,MAChB;AAGA,UAAI,OAAO,UAAW,gBAAe,OAAO;AAC5C,eAAS,OAAO;AAAA,IAClB;AAGA,UAAM,eAAe,KAAK,kBAAkB;AAE5C,UAAM,SAAS,cAAc;AAO7B,UAAM,sBAAsB,eAAe,OAAO,IAAI;AACtD,UAAM,YAAY,KAAK,IAAI,GAAG,eAAe,IAAI,IAAI;AACrD,UAAM,iBAAiB,YAAY;AACnC,UAAM,UAAU,SAAS,aAAa,cAAc;AAEpD,QAAI,YAAY,SAAS,QAAQ,WAAW;AAC1C,eAAS,UAAU,EAAE,WAAW,QAAQ;AAAA,IAC1C;AAAA,EACF,CAAC;AAED,SAAO,CAAC,YAAY,SAAS,OAAO;AACtC;;;ADlEO,SAAS,kBACd,aAA4B,IAC+B;AAC3D,QAAM,QAAQC,YAAW,YAAY;AACrC,QAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,oBAAoB;AACzD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,MAAM,OAAO,IAAI,KAAK,CAAC;AAExD,QAAM,SAAS,aAAa,eAAe;AAE3C,YAAU,MAAM;AACd,QAAI,CAAC,SAAS,CAAC,OAAQ;AAEvB,QAAI,aAAa,MAAM,IAAI;AAE3B,UAAM,WAAW,MAAY;AAC3B,YAAM,MAAM,MAAM,IAAI;AACtB,UAAI,MAAM,cAAc,YAAa;AACnC,qBAAa;AACb,gBAAQ,GAAG;AAAA,MACb;AAAA,IACF;AAGA,WAAO,MAAM,UAAU,UAAU,IAAI;AAAA,EACvC,GAAG,CAAC,OAAO,YAAY,MAAM,CAAC;AAE9B,SAAO,CAAC,aAAa,IAAI;AAC3B;;;AExDA,SAAS,cAAAC,aAAY,SAAS,4BAA4B;AAanD,SAAS,eA+Bd;AAKA,EAAAC,YAAW,oBAAY;AACvB,QAAM,MAAM,kBAAU,IAAI,QAAQ,MAAM;AAGxC,SAAO,QAAQ,MAAM;AACnB,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,QACL,eAAe,MAAM;AAAA,QACrB,sBAAsB,MAAM;AAAA,QAC5B,gBAAgB,MAAM;AAAA,QAAC;AAAA,QACvB,cAAc,MAAM;AAAA,QACpB,UAAU,MAAM;AAAA,QAChB,WAAW,MAAM,MAAM;AAAA,QAAC;AAAA,QACxB,aAAa,MAAM;AAAA,QAAC;AAAA,QACpB,gBAAgB,MAAM;AAAA,QAAC;AAAA,QACvB,WAAW,MAAM;AAAA,QAAC;AAAA,QAClB,qBAAqB,MAAM;AAAA,QAAC;AAAA,QAC5B,qBAAqB,MAAM;AAAA,QAAC;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,MACL,eAAe,MAAM,IAAI,cAAc;AAAA,MACvC,sBAAsB,MAAM,IAAI,qBAAqB;AAAA,MACrD,gBAAgB,MAAM,IAAI,mBAAmB;AAAA,MAC7C,cAAc,MAAM,IAAI,iBAAiB;AAAA,MACzC,UAAU,MAAM,IAAI;AAAA,MACpB,WAAW,CAAC,OAAmB,IAAI,2BAA2B,EAAE;AAAA,MAChE,aAAa,CAAC,MAAc,QAAgB,WAC1C,YAAY,IAAI,WAAW,MAAM,QAAQ,MAAM;AAAA,MACjD,gBAAgB,CAAC,MAAM,QAAQ,WAC7B,IAAI,wBAAwB,MAAM,QAAQ,MAAM;AAAA,MAClD,WAAW,CAAC,SAAoB,IAAI,mBAAmB,IAAI;AAAA,MAC3D,qBAAqB,CAAC,UAAU,SAAS,SACvC,IAAI,oBAAoB,UAAU,SAAS,IAAI;AAAA,MACjD,qBAAqB,CAAC,UAAkB,IAAI,oBAAoB,KAAK;AAAA,IACvE;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AACV;;;ACtFA,SAAS,cAAAC,aAAY,aAAAC,kBAAiB;AAgB/B,SAAS,iBAAiB,OAA4B;AAC3D,QAAM,WAAWC,YAAW,oBAAoB;AAEhD,EAAAC,WAAU,MAAM;AACd,QAAI,UAAU,QAAQ,CAAC,SAAU;AAEjC,UAAM,QAAQ,UAAU,KAAK;AAE7B,aAAS,IAAI,IAAI,oBAAoB,KAAK,CAAC;AAAA,EAC7C,GAAG,CAAC,OAAO,QAAQ,CAAC;AACtB;;;AC3BA,OAAOC,YAAW;;;ACAlB,OAAO,SAAS,WAAAC,UAAS,UAAAC,eAAc;AAEvC,OAAOC,YAAW;AAClB,SAAS,cAAc;;;ACHvB,OAAO,WAAW;AAMlB,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,CAAC;AAcrC,IAAM,UAAU,MAAM,IAAI,SAAS;AACnC,IAAM,SAAS,MAAM,IAAI,SAAS;AAClC,IAAM,UAAU,MAAM,KAAK;AAC3B,IAAM,SAAS,MAAM,IAAI,SAAS;AAClC,IAAM,WAAW,MAAM,IAAI,SAAS;AACpC,IAAM,YAAY,MAAM,IAAI,SAAS;AAErC,IAAM,WAA8C;AAAA,EAClD,YAAY,oBAAI,IAAI;AAAA,IAClB;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAC9D;AAAA,IAAW;AAAA,IAAU;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAW;AAAA,IAAW;AAAA,IAAO;AAAA,IAC1E;AAAA,IAAY;AAAA,IAAM;AAAA,IAAU;AAAA,IAAM;AAAA,IAAc;AAAA,IAAO;AAAA,IAAO;AAAA,IAAM;AAAA,IACpE;AAAA,IAAU;AAAA,IAAS;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,IACvE;AAAA,IAAU;AAAA,IAAa;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,EACzD,CAAC;AAAA,EACD,YAAY,oBAAI,IAAI;AAAA,IAClB;AAAA,IAAY;AAAA,IAAO;AAAA,IAAM;AAAA,IAAS;AAAA,IAAS;AAAA,IAAW;AAAA,IAAS;AAAA,IAAQ;AAAA,IACvE;AAAA,IAAS;AAAA,IAAS;AAAA,IAAe;AAAA,IAAY;AAAA,IAAW;AAAA,IAAW;AAAA,IACnE;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAW;AAAA,IAAS;AAAA,IAAW;AAAA,IAAO;AAAA,IACtE;AAAA,IAAY;AAAA,IAAO;AAAA,IAAM;AAAA,IAAc;AAAA,IAAU;AAAA,IAAM;AAAA,IAAc;AAAA,IACrE;AAAA,IAAM;AAAA,IAAS;AAAA,IAAO;AAAA,IAAa;AAAA,IAAS;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAU;AAAA,IACrE;AAAA,IAAM;AAAA,IAAW;AAAA,IAAa;AAAA,IAAU;AAAA,IAAY;AAAA,IAAU;AAAA,IAAO;AAAA,IACrE;AAAA,IAAU;AAAA,IAAS;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAO;AAAA,IAAQ;AAAA,IACrE;AAAA,IAAa;AAAA,IAAU;AAAA,IAAW;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,EACpE,CAAC;AAAA,EACD,QAAQ,oBAAI,IAAI;AAAA,IACd;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAO;AAAA,IAAM;AAAA,IAAU;AAAA,IAAS;AAAA,IAAS;AAAA,IAClE;AAAA,IAAS;AAAA,IAAY;AAAA,IAAO;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAU;AAAA,IAC7D;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAM;AAAA,IAAU;AAAA,IAAM;AAAA,IAAM;AAAA,IAAU;AAAA,IAC/D;AAAA,IAAO;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAU;AAAA,IAAO;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAS;AAAA,EAC3E,CAAC;AAAA,EACD,MAAM,oBAAI,IAAI;AAAA,IACZ;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAO;AAAA,IAAS;AAAA,IAAS;AAAA,IAAM;AAAA,IACnE;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAY;AAAA,IAAU;AAAA,IAAU;AAAA,IAAS;AAAA,IAC/D;AAAA,IAAU;AAAA,EACZ,CAAC;AAAA,EACD,MAAM,oBAAI,IAAI,CAAC,QAAQ,SAAS,MAAM,CAAC;AAAA,EACvC,MAAM,oBAAI,IAAI;AAAA,IACZ;AAAA,IAAM;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAAY;AAAA,IAAS;AAAA,IAAO;AAAA,IACtE;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAS;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAO;AAAA,IACnE;AAAA,IAAS;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACvE;AAAA,IAAU;AAAA,IAAS;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAO;AAAA,IAAS;AAAA,EACxE,CAAC;AAAA,EACD,IAAI,oBAAI,IAAI;AAAA,IACV;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAY;AAAA,IAAW;AAAA,IAAS;AAAA,IAClE;AAAA,IAAe;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAU;AAAA,IAAa;AAAA,IACzE;AAAA,IAAW;AAAA,IAAS;AAAA,IAAU;AAAA,IAAU;AAAA,IAAU;AAAA,IAAU;AAAA,IAAQ;AAAA,IACpE;AAAA,IAAQ;AAAA,IAAS;AAAA,EACnB,CAAC;AACH;AAEA,SAAS,kBAAkB,OAA6C;AACtE,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,QAAQ,MAAM,KAAK,EAAE,YAAY;AACvC,UAAQ,OAAO;AAAA,IACb,KAAK;AAAA,IAAM,KAAK;AAAA,IAAO,KAAK;AAAc,aAAO;AAAA,IACjD,KAAK;AAAA,IAAM,KAAK;AAAA,IAAO,KAAK;AAAc,aAAO;AAAA,IACjD,KAAK;AAAA,IAAM,KAAK;AAAU,aAAO;AAAA,IACjC,KAAK;AAAA,IAAM,KAAK;AAAA,IAAS,KAAK;AAAA,IAAQ,KAAK;AAAO,aAAO;AAAA,IACzD,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAA,IAAM,KAAK;AAAQ,aAAO;AAAA,IAC/B,KAAK;AAAA,IAAM,KAAK;AAAU,aAAO;AAAA,IACjC;AAAS,aAAO;AAAA,EAClB;AACF;AAEA,SAAS,kBAAkB,IAAqB;AAC9C,SAAO,YAAY,KAAK,EAAE,KAAK,OAAO;AACxC;AAEA,SAAS,iBAAiB,IAAqB;AAC7C,SAAO,eAAe,KAAK,EAAE;AAC/B;AAEA,SAAS,QAAQ,IAAqB;AACpC,SAAO,MAAM,OAAO,MAAM;AAC5B;AAEA,SAAS,eAAe,MAAc,GAAoB;AACxD,QAAM,KAAK,KAAK,CAAC,KAAK;AACtB,MAAI,QAAQ,EAAE,EAAG,QAAO;AACxB,MAAI,OAAO,OAAO,QAAQ,KAAK,IAAI,CAAC,KAAK,EAAE,EAAG,QAAO;AACrD,MAAI,OAAO,QAAQ,KAAK,IAAI,CAAC,MAAM,OAAO,KAAK,IAAI,CAAC,MAAM,KAAM,QAAO;AACvE,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAc,GAAmB;AACxD,MAAI,IAAI,IAAI;AACZ,QAAM,MAAM,KAAK;AACjB,SAAO,IAAI,KAAK;AACd,UAAM,KAAK,KAAK,CAAC,KAAK;AACtB,QAAI,QAAQ,EAAE,GAAG;AAAE,WAAK;AAAG;AAAA,IAAU;AACrC,QAAI,OAAO,OAAO,QAAQ,KAAK,IAAI,CAAC,KAAK,EAAE,GAAG;AAAE,WAAK;AAAG;AAAA,IAAU;AAClE,QAAI,OAAO,KAAK;AAAE,WAAK;AAAG;AAAA,IAAU;AACpC,SAAK,OAAO,OAAO,OAAO,QAAQ,WAAW,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,GAAG;AACpE,WAAK;AACL,UAAI,KAAK,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,IAAK,MAAK;AAC7C,aAAO,IAAI,OAAO,QAAQ,KAAK,CAAC,KAAK,EAAE,EAAG,MAAK;AAC/C;AAAA,IACF;AACA;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAc,GAAmB;AAC5D,MAAI,IAAI,IAAI;AACZ,SAAO,IAAI,KAAK,UAAU,iBAAiB,KAAK,CAAC,KAAK,EAAE,EAAG,MAAK;AAChE,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAc,GAAmB;AACxD,QAAM,QAAQ,KAAK,CAAC,KAAK;AACzB,MAAI,IAAI,IAAI;AACZ,QAAM,MAAM,KAAK;AACjB,SAAO,IAAI,KAAK;AACd,UAAM,KAAK,KAAK,CAAC,KAAK;AACtB,QAAI,OAAO,MAAM;AAAE,WAAK;AAAG;AAAA,IAAU;AACrC,QAAI,OAAO,OAAO;AAAE,WAAK;AAAG,aAAO;AAAA,IAAG;AACtC,SAAK;AAAA,EACP;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,MAAc,GAAmB;AAC9D,MAAI,IAAI,IAAI;AACZ,QAAM,MAAM,KAAK;AACjB,SAAO,IAAI,KAAK;AACd,QAAI,KAAK,CAAC,MAAM,OAAO,KAAK,IAAI,CAAC,MAAM,IAAK,QAAO,IAAI;AACvD,SAAK;AAAA,EACP;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAc,UAAuC;AAChF,QAAM,SAAgE,CAAC;AACvE,MAAI,IAAI;AACR,QAAM,MAAM,KAAK;AAGjB,QAAM,eAAgB,KAAK,CAAC,MAAM;AAElC,SAAO,IAAI,KAAK;AACd,UAAM,KAAK,KAAK,CAAC,KAAK;AAGtB,QAAI,OAAO,OAAO,KAAK,IAAI,CAAC,MAAM,KAAK;AACrC,YAAM,MAAM,sBAAsB,MAAM,CAAC;AACzC,aAAO,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,GAAG,GAAG,OAAO,QAAQ,CAAC;AACxD,UAAI;AACJ;AAAA,IACF;AAGA,QAAI,gBAAgB,OAAO,KAAK;AAC9B,aAAO,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,QAAQ,CAAC;AACnD,UAAI;AACJ;AAAA,IACF;AACA,QAAI,OAAO,OAAO,KAAK,IAAI,CAAC,MAAM,KAAK;AACrC,aAAO,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,QAAQ,CAAC;AACnD,UAAI;AACJ;AAAA,IACF;AAGA,QAAI,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAC1C,YAAM,MAAM,gBAAgB,MAAM,CAAC;AACnC,aAAO,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,GAAG,GAAG,OAAO,OAAO,CAAC;AACvD,UAAI;AACJ;AAAA,IACF;AAGA,QAAI,eAAe,MAAM,CAAC,GAAG;AAC3B,YAAM,MAAM,gBAAgB,MAAM,CAAC;AACnC,aAAO,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,GAAG,GAAG,OAAO,OAAO,CAAC;AACvD,UAAI;AACJ;AAAA,IACF;AAGA,QAAI,kBAAkB,EAAE,GAAG;AACzB,YAAM,MAAM,oBAAoB,MAAM,CAAC;AACvC,YAAM,OAAO,KAAK,MAAM,GAAG,GAAG;AAC9B,UAAI,OAAO,KAAK;AACd,eAAO,KAAK,EAAE,MAAM,MAAM,OAAO,UAAU,CAAC;AAAA,MAC9C,WAAW,SAAS,IAAI,IAAI,GAAG;AAC7B,eAAO,KAAK,EAAE,MAAM,MAAM,OAAO,QAAQ,CAAC;AAAA,MAC5C,WAAW,KAAK,GAAG,MAAM,KAAK;AAC5B,eAAO,KAAK,EAAE,MAAM,MAAM,OAAO,SAAS,CAAC;AAAA,MAC7C,OAAO;AACL,eAAO,KAAK,EAAE,MAAM,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;AAAA,MAC7C;AACA,UAAI;AACJ;AAAA,IACF;AAGA,QAAI,IAAI,IAAI;AACZ,WAAO,IAAI,KAAK;AACd,YAAM,KAAK,KAAK,CAAC,KAAK;AACtB,UAAI,kBAAkB,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,IAAK;AAChH,WAAK;AAAA,IACP;AACA,WAAO,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AACvD,QAAI;AAAA,EACN;AAEA,MAAI,MAAM;AACV,aAAW,SAAS,QAAQ;AAC1B,WAAO,MAAM,MAAM,MAAM,IAAI;AAAA,EAC/B;AACA,SAAO;AACT;AAMO,SAAS,cAAc,QAAgB,WAA+B,QAAmB;AAC9F,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,OAAO,kBAAkB,QAAQ;AACvC,QAAM,WAAW,SAAS,SAAY,SAAS,IAAI,IAAI,SAAS;AAGhE,SAAO,OAAO,MAAM,IAAI,EAAE,IAAI,CAAC,SAAS,oBAAoB,MAAM,QAAQ,CAAC,EAAE,KAAK,IAAI;AACxF;;;AC5OO,SAAS,UAAU,WAA2B;AAEnD,MACE,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACb,aAAa,OAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,QAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA,EACpC,aAAa,SAAU,aAAa;AAAA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","names":["basename","useEffect","useRef","useState","useContext","useContext","useContext","useContext","useContext","useEffect","useContext","useEffect","React","useMemo","useRef","chalk","useRef","useMemo","MarkdownSegment","BlockToken","chalk","stripAnsi","jsx","React","useRef","Fragment","jsx","jsxs","useRef","jsx","jsxs","basename","Fragment","jsx","jsxs","useState","useRef","useEffect","basename"]}