reasonix 0.23.1 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dashboard/dist/app.js +1723 -574
  2. package/dashboard/dist/app.js.map +1 -1
  3. package/dist/cli/.-3G6VX5S7.js +327 -0
  4. package/dist/cli/.-6YRPB2C7.js +329 -0
  5. package/dist/cli/.-6YRPB2C7.js.map +1 -0
  6. package/dist/cli/.-EYSVINK3.js +317 -0
  7. package/dist/cli/.-EYSVINK3.js.map +1 -0
  8. package/dist/cli/banner-demo-QKOPDSTL.js +77 -0
  9. package/dist/cli/banner-demo-QKOPDSTL.js.map +1 -0
  10. package/dist/cli/card-demo-5TVXJISK.js +944 -0
  11. package/dist/cli/card-demo-5TVXJISK.js.map +1 -0
  12. package/dist/cli/chunk-2H7UOFLK.js +11 -0
  13. package/dist/cli/chunk-2H7UOFLK.js.map +1 -0
  14. package/dist/cli/chunk-BGTXZKNY.js +197 -0
  15. package/dist/cli/chunk-BGTXZKNY.js.map +1 -0
  16. package/dist/cli/chunk-JHXQDL7B.js +2056 -0
  17. package/dist/cli/chunk-JHXQDL7B.js.map +1 -0
  18. package/dist/cli/flicker-demo-MOB6GAW4.js +165 -0
  19. package/dist/cli/flicker-demo-MOB6GAW4.js.map +1 -0
  20. package/dist/cli/index.js +3654 -2035
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/cli/preview-4FOEEE5G.js +224 -0
  23. package/dist/cli/preview-4FOEEE5G.js.map +1 -0
  24. package/dist/cli/{prompt-YUL7CYKY.js → prompt-VZQ2CPID.js} +2 -1
  25. package/dist/cli/prompt-VZQ2CPID.js.map +1 -0
  26. package/dist/cli/renderer-demo-2BIGEV2T.js +95 -0
  27. package/dist/cli/renderer-demo-2BIGEV2T.js.map +1 -0
  28. package/dist/cli/select-demo-OA5N34BJ.js +107 -0
  29. package/dist/cli/select-demo-OA5N34BJ.js.map +1 -0
  30. package/dist/cli/stress-demo-I7XRPQMM.js +211 -0
  31. package/dist/cli/stress-demo-I7XRPQMM.js.map +1 -0
  32. package/dist/index.d.ts +3 -2
  33. package/dist/index.js +22 -9
  34. package/dist/index.js.map +1 -1
  35. package/package.json +6 -4
  36. /package/dist/cli/{prompt-YUL7CYKY.js.map → .-3G6VX5S7.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/card-demo.tsx"],"sourcesContent":["// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { useEffect, useRef, useState } from \"react\";\nimport {\n CharPool,\n type Handle,\n HyperlinkPool,\n StylePool,\n inkCompat,\n mount,\n useKeystroke,\n} from \"../../renderer/index.js\";\n\nconst BRAND = \"#79c0ff\";\nconst FAINT = \"#6e7681\";\nconst META = \"#8b949e\";\nconst ACCENT = \"#d2a8ff\";\nconst VIOLET = \"#b395f5\";\nconst OK = \"#7ee787\";\nconst WARN = \"#f0b07d\";\nconst ERR = \"#ff8b81\";\nconst PEND = \"#484f58\";\nconst SPINNER = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"] as const;\n\ntype ToolTone = \"read\" | \"write\" | \"bash\" | \"search\" | \"fetch\" | \"mcp\" | \"patch\";\n\ninterface UserItem {\n readonly kind: \"user\";\n readonly text: string;\n}\ninterface ReasoningSettled {\n readonly kind: \"reasoning\";\n readonly tail: ReadonlyArray<string>;\n readonly paragraphs: number;\n readonly tokens: number;\n readonly seconds: number;\n readonly aborted?: boolean;\n}\ninterface ToolSettled {\n readonly kind: \"tool\";\n readonly tone: ToolTone;\n readonly name: string;\n readonly args: string;\n readonly output: ReadonlyArray<string>;\n readonly hidden: number;\n readonly seconds: number;\n readonly status: \"ok\" | \"rejected\" | \"error\" | \"retry\";\n readonly retryInfo?: string;\n}\ninterface PlanStep {\n readonly status: \"todo\" | \"running\" | \"done\" | \"skipped\" | \"failed\" | \"blocked\";\n readonly label: string;\n readonly note?: string;\n}\ninterface PlanSettled {\n readonly kind: \"plan\";\n readonly steps: ReadonlyArray<PlanStep>;\n readonly seconds: number;\n}\ninterface ResponseSettled {\n readonly kind: \"response\";\n readonly lines: ReadonlyArray<{ kind: \"text\" | \"code\" | \"header\" | \"list\"; text: string }>;\n readonly aborted?: boolean;\n}\ninterface DiffItem {\n readonly kind: \"diff\";\n readonly file: string;\n readonly added: number;\n readonly removed: number;\n readonly preview: ReadonlyArray<{ kind: \"+\" | \"-\" | \" \"; text: string }>;\n}\ninterface SubAgentSettled {\n readonly kind: \"subagent\";\n readonly task: string;\n readonly children: ReadonlyArray<SubChild>;\n readonly seconds: number;\n readonly ok: boolean;\n}\ninterface SubChild {\n readonly kind: \"reasoning\" | \"tool\" | \"diff\" | \"error\";\n readonly summary: string;\n}\ninterface UsageItem {\n readonly kind: \"usage\";\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly totalCost: number;\n}\ninterface ErrorItem {\n readonly kind: \"error\";\n readonly message: string;\n}\ninterface WarnItem {\n readonly kind: \"warn\";\n readonly message: string;\n}\n\ntype StaticItem =\n | UserItem\n | ReasoningSettled\n | ToolSettled\n | PlanSettled\n | ResponseSettled\n | DiffItem\n | SubAgentSettled\n | UsageItem\n | ErrorItem\n | WarnItem;\n\nconst TOOL_GLYPH: Record<ToolTone, string> = {\n read: \"▤\",\n write: \"▥\",\n bash: \"▶\",\n search: \"⊙\",\n fetch: \"⌬\",\n mcp: \"⊕\",\n patch: \"✎\",\n};\nconst TOOL_COLOR: Record<ToolTone, string> = {\n read: BRAND,\n write: WARN,\n bash: ACCENT,\n search: BRAND,\n fetch: VIOLET,\n mcp: VIOLET,\n patch: WARN,\n};\nconst TOOL_TAIL_LEN: Record<ToolTone, number> = {\n read: 2,\n write: 2,\n bash: 5,\n search: 2,\n fetch: 2,\n mcp: 5,\n patch: 2,\n};\n\ninterface ReasoningActive {\n readonly id: string;\n readonly kind: \"reasoning\";\n readonly tail: ReadonlyArray<string>;\n readonly tokens: number;\n readonly frame: number;\n readonly aborted?: boolean;\n}\ninterface ToolActive {\n readonly id: string;\n readonly kind: \"tool\";\n readonly tone: ToolTone;\n readonly name: string;\n readonly args: string;\n readonly outputLines: ReadonlyArray<string>;\n readonly elapsedMs: number;\n readonly frame: number;\n readonly retry?: { attempt: number; max: number };\n}\ninterface PlanActive {\n readonly id: string;\n readonly kind: \"plan\";\n readonly title: string;\n readonly steps: ReadonlyArray<PlanStep>;\n readonly inProgressIdx: number | null;\n readonly frame: number;\n}\ninterface SubAgentActive {\n readonly id: string;\n readonly kind: \"subagent\";\n readonly task: string;\n readonly children: ReadonlyArray<SubAgentChild>;\n readonly frame: number;\n}\ninterface SubAgentChild {\n readonly status: \"running\" | \"done\";\n readonly kind: \"reasoning\" | \"tool\" | \"diff\";\n readonly summary: string;\n readonly tone?: ToolTone;\n}\ninterface ResponseActive {\n readonly id: string;\n readonly kind: \"response\";\n readonly tail: ReadonlyArray<string>;\n readonly frame: number;\n}\ntype ActiveCard = ReasoningActive | ToolActive | PlanActive | SubAgentActive | ResponseActive;\n\nfunction StaticRow({ item }: { item: StaticItem }): React.ReactElement {\n switch (item.kind) {\n case \"user\":\n return (\n <inkCompat.Box flexDirection=\"column\" marginTop={1}>\n <inkCompat.Box flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={ACCENT}>›</inkCompat.Text>\n <inkCompat.Text>{item.text}</inkCompat.Text>\n </inkCompat.Box>\n </inkCompat.Box>\n );\n case \"reasoning\":\n return (\n <inkCompat.Box flexDirection=\"column\" marginTop={1}>\n <inkCompat.Box flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={item.aborted ? ERR : ACCENT}>◆</inkCompat.Text>\n <inkCompat.Text color={item.aborted ? ERR : ACCENT} bold>\n {item.aborted ? \"reasoning (aborted)\" : \"reasoning\"}\n </inkCompat.Text>\n <inkCompat.Text color={FAINT}>\n {`${item.paragraphs}¶ · ${item.tokens} tok · ${item.seconds.toFixed(1)}s`}\n </inkCompat.Text>\n </inkCompat.Box>\n {item.tail.map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: tail preview, positional\n <inkCompat.Box key={`r-${i}`} paddingLeft={2}>\n <inkCompat.Text dimColor>{line}</inkCompat.Text>\n </inkCompat.Box>\n ))}\n </inkCompat.Box>\n );\n case \"tool\":\n return <ToolStaticRow item={item} />;\n case \"plan\":\n return (\n <inkCompat.Box flexDirection=\"column\" marginTop={1}>\n <inkCompat.Box flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={ACCENT}>⊞</inkCompat.Text>\n <inkCompat.Text color={ACCENT} bold>\n plan\n </inkCompat.Text>\n <inkCompat.Text color={FAINT}>\n {`${item.steps.length} steps · ${item.seconds.toFixed(1)}s`}\n </inkCompat.Text>\n </inkCompat.Box>\n {item.steps.map((step) => (\n <inkCompat.Box key={step.label} paddingLeft={2} flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={planColor(step.status)}>\n {planGlyph(step.status)}\n </inkCompat.Text>\n <inkCompat.Text dimColor={step.status === \"skipped\"}>{step.label}</inkCompat.Text>\n {step.note ? <inkCompat.Text color={FAINT}>{`· ${step.note}`}</inkCompat.Text> : null}\n </inkCompat.Box>\n ))}\n </inkCompat.Box>\n );\n case \"response\":\n return (\n <inkCompat.Box flexDirection=\"column\" marginTop={1}>\n <inkCompat.Box flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={item.aborted ? ERR : OK}>‹</inkCompat.Text>\n <inkCompat.Text color={item.aborted ? ERR : OK} bold>\n {item.aborted ? \"response (truncated by esc)\" : \"response\"}\n </inkCompat.Text>\n </inkCompat.Box>\n {item.lines.map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: response body lines positional\n <inkCompat.Box key={`resp-${i}`} paddingLeft={2}>\n {line.kind === \"code\" ? (\n <inkCompat.Text color={BRAND}>{line.text || \" \"}</inkCompat.Text>\n ) : line.kind === \"header\" ? (\n <inkCompat.Text bold>{line.text || \" \"}</inkCompat.Text>\n ) : line.kind === \"list\" ? (\n <inkCompat.Text>{` • ${line.text}`}</inkCompat.Text>\n ) : (\n <inkCompat.Text>{line.text || \" \"}</inkCompat.Text>\n )}\n </inkCompat.Box>\n ))}\n </inkCompat.Box>\n );\n case \"diff\":\n return (\n <inkCompat.Box flexDirection=\"column\" marginTop={1}>\n <inkCompat.Box flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={WARN}>±</inkCompat.Text>\n <inkCompat.Text bold>{item.file}</inkCompat.Text>\n <inkCompat.Text color={OK}>{`+${item.added}`}</inkCompat.Text>\n <inkCompat.Text color={ERR}>{`-${item.removed}`}</inkCompat.Text>\n </inkCompat.Box>\n {item.preview.map((row, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: diff preview lines positional\n <inkCompat.Box key={`d-${i}`} paddingLeft={2} flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={row.kind === \"+\" ? OK : row.kind === \"-\" ? ERR : FAINT}>\n {row.kind}\n </inkCompat.Text>\n <inkCompat.Text dimColor={row.kind === \" \"}>{row.text}</inkCompat.Text>\n </inkCompat.Box>\n ))}\n </inkCompat.Box>\n );\n case \"subagent\":\n return (\n <inkCompat.Box flexDirection=\"column\" marginTop={1}>\n <inkCompat.Box flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={item.ok ? VIOLET : ERR}>{item.ok ? \"⌬\" : \"✖\"}</inkCompat.Text>\n <inkCompat.Text color={VIOLET} bold>\n subagent\n </inkCompat.Text>\n <inkCompat.Text>{item.task}</inkCompat.Text>\n <inkCompat.Text color={FAINT}>{`· ${item.seconds.toFixed(1)}s`}</inkCompat.Text>\n </inkCompat.Box>\n {item.children.map((c, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: subagent children positional\n <inkCompat.Box key={`sub-${i}`} paddingLeft={2} flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={VIOLET}>▎</inkCompat.Text>\n <inkCompat.Text color={subChildColor(c.kind)}>{subChildGlyph(c.kind)}</inkCompat.Text>\n <inkCompat.Text dimColor>{c.summary}</inkCompat.Text>\n </inkCompat.Box>\n ))}\n </inkCompat.Box>\n );\n case \"usage\":\n return (\n <inkCompat.Box flexDirection=\"row\" gap={2} marginTop={1}>\n <inkCompat.Text color={BRAND}>Σ</inkCompat.Text>\n <inkCompat.Text color={META}>\n {`in ${item.inputTokens} · out ${item.outputTokens} · $${item.totalCost.toFixed(4)}`}\n </inkCompat.Text>\n </inkCompat.Box>\n );\n case \"error\":\n return (\n <inkCompat.Box flexDirection=\"row\" gap={1} marginTop={1}>\n <inkCompat.Text color={ERR}>✖</inkCompat.Text>\n <inkCompat.Text color={ERR}>{item.message}</inkCompat.Text>\n </inkCompat.Box>\n );\n case \"warn\":\n return (\n <inkCompat.Box flexDirection=\"row\" gap={1} marginTop={1}>\n <inkCompat.Text color={WARN}>⚠</inkCompat.Text>\n <inkCompat.Text color={WARN}>{item.message}</inkCompat.Text>\n </inkCompat.Box>\n );\n }\n}\n\nfunction ToolStaticRow({ item }: { item: ToolSettled }): React.ReactElement {\n const glyph = item.status === \"ok\" ? \"✓\" : item.status === \"rejected\" ? \"✗\" : \"✖\";\n const headerColor =\n item.status === \"ok\" ? TOOL_COLOR[item.tone] : item.status === \"rejected\" ? FAINT : ERR;\n return (\n <inkCompat.Box flexDirection=\"column\" marginTop={1}>\n <inkCompat.Box flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={headerColor}>{glyph}</inkCompat.Text>\n <inkCompat.Text color={headerColor}>{TOOL_GLYPH[item.tone]}</inkCompat.Text>\n <inkCompat.Text color={headerColor} bold>\n {item.name}\n </inkCompat.Text>\n <inkCompat.Text color={FAINT}>{item.args}</inkCompat.Text>\n {item.status === \"rejected\" ? (\n <inkCompat.Text color={ERR} bold>\n rejected\n </inkCompat.Text>\n ) : null}\n {item.status === \"retry\" && item.retryInfo ? (\n <inkCompat.Text color={WARN}>{`R ${item.retryInfo}`}</inkCompat.Text>\n ) : null}\n <inkCompat.Text color={FAINT}>{`${item.seconds.toFixed(1)}s`}</inkCompat.Text>\n </inkCompat.Box>\n {item.status === \"rejected\" ? null : (\n <>\n {item.hidden > 0 ? (\n <inkCompat.Box paddingLeft={2}>\n <inkCompat.Text color={FAINT}>{`: ${item.hidden} earlier lines`}</inkCompat.Text>\n </inkCompat.Box>\n ) : null}\n {item.output.map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: tool tail output lines positional\n <inkCompat.Box key={`tool-${i}`} paddingLeft={2}>\n <inkCompat.Text dimColor color={item.status === \"error\" ? ERR : undefined}>\n {line || \" \"}\n </inkCompat.Text>\n </inkCompat.Box>\n ))}\n </>\n )}\n </inkCompat.Box>\n );\n}\n\nfunction planGlyph(status: PlanStep[\"status\"]): string {\n switch (status) {\n case \"todo\":\n return \"○\";\n case \"running\":\n return \"▶\";\n case \"done\":\n return \"✓\";\n case \"skipped\":\n return \"s\";\n case \"failed\":\n return \"✗\";\n case \"blocked\":\n return \"!\";\n }\n}\nfunction planColor(status: PlanStep[\"status\"]): string {\n switch (status) {\n case \"todo\":\n return PEND;\n case \"running\":\n return BRAND;\n case \"done\":\n return OK;\n case \"skipped\":\n return FAINT;\n case \"failed\":\n return ERR;\n case \"blocked\":\n return WARN;\n }\n}\nfunction subChildGlyph(kind: SubChild[\"kind\"]): string {\n switch (kind) {\n case \"reasoning\":\n return \"◆\";\n case \"tool\":\n return \"▶\";\n case \"diff\":\n return \"±\";\n case \"error\":\n return \"✖\";\n }\n}\nfunction subChildColor(kind: SubChild[\"kind\"]): string {\n switch (kind) {\n case \"reasoning\":\n return ACCENT;\n case \"tool\":\n return BRAND;\n case \"diff\":\n return WARN;\n case \"error\":\n return ERR;\n }\n}\n\nfunction ReasoningCard({ card }: { card: ReasoningActive }): React.ReactElement {\n const spin = SPINNER[card.frame % SPINNER.length] ?? \"·\";\n return (\n <inkCompat.Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={ACCENT}\n paddingX={1}\n marginTop={1}\n >\n <inkCompat.Box flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={ACCENT}>{spin}</inkCompat.Text>\n <inkCompat.Text color={ACCENT} bold>\n reasoning\n </inkCompat.Text>\n <inkCompat.Text color={FAINT}>{`· ${card.tokens} tok`}</inkCompat.Text>\n </inkCompat.Box>\n {card.tail.map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: tail preview rotates by content, positional\n <inkCompat.Text key={`rl-${i}`} dimColor>\n {line}\n </inkCompat.Text>\n ))}\n </inkCompat.Box>\n );\n}\n\nfunction ToolActiveCard({ card }: { card: ToolActive }): React.ReactElement {\n const spin = SPINNER[card.frame % SPINNER.length] ?? \"·\";\n const tailLen = TOOL_TAIL_LEN[card.tone];\n const tail = card.outputLines.slice(-tailLen);\n const hidden = Math.max(0, card.outputLines.length - tail.length);\n const seconds = (card.elapsedMs / 1000).toFixed(1);\n const c = TOOL_COLOR[card.tone];\n return (\n <inkCompat.Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={c}\n paddingX={1}\n marginTop={1}\n >\n <inkCompat.Box flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={c}>{spin}</inkCompat.Text>\n <inkCompat.Text color={c}>{TOOL_GLYPH[card.tone]}</inkCompat.Text>\n <inkCompat.Text color={c} bold>\n {card.name}\n </inkCompat.Text>\n <inkCompat.Text color={FAINT}>{card.args}</inkCompat.Text>\n {card.retry ? (\n <inkCompat.Text color={WARN}>\n {`R ${card.retry.attempt}/${card.retry.max}`}\n </inkCompat.Text>\n ) : null}\n <inkCompat.Text color={FAINT}>{`· ${seconds}s`}</inkCompat.Text>\n </inkCompat.Box>\n {hidden > 0 ? (\n <inkCompat.Text color={FAINT}>{`: ${hidden} earlier lines`}</inkCompat.Text>\n ) : null}\n {tail.map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: tool active tail positional\n <inkCompat.Text key={`ta-${i}`} dimColor>\n {line || \" \"}\n </inkCompat.Text>\n ))}\n </inkCompat.Box>\n );\n}\n\nfunction PlanActiveCard({ card }: { card: PlanActive }): React.ReactElement {\n const spin = SPINNER[card.frame % SPINNER.length] ?? \"·\";\n const done = card.steps.filter((s) => s.status === \"done\" || s.status === \"skipped\").length;\n return (\n <inkCompat.Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={ACCENT}\n paddingX={1}\n marginTop={1}\n >\n <inkCompat.Box flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={ACCENT}>⊞</inkCompat.Text>\n <inkCompat.Text color={ACCENT} bold>\n {card.title}\n </inkCompat.Text>\n <inkCompat.Text color={FAINT}>{`${done} of ${card.steps.length} done`}</inkCompat.Text>\n </inkCompat.Box>\n {card.steps.map((step, i) => {\n const running = i === card.inProgressIdx;\n const glyph = running ? spin : planGlyph(step.status);\n return (\n <inkCompat.Box key={step.label} flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={planColor(step.status)}>{glyph}</inkCompat.Text>\n <inkCompat.Text bold={running} dimColor={step.status === \"todo\" && !running}>\n {step.label}\n </inkCompat.Text>\n {step.note ? <inkCompat.Text color={FAINT}>{`· ${step.note}`}</inkCompat.Text> : null}\n {running ? <inkCompat.Text color={FAINT}>← in progress</inkCompat.Text> : null}\n </inkCompat.Box>\n );\n })}\n </inkCompat.Box>\n );\n}\n\nfunction SubAgentActiveCard({ card }: { card: SubAgentActive }): React.ReactElement {\n const spin = SPINNER[card.frame % SPINNER.length] ?? \"·\";\n const runningCount = card.children.filter((c) => c.status === \"running\").length;\n return (\n <inkCompat.Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={VIOLET}\n paddingX={1}\n marginTop={1}\n >\n <inkCompat.Box flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={VIOLET}>{spin}</inkCompat.Text>\n <inkCompat.Text color={VIOLET} bold>\n subagent\n </inkCompat.Text>\n <inkCompat.Text>{card.task}</inkCompat.Text>\n <inkCompat.Text color={FAINT}>{`${runningCount} running`}</inkCompat.Text>\n </inkCompat.Box>\n {card.children.map((c, i) => {\n const cglyph = c.status === \"running\" ? spin : \"✓\";\n const ccolor = c.status === \"running\" ? BRAND : OK;\n return (\n <inkCompat.Box\n // biome-ignore lint/suspicious/noArrayIndexKey: subagent active children positional\n key={`sc-${i}`}\n flexDirection=\"row\"\n gap={1}\n >\n <inkCompat.Text color={VIOLET}>▎</inkCompat.Text>\n <inkCompat.Text color={ccolor}>{cglyph}</inkCompat.Text>\n <inkCompat.Text color={subChildColor(c.kind)}>{subChildGlyph(c.kind)}</inkCompat.Text>\n <inkCompat.Text dimColor={c.status === \"done\"}>{c.summary}</inkCompat.Text>\n </inkCompat.Box>\n );\n })}\n </inkCompat.Box>\n );\n}\n\nfunction ResponseActiveCard({ card }: { card: ResponseActive }): React.ReactElement {\n const spin = SPINNER[card.frame % SPINNER.length] ?? \"·\";\n return (\n <inkCompat.Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={OK}\n paddingX={1}\n marginTop={1}\n >\n <inkCompat.Box flexDirection=\"row\" gap={1}>\n <inkCompat.Text color={OK}>{spin}</inkCompat.Text>\n <inkCompat.Text color={OK} bold>\n writing…\n </inkCompat.Text>\n </inkCompat.Box>\n {card.tail.map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: response tail positional\n <inkCompat.Text key={`rsp-${i}`}>{line || \" \"}</inkCompat.Text>\n ))}\n </inkCompat.Box>\n );\n}\n\nfunction ActiveCardView({ card }: { card: ActiveCard }): React.ReactElement {\n switch (card.kind) {\n case \"reasoning\":\n return <ReasoningCard card={card} />;\n case \"tool\":\n return <ToolActiveCard card={card} />;\n case \"plan\":\n return <PlanActiveCard card={card} />;\n case \"subagent\":\n return <SubAgentActiveCard card={card} />;\n case \"response\":\n return <ResponseActiveCard card={card} />;\n }\n}\n\nfunction StatusRow({ elapsedMs, cost }: { elapsedMs: number; cost: number }): React.ReactElement {\n const seconds = (elapsedMs / 1000).toFixed(1);\n return (\n <inkCompat.Box flexDirection=\"row\" gap={2}>\n <inkCompat.Text color={BRAND} bold>\n ◈ Reasonix\n </inkCompat.Text>\n <inkCompat.Text color={META}>deepseek-r1</inkCompat.Text>\n <inkCompat.Text color={FAINT}>{`${seconds}s`}</inkCompat.Text>\n <inkCompat.Text color={FAINT}>{`$${cost.toFixed(4)}`}</inkCompat.Text>\n </inkCompat.Box>\n );\n}\n\nfunction PromptInput(): React.ReactElement {\n return (\n <inkCompat.Box flexDirection=\"row\" gap={1} marginTop={1}>\n <inkCompat.Text color={BRAND} bold>\n ›\n </inkCompat.Text>\n <inkCompat.Text dimColor>type your question…</inkCompat.Text>\n <inkCompat.Text color={FAINT}>▏</inkCompat.Text>\n </inkCompat.Box>\n );\n}\n\nfunction HintBar(): React.ReactElement {\n return (\n <inkCompat.Box marginTop={1}>\n <inkCompat.Text dimColor>card lifecycle reference · auto-replays · Esc exit</inkCompat.Text>\n </inkCompat.Box>\n );\n}\n\ninterface ShellProps {\n onExit: () => void;\n}\n\ninterface DemoApi {\n setActive(updater: (prev: readonly ActiveCard[]) => readonly ActiveCard[]): void;\n push(item: StaticItem): void;\n reset(): void;\n cancelled: () => boolean;\n sleep(ms: number): Promise<void>;\n}\n\nexport function CardDemoShell({ onExit }: ShellProps): React.ReactElement {\n const [history, setHistory] = useState<readonly StaticItem[]>([]);\n const [active, setActive] = useState<readonly ActiveCard[]>([]);\n const [elapsed, setElapsed] = useState(0);\n const [cost, setCost] = useState(0);\n const startedRef = useRef(Date.now());\n\n useKeystroke((k) => {\n if (k.escape) onExit();\n });\n\n useEffect(() => {\n const id = setInterval(() => {\n const now = Date.now() - startedRef.current;\n setElapsed(now);\n setCost((now / 1000) * 0.0008);\n }, 100);\n return () => clearInterval(id);\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n const api: DemoApi = {\n setActive: (updater) => {\n if (cancelled) return;\n setActive((prev) => updater(prev));\n },\n push: (item) => {\n if (cancelled) return;\n setHistory((prev) => [...prev, item]);\n },\n reset: () => {\n if (cancelled) return;\n setActive([]);\n setHistory([]);\n startedRef.current = Date.now();\n },\n cancelled: () => cancelled,\n sleep: (ms) => new Promise((r) => setTimeout(r, ms)),\n };\n void runScript(api);\n return () => {\n cancelled = true;\n };\n }, []);\n\n return (\n <inkCompat.Box flexDirection=\"column\">\n <StatusRow elapsedMs={elapsed} cost={cost} />\n <inkCompat.Box flexDirection=\"column\">\n {history.map((item, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: append-only history\n <StaticRow key={`h-${i}`} item={item} />\n ))}\n </inkCompat.Box>\n {active.map((card, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: live region cards positional\n <ActiveCardView key={`a-${i}-${card.id}`} card={card} />\n ))}\n {active.length === 0 ? <PromptInput /> : null}\n <HintBar />\n </inkCompat.Box>\n );\n}\n\nfunction replaceById(\n cards: readonly ActiveCard[],\n id: string,\n next: ActiveCard | null,\n): readonly ActiveCard[] {\n if (next === null) return cards.filter((c) => c.id !== id);\n return cards.map((c) => (c.id === id ? next : c));\n}\n\nfunction appendCard(cards: readonly ActiveCard[], card: ActiveCard): readonly ActiveCard[] {\n return [...cards, card];\n}\n\nasync function runScript(api: DemoApi): Promise<void> {\n while (!api.cancelled()) {\n await sceneFixFailingTest(api);\n if (api.cancelled()) return;\n await api.sleep(1000);\n if (api.cancelled()) return;\n await sceneSubagent(api);\n if (api.cancelled()) return;\n await api.sleep(800);\n if (api.cancelled()) return;\n await sceneEdgeCases(api);\n if (api.cancelled()) return;\n await api.sleep(1500);\n api.reset();\n await api.sleep(500);\n }\n}\n\nasync function streamReasoning(\n api: DemoApi,\n fullText: string,\n durationMs: number,\n abortAtMs?: number,\n): Promise<{ tokens: number; lines: string[]; aborted: boolean }> {\n const id = \"reason\";\n const start = Date.now();\n let frame = 0;\n let revealed = \"\";\n let aborted = false;\n api.setActive((prev) => appendCard(prev, { id, kind: \"reasoning\", tail: [], tokens: 0, frame }));\n while (Date.now() - start < durationMs && !api.cancelled()) {\n if (abortAtMs !== undefined && Date.now() - start >= abortAtMs) {\n aborted = true;\n break;\n }\n await api.sleep(60);\n frame++;\n revealed = fullText.slice(0, Math.min(fullText.length, revealed.length + 6));\n const lines = wrapText(revealed, 70);\n const tail = lines.slice(-4);\n const tokens = Math.floor(revealed.length / 3);\n const aborting = abortAtMs !== undefined && Date.now() - start >= abortAtMs - 100;\n api.setActive((prev) =>\n replaceById(prev, id, {\n id,\n kind: \"reasoning\",\n tail,\n tokens,\n frame,\n aborted: aborting,\n }),\n );\n }\n api.setActive((prev) => replaceById(prev, id, null));\n const lines = wrapText(revealed, 70);\n return { tokens: Math.floor(revealed.length / 3), lines, aborted };\n}\n\nasync function streamTool(\n api: DemoApi,\n config: {\n tone: ToolTone;\n name: string;\n args: string;\n output: ReadonlyArray<string>;\n durationMs: number;\n retry?: { attempt: number; max: number };\n },\n): Promise<void> {\n const id = `tool-${Math.random().toString(36).slice(2)}`;\n const start = Date.now();\n let frame = 0;\n const out: string[] = [];\n api.setActive((prev) =>\n appendCard(prev, {\n id,\n kind: \"tool\",\n tone: config.tone,\n name: config.name,\n args: config.args,\n outputLines: out,\n elapsedMs: 0,\n frame,\n retry: config.retry,\n }),\n );\n const lineRate = config.durationMs / Math.max(1, config.output.length);\n let lineIdx = 0;\n while (Date.now() - start < config.durationMs && !api.cancelled()) {\n await api.sleep(80);\n frame++;\n const elapsed = Date.now() - start;\n while (lineIdx < config.output.length && elapsed > lineIdx * lineRate) {\n out.push(config.output[lineIdx] ?? \"\");\n lineIdx++;\n }\n api.setActive((prev) =>\n replaceById(prev, id, {\n id,\n kind: \"tool\",\n tone: config.tone,\n name: config.name,\n args: config.args,\n outputLines: out.slice(),\n elapsedMs: elapsed,\n frame,\n retry: config.retry,\n }),\n );\n }\n api.setActive((prev) => replaceById(prev, id, null));\n}\n\nasync function sceneFixFailingTest(api: DemoApi): Promise<void> {\n api.push({ kind: \"user\", text: \"fix the failing test in src/loop.test.ts\" });\n await api.sleep(400);\n if (api.cancelled()) return;\n\n // 1. reasoning\n const reasoningText =\n \"Looking at recent test failures in src/loop.test.ts. The assertion shape changed -- expects a stripped trailing marker. The new tokenizer in src/parser.ts keeps it. Two paths: patch tokenizer's strip step, or update the test expectation.\";\n const reasonStart = Date.now();\n const r = await streamReasoning(api, reasoningText, 2200);\n if (api.cancelled()) return;\n api.push({\n kind: \"reasoning\",\n tail: r.lines.slice(-2),\n paragraphs: 3,\n tokens: r.tokens,\n seconds: (Date.now() - reasonStart) / 1000,\n });\n await api.sleep(200);\n\n // 2. plan executes step-by-step\n const planId = \"plan-main\";\n const planStart = Date.now();\n let frame = 0;\n const steps: PlanStep[] = [\n { status: \"todo\", label: \"locate failing assertion\" },\n { status: \"todo\", label: \"patch tokenizer.strip()\" },\n { status: \"todo\", label: \"verify with npm test\" },\n { status: \"todo\", label: \"publish patch\" },\n ];\n\n const renderPlan = (inProgressIdx: number | null) => {\n api.setActive((prev) =>\n replaceById(\n prev.find((c) => c.id === planId) ? prev : appendCard(prev, makePlan()),\n planId,\n makePlan(),\n ),\n );\n function makePlan(): PlanActive {\n return {\n id: planId,\n kind: \"plan\",\n title: \"fix loop test\",\n steps: steps.slice(),\n inProgressIdx,\n frame,\n };\n }\n };\n\n // ensure plan card mounted\n api.setActive((prev) =>\n appendCard(prev, {\n id: planId,\n kind: \"plan\",\n title: \"fix loop test\",\n steps: steps.slice(),\n inProgressIdx: 0,\n frame,\n }),\n );\n\n // local frame tick for plan spinner while sub-tools run\n const planTick = setInterval(() => {\n frame++;\n api.setActive((prev) => {\n const cur = prev.find((c) => c.id === planId);\n if (!cur || cur.kind !== \"plan\") return prev;\n return replaceById(prev, planId, { ...cur, frame });\n });\n }, 80);\n\n try {\n // step 0: search\n steps[0] = { ...steps[0]!, status: \"running\" };\n renderPlan(0);\n await streamTool(api, {\n tone: \"search\",\n name: \"grep\",\n args: \"TRAILER src/parser.ts\",\n output: [\n \"src/parser.ts:42:const TRAILER = '<|/tool|>';\",\n \"src/parser.ts:67: if (s.endsWith(TRAILER))\",\n ],\n durationMs: 800,\n });\n if (api.cancelled()) return;\n api.push({\n kind: \"tool\",\n tone: \"search\",\n name: \"grep\",\n args: \"TRAILER src/parser.ts\",\n output: [\"src/parser.ts:67: if (s.endsWith(TRAILER))\"],\n hidden: 1,\n seconds: 0.8,\n status: \"ok\",\n });\n steps[0] = { ...steps[0]!, status: \"done\" };\n renderPlan(1);\n await api.sleep(300);\n if (api.cancelled()) return;\n\n // step 1: write file (rejected)\n steps[1] = { ...steps[1]!, status: \"running\" };\n renderPlan(1);\n await streamTool(api, {\n tone: \"write\",\n name: \"write_file\",\n args: \"src/parser.ts (full rewrite)\",\n output: [],\n durationMs: 600,\n });\n if (api.cancelled()) return;\n api.push({\n kind: \"tool\",\n tone: \"write\",\n name: \"write_file\",\n args: \"src/parser.ts (full rewrite)\",\n output: [],\n hidden: 0,\n seconds: 0.6,\n status: \"rejected\",\n });\n steps[1] = { ...steps[1]!, status: \"blocked\", note: \"rejected; trying patch instead\" };\n renderPlan(null);\n await api.sleep(800);\n if (api.cancelled()) return;\n\n // step 1 retry: patch (smaller)\n steps[1] = { ...steps[1]!, status: \"running\", note: undefined };\n renderPlan(1);\n await streamTool(api, {\n tone: \"patch\",\n name: \"edit_file\",\n args: \"src/parser.ts -3+12\",\n output: [\n \"applying hunk 1/1\",\n \"--- src/parser.ts\",\n \"+++ src/parser.ts\",\n \"@@ -42,3 +42,12 @@\",\n \"+function strip(token: string) {...}\",\n ],\n durationMs: 1100,\n });\n if (api.cancelled()) return;\n api.push({\n kind: \"tool\",\n tone: \"patch\",\n name: \"edit_file\",\n args: \"src/parser.ts -3+12\",\n output: [\"+function strip(token: string) {...}\"],\n hidden: 4,\n seconds: 1.1,\n status: \"ok\",\n });\n steps[1] = { ...steps[1]!, status: \"done\" };\n renderPlan(2);\n await api.sleep(300);\n if (api.cancelled()) return;\n\n // step 2: bash with retry chain\n steps[2] = { ...steps[2]!, status: \"running\" };\n renderPlan(2);\n\n const bashOutput = [\n \" RUNS src/loop.test.ts\",\n \" FAIL src/loop.test.ts\",\n \" expect(received).toBe(expected)\",\n \" - expected: '<final>'\",\n \" + received: '<final><|/tool|>'\",\n ];\n await streamTool(api, {\n tone: \"bash\",\n name: \"bash\",\n args: \"npm test\",\n output: bashOutput,\n durationMs: 900,\n retry: { attempt: 1, max: 3 },\n });\n if (api.cancelled()) return;\n api.push({\n kind: \"tool\",\n tone: \"bash\",\n name: \"bash\",\n args: \"npm test\",\n output: bashOutput.slice(-5),\n hidden: 0,\n seconds: 0.9,\n status: \"retry\",\n retryInfo: \"1/3\",\n });\n await api.sleep(200);\n\n // retry 2 — succeed\n const bashOk = [\n \" PASS src/loop.test.ts\",\n \" PASS src/parser.test.ts\",\n \" PASS src/diff/cell.test.ts\",\n \" PASS src/diff/screen.test.ts\",\n \" PASS src/renderer/layout.test.ts\",\n \"Tests: 142 passed\",\n ];\n await streamTool(api, {\n tone: \"bash\",\n name: \"bash\",\n args: \"npm test\",\n output: bashOk,\n durationMs: 1300,\n retry: { attempt: 2, max: 3 },\n });\n if (api.cancelled()) return;\n api.push({\n kind: \"tool\",\n tone: \"bash\",\n name: \"bash\",\n args: \"npm test\",\n output: bashOk.slice(-5),\n hidden: 1,\n seconds: 1.3,\n status: \"ok\",\n });\n steps[2] = { ...steps[2]!, status: \"done\" };\n renderPlan(3);\n await api.sleep(300);\n if (api.cancelled()) return;\n\n // step 3: bash deploy\n steps[3] = { ...steps[3]!, status: \"running\" };\n renderPlan(3);\n await streamTool(api, {\n tone: \"bash\",\n name: \"bash\",\n args: \"npm run build && npm publish\",\n output: [\n \" > tsup\",\n \" ESM Build start\",\n \" CJS Build start\",\n \" DTS Build start\",\n \" ESM done\",\n \" + reasonix@0.24.0\",\n ],\n durationMs: 1500,\n });\n if (api.cancelled()) return;\n api.push({\n kind: \"tool\",\n tone: \"bash\",\n name: \"bash\",\n args: \"npm run build && npm publish\",\n output: [\" + reasonix@0.24.0\"],\n hidden: 5,\n seconds: 1.5,\n status: \"ok\",\n });\n steps[3] = { ...steps[3]!, status: \"done\" };\n renderPlan(null);\n } finally {\n clearInterval(planTick);\n }\n\n // settle plan\n await api.sleep(400);\n api.setActive((prev) => replaceById(prev, planId, null));\n api.push({ kind: \"plan\", steps: steps.slice(), seconds: (Date.now() - planStart) / 1000 });\n await api.sleep(300);\n if (api.cancelled()) return;\n\n // diff\n api.push({\n kind: \"diff\",\n file: \"src/parser.ts\",\n added: 12,\n removed: 3,\n preview: [\n { kind: \" \", text: \"function strip(token: string) {\" },\n { kind: \"-\", text: \" return token.trimEnd();\" },\n { kind: \"+\", text: \" if (token.endsWith(TRAILER)) {\" },\n { kind: \"+\", text: \" return token.slice(0, -TRAILER.length);\" },\n { kind: \"+\", text: \" }\" },\n { kind: \"+\", text: \" return token;\" },\n { kind: \" \", text: \"}\" },\n ],\n });\n await api.sleep(400);\n if (api.cancelled()) return;\n\n // streaming response with markdown\n await streamMarkdownResponse(api);\n}\n\nasync function streamMarkdownResponse(api: DemoApi): Promise<void> {\n const lines: { kind: \"text\" | \"code\" | \"header\" | \"list\"; text: string }[] = [\n { kind: \"header\", text: \"## Patch landed\" },\n { kind: \"text\", text: \"Tests pass on second retry. The patch:\" },\n { kind: \"text\", text: \"\" },\n { kind: \"code\", text: \"function strip(token: string) {\" },\n { kind: \"code\", text: \" if (token.endsWith(TRAILER))\" },\n { kind: \"code\", text: \" return token.slice(0, -TRAILER.length);\" },\n { kind: \"code\", text: \" return token;\" },\n { kind: \"code\", text: \"}\" },\n { kind: \"text\", text: \"\" },\n { kind: \"list\", text: \"checks the suffix before slicing — no spurious slices on plain tokens\" },\n { kind: \"list\", text: \"released as 0.24.0 to npm\" },\n ];\n const id = \"resp\";\n let frame = 0;\n let revealed = 0;\n api.setActive((prev) => appendCard(prev, { id, kind: \"response\", tail: [], frame }));\n while (revealed < lines.length && !api.cancelled()) {\n await api.sleep(160);\n frame++;\n revealed = Math.min(lines.length, revealed + 1);\n const tail = lines\n .slice(0, revealed)\n .slice(-4)\n .map((l) =>\n l.kind === \"code\" ? ` ${l.text}` : l.kind === \"list\" ? ` - ${l.text}` : l.text,\n );\n api.setActive((prev) => replaceById(prev, id, { id, kind: \"response\", tail, frame }));\n }\n api.setActive((prev) => replaceById(prev, id, null));\n api.push({ kind: \"response\", lines });\n await api.sleep(200);\n if (api.cancelled()) return;\n api.push({ kind: \"usage\", inputTokens: 1842, outputTokens: 421, totalCost: 0.0094 });\n}\n\nasync function sceneSubagent(api: DemoApi): Promise<void> {\n api.push({ kind: \"user\", text: \"investigate the auth flow regressions in 0.24\" });\n await api.sleep(400);\n if (api.cancelled()) return;\n\n const id = \"sub\";\n let frame = 0;\n const start = Date.now();\n const children: SubAgentChild[] = [\n { status: \"running\", kind: \"reasoning\", summary: \"scanning auth fixtures\" },\n { status: \"running\", kind: \"tool\", summary: \"grep 'authToken' src/\", tone: \"search\" },\n { status: \"running\", kind: \"tool\", summary: \"read src/auth/session.ts\", tone: \"read\" },\n ];\n api.setActive((prev) =>\n appendCard(prev, {\n id,\n kind: \"subagent\",\n task: \"auth regressions\",\n children: children.slice(),\n frame,\n }),\n );\n const tick = setInterval(() => {\n frame++;\n api.setActive((prev) => {\n const cur = prev.find((c) => c.id === id);\n if (!cur || cur.kind !== \"subagent\") return prev;\n return replaceById(prev, id, { ...cur, frame, children: children.slice() });\n });\n }, 80);\n\n try {\n await api.sleep(1200);\n if (api.cancelled()) return;\n children[0] = { ...children[0]!, status: \"done\" };\n await api.sleep(900);\n if (api.cancelled()) return;\n children[1] = { ...children[1]!, status: \"done\" };\n await api.sleep(1100);\n if (api.cancelled()) return;\n children[2] = { ...children[2]!, status: \"done\" };\n children.push({ status: \"running\", kind: \"diff\", summary: \"patching session.ts\" });\n await api.sleep(1000);\n if (api.cancelled()) return;\n children[3] = { ...children[3]!, status: \"done\" };\n await api.sleep(400);\n } finally {\n clearInterval(tick);\n }\n\n api.setActive((prev) => replaceById(prev, id, null));\n api.push({\n kind: \"subagent\",\n task: \"auth regressions\",\n children: [\n { kind: \"reasoning\", summary: \"scanned 14 fixtures, found 2 stale\" },\n { kind: \"tool\", summary: \"grep 'authToken' src/\" },\n { kind: \"tool\", summary: \"read src/auth/session.ts\" },\n { kind: \"diff\", summary: \"src/auth/session.ts +5 -2\" },\n ],\n seconds: (Date.now() - start) / 1000,\n ok: true,\n });\n await api.sleep(400);\n if (api.cancelled()) return;\n\n // CJK streaming response\n const id2 = \"resp-cjk\";\n const text =\n \"我已经定位到问题:session.ts 的 token 续期逻辑在 0.24 改了顺序,导致旧 token 在 refresh 之前就被清掉。修了,再跑测试都过了。\";\n const lines: { kind: \"text\" | \"code\" | \"header\" | \"list\"; text: string }[] = [\n { kind: \"header\", text: \"结论\" },\n { kind: \"text\", text },\n { kind: \"list\", text: \"已修复,提交在 src/auth/session.ts\" },\n ];\n let frame2 = 0;\n let revealed2 = 0;\n api.setActive((prev) => appendCard(prev, { id: id2, kind: \"response\", tail: [], frame: frame2 }));\n while (revealed2 < lines.length && !api.cancelled()) {\n await api.sleep(180);\n frame2++;\n revealed2++;\n const tail = lines\n .slice(0, revealed2)\n .slice(-4)\n .map((l) => (l.kind === \"list\" ? ` - ${l.text}` : l.text));\n api.setActive((prev) =>\n replaceById(prev, id2, { id: id2, kind: \"response\", tail, frame: frame2 }),\n );\n }\n api.setActive((prev) => replaceById(prev, id2, null));\n api.push({ kind: \"response\", lines });\n}\n\nasync function sceneEdgeCases(api: DemoApi): Promise<void> {\n api.push({ kind: \"user\", text: \"summarize the deploy log\" });\n await api.sleep(400);\n if (api.cancelled()) return;\n\n // aborted reasoning\n const reasoningText =\n \"Pulling deploy logs from the last hour. Looking for warnings and errors. The database connection retried 3 times before stabilizing...\";\n const reasonStart = Date.now();\n const r = await streamReasoning(api, reasoningText, 1200, 800);\n if (api.cancelled()) return;\n api.push({\n kind: \"reasoning\",\n tail: r.lines.slice(-2),\n paragraphs: 1,\n tokens: r.tokens,\n seconds: (Date.now() - reasonStart) / 1000,\n aborted: true,\n });\n await api.sleep(300);\n if (api.cancelled()) return;\n\n // mcp tool\n await streamTool(api, {\n tone: \"mcp\",\n name: \"mcp.linear.search_issues\",\n args: '{\"query\":\"deploy error\",\"limit\":5}',\n output: [\n \"INC-2871 — db pool exhausted on retry\",\n \"INC-2872 — auth refresh race\",\n \"INC-2873 — log shipper timeout\",\n ],\n durationMs: 1100,\n });\n if (api.cancelled()) return;\n api.push({\n kind: \"tool\",\n tone: \"mcp\",\n name: \"mcp.linear.search_issues\",\n args: '{\"query\":\"deploy error\",\"limit\":5}',\n output: [\"INC-2873 — log shipper timeout\"],\n hidden: 2,\n seconds: 1.1,\n status: \"ok\",\n });\n await api.sleep(300);\n if (api.cancelled()) return;\n\n // long fetch\n await streamTool(api, {\n tone: \"fetch\",\n name: \"web_fetch\",\n args: \"https://status.deepseek.com/api/incidents\",\n output: [\"status: 200\", '{\"incidents\":[]}'],\n durationMs: 700,\n });\n if (api.cancelled()) return;\n api.push({\n kind: \"tool\",\n tone: \"fetch\",\n name: \"web_fetch\",\n args: \"https://status.deepseek.com/api/incidents\",\n output: [\"status: 200\", '{\"incidents\":[]}'],\n hidden: 0,\n seconds: 0.7,\n status: \"ok\",\n });\n await api.sleep(300);\n if (api.cancelled()) return;\n\n // warn + error\n api.push({ kind: \"warn\", message: \"context budget at 73% · /compact suggested\" });\n await api.sleep(400);\n api.push({ kind: \"error\", message: \"rate-limit hit · backing off 8s\" });\n await api.sleep(500);\n api.push({ kind: \"usage\", inputTokens: 487, outputTokens: 96, totalCost: 0.0021 });\n}\n\nfunction wrapText(text: string, width: number): string[] {\n const lines: string[] = [];\n for (const para of text.split(\"\\n\")) {\n if (para.length <= width) {\n lines.push(para);\n continue;\n }\n const words = para.split(\" \");\n let cur = \"\";\n for (const w of words) {\n if (cur.length + w.length + 1 > width) {\n if (cur) lines.push(cur);\n cur = w;\n } else {\n cur = cur ? `${cur} ${w}` : w;\n }\n }\n if (cur) lines.push(cur);\n }\n return lines;\n}\n\nexport interface CardDemoOptions {\n readonly stdout?: NodeJS.WriteStream;\n readonly stdin?: NodeJS.ReadStream;\n}\n\nexport async function runCardDemo(opts: CardDemoOptions = {}): Promise<void> {\n const stdout = opts.stdout ?? process.stdout;\n const stdin = opts.stdin ?? process.stdin;\n\n if (!stdin.isTTY || !stdout.isTTY) {\n console.error(\"card-demo requires an interactive TTY.\");\n process.exit(1);\n }\n\n const pools = {\n char: new CharPool(),\n style: new StylePool(),\n hyperlink: new HyperlinkPool(),\n };\n\n let resolveExit: () => void = () => {};\n const exited = new Promise<void>((resolve) => {\n resolveExit = resolve;\n });\n\n const handle: Handle = mount(<CardDemoShell onExit={() => resolveExit()} />, {\n viewportWidth: stdout.columns ?? 80,\n viewportHeight: stdout.rows ?? 30,\n pools,\n write: (bytes) => stdout.write(bytes),\n stdin,\n onExit: () => resolveExit(),\n });\n\n const onResize = () => handle.resize(stdout.columns ?? 80, stdout.rows ?? 30);\n stdout.on(\"resize\", onResize);\n\n try {\n await exited;\n } finally {\n stdout.off(\"resize\", onResize);\n handle.destroy();\n stdin.pause();\n }\n}\n"],"mappings":";;;;;;;;;;;;AACA,OAAO,SAAS,WAAW,QAAQ,gBAAgB;AAWnD,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,OAAO;AACb,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,KAAK;AACX,IAAM,OAAO;AACb,IAAM,MAAM;AACZ,IAAM,OAAO;AACb,IAAM,UAAU,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAuFjE,IAAM,aAAuC;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AACT;AACA,IAAM,aAAuC;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AACT;AACA,IAAM,gBAA0C;AAAA,EAC9C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AACT;AAkDA,SAAS,UAAU,EAAE,KAAK,GAA6C;AACrE,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aACE,oCAAC,mBAAU,KAAV,EAAc,eAAc,UAAS,WAAW,KAC/C,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,KACtC,oCAAC,mBAAU,MAAV,EAAe,OAAO,UAAQ,QAAC,GAChC,oCAAC,mBAAU,MAAV,MAAgB,KAAK,IAAK,CAC7B,CACF;AAAA,IAEJ,KAAK;AACH,aACE,oCAAC,mBAAU,KAAV,EAAc,eAAc,UAAS,WAAW,KAC/C,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,KACtC,oCAAC,mBAAU,MAAV,EAAe,OAAO,KAAK,UAAU,MAAM,UAAQ,QAAC,GACrD,oCAAC,mBAAU,MAAV,EAAe,OAAO,KAAK,UAAU,MAAM,QAAQ,MAAI,QACrD,KAAK,UAAU,wBAAwB,WAC1C,GACA,oCAAC,mBAAU,MAAV,EAAe,OAAO,SACpB,GAAG,KAAK,UAAU,aAAO,KAAK,MAAM,aAAU,KAAK,QAAQ,QAAQ,CAAC,CAAC,GACxE,CACF,GACC,KAAK,KAAK,IAAI,CAAC,MAAM;AAAA;AAAA,QAEpB,oCAAC,mBAAU,KAAV,EAAc,KAAK,KAAK,CAAC,IAAI,aAAa,KACzC,oCAAC,mBAAU,MAAV,EAAe,UAAQ,QAAE,IAAK,CACjC;AAAA,OACD,CACH;AAAA,IAEJ,KAAK;AACH,aAAO,oCAAC,iBAAc,MAAY;AAAA,IACpC,KAAK;AACH,aACE,oCAAC,mBAAU,KAAV,EAAc,eAAc,UAAS,WAAW,KAC/C,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,KACtC,oCAAC,mBAAU,MAAV,EAAe,OAAO,UAAQ,QAAC,GAChC,oCAAC,mBAAU,MAAV,EAAe,OAAO,QAAQ,MAAI,QAAC,MAEpC,GACA,oCAAC,mBAAU,MAAV,EAAe,OAAO,SACpB,GAAG,KAAK,MAAM,MAAM,eAAY,KAAK,QAAQ,QAAQ,CAAC,CAAC,GAC1D,CACF,GACC,KAAK,MAAM,IAAI,CAAC,SACf,oCAAC,mBAAU,KAAV,EAAc,KAAK,KAAK,OAAO,aAAa,GAAG,eAAc,OAAM,KAAK,KACvE,oCAAC,mBAAU,MAAV,EAAe,OAAO,UAAU,KAAK,MAAM,KACzC,UAAU,KAAK,MAAM,CACxB,GACA,oCAAC,mBAAU,MAAV,EAAe,UAAU,KAAK,WAAW,aAAY,KAAK,KAAM,GAChE,KAAK,OAAO,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,QAAK,KAAK,IAAI,EAAG,IAAoB,IACnF,CACD,CACH;AAAA,IAEJ,KAAK;AACH,aACE,oCAAC,mBAAU,KAAV,EAAc,eAAc,UAAS,WAAW,KAC/C,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,KACtC,oCAAC,mBAAU,MAAV,EAAe,OAAO,KAAK,UAAU,MAAM,MAAI,QAAC,GACjD,oCAAC,mBAAU,MAAV,EAAe,OAAO,KAAK,UAAU,MAAM,IAAI,MAAI,QACjD,KAAK,UAAU,gCAAgC,UAClD,CACF,GACC,KAAK,MAAM,IAAI,CAAC,MAAM;AAAA;AAAA,QAErB,oCAAC,mBAAU,KAAV,EAAc,KAAK,QAAQ,CAAC,IAAI,aAAa,KAC3C,KAAK,SAAS,SACb,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,KAAK,QAAQ,GAAI,IAC9C,KAAK,SAAS,WAChB,oCAAC,mBAAU,MAAV,EAAe,MAAI,QAAE,KAAK,QAAQ,GAAI,IACrC,KAAK,SAAS,SAChB,oCAAC,mBAAU,MAAV,MAAgB,YAAO,KAAK,IAAI,EAAG,IAEpC,oCAAC,mBAAU,MAAV,MAAgB,KAAK,QAAQ,GAAI,CAEtC;AAAA,OACD,CACH;AAAA,IAEJ,KAAK;AACH,aACE,oCAAC,mBAAU,KAAV,EAAc,eAAc,UAAS,WAAW,KAC/C,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,KACtC,oCAAC,mBAAU,MAAV,EAAe,OAAO,QAAM,MAAC,GAC9B,oCAAC,mBAAU,MAAV,EAAe,MAAI,QAAE,KAAK,IAAK,GAChC,oCAAC,mBAAU,MAAV,EAAe,OAAO,MAAK,IAAI,KAAK,KAAK,EAAG,GAC7C,oCAAC,mBAAU,MAAV,EAAe,OAAO,OAAM,IAAI,KAAK,OAAO,EAAG,CAClD,GACC,KAAK,QAAQ,IAAI,CAAC,KAAK;AAAA;AAAA,QAEtB,oCAAC,mBAAU,KAAV,EAAc,KAAK,KAAK,CAAC,IAAI,aAAa,GAAG,eAAc,OAAM,KAAK,KACrE,oCAAC,mBAAU,MAAV,EAAe,OAAO,IAAI,SAAS,MAAM,KAAK,IAAI,SAAS,MAAM,MAAM,SACrE,IAAI,IACP,GACA,oCAAC,mBAAU,MAAV,EAAe,UAAU,IAAI,SAAS,OAAM,IAAI,IAAK,CACxD;AAAA,OACD,CACH;AAAA,IAEJ,KAAK;AACH,aACE,oCAAC,mBAAU,KAAV,EAAc,eAAc,UAAS,WAAW,KAC/C,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,KACtC,oCAAC,mBAAU,MAAV,EAAe,OAAO,KAAK,KAAK,SAAS,OAAM,KAAK,KAAK,WAAM,QAAI,GACpE,oCAAC,mBAAU,MAAV,EAAe,OAAO,QAAQ,MAAI,QAAC,UAEpC,GACA,oCAAC,mBAAU,MAAV,MAAgB,KAAK,IAAK,GAC3B,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,QAAK,KAAK,QAAQ,QAAQ,CAAC,CAAC,GAAI,CACjE,GACC,KAAK,SAAS,IAAI,CAAC,GAAG;AAAA;AAAA,QAErB,oCAAC,mBAAU,KAAV,EAAc,KAAK,OAAO,CAAC,IAAI,aAAa,GAAG,eAAc,OAAM,KAAK,KACvE,oCAAC,mBAAU,MAAV,EAAe,OAAO,UAAQ,QAAC,GAChC,oCAAC,mBAAU,MAAV,EAAe,OAAO,cAAc,EAAE,IAAI,KAAI,cAAc,EAAE,IAAI,CAAE,GACrE,oCAAC,mBAAU,MAAV,EAAe,UAAQ,QAAE,EAAE,OAAQ,CACtC;AAAA,OACD,CACH;AAAA,IAEJ,KAAK;AACH,aACE,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,GAAG,WAAW,KACpD,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAO,QAAC,GAC/B,oCAAC,mBAAU,MAAV,EAAe,OAAO,QACpB,MAAM,KAAK,WAAW,aAAU,KAAK,YAAY,UAAO,KAAK,UAAU,QAAQ,CAAC,CAAC,EACpF,CACF;AAAA,IAEJ,KAAK;AACH,aACE,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,GAAG,WAAW,KACpD,oCAAC,mBAAU,MAAV,EAAe,OAAO,OAAK,QAAC,GAC7B,oCAAC,mBAAU,MAAV,EAAe,OAAO,OAAM,KAAK,OAAQ,CAC5C;AAAA,IAEJ,KAAK;AACH,aACE,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,GAAG,WAAW,KACpD,oCAAC,mBAAU,MAAV,EAAe,OAAO,QAAM,QAAC,GAC9B,oCAAC,mBAAU,MAAV,EAAe,OAAO,QAAO,KAAK,OAAQ,CAC7C;AAAA,EAEN;AACF;AAEA,SAAS,cAAc,EAAE,KAAK,GAA8C;AAC1E,QAAM,QAAQ,KAAK,WAAW,OAAO,WAAM,KAAK,WAAW,aAAa,WAAM;AAC9E,QAAM,cACJ,KAAK,WAAW,OAAO,WAAW,KAAK,IAAI,IAAI,KAAK,WAAW,aAAa,QAAQ;AACtF,SACE,oCAAC,mBAAU,KAAV,EAAc,eAAc,UAAS,WAAW,KAC/C,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,KACtC,oCAAC,mBAAU,MAAV,EAAe,OAAO,eAAc,KAAM,GAC3C,oCAAC,mBAAU,MAAV,EAAe,OAAO,eAAc,WAAW,KAAK,IAAI,CAAE,GAC3D,oCAAC,mBAAU,MAAV,EAAe,OAAO,aAAa,MAAI,QACrC,KAAK,IACR,GACA,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,KAAK,IAAK,GACxC,KAAK,WAAW,aACf,oCAAC,mBAAU,MAAV,EAAe,OAAO,KAAK,MAAI,QAAC,UAEjC,IACE,MACH,KAAK,WAAW,WAAW,KAAK,YAC/B,oCAAC,mBAAU,MAAV,EAAe,OAAO,QAAO,KAAK,KAAK,SAAS,EAAG,IAClD,MACJ,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,GAAG,KAAK,QAAQ,QAAQ,CAAC,CAAC,GAAI,CAC/D,GACC,KAAK,WAAW,aAAa,OAC5B,0DACG,KAAK,SAAS,IACb,oCAAC,mBAAU,KAAV,EAAc,aAAa,KAC1B,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,KAAK,KAAK,MAAM,gBAAiB,CAClE,IACE,MACH,KAAK,OAAO,IAAI,CAAC,MAAM;AAAA;AAAA,IAEtB,oCAAC,mBAAU,KAAV,EAAc,KAAK,QAAQ,CAAC,IAAI,aAAa,KAC5C,oCAAC,mBAAU,MAAV,EAAe,UAAQ,MAAC,OAAO,KAAK,WAAW,UAAU,MAAM,UAC7D,QAAQ,GACX,CACF;AAAA,GACD,CACH,CAEJ;AAEJ;AAEA,SAAS,UAAU,QAAoC;AACrD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AACA,SAAS,UAAU,QAAoC;AACrD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AACA,SAAS,cAAc,MAAgC;AACrD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AACA,SAAS,cAAc,MAAgC;AACrD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,cAAc,EAAE,KAAK,GAAkD;AAC9E,QAAM,OAAO,QAAQ,KAAK,QAAQ,QAAQ,MAAM,KAAK;AACrD,SACE;AAAA,IAAC,mBAAU;AAAA,IAAV;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa;AAAA,MACb,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,IAEX,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,KACtC,oCAAC,mBAAU,MAAV,EAAe,OAAO,UAAS,IAAK,GACrC,oCAAC,mBAAU,MAAV,EAAe,OAAO,QAAQ,MAAI,QAAC,WAEpC,GACA,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,QAAK,KAAK,MAAM,MAAO,CACxD;AAAA,IACC,KAAK,KAAK,IAAI,CAAC,MAAM;AAAA;AAAA,MAEpB,oCAAC,mBAAU,MAAV,EAAe,KAAK,MAAM,CAAC,IAAI,UAAQ,QACrC,IACH;AAAA,KACD;AAAA,EACH;AAEJ;AAEA,SAAS,eAAe,EAAE,KAAK,GAA6C;AAC1E,QAAM,OAAO,QAAQ,KAAK,QAAQ,QAAQ,MAAM,KAAK;AACrD,QAAM,UAAU,cAAc,KAAK,IAAI;AACvC,QAAM,OAAO,KAAK,YAAY,MAAM,CAAC,OAAO;AAC5C,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,YAAY,SAAS,KAAK,MAAM;AAChE,QAAM,WAAW,KAAK,YAAY,KAAM,QAAQ,CAAC;AACjD,QAAM,IAAI,WAAW,KAAK,IAAI;AAC9B,SACE;AAAA,IAAC,mBAAU;AAAA,IAAV;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa;AAAA,MACb,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,IAEX,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,KACtC,oCAAC,mBAAU,MAAV,EAAe,OAAO,KAAI,IAAK,GAChC,oCAAC,mBAAU,MAAV,EAAe,OAAO,KAAI,WAAW,KAAK,IAAI,CAAE,GACjD,oCAAC,mBAAU,MAAV,EAAe,OAAO,GAAG,MAAI,QAC3B,KAAK,IACR,GACA,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,KAAK,IAAK,GACxC,KAAK,QACJ,oCAAC,mBAAU,MAAV,EAAe,OAAO,QACpB,KAAK,KAAK,MAAM,OAAO,IAAI,KAAK,MAAM,GAAG,EAC5C,IACE,MACJ,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,QAAK,OAAO,GAAI,CACjD;AAAA,IACC,SAAS,IACR,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,KAAK,MAAM,gBAAiB,IACzD;AAAA,IACH,KAAK,IAAI,CAAC,MAAM;AAAA;AAAA,MAEf,oCAAC,mBAAU,MAAV,EAAe,KAAK,MAAM,CAAC,IAAI,UAAQ,QACrC,QAAQ,GACX;AAAA,KACD;AAAA,EACH;AAEJ;AAEA,SAAS,eAAe,EAAE,KAAK,GAA6C;AAC1E,QAAM,OAAO,QAAQ,KAAK,QAAQ,QAAQ,MAAM,KAAK;AACrD,QAAM,OAAO,KAAK,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU,EAAE,WAAW,SAAS,EAAE;AACrF,SACE;AAAA,IAAC,mBAAU;AAAA,IAAV;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa;AAAA,MACb,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,IAEX,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,KACtC,oCAAC,mBAAU,MAAV,EAAe,OAAO,UAAQ,QAAC,GAChC,oCAAC,mBAAU,MAAV,EAAe,OAAO,QAAQ,MAAI,QAChC,KAAK,KACR,GACA,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,GAAG,IAAI,OAAO,KAAK,MAAM,MAAM,OAAQ,CACxE;AAAA,IACC,KAAK,MAAM,IAAI,CAAC,MAAM,MAAM;AAC3B,YAAM,UAAU,MAAM,KAAK;AAC3B,YAAM,QAAQ,UAAU,OAAO,UAAU,KAAK,MAAM;AACpD,aACE,oCAAC,mBAAU,KAAV,EAAc,KAAK,KAAK,OAAO,eAAc,OAAM,KAAK,KACvD,oCAAC,mBAAU,MAAV,EAAe,OAAO,UAAU,KAAK,MAAM,KAAI,KAAM,GACtD,oCAAC,mBAAU,MAAV,EAAe,MAAM,SAAS,UAAU,KAAK,WAAW,UAAU,CAAC,WACjE,KAAK,KACR,GACC,KAAK,OAAO,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,QAAK,KAAK,IAAI,EAAG,IAAoB,MAChF,UAAU,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAO,oBAAa,IAAoB,IAC5E;AAAA,IAEJ,CAAC;AAAA,EACH;AAEJ;AAEA,SAAS,mBAAmB,EAAE,KAAK,GAAiD;AAClF,QAAM,OAAO,QAAQ,KAAK,QAAQ,QAAQ,MAAM,KAAK;AACrD,QAAM,eAAe,KAAK,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AACzE,SACE;AAAA,IAAC,mBAAU;AAAA,IAAV;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa;AAAA,MACb,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,IAEX,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,KACtC,oCAAC,mBAAU,MAAV,EAAe,OAAO,UAAS,IAAK,GACrC,oCAAC,mBAAU,MAAV,EAAe,OAAO,QAAQ,MAAI,QAAC,UAEpC,GACA,oCAAC,mBAAU,MAAV,MAAgB,KAAK,IAAK,GAC3B,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,GAAG,YAAY,UAAW,CAC3D;AAAA,IACC,KAAK,SAAS,IAAI,CAAC,GAAG,MAAM;AAC3B,YAAM,SAAS,EAAE,WAAW,YAAY,OAAO;AAC/C,YAAM,SAAS,EAAE,WAAW,YAAY,QAAQ;AAChD,aACE;AAAA,QAAC,mBAAU;AAAA,QAAV;AAAA,UAEC,KAAK,MAAM,CAAC;AAAA,UACZ,eAAc;AAAA,UACd,KAAK;AAAA;AAAA,QAEL,oCAAC,mBAAU,MAAV,EAAe,OAAO,UAAQ,QAAC;AAAA,QAChC,oCAAC,mBAAU,MAAV,EAAe,OAAO,UAAS,MAAO;AAAA,QACvC,oCAAC,mBAAU,MAAV,EAAe,OAAO,cAAc,EAAE,IAAI,KAAI,cAAc,EAAE,IAAI,CAAE;AAAA,QACrE,oCAAC,mBAAU,MAAV,EAAe,UAAU,EAAE,WAAW,UAAS,EAAE,OAAQ;AAAA,MAC5D;AAAA,IAEJ,CAAC;AAAA,EACH;AAEJ;AAEA,SAAS,mBAAmB,EAAE,KAAK,GAAiD;AAClF,QAAM,OAAO,QAAQ,KAAK,QAAQ,QAAQ,MAAM,KAAK;AACrD,SACE;AAAA,IAAC,mBAAU;AAAA,IAAV;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa;AAAA,MACb,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,IAEX,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,KACtC,oCAAC,mBAAU,MAAV,EAAe,OAAO,MAAK,IAAK,GACjC,oCAAC,mBAAU,MAAV,EAAe,OAAO,IAAI,MAAI,QAAC,eAEhC,CACF;AAAA,IACC,KAAK,KAAK,IAAI,CAAC,MAAM;AAAA;AAAA,MAEpB,oCAAC,mBAAU,MAAV,EAAe,KAAK,OAAO,CAAC,MAAK,QAAQ,GAAI;AAAA,KAC/C;AAAA,EACH;AAEJ;AAEA,SAAS,eAAe,EAAE,KAAK,GAA6C;AAC1E,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,oCAAC,iBAAc,MAAY;AAAA,IACpC,KAAK;AACH,aAAO,oCAAC,kBAAe,MAAY;AAAA,IACrC,KAAK;AACH,aAAO,oCAAC,kBAAe,MAAY;AAAA,IACrC,KAAK;AACH,aAAO,oCAAC,sBAAmB,MAAY;AAAA,IACzC,KAAK;AACH,aAAO,oCAAC,sBAAmB,MAAY;AAAA,EAC3C;AACF;AAEA,SAAS,UAAU,EAAE,WAAW,KAAK,GAA4D;AAC/F,QAAM,WAAW,YAAY,KAAM,QAAQ,CAAC;AAC5C,SACE,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,KACtC,oCAAC,mBAAU,MAAV,EAAe,OAAO,OAAO,MAAI,QAAC,iBAEnC,GACA,oCAAC,mBAAU,MAAV,EAAe,OAAO,QAAM,aAAW,GACxC,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,GAAG,OAAO,GAAI,GAC7C,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAQ,IAAI,KAAK,QAAQ,CAAC,CAAC,EAAG,CACvD;AAEJ;AAEA,SAAS,cAAkC;AACzC,SACE,oCAAC,mBAAU,KAAV,EAAc,eAAc,OAAM,KAAK,GAAG,WAAW,KACpD,oCAAC,mBAAU,MAAV,EAAe,OAAO,OAAO,MAAI,QAAC,QAEnC,GACA,oCAAC,mBAAU,MAAV,EAAe,UAAQ,QAAC,0BAAmB,GAC5C,oCAAC,mBAAU,MAAV,EAAe,OAAO,SAAO,QAAC,CACjC;AAEJ;AAEA,SAAS,UAA8B;AACrC,SACE,oCAAC,mBAAU,KAAV,EAAc,WAAW,KACxB,oCAAC,mBAAU,MAAV,EAAe,UAAQ,QAAC,0DAAkD,CAC7E;AAEJ;AAcO,SAAS,cAAc,EAAE,OAAO,GAAmC;AACxE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAgC,CAAC,CAAC;AAChE,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAgC,CAAC,CAAC;AAC9D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,CAAC;AACxC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,CAAC;AAClC,QAAM,aAAa,OAAO,KAAK,IAAI,CAAC;AAEpC,eAAa,CAAC,MAAM;AAClB,QAAI,EAAE,OAAQ,QAAO;AAAA,EACvB,CAAC;AAED,YAAU,MAAM;AACd,UAAM,KAAK,YAAY,MAAM;AAC3B,YAAM,MAAM,KAAK,IAAI,IAAI,WAAW;AACpC,iBAAW,GAAG;AACd,cAAS,MAAM,MAAQ,IAAM;AAAA,IAC/B,GAAG,GAAG;AACN,WAAO,MAAM,cAAc,EAAE;AAAA,EAC/B,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,QAAI,YAAY;AAChB,UAAM,MAAe;AAAA,MACnB,WAAW,CAAC,YAAY;AACtB,YAAI,UAAW;AACf,kBAAU,CAAC,SAAS,QAAQ,IAAI,CAAC;AAAA,MACnC;AAAA,MACA,MAAM,CAAC,SAAS;AACd,YAAI,UAAW;AACf,mBAAW,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,MACtC;AAAA,MACA,OAAO,MAAM;AACX,YAAI,UAAW;AACf,kBAAU,CAAC,CAAC;AACZ,mBAAW,CAAC,CAAC;AACb,mBAAW,UAAU,KAAK,IAAI;AAAA,MAChC;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAAA,IACrD;AACA,SAAK,UAAU,GAAG;AAClB,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACE,oCAAC,mBAAU,KAAV,EAAc,eAAc,YAC3B,oCAAC,aAAU,WAAW,SAAS,MAAY,GAC3C,oCAAC,mBAAU,KAAV,EAAc,eAAc,YAC1B,QAAQ,IAAI,CAAC,MAAM;AAAA;AAAA,IAElB,oCAAC,aAAU,KAAK,KAAK,CAAC,IAAI,MAAY;AAAA,GACvC,CACH,GACC,OAAO,IAAI,CAAC,MAAM;AAAA;AAAA,IAEjB,oCAAC,kBAAe,KAAK,KAAK,CAAC,IAAI,KAAK,EAAE,IAAI,MAAY;AAAA,GACvD,GACA,OAAO,WAAW,IAAI,oCAAC,iBAAY,IAAK,MACzC,oCAAC,aAAQ,CACX;AAEJ;AAEA,SAAS,YACP,OACA,IACA,MACuB;AACvB,MAAI,SAAS,KAAM,QAAO,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AACzD,SAAO,MAAM,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,OAAO,CAAE;AAClD;AAEA,SAAS,WAAW,OAA8B,MAAyC;AACzF,SAAO,CAAC,GAAG,OAAO,IAAI;AACxB;AAEA,eAAe,UAAU,KAA6B;AACpD,SAAO,CAAC,IAAI,UAAU,GAAG;AACvB,UAAM,oBAAoB,GAAG;AAC7B,QAAI,IAAI,UAAU,EAAG;AACrB,UAAM,IAAI,MAAM,GAAI;AACpB,QAAI,IAAI,UAAU,EAAG;AACrB,UAAM,cAAc,GAAG;AACvB,QAAI,IAAI,UAAU,EAAG;AACrB,UAAM,IAAI,MAAM,GAAG;AACnB,QAAI,IAAI,UAAU,EAAG;AACrB,UAAM,eAAe,GAAG;AACxB,QAAI,IAAI,UAAU,EAAG;AACrB,UAAM,IAAI,MAAM,IAAI;AACpB,QAAI,MAAM;AACV,UAAM,IAAI,MAAM,GAAG;AAAA,EACrB;AACF;AAEA,eAAe,gBACb,KACA,UACA,YACA,WACgE;AAChE,QAAM,KAAK;AACX,QAAM,QAAQ,KAAK,IAAI;AACvB,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,MAAI,UAAU;AACd,MAAI,UAAU,CAAC,SAAS,WAAW,MAAM,EAAE,IAAI,MAAM,aAAa,MAAM,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC;AAC/F,SAAO,KAAK,IAAI,IAAI,QAAQ,cAAc,CAAC,IAAI,UAAU,GAAG;AAC1D,QAAI,cAAc,UAAa,KAAK,IAAI,IAAI,SAAS,WAAW;AAC9D,gBAAU;AACV;AAAA,IACF;AACA,UAAM,IAAI,MAAM,EAAE;AAClB;AACA,eAAW,SAAS,MAAM,GAAG,KAAK,IAAI,SAAS,QAAQ,SAAS,SAAS,CAAC,CAAC;AAC3E,UAAMA,SAAQ,SAAS,UAAU,EAAE;AACnC,UAAM,OAAOA,OAAM,MAAM,EAAE;AAC3B,UAAM,SAAS,KAAK,MAAM,SAAS,SAAS,CAAC;AAC7C,UAAM,WAAW,cAAc,UAAa,KAAK,IAAI,IAAI,SAAS,YAAY;AAC9E,QAAI;AAAA,MAAU,CAAC,SACb,YAAY,MAAM,IAAI;AAAA,QACpB;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,UAAU,CAAC,SAAS,YAAY,MAAM,IAAI,IAAI,CAAC;AACnD,QAAM,QAAQ,SAAS,UAAU,EAAE;AACnC,SAAO,EAAE,QAAQ,KAAK,MAAM,SAAS,SAAS,CAAC,GAAG,OAAO,QAAQ;AACnE;AAEA,eAAe,WACb,KACA,QAQe;AACf,QAAM,KAAK,QAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AACtD,QAAM,QAAQ,KAAK,IAAI;AACvB,MAAI,QAAQ;AACZ,QAAM,MAAgB,CAAC;AACvB,MAAI;AAAA,IAAU,CAAC,SACb,WAAW,MAAM;AAAA,MACf;AAAA,MACA,MAAM;AAAA,MACN,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,MACb,aAAa;AAAA,MACb,WAAW;AAAA,MACX;AAAA,MACA,OAAO,OAAO;AAAA,IAChB,CAAC;AAAA,EACH;AACA,QAAM,WAAW,OAAO,aAAa,KAAK,IAAI,GAAG,OAAO,OAAO,MAAM;AACrE,MAAI,UAAU;AACd,SAAO,KAAK,IAAI,IAAI,QAAQ,OAAO,cAAc,CAAC,IAAI,UAAU,GAAG;AACjE,UAAM,IAAI,MAAM,EAAE;AAClB;AACA,UAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,WAAO,UAAU,OAAO,OAAO,UAAU,UAAU,UAAU,UAAU;AACrE,UAAI,KAAK,OAAO,OAAO,OAAO,KAAK,EAAE;AACrC;AAAA,IACF;AACA,QAAI;AAAA,MAAU,CAAC,SACb,YAAY,MAAM,IAAI;AAAA,QACpB;AAAA,QACA,MAAM;AAAA,QACN,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,QACb,aAAa,IAAI,MAAM;AAAA,QACvB,WAAW;AAAA,QACX;AAAA,QACA,OAAO,OAAO;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,UAAU,CAAC,SAAS,YAAY,MAAM,IAAI,IAAI,CAAC;AACrD;AAEA,eAAe,oBAAoB,KAA6B;AAC9D,MAAI,KAAK,EAAE,MAAM,QAAQ,MAAM,2CAA2C,CAAC;AAC3E,QAAM,IAAI,MAAM,GAAG;AACnB,MAAI,IAAI,UAAU,EAAG;AAGrB,QAAM,gBACJ;AACF,QAAM,cAAc,KAAK,IAAI;AAC7B,QAAM,IAAI,MAAM,gBAAgB,KAAK,eAAe,IAAI;AACxD,MAAI,IAAI,UAAU,EAAG;AACrB,MAAI,KAAK;AAAA,IACP,MAAM;AAAA,IACN,MAAM,EAAE,MAAM,MAAM,EAAE;AAAA,IACtB,YAAY;AAAA,IACZ,QAAQ,EAAE;AAAA,IACV,UAAU,KAAK,IAAI,IAAI,eAAe;AAAA,EACxC,CAAC;AACD,QAAM,IAAI,MAAM,GAAG;AAGnB,QAAM,SAAS;AACf,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI,QAAQ;AACZ,QAAM,QAAoB;AAAA,IACxB,EAAE,QAAQ,QAAQ,OAAO,2BAA2B;AAAA,IACpD,EAAE,QAAQ,QAAQ,OAAO,0BAA0B;AAAA,IACnD,EAAE,QAAQ,QAAQ,OAAO,uBAAuB;AAAA,IAChD,EAAE,QAAQ,QAAQ,OAAO,gBAAgB;AAAA,EAC3C;AAEA,QAAM,aAAa,CAAC,kBAAiC;AACnD,QAAI;AAAA,MAAU,CAAC,SACb;AAAA,QACE,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,IAAI,OAAO,WAAW,MAAM,SAAS,CAAC;AAAA,QACtE;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AACA,aAAS,WAAuB;AAC9B,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,MAAM,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AAAA,IAAU,CAAC,SACb,WAAW,MAAM;AAAA,MACf,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,MAAM,MAAM;AAAA,MACnB,eAAe;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,WAAW,YAAY,MAAM;AACjC;AACA,QAAI,UAAU,CAAC,SAAS;AACtB,YAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AAC5C,UAAI,CAAC,OAAO,IAAI,SAAS,OAAQ,QAAO;AACxC,aAAO,YAAY,MAAM,QAAQ,EAAE,GAAG,KAAK,MAAM,CAAC;AAAA,IACpD,CAAC;AAAA,EACH,GAAG,EAAE;AAEL,MAAI;AAEF,UAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAI,QAAQ,UAAU;AAC7C,eAAW,CAAC;AACZ,UAAM,WAAW,KAAK;AAAA,MACpB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AACD,QAAI,IAAI,UAAU,EAAG;AACrB,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ,CAAC,6CAA6C;AAAA,MACtD,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAI,QAAQ,OAAO;AAC1C,eAAW,CAAC;AACZ,UAAM,IAAI,MAAM,GAAG;AACnB,QAAI,IAAI,UAAU,EAAG;AAGrB,UAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAI,QAAQ,UAAU;AAC7C,eAAW,CAAC;AACZ,UAAM,WAAW,KAAK;AAAA,MACpB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ,CAAC;AAAA,MACT,YAAY;AAAA,IACd,CAAC;AACD,QAAI,IAAI,UAAU,EAAG;AACrB,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ,CAAC;AAAA,MACT,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAI,QAAQ,WAAW,MAAM,iCAAiC;AACrF,eAAW,IAAI;AACf,UAAM,IAAI,MAAM,GAAG;AACnB,QAAI,IAAI,UAAU,EAAG;AAGrB,UAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAI,QAAQ,WAAW,MAAM,OAAU;AAC9D,eAAW,CAAC;AACZ,UAAM,WAAW,KAAK;AAAA,MACpB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AACD,QAAI,IAAI,UAAU,EAAG;AACrB,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ,CAAC,sCAAsC;AAAA,MAC/C,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAI,QAAQ,OAAO;AAC1C,eAAW,CAAC;AACZ,UAAM,IAAI,MAAM,GAAG;AACnB,QAAI,IAAI,UAAU,EAAG;AAGrB,UAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAI,QAAQ,UAAU;AAC7C,eAAW,CAAC;AAEZ,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,WAAW,KAAK;AAAA,MACpB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,OAAO,EAAE,SAAS,GAAG,KAAK,EAAE;AAAA,IAC9B,CAAC;AACD,QAAI,IAAI,UAAU,EAAG;AACrB,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ,WAAW,MAAM,EAAE;AAAA,MAC3B,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,WAAW;AAAA,IACb,CAAC;AACD,UAAM,IAAI,MAAM,GAAG;AAGnB,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,WAAW,KAAK;AAAA,MACpB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,OAAO,EAAE,SAAS,GAAG,KAAK,EAAE;AAAA,IAC9B,CAAC;AACD,QAAI,IAAI,UAAU,EAAG;AACrB,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ,OAAO,MAAM,EAAE;AAAA,MACvB,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAI,QAAQ,OAAO;AAC1C,eAAW,CAAC;AACZ,UAAM,IAAI,MAAM,GAAG;AACnB,QAAI,IAAI,UAAU,EAAG;AAGrB,UAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAI,QAAQ,UAAU;AAC7C,eAAW,CAAC;AACZ,UAAM,WAAW,KAAK;AAAA,MACpB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AACD,QAAI,IAAI,UAAU,EAAG;AACrB,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ,CAAC,qBAAqB;AAAA,MAC9B,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAI,QAAQ,OAAO;AAC1C,eAAW,IAAI;AAAA,EACjB,UAAE;AACA,kBAAc,QAAQ;AAAA,EACxB;AAGA,QAAM,IAAI,MAAM,GAAG;AACnB,MAAI,UAAU,CAAC,SAAS,YAAY,MAAM,QAAQ,IAAI,CAAC;AACvD,MAAI,KAAK,EAAE,MAAM,QAAQ,OAAO,MAAM,MAAM,GAAG,UAAU,KAAK,IAAI,IAAI,aAAa,IAAK,CAAC;AACzF,QAAM,IAAI,MAAM,GAAG;AACnB,MAAI,IAAI,UAAU,EAAG;AAGrB,MAAI,KAAK;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,MAAM,KAAK,MAAM,kCAAkC;AAAA,MACrD,EAAE,MAAM,KAAK,MAAM,4BAA4B;AAAA,MAC/C,EAAE,MAAM,KAAK,MAAM,mCAAmC;AAAA,MACtD,EAAE,MAAM,KAAK,MAAM,8CAA8C;AAAA,MACjE,EAAE,MAAM,KAAK,MAAM,MAAM;AAAA,MACzB,EAAE,MAAM,KAAK,MAAM,kBAAkB;AAAA,MACrC,EAAE,MAAM,KAAK,MAAM,IAAI;AAAA,IACzB;AAAA,EACF,CAAC;AACD,QAAM,IAAI,MAAM,GAAG;AACnB,MAAI,IAAI,UAAU,EAAG;AAGrB,QAAM,uBAAuB,GAAG;AAClC;AAEA,eAAe,uBAAuB,KAA6B;AACjE,QAAM,QAAuE;AAAA,IAC3E,EAAE,MAAM,UAAU,MAAM,kBAAkB;AAAA,IAC1C,EAAE,MAAM,QAAQ,MAAM,yCAAyC;AAAA,IAC/D,EAAE,MAAM,QAAQ,MAAM,GAAG;AAAA,IACzB,EAAE,MAAM,QAAQ,MAAM,kCAAkC;AAAA,IACxD,EAAE,MAAM,QAAQ,MAAM,iCAAiC;AAAA,IACvD,EAAE,MAAM,QAAQ,MAAM,8CAA8C;AAAA,IACpE,EAAE,MAAM,QAAQ,MAAM,kBAAkB;AAAA,IACxC,EAAE,MAAM,QAAQ,MAAM,IAAI;AAAA,IAC1B,EAAE,MAAM,QAAQ,MAAM,GAAG;AAAA,IACzB,EAAE,MAAM,QAAQ,MAAM,6EAAwE;AAAA,IAC9F,EAAE,MAAM,QAAQ,MAAM,4BAA4B;AAAA,EACpD;AACA,QAAM,KAAK;AACX,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,MAAI,UAAU,CAAC,SAAS,WAAW,MAAM,EAAE,IAAI,MAAM,YAAY,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AACnF,SAAO,WAAW,MAAM,UAAU,CAAC,IAAI,UAAU,GAAG;AAClD,UAAM,IAAI,MAAM,GAAG;AACnB;AACA,eAAW,KAAK,IAAI,MAAM,QAAQ,WAAW,CAAC;AAC9C,UAAM,OAAO,MACV,MAAM,GAAG,QAAQ,EACjB,MAAM,EAAE,EACR;AAAA,MAAI,CAAC,MACJ,EAAE,SAAS,SAAS,KAAK,EAAE,IAAI,KAAK,EAAE,SAAS,SAAS,OAAO,EAAE,IAAI,KAAK,EAAE;AAAA,IAC9E;AACF,QAAI,UAAU,CAAC,SAAS,YAAY,MAAM,IAAI,EAAE,IAAI,MAAM,YAAY,MAAM,MAAM,CAAC,CAAC;AAAA,EACtF;AACA,MAAI,UAAU,CAAC,SAAS,YAAY,MAAM,IAAI,IAAI,CAAC;AACnD,MAAI,KAAK,EAAE,MAAM,YAAY,MAAM,CAAC;AACpC,QAAM,IAAI,MAAM,GAAG;AACnB,MAAI,IAAI,UAAU,EAAG;AACrB,MAAI,KAAK,EAAE,MAAM,SAAS,aAAa,MAAM,cAAc,KAAK,WAAW,MAAO,CAAC;AACrF;AAEA,eAAe,cAAc,KAA6B;AACxD,MAAI,KAAK,EAAE,MAAM,QAAQ,MAAM,gDAAgD,CAAC;AAChF,QAAM,IAAI,MAAM,GAAG;AACnB,MAAI,IAAI,UAAU,EAAG;AAErB,QAAM,KAAK;AACX,MAAI,QAAQ;AACZ,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,WAA4B;AAAA,IAChC,EAAE,QAAQ,WAAW,MAAM,aAAa,SAAS,yBAAyB;AAAA,IAC1E,EAAE,QAAQ,WAAW,MAAM,QAAQ,SAAS,yBAAyB,MAAM,SAAS;AAAA,IACpF,EAAE,QAAQ,WAAW,MAAM,QAAQ,SAAS,4BAA4B,MAAM,OAAO;AAAA,EACvF;AACA,MAAI;AAAA,IAAU,CAAC,SACb,WAAW,MAAM;AAAA,MACf;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU,SAAS,MAAM;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,OAAO,YAAY,MAAM;AAC7B;AACA,QAAI,UAAU,CAAC,SAAS;AACtB,YAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACxC,UAAI,CAAC,OAAO,IAAI,SAAS,WAAY,QAAO;AAC5C,aAAO,YAAY,MAAM,IAAI,EAAE,GAAG,KAAK,OAAO,UAAU,SAAS,MAAM,EAAE,CAAC;AAAA,IAC5E,CAAC;AAAA,EACH,GAAG,EAAE;AAEL,MAAI;AACF,UAAM,IAAI,MAAM,IAAI;AACpB,QAAI,IAAI,UAAU,EAAG;AACrB,aAAS,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC,GAAI,QAAQ,OAAO;AAChD,UAAM,IAAI,MAAM,GAAG;AACnB,QAAI,IAAI,UAAU,EAAG;AACrB,aAAS,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC,GAAI,QAAQ,OAAO;AAChD,UAAM,IAAI,MAAM,IAAI;AACpB,QAAI,IAAI,UAAU,EAAG;AACrB,aAAS,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC,GAAI,QAAQ,OAAO;AAChD,aAAS,KAAK,EAAE,QAAQ,WAAW,MAAM,QAAQ,SAAS,sBAAsB,CAAC;AACjF,UAAM,IAAI,MAAM,GAAI;AACpB,QAAI,IAAI,UAAU,EAAG;AACrB,aAAS,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC,GAAI,QAAQ,OAAO;AAChD,UAAM,IAAI,MAAM,GAAG;AAAA,EACrB,UAAE;AACA,kBAAc,IAAI;AAAA,EACpB;AAEA,MAAI,UAAU,CAAC,SAAS,YAAY,MAAM,IAAI,IAAI,CAAC;AACnD,MAAI,KAAK;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,MACR,EAAE,MAAM,aAAa,SAAS,qCAAqC;AAAA,MACnE,EAAE,MAAM,QAAQ,SAAS,wBAAwB;AAAA,MACjD,EAAE,MAAM,QAAQ,SAAS,2BAA2B;AAAA,MACpD,EAAE,MAAM,QAAQ,SAAS,4BAA4B;AAAA,IACvD;AAAA,IACA,UAAU,KAAK,IAAI,IAAI,SAAS;AAAA,IAChC,IAAI;AAAA,EACN,CAAC;AACD,QAAM,IAAI,MAAM,GAAG;AACnB,MAAI,IAAI,UAAU,EAAG;AAGrB,QAAM,MAAM;AACZ,QAAM,OACJ;AACF,QAAM,QAAuE;AAAA,IAC3E,EAAE,MAAM,UAAU,MAAM,eAAK;AAAA,IAC7B,EAAE,MAAM,QAAQ,KAAK;AAAA,IACrB,EAAE,MAAM,QAAQ,MAAM,iEAA8B;AAAA,EACtD;AACA,MAAI,SAAS;AACb,MAAI,YAAY;AAChB,MAAI,UAAU,CAAC,SAAS,WAAW,MAAM,EAAE,IAAI,KAAK,MAAM,YAAY,MAAM,CAAC,GAAG,OAAO,OAAO,CAAC,CAAC;AAChG,SAAO,YAAY,MAAM,UAAU,CAAC,IAAI,UAAU,GAAG;AACnD,UAAM,IAAI,MAAM,GAAG;AACnB;AACA;AACA,UAAM,OAAO,MACV,MAAM,GAAG,SAAS,EAClB,MAAM,EAAE,EACR,IAAI,CAAC,MAAO,EAAE,SAAS,SAAS,OAAO,EAAE,IAAI,KAAK,EAAE,IAAK;AAC5D,QAAI;AAAA,MAAU,CAAC,SACb,YAAY,MAAM,KAAK,EAAE,IAAI,KAAK,MAAM,YAAY,MAAM,OAAO,OAAO,CAAC;AAAA,IAC3E;AAAA,EACF;AACA,MAAI,UAAU,CAAC,SAAS,YAAY,MAAM,KAAK,IAAI,CAAC;AACpD,MAAI,KAAK,EAAE,MAAM,YAAY,MAAM,CAAC;AACtC;AAEA,eAAe,eAAe,KAA6B;AACzD,MAAI,KAAK,EAAE,MAAM,QAAQ,MAAM,2BAA2B,CAAC;AAC3D,QAAM,IAAI,MAAM,GAAG;AACnB,MAAI,IAAI,UAAU,EAAG;AAGrB,QAAM,gBACJ;AACF,QAAM,cAAc,KAAK,IAAI;AAC7B,QAAM,IAAI,MAAM,gBAAgB,KAAK,eAAe,MAAM,GAAG;AAC7D,MAAI,IAAI,UAAU,EAAG;AACrB,MAAI,KAAK;AAAA,IACP,MAAM;AAAA,IACN,MAAM,EAAE,MAAM,MAAM,EAAE;AAAA,IACtB,YAAY;AAAA,IACZ,QAAQ,EAAE;AAAA,IACV,UAAU,KAAK,IAAI,IAAI,eAAe;AAAA,IACtC,SAAS;AAAA,EACX,CAAC;AACD,QAAM,IAAI,MAAM,GAAG;AACnB,MAAI,IAAI,UAAU,EAAG;AAGrB,QAAM,WAAW,KAAK;AAAA,IACpB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA,EACd,CAAC;AACD,MAAI,IAAI,UAAU,EAAG;AACrB,MAAI,KAAK;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ,CAAC,qCAAgC;AAAA,IACzC,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,IAAI,MAAM,GAAG;AACnB,MAAI,IAAI,UAAU,EAAG;AAGrB,QAAM,WAAW,KAAK;AAAA,IACpB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ,CAAC,eAAe,kBAAkB;AAAA,IAC1C,YAAY;AAAA,EACd,CAAC;AACD,MAAI,IAAI,UAAU,EAAG;AACrB,MAAI,KAAK;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ,CAAC,eAAe,kBAAkB;AAAA,IAC1C,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,IAAI,MAAM,GAAG;AACnB,MAAI,IAAI,UAAU,EAAG;AAGrB,MAAI,KAAK,EAAE,MAAM,QAAQ,SAAS,gDAA6C,CAAC;AAChF,QAAM,IAAI,MAAM,GAAG;AACnB,MAAI,KAAK,EAAE,MAAM,SAAS,SAAS,qCAAkC,CAAC;AACtE,QAAM,IAAI,MAAM,GAAG;AACnB,MAAI,KAAK,EAAE,MAAM,SAAS,aAAa,KAAK,cAAc,IAAI,WAAW,MAAO,CAAC;AACnF;AAEA,SAAS,SAAS,MAAc,OAAyB;AACvD,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,KAAK,MAAM,IAAI,GAAG;AACnC,QAAI,KAAK,UAAU,OAAO;AACxB,YAAM,KAAK,IAAI;AACf;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,QAAI,MAAM;AACV,eAAW,KAAK,OAAO;AACrB,UAAI,IAAI,SAAS,EAAE,SAAS,IAAI,OAAO;AACrC,YAAI,IAAK,OAAM,KAAK,GAAG;AACvB,cAAM;AAAA,MACR,OAAO;AACL,cAAM,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,IAAK,OAAM,KAAK,GAAG;AAAA,EACzB;AACA,SAAO;AACT;AAOA,eAAsB,YAAY,OAAwB,CAAC,GAAkB;AAC3E,QAAM,SAAS,KAAK,UAAU,QAAQ;AACtC,QAAM,QAAQ,KAAK,SAAS,QAAQ;AAEpC,MAAI,CAAC,MAAM,SAAS,CAAC,OAAO,OAAO;AACjC,YAAQ,MAAM,wCAAwC;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,QAAQ;AAAA,IACZ,MAAM,IAAI,SAAS;AAAA,IACnB,OAAO,IAAI,UAAU;AAAA,IACrB,WAAW,IAAI,cAAc;AAAA,EAC/B;AAEA,MAAI,cAA0B,MAAM;AAAA,EAAC;AACrC,QAAM,SAAS,IAAI,QAAc,CAAC,YAAY;AAC5C,kBAAc;AAAA,EAChB,CAAC;AAED,QAAM,SAAiB,MAAM,oCAAC,iBAAc,QAAQ,MAAM,YAAY,GAAG,GAAI;AAAA,IAC3E,eAAe,OAAO,WAAW;AAAA,IACjC,gBAAgB,OAAO,QAAQ;AAAA,IAC/B;AAAA,IACA,OAAO,CAAC,UAAU,OAAO,MAAM,KAAK;AAAA,IACpC;AAAA,IACA,QAAQ,MAAM,YAAY;AAAA,EAC5B,CAAC;AAED,QAAM,WAAW,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI,OAAO,QAAQ,EAAE;AAC5E,SAAO,GAAG,UAAU,QAAQ;AAE5B,MAAI;AACF,UAAM;AAAA,EACR,UAAE;AACA,WAAO,IAAI,UAAU,QAAQ;AAC7B,WAAO,QAAQ;AACf,UAAM,MAAM;AAAA,EACd;AACF;","names":["lines"]}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ var __defProp = Object.defineProperty;
3
+ var __export = (target, all) => {
4
+ for (var name in all)
5
+ __defProp(target, name, { get: all[name], enumerable: true });
6
+ };
7
+
8
+ export {
9
+ __export
10
+ };
11
+ //# sourceMappingURL=chunk-2H7UOFLK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,197 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ Box2 as Box,
4
+ Text2 as Text,
5
+ useStdout
6
+ } from "./chunk-JHXQDL7B.js";
7
+
8
+ // src/cli/ui/cards/ApprovalCard.tsx
9
+ import React from "react";
10
+
11
+ // src/cli/ui/theme/tokens.ts
12
+ var FG = {
13
+ strong: "#e6edf3",
14
+ body: "#c9d1d9",
15
+ sub: "#8b949e",
16
+ meta: "#6e7681",
17
+ faint: "#484f58"
18
+ };
19
+ var TONE = {
20
+ brand: "#79c0ff",
21
+ accent: "#d2a8ff",
22
+ violet: "#b395f5",
23
+ ok: "#7ee787",
24
+ warn: "#f0b07d",
25
+ err: "#ff8b81",
26
+ info: "#79c0ff"
27
+ };
28
+ var SURFACE = {
29
+ bg: "#0a0c10",
30
+ bgInput: "#0d1015",
31
+ bgCode: "#06080c",
32
+ bgElev: "#11141a"
33
+ };
34
+ var CARD = {
35
+ user: { color: FG.meta, glyph: "\u25C7" },
36
+ reasoning: { color: TONE.accent, glyph: "\u25C6" },
37
+ streaming: { color: TONE.brand, glyph: "\u25B6" },
38
+ task: { color: TONE.brand, glyph: "\u25B6" },
39
+ tool: { color: TONE.info, glyph: "\u25A3" },
40
+ plan: { color: TONE.accent, glyph: "\u229E" },
41
+ diff: { color: TONE.ok, glyph: "\xB1" },
42
+ error: { color: TONE.err, glyph: "\u2716" },
43
+ warn: { color: TONE.warn, glyph: "\u26A0" },
44
+ usage: { color: TONE.brand, glyph: "\u03A3" },
45
+ subagent: { color: TONE.violet, glyph: "\u232C" },
46
+ approval: { color: TONE.warn, glyph: "?" },
47
+ search: { color: TONE.info, glyph: "\u2299" },
48
+ memory: { color: FG.meta, glyph: "\u2311" }
49
+ };
50
+ var USD_TO_CNY = 7.2;
51
+ function formatCNY(usd, fractionDigits = 4) {
52
+ const cny = usd * USD_TO_CNY;
53
+ return `\xA5${cny.toFixed(fractionDigits)}`;
54
+ }
55
+
56
+ // src/cli/ui/cards/ApprovalCard.tsx
57
+ var SEPARATOR_PAD = 6;
58
+ var MIN_SEPARATOR = 20;
59
+ var TONE_PALETTE = {
60
+ warn: { color: CARD.warn.color, glyph: "?" },
61
+ error: { color: CARD.error.color, glyph: "\u2717" },
62
+ approval: { color: CARD.approval.color, glyph: "?" },
63
+ diff: { color: CARD.diff.color, glyph: "\xB1" },
64
+ memory: { color: CARD.memory.color, glyph: "\u2311" },
65
+ user: { color: CARD.user.color, glyph: "\u25C7" },
66
+ ok: { color: CARD.diff.color, glyph: "\u2713" },
67
+ accent: { color: CARD.plan.color, glyph: "\u229E" },
68
+ info: { color: CARD.tool.color, glyph: "?" }
69
+ };
70
+ var DEFAULT_FOOTER = "\u2191\u2193 pick \xB7 \u23CE confirm \xB7 esc cancel";
71
+ function ApprovalCard({
72
+ tone,
73
+ glyph,
74
+ title,
75
+ metaRight,
76
+ metaRightColor,
77
+ children,
78
+ footerHint = DEFAULT_FOOTER
79
+ }) {
80
+ const palette = TONE_PALETTE[tone];
81
+ const headerGlyph = glyph ?? palette.glyph;
82
+ const { stdout } = useStdout();
83
+ const cols = stdout?.columns ?? 80;
84
+ const ruleWidth = Math.max(MIN_SEPARATOR, cols - SEPARATOR_PAD);
85
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: palette.color, backgroundColor: SURFACE.bgElev }, " \u258E "), /* @__PURE__ */ React.createElement(Text, { bold: true, color: palette.color, backgroundColor: SURFACE.bgElev }, `${headerGlyph} `), /* @__PURE__ */ React.createElement(Text, { bold: true, color: FG.strong, backgroundColor: SURFACE.bgElev }, ` ${title} `), metaRight !== void 0 && /* @__PURE__ */ React.createElement(Text, { color: metaRightColor ?? FG.faint, backgroundColor: SURFACE.bgElev }, ` ${metaRight} `)), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingX: 2, marginTop: 1 }, children), /* @__PURE__ */ React.createElement(Box, { paddingX: 2, marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: FG.faint }, "\u2500".repeat(ruleWidth))), /* @__PURE__ */ React.createElement(Box, { paddingX: 2 }, /* @__PURE__ */ React.createElement(Text, { color: FG.faint }, footerHint)));
86
+ }
87
+
88
+ // src/cli/ui/layout/viewport-budget.tsx
89
+ import React2, { createContext, useContext, useEffect, useMemo, useReducer } from "react";
90
+ var ZONE_PRIORITY = {
91
+ modal: 100,
92
+ status: 60,
93
+ input: 50,
94
+ stream: 10,
95
+ safety: 5
96
+ };
97
+ function allocateRows(claims, totalRows) {
98
+ const sorted = [...claims].sort((a, b) => b.priority - a.priority);
99
+ const out = /* @__PURE__ */ new Map();
100
+ let remaining = Math.max(0, totalRows);
101
+ for (const c of sorted) {
102
+ const want = Math.min(c.max, Math.max(c.min, remaining));
103
+ out.set(c.zone, want);
104
+ remaining = Math.max(0, remaining - want);
105
+ }
106
+ return out;
107
+ }
108
+ function reducer(state, action) {
109
+ switch (action.type) {
110
+ case "claim": {
111
+ const next = new Map(state.claims);
112
+ next.set(action.zone, action.spec);
113
+ return { ...state, claims: next };
114
+ }
115
+ case "release": {
116
+ if (!state.claims.has(action.zone)) return state;
117
+ const next = new Map(state.claims);
118
+ next.delete(action.zone);
119
+ return { ...state, claims: next };
120
+ }
121
+ case "resize":
122
+ if (action.rows === state.totalRows) return state;
123
+ return { ...state, totalRows: action.rows };
124
+ }
125
+ }
126
+ var BudgetContext = createContext(null);
127
+ function ViewportBudgetProvider({
128
+ children,
129
+ initialRows
130
+ }) {
131
+ const { stdout } = useStdout();
132
+ const [state, dispatch] = useReducer(reducer, void 0, () => ({
133
+ claims: /* @__PURE__ */ new Map(),
134
+ totalRows: initialRows ?? stdout?.rows ?? 40
135
+ }));
136
+ useEffect(() => {
137
+ if (initialRows !== void 0) return void 0;
138
+ if (!stdout) return void 0;
139
+ const onResize = () => dispatch({ type: "resize", rows: stdout.rows ?? 40 });
140
+ onResize();
141
+ stdout.on("resize", onResize);
142
+ return () => {
143
+ stdout.off("resize", onResize);
144
+ };
145
+ }, [stdout, initialRows]);
146
+ const allocations = useMemo(() => {
147
+ const list = [];
148
+ for (const [zone, spec] of state.claims) {
149
+ list.push({ zone, priority: ZONE_PRIORITY[zone], ...spec });
150
+ }
151
+ return allocateRows(list, state.totalRows);
152
+ }, [state.claims, state.totalRows]);
153
+ const value = useMemo(
154
+ () => ({
155
+ totalRows: state.totalRows,
156
+ allocations,
157
+ claims: state.claims,
158
+ dispatch
159
+ }),
160
+ [state.totalRows, allocations, state.claims]
161
+ );
162
+ return /* @__PURE__ */ React2.createElement(BudgetContext.Provider, { value }, children);
163
+ }
164
+ function useReserveRows(zone, spec) {
165
+ const ctx = useContext(BudgetContext);
166
+ const dispatch = ctx?.dispatch;
167
+ useEffect(() => {
168
+ if (!dispatch) return void 0;
169
+ dispatch({ type: "claim", zone, spec: { min: spec.min, max: spec.max } });
170
+ return () => {
171
+ dispatch({ type: "release", zone });
172
+ };
173
+ }, [dispatch, zone, spec.min, spec.max]);
174
+ if (!ctx) return Number.isFinite(spec.max) ? spec.max : 40;
175
+ const allocated = ctx.allocations.get(zone);
176
+ if (allocated !== void 0) return allocated;
177
+ return Number.isFinite(spec.max) ? spec.max : ctx.totalRows;
178
+ }
179
+ function useTotalRows() {
180
+ const ctx = useContext(BudgetContext);
181
+ const { stdout } = useStdout();
182
+ return ctx?.totalRows ?? stdout?.rows ?? 40;
183
+ }
184
+
185
+ export {
186
+ FG,
187
+ TONE,
188
+ SURFACE,
189
+ CARD,
190
+ USD_TO_CNY,
191
+ formatCNY,
192
+ ApprovalCard,
193
+ ViewportBudgetProvider,
194
+ useReserveRows,
195
+ useTotalRows
196
+ };
197
+ //# sourceMappingURL=chunk-BGTXZKNY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/ui/cards/ApprovalCard.tsx","../../src/cli/ui/theme/tokens.ts","../../src/cli/ui/layout/viewport-budget.tsx"],"sourcesContent":["import { Box, Text, useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { CARD, type CardTone, FG, SURFACE } from \"../theme/tokens.js\";\n\nconst SEPARATOR_PAD = 6;\nconst MIN_SEPARATOR = 20;\n\nexport interface ApprovalCardProps {\n tone:\n | Extract<CardTone, \"warn\" | \"error\" | \"approval\" | \"diff\" | \"memory\" | \"user\">\n | \"ok\"\n | \"accent\"\n | \"info\";\n glyph?: string;\n title: string;\n metaRight?: string;\n /** Override metaRight color — defaults to FG.faint. Use the tone color to match design's status indicator (e.g. \"awaiting\" in accent for plan-confirm). */\n metaRightColor?: string;\n children?: React.ReactNode;\n footerHint?: string;\n}\n\nconst TONE_PALETTE = {\n warn: { color: CARD.warn.color, glyph: \"?\" },\n error: { color: CARD.error.color, glyph: \"✗\" },\n approval: { color: CARD.approval.color, glyph: \"?\" },\n diff: { color: CARD.diff.color, glyph: \"±\" },\n memory: { color: CARD.memory.color, glyph: \"⌑\" },\n user: { color: CARD.user.color, glyph: \"◇\" },\n ok: { color: CARD.diff.color, glyph: \"✓\" },\n accent: { color: CARD.plan.color, glyph: \"⊞\" },\n info: { color: CARD.tool.color, glyph: \"?\" },\n} as const;\n\nconst DEFAULT_FOOTER = \"↑↓ pick · ⏎ confirm · esc cancel\";\n\nexport function ApprovalCard({\n tone,\n glyph,\n title,\n metaRight,\n metaRightColor,\n children,\n footerHint = DEFAULT_FOOTER,\n}: ApprovalCardProps): React.ReactElement {\n const palette = TONE_PALETTE[tone];\n const headerGlyph = glyph ?? palette.glyph;\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const ruleWidth = Math.max(MIN_SEPARATOR, cols - SEPARATOR_PAD);\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Box flexDirection=\"row\">\n <Text color={palette.color} backgroundColor={SURFACE.bgElev}>\n {\" ▎ \"}\n </Text>\n <Text bold color={palette.color} backgroundColor={SURFACE.bgElev}>\n {`${headerGlyph} `}\n </Text>\n <Text bold color={FG.strong} backgroundColor={SURFACE.bgElev}>\n {` ${title} `}\n </Text>\n {metaRight !== undefined && (\n <Text color={metaRightColor ?? FG.faint} backgroundColor={SURFACE.bgElev}>\n {` ${metaRight} `}\n </Text>\n )}\n </Box>\n <Box flexDirection=\"column\" paddingX={2} marginTop={1}>\n {children}\n </Box>\n <Box paddingX={2} marginTop={1}>\n <Text color={FG.faint}>{\"─\".repeat(ruleWidth)}</Text>\n </Box>\n <Box paddingX={2}>\n <Text color={FG.faint}>{footerHint}</Text>\n </Box>\n </Box>\n );\n}\n","export const FG = {\n strong: \"#e6edf3\",\n body: \"#c9d1d9\",\n sub: \"#8b949e\",\n meta: \"#6e7681\",\n faint: \"#484f58\",\n} as const;\n\nexport const TONE = {\n brand: \"#79c0ff\",\n accent: \"#d2a8ff\",\n violet: \"#b395f5\",\n ok: \"#7ee787\",\n warn: \"#f0b07d\",\n err: \"#ff8b81\",\n info: \"#79c0ff\",\n} as const;\n\nexport const SURFACE = {\n bg: \"#0a0c10\",\n bgInput: \"#0d1015\",\n bgCode: \"#06080c\",\n bgElev: \"#11141a\",\n} as const;\n\nexport const CARD = {\n user: { color: FG.meta, glyph: \"◇\" },\n reasoning: { color: TONE.accent, glyph: \"◆\" },\n streaming: { color: TONE.brand, glyph: \"▶\" },\n task: { color: TONE.brand, glyph: \"▶\" },\n tool: { color: TONE.info, glyph: \"▣\" },\n plan: { color: TONE.accent, glyph: \"⊞\" },\n diff: { color: TONE.ok, glyph: \"±\" },\n error: { color: TONE.err, glyph: \"✖\" },\n warn: { color: TONE.warn, glyph: \"⚠\" },\n usage: { color: TONE.brand, glyph: \"Σ\" },\n subagent: { color: TONE.violet, glyph: \"⌬\" },\n approval: { color: TONE.warn, glyph: \"?\" },\n search: { color: TONE.info, glyph: \"⊙\" },\n memory: { color: FG.meta, glyph: \"⌑\" },\n} as const;\n\nexport type CardTone = keyof typeof CARD;\n\n/** DeepSeek prices in CNY; our internal table is USD divided by 7.2. Multiply back for display. */\nexport const USD_TO_CNY = 7.2;\n\nexport function formatCNY(usd: number, fractionDigits = 4): string {\n const cny = usd * USD_TO_CNY;\n return `¥${cny.toFixed(fractionDigits)}`;\n}\n","/** Single allocator for vertical viewport rows; consumers claim per-zone via useReserveRows. */\n\nimport { useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React, { createContext, useContext, useEffect, useMemo, useReducer } from \"react\";\n\nexport type ZoneId = \"modal\" | \"status\" | \"input\" | \"stream\" | \"safety\";\n\n/** Higher number = claims rows first. */\nconst ZONE_PRIORITY: Record<ZoneId, number> = {\n modal: 100,\n status: 60,\n input: 50,\n stream: 10,\n safety: 5,\n};\n\nexport interface ClaimSpec {\n /** Smallest acceptable allocation. May exceed total rows on tiny terminals. */\n min: number;\n /** Hard ceiling. `Number.POSITIVE_INFINITY` = \"soak whatever's left\". */\n max: number;\n}\n\ninterface InternalClaim extends ClaimSpec {\n zone: ZoneId;\n priority: number;\n}\n\n/** Pure allocator — used by the provider and tested in isolation. */\nexport function allocateRows(\n claims: ReadonlyArray<InternalClaim>,\n totalRows: number,\n): ReadonlyMap<ZoneId, number> {\n const sorted = [...claims].sort((a, b) => b.priority - a.priority);\n const out = new Map<ZoneId, number>();\n let remaining = Math.max(0, totalRows);\n for (const c of sorted) {\n const want = Math.min(c.max, Math.max(c.min, remaining));\n out.set(c.zone, want);\n remaining = Math.max(0, remaining - want);\n }\n return out;\n}\n\ninterface BudgetState {\n /** Active claims keyed by zone — one consumer per zone. */\n claims: ReadonlyMap<ZoneId, ClaimSpec>;\n totalRows: number;\n}\n\ntype BudgetAction =\n | { type: \"claim\"; zone: ZoneId; spec: ClaimSpec }\n | { type: \"release\"; zone: ZoneId }\n | { type: \"resize\"; rows: number };\n\nfunction reducer(state: BudgetState, action: BudgetAction): BudgetState {\n switch (action.type) {\n case \"claim\": {\n const next = new Map(state.claims);\n next.set(action.zone, action.spec);\n return { ...state, claims: next };\n }\n case \"release\": {\n if (!state.claims.has(action.zone)) return state;\n const next = new Map(state.claims);\n next.delete(action.zone);\n return { ...state, claims: next };\n }\n case \"resize\":\n if (action.rows === state.totalRows) return state;\n return { ...state, totalRows: action.rows };\n }\n}\n\ninterface BudgetContextValue {\n totalRows: number;\n allocations: ReadonlyMap<ZoneId, number>;\n claims: ReadonlyMap<ZoneId, ClaimSpec>;\n dispatch: React.Dispatch<BudgetAction>;\n}\n\nconst BudgetContext = createContext<BudgetContextValue | null>(null);\n\nexport interface ViewportBudgetProviderProps {\n children: React.ReactNode;\n /** Test seam — bypasses useStdout. */\n initialRows?: number;\n}\n\nexport function ViewportBudgetProvider({\n children,\n initialRows,\n}: ViewportBudgetProviderProps): React.ReactElement {\n const { stdout } = useStdout();\n const [state, dispatch] = useReducer(reducer, undefined, () => ({\n claims: new Map<ZoneId, ClaimSpec>(),\n totalRows: initialRows ?? stdout?.rows ?? 40,\n }));\n\n // Single resize listener — children read totalRows from context.\n useEffect(() => {\n if (initialRows !== undefined) return undefined;\n if (!stdout) return undefined;\n const onResize = () => dispatch({ type: \"resize\", rows: stdout.rows ?? 40 });\n onResize();\n stdout.on(\"resize\", onResize);\n return () => {\n stdout.off(\"resize\", onResize);\n };\n }, [stdout, initialRows]);\n\n const allocations = useMemo(() => {\n const list: InternalClaim[] = [];\n for (const [zone, spec] of state.claims) {\n list.push({ zone, priority: ZONE_PRIORITY[zone], ...spec });\n }\n return allocateRows(list, state.totalRows);\n }, [state.claims, state.totalRows]);\n\n const value = useMemo<BudgetContextValue>(\n () => ({\n totalRows: state.totalRows,\n allocations,\n claims: state.claims,\n dispatch,\n }),\n [state.totalRows, allocations, state.claims],\n );\n\n return <BudgetContext.Provider value={value}>{children}</BudgetContext.Provider>;\n}\n\n/** Returns actual allocation; falls back to spec.max when no provider is mounted. */\nexport function useReserveRows(zone: ZoneId, spec: ClaimSpec): number {\n const ctx = useContext(BudgetContext);\n // Deps key off dispatch (stable) + primitives — whole ctx changes every claim and would loop.\n const dispatch = ctx?.dispatch;\n\n useEffect(() => {\n if (!dispatch) return undefined;\n dispatch({ type: \"claim\", zone, spec: { min: spec.min, max: spec.max } });\n return () => {\n dispatch({ type: \"release\", zone });\n };\n }, [dispatch, zone, spec.min, spec.max]);\n\n if (!ctx) return Number.isFinite(spec.max) ? spec.max : 40;\n const allocated = ctx.allocations.get(zone);\n if (allocated !== undefined) return allocated;\n // Optimistic max for pre-effect first render.\n return Number.isFinite(spec.max) ? spec.max : ctx.totalRows;\n}\n\n/** Total terminal rows from the provider; falls back to useStdout if unmounted. */\nexport function useTotalRows(): number {\n const ctx = useContext(BudgetContext);\n const { stdout } = useStdout();\n return ctx?.totalRows ?? stdout?.rows ?? 40;\n}\n"],"mappings":"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","names":["React"]}