claude-mux 0.30.2 → 0.30.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hooks/claude-mux-hook.js +6 -0
- package/dist/hooks/claude-mux-hook.js.map +1 -1
- package/dist/utils/version.d.ts +1 -1
- package/dist/utils/version.js +1 -1
- package/dist/web/client/_app/immutable/chunks/{BRwgrbZi.js → 00FvOOKA.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/BRwgrbZi.js.map → dist/web/client/_app/immutable/chunks/00FvOOKA.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/BdVIGZmZ.js +3 -0
- package/dist/web/client/_app/immutable/chunks/{Cb0yiQIh.js.map → BdVIGZmZ.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{CJ5X49p2.js → BhoZKsDR.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{CJ5X49p2.js.map → BhoZKsDR.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{DiCsJZkB.js → Bw38FtNy.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{DiCsJZkB.js.map → Bw38FtNy.js.map} +1 -1
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/CmDdyjOR.js → dist/web/client/_app/immutable/chunks/CTufiwsi.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{CmDdyjOR.js.map → CTufiwsi.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/{BR0j6UP_.js → D1gqZkA9.js} +2 -2
- package/dist/web/client/_app/immutable/chunks/{BR0j6UP_.js.map → D1gqZkA9.js.map} +1 -1
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/juU6kBhv.js → dist/web/client/_app/immutable/chunks/DHy5T1Hk.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/juU6kBhv.js.map → dist/web/client/_app/immutable/chunks/DHy5T1Hk.js.map} +1 -1
- package/dist/web/client/_app/immutable/chunks/DcmZFcR0.js +2 -0
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/Dmt0dCmj.js.map → dist/web/client/_app/immutable/chunks/DcmZFcR0.js.map} +1 -1
- package/dist/web/client/_app/immutable/entry/{app.BNsXYIeZ.js → app.BK_lbV7p.js} +3 -3
- package/dist/web/client/_app/immutable/entry/{app.BNsXYIeZ.js.map → app.BK_lbV7p.js.map} +1 -1
- package/dist/web/client/_app/immutable/entry/start.qpCcTOMC.js +2 -0
- package/dist/web/client/_app/immutable/entry/start.qpCcTOMC.js.map +1 -0
- package/dist/web/client/_app/immutable/nodes/{0.Cga09Vlt.js → 0.xEgEKB6j.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{0.Cga09Vlt.js.map → 0.xEgEKB6j.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{1.C5UTjGXy.js → 1.Dk98RShc.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{1.C5UTjGXy.js.map → 1.Dk98RShc.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{2.C76yPG3X.js → 2.CwBR9Tlg.js} +2 -2
- package/dist/web/client/_app/immutable/nodes/{2.C76yPG3X.js.map → 2.CwBR9Tlg.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{3.Tbj29aAW.js → 3.BR6uyLke.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/nodes/3.Tbj29aAW.js.map → dist/web/client/_app/immutable/nodes/3.BR6uyLke.js.map} +1 -1
- package/dist/web/client/_app/immutable/nodes/{4.D0z9Wo_G.js → 4.CQHttK08.js} +2 -2
- package/{web/.svelte-kit/output/client/_app/immutable/nodes/4.D0z9Wo_G.js.map → dist/web/client/_app/immutable/nodes/4.CQHttK08.js.map} +1 -1
- package/dist/web/client/_app/version.json +1 -1
- package/dist/web/server/chunks/{0-BZ0-GFAV.js → 0-DxrW6bx9.js} +9 -9
- package/dist/web/server/chunks/{0-BZ0-GFAV.js.map → 0-DxrW6bx9.js.map} +1 -1
- package/dist/web/server/chunks/{1-DoI2jsEL.js → 1-Cqg4tTSB.js} +3 -3
- package/dist/web/server/chunks/{1-DoI2jsEL.js.map → 1-Cqg4tTSB.js.map} +1 -1
- package/dist/web/server/chunks/{2-6BGBaYuT.js → 2-Cv_7yOc9.js} +7 -7
- package/dist/web/server/chunks/{2-6BGBaYuT.js.map → 2-Cv_7yOc9.js.map} +1 -1
- package/dist/web/server/chunks/{3-B9fgRoyO.js → 3-38whb5GG.js} +9 -9
- package/dist/web/server/chunks/{3-B9fgRoyO.js.map → 3-38whb5GG.js.map} +1 -1
- package/dist/web/server/chunks/{4-CIa0l25T.js → 4-B0al20p9.js} +7 -7
- package/dist/web/server/chunks/{4-CIa0l25T.js.map → 4-B0al20p9.js.map} +1 -1
- package/dist/web/server/index.js +1 -1
- package/dist/web/server/index.js.map +1 -1
- package/dist/web/server/manifest.js +11 -11
- package/dist/web/server/manifest.js.map +1 -1
- package/package.json +1 -1
- package/src/hooks/claude-mux-hook.ts +6 -0
- package/src/utils/version.ts +1 -1
- package/tests/hooks/subagents.test.ts +12 -0
- package/web/.svelte-kit/adapter-bun/chunks/internal2.js +1 -1
- package/web/.svelte-kit/adapter-bun/chunks/internal2.js.map +1 -1
- package/web/.svelte-kit/adapter-bun/manifest-full.js +1 -1
- package/web/.svelte-kit/adapter-bun/manifest.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/0.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/1.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/2.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/3.js +1 -1
- package/web/.svelte-kit/adapter-bun/nodes/4.js +1 -1
- package/web/.svelte-kit/generated/server/internal.js +1 -1
- package/web/.svelte-kit/output/client/.vite/manifest.json +93 -93
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{BRwgrbZi.js → 00FvOOKA.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/BRwgrbZi.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/00FvOOKA.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/BdVIGZmZ.js +3 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{Cb0yiQIh.js.map → BdVIGZmZ.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CJ5X49p2.js → BhoZKsDR.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CJ5X49p2.js.map → BhoZKsDR.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{DiCsJZkB.js → Bw38FtNy.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{DiCsJZkB.js.map → Bw38FtNy.js.map} +1 -1
- package/{dist/web/client/_app/immutable/chunks/CmDdyjOR.js → web/.svelte-kit/output/client/_app/immutable/chunks/CTufiwsi.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CmDdyjOR.js.map → CTufiwsi.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{BR0j6UP_.js → D1gqZkA9.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{BR0j6UP_.js.map → D1gqZkA9.js.map} +1 -1
- package/{dist/web/client/_app/immutable/chunks/juU6kBhv.js → web/.svelte-kit/output/client/_app/immutable/chunks/DHy5T1Hk.js} +2 -2
- package/{dist/web/client/_app/immutable/chunks/juU6kBhv.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/DHy5T1Hk.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/DcmZFcR0.js +2 -0
- package/{dist/web/client/_app/immutable/chunks/Dmt0dCmj.js.map → web/.svelte-kit/output/client/_app/immutable/chunks/DcmZFcR0.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/entry/{app.BNsXYIeZ.js → app.BK_lbV7p.js} +3 -3
- package/web/.svelte-kit/output/client/_app/immutable/entry/{app.BNsXYIeZ.js.map → app.BK_lbV7p.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.qpCcTOMC.js +2 -0
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.qpCcTOMC.js.map +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{0.Cga09Vlt.js → 0.xEgEKB6j.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{0.Cga09Vlt.js.map → 0.xEgEKB6j.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.C5UTjGXy.js → 1.Dk98RShc.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.C5UTjGXy.js.map → 1.Dk98RShc.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.C76yPG3X.js → 2.CwBR9Tlg.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.C76yPG3X.js.map → 2.CwBR9Tlg.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.Tbj29aAW.js → 3.BR6uyLke.js} +2 -2
- package/{dist/web/client/_app/immutable/nodes/3.Tbj29aAW.js.map → web/.svelte-kit/output/client/_app/immutable/nodes/3.BR6uyLke.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{4.D0z9Wo_G.js → 4.CQHttK08.js} +2 -2
- package/{dist/web/client/_app/immutable/nodes/4.D0z9Wo_G.js.map → web/.svelte-kit/output/client/_app/immutable/nodes/4.CQHttK08.js.map} +1 -1
- package/web/.svelte-kit/output/client/_app/version.json +1 -1
- package/web/.svelte-kit/output/server/chunks/internal2.js +1 -1
- package/web/.svelte-kit/output/server/chunks/internal2.js.map +1 -1
- package/web/.svelte-kit/output/server/manifest-full.js +1 -1
- package/web/.svelte-kit/output/server/manifest.js +1 -1
- package/web/.svelte-kit/output/server/nodes/0.js +1 -1
- package/web/.svelte-kit/output/server/nodes/1.js +1 -1
- package/web/.svelte-kit/output/server/nodes/2.js +1 -1
- package/web/.svelte-kit/output/server/nodes/3.js +1 -1
- package/web/.svelte-kit/output/server/nodes/4.js +1 -1
- package/dist/web/client/_app/immutable/chunks/Cb0yiQIh.js +0 -3
- package/dist/web/client/_app/immutable/chunks/Dmt0dCmj.js +0 -2
- package/dist/web/client/_app/immutable/entry/start.BAAC0OQy.js +0 -2
- package/dist/web/client/_app/immutable/entry/start.BAAC0OQy.js.map +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/Cb0yiQIh.js +0 -3
- package/web/.svelte-kit/output/client/_app/immutable/chunks/Dmt0dCmj.js +0 -2
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.BAAC0OQy.js +0 -2
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.BAAC0OQy.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BRwgrbZi.js","sources":["../../../../../../../src/tmux/answer-keys.ts","../../../../../../src/lib/components/DialogCard.svelte","../../../../../../../src/transcript/mcp.ts","../../../../../../src/lib/tool-icons.ts","../../../../../../src/lib/components/ToolLabel.svelte","../../../../../../../src/transcript/grilling.ts","../../../../../../../src/transcript/json.ts","../../../../../../../src/transcript/tool-groups.ts","../../../../../../src/lib/components/TurnChangesCard.svelte","../../../../../../src/lib/components/TranscriptView.svelte","../../../../../../src/lib/stores/transcript.svelte.ts"],"sourcesContent":["/**\n * Translation of an AskUserQuestion answer into Claude Code TUI keystrokes.\n *\n * The dialog puts the cursor on the first option; Down walks the list, Space\n * toggles a checkbox in multi-select, and Enter submits the question. Keeping\n * this next to the other pane-driving code (rather than in the view) means the\n * protocol has one home and can be unit-tested when the TUI changes.\n */\n\n/**\n * Keys for answering one question, given the option indices to pick.\n * Returns null when the selection can't be expressed (no picks, or more than\n * one pick on a single-select question).\n */\nexport function keysForAnswer(\n picks: number[],\n options: { multiSelect: boolean },\n): string | null {\n const sorted = [...new Set(picks)].filter((i) => Number.isInteger(i) && i >= 0).sort((a, b) => a - b);\n if (sorted.length === 0) return null;\n if (!options.multiSelect) {\n if (sorted.length > 1) return null;\n // Same arrow walk as a pane dialog, from a cursor that always starts at 0.\n return keysForOptionPick(0, sorted[0], sorted[0] + 1);\n }\n\n const keys: string[] = [];\n let cursor = 0;\n for (const pick of sorted) {\n for (let step = 0; step < pick - cursor; step++) keys.push(\"Down\");\n keys.push(\"Space\");\n cursor = pick;\n }\n keys.push(\"Enter\");\n return keys.join(\" \");\n}\n\n/**\n * Keys that move Claude Code's own highlight from the row it is on to the row\n * the user tapped, then submit.\n *\n * Walks with arrows from where the pane says the highlight already is, rather\n * than typing the option's number — a dialog that does not take digits still\n * answers correctly, and a dialog whose highlight has moved since the last\n * capture lands on the row the user could see.\n *\n * @param from Index of the highlighted row, or -1 when none is marked.\n * @param to Index of the row to pick.\n * @returns The key sequence, or null when `to` is not a real row.\n */\nexport function keysForOptionPick(from: number, to: number, count: number): string | null {\n const move = keysForOptionMove(from, to, count);\n if (move === null) return null;\n return move ? `${move} Enter` : \"Enter\";\n}\n\n/**\n * Keys that move the highlight to a row without picking it.\n *\n * Some dialogs hang a setting off the highlighted row — the model picker's\n * effort level applies to whichever model the highlight is on — and a\n * question's notes field opens for the highlighted option, so moving the\n * highlight is an action of its own, not just the first half of a pick.\n *\n * @returns The arrow keys, \"\" when the highlight is already there, or null\n * when `to` is not a real row.\n */\nexport function keysForOptionMove(from: number, to: number, count: number): string | null {\n if (!Number.isInteger(to) || to < 0 || to >= count) return null;\n const start = from < 0 || from >= count ? 0 : from;\n const steps = to - start;\n return Array(Math.abs(steps)).fill(steps > 0 ? \"Down\" : \"Up\").join(\" \");\n}\n","<script lang=\"ts\">\n\timport type { TranscriptEntry } from '../../../../src/transcript/parser';\n\timport type { PaneChoice } from '$shared/types/ws-messages.js';\n\timport {\n\t\tkeysForAnswer,\n\t\tkeysForOptionMove,\n\t\tkeysForOptionPick\n\t} from '$shared/tmux/answer-keys.js';\n\timport { longPress } from '$lib/actions/longPress';\n\timport { Button } from '$lib/components/ui/button';\n\timport { Input } from '$lib/components/ui/input';\n\n\ttype AskEntry = Extract<TranscriptEntry, { kind: 'ask' }>;\n\ttype Row = PaneChoice['options'][number];\n\n\tlet {\n\t\tchoice,\n\t\task = null,\n\t\tpermission = false,\n\t\tclosed = false,\n\t\tonKeys,\n\t\tonText,\n\t\tonSubmitted\n\t}: {\n\t\t/** The dialog as the pane draws it right now; null when the poll has not read one. */\n\t\tchoice: PaneChoice | null;\n\t\t/** The AskUserQuestion call behind the dialog, when it is one: every question up front. */\n\t\task?: AskEntry | null;\n\t\t/** A permission prompt rather than a question. */\n\t\tpermission?: boolean;\n\t\t/** The dialog has been answered and is gone from the pane. */\n\t\tclosed?: boolean;\n\t\t/** Sends a tmux key sequence (space-separated) to the pane. */\n\t\tonKeys: (keys: string) => Promise<void> | void;\n\t\t/** Types text into the pane as-is, with no Enter after it. */\n\t\tonText: (text: string) => Promise<void> | void;\n\t\t/** The card sent the keys that close the dialog without the pane to confirm it. */\n\t\tonSubmitted?: () => void;\n\t} = $props();\n\n\t// ── where the dialog stands ──────────────────────────────────────────\n\t// The pane is the truth about which question is open and which row is\n\t// highlighted. The AskUserQuestion entry knows every question in advance,\n\t// so the card can draw them all and say which ones are already answered.\n\n\tconst norm = (s: string | null | undefined) => (s ?? '').replace(/\\s+/g, ' ').trim().toLowerCase();\n\n\t/** The pane is on the Submit tab a multi-question or multi-select dialog ends with. */\n\tconst reviewing = $derived(\n\t\tchoice != null && choice.options.some((o) => o.label === 'Submit answers')\n\t);\n\n\t/** Which of the entry's questions the pane has open; -1 when it cannot tell. */\n\tconst liveIndex = $derived.by(() => {\n\t\tif (!ask || !choice) return -1;\n\t\tif (reviewing) return ask.questions.length;\n\t\tconst asked = norm(choice.question);\n\t\tconst byText = ask.questions.findIndex(\n\t\t\t(q) => asked !== '' && (norm(q.question) === asked || asked.startsWith(norm(q.question)))\n\t\t);\n\t\tif (byText >= 0) return byText;\n\t\t// The question wrapped or was cut; the rows still name the same options.\n\t\tconst first = norm(choice.options[0]?.label);\n\t\treturn ask.questions.findIndex(\n\t\t\t(q) => q.options.length > 0 && first !== '' && norm(q.options[0].label).startsWith(first.slice(0, 16))\n\t\t);\n\t});\n\n\t/** Driving the entry's questions blind: no pane read, so the card keeps count. */\n\tlet sentCount = $state(0);\n\tlet picks = $state<Set<number>>(new Set());\n\tconst blind = $derived(ask != null && choice == null && !closed);\n\n\t/** The question the card answers now: an index into the entry, or its length on the Submit tab. */\n\tconst current = $derived(blind ? sentCount : liveIndex);\n\n\t/** A dialog with a Submit tab: several questions, or any multi-select. */\n\tconst hasSubmitTab = $derived(\n\t\task != null && (ask.questions.length > 1 || ask.questions.some((q) => q.multiSelect))\n\t);\n\tconst atSubmit = $derived(ask != null && current === ask.questions.length);\n\n\t// ── free text ────────────────────────────────────────────────────────\n\n\tlet draft = $state('');\n\tlet sending = $state(false);\n\tlet inputEl = $state<HTMLInputElement | null>(null);\n\n\t/** The pane's \"Type something\" row, which the card answers with its own field. */\n\tconst textRow = $derived(choice?.options.find((o) => o.text) ?? null);\n\t/** Rows the card draws as buttons: everything but the text row. */\n\tconst rows = $derived(choice?.options.filter((o) => !o.text) ?? []);\n\n\t/** The pane has a text field open: the free-text row, or the highlighted option's notes. */\n\tconst typing = $derived(choice?.typing === true);\n\tconst noting = $derived(choice?.noting === true);\n\n\t/** Notes go on the highlighted option; say which. */\n\tconst notingOn = $derived(\n\t\tnoting ? (choice?.options.find((o) => o.selected)?.label ?? choice?.question ?? 'this option') : null\n\t);\n\n\t$effect(() => {\n\t\t// The pane opened a text field (a key, or the terminal): the card's field is where to type.\n\t\tif ((typing || noting) && inputEl && document.activeElement?.tagName !== 'TEXTAREA') {\n\t\t\tinputEl.focus({ preventScroll: true });\n\t\t}\n\t});\n\n\tasync function sendFree() {\n\t\tconst text = draft.trim();\n\t\tif (!text || sending) return;\n\t\tsending = true;\n\t\ttry {\n\t\t\tif (blind) {\n\t\t\t\tconst q = ask!.questions[sentCount];\n\t\t\t\t// The text row sits under the options; the cursor starts on the first.\n\t\t\t\tconst n = q.options.length;\n\t\t\t\tawait onKeys(keysForOptionMove(0, n, n + 1) ?? '');\n\t\t\t\tawait onText(text);\n\t\t\t\tawait onKeys('Enter');\n\t\t\t\tadvanceBlind();\n\t\t\t} else if (choice) {\n\t\t\t\tconst opts = choice.options;\n\t\t\t\tconst multi = choice.multi === true;\n\t\t\t\tconst wasNoting = noting;\n\t\t\t\tif (!typing && !wasNoting) {\n\t\t\t\t\tconst to = opts.findIndex((o) => o.text);\n\t\t\t\t\tconst move = keysForOptionMove(\n\t\t\t\t\t\topts.findIndex((o) => o.selected),\n\t\t\t\t\t\tto,\n\t\t\t\t\t\topts.length\n\t\t\t\t\t);\n\t\t\t\t\tif (move === null) return;\n\t\t\t\t\t// Highlighting the row is what opens it for typing. Until the pane\n\t\t\t\t\t// says it is open, letters would drive the list (\"n\" opens notes)\n\t\t\t\t\t// and the Enter would pick whatever row is highlighted.\n\t\t\t\t\tif (move) await onKeys(move);\n\t\t\t\t\tif (!(await paneTyping())) return;\n\t\t\t\t}\n\t\t\t\tawait onText(text);\n\t\t\t\t// A note closes with Escape, which keeps it and brings the rows back;\n\t\t\t\t// a multi-select's row ticks with its text, and the answer goes in\n\t\t\t\t// from the Submit tab, so only a single-select takes Enter.\n\t\t\t\tif (wasNoting) await onKeys('Escape');\n\t\t\t\telse if (!multi) await onKeys('Enter');\n\t\t\t}\n\t\t\tdraft = '';\n\t\t} finally {\n\t\t\tsending = false;\n\t\t}\n\t}\n\n\t/** How long the free-text row may take to open before the card gives up and keeps the text. */\n\tconst OPEN_TIMEOUT_MS = 3000;\n\n\t/** Waits for the pane's next reads to show the text row open. */\n\tasync function paneTyping(): Promise<boolean> {\n\t\tconst until = Date.now() + OPEN_TIMEOUT_MS;\n\t\twhile (Date.now() < until) {\n\t\t\tif (choice?.typing === true) return true;\n\t\t\tawait new Promise((r) => setTimeout(r, 100));\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction freeKeydown(e: KeyboardEvent) {\n\t\t// The card's field never leaks keys to the page's own shortcuts.\n\t\te.stopPropagation();\n\t\tif (e.key === 'Enter' && !e.shiftKey && !e.isComposing) {\n\t\t\te.preventDefault();\n\t\t\tvoid sendFree();\n\t\t} else if (e.key === 'Escape' && (typing || noting)) {\n\t\t\te.preventDefault();\n\t\t\tvoid onKeys(noting ? 'Escape' : 'Up');\n\t\t}\n\t}\n\n\t// ── picking rows ─────────────────────────────────────────────────────\n\n\t/**\n\t * Move Claude Code's own highlight to the row you tapped, then submit.\n\t *\n\t * Walks with arrows from the row the pane says is selected rather than\n\t * typing the number, so it works whether or not the dialog takes digits.\n\t */\n\tasync function pick(row: Row) {\n\t\t// An open text field is the selected row, so the walk starts from it.\n\t\tconst keys = walkTo(row, keysForOptionPick);\n\t\tif (keys) await onKeys(keys);\n\t}\n\n\t/**\n\t * Move the highlight without picking — a long press. Some dialogs hang a\n\t * setting off the highlighted row: the model picker's effort, a\n\t * question's notes.\n\t */\n\tasync function highlight(row: Row) {\n\t\tconst keys = walkTo(row, keysForOptionMove);\n\t\tif (keys) await onKeys(keys);\n\t}\n\n\t/** Keys from the pane's highlighted row to `row`, by the given walk. */\n\tfunction walkTo(row: Row, walk: typeof keysForOptionMove): string | null {\n\t\tif (!choice) return null;\n\t\tconst opts = choice.options;\n\t\treturn walk(\n\t\t\topts.findIndex((o) => o.selected),\n\t\t\topts.findIndex((o) => o.n === row.n),\n\t\t\topts.length\n\t\t);\n\t}\n\n\tfunction advanceBlind() {\n\t\tsentCount += 1;\n\t\tpicks = new Set();\n\t\tif (ask && !hasSubmitTab && sentCount >= ask.questions.length) onSubmitted?.();\n\t}\n\n\tfunction pickBlind(qi: number, oi: number) {\n\t\tconst q = ask!.questions[qi];\n\t\tif (q.multiSelect) {\n\t\t\tconst next = new Set(picks);\n\t\t\tif (next.has(oi)) next.delete(oi);\n\t\t\telse next.add(oi);\n\t\t\tpicks = next;\n\t\t\treturn;\n\t\t}\n\t\tconst keys = keysForAnswer([oi], q);\n\t\tif (!keys) return;\n\t\tvoid onKeys(keys);\n\t\tadvanceBlind();\n\t}\n\n\tfunction confirmBlind(qi: number) {\n\t\tconst keys = keysForAnswer([...picks], ask!.questions[qi]);\n\t\tif (!keys) return;\n\t\tvoid onKeys(keys);\n\t\tadvanceBlind();\n\t}\n\n\t/** Submit or Cancel on the closing tab. */\n\tasync function finish(submit: boolean) {\n\t\tif (blind) {\n\t\t\tawait onKeys(submit ? 'Enter' : 'Down Enter');\n\t\t\tonSubmitted?.();\n\t\t\treturn;\n\t\t}\n\t\tconst row = choice?.options.find((o) =>\n\t\t\tsubmit ? o.label === 'Submit answers' : norm(o.label) === 'cancel'\n\t\t);\n\t\tif (row) await pick(row);\n\t}\n\n\t/** A multi-select's ticks are done: on to the next tab (Submit, after the last question). */\n\tfunction done() {\n\t\tvoid onKeys(typing ? 'Up Right' : 'Right');\n\t}\n\n\t// ── the dialog's other keys ──────────────────────────────────────────\n\n\t/** A hint segment naming a key and what it does: \"s to use this session only\". */\n\tconst KEY_SEGMENT = /^(\\S+) to (.+)$/;\n\t/** A note the dialog adjusts with the horizontal arrows. */\n\tconst ARROW_NOTE = /←\\/→/;\n\n\t/**\n\t * The keys a dialog answers to beyond picking a row — the model picker's\n\t * \"s to use this session only\", a question's \"n to add notes\" — read off\n\t * the hint line the dialog draws under itself, so a dialog this page has\n\t * never seen still gets its extra keys offered as buttons.\n\t */\n\tconst extraKeys = $derived.by(() => {\n\t\tconst out: { key: string; label: string }[] = [];\n\t\tfor (const segment of (choice?.keys ?? '').split('·')) {\n\t\t\tconst m = segment.trim().match(KEY_SEGMENT);\n\t\t\t// Only keys the card does not already drive with its rows and buttons.\n\t\t\tif (!m || (!/^[a-z]$/i.test(m[1]) && m[1] !== 'Tab' && m[1] !== 'Space')) continue;\n\t\t\tout.push({ key: m[1], label: m[2] });\n\t\t}\n\t\treturn out;\n\t});\n\n\t/** The panel a question draws beside an option, from the entry the pane cuts it out of. */\n\tfunction previewFor(qi: number, label: string): string | undefined {\n\t\tconst q = ask?.questions[qi];\n\t\tif (!q) return undefined;\n\t\tconst l = norm(label);\n\t\treturn q.options.find((o) => norm(o.label) === l || (l !== '' && norm(o.label).startsWith(l)))\n\t\t\t?.preview;\n\t}\n\n\t/** Someone opened the session to answer this: bring the card into view once. */\n\tfunction reveal(el: HTMLElement) {\n\t\trequestAnimationFrame(() => el.scrollIntoView({ block: 'nearest' }));\n\t}\n\n\tconst isPermission = $derived(permission && !ask);\n\tconst title = $derived(isPermission ? 'Permission needed' : 'Claude is asking');\n</script>\n\n{#snippet liveRows(qi: number)}\n\t<div class=\"rows\" role=\"group\">\n\t\t{#each rows as row (row.n)}\n\t\t\t{@const preview = previewFor(qi, row.label)}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"row\"\n\t\t\t\tclass:sel={row.selected}\n\t\t\t\tdisabled={closed}\n\t\t\t\ttitle=\"Tap to pick · hold to highlight only\"\n\t\t\t\tonclick={() => void pick(row)}\n\t\t\t\tuse:longPress={{ onTrigger: () => void highlight(row) }}\n\t\t\t>\n\t\t\t\t{#if row.checked === undefined}\n\t\t\t\t\t<span class=\"num\">{row.n}</span>\n\t\t\t\t{:else}\n\t\t\t\t\t<iconify-icon\n\t\t\t\t\t\tclass=\"box\"\n\t\t\t\t\t\tclass:on={row.checked}\n\t\t\t\t\t\ticon={row.checked ? 'mdi:checkbox-marked' : 'mdi:checkbox-blank-outline'}\n\t\t\t\t\t></iconify-icon>\n\t\t\t\t{/if}\n\t\t\t\t<span class=\"label\">\n\t\t\t\t\t<span class=\"name\">{row.label}</span>\n\t\t\t\t\t{#if row.hint}<span class=\"hint\">{row.hint}</span>{/if}\n\t\t\t\t\t{#if preview}<pre class=\"preview\">{preview}</pre>{/if}\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t{/each}\n\t</div>\n{/snippet}\n\n{#snippet freeText(placeholder: string, label: string)}\n\t<form\n\t\tclass=\"free\"\n\t\tonsubmit={(e) => {\n\t\t\te.preventDefault();\n\t\t\tvoid sendFree();\n\t\t}}\n\t>\n\t\t<Input\n\t\t\tbind:ref={inputEl}\n\t\t\tbind:value={draft}\n\t\t\tdata-dialog-input\n\t\t\tclass=\"free-input\"\n\t\t\t{placeholder}\n\t\t\taria-label={label}\n\t\t\tdisabled={closed}\n\t\t\tonkeydown={freeKeydown}\n\t\t/>\n\t\t<Button\n\t\t\ttype=\"submit\"\n\t\t\tvariant=\"warning\"\n\t\t\tsize=\"sm\"\n\t\t\tclass=\"free-send\"\n\t\t\tdisabled={closed || sending || draft.trim() === ''}\n\t\t>\n\t\t\t<iconify-icon icon={noting ? 'mdi:note-check-outline' : 'mdi:send'}></iconify-icon>\n\t\t\t{noting ? 'Save' : 'Send'}\n\t\t</Button>\n\t</form>\n{/snippet}\n\n{#snippet paneFreeText(answerLabel: string)}\n\t{#if textRow || noting}\n\t\t{@render freeText(\n\t\t\tnoting ? `Note on ${notingOn}` : 'Type something else',\n\t\t\tnoting ? 'Note' : answerLabel\n\t\t)}\n\t{/if}\n{/snippet}\n\n{#snippet keysBar()}\n\t{#each choice?.notes ?? [] as note (note)}\n\t\t<p class=\"note\">\n\t\t\t<span>{note}</span>\n\t\t\t{#if ARROW_NOTE.test(note)}\n\t\t\t\t<button type=\"button\" class=\"arrow\" title=\"Left\" onclick={() => void onKeys('Left')}>\n\t\t\t\t\t<iconify-icon icon=\"mdi:chevron-left\"></iconify-icon>\n\t\t\t\t</button>\n\t\t\t\t<button type=\"button\" class=\"arrow\" title=\"Right\" onclick={() => void onKeys('Right')}>\n\t\t\t\t\t<iconify-icon icon=\"mdi:chevron-right\"></iconify-icon>\n\t\t\t\t</button>\n\t\t\t{/if}\n\t\t</p>\n\t{/each}\n\t<div class=\"extra\">\n\t\t<!-- Move the highlight without picking: what a setting under the rows,\n\t\t or a note, applies to. A held row does the same. -->\n\t\t<button type=\"button\" class=\"key nav\" title=\"Highlight the row above\" onclick={() => void onKeys('Up')}>\n\t\t\t<iconify-icon icon=\"mdi:chevron-up\"></iconify-icon>\n\t\t</button>\n\t\t<button type=\"button\" class=\"key nav\" title=\"Highlight the row below\" onclick={() => void onKeys('Down')}>\n\t\t\t<iconify-icon icon=\"mdi:chevron-down\"></iconify-icon>\n\t\t</button>\n\t\t{#if choice?.multi && !reviewing}\n\t\t\t<!-- Ticking a box leaves the dialog open; the answer goes in from a\n\t\t\t tab of its own, one key to the right. -->\n\t\t\t<button type=\"button\" class=\"key done\" onclick={done}>\n\t\t\t\t<iconify-icon icon=\"mdi:check-all\"></iconify-icon>Done\n\t\t\t</button>\n\t\t{/if}\n\t\t{#each extraKeys as extra (extra.key)}\n\t\t\t<button type=\"button\" class=\"key\" onclick={() => void onKeys(extra.key)}>\n\t\t\t\t<kbd>{extra.key}</kbd>{extra.label}\n\t\t\t</button>\n\t\t{/each}\n\t\t<button type=\"button\" class=\"key\" title=\"Dismiss the dialog\" onclick={() => void onKeys('Escape')}>\n\t\t\t<kbd>Esc</kbd>cancel\n\t\t</button>\n\t</div>\n\t{#if choice?.keys}<p class=\"keys\">{choice.keys}</p>{/if}\n{/snippet}\n\n<section\n\tclass=\"dialog-card\"\n\tclass:closed\n\taria-label={title}\n\tuse:reveal\n>\n\t<header class=\"title\">\n\t\t<iconify-icon icon={isPermission ? 'mdi:shield-alert-outline' : 'mdi:chat-question'}></iconify-icon>\n\t\t<span>{closed ? 'Answered' : title}</span>\n\t\t{#if closed}<iconify-icon class=\"ok\" icon=\"mdi:check\"></iconify-icon>{/if}\n\t</header>\n\n\t{#if ask}\n\t\t{#each ask.questions as q, qi (q.question)}\n\t\t\t{@const sent = closed || (current >= 0 && qi < current)}\n\t\t\t{@const active = !closed && qi === current}\n\t\t\t<div class=\"ask-q\" class:inactive={!active && !sent}>\n\t\t\t\t<span class=\"chip\" class:done={sent}>{q.header}</span>\n\t\t\t\t<p class=\"question\">{q.question}</p>\n\t\t\t\t{#if sent}\n\t\t\t\t\t<div class=\"sent\">answer sent ✓</div>\n\t\t\t\t{:else if active && choice && !reviewing}\n\t\t\t\t\t{@render liveRows(qi)}\n\t\t\t\t\t{@render paneFreeText(`Your own answer to: ${q.question}`)}\n\t\t\t\t{:else}\n\t\t\t\t\t<!-- Not open in the pane yet, or no pane read: the entry's own options. -->\n\t\t\t\t\t<div class=\"rows\">\n\t\t\t\t\t\t{#each q.options as opt, oi (opt.label)}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"row\"\n\t\t\t\t\t\t\t\tclass:sel={active && q.multiSelect && picks.has(oi)}\n\t\t\t\t\t\t\t\tdisabled={!active || !blind}\n\t\t\t\t\t\t\t\tonclick={() => pickBlind(qi, oi)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{#if q.multiSelect}\n\t\t\t\t\t\t\t\t\t<iconify-icon\n\t\t\t\t\t\t\t\t\t\tclass=\"box\"\n\t\t\t\t\t\t\t\t\t\tclass:on={active && picks.has(oi)}\n\t\t\t\t\t\t\t\t\t\ticon={active && picks.has(oi)\n\t\t\t\t\t\t\t\t\t\t\t? 'mdi:checkbox-marked'\n\t\t\t\t\t\t\t\t\t\t\t: 'mdi:checkbox-blank-outline'}\n\t\t\t\t\t\t\t\t\t></iconify-icon>\n\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t<span class=\"num\">{oi + 1}</span>\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t<span class=\"label\">\n\t\t\t\t\t\t\t\t\t<span class=\"name\">{opt.label}</span>\n\t\t\t\t\t\t\t\t\t{#if opt.description}<span class=\"hint\">{opt.description}</span>{/if}\n\t\t\t\t\t\t\t\t\t{#if opt.preview}<pre class=\"preview\">{opt.preview}</pre>{/if}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</div>\n\t\t\t\t\t{#if active && blind}\n\t\t\t\t\t\t{#if q.multiSelect}\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"warning\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tclass=\"confirm\"\n\t\t\t\t\t\t\t\tdisabled={picks.size === 0}\n\t\t\t\t\t\t\t\tonclick={() => confirmBlind(qi)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tConfirm selection\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t{@render freeText('Type something else', `Your own answer to: ${q.question}`)}\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t{/if}\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t{/each}\n\n\t\t{#if liveIndex < 0 && choice && !closed}\n\t\t\t<!-- The pane shows something the entry does not name: draw it as it is. -->\n\t\t\t<div class=\"ask-q\">\n\t\t\t\t{#if choice.question}<p class=\"question\">{choice.question}</p>{/if}\n\t\t\t\t{@render liveRows(-1)}\n\t\t\t\t{#if textRow || noting}{@render freeText('Type something else', 'Your own answer')}{/if}\n\t\t\t</div>\n\t\t{/if}\n\n\t\t{#if hasSubmitTab && !closed}\n\t\t\t<footer class=\"foot\">\n\t\t\t\t<span class=\"tally\">\n\t\t\t\t\t{#if atSubmit}\n\t\t\t\t\t\tAll answered — ready to submit\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t{Math.max(0, current)} of {ask.questions.length} answered\n\t\t\t\t\t{/if}\n\t\t\t\t</span>\n\t\t\t\t<Button variant=\"ghost\" size=\"sm\" disabled={!atSubmit} onclick={() => void finish(false)}>\n\t\t\t\t\tCancel\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"warning\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tdisabled={!atSubmit}\n\t\t\t\t\ttitle={atSubmit ? 'Submit your answers' : 'Answer every question first'}\n\t\t\t\t\tonclick={() => void finish(true)}\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon=\"mdi:check-all\"></iconify-icon>Submit\n\t\t\t\t</Button>\n\t\t\t</footer>\n\t\t{/if}\n\t\t{#if choice && !closed}{@render keysBar()}{/if}\n\t{:else if choice && !closed}\n\t\t<div class=\"ask-q\">\n\t\t\t{#if choice.question}<p class=\"question\">{choice.question}</p>{/if}\n\t\t\t{@render liveRows(-1)}\n\t\t\t{@render paneFreeText('Your own answer')}\n\t\t</div>\n\t\t{@render keysBar()}\n\t{:else if !closed}\n\t\t<p class=\"question muted\">Reading the dialog from the pane…</p>\n\t{/if}\n</section>\n\n<style>\n\t/* The one thing in the transcript that wants you: amber, the colour every\n\t surface gives a waiting session. It cools to a log line once answered. */\n\t.dialog-card {\n\t\tmargin: 14px 0 14px 12px;\n\t\tborder: 1px solid #5c4410;\n\t\tborder-left: 3px solid #fbbf24;\n\t\tborder-radius: 8px;\n\t\tbackground: #1a1610;\n\t\tpadding: 10px 12px 12px;\n\t\tscroll-margin: 16px;\n\t}\n\t.dialog-card.closed {\n\t\tborder-color: #2a2a2e;\n\t\tborder-left-color: #4d7c5f;\n\t\tbackground: #161616;\n\t}\n\t.title {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 7px;\n\t\tmargin-bottom: 8px;\n\t\tfont-size: 11px;\n\t\tfont-weight: 700;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.08em;\n\t\tcolor: #fbbf24;\n\t}\n\t.closed .title {\n\t\tcolor: #86b898;\n\t}\n\t.ask-q + .ask-q {\n\t\tmargin-top: 12px;\n\t\tpadding-top: 10px;\n\t\tborder-top: 1px solid #2c2416;\n\t}\n\t.ask-q.inactive {\n\t\topacity: 0.45;\n\t}\n\t.chip {\n\t\tdisplay: inline-block;\n\t\tmargin-bottom: 4px;\n\t\tpadding: 1px 7px;\n\t\tborder-radius: 4px;\n\t\tbackground: #3a2d0d;\n\t\tcolor: #fde68a;\n\t\tfont-size: 10px;\n\t\tfont-weight: 700;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.08em;\n\t}\n\t.chip.done {\n\t\tbackground: #262220;\n\t\tcolor: #a8a29e;\n\t}\n\t.question {\n\t\tmargin: 0 0 8px;\n\t\tcolor: #f5f0ee;\n\t\tfont-weight: 600;\n\t\t/* Carried whole from the pane, with the breaks the dialog drew itself. */\n\t\twhite-space: pre-line;\n\t\toverflow-wrap: anywhere;\n\t}\n\t.question.muted {\n\t\tcolor: #a8a29e;\n\t\tfont-weight: 400;\n\t}\n\t.sent {\n\t\tfont-size: 12.5px;\n\t\tcolor: #86b898;\n\t}\n\t.rows {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 5px;\n\t}\n\t.row {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tgap: 9px;\n\t\twidth: 100%;\n\t\tmin-height: 34px;\n\t\tpadding: 7px 10px;\n\t\tborder: 1px solid #2c2416;\n\t\tborder-radius: 7px;\n\t\tbackground: #201b12;\n\t\tcolor: #d6d3d1;\n\t\ttext-align: left;\n\t\tcursor: pointer;\n\t\ttransition:\n\t\t\tborder-color 0.12s,\n\t\t\tbackground 0.12s;\n\t}\n\t.row:hover:not(:disabled) {\n\t\tborder-color: #b45309;\n\t\tbackground: #2a2214;\n\t}\n\t.row:disabled {\n\t\tcursor: default;\n\t}\n\t/* Claude Code's own highlight: Enter (or the gamepad's A) takes this row. */\n\t.row.sel {\n\t\tborder-color: #fbbf24;\n\t\tbackground: #3a2d0d;\n\t\tcolor: #fde68a;\n\t}\n\t.num {\n\t\tflex: none;\n\t\twidth: 10px;\n\t\tpadding-top: 2px;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10.5px;\n\t\tcolor: #78716c;\n\t}\n\t.row.sel .num {\n\t\tcolor: #fbbf24;\n\t}\n\t/* A multi-select row says what it is with its own box: the box is the\n\t thing a tap changes. */\n\t.box {\n\t\tflex: none;\n\t\tpadding-top: 1px;\n\t\tfont-size: 15px;\n\t\tcolor: #57534e;\n\t}\n\t.box.on {\n\t\tcolor: #34d399;\n\t}\n\t.label {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 2px;\n\t\tmin-width: 0;\n\t\tflex: 1;\n\t}\n\t.name {\n\t\tfont-size: 13px;\n\t\tfont-weight: 600;\n\t\tcolor: inherit;\n\t\toverflow-wrap: anywhere;\n\t}\n\t.hint {\n\t\tfont-size: 12px;\n\t\tline-height: 1.45;\n\t\tcolor: #a8a29e;\n\t\twhite-space: pre-line;\n\t\toverflow-wrap: anywhere;\n\t}\n\t.row.sel .hint {\n\t\tcolor: #c8a94a;\n\t}\n\t/* The panel the terminal draws beside a highlighted option, shown under\n\t it here: on a phone there is no room to the side. */\n\t.preview {\n\t\tmargin: 6px 0 0;\n\t\tpadding: 8px 10px;\n\t\tborder: 1px solid #2c2416;\n\t\tborder-radius: 6px;\n\t\tbackground: #14110c;\n\t\tcolor: #d6d3d1;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 12px;\n\t\tline-height: 1.5;\n\t\twhite-space: pre;\n\t\toverflow-x: auto;\n\t}\n\t.free {\n\t\tdisplay: flex;\n\t\tgap: 6px;\n\t\tmargin-top: 8px;\n\t}\n\t.free :global(.free-input) {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\theight: 34px;\n\t\tborder-color: #3a2f1a;\n\t\tbackground: #14110c;\n\t\tcolor: #f5f0ee;\n\t\tfont-size: 13px;\n\t}\n\t.free :global(.free-send) {\n\t\theight: 34px;\n\t}\n\t.dialog-card :global(.confirm) {\n\t\tmargin-top: 8px;\n\t}\n\t.foot {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tflex-wrap: wrap;\n\t\tgap: 6px;\n\t\tmargin-top: 12px;\n\t\tpadding-top: 10px;\n\t\tborder-top: 1px solid #2c2416;\n\t}\n\t.tally {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tfont-size: 12px;\n\t\tcolor: #a8a29e;\n\t}\n\t/* A line the dialog prints for itself under the rows, with the arrows that\n\t adjust it when the line says they do. */\n\t.note {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 4px;\n\t\tmargin: 8px 0 0;\n\t\tfont-size: 12px;\n\t\tline-height: 1.4;\n\t\tcolor: #a8a29e;\n\t}\n\t.note span {\n\t\tmin-width: 0;\n\t}\n\t.arrow {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 26px;\n\t\theight: 24px;\n\t\tpadding: 0;\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: #26262a;\n\t\tcolor: #d6d3d1;\n\t\tfont-size: 16px;\n\t\tcursor: pointer;\n\t}\n\t.extra {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tgap: 6px;\n\t\tmargin-top: 8px;\n\t}\n\t/* One of the keys the dialog names: the key as a cap, then its verb. */\n\t.key {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\theight: 30px;\n\t\tpadding: 0 11px 0 8px;\n\t\tborder: 0;\n\t\tborder-radius: 8px;\n\t\tbackground: #26262a;\n\t\tcolor: #d6d3d1;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11.5px;\n\t\tcursor: pointer;\n\t}\n\t.key:hover {\n\t\tbackground: #33333a;\n\t}\n\t.key.nav {\n\t\twidth: 34px;\n\t\tpadding: 0;\n\t\tjustify-content: center;\n\t\tfont-size: 17px;\n\t}\n\t.key.done {\n\t\tbackground: #1c3326;\n\t\tcolor: #6ee7b7;\n\t}\n\t.key.done:hover {\n\t\tbackground: #244433;\n\t}\n\t.key kbd {\n\t\tpadding: 0 5px;\n\t\tborder: 1px solid #44444a;\n\t\tborder-radius: 4px;\n\t\tfont-family: inherit;\n\t\tfont-size: 10.5px;\n\t\tcolor: #fbbf24;\n\t}\n\t.keys {\n\t\tmargin: 6px 0 0;\n\t\tcolor: #6b6b70;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10.5px;\n\t\toverflow-wrap: anywhere;\n\t}\n\t@media (pointer: coarse) {\n\t\t.row {\n\t\t\tmin-height: 44px;\n\t\t}\n\t\t.key,\n\t\t.free :global(.free-input),\n\t\t.free :global(.free-send) {\n\t\t\theight: 40px;\n\t\t}\n\t\t/* Below 16px, iOS zooms the page to the field on focus. */\n\t\t.free :global(.free-input) {\n\t\t\tfont-size: 16px;\n\t\t}\n\t}\n</style>\n","/**\n * MCP tools reach the transcript as `mcp__<server>__<tool>`. Server names may\n * themselves hold single underscores (`claude_ai_Claude_Docs`), so the name is\n * split on the double underscore, never on `_`.\n */\nexport interface McpToolName {\n server: string;\n tool: string;\n}\n\nexport function parseMcpToolName(name: string): McpToolName | null {\n const match = /^mcp__(.+?)__(.+)$/.exec(name);\n return match ? { server: match[1], tool: match[2] } : null;\n}\n","import { parseMcpToolName } from '$shared/transcript/mcp.js';\n\n/** Icons for MCP server families recognisable from the server name. */\nconst MCP_FAMILIES: [RegExp, string][] = [\n\t[/brave|chrome|browser|devtools|playwright|puppeteer/i, 'mdi:web'],\n\t[/docs|notion|confluence|drive/i, 'mdi:file-document-outline'],\n\t[/github/i, 'mdi:github'],\n\t[/slack/i, 'mdi:slack']\n];\n\n/** The icon a tool call is drawn with in the transcript. */\nexport function toolIcon(name: string): string {\n\tconst mcp = parseMcpToolName(name);\n\tif (mcp) {\n\t\treturn MCP_FAMILIES.find(([pattern]) => pattern.test(mcp.server))?.[1] ?? 'mdi:power-plug-outline';\n\t}\n\tconst n = name.toLowerCase();\n\tif (n.includes('bash') || n.includes('command')) return 'mdi:console';\n\tif (n.includes('edit') || n.includes('write') || n.includes('notebook')) return 'mdi:file-edit-outline';\n\tif (n.includes('read')) return 'mdi:file-eye-outline';\n\tif (n.includes('grep') || n.includes('glob') || n.includes('search')) return 'mdi:magnify';\n\tif (n.includes('task') || n.includes('agent')) return 'mdi:robot-outline';\n\tif (n.includes('web')) return 'mdi:web';\n\tif (n.includes('todo')) return 'mdi:checkbox-marked-outline';\n\treturn 'mdi:tools';\n}\n","<script lang=\"ts\">\n\timport { parseMcpToolName } from '$shared/transcript/mcp.js';\n\n\t/**\n\t * A tool call's one-line label. Built-in tools read as their summary; an MCP\n\t * tool adds the server it came from, faint, ahead of the tool name, and sets\n\t * its key argument apart from the name.\n\t */\n\tlet { name, summary }: { name: string; summary: string } = $props();\n\n\tconst mcp = $derived(parseMcpToolName(name));\n\t// The summary reads `tool: arg`; tool names never hold ': '.\n\tconst arg = $derived(mcp ? summary.split(': ').slice(1).join(': ') : '');\n</script>\n\n{#if mcp}<span class=\"server\">{mcp.server}</span><span class=\"sep\">·</span><span class=\"tool\"\n\t\t>{mcp.tool}</span\n\t>{#if arg}<span class=\"arg\">{arg}</span>{/if}{:else}{summary}{/if}\n\n<style>\n\t.server {\n\t\topacity: 0.55;\n\t}\n\t.sep {\n\t\topacity: 0.4;\n\t\tmargin: 0 0.45em;\n\t}\n\t.arg {\n\t\tmargin-left: 1.2em;\n\t\topacity: 0.7;\n\t}\n</style>\n","/**\n * A grilling round, read out of Claude's reply so it can be answered as a form.\n *\n * The grilling skill asks a whole round of questions at once, each in the\n * same shape, with its own recommendation under it:\n *\n * ❓ **Q1** - **Storage**: Where do drafts live?\n *\n * ➡️ In the session JSON, next to the rest of the live state.\n *\n * Answering that in a text box means retyping \"Q1: yes, Q2: …\" for every\n * question, most of which you agree with. Read as a round, each question\n * becomes a row you accept with one tap or answer in your own words, and the\n * reply is written for you.\n */\n\nexport interface GrillQuestion {\n /** The number Claude gave it: Q3 is 3. */\n n: number;\n /** The bold title after the number, when the question has one. */\n title: string | null;\n /** The question itself, as markdown. */\n body: string;\n /** Claude's recommended answer, as markdown; null when it offered none. */\n recommended: string | null;\n}\n\nexport interface GrillRound {\n /** Whatever Claude wrote before the first question. */\n intro: string;\n questions: GrillQuestion[];\n /** Whatever it wrote after the last question's recommendation. */\n outro: string;\n}\n\nexport type GrillAnswer = { mode: \"accept\" } | { mode: \"own\"; text: string } | { mode: \"skip\" };\n\n/** `❓ **Q1** - **Title**: body`, or `❓ **Q1 - Title**: body`. */\nconst QUESTION = /^\\s*❓️?\\s*\\*\\*Q(\\d+)(?:\\s*[-–—:.]\\s*([^*]+?))?\\*\\*\\s*[-–—:.]?\\s*(?:\\*\\*([^*]+?)\\*\\*\\s*:?)?\\s*(.*)$/;\nconst RECOMMENDED = /^\\s*➡️?\\s*(.*)$/;\n\n/** Splits text at blank lines into its first paragraph and the rest. */\nfunction firstParagraph(lines: string[]): [string[], string[]] {\n const blank = lines.findIndex((l) => l.trim() === \"\");\n return blank === -1 ? [lines, []] : [lines.slice(0, blank), lines.slice(blank + 1)];\n}\n\nfunction join(lines: string[]): string {\n return lines.join(\"\\n\").trim();\n}\n\n/** The round in `text`, or null when it asks no numbered questions. */\nexport function parseGrillRound(text: string): GrillRound | null {\n const lines = text.split(\"\\n\");\n const starts: number[] = [];\n lines.forEach((line, i) => {\n if (QUESTION.test(line)) starts.push(i);\n });\n if (starts.length === 0) return null;\n\n const intro = join(lines.slice(0, starts[0]));\n const questions: GrillQuestion[] = [];\n let outro = \"\";\n\n starts.forEach((start, qi) => {\n const end = starts[qi + 1] ?? lines.length;\n const m = lines[start].match(QUESTION)!;\n const rest = lines.slice(start + 1, end);\n const recAt = rest.findIndex((l) => RECOMMENDED.test(l));\n const bodyLines = [m[4], ...(recAt === -1 ? rest : rest.slice(0, recAt))];\n\n let recommended: string | null = null;\n if (recAt !== -1) {\n const recLines = [rest[recAt].match(RECOMMENDED)![1], ...rest.slice(recAt + 1)];\n const [para, after] = firstParagraph(recLines);\n recommended = join(para) || null;\n // Past the last question, what follows the recommendation is Claude\n // talking to you again, not part of the answer it proposed.\n if (qi === starts.length - 1) outro = join(after);\n else if (join(after)) recommended = join(recLines);\n }\n\n questions.push({\n n: Number(m[1]),\n title: (m[2] ?? m[3])?.trim() || null,\n body: join(bodyLines),\n recommended,\n });\n });\n\n return { intro, questions, outro };\n}\n\n/**\n * The reply a round's answers make, one line per question in Claude's order.\n * A skipped question is said to be skipped, so Claude knows it is still open\n * rather than guessing it was agreed.\n */\nexport function composeGrillReply(round: GrillRound, answers: Record<number, GrillAnswer>): string {\n return round.questions\n .map((q) => {\n const label = q.title ? `Q${q.n} (${q.title})` : `Q${q.n}`;\n const answer = answers[q.n] ?? (q.recommended ? { mode: \"accept\" } : { mode: \"skip\" });\n if (answer.mode === \"accept\") return `${label}: agreed, go with your recommendation.`;\n if (answer.mode === \"skip\" || !answer.text.trim()) return `${label}: skip for now, leave it open.`;\n return `${label}: ${answer.text.trim()}`;\n })\n .join(\"\\n\");\n}\n","/**\n * Narrowing helpers for the untyped records that come out of Claude Code's\n * JSONL. Every field is optional in practice — the format is undocumented and\n * shifts between versions — so readers return null (or 0) rather than throw.\n */\n\nexport function asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nexport function readString(value: unknown): string | null {\n return typeof value === \"string\" ? value : null;\n}\n\n/** A finite number off a record, or 0 — the sane default for a token count. */\nexport function readNumber(record: Record<string, unknown>, key: string): number {\n const value = record[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n}\n","/**\n * Folds runs of routine tool calls into one summary line, the way Claude\n * Code's fullscreen TUI does: \"Ran 4 shell commands\", \"Searched for 1\n * pattern, called brave-windows 2 times\". A working session otherwise reads\n * as a wall of tool rows with the prose lost between them.\n *\n * Only calls that are finished and unremarkable fold. Anything the reader\n * should see without opening a group stays a row of its own and ends the run:\n * a call still in flight, a subagent, a todo or plan update, an edit drawn as\n * a diff, a question. Thinking between folded calls folds with them; thinking\n * before the first call or after the last stays outside, with the prose.\n */\n\nimport { asRecord, readString } from \"./json.js\";\nimport { parseMcpToolName } from \"./mcp.js\";\nimport type { TranscriptEntry } from \"./parser.js\";\n\ntype ToolEntry = Extract<TranscriptEntry, { kind: \"tool\" }>;\n\nexport interface ToolGroup {\n kind: \"group\";\n /** The first call's id, so the group keeps its key as it grows. */\n id: string;\n entries: TranscriptEntry[];\n summary: string;\n failed: number;\n}\n\n/**\n * An entry passes through as the same object, so a keyed `each` over the\n * items re-renders only the rows that changed, not every row on every delta.\n */\nexport type TranscriptItem = TranscriptEntry | ToolGroup;\n\n/** Tools whose rows the transcript draws specially, never folded. */\nconst STANDALONE_TOOLS = new Set([\n \"Task\",\n \"Agent\",\n \"TodoWrite\",\n \"TaskCreate\",\n \"TaskUpdate\",\n \"ExitPlanMode\",\n \"EnterPlanMode\",\n \"AskUserQuestion\",\n]);\n\nfunction foldable(entry: TranscriptEntry): entry is ToolEntry {\n return (\n entry.kind === \"tool\" &&\n entry.result != null &&\n !entry.patch &&\n !STANDALONE_TOOLS.has(entry.name)\n );\n}\n\n/** A verb phrase, singular and plural, for one category of call. */\ninterface Category {\n key: string;\n phrase: (n: number) => string;\n}\n\nconst plural = (n: number, one: string, many: string) => `${n} ${n === 1 ? one : many}`;\nconst times = (n: number) => plural(n, \"time\", \"times\");\n\nconst SHELL: Category = {\n key: \"shell\",\n phrase: (n) => `ran ${plural(n, \"shell command\", \"shell commands\")}`,\n};\nconst READ: Category = { key: \"read\", phrase: (n) => `read ${plural(n, \"file\", \"files\")}` };\nconst EDIT: Category = { key: \"edit\", phrase: (n) => `edited ${plural(n, \"file\", \"files\")}` };\nconst WRITE: Category = { key: \"write\", phrase: (n) => `wrote ${plural(n, \"file\", \"files\")}` };\nconst SEARCH: Category = {\n key: \"search\",\n phrase: (n) => `searched for ${plural(n, \"pattern\", \"patterns\")}`,\n};\nconst LIST: Category = {\n key: \"list\",\n phrase: (n) => `listed ${plural(n, \"directory\", \"directories\")}`,\n};\nconst FETCH: Category = { key: \"fetch\", phrase: (n) => `fetched ${plural(n, \"page\", \"pages\")}` };\nconst WEB_SEARCH: Category = { key: \"websearch\", phrase: (n) => `searched the web ${times(n)}` };\n\n/** A shell command chaining, redirecting or spanning lines is just a shell command. */\nconst COMPOUND = /[|;&<>`$\\n]/;\nconst SHELL_VERBS: Record<string, Category> = {\n ls: LIST,\n tree: LIST,\n grep: SEARCH,\n rg: SEARCH,\n ag: SEARCH,\n cat: READ,\n head: READ,\n tail: READ,\n};\n\n/** A lone `ls` or `grep` reads as what it does, as the TUI shows it. */\nfunction shellCategory(input: string): Category {\n let command: string | undefined;\n try {\n command = readString(asRecord(JSON.parse(input))?.command)?.trim();\n } catch {\n // Truncated input: fall through to a plain shell command.\n }\n if (!command || COMPOUND.test(command)) return SHELL;\n const [verb, ...args] = command.split(/\\s+/);\n const category = SHELL_VERBS[verb] ?? SHELL;\n // `cat a b` is not \"read 1 file\"; only a read of exactly one file says so.\n if (category === READ && args.filter((a) => !a.startsWith(\"-\")).length !== 1) return SHELL;\n return category;\n}\n\nconst TOOL_CATEGORIES: Record<string, Category> = {\n BashOutput: SHELL,\n KillShell: SHELL,\n PowerShell: SHELL,\n Read: READ,\n Edit: EDIT,\n MultiEdit: EDIT,\n NotebookEdit: EDIT,\n Write: WRITE,\n Grep: SEARCH,\n Glob: SEARCH,\n LS: LIST,\n WebFetch: FETCH,\n WebSearch: WEB_SEARCH,\n};\n\n/**\n * Categories by entry. The view regroups on every streamed delta, and a Bash\n * call's category costs a JSON parse; an entry that changes is a new object.\n */\nconst categoryCache = new WeakMap<ToolEntry, Category>();\n\nfunction categorize(tool: ToolEntry): Category {\n let category = categoryCache.get(tool);\n if (!category) {\n category = categorizeUncached(tool);\n categoryCache.set(tool, category);\n }\n return category;\n}\n\nfunction categorizeUncached(tool: ToolEntry): Category {\n const mcp = parseMcpToolName(tool.name);\n if (mcp) return { key: `mcp:${mcp.server}`, phrase: (n) => `called ${mcp.server} ${times(n)}` };\n if (tool.name === \"Bash\") return shellCategory(tool.input);\n return (\n TOOL_CATEGORIES[tool.name] ?? {\n key: `tool:${tool.name}`,\n phrase: (n) => `used ${tool.name} ${times(n)}`,\n }\n );\n}\n\n/** \"Listed 1 directory, ran 2 shell commands\": categories in order of first use. */\nexport function summarizeToolRun(tools: ToolEntry[]): string {\n const counts = new Map<string, { category: Category; n: number }>();\n for (const tool of tools) {\n const category = categorize(tool);\n const seen = counts.get(category.key);\n if (seen) seen.n++;\n else counts.set(category.key, { category, n: 1 });\n }\n const text = [...counts.values()].map(({ category, n }) => category.phrase(n)).join(\", \");\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/**\n * The transcript as the view draws it: entries in order, with every run of two\n * or more foldable calls (and the thinking among them) gathered into a group.\n */\nexport function groupToolRuns(entries: TranscriptEntry[]): TranscriptItem[] {\n const items: TranscriptItem[] = [];\n let run: TranscriptEntry[] = [];\n\n const flush = () => {\n // Thinking around the calls belongs to the prose beside it.\n let start = 0;\n let end = run.length;\n while (start < end && run[start].kind === \"thinking\") start++;\n while (end > start && run[end - 1].kind === \"thinking\") end--;\n const body = run.slice(start, end);\n const tools = body.filter(foldable);\n if (tools.length >= 2) {\n items.push(...run.slice(0, start));\n items.push({\n kind: \"group\",\n id: body[0].id,\n entries: body,\n summary: summarizeToolRun(tools),\n failed: tools.filter((t) => t.result?.ok === false).length,\n });\n items.push(...run.slice(end));\n } else {\n items.push(...run);\n }\n run = [];\n };\n\n for (const entry of entries) {\n if (entry.kind === \"thinking\" || foldable(entry)) {\n run.push(entry);\n continue;\n }\n flush();\n items.push(entry);\n }\n flush();\n return items;\n}\n","<script lang=\"ts\">\n\t/**\n\t * What one turn changed, drawn where the turn ends in the transcript. Closed,\n\t * it is one quiet line (\"Changed 3 files +42 −10\"); open, a card with the\n\t * turn's files and their counts. A file, or \"View diff\", opens the side\n\t * panel's Changes pane on this turn.\n\t */\n\timport { Button } from '$lib/components/ui/button';\n\timport { displayPath, statusLetter, sumCounts, type Turn } from '$lib/side-panel/changes';\n\n\tlet {\n\t\tturn,\n\t\troot,\n\t\topen = $bindable(false),\n\t\tlink\n\t}: {\n\t\tturn: Turn;\n\t\t/** Paths under it are shown relative to it. */\n\t\troot: string | null;\n\t\topen?: boolean;\n\t\t/** Where the Changes pane opens on this turn, at `file` or its first file. */\n\t\tlink: (file: string | null) => string;\n\t} = $props();\n\n\tconst totals = $derived(sumCounts(turn.files));\n\tconst count = $derived(`${turn.files.length} ${turn.files.length === 1 ? 'file' : 'files'}`);\n</script>\n\n{#if open}\n\t<section class=\"card\" aria-label=\"Files changed in this turn\">\n\t\t<header>\n\t\t\t<span class=\"label\">\n\t\t\t\tCHANGED FILES ({turn.files.length}) · <span class=\"add\">+{totals.additions}</span>\n\t\t\t\t<span class=\"del\">−{totals.deletions}</span>\n\t\t\t</span>\n\t\t\t<span class=\"grow\"></span>\n\t\t\t<Button variant=\"ghost\" size=\"sm\" class=\"h-[30px] border border-[#2f2a27] px-2.5 text-xs\" onclick={() => (open = false)}>\n\t\t\t\tCollapse\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\tsize=\"sm\"\n\t\t\t\tclass=\"h-[30px] border border-[#3f3a36] px-2.5 text-xs\"\n\t\t\t\thref={link(null)}\n\t\t\t\tdata-sveltekit-noscroll\n\t\t\t\tdata-sveltekit-keepfocus\n\t\t\t>\n\t\t\t\tView diff\n\t\t\t</Button>\n\t\t</header>\n\t\t<ul>\n\t\t\t{#each turn.files as f (f.file)}\n\t\t\t\t{@const letter = statusLetter(f)}\n\t\t\t\t<li>\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={link(f.file)}\n\t\t\t\t\t\ttitle={f.oldPath ? `${f.oldPath} → ${f.file}` : f.file}\n\t\t\t\t\t\tdata-sveltekit-noscroll\n\t\t\t\t\t\tdata-sveltekit-keepfocus\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"st st-{letter === '?' ? 'u' : letter.toLowerCase()}\">{letter}</span>\n\t\t\t\t\t\t<span class=\"path\"><bdi>{displayPath(f.file, root)}</bdi></span>\n\t\t\t\t\t\t{#if f.binary}\n\t\t\t\t\t\t\t<span class=\"dim\">bin</span>\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t{#if f.additions}<span class=\"add\">+{f.additions}</span>{/if}\n\t\t\t\t\t\t\t{#if f.deletions}<span class=\"del\">−{f.deletions}</span>{/if}\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</a>\n\t\t\t\t</li>\n\t\t\t{/each}\n\t\t</ul>\n\t</section>\n{:else}\n\t<button type=\"button\" class=\"line\" onclick={() => (open = true)} aria-expanded=\"false\">\n\t\t<iconify-icon icon=\"mdi:chevron-right\"></iconify-icon>\n\t\t<span>Changed {count}</span>\n\t\t<span class=\"nums\"><span class=\"add\">+{totals.additions}</span> <span class=\"del\">−{totals.deletions}</span></span>\n\t</button>\n{/if}\n\n<style>\n\t.card {\n\t\tmargin: 8px 0 10px 12px;\n\t\tborder: 1px solid #262220;\n\t\tborder-radius: 10px;\n\t\tbackground: #141210;\n\t}\n\theader {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tpadding: 8px 10px 8px 14px;\n\t}\n\t.label {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10.5px;\n\t\tletter-spacing: 0.12em;\n\t\tcolor: #a8a29e;\n\t\twhite-space: nowrap;\n\t}\n\t.grow {\n\t\tflex: 1;\n\t}\n\tul {\n\t\tlist-style: none;\n\t\tmargin: 0;\n\t\tpadding: 6px;\n\t\tborder-top: 1px solid #221e1c;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 12px;\n\t}\n\tli a {\n\t\tdisplay: flex;\n\t\tgap: 10px;\n\t\tpadding: 6px 10px;\n\t\tborder-radius: 6px;\n\t\tcolor: #d6d3d1;\n\t\ttext-decoration: none;\n\t}\n\tli a:hover {\n\t\tbackground: #1f1c1a;\n\t\tcolor: #fff;\n\t}\n\t.st {\n\t\twidth: 1ch;\n\t}\n\t.st-m,\n\t.st-r {\n\t\tcolor: #fbbf24;\n\t}\n\t.st-a {\n\t\tcolor: #4ade80;\n\t}\n\t.st-d {\n\t\tcolor: #f87171;\n\t}\n\t.st-u,\n\t.dim {\n\t\tcolor: #78716c;\n\t}\n\t.path {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\t/* Cut from the left, so the file name stays in view. */\n\t\tdirection: rtl;\n\t\ttext-align: left;\n\t}\n\t.add {\n\t\tcolor: #4ade80;\n\t}\n\t.del {\n\t\tcolor: #f87171;\n\t}\n\t.line {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tmargin: 6px 0 8px 12px;\n\t\tpadding: 6px 12px 6px 8px;\n\t\tborder: 1px solid #1f1c1a;\n\t\tborder-radius: 8px;\n\t\tbackground: transparent;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 13px;\n\t\tcursor: pointer;\n\t}\n\t.line:hover {\n\t\tborder-color: #2f2a27;\n\t\tcolor: #d6d3d1;\n\t}\n\t.line iconify-icon {\n\t\tcolor: #78716c;\n\t\tfont-size: 15px;\n\t}\n\t.nums {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 12px;\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { renderMarkdown } from '$lib/markdown';\n\timport type { TranscriptEntry } from '../../../../src/transcript/parser';\n\timport DialogCard from '$lib/components/DialogCard.svelte';\n\timport type { SubagentPayload } from '$lib/stores/transcript.svelte';\n\timport { toolIcon } from '$lib/tool-icons';\n\timport ToolLabel from '$lib/components/ToolLabel.svelte';\n\timport { toolFileTarget } from '$lib/side-panel/files';\n\timport SessionStateIndicator from '$lib/components/SessionStateIndicator.svelte';\n\timport { sessionStateVisual } from '$shared/session-state.js';\n\timport type { DeliveryInfo } from '$shared/types/ws-messages.js';\n\timport type { PaneActivity, PaneChoice } from '$shared/types/ws-messages.js';\n\timport { formatSpinnerElapsed } from '$lib/format';\n\timport { Badge } from '$lib/components/ui/badge';\n\timport {\n\t\tparseGrillRound,\n\t\tcomposeGrillReply,\n\t\ttype GrillAnswer,\n\t\ttype GrillRound\n\t} from '$shared/transcript/grilling.js';\n\timport { groupToolRuns } from '$shared/transcript/tool-groups.js';\n\timport TurnChangesCard from '$lib/components/TurnChangesCard.svelte';\n\timport { placeTurnChanges, type TranscriptChanges, type Turn } from '$lib/side-panel/changes';\n\n\tlet {\n\t\tentries,\n\t\tavailable,\n\t\tloaded,\n\t\tsessionState = null,\n\t\tcurrentAction = null,\n\t\tactivity = null,\n\t\tdelivered = [],\n\t\tsuggestion = null,\n\t\tonAcceptSuggestion,\n\t\tpaneChoice = null,\n\t\tsubagents = {},\n\t\tonLoadSubagent,\n\t\tonSendKeys,\n\t\tonSendPaneText,\n\t\tolderCount = 0,\n\t\tloadingEarlier = false,\n\t\tonLoadEarlier,\n\t\tonSendReply,\n\t\tfileLink,\n\t\tagentLink,\n\t\tturnChanges = null,\n\t\tchangesLink\n\t}: {\n\t\tentries: TranscriptEntry[];\n\t\tavailable: boolean;\n\t\t/** False while the first snapshot is still in flight. */\n\t\tloaded: boolean;\n\t\t/** Live session state from the hooks (real-time, unlike the JSONL which lags). */\n\t\tsessionState?: 'busy' | 'idle' | 'waiting' | 'permission' | null;\n\t\tcurrentAction?: string | null;\n\t\t/** Claude Code's spinner line, split into its parts; null outside tmux or between frames. */\n\t\tactivity?: PaneActivity | null;\n\t\t/** What claude-mux's queue and steers handed the pane lately, newest last. */\n\t\tdelivered?: DeliveryInfo[];\n\t\t/** Claude Code's own ghost-text proposal for the next prompt. */\n\t\tsuggestion?: string | null;\n\t\t/** Accepts the suggestion (Tab then Enter in the pane). */\n\t\tonAcceptSuggestion?: () => void;\n\t\t/** The dialog the pane is drawing, as the poll read it; drawn as a card here. */\n\t\tpaneChoice?: PaneChoice | null;\n\t\t/** Sends a tmux key sequence (space-separated) to answer a dialog. */\n\t\tonSendKeys?: (keys: string) => Promise<void> | void;\n\t\t/** Types text into the pane as-is, for a dialog's free-text row or notes. */\n\t\tonSendPaneText?: (text: string) => Promise<void> | void;\n\t\t/** Subagent work, keyed by the Task tool_use id that spawned it. */\n\t\tsubagents?: Record<string, SubagentPayload>;\n\t\t/** A reader opened an agent's card: fetch everything it ran and reported. */\n\t\tonLoadSubagent?: (agentId: string) => void;\n\t\t/** Entries the server holds before the ones passed in `entries`. */\n\t\tolderCount?: number;\n\t\t/** A request for those older entries is in flight. */\n\t\tloadingEarlier?: boolean;\n\t\t/**\n\t\t * Asks for the next slice of older entries. Called before they render,\n\t\t * so the scroll container can note where the reader was.\n\t\t */\n\t\tonLoadEarlier?: () => void;\n\t\t/**\n\t\t * Sends a message as the next prompt, the way the composer does;\n\t\t * resolves false when the pane did not take it.\n\t\t */\n\t\tonSendReply?: (text: string) => Promise<boolean>;\n\t\t/** The link that opens a file a tool row touched, at a line; without it the rows draw none. */\n\t\tfileLink?: (path: string, line: number | null) => string;\n\t\t/** Where a subagent opens as a page of its own; without it agent cards link nowhere. */\n\t\tagentLink?: (agentId: string) => string;\n\t\t/** The session's turns that edited files, from the changes API's session source. */\n\t\tturnChanges?: TranscriptChanges | null;\n\t\t/** Where the Changes pane opens on turn `n`, at `file` or its first file; without it no summaries draw. */\n\t\tchangesLink?: (n: number, file: string | null) => string;\n\t} = $props();\n\n\t// ── live activity line ───────────────────────────────────────────────\n\t// The pane's elapsed count would move every second; the server sends the\n\t// turn's start instead, and the count ticks here.\n\n\tlet now = $state(Date.now());\n\tconst startedAt = $derived(activity?.started_at ?? null);\n\tconst ticking = $derived(startedAt !== null);\n\t$effect(() => {\n\t\tif (!ticking) return;\n\t\tnow = Date.now();\n\t\tconst id = setInterval(() => (now = Date.now()), 1000);\n\t\treturn () => clearInterval(id);\n\t});\n\n\t/** The spinner's parts, drawn as quiet pills beside its verb. */\n\tconst CHIP = 'border-[#2f2f36] px-[7px] py-0 text-[11.5px] leading-[18px] font-normal text-[#78716c]';\n\n\tconst elapsedText = $derived(\n\t\tstartedAt !== null ? formatSpinnerElapsed(Math.max(0, Math.floor((now - startedAt) / 1000))) : null\n\t);\n\n\t/** Entries as drawn: runs of routine tool calls fold into one summary row. */\n\tconst items = $derived(groupToolRuns(entries));\n\n\t/** Each turn's change summary, by the item it follows; the turn still running has none yet. */\n\tconst turnRunning = $derived(sessionState !== null && sessionState !== 'idle');\n\tconst turnCards = $derived(\n\t\tchangesLink && turnChanges\n\t\t\t? placeTurnChanges(items, turnChanges.turns, turnChanges.prompts, turnRunning)\n\t\t\t: new Map<string, Turn>()\n\t);\n\t/** The latest summary (the map runs in transcript order) starts open, the rest closed, until the reader says otherwise. */\n\tconst latestCard = $derived([...turnCards.values()].at(-1)?.id ?? null);\n\t/** By the turn's prompt id, which unlike its number never repeats across sessions in one pane. */\n\tlet cardOpen = $state<Record<string, boolean>>({});\n\n\t/**\n\t * Which tool cards and groups the reader has open, by entry id (a group\n\t * under `group:<first call>`). A run folds only as its calls finish, so the\n\t * card someone is reading can turn into a group under them; remembering it\n\t * here lets the new group open on that card instead of snapping shut.\n\t */\n\tlet opened = $state<Record<string, boolean>>({});\n\n\t// ── grilling rounds ──────────────────────────────────────────────────\n\t// A reply that asks a numbered round of questions, each with Claude's\n\t// recommendation, is drawn as a form: take the recommendation, write your\n\t// own answer, or leave the question open — and the reply is composed.\n\n\t/** Parsed rounds by entry text; a reply's text never changes once written. */\n\tconst roundCache = new Map<string, GrillRound | null>();\n\tfunction grillRound(text: string): GrillRound | null {\n\t\tif (!text.includes('❓')) return null;\n\t\tlet round = roundCache.get(text);\n\t\tif (round === undefined) {\n\t\t\tround = parseGrillRound(text);\n\t\t\troundCache.set(text, round);\n\t\t}\n\t\treturn round;\n\t}\n\n\t/**\n\t * The one round that can still be answered: the latest one with nothing\n\t * from you after it. Claude may go on talking past it — a background\n\t * agent reports in, and it says so — without the questions being any\n\t * less open; only your reply, or a question dialog, closes a round.\n\t * Older rounds are history, drawn read-only.\n\t */\n\tconst liveGrillId = $derived.by(() => {\n\t\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\t\tconst e = entries[i];\n\t\t\tif (e.kind === 'user' || e.kind === 'queued' || e.kind === 'ask' || e.kind === 'interrupt')\n\t\t\t\treturn null;\n\t\t\tif (e.kind === 'text' && grillRound(e.text)) return e.id;\n\t\t}\n\t\treturn null;\n\t});\n\n\tlet grillAnswers = $state<Record<string, Record<number, GrillAnswer>>>({});\n\tlet grillSending = $state<string | null>(null);\n\tlet grillSent = $state<Record<string, boolean>>({});\n\n\tfunction answerOf(id: string, q: GrillRound['questions'][number]): GrillAnswer {\n\t\treturn grillAnswers[id]?.[q.n] ?? (q.recommended ? { mode: 'accept' } : { mode: 'own', text: '' });\n\t}\n\n\tfunction setAnswer(id: string, n: number, answer: GrillAnswer) {\n\t\tgrillAnswers[id] = { ...(grillAnswers[id] ?? {}), [n]: answer };\n\t}\n\n\t/** Typing makes the answer yours; clearing the field hands it back. */\n\tfunction typeAnswer(id: string, q: GrillRound['questions'][number], text: string) {\n\t\tif (text.trim() === '' && q.recommended) setAnswer(id, q.n, { mode: 'accept' });\n\t\telse setAnswer(id, q.n, { mode: 'own', text });\n\t}\n\n\tfunction ownText(id: string, q: GrillRound['questions'][number]): string {\n\t\tconst a = answerOf(id, q);\n\t\treturn a.mode === 'own' ? a.text : '';\n\t}\n\n\tfunction tally(id: string, round: GrillRound): string {\n\t\tlet agreed = 0;\n\t\tlet own = 0;\n\t\tlet open = 0;\n\t\tfor (const q of round.questions) {\n\t\t\tconst a = answerOf(id, q);\n\t\t\tif (a.mode === 'accept') agreed++;\n\t\t\telse if (a.mode === 'own' && a.text.trim()) own++;\n\t\t\telse open++;\n\t\t}\n\t\tconst parts: string[] = [];\n\t\tif (agreed) parts.push(`${agreed} agreed`);\n\t\tif (own) parts.push(`${own} in your words`);\n\t\tif (open) parts.push(`${open} left open`);\n\t\treturn parts.join(', ');\n\t}\n\n\tasync function sendRound(id: string, round: GrillRound) {\n\t\tif (!onSendReply || grillSending) return;\n\t\tconst answers: Record<number, GrillAnswer> = {};\n\t\tfor (const q of round.questions) answers[q.n] = answerOf(id, q);\n\t\tgrillSending = id;\n\t\ttry {\n\t\t\tif (await onSendReply(composeGrillReply(round, answers))) grillSent[id] = true;\n\t\t} finally {\n\t\t\tgrillSending = null;\n\t\t}\n\t}\n\n\t/** Grows a textarea with what is typed into it, up to the CSS max-height. */\n\tfunction autosize(el: HTMLTextAreaElement) {\n\t\tconst fit = () => {\n\t\t\tel.style.height = 'auto';\n\t\t\tel.style.height = `${el.scrollHeight}px`;\n\t\t};\n\t\tfit();\n\t\tel.addEventListener('input', fit);\n\t\treturn { destroy: () => el.removeEventListener('input', fit) };\n\t}\n\n\t/**\n\t * Only the newest unanswered dialog can be driven — older cards are history.\n\t * Claude Code also sends a permission notification for a question, which\n\t * a hook from before 0.29.1 took for a permission prompt; an open question\n\t * is answerable either way.\n\t */\n\tconst canAnswer = $derived(\n\t\t(sessionState === 'waiting' || sessionState === 'permission') && onSendKeys != null\n\t);\n\n\tconst liveAskId = $derived(\n\t\tcanAnswer\n\t\t\t? (entries.findLast((e) => e.kind === 'ask' && !e.answers && !e.rejected)?.id ?? null)\n\t\t\t: null\n\t);\n\n\t// ── the open dialog ──────────────────────────────────────────────────\n\t// A dialog is drawn as a card in the transcript, never in the composer:\n\t// an AskUserQuestion where its entry sits, anything else (a permission\n\t// prompt, a local command's picker) at the foot, where the turn stopped.\n\n\t/** Which dialog is open: the live question's entry, or the pane's own. */\n\tconst dialogKey = $derived(liveAskId ?? (paneChoice || canAnswer ? 'pane' : null));\n\t/** The pane drew this dialog at some point, so its going away means it was answered. */\n\tlet seenLive = $state<string | null>(null);\n\t/** The card sent the keys that close this dialog, with no pane read to confirm it. */\n\tlet submitted = $state<string | null>(null);\n\t$effect(() => {\n\t\tif (dialogKey === null) {\n\t\t\tseenLive = null;\n\t\t\tsubmitted = null;\n\t\t} else if (paneChoice) {\n\t\t\tseenLive = dialogKey;\n\t\t\t// The pane still draws it, whatever keys the card sent blind.\n\t\t\tsubmitted = null;\n\t\t}\n\t});\n\t/** Answered and gone from the pane, while the hooks may still say it is open. */\n\tconst dialogClosed = $derived(\n\t\tdialogKey !== null &&\n\t\t\t((seenLive === dialogKey && paneChoice === null) || submitted === dialogKey)\n\t);\n\t/**\n\t * Questions answered here before the log says so. The JSONL records the\n\t * answers a moment after the dialog closes, and the card should not flash\n\t * back to open in between.\n\t */\n\tlet answeredAsks = $state<Record<string, true>>({});\n\tlet lastLiveAsk: { id: string; seen: boolean } | null = null;\n\t$effect(() => {\n\t\tif (liveAskId && dialogClosed) answeredAsks[liveAskId] = true;\n\t\t// The hooks can leave `waiting` on the same tick the pane drops the\n\t\t// dialog, so a question seen live that stops being live was answered.\n\t\tif (lastLiveAsk && lastLiveAsk.id !== liveAskId && lastLiveAsk.seen) {\n\t\t\tansweredAsks[lastLiveAsk.id] = true;\n\t\t}\n\t\tlastLiveAsk = liveAskId ? { id: liveAskId, seen: seenLive === liveAskId } : null;\n\t});\n\t/** The pane's dialog at the foot, when it is not the live question's. */\n\tconst footDialog = $derived(liveAskId === null && paneChoice !== null);\n\n\t/**\n\t * The turns claude-mux delivered from its queue or as a steer, by entry id.\n\t * Each delivery labels the first turn after it that carries its text, so\n\t * the same words sent twice label two turns, not one.\n\t */\n\tconst deliveredVia = $derived.by(() => {\n\t\tconst out = new Map<string, DeliveryInfo['via']>();\n\t\tfor (const d of delivered) {\n\t\t\tconst text = d.text.trim();\n\t\t\t// The JSONL stamps the turn a moment after the paste; allow for clock skew.\n\t\t\tconst turn = entries.find(\n\t\t\t\t(e) =>\n\t\t\t\t\t// A delivered queued entry is hidden behind its user turn.\n\t\t\t\t\t(e.kind === 'user' || (e.kind === 'queued' && !e.delivered)) &&\n\t\t\t\t\t!out.has(e.id) &&\n\t\t\t\t\te.ts >= d.at - 5000 &&\n\t\t\t\t\te.text.trim() === text\n\t\t\t);\n\t\t\tif (turn) out.set(turn.id, d.via);\n\t\t}\n\t\treturn out;\n\t});\n\n\tfunction formatTime(ts: number): string {\n\t\ttry {\n\t\t\treturn new Date(ts).toLocaleTimeString(undefined, {\n\t\t\t\thour: '2-digit',\n\t\t\t\tminute: '2-digit'\n\t\t\t});\n\t\t} catch {\n\t\t\treturn '';\n\t\t}\n\t}\n\n\tinterface InputField {\n\t\tkey: string;\n\t\tvalue: string;\n\t}\n\n\t/**\n\t * Split a tool's input into the shell command (when it has one), short\n\t * key/value rows and long text blocks — one pass, since the template would\n\t * otherwise filter the same list three times per render.\n\t */\n\tfunction inputPanes(\n\t\tinputJson: string,\n\t\ttoolName: string\n\t): { cmd: string | null; short: InputField[]; long: InputField[] } {\n\t\tlet entries: [string, unknown][];\n\t\ttry {\n\t\t\tentries = Object.entries(JSON.parse(inputJson) as Record<string, unknown>);\n\t\t} catch {\n\t\t\treturn { cmd: null, short: [], long: [{ key: 'input', value: inputJson }] };\n\t\t}\n\t\tconst isShell = toolName.toLowerCase().includes('bash');\n\t\tlet cmd: string | null = null;\n\t\tconst short: InputField[] = [];\n\t\tconst long: InputField[] = [];\n\t\tfor (const [key, raw] of entries) {\n\t\t\tconst value = typeof raw === 'string' ? raw : (JSON.stringify(raw, null, 2) ?? String(raw));\n\t\t\tif (isShell && key === 'command') {\n\t\t\t\tcmd = value;\n\t\t\t} else if (value.includes('\\n') || value.length > 90) {\n\t\t\t\tlong.push({ key, value });\n\t\t\t} else {\n\t\t\t\tshort.push({ key, value });\n\t\t\t}\n\t\t}\n\t\treturn { cmd, short, long };\n\t}\n\n</script>\n\n{#snippet grill(id: string, round: GrillRound)}\n\t{@const live = id === liveGrillId && !grillSent[id] && onSendReply != null}\n\t<!-- A busy session takes the reply into Claude Code's own queue, as the\n\t composer's does; only an open dialog would swallow it as keystrokes. -->\n\t{@const ready = live && sessionState !== 'waiting' && sessionState !== 'permission'}\n\t{#if round.intro}\n\t\t<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown output with raw HTML escaped above -->\n\t\t<div class=\"assistant-text markdown\">{@html renderMarkdown(round.intro)}</div>\n\t{/if}\n\t<section class=\"grill\" class:live aria-label=\"Questions from Claude\">\n\t\t{#each round.questions as q (q.n)}\n\t\t\t{@const a = answerOf(id, q)}\n\t\t\t<div class=\"gq\" class:skipped={live && a.mode === 'skip'}>\n\t\t\t\t<span class=\"gq-n\">Q{q.n}</span>\n\t\t\t\t<div class=\"gq-main\">\n\t\t\t\t\t{#if q.title}<p class=\"gq-title\">{q.title}</p>{/if}\n\t\t\t\t\t<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown output with raw HTML escaped above -->\n\t\t\t\t\t<div class=\"gq-body markdown\">{@html renderMarkdown(q.body)}</div>\n\t\t\t\t\t{#if q.recommended}\n\t\t\t\t\t\t{#if live}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"gq-rec\"\n\t\t\t\t\t\t\t\tclass:on={a.mode === 'accept'}\n\t\t\t\t\t\t\t\taria-pressed={a.mode === 'accept'}\n\t\t\t\t\t\t\t\tonclick={() => setAnswer(id, q.n, { mode: 'accept' })}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<iconify-icon\n\t\t\t\t\t\t\t\t\ticon={a.mode === 'accept' ? 'mdi:check-circle' : 'mdi:circle-outline'}\n\t\t\t\t\t\t\t\t></iconify-icon>\n\t\t\t\t\t\t\t\t<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown output with raw HTML escaped above -->\n\t\t\t\t\t\t\t\t<span class=\"markdown\">{@html renderMarkdown(q.recommended)}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t<div class=\"gq-rec past\">\n\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:arrow-right\"></iconify-icon>\n\t\t\t\t\t\t\t\t<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown output with raw HTML escaped above -->\n\t\t\t\t\t\t\t\t<span class=\"markdown\">{@html renderMarkdown(q.recommended)}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t{/if}\n\t\t\t\t\t{#if live}\n\t\t\t\t\t\t<div class=\"gq-own\">\n\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\trows=\"1\"\n\t\t\t\t\t\t\t\tuse:autosize\n\t\t\t\t\t\t\t\tplaceholder={q.recommended ? 'Or answer in your own words' : 'Your answer'}\n\t\t\t\t\t\t\t\tvalue={ownText(id, q)}\n\t\t\t\t\t\t\t\toninput={(e) => typeAnswer(id, q, e.currentTarget.value)}\n\t\t\t\t\t\t\t\tclass:filled={a.mode === 'own' && a.text.trim() !== ''}\n\t\t\t\t\t\t\t></textarea>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"gq-skip\"\n\t\t\t\t\t\t\t\tclass:on={a.mode === 'skip'}\n\t\t\t\t\t\t\t\taria-pressed={a.mode === 'skip'}\n\t\t\t\t\t\t\t\ttitle=\"Leave this question open for a later round\"\n\t\t\t\t\t\t\t\tonclick={() =>\n\t\t\t\t\t\t\t\t\tsetAnswer(id, q.n, a.mode === 'skip' ? (q.recommended ? { mode: 'accept' } : { mode: 'own', text: '' }) : { mode: 'skip' })}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{a.mode === 'skip' ? 'Left open' : 'Skip'}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t{/each}\n\t\t{#if live}\n\t\t\t<footer class=\"grill-foot\">\n\t\t\t\t<span class=\"grill-tally\">{tally(id, round)}</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"grill-send\"\n\t\t\t\t\tdisabled={!ready || grillSending === id}\n\t\t\t\t\ttitle={ready\n\t\t\t\t\t\t? 'Send these answers as your next message'\n\t\t\t\t\t\t: 'Answer the open dialog first; these go in after it'}\n\t\t\t\t\tonclick={() => void sendRound(id, round)}\n\t\t\t\t>\n\t\t\t\t\t{grillSending === id ? 'Sending…' : 'Send answers'}\n\t\t\t\t</button>\n\t\t\t</footer>\n\t\t{:else if grillSent[id]}\n\t\t\t<footer class=\"grill-foot\"><span class=\"grill-tally\">Answers sent</span></footer>\n\t\t{/if}\n\t</section>\n\t{#if round.outro}\n\t\t<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown output with raw HTML escaped above -->\n\t\t<div class=\"assistant-text markdown\">{@html renderMarkdown(round.outro)}</div>\n\t{/if}\n{/snippet}\n\n<div class=\"transcript\">\n\t{#if !loaded}\n\t\t<div class=\"empty\">\n\t\t\t<iconify-icon class=\"spin\" icon=\"mdi:loading\" style=\"font-size: 32px;\"></iconify-icon>\n\t\t\t<p>Loading transcript…</p>\n\t\t</div>\n\t{:else if !available && sessionState && sessionState !== 'idle'}\n\t\t<!-- The turn is under way; Claude Code writes the log as each block\n\t\t finishes, and the live row below says what it is doing meanwhile. -->\n\t\t<div class=\"empty starting\">\n\t\t\t<iconify-icon icon=\"mdi:text-box-plus-outline\" style=\"font-size: 32px;\"></iconify-icon>\n\t\t\t<p>Starting… waiting for the first entry.</p>\n\t\t</div>\n\t{:else if !available}\n\t\t<div class=\"empty\">\n\t\t\t<iconify-icon icon=\"mdi:text-box-search-outline\" style=\"font-size: 32px;\"></iconify-icon>\n\t\t\t<p>No transcript for this session yet.</p>\n\t\t\t<p class=\"hint\">It appears as soon as Claude Code writes its session log.</p>\n\t\t</div>\n\t{/if}\n\t{#if olderCount > 0}\n\t\t<div class=\"earlier\">\n\t\t\t<button type=\"button\" disabled={loadingEarlier} onclick={() => onLoadEarlier?.()}>\n\t\t\t\t<iconify-icon icon={loadingEarlier ? 'mdi:loading' : 'mdi:chevron-double-up'}\n\t\t\t\t></iconify-icon>\n\t\t\t\t{loadingEarlier ? 'Loading…' : 'Load earlier'}\n\t\t\t</button>\n\t\t\t<span class=\"earlier-count\">{olderCount} older {olderCount === 1 ? 'entry' : 'entries'}</span>\n\t\t</div>\n\t{/if}\n\t{#snippet turnGlyph(dictated: boolean)}\n\t\t{#if dictated}\n\t\t\t<iconify-icon class=\"mic-glyph\" icon=\"mdi:microphone\" title=\"dictated\"></iconify-icon>\n\t\t{:else}\n\t\t\t<span class=\"prompt-glyph\">❯</span>\n\t\t{/if}\n\t{/snippet}\n\t{#snippet via(id: string)}\n\t\t{@const how = deliveredVia.get(id)}\n\t\t{#if how}\n\t\t\t<span\n\t\t\t\tclass=\"via\"\n\t\t\t\ttitle={how === 'steer' ? 'Steered into the running turn' : 'Sent from the queue'}\n\t\t\t\t>{how === 'steer' ? 'Steer' : 'Queued'}</span\n\t\t\t>\n\t\t{/if}\n\t{/snippet}\n\t{#snippet row(entry: TranscriptEntry)}\n\t\t{#if entry.kind === 'user'}\n\t\t\t<div class=\"user-block\" class:dictated={entry.dictated} data-entry-id={entry.id}>\n\t\t\t\t{@render turnGlyph(entry.dictated ?? false)}\n\t\t\t\t<!-- A slash command is a different kind of turn: not prose the agent\n\t\t\t\t read, but an instruction to the harness. Show the command as a\n\t\t\t\t token so it is scannable, and its arguments as ordinary prompt\n\t\t\t\t text — the raw <command-*> tags never reach the reader. -->\n\t\t\t\t{#if entry.command}\n\t\t\t\t\t<div class=\"user-text\">\n\t\t\t\t\t\t<span class=\"slash-name\">{entry.command.name}</span>{#if entry.command.args}<span\n\t\t\t\t\t\t\t\tclass=\"slash-args\">{entry.command.args}</span\n\t\t\t\t\t\t\t>{/if}\n\t\t\t\t\t\t<!-- A local command answers on the spot — \"Set model to Fable\" —\n\t\t\t\t\t\t and that answer is the harness's, not the agent's, so it sits\n\t\t\t\t\t\t under the command rather than as a turn. -->\n\t\t\t\t\t\t{#if entry.command.output}\n\t\t\t\t\t\t\t<div class=\"slash-output\">{entry.command.output}</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t{:else}\n\t\t\t\t\t<div class=\"user-text\">{entry.text}</div>\n\t\t\t\t{/if}\n\t\t\t\t<span class=\"time\">{@render via(entry.id)}{formatTime(entry.ts)}</span>\n\t\t\t</div>\n\t\t{:else if entry.kind === 'queued'}\n\t\t\t{#if !entry.delivered}\n\t\t\t\t<div class=\"user-block\" class:dictated={entry.dictated} data-entry-id={entry.id}>\n\t\t\t\t\t{@render turnGlyph(entry.dictated ?? false)}\n\t\t\t\t\t<div class=\"user-text\">{entry.text}</div>\n\t\t\t\t\t<span class=\"time\" title=\"sent while the agent was working\">\n\t\t\t\t\t\t{@render via(entry.id)}\n\t\t\t\t\t\t<iconify-icon icon=\"mdi:clock-fast\"></iconify-icon>\n\t\t\t\t\t\t{formatTime(entry.ts)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t{:else if entry.kind === 'peer'}\n\t\t\t<div class=\"user-block peer\">\n\t\t\t\t<iconify-icon class=\"peer-icon\" icon=\"mdi:swap-horizontal\"></iconify-icon>\n\t\t\t\t<div class=\"peer-body\">\n\t\t\t\t\t{#if entry.from}<span class=\"peer-from\">{entry.from}</span>{/if}\n\t\t\t\t\t<div class=\"user-text peer-text\">{entry.text}</div>\n\t\t\t\t</div>\n\t\t\t\t<span class=\"time peer-time\">{formatTime(entry.ts)}</span>\n\t\t\t</div>\n\t\t{:else if entry.kind === 'interrupt'}\n\t\t\t<!-- Escape stopped the turn. Claude Code logs it as a user line, but\n\t\t\t nobody typed it, so it reads as a log note like \"Question dismissed\". -->\n\t\t\t<div class=\"row note\">\n\t\t\t\t<iconify-icon icon=\"mdi:stop-circle-outline\"></iconify-icon>\n\t\t\t\t<span class=\"row-summary\">{entry.text}</span>\n\t\t\t\t<span class=\"time\">{formatTime(entry.ts)}</span>\n\t\t\t</div>\n\t\t{:else if entry.kind === 'compact'}\n\t\t\t<!-- The conversation was folded here. Everything above it is what the\n\t\t\t model no longer sees; the summary is what it reads instead. -->\n\t\t\t<details class=\"compact\">\n\t\t\t\t<summary>\n\t\t\t\t\t<iconify-icon icon=\"mdi:arrow-collapse-vertical\"></iconify-icon>\n\t\t\t\t\t<span class=\"compact-title\">\n\t\t\t\t\t\tContext compacted{entry.trigger === 'manual' ? ' (/compact)' : ' automatically'}\n\t\t\t\t\t</span>\n\t\t\t\t\t{#if entry.preTokens && entry.postTokens}\n\t\t\t\t\t\t<span class=\"compact-tokens\">\n\t\t\t\t\t\t\t{Math.round(entry.preTokens / 1000)}k → {Math.round(entry.postTokens / 1000)}k tokens\n\t\t\t\t\t\t</span>\n\t\t\t\t\t{/if}\n\t\t\t\t\t<span class=\"time\">{formatTime(entry.ts)}</span>\n\t\t\t\t</summary>\n\t\t\t\t{#if entry.summary}\n\t\t\t\t\t<div class=\"compact-summary\">{@html renderMarkdown(entry.summary)}</div>\n\t\t\t\t{:else}\n\t\t\t\t\t<p class=\"compact-summary muted\">Summary not written yet.</p>\n\t\t\t\t{/if}\n\t\t\t</details>\n\t\t{:else if entry.kind === 'ask'}\n\t\t\t{#if entry.answers || entry.rejected}\n\t\t\t\t<details class=\"row ask-done\">\n\t\t\t\t\t<summary>\n\t\t\t\t\t\t<iconify-icon icon=\"mdi:chat-question-outline\"></iconify-icon>\n\t\t\t\t\t\t<span class=\"row-summary\">\n\t\t\t\t\t\t\t{#if entry.rejected}\n\t\t\t\t\t\t\t\tQuestion dismissed\n\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t{entry.questions\n\t\t\t\t\t\t\t\t\t.map((q) => `${q.header}: ${entry.answers?.[q.question] ?? '—'}`)\n\t\t\t\t\t\t\t\t\t.join(' · ')}\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<iconify-icon class=\"tool-status ok\" icon=\"mdi:check\"></iconify-icon>\n\t\t\t\t\t</summary>\n\t\t\t\t\t<div class=\"ask-detail\">\n\t\t\t\t\t\t{#each entry.questions as q (q.question)}\n\t\t\t\t\t\t\t<div class=\"ask-q-review\">\n\t\t\t\t\t\t\t\t<span class=\"ask-header-chip\">{q.header}</span>\n\t\t\t\t\t\t\t\t<p class=\"ask-question\">{q.question}</p>\n\t\t\t\t\t\t\t\t{#each q.options as opt (opt.label)}\n\t\t\t\t\t\t\t\t\t<div class=\"ask-opt-review\" class:chosen={entry.answers?.[q.question] === opt.label}>\n\t\t\t\t\t\t\t\t\t\t{opt.label}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t\t{#if entry.answers && !q.options.some((o) => o.label === entry.answers?.[q.question])}\n\t\t\t\t\t\t\t\t\t<div class=\"ask-opt-review chosen\">{entry.answers?.[q.question]}</div>\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</div>\n\t\t\t\t</details>\n\t\t\t{:else if entry.id === liveAskId || answeredAsks[entry.id]}\n\t\t\t\t<DialogCard\n\t\t\t\t\task={entry}\n\t\t\t\t\tchoice={entry.id === liveAskId ? paneChoice : null}\n\t\t\t\t\tpermission={sessionState === 'permission'}\n\t\t\t\t\tclosed={entry.id !== liveAskId || dialogClosed}\n\t\t\t\t\tonKeys={(keys) => onSendKeys?.(keys)}\n\t\t\t\t\tonText={(text) => onSendPaneText?.(text)}\n\t\t\t\t\tonSubmitted={() => (submitted = entry.id)}\n\t\t\t\t/>\n\t\t\t{:else}\n\t\t\t\t<div class=\"row note\">\n\t\t\t\t\t<iconify-icon icon=\"mdi:chat-question-outline\"></iconify-icon>\n\t\t\t\t\t<span class=\"row-summary\">\n\t\t\t\t\t\tQuestion not answered: {entry.questions.map((q) => q.header).join(' · ')}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\"time\">{formatTime(entry.ts)}</span>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t{:else if entry.kind === 'text' && grillRound(entry.text)}\n\t\t\t{@render grill(entry.id, grillRound(entry.text)!)}\n\t\t{:else if entry.kind === 'text'}\n\t\t\t<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown output with raw HTML escaped above -->\n\t\t\t<div class=\"assistant-text markdown\">{@html renderMarkdown(entry.text)}</div>\n\t\t{:else if entry.kind === 'thinking'}\n\t\t\t<details class=\"row thinking\">\n\t\t\t\t<summary>\n\t\t\t\t\t<iconify-icon icon=\"mdi:thought-bubble-outline\"></iconify-icon>\n\t\t\t\t\t<span class=\"row-summary\">Thinking</span>\n\t\t\t\t</summary>\n\t\t\t\t<div class=\"thinking-text\">{entry.text}</div>\n\t\t\t</details>\n\t\t{:else if entry.kind === 'tool'}\n\t\t\t{@const input = inputPanes(entry.input, entry.name)}\n\t\t\t{@const showResult = entry.result != null && !(entry.patch && entry.result.ok)}\n\t\t\t{@const sub = subagents[entry.id]}\n\t\t\t{@const doing = sub?.running ? sub.activity[sub.activity.length - 1] : null}\n\t\t\t<details\n\t\t\t\tclass=\"row tool-card\"\n\t\t\t\tclass:error={entry.result?.ok === false}\n\t\t\t\tclass:agent={sub != null}\n\t\t\t\tdata-entry-id={entry.id}\n\t\t\t\topen={opened[entry.id] ?? false}\n\t\t\t\tontoggle={(e) => {\n\t\t\t\t\topened[entry.id] = e.currentTarget.open;\n\t\t\t\t\tif (sub && !sub.full && e.currentTarget.open) onLoadSubagent?.(sub.agentId);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<summary>\n\t\t\t\t\t<iconify-icon class=\"tool-icon\" icon={toolIcon(entry.name)}></iconify-icon>\n\t\t\t\t\t{#if sub}\n\t\t\t\t\t\t<span class=\"row-summary agent-line\">\n\t\t\t\t\t\t\t<span class=\"agent-name\">{sub.description ?? entry.summary}</span>\n\t\t\t\t\t\t\t{#if sub.agentType}<span class=\"agent-type\">{sub.agentType}</span>{/if}\n\t\t\t\t\t\t\t{#if doing}\n\t\t\t\t\t\t\t\t<span class=\"agent-doing mono\"><ToolLabel name={doing.name} summary={doing.summary} /></span>\n\t\t\t\t\t\t\t{:else if sub.activity.length > 0}\n\t\t\t\t\t\t\t\t<span class=\"agent-count\">{sub.activity.length} tools</span>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{#if agentLink}\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\tclass=\"tool-open\"\n\t\t\t\t\t\t\t\thref={agentLink(sub.agentId)}\n\t\t\t\t\t\t\t\ttitle=\"Open agent\"\n\t\t\t\t\t\t\t\taria-label=\"Open agent\"\n\t\t\t\t\t\t\t\tonclick={(e) => e.stopPropagation()}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:open-in-new\"></iconify-icon>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t<span class=\"row-summary mono\"><ToolLabel name={entry.name} summary={entry.summary} /></span>\n\t\t\t\t\t\t{@const opens = fileLink ? toolFileTarget(entry) : null}\n\t\t\t\t\t\t{#if opens && fileLink}\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\tclass=\"tool-open\"\n\t\t\t\t\t\t\t\thref={fileLink(opens.path, opens.line)}\n\t\t\t\t\t\t\t\ttitle=\"Open in Files{opens.line ? ` at line ${opens.line}` : ''}\"\n\t\t\t\t\t\t\t\taria-label=\"Open in Files\"\n\t\t\t\t\t\t\t\tdata-sveltekit-noscroll\n\t\t\t\t\t\t\t\tdata-sveltekit-keepfocus\n\t\t\t\t\t\t\t\tonclick={(e) => e.stopPropagation()}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:file-eye-outline\"></iconify-icon>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t{/if}\n\t\t\t\t\t{#if entry.result}\n\t\t\t\t\t\t<iconify-icon\n\t\t\t\t\t\t\tclass=\"tool-status {entry.result.ok ? 'ok' : 'fail'}\"\n\t\t\t\t\t\t\ticon={entry.result.ok ? 'mdi:check' : 'mdi:alert-circle-outline'}\n\t\t\t\t\t\t></iconify-icon>\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t<iconify-icon class=\"tool-status running spin\" icon=\"mdi:loading\"></iconify-icon>\n\t\t\t\t\t{/if}\n\t\t\t\t</summary>\n\t\t\t\t{#if sub}\n\t\t\t\t\t<div class=\"agent-detail\">\n\t\t\t\t\t\t<div class=\"agent-meta\">\n\t\t\t\t\t\t\t{#if sub.model}<span class=\"agent-chip\">{sub.model}</span>{/if}\n\t\t\t\t\t\t\t<span class=\"agent-chip\">{sub.activity.length} tools</span>\n\t\t\t\t\t\t\t{#if sub.running}<span class=\"agent-chip live\">running</span>{/if}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{#if sub.trimmed > 0}\n\t\t\t\t\t\t\t<div class=\"agent-trimmed\">{sub.trimmed} earlier calls not shown</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t<ol class=\"agent-activity\">\n\t\t\t\t\t\t\t{#each sub.activity as act (act.id)}\n\t\t\t\t\t\t\t\t<li class:pending={act.ok === null} class:failed={act.ok === false}>\n\t\t\t\t\t\t\t\t\t<iconify-icon class=\"tool-icon\" icon={toolIcon(act.name)}></iconify-icon>\n\t\t\t\t\t\t\t\t\t<span class=\"mono\"><ToolLabel name={act.name} summary={act.summary} /></span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t</ol>\n\t\t\t\t\t\t{#if sub.report}\n\t\t\t\t\t\t\t<div class=\"agent-report\">\n\t\t\t\t\t\t\t\t<header class=\"pane-head\">Report</header>\n\t\t\t\t\t\t\t\t<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown output with raw HTML escaped above -->\n\t\t\t\t\t\t\t\t<div class=\"markdown\">{@html renderMarkdown(sub.report)}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t{:else}\n\t\t\t\t<div class=\"tool-detail\" class:two-col={showResult && !entry.patch}>\n\t\t\t\t\t{#if entry.patch}\n\t\t\t\t\t\t<section class=\"pane diff-pane\">\n\t\t\t\t\t\t\t<header class=\"pane-head\">\n\t\t\t\t\t\t\t\tDiff\n\t\t\t\t\t\t\t\t{#if entry.patch.file}<span class=\"diff-file\">{entry.patch.file.split('/').pop()}</span>{/if}\n\t\t\t\t\t\t\t</header>\n\t\t\t\t\t\t\t<pre class=\"diff\">{#each entry.patch.hunks as hunk, hi (hi)}<span class=\"diff-hunk\">{hunk.header}</span>{'\\n'}{#each hunk.lines as dl, li (li)}<span\n\t\t\t\t\t\t\t\t\t\tclass={dl.startsWith('+') ? 'diff-add' : dl.startsWith('-') ? 'diff-del' : 'diff-ctx'}>{dl}</span>{'\\n'}{/each}{/each}</pre>\n\t\t\t\t\t\t</section>\n\t\t\t\t\t{:else if input.cmd || input.short.length > 0 || input.long.length > 0}\n\t\t\t\t\t\t<section class=\"pane\">\n\t\t\t\t\t\t\t<header class=\"pane-head\">Input</header>\n\t\t\t\t\t\t\t{#if input.cmd}\n\t\t\t\t\t\t\t\t<pre class=\"cmd\"><span class=\"cmd-glyph\">$</span> {input.cmd}</pre>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{#each input.short as field (field.key)}\n\t\t\t\t\t\t\t\t<div class=\"kv\"><span class=\"k\">{field.key}</span><span class=\"v\">{field.value}</span></div>\n\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t{#each input.long as field (field.key)}\n\t\t\t\t\t\t\t\t<div class=\"kv-long\">\n\t\t\t\t\t\t\t\t\t<span class=\"k\">{field.key}</span>\n\t\t\t\t\t\t\t\t\t<pre>{field.value}</pre>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t</section>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{#if showResult && entry.result}\n\t\t\t\t\t\t<section class=\"pane result\" class:ok={entry.result.ok} class:fail={!entry.result.ok}>\n\t\t\t\t\t\t\t<header class=\"pane-head\">{entry.result.ok ? 'Result' : 'Error'}</header>\n\t\t\t\t\t\t\t{#each entry.result.images ?? [] as path, i (i)}\n\t\t\t\t\t\t\t\t{@const src = `/api/files/image?path=${encodeURIComponent(path)}`}\n\t\t\t\t\t\t\t\t<a class=\"result-image\" href={src} target=\"_blank\" rel=\"noopener\">\n\t\t\t\t\t\t\t\t\t<img {src} alt={path.split('/').pop()} loading=\"lazy\" />\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t{#if entry.result.output || !entry.result.images}\n\t\t\t\t\t\t\t\t<pre>{entry.result.output || '(no output)'}</pre>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</section>\n\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\t\t\t</details>\n\t\t{/if}\n\t{/snippet}\n\t{#each items as item (item.id)}\n\t\t{#if item.kind === 'group'}\n\t\t\t<!-- A run of routine calls, folded the way the terminal folds it. Open,\n\t\t\t it is the same rows the run would have drawn on its own. -->\n\t\t\t<details\n\t\t\t\tclass=\"row tool-group\"\n\t\t\t\topen={opened[`group:${item.id}`] ?? opened[item.id] ?? false}\n\t\t\t\tontoggle={(e) => (opened[`group:${item.id}`] = e.currentTarget.open)}\n\t\t\t>\n\t\t\t\t<summary>\n\t\t\t\t\t<iconify-icon class=\"tool-icon\" icon=\"mdi:layers-outline\"></iconify-icon>\n\t\t\t\t\t<span class=\"row-summary\">{item.summary}</span>\n\t\t\t\t\t{#if item.failed > 0}\n\t\t\t\t\t\t<span class=\"group-failed\">{item.failed} failed</span>\n\t\t\t\t\t\t<iconify-icon class=\"tool-status fail\" icon=\"mdi:alert-circle-outline\"></iconify-icon>\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t<iconify-icon class=\"tool-status ok\" icon=\"mdi:check\"></iconify-icon>\n\t\t\t\t\t{/if}\n\t\t\t\t</summary>\n\t\t\t\t<div class=\"group-rows\">\n\t\t\t\t\t{#each item.entries as entry (entry.id)}\n\t\t\t\t\t\t{@render row(entry)}\n\t\t\t\t\t{/each}\n\t\t\t\t</div>\n\t\t\t</details>\n\t\t{:else}\n\t\t\t{@render row(item)}\n\t\t{/if}\n\t\t{@const changed = turnCards.get(item.id)}\n\t\t{#if changed && changesLink}\n\t\t\t<TurnChangesCard\n\t\t\t\tturn={changed}\n\t\t\t\troot={turnChanges?.root ?? null}\n\t\t\t\tbind:open={() => cardOpen[changed.id!] ?? changed.id === latestCard, (v) => (cardOpen[changed.id!] = v)}\n\t\t\t\tlink={(file) => changesLink(changed.n, file)}\n\t\t\t/>\n\t\t{/if}\n\t{/each}\n\n\t{#if footDialog}\n\t\t<DialogCard\n\t\t\tchoice={paneChoice}\n\t\t\tpermission={sessionState === 'permission'}\n\t\t\tonKeys={(keys) => onSendKeys?.(keys)}\n\t\t\tonText={(text) => onSendPaneText?.(text)}\n\t\t/>\n\t{/if}\n\n\t<!-- Live status: driven by hooks, which fire the instant a tool starts;\n\t the JSONL itself is written in batches and lags by seconds. -->\n\t{#if sessionState === 'busy'}\n\t\t<div class=\"live-row busy\">\n\t\t\t<SessionStateIndicator state=\"busy\" />\n\t\t\t{#if activity}\n\t\t\t\t<span class=\"live-verb mono\">{activity.verb}</span>\n\t\t\t\t<span class=\"live-chips\">\n\t\t\t\t\t{#if activity.doing}\n\t\t\t\t\t\t<Badge variant=\"outline\" class=\"{CHIP} min-w-0 shrink justify-start text-[#a8a29e]\">\n\t\t\t\t\t\t\t<span class=\"truncate\">{activity.doing}</span>\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{#if elapsedText}<Badge variant=\"outline\" class=\"{CHIP} font-mono\">{elapsedText}</Badge>{/if}\n\t\t\t\t\t{#if activity.tokens}\n\t\t\t\t\t\t<Badge variant=\"outline\" class=\"{CHIP} font-mono\"\n\t\t\t\t\t\t\t>{activity.tokens.dir === 'up' ? '↑' : '↓'} {activity.tokens.count} tokens</Badge\n\t\t\t\t\t\t>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{#if activity.thinking}<Badge variant=\"outline\" class={CHIP}>{activity.thinking}</Badge>{/if}\n\t\t\t\t</span>\n\t\t\t{:else}\n\t\t\t\t<span class=\"live-text mono\">{currentAction ?? 'Working…'}</span>\n\t\t\t{/if}\n\t\t</div>\n\t{:else if sessionState === 'permission' || sessionState === 'waiting'}\n\t\t{@const state = sessionState}\n\t\t<div class=\"live-row attention\" style=\"color: {sessionStateVisual(state).color}\">\n\t\t\t<SessionStateIndicator {state} />\n\t\t\t<span class=\"live-text\">\n\t\t\t\t{#if dialogClosed}\n\t\t\t\t\tAnswer sent — waiting for Claude to carry on\n\t\t\t\t{:else if liveAskId || footDialog}\n\t\t\t\t\tWaiting for your answer — answer in the card above ↑\n\t\t\t\t{:else if state === 'permission'}\n\t\t\t\t\tWaiting for permission — reading the dialog, or switch to terminal view to respond\n\t\t\t\t{:else}\n\t\t\t\t\tQuestion incoming… answer here when it appears, or in the terminal view\n\t\t\t\t{/if}\n\t\t\t</span>\n\t\t</div>\n\t{/if}\n\n\t{#if suggestion}\n\t\t<!-- Claude's own next-prompt proposal, drawn as the same not-yet-happened\n\t\t turn anchor as a queued message — but in the suggestion's blue, and\n\t\t tappable: accepting is the only interaction it has. -->\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"user-block pending suggested\"\n\t\t\tonclick={onAcceptSuggestion}\n\t\t\ttitle=\"Accept Claude's suggestion\"\n\t\t>\n\t\t\t<span class=\"prompt-glyph\">❯</span>\n\t\t\t<div class=\"user-text\">{suggestion}</div>\n\t\t\t<span class=\"time suggested-tag\" title=\"Claude's suggested next prompt — tap to accept\">\n\t\t\t\t<iconify-icon icon=\"mdi:star-four-points-outline\"></iconify-icon>\n\t\t\t\tsuggested · accept <kbd>⇥</kbd>\n\t\t\t</span>\n\t\t</button>\n\t{/if}\n</div>\n\n<style>\n\t.transcript {\n\t\twidth: 100%;\n\t\tmax-width: 860px;\n\t\tmargin: 0 auto;\n\t\t/* Assistant prose reads as text, not terminal output — deliberate contrast\n\t\t with the mono user prompts and tool rows (the terminal's vernacular). */\n\t\tfont-family:\n\t\t\tui-sans-serif,\n\t\t\tsystem-ui,\n\t\t\t-apple-system,\n\t\t\t'Segoe UI',\n\t\t\tRoboto,\n\t\t\tsans-serif;\n\t\t--mono: var(--font-mono);\n\t\tfont-size: 14.5px;\n\t\tline-height: 1.65;\n\t\tcolor: #d6d3d1;\n\t\tpadding-bottom: 8px;\n\t\t/* The .output host is a terminal container with pre-wrap; without this,\n\t\t the newlines marked emits between blocks render as visible gaps. */\n\t\twhite-space: normal;\n\t\tcontainer-type: inline-size;\n\t}\n\n\t.empty {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\tpadding: 56px 16px;\n\t\tcolor: #78716c;\n\t\ttext-align: center;\n\t}\n\t.empty.starting {\n\t\tpadding-bottom: 24px;\n\t}\n\t.empty.starting iconify-icon {\n\t\tanimation: starting-breathe 1.8s ease-in-out infinite;\n\t}\n\t@keyframes starting-breathe {\n\t\t50% {\n\t\t\topacity: 0.4;\n\t\t}\n\t}\n\t.empty .hint {\n\t\tfont-size: 12px;\n\t\tcolor: #57534e;\n\t}\n\n\t/* --- The head of a windowed transcript: quiet, since the reader who wants\n\t older turns is looking for it and everyone else is reading downward. --- */\n\t.earlier {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-wrap: wrap;\n\t\tgap: 8px 12px;\n\t\tpadding: 14px 8px 18px;\n\t\tborder-bottom: 1px solid #292524;\n\t\tmargin-bottom: 8px;\n\t}\n\t.earlier button {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\tpadding: 5px 12px;\n\t\tborder: 1px solid #44403c;\n\t\tborder-radius: 999px;\n\t\tbackground: #1c1917;\n\t\tcolor: #d6d3d1;\n\t\tfont-size: 12px;\n\t\tcursor: pointer;\n\t}\n\t.earlier button:hover {\n\t\tborder-color: #57534e;\n\t\tcolor: #fafaf9;\n\t}\n\t.earlier button[disabled] {\n\t\topacity: 0.6;\n\t\tcursor: default;\n\t}\n\t.earlier-count {\n\t\tfont-size: 11px;\n\t\tcolor: #78716c;\n\t}\n\n\t/* --- User prompt: the turn anchor, in the terminal's own voice.\n\t The one place this view spends visual weight: a warm panel against the\n\t cool-dark tool cards, so turns are findable when scrolling fast. --- */\n\t.user-block {\n\t\tdisplay: flex;\n\t\talign-items: baseline;\n\t\tgap: 10px;\n\t\tmargin: 30px 0 12px;\n\t\tpadding: 10px 12px;\n\t\tbackground: #241d12;\n\t\tborder: 1px solid #46351c;\n\t\tborder-left: 3px solid #d97706;\n\t\tborder-radius: 8px;\n\t}\n\t.user-block:first-child {\n\t\tmargin-top: 6px;\n\t}\n\t/* Queued in the terminal: the same turn anchor, drawn as an outline because\n\t it has not happened yet. */\n\t.user-block.pending {\n\t\tbackground: transparent;\n\t\tborder-style: dashed;\n\t\tborder-left-style: solid;\n\t\tborder-left-color: #7c5e2a;\n\t\tmargin: 12px 0;\n\t}\n\t.user-block.pending .prompt-glyph,\n\t.user-block.pending .user-text {\n\t\tcolor: #8f8578;\n\t}\n\t/* Claude's suggestion: the queued anchor's shape, in the one colour nothing\n\t else in the app uses — and clickable, because tapping accepts it. */\n\t.user-block.suggested {\n\t\twidth: 100%;\n\t\tfont: inherit;\n\t\ttext-align: left;\n\t\tcursor: pointer;\n\t\tborder-color: #3b3b5c;\n\t\tborder-left-color: #6366f1;\n\t}\n\t.user-block.suggested:hover {\n\t\tbackground: #14141c;\n\t}\n\t.user-block.suggested:focus-visible {\n\t\toutline: 2px solid #818cf8;\n\t\toutline-offset: -2px;\n\t}\n\t.user-block.suggested .prompt-glyph {\n\t\tcolor: #818cf8;\n\t}\n\t/* Ghost text reads faint in the terminal; keep it reading that way here. */\n\t.user-block.suggested .user-text {\n\t\tcolor: #8b8fb0;\n\t}\n\t.user-block.suggested .suggested-tag {\n\t\tcolor: #a5b4fc;\n\t}\n\t.suggested-tag kbd {\n\t\tfont: inherit;\n\t\tpadding: 0 4px;\n\t\tborder: 1px solid #3a3a52;\n\t\tborder-radius: 3px;\n\t}\n\t/* How a turn got there, when claude-mux delivered it for you. */\n\t.via {\n\t\tmargin-right: 6px;\n\t\tpadding: 0 5px;\n\t\tborder-radius: 4px;\n\t\tbackground: #292524;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 10px;\n\t}\n\n\t.prompt-glyph,\n\t.mic-glyph {\n\t\tflex-shrink: 0;\n\t\twidth: 14px;\n\t\tfont-family: var(--mono);\n\t\tfont-weight: 700;\n\t\tfont-size: 14px;\n\t\tcolor: #f59e0b;\n\t}\n\t/* Dictated prompt: same turn anchor, warmed toward coral — spoken, not\n\t typed — with the microphone standing where the prompt glyph would be. */\n\t.user-block.dictated {\n\t\tbackground: #261418;\n\t\tborder-color: #492530;\n\t\tborder-left-color: #e0566f;\n\t}\n\t.mic-glyph {\n\t\tcolor: #fb7185;\n\t\talign-self: baseline;\n\t\ttransform: translateY(2px);\n\t}\n\t.user-block.dictated .user-text {\n\t\tcolor: #fde8e8;\n\t}\n\t.user-text {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tfont-family: var(--mono);\n\t\tfont-size: 13px;\n\t\tline-height: 1.55;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tcolor: #fef3c7;\n\t}\n\t/* Slash command: the name reads as a token, its arguments as plain prompt\n\t text — the same distinction the terminal's own input line makes. */\n\t.slash-name {\n\t\tpadding: 1px 6px;\n\t\tborder: 1px solid #6b4c1a;\n\t\tborder-radius: 5px;\n\t\tbackground: #33260f;\n\t\tcolor: #fbbf24;\n\t\tfont-weight: 600;\n\t}\n\t.slash-args {\n\t\tmargin-left: 8px;\n\t}\n\t/* What the command printed back, in the harness's voice: quieter than the\n\t prompt, and kept as printed. */\n\t.slash-output {\n\t\tmargin-top: 5px;\n\t\tpadding-left: 10px;\n\t\tborder-left: 2px solid #6b4c1a;\n\t\tcolor: #b8a87a;\n\t\tfont-size: 12.5px;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t}\n\n\t.time {\n\t\tflex-shrink: 0;\n\t\tfont-size: 10px;\n\t\tcolor: #8a7a55;\n\t\tfont-variant-numeric: tabular-nums;\n\t}\n\n\t.time iconify-icon {\n\t\tfont-size: 12px;\n\t\tvertical-align: -2px;\n\t}\n\n\t/* Cross-session (A2A) message: same anchor shape as a human turn, cool\n\t teal instead of warm amber — another agent's voice, not the user's. */\n\t.user-block.peer {\n\t\tbackground: #10201f;\n\t\tborder-color: #1e3d3a;\n\t\tborder-left-color: #14b8a6;\n\t}\n\t.peer-icon {\n\t\tflex-shrink: 0;\n\t\talign-self: baseline;\n\t\tfont-size: 15px;\n\t\tcolor: #2dd4bf;\n\t}\n\t.peer-body {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\t.peer-from {\n\t\tdisplay: block;\n\t\tfont-family: var(--mono);\n\t\tfont-size: 10.5px;\n\t\tfont-weight: 700;\n\t\tcolor: #2dd4bf;\n\t\tmargin-bottom: 2px;\n\t}\n\t.peer-text {\n\t\tcolor: #d8f3ef;\n\t}\n\t.peer-time {\n\t\tcolor: #3f6f68;\n\t}\n\n\t/* Agent activity sits slightly indented under its prompt anchor — the\n\t amber panel alone carries the turn structure, no rail needed. */\n\t.assistant-text,\n\t.row {\n\t\tmargin-left: 12px;\n\t}\n\n\t/* --- Assistant prose --- */\n\t.assistant-text {\n\t\tmargin-top: 10px;\n\t\tmargin-bottom: 10px;\n\t\tword-break: break-word;\n\t}\n\n\t/* --- Collapsible rows (tools + thinking): closed, they read as slim log\n\t lines — no box, dimmed, clearly \"machine activity\" next to the prose.\n\t The card chrome only appears when a row is opened. --- */\n\t.row {\n\t\tmargin-top: 1px;\n\t\tmargin-bottom: 1px;\n\t\tborder: 1px solid transparent;\n\t\tborder-radius: 7px;\n\t\tbackground: transparent;\n\t}\n\t.row[open] {\n\t\tmargin-top: 6px;\n\t\tmargin-bottom: 8px;\n\t\tborder-color: #262220;\n\t\tbackground: #1b1816;\n\t}\n\t.row summary {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tpadding: 2px 8px;\n\t\tcursor: pointer;\n\t\tlist-style: none;\n\t\tuser-select: none;\n\t\tfont-size: 12.5px;\n\t\tcolor: #8a837c;\n\t\tborder-radius: 7px;\n\t\ttransition: background 0.12s;\n\t}\n\t.row summary:hover {\n\t\tbackground: #201c18;\n\t\tcolor: #c7c2bd;\n\t}\n\t.row summary::-webkit-details-marker {\n\t\tdisplay: none;\n\t}\n\t.row[open] > summary {\n\t\tpadding: 5px 10px;\n\t\tcolor: #c7c2bd;\n\t\tborder-bottom: 1px solid #262220;\n\t\tborder-bottom-left-radius: 0;\n\t\tborder-bottom-right-radius: 0;\n\t}\n\t/* A row with nothing to open: the closed summary's look, no hover. */\n\t.row.note {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tpadding: 2px 8px;\n\t\tfont-size: 12.5px;\n\t\tcolor: #8a837c;\n\t}\n\t.row-summary {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t.mono {\n\t\tfont-family: var(--mono);\n\t\tfont-size: 12px;\n\t\tcolor: inherit;\n\t}\n\n\t.tool-icon {\n\t\tflex-shrink: 0;\n\t\tcolor: #78716c;\n\t\tfont-size: 15px;\n\t}\n\t.tool-status {\n\t\tflex-shrink: 0;\n\t\tfont-size: 14px;\n\t}\n\t.tool-open {\n\t\tflex-shrink: 0;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 24px;\n\t\theight: 24px;\n\t\tmargin: -4px 0;\n\t\tborder-radius: 6px;\n\t\tcolor: #78716c;\n\t\tfont-size: 14px;\n\t}\n\t.tool-open:hover {\n\t\tbackground: #262626;\n\t\tcolor: #e7e5e4;\n\t}\n\t.tool-status.ok {\n\t\tcolor: #4d7c5f;\n\t}\n\t.tool-status.fail {\n\t\tcolor: #f87171;\n\t}\n\t.tool-status.running {\n\t\tcolor: #d97706;\n\t}\n\t.tool-card.error {\n\t\tborder-color: rgba(127, 29, 29, 0.6);\n\t}\n\t/* A folded run opens in place, without a card of its own: its rows hang off\n\t a thin rule under the summary, so a call opened inside it still reads as\n\t the one card on the screen. */\n\t.tool-group[open] {\n\t\tborder-color: transparent;\n\t\tbackground: transparent;\n\t}\n\t.tool-group[open] > summary {\n\t\tpadding: 2px 8px;\n\t\tborder-bottom: none;\n\t\tborder-radius: 7px;\n\t}\n\t.group-rows {\n\t\tmargin: 2px 0 6px 15px;\n\t\tpadding-left: 8px;\n\t\tborder-left: 1px solid #292524;\n\t}\n\t.group-failed {\n\t\tflex-shrink: 0;\n\t\tfont-size: 11.5px;\n\t\tcolor: #f87171;\n\t}\n\t.spin {\n\t\tanimation: spin 1s linear infinite;\n\t}\n\t@keyframes spin {\n\t\tto {\n\t\t\ttransform: rotate(360deg);\n\t\t}\n\t}\n\n\t.tool-detail {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: 1fr;\n\t\tgap: 8px;\n\t\tpadding: 8px 10px 10px;\n\t}\n\t/* Input and result share the row when there is room — the card stays short. */\n\t@container (min-width: 700px) {\n\t\t.tool-detail.two-col {\n\t\t\tgrid-template-columns: minmax(0, 5fr) minmax(0, 7fr);\n\t\t}\n\t}\n\t.pane {\n\t\tmin-width: 0;\n\t\tbackground: #14110e;\n\t\tborder: 1px solid #221e1a;\n\t\tborder-radius: 6px;\n\t\tpadding: 6px 9px 8px;\n\t}\n\t.pane.result.ok {\n\t\tborder-color: #1f2b22;\n\t\tbackground: #10140f;\n\t}\n\t.pane.result.fail {\n\t\tborder-color: #3d1d1d;\n\t\tbackground: #171010;\n\t}\n\t.pane-head {\n\t\tfont-size: 9.5px;\n\t\tfont-weight: 700;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.1em;\n\t\tcolor: #6b6560;\n\t\tmargin-bottom: 5px;\n\t}\n\t.pane.result.ok .pane-head {\n\t\tcolor: #5f8a6e;\n\t}\n\t.pane.result.fail .pane-head {\n\t\tcolor: #d16b6b;\n\t}\n\t.result-image {\n\t\tdisplay: block;\n\t\tmargin-bottom: 6px;\n\t}\n\t.result-image img {\n\t\tdisplay: block;\n\t\tmax-width: 100%;\n\t\tmax-height: 320px;\n\t\tborder: 1px solid #221e1a;\n\t\tborder-radius: 4px;\n\t}\n\t.pane pre {\n\t\tfont-family: var(--mono);\n\t\tfont-size: 11.5px;\n\t\tline-height: 1.5;\n\t\toverflow-x: auto;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tmax-height: 260px;\n\t\toverflow-y: auto;\n\t\tmargin: 0;\n\t}\n\t.diff-file {\n\t\tmargin-left: 8px;\n\t\ttext-transform: none;\n\t\tletter-spacing: 0;\n\t\tfont-size: 11px;\n\t\tfont-weight: 400;\n\t\tcolor: #a8a29e;\n\t\tfont-family: var(--mono);\n\t}\n\t.diff-hunk {\n\t\tcolor: #7d96b8;\n\t}\n\t.diff-add {\n\t\tcolor: #b7e0ae;\n\t\tbackground: rgba(46, 160, 67, 0.14);\n\t\tdisplay: inline-block;\n\t\twidth: 100%;\n\t}\n\t.diff-del {\n\t\tcolor: #f0b0aa;\n\t\tbackground: rgba(248, 81, 73, 0.13);\n\t\tdisplay: inline-block;\n\t\twidth: 100%;\n\t}\n\t.diff-ctx {\n\t\tcolor: #7d7871;\n\t}\n\n\t.cmd {\n\t\tcolor: #e7e5e4;\n\t}\n\t.cmd-glyph {\n\t\tcolor: #d97706;\n\t\tfont-weight: 700;\n\t\tuser-select: none;\n\t}\n\t.kv {\n\t\tdisplay: flex;\n\t\tgap: 8px;\n\t\talign-items: baseline;\n\t\tfont-size: 11.5px;\n\t\tmargin-top: 4px;\n\t\tmin-width: 0;\n\t}\n\t.kv-long {\n\t\tmargin-top: 6px;\n\t}\n\t.k {\n\t\tflex-shrink: 0;\n\t\tfont-family: var(--mono);\n\t\tfont-size: 10.5px;\n\t\tcolor: #6b6560;\n\t}\n\t.kv-long .k {\n\t\tdisplay: block;\n\t\tmargin-bottom: 3px;\n\t}\n\t.v {\n\t\tfont-family: var(--mono);\n\t\tcolor: #c7c2bd;\n\t\toverflow-wrap: anywhere;\n\t\tmin-width: 0;\n\t}\n\n\t/* --- A grilling round: questions as a form. Amber while it waits on you,\n\t the colour every surface keeps for \"a person is needed\"; the numbers sit\n\t in a gutter of their own because the round is read in order. --- */\n\t.grill {\n\t\tmargin: 12px 0 14px;\n\t\tborder: 1px solid #2a2a2c;\n\t\tborder-radius: 10px;\n\t\tbackground: #161514;\n\t}\n\t.grill.live {\n\t\tborder-color: #5a4310;\n\t\tborder-left: 3px solid #f59e0b;\n\t\tbackground: #1a1712;\n\t}\n\t.gq {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: 34px 1fr;\n\t\tpadding: 12px 14px 12px 0;\n\t}\n\t.gq + .gq {\n\t\tborder-top: 1px solid #262320;\n\t}\n\t.gq.skipped .gq-main {\n\t\topacity: 0.55;\n\t}\n\t.gq-n {\n\t\tfont-family: var(--mono);\n\t\tfont-size: 12px;\n\t\t/* The title's line box, so the number sits on the title's baseline. */\n\t\tline-height: calc(14.5px * 1.65);\n\t\tcolor: #78716c;\n\t\ttext-align: right;\n\t\tpadding-right: 10px;\n\t}\n\t.live .gq-n {\n\t\tcolor: #fbbf24;\n\t}\n\t.gq-main {\n\t\tmin-width: 0;\n\t}\n\t.gq-title {\n\t\tmargin: 0 0 2px;\n\t\tfont-weight: 600;\n\t\tcolor: #f5f5f4;\n\t}\n\t.gq-body {\n\t\tcolor: #d6d3d1;\n\t}\n\t.gq-rec {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tgap: 8px;\n\t\twidth: 100%;\n\t\tmargin-top: 9px;\n\t\tpadding: 8px 10px;\n\t\tborder: 1px dashed #44403c;\n\t\tborder-radius: 8px;\n\t\tbackground: transparent;\n\t\tcolor: #a8a29e;\n\t\tfont: inherit;\n\t\tfont-size: 13.5px;\n\t\tline-height: 1.55;\n\t\ttext-align: left;\n\t}\n\tbutton.gq-rec {\n\t\tcursor: pointer;\n\t}\n\tbutton.gq-rec:hover {\n\t\tborder-color: #78716c;\n\t\tcolor: #d6d3d1;\n\t}\n\t.gq-rec.on {\n\t\tborder-style: solid;\n\t\tborder-color: #a16207;\n\t\tbackground: #2a2112;\n\t\tcolor: #fde68a;\n\t}\n\t.gq-rec iconify-icon {\n\t\tflex: none;\n\t\tfont-size: 16px;\n\t\tmargin-top: 2px;\n\t}\n\t.gq-rec.on iconify-icon {\n\t\tcolor: #fbbf24;\n\t}\n\t.gq-rec.past {\n\t\tborder-style: solid;\n\t\tborder-color: #292524;\n\t\tcolor: #a8a29e;\n\t}\n\t.gq-rec .markdown {\n\t\tmin-width: 0;\n\t}\n\t.gq-own {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tgap: 6px;\n\t\tmargin-top: 6px;\n\t}\n\t.gq-own textarea {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tmax-height: 160px;\n\t\tresize: none;\n\t\tpadding: 6px 10px;\n\t\tborder: 1px solid #292524;\n\t\tborder-radius: 8px;\n\t\tbackground: #121110;\n\t\tcolor: #e7e5e4;\n\t\tfont: inherit;\n\t\tfont-size: 13.5px;\n\t\tline-height: 1.5;\n\t\toutline: none;\n\t}\n\t.gq-own textarea::placeholder {\n\t\tcolor: #57534e;\n\t}\n\t.gq-own textarea:focus {\n\t\tborder-color: #78716c;\n\t}\n\t.gq-own textarea.filled {\n\t\tborder-color: #a16207;\n\t}\n\t.gq-skip {\n\t\tflex: none;\n\t\theight: 32px;\n\t\tpadding: 0 10px;\n\t\tborder: 1px solid transparent;\n\t\tborder-radius: 8px;\n\t\tbackground: transparent;\n\t\tcolor: #78716c;\n\t\tfont-size: 12px;\n\t\tcursor: pointer;\n\t}\n\t.gq-skip:hover,\n\t.gq-skip.on {\n\t\tborder-color: #292524;\n\t\tcolor: #d6d3d1;\n\t}\n\t.grill-foot {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 10px;\n\t\tpadding: 10px 14px 12px 34px;\n\t\tborder-top: 1px solid #262320;\n\t}\n\t.grill-tally {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tfont-family: var(--mono);\n\t\tfont-size: 11.5px;\n\t\tcolor: #a8a29e;\n\t}\n\t.grill-send {\n\t\tflex: none;\n\t\theight: 34px;\n\t\tpadding: 0 16px;\n\t\tborder: 0;\n\t\tborder-radius: 8px;\n\t\tbackground: #f59e0b;\n\t\tcolor: #1c1307;\n\t\tfont-size: 13px;\n\t\tfont-weight: 600;\n\t\tcursor: pointer;\n\t}\n\t.grill-send:hover:not(:disabled) {\n\t\tbackground: #fbbf24;\n\t}\n\t.grill-send:disabled {\n\t\topacity: 0.45;\n\t\tcursor: default;\n\t}\n\t.gq-rec:focus-visible,\n\t.gq-skip:focus-visible,\n\t.grill-send:focus-visible {\n\t\toutline: 2px solid #fbbf24;\n\t\toutline-offset: 2px;\n\t}\n\t@media (pointer: coarse) {\n\t\t.gq-skip,\n\t\t.grill-send {\n\t\t\theight: 40px;\n\t\t}\n\t}\n\n\t/* --- AskUserQuestion, once answered: a log line that opens to the\n\t choices. The open dialog is DialogCard's. --- */\n\t.ask-header-chip {\n\t\tdisplay: inline-block;\n\t\tfont-size: 10px;\n\t\tfont-weight: 700;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.08em;\n\t\tcolor: #a8a29e;\n\t\tbackground: #262220;\n\t\tborder-radius: 4px;\n\t\tpadding: 1px 7px;\n\t\tmargin-bottom: 4px;\n\t}\n\t.ask-question {\n\t\tfont-weight: 500;\n\t\tcolor: #d6d3d1;\n\t\tmargin: 4px 0 6px;\n\t}\n\t/* Answered question: review layout inside the collapsed row */\n\t.ask-detail {\n\t\tpadding: 8px 12px 10px;\n\t}\n\t.ask-q-review + .ask-q-review {\n\t\tmargin-top: 10px;\n\t\tpadding-top: 8px;\n\t\tborder-top: 1px solid #262220;\n\t}\n\t.ask-opt-review {\n\t\tfont-size: 12.5px;\n\t\tcolor: #78716c;\n\t\tpadding: 2px 8px;\n\t\tborder-left: 2px solid transparent;\n\t}\n\t.ask-opt-review.chosen {\n\t\tcolor: #e7e5e4;\n\t\tborder-left-color: #4d7c5f;\n\t\tbackground: #161a16;\n\t\tborder-radius: 3px;\n\t}\n\n\t/* --- Subagent Task card: the one row that carries hierarchy. Closed, it\n\t reports what its agent is doing right now; open, it becomes that agent's\n\t own activity log and final report. --- */\n\t.tool-card.agent[open] {\n\t\tborder-color: #33302a;\n\t}\n\t.agent-line {\n\t\tdisplay: flex;\n\t\talign-items: baseline;\n\t\tgap: 8px;\n\t\tmin-width: 0;\n\t}\n\t.agent-name {\n\t\tmin-width: 0;\n\t\tmax-width: 60%;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\tfont-weight: 600;\n\t\tcolor: #d6d3d1;\n\t}\n\t.agent-type {\n\t\tflex-shrink: 0;\n\t\tfont-size: 9.5px;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.08em;\n\t\tcolor: #9b8fd4;\n\t\tbackground: #221f2e;\n\t\tborder-radius: 4px;\n\t\tpadding: 1px 6px;\n\t}\n\t.agent-doing,\n\t.agent-count {\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\tfont-size: 11.5px;\n\t\tcolor: #7d7871;\n\t}\n\t.agent-doing::before {\n\t\tcontent: '● ';\n\t\tcolor: #34d399;\n\t}\n\n\t.agent-detail {\n\t\tpadding: 8px 12px 10px;\n\t}\n\t.agent-meta {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tgap: 5px;\n\t\tmargin-bottom: 8px;\n\t}\n\t.agent-chip {\n\t\tfont-size: 10px;\n\t\tcolor: #a8a29e;\n\t\tbackground: #232019;\n\t\tborder-radius: 4px;\n\t\tpadding: 1px 7px;\n\t}\n\t.agent-chip.live {\n\t\tcolor: #6ee7b7;\n\t\tbackground: #14251d;\n\t}\n\t.agent-activity {\n\t\tlist-style: none;\n\t\tmargin: 0;\n\t\tpadding: 0 0 0 11px;\n\t\tborder-left: 2px solid #2b2622;\n\t\t/* Agents reach 150+ calls; scroll inside the card instead of growing it. */\n\t\tmax-height: 260px;\n\t\toverflow-y: auto;\n\t}\n\t.agent-trimmed {\n\t\tfont-size: 10.5px;\n\t\tcolor: #6b6560;\n\t\tmargin-bottom: 3px;\n\t}\n\t.agent-activity li {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 7px;\n\t\tpadding: 1px 0;\n\t\tfont-size: 11.5px;\n\t\tcolor: #8a837c;\n\t\tmin-width: 0;\n\t}\n\t.agent-activity li span {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t.agent-activity li.pending {\n\t\tcolor: #d6d3d1;\n\t}\n\t.agent-activity li.failed {\n\t\tcolor: #f0b0aa;\n\t}\n\t.agent-report {\n\t\tmargin-top: 10px;\n\t\tpadding-top: 8px;\n\t\tborder-top: 1px solid #262220;\n\t\tfont-size: 13.5px;\n\t}\n\n\t/* --- Compaction boundary: a fold line across the conversation --- */\n\t.compact {\n\t\tmargin: 22px 0 14px;\n\t\tborder: 1px dashed #3a3a42;\n\t\tborder-radius: 8px;\n\t\tbackground: #121216;\n\t\tfont-size: 12.5px;\n\t}\n\t.compact summary {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 9px;\n\t\tpadding: 8px 12px;\n\t\tlist-style: none;\n\t\tcursor: pointer;\n\t\tcolor: #a8a29e;\n\t}\n\t.compact summary::-webkit-details-marker {\n\t\tdisplay: none;\n\t}\n\t.compact summary iconify-icon {\n\t\tfont-size: 15px;\n\t\tcolor: #a78bfa;\n\t}\n\t.compact-title {\n\t\tcolor: #c4b5fd;\n\t}\n\t.compact-tokens {\n\t\tfont-family: var(--mono);\n\t\tfont-size: 11px;\n\t\tcolor: #78716c;\n\t}\n\t.compact summary .time {\n\t\tmargin-left: auto;\n\t}\n\t.compact-summary {\n\t\tpadding: 4px 14px 12px;\n\t\tborder-top: 1px dashed #3a3a42;\n\t\tfont-size: 13px;\n\t\tline-height: 1.55;\n\t\tcolor: #a8a29e;\n\t}\n\t.compact-summary.muted {\n\t\tcolor: #57534e;\n\t}\n\n\t/* --- Live status row --- */\n\t.live-row {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 9px;\n\t\tmargin: 8px 0 4px 12px;\n\t\tfont-size: 12.5px;\n\t\tcolor: #a8a29e;\n\t}\n\t.live-verb {\n\t\tflex: none;\n\t\tcolor: #d6d3d1;\n\t}\n\t.live-chips {\n\t\tdisplay: flex;\n\t\tgap: 5px;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t}\n\t.live-text {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.spin,\n\t\t.empty.starting iconify-icon {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.thinking summary {\n\t\tcolor: #6b6560;\n\t\tfont-style: italic;\n\t}\n\t.thinking-text {\n\t\tpadding: 8px 12px;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tcolor: #78716c;\n\t\tfont-size: 13px;\n\t\tfont-style: italic;\n\t}\n</style>\n","import { browser } from '$app/environment';\nimport { ReliableWebSocket } from './websocket-base.svelte';\nimport type { ContextUsage } from '../../../../src/transcript/context.js';\nimport type { TranscriptEntry } from '../../../../src/transcript/parser.js';\nimport type { SubagentPayload } from '../../../../src/server/ws-handlers.js';\n\nexport type { SubagentPayload };\n\ninterface SnapshotMsg {\n\ttype: 'snapshot';\n\tentries: TranscriptEntry[];\n\tfirstIndex: number;\n\tsubagents: SubagentPayload[];\n\tcontext: ContextUsage | null;\n\tmodel?: string | null;\n\tavailable: boolean;\n}\ninterface HistoryMsg {\n\ttype: 'history';\n\tentries: TranscriptEntry[];\n\tfirstIndex: number;\n}\ninterface EntriesMsg {\n\ttype: 'entries';\n\tentries: TranscriptEntry[];\n\tindices: number[];\n}\ninterface SubagentsMsg {\n\ttype: 'subagents';\n\tsubagents: SubagentPayload[];\n}\ninterface ContextMsg {\n\ttype: 'context';\n\tcontext: ContextUsage;\n}\ninterface ModelMsg {\n\ttype: 'model';\n\tmodel: string;\n}\ntype TranscriptMsg = SnapshotMsg | HistoryMsg | EntriesMsg | SubagentsMsg | ContextMsg | ModelMsg;\n\n/** Entries per \"load earlier\" request. */\nconst HISTORY_PAGE = 200;\n\n/**\n * Transcript view model: an ordered list of entries upserted by id.\n * The server sends a full snapshot on attach and per-entry deltas afterwards\n * (an updated entry — e.g. a tool call receiving its result — keeps its\n * position; a new one is appended).\n */\nexport class TranscriptStore extends ReliableWebSocket {\n\tentries = $state<TranscriptEntry[]>([]);\n\t/** All subagents, keyed by their own id — some have no parent Task id. */\n\tsubagents = $state<Record<string, SubagentPayload>>({});\n\t/** The subset that can be attached to a Task card, keyed by that card's id. */\n\tsubagentsByTask: Record<string, SubagentPayload> = $derived(\n\t\tObject.fromEntries(\n\t\t\tObject.values(this.subagents)\n\t\t\t\t.filter((sub) => sub.toolUseId)\n\t\t\t\t.map((sub) => [sub.toolUseId as string, sub])\n\t\t)\n\t);\n\t/** Context window in use as of the last API response, null before one. */\n\tcontext = $state<ContextUsage | null>(null);\n\t/** The model on the latest assistant line, as the API names it. */\n\tmodel = $state<string | null>(null);\n\t/** False until the session's JSONL file has been found and read. */\n\tavailable = $state(false);\n\t/** Entries appended since attach (page diffs it for the \"new below\" pill). */\n\tappended = $state(0);\n\t/**\n\t * Position of `entries[0]` in the session's whole transcript: the server\n\t * sends only the tail, so this is how many older entries exist. Zero once\n\t * the reader has pulled the whole thing back.\n\t */\n\tfirstIndex = $state(0);\n\t/** A history request is in flight (the button waits rather than stacking). */\n\tloadingEarlier = $state(false);\n\t/** Resolved when the slice a `loadEarlier()` caller asked for has landed. */\n\tprivate pendingEarlier: (() => void) | null = null;\n\n\tprivate indexById = new Map<string, number>();\n\tprivate sessionId: string | null = null;\n\t/** Set when this store reads one of the session's subagents instead of the session. */\n\tprivate agentId: string | null = null;\n\n\tprotected getWsUrl(): string {\n\t\tconst protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n\t\tconst session = encodeURIComponent(this.sessionId!);\n\t\tconst agent = this.agentId ? `/agents/${encodeURIComponent(this.agentId)}` : '';\n\t\treturn `${protocol}//${window.location.host}/api/sessions/${session}${agent}/transcript/stream`;\n\t}\n\n\tprotected getLogPrefix(): string {\n\t\treturn '[transcript]';\n\t}\n\n\tprotected shouldReconnect(): boolean {\n\t\treturn this.sessionId !== null;\n\t}\n\n\tprotected handleMessage(event: MessageEvent): void {\n\t\tlet data: TranscriptMsg;\n\t\ttry {\n\t\t\tdata = JSON.parse(event.data);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tswitch (data.type) {\n\t\t\tcase 'snapshot':\n\t\t\t\tthis.applySnapshot(data);\n\t\t\t\tbreak;\n\t\t\tcase 'history':\n\t\t\t\tthis.applyHistory(data);\n\t\t\t\tbreak;\n\t\t\tcase 'entries':\n\t\t\t\tthis.applyEntries(data);\n\t\t\t\tbreak;\n\t\t\tcase 'subagents':\n\t\t\t\tthis.applySubagents(data.subagents);\n\t\t\t\tbreak;\n\t\t\tcase 'context':\n\t\t\t\tthis.context = data.context;\n\t\t\t\tbreak;\n\t\t\tcase 'model':\n\t\t\t\tthis.model = data.model;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate applySnapshot(msg: SnapshotMsg): void {\n\t\tthis.entries = msg.entries;\n\t\tthis.available = msg.available;\n\t\tthis.firstIndex = msg.firstIndex;\n\t\tthis.settleEarlier();\n\t\tthis.context = msg.context ?? null;\n\t\tthis.model = msg.model ?? null;\n\t\tthis.reindex();\n\t\tthis.subagents = {};\n\t\tthis.applySubagents(msg.subagents ?? []);\n\t}\n\n\t/** An older slice, prepended in front of what is already held. */\n\tprivate applyHistory(msg: HistoryMsg): void {\n\t\t// A snapshot may have overtaken the request; anything already held wins.\n\t\tconst older = msg.entries.filter((entry) => !this.indexById.has(entry.id));\n\t\tif (older.length > 0) {\n\t\t\tthis.entries = [...older, ...this.entries];\n\t\t\tthis.firstIndex = msg.firstIndex;\n\t\t\tthis.reindex();\n\t\t}\n\t\tthis.settleEarlier();\n\t}\n\n\t/** Ends the wait a `loadEarlier()` caller is in, whatever answered it. */\n\tprivate settleEarlier(): void {\n\t\tthis.loadingEarlier = false;\n\t\tthis.pendingEarlier?.();\n\t\tthis.pendingEarlier = null;\n\t}\n\n\tprivate reindex(): void {\n\t\tthis.indexById = new Map(this.entries.map((entry, i) => [entry.id, i]));\n\t}\n\n\t/**\n\t * Ask the server for the slice before the oldest entry held. Resolves once\n\t * those entries are in `entries`, so a caller holding the reader's scroll\n\t * position knows when to restore it. Resolves immediately when there is\n\t * nothing older or a request is already out.\n\t */\n\tloadEarlier(): Promise<void> {\n\t\tif (this.firstIndex <= 0 || this.loadingEarlier) return Promise.resolve();\n\t\tconst sent = this.send(\n\t\t\tJSON.stringify({\n\t\t\t\ttype: 'history_request',\n\t\t\t\tbefore: this.firstIndex,\n\t\t\t\tcount: HISTORY_PAGE\n\t\t\t})\n\t\t);\n\t\tif (!sent) return Promise.resolve();\n\t\tthis.loadingEarlier = true;\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.pendingEarlier = resolve;\n\t\t});\n\t}\n\n\t/**\n\t * Ask for everything an agent ran and reported. Cards arrive lean — the\n\t * tail of the activity, no report — and this is what opening one sends.\n\t */\n\tloadSubagent(agentId: string): void {\n\t\tconst held = this.subagents[agentId];\n\t\tif (!held || held.full) return;\n\t\tthis.send(JSON.stringify({ type: 'subagent_request', agentId }));\n\t}\n\n\t/**\n\t * Subagents arrive lean unless their card was opened. A lean update for an\n\t * agent already held in full keeps what is held and appends the new tail,\n\t * so an open card does not lose its list to the next live update.\n\t */\n\tprivate applySubagents(subagents: SubagentPayload[]): void {\n\t\tfor (const sub of subagents) {\n\t\t\tconst held = this.subagents[sub.agentId];\n\t\t\tif (held?.full && !sub.full) {\n\t\t\t\tconst seen = new Set(sub.activity.map((a) => a.id));\n\t\t\t\tconst kept = held.activity.filter((a) => !seen.has(a.id));\n\t\t\t\tthis.subagents[sub.agentId] = {\n\t\t\t\t\t...sub,\n\t\t\t\t\tactivity: [...kept, ...sub.activity],\n\t\t\t\t\ttrimmed: Math.max(0, sub.trimmed - kept.length),\n\t\t\t\t\treport: sub.report ?? held.report,\n\t\t\t\t\tfull: true\n\t\t\t\t};\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.subagents[sub.agentId] = sub;\n\t\t}\n\t}\n\n\tprivate applyEntries(msg: EntriesMsg): void {\n\t\tthis.available = true;\n\t\tfor (const [i, entry] of msg.entries.entries()) {\n\t\t\tconst index = this.indexById.get(entry.id);\n\t\t\tif (index !== undefined) {\n\t\t\t\tthis.entries[index] = entry;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// An update to an entry older than the tail this client holds: it\n\t\t\t// belongs in the gap above, and arrives with the history slice.\n\t\t\tif (msg.indices[i] < this.firstIndex) continue;\n\t\t\tthis.indexById.set(entry.id, this.entries.length);\n\t\t\tthis.entries.push(entry);\n\t\t\tthis.appended++;\n\t\t}\n\t}\n\n\t/**\n\t * Single entry point: pass a claude-mux session id to view its transcript,\n\t * or null to detach. Mirrors terminalStore.setTarget's lifecycle contract.\n\t * With `agentId`, the store holds that subagent's transcript instead, and\n\t * `subagents` holds that one agent.\n\t */\n\tsetSession(sessionId: string | null | undefined, agentId: string | null = null): void {\n\t\tif (!browser) return;\n\t\tconst next = sessionId ?? null;\n\t\tconst nextAgent = next ? agentId : null;\n\n\t\tif (this.sessionId === next && this.agentId === nextAgent) {\n\t\t\tif (next === null) return;\n\t\t\tif (this.ws) return;\n\t\t\tthis.doConnect();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.ws) {\n\t\t\tthis.sessionId = null; // suppress reconnect in doDisconnect\n\t\t\tthis.doDisconnect();\n\t\t}\n\t\tthis.entries = [];\n\t\tthis.subagents = {};\n\t\tthis.context = null;\n\t\tthis.available = false;\n\t\tthis.appended = 0;\n\t\tthis.firstIndex = 0;\n\t\tthis.settleEarlier();\n\t\tthis.resetReceived();\n\t\tthis.indexById = new Map();\n\t\tthis.sessionId = next;\n\t\tthis.agentId = nextAgent;\n\n\t\tif (next) this.doConnect();\n\t}\n}\n\nexport const transcriptStore = new TranscriptStore();\n"],"names":["keysForAnswer","picks","options","sorted","i","a","b","keysForOptionPick","keys","cursor","pick","step","from","to","count","move","keysForOptionMove","start","steps","liveRows","$$anchor","qi","$.noop","div","root_5","$.get","rows","row","preview","$.derived","previewFor","button","root_4","node","$.child","span","root","$.template_effect","$.set_text","text_1","iconify_icon","root_1","$.set_custom_element_data","classes_1","$$render","consequent","alternate","span_1","$.sibling","span_2","text_2","$.only_child","node_1","span_3","root_2","text_3","$.append","consequent_1","pre","root_3","consequent_2","$.reset","$$node","$$action_arg","longPress","highlight","classes","closed","$.delegated","freeText","placeholder","label","form","root_7","node_3","Input","freeKeydown","inputEl","$$value","draft","sending","Button","node_4","iconify_icon_1","$.first_child","fragment","noting","text_5","e","sendFree","paneFreeText","answerLabel","notingOn","textRow","consequent_3","keysBar","$$props","note","p","root_9","span_4","text_6","node_7","button_1","fragment_4","iconify_icon_2","button_2","iconify_icon_3","d","ARROW_NOTE","div_1","node_6","button_3","iconify_icon_4","button_4","iconify_icon_5","node_8","button_5","root_10","iconify_icon_6","done","reviewing","consequent_5","$.each","node_9","extraKeys","extra","button_6","root_11","kbd","text_7","text_8","button_7","node_10","p_1","root_12","text_9","consequent_6","ask","$.prop","permission","norm","s","o","liveIndex","asked","byText","q","first","sentCount","$.state","blind","current","hasSubmitTab","atSubmit","typing","$.user_effect","text","$.set","n","advanceBlind","opts","multi","wasNoting","paneTyping","OPEN_TIMEOUT_MS","until","r","walkTo","walk","pickBlind","oi","next","confirmBlind","finish","submit","KEY_SEGMENT","out","segment","m","l","reveal","el","isPermission","title","section","root_26","header","iconify_icon_7","span_5","text_10","node_11","iconify_icon_8","$.set_class","consequent_7","sent","active","div_2","root_18","span_6","text_11","p_2","text_12","node_14","div_3","root_14","node_16","div_4","fragment_7","opt","button_8","root_16","node_17","iconify_icon_9","$0","classes_6","span_7","text_13","consequent_10","alternate_1","span_8","span_9","text_14","node_18","span_10","text_15","consequent_11","pre_1","text_16","consequent_12","classes_5","node_20","consequent_13","alternate_2","consequent_14","consequent_8","consequent_9","alternate_3","classes_3","div_5","root_20","node_23","p_3","root_19","text_18","consequent_15","node_24","consequent_16","consequent_17","footer","root_22","span_11","node_27","text_20","consequent_18","alternate_4","node_28","node_29","iconify_icon_10","fragment_13","consequent_19","consequent_20","div_6","fragment_15","node_31","p_4","text_22","consequent_22","node_32","node_34","p_5","root_25","consequent_23","consequent_24","$.action","classes_2","$.set_attribute","parseMcpToolName","name","match","MCP_FAMILIES","toolIcon","mcp","pattern","arg","fragment_1","QUESTION","RECOMMENDED","firstParagraph","lines","blank","join","parseGrillRound","starts","line","intro","questions","outro","end","rest","recAt","bodyLines","recommended","recLines","para","after","composeGrillReply","round","answers","answer","asRecord","value","readString","STANDALONE_TOOLS","foldable","entry","plural","one","many","times","SHELL","READ","EDIT","WRITE","SEARCH","LIST","FETCH","WEB_SEARCH","COMPOUND","SHELL_VERBS","shellCategory","input","command","verb","args","category","TOOL_CATEGORIES","categoryCache","categorize","tool","categorizeUncached","summarizeToolRun","tools","counts","seen","groupToolRuns","entries","items","run","flush","body","t","open","totals","sumCounts","root_6","node_2","ul","f","letter","statusLetter","li","bdi","$1","displayPath","grill","id","live","liveGrillId","grillSent","ready","sessionState","$.html","renderMarkdown","answerOf","setAnswer","textarea","$.remove_textarea_child","autosize","$.set_value","classes_4","ownText","typeAnswer","consequent_4","text_4","grillSending","tally","sendRound","footer_1","currentAction","activity","delivered","suggestion","paneChoice","subagents","olderCount","loadingEarlier","turnChanges","now","startedAt","ticking","CHIP","elapsedText","formatSpinnerElapsed","turnRunning","turnCards","placeTurnChanges","latestCard","cardOpen","$.proxy","opened","roundCache","grillRound","grillAnswers","agreed","own","parts","fit","canAnswer","liveAskId","dialogKey","seenLive","submitted","dialogClosed","answeredAsks","lastLiveAsk","footDialog","deliveredVia","turn","formatTime","ts","inputPanes","inputJson","toolName","isShell","cmd","short","long","key","raw","div_7","root_69","turnGlyph","dictated","via","how","div_8","div_9","node_13","div_10","root_13","div_11","root_15","node_12","node_15","div_12","root_17","div_13","div_14","div_15","node_19","div_16","div_17","span_12","text_17","span_13","details","root_24","summary","span_14","text_19","span_15","root_21","span_16","text_21","div_18","root_23","details_1","root_28","summary_1","span_17","div_19","div_20","root_27","span_18","text_24","text_25","div_21","text_26","classes_7","div_22","text_27","$2","DialogCard","div_23","span_19","text_28","span_20","text_29","consequent_25","alternate_5","div_24","details_2","root_29","summary_2","div_25","text_30","showResult","sub","doing","details_3","root_55","summary_3","iconify_icon_11","node_26","span_21","fragment_10","span_22","text_31","span_23","root_30","text_32","consequent_30","span_24","root_31","ToolLabel","span_25","root_32","text_33","consequent_32","node_30","a_1","root_33","iconify_icon_12","opens","toolFileTarget","span_26","fragment_11","a_2","root_35","iconify_icon_13","consequent_35","consequent_34","alternate_6","iconify_icon_14","iconify_icon_15","consequent_36","alternate_7","div_26","root_42","div_27","node_35","span_27","root_37","text_34","consequent_37","span_28","text_35","node_36","span_29","root_38","consequent_38","node_37","div_28","root_39","text_36","consequent_39","ol","act","li_1","root_40","iconify_icon_16","span_30","node_38","classes_9","div_29","root_41","div_30","consequent_40","div_31","root_54","node_40","section_1","root_46","span_31","root_43","text_37","consequent_42","hunk","span_32","fragment_12","text_38","text_39","$.index","dl","span_33","text_40","text_41","$.clsx","section_2","root_50","node_43","root_47","text_42","consequent_44","field","div_32","root_48","span_34","text_43","span_35","text_44","div_33","root_49","span_36","text_45","pre_2","text_46","consequent_43","consequent_45","section_3","root_53","header_1","text_47","node_47","path","src","a_3","root_51","img","pre_3","root_52","text_48","consequent_46","classes_11","consequent_47","classes_10","consequent_41","alternate_8","classes_8","consequent_21","consequent_26","d_2","consequent_27","consequent_28","consequent_48","node_49","div_34","root_56","iconify_icon_17","$.set_style","div_35","root_57","iconify_icon_18","div_36","root_58","iconify_icon_19","consequent_50","consequent_51","consequent_49","div_37","root_59","iconify_icon_20","text_49","span_37","text_50","consequent_52","node_51","item","changed","details_4","root_61","summary_4","iconify_icon_21","span_38","text_51","node_53","span_39","text_52","iconify_icon_22","iconify_icon_23","consequent_53","alternate_9","div_38","$.event","consequent_54","alternate_10","v","TurnChangesCard","file","consequent_55","consequent_56","div_39","root_66","node_57","SessionStateIndicator","span_40","fragment_20","text_53","span_41","node_59","Badge","span_42","root_63","text_54","consequent_57","consequent_58","text_56","consequent_59","text_57","consequent_60","span_43","root_65","text_58","consequent_61","alternate_11","state","div_40","root_67","node_63","span_44","node_64","consequent_64","consequent_65","alternate_12","sessionStateVisual","consequent_62","consequent_66","root_68","div_41","text_63","span_45","iconify_icon_24","$$args","consequent_67","HISTORY_PAGE","TranscriptStore","ReliableWebSocket","#subagentsByTask","protocol","session","agent","event","data","msg","older","resolve","agentId","held","kept","index","sessionId","nextAgent","transcriptStore"],"mappings":"4iBAcO,SAASA,GACdC,EACAC,EACe,CACf,MAAMC,EAAS,CAAC,GAAG,IAAI,IAAIF,CAAK,CAAC,EAAE,OAAQG,GAAM,OAAO,UAAUA,CAAC,GAAKA,GAAK,CAAC,EAAE,KAAK,CAACC,EAAGC,IAAMD,EAAIC,CAAC,EACpG,GAAIH,EAAO,SAAW,EAAG,OAAO,KAChC,GAAI,CAACD,EAAQ,YACX,OAAIC,EAAO,OAAS,EAAU,KAEvBI,GAAkB,EAAGJ,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAI,CAAC,EAGtD,MAAMK,EAAiB,CAAA,EACvB,IAAIC,EAAS,EACb,UAAWC,KAAQP,EAAQ,CACzB,QAASQ,EAAO,EAAGA,EAAOD,EAAOD,EAAQE,IAAQH,EAAK,KAAK,MAAM,EACjEA,EAAK,KAAK,OAAO,EACjBC,EAASC,CACX,CACA,OAAAF,EAAK,KAAK,OAAO,EACVA,EAAK,KAAK,GAAG,CACtB,CAeO,SAASD,GAAkBK,EAAcC,EAAYC,EAA8B,CACxF,MAAMC,EAAOC,GAAkBJ,EAAMC,EAAIC,CAAK,EAC9C,OAAIC,IAAS,KAAa,KACnBA,EAAO,GAAGA,CAAI,SAAW,OAClC,CAaO,SAASC,GAAkBJ,EAAcC,EAAYC,EAA8B,CACxF,GAAI,CAAC,OAAO,UAAUD,CAAE,GAAKA,EAAK,GAAKA,GAAMC,EAAO,OAAO,KAC3D,MAAMG,EAAQL,EAAO,GAAKA,GAAQE,EAAQ,EAAIF,EACxCM,EAAQL,EAAKI,EACnB,OAAO,MAAM,KAAK,IAAIC,CAAK,CAAC,EAAE,KAAKA,EAAQ,EAAI,OAAS,IAAI,EAAE,KAAK,GAAG,CACxE,y3ECxEA,gBA6SUC,EAAQ,CAAAC,EAACC,EAAUC,KAAA,KAC3BC,EAAGC,GAAA,KAAHD,EAAG,GAAA,IAAAE,EACIC,EAAI,EAAIC,GAAKA,EAAI,EAAC,CAAAP,EAAVO,KAAG,OACTC,GAAOC,EAAA,IAAGC,GAAWT,EAAE,EAAEI,EAAAE,EAAG,EAAC,KAAK,CAAC,EAC1C,IAAAI,GAAAC,GAAA,QAAA,IAAAC,EAAAC,EAAAH,EAAA,iBAUEI,EAAIC,GAAA,MAAJD,EAAI,EAAA,EAAcE,EAAA,IAAAC,EAAAC,EAAAd,EAAAE,EAAG,EAAC,CAAC,CAAA,MAAvBQ,CAAI,aAEJK,EAAQC,GAAA,QAARJ,EAAA,IAAAK,GAAAF,SAGMf,EAAAE,EAAG,EAAC,QAAU,sBAAwB,4BAA4B,CAAA,YAHxEa,EAAQ,EAAA,oBAAA,KAAAG,EAAA,CAAA,GAEElB,EAAAE,EAAG,EAAC,OAAO,CAAA,CAAA,MAFrBa,CAAQ,WAHLf,EAAAE,EAAG,EAAC,UAAY,OAASiB,EAAAC,CAAA,EAAAD,EAAAE,EAAA,EAAA,IAS7B,IAAAC,EAAIC,EAAAf,EAAA,CAAA,EACHgB,EAAIf,EADLa,CAAK,EACJG,EAAAC,EAAAF,EAAI,EAAA,EAAJG,EAAAJ,EAAAC,EAAI,CAAA,aACU,IAAAI,EAAIC,GAAA,EAAJC,EAAAJ,EAAAE,EAAI,EAAA,EAAehB,EAAA,IAAAC,EAAAiB,EAAA9B,EAAAE,EAAG,EAAC,IAAI,CAAA,EAA3B6B,EAAApC,EAAAiC,CAAK,WAAf5B,EAAAE,EAAG,EAAC,MAAIiB,EAAAa,CAAA,gCACCC,EAAGC,GAAA,MAAHD,EAAG,EAAA,cAAkB9B,EAAO,CAAA,CAAA,MAA5B8B,CAAG,aAAZ9B,EAAO,GAAAgB,EAAAgB,CAAA,IAHZC,EAAAd,CAAK,EAlBNc,EAAA9B,EAAA,KAAAA,GAAA,CAAA+B,EAAAC,IAAAC,KAAAF,EAAAC,CAAA,EAAA,KAOe,CAAE,UAAW,IAAA,CAAWE,GAASxC,EAACE,EAAG,CAAA,EAAC,EAAE,aAPvDI,GAAA,EAAA,oBAAA,KAAAmC,EAAA,CAAA,IAGWzC,EAAAE,EAAG,EAAC,QAAQ,CAAA,EAHvBI,GAAA,SAIUoC,GAAM,EAeK7B,EAAAY,EAAAzB,EAAAE,EAAG,EAAC,KAAK,IAnB9ByC,GAAA,QAAArC,GAMS,IAAA,CAAWrB,GAAIe,EAACE,EAAG,CAAA,EAAC,EAN7B6B,EAAApC,EAAAW,EAAA,MAHFR,CAAG,MAAHA,CAAG,GA+BK8C,EAAQ,CAAAjD,EAACkD,EAAmBhD,GAAEiD,EAAajD,KAAA,CACnD,IAAAkD,EAAAC,GAAA,EAAAC,GAAAxC,EAAAsC,CAAA,EAOCG,GAAAD,GAAA,oEAKCJ,EAAW,4BACAC,EAAK,yBACPJ,GAAM,aACLS,OAPX,KAAQ,UAAEC,EAAO,OAAjB,IAAQC,GAAA,IAAED,GAAOC,GAAA,EAAA,GACjB,IAAA,OAAU,UAAEC,EAAK,GAAjB,IAAA,MAAUD,GAAA,IAAEC,GAAKD,GAAA,EAAA,kCAaPX,GAAM,GAAA1C,EAAIuD,EAAO,GAAIvD,EAAAsD,EAAK,EAAC,KAAI,IAAO,EAAE,EALlDE,GAAAC,GAAA,sHAOCC,EAAYC,GAAAC,CAAA,EAAZhD,EAAA,IAAAK,GAAAyC,EAAY,OAAO1D,EAAA6D,EAAM,EAAG,yBAA2B,UAAU,CAAA,EAAjE,IAAAC,EAAAvC,EAAAmC,CAAa,gBACb1D,EAAA6D,EAAM,EAAG,OAAS,MAAM,EAAA,CAAA,iCAzB1BzB,EAAAW,CAAA,cAAAA,EAEWgB,IAAM,CAChBA,GAAE,eAAc,EACXC,GAAQ,CACd,CAAC,EALDjC,EAAApC,EAAAoD,CAAA,GA8BQkB,EAAY,CAAAtE,EAACuE,EAAmBrE,KAAA,iCAE/B+C,EAAQjD,GAAA,IAChBK,EAAA6D,EAAM,EAAG,WAAA7D,EAAWmE,EAAQ,CAAA,GAAK,sBAAqB,IACtDnE,EAAA6D,EAAM,EAAG,OAASK,GAAA,aAHflE,EAAAoE,EAAO,KAAIP,EAAM,IAAA1C,GAAAkD,EAAA,YAQbC,EAAO3E,GAAA,gCACT4E,EAAA,QAAQ,OAAS,CAAA,EAAMC,GAAMA,EAAI,CAAA7E,EAAV6E,IAAI,KAChCC,EAACC,GAAA,EACAC,IADDF,CAAC,EACAG,EAAAlD,EAAAiD,EAAI,EAAA,EAAJE,EAAAtD,EAAAoD,EAAI,CAAA,0BAEHG,EAAMnB,GAAAoB,EAAA,EACLC,EAAYvE,EADbqE,CAAO,EACN7D,GAAA+D,EAAY,OAAA,kBAAA,EADb5C,EAAA0C,CAAO,MAGPG,EAAM1D,EAHNuD,EAAM,CAAA,EAILI,EAAYzE,EADbwE,CAAO,EACNhE,GAAAiE,EAAY,OAAA,mBAAA,EADb9C,EAAA6C,CAAO,EAHPtC,GAAA,QAAAmC,EAAyD,IAAA,CAAWP,EAAA,OAAO,MAAM,EAAC,EAGlF5B,GAAA,QAAAsC,EAA0D,IAAA,CAAWV,EAAA,OAAO,OAAO,EAAC,YAJjFY,GAAA/E,EAAA,IAAAgF,GAAW,KAAKZ,CAAI,CAAC,4BAF1BC,CAAC,YACMD,CAAI,CAAA,MADXC,CAAC,IAYF,IAAAY,EAAG9D,EAAA+D,EAAA,CAAA,EAGFC,GAAM9E,EAHP4E,CAAI,EAIFG,GAAY/E,EADb8E,EAAO,EACNtE,GAAAuE,GAAY,OAAA,gBAAA,EADbpD,EAAAmD,EAAO,MAGPE,GAAMlE,EAHNgE,GAAM,CAAA,EAILG,EAAYjF,EADbgF,EAAO,EACNxE,GAAAyE,EAAY,OAAA,kBAAA,EADbtD,EAAAqD,EAAO,EAAP,IAAAE,EAAApE,EAAAkE,GAAM,CAAA,aAML,IAAAG,EAAMC,GAAA,EACLC,EAAYrF,EADbmF,CAAO,EACN3E,GAAA6E,EAAY,OAAA,eAAA,OADb1D,EAAAwD,CAAO,aAAPA,EAA+CG,EAAI,EAAnDhE,EAAApC,EAAAiG,CAAO,WAHJrB,EAAA,QAAQ,OAAS,CAACvE,EAAAgG,EAAS,GAAA7E,EAAA8E,CAAA,iBAOzBC,GAAAC,EAAA,GAAA,IAAAnG,EAAAoG,EAAS,EAAIC,GAAOA,EAAM,OAAbA,IAAK,CACvB,IAAAC,EAAMC,GAAA,EACLC,EAAG/F,EADJ6F,CAAO,MACNE,EAAG,EAAA,MAAHA,EAAG,EAAA,EAAA,EADJpE,EAAAkE,CAAO,SACDzF,EAAA4F,EAAAzG,EAAAqG,CAAK,EAAC,GAAG,EAAQxF,EAAA6F,EAAA1G,EAAAqG,CAAK,EAAC,KAAK,eADlCC,EAA0C,KAAW/B,EAAA,OAAOvE,EAAAqG,CAAK,EAAC,GAAG,EAAC,EAAtEtE,EAAApC,EAAA2G,CAAO,IAIR,IAAAK,EAAMpF,EAAA4E,EAAA,CAAA,EArBP/D,EAAAiD,CAAI,EAAJ,IAAAuB,EAAArF,EAAA8D,EAAG,CAAA,aAyBe,IAAAwB,EAACC,GAAA,EAADC,EAAArF,EAAAmF,EAAC,EAAA,EAAejG,EAAA,IAAAC,EAAAkG,EAAAxC,EAAA,OAAO,IAAI,CAAA,EAA3BxC,EAAApC,EAAAkH,CAAE,WAAhBtC,EAAA,QAAQ,MAAIpD,EAAA6F,CAAA,IAtBfrE,GAAA,QAAA4C,GAA8E,IAAA,CAAWhB,EAAA,OAAO,IAAI,EAAC,EAGrG5B,GAAA,QAAA8C,GAA8E,IAAA,CAAWlB,EAAA,OAAO,MAAM,EAAC,EAevG5B,GAAA,QAAAgE,EAAqE,IAAA,CAAWpC,EAAA,OAAO,QAAQ,EAAC,UAzYlG,IAEC0C,EAAGC,GAAA3C,EAAA,MAAA,EAAG,IAAI,EACV4C,uBAAa,EAAK,EAClBzE,GAAMwE,GAAA3C,EAAA,SAAA,EAAG,EAAK,EA0Bf,MAAM6C,GAAQC,IAAkCA,GAAK,IAAI,QAAQ,OAAQ,GAAG,EAAE,KAAI,EAAG,YAAW,EAG1FrB,GAAS5F,EAAA,IACdmE,UAAU,MAAQA,SAAO,QAAQ,KAAM+C,GAAMA,EAAE,QAAU,gBAAgB,CAAA,EAIpEC,GAASnH,EAAe,IAAM,CACnC,GAAI,CAAC6G,EAAG,GAAI,CAAC1C,SAAQ,MAAO,GAC5B,GAAEvE,EAAEgG,EAAS,EAAE,OAAOiB,EAAG,EAAC,UAAU,OACpC,MAAMO,EAAQJ,GAAK7C,EAAA,OAAO,QAAQ,EAC5BkD,EAASR,EAAG,EAAC,UAAU,UAC3BS,GAAMF,IAAU,KAAOJ,GAAKM,EAAE,QAAQ,IAAMF,GAASA,EAAM,WAAWJ,GAAKM,EAAE,QAAQ,CAAC,EAAC,EAEzF,GAAID,GAAU,EAAG,OAAOA,EAExB,MAAME,EAAQP,GAAK7C,EAAA,OAAO,QAAQ,CAAC,GAAG,KAAK,EAC3C,OAAO0C,EAAG,EAAC,UAAU,UACnBS,GAAMA,EAAE,QAAQ,OAAS,GAAKC,IAAU,IAAMP,GAAKM,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAWC,EAAM,MAAM,EAAG,EAAE,CAAC,CAAA,CAEvG,CAAC,EAGD,IAAIC,GAAYC,GAAO,CAAC,EACpBrJ,GAAQqJ,MAAoB,IAAI,GAAK,CAAA,EACzC,MAAMC,GAAK1H,EAAA,IAAY6G,KAAO,MAAQ1C,EAAA,QAAU,MAAQ,CAAC7B,IAAM,EAGzDqF,GAAO3H,EAAA,IAAYJ,EAAA8H,EAAK,IAAGF,EAAS,EAAA5H,EAAGuH,EAAS,CAAA,EAGhDS,GAAY5H,EAAA,IACjB6G,EAAG,GAAI,OAASA,EAAG,EAAC,UAAU,OAAS,GAAKA,EAAG,EAAC,UAAU,KAAMS,GAAMA,EAAE,WAAW,EAAC,EAE/EO,GAAQ7H,EAAA,IAAY6G,EAAG,GAAI,MAAQjH,EAAA+H,EAAO,IAAKd,IAAI,UAAU,MAAM,EAIzE,IAAI3D,GAAQuE,GAAO,EAAE,EACjBtE,GAAUsE,GAAO,EAAK,EACtBzE,GAAUyE,GAAgC,IAAI,EAGlD,MAAMzD,GAAOhE,EAAA,IAAYmE,EAAA,QAAQ,QAAQ,KAAM+C,GAAMA,EAAE,IAAI,GAAK,IAAI,EAE9DrH,GAAIG,EAAA,IAAYmE,UAAQ,QAAQ,OAAQ+C,GAAM,CAACA,EAAE,IAAI,GAAK,CAAA,CAAE,EAG5DY,GAAM9H,EAAA,IAAYmE,UAAQ,SAAW,EAAI,EACzCV,GAAMzD,EAAA,IAAYmE,UAAQ,SAAW,EAAI,EAGzCJ,GAAQ/D,EAAA,IACbJ,EAAA6D,EAAM,EAAIU,EAAA,QAAQ,QAAQ,KAAM+C,GAAMA,EAAE,QAAQ,GAAG,OAAS/C,EAAA,QAAQ,UAAY,cAAiB,IAAA,EAGlG4D,GAAQ,IAAM,EAERnI,EAAAkI,EAAM,GAAAlI,EAAI6D,EAAM,IAAA7D,EAAKoD,EAAO,GAAI,SAAS,eAAe,UAAY,YACxEpD,EAAAoD,EAAO,EAAC,MAAM,CAAE,cAAe,EAAI,CAAE,CAEvC,CAAC,EAED,eAAeY,IAAW,CACzB,MAAMoE,EAAOpI,EAAAsD,EAAK,EAAC,KAAI,EACvB,GAAI,GAAC8E,GAAIpI,EAAIuD,EAAO,GACpB8E,CAAAA,GAAA9E,GAAU,EAAI,EACd,GAAI,CACH,GAAEvD,EAAE8H,EAAK,EAAE,CAGV,MAAMQ,EAFIrB,EAAG,EAAE,UAASjH,EAAC4H,EAAS,CAAA,EAEtB,QAAQ,OACpB,MAAMrD,EAAA,OAAOhF,GAAkB,EAAG+I,EAAGA,EAAI,CAAC,GAAK,EAAE,EACjD,MAAM/D,EAAA,OAAO6D,CAAI,EACjB,MAAM7D,EAAA,OAAO,OAAO,EACpBgE,GAAY,CACb,SAAShE,EAAA,OAAU,CAClB,MAAMiE,EAAOjE,EAAA,OAAO,QACdkE,EAAQlE,EAAA,OAAO,QAAU,GACzBmE,EAAS1I,EAAG6D,EAAM,EACxB,GAAI,CAAC7D,EAAAkI,EAAM,GAAI,CAACQ,EAAW,CAC1B,MAAMtJ,GAAKoJ,EAAK,UAAWlB,IAAMA,GAAE,IAAI,EACjChI,GAAOC,GACZiJ,EAAK,UAAWlB,IAAMA,GAAE,QAAQ,EAChClI,GACAoJ,EAAK,MAAA,EAON,GALIlJ,KAAS,OAITA,IAAM,MAAMiF,EAAA,OAAOjF,EAAI,EACvB,CAAC,MAAOqJ,MAAe,MAC5B,CACA,MAAMpE,EAAA,OAAO6D,CAAI,EAIbM,EAAW,MAAMnE,EAAA,OAAO,QAAQ,EAC1BkE,GAAO,MAAMlE,EAAA,OAAO,OAAO,CACtC,CACA8D,GAAA/E,GAAQ,EAAE,CACX,QAAC,CACA+E,GAAA9E,GAAU,EAAK,CAChB,EACD,CAGA,MAAMqF,GAAkB,IAGxB,eAAeD,IAA+B,CAC7C,MAAME,EAAQ,KAAK,IAAG,EAAKD,GAC3B,KAAO,KAAK,IAAG,EAAKC,GAAO,CAC1B,GAAItE,UAAQ,SAAW,GAAM,MAAO,GACpC,MAAM,IAAI,QAASuE,GAAM,WAAWA,EAAG,GAAG,CAAC,CAC5C,CACA,MAAO,EACR,CAEA,SAAS3F,GAAYY,EAAkB,CAEtCA,EAAE,gBAAe,EACbA,EAAE,MAAQ,SAAW,CAACA,EAAE,UAAY,CAACA,EAAE,aAC1CA,EAAE,eAAc,EACXC,GAAQ,GACHD,EAAE,MAAQ,WAAa/D,EAAAkI,EAAM,GAAAlI,EAAI6D,EAAM,KACjDE,EAAE,eAAc,EACXQ,EAAA,OAAOvE,EAAA6D,EAAM,EAAG,SAAW,IAAI,EAEtC,CAUA,eAAe5E,GAAKiB,EAAU,CAE7B,MAAMnB,EAAOgK,GAAO7I,EAAKpB,EAAiB,EACtCC,GAAM,MAAMwF,EAAA,OAAOxF,CAAI,CAC5B,CAOA,eAAeyD,GAAUtC,EAAU,CAClC,MAAMnB,EAAOgK,GAAO7I,EAAKX,EAAiB,EACtCR,GAAM,MAAMwF,EAAA,OAAOxF,CAAI,CAC5B,CAGA,SAASgK,GAAO7I,EAAU8I,EAA+C,CACxE,GAAI,CAACzE,EAAA,OAAQ,OAAO,KACpB,MAAMiE,EAAOjE,EAAA,OAAO,QACpB,OAAOyE,EACNR,EAAK,UAAWlB,GAAMA,EAAE,QAAQ,EAChCkB,EAAK,UAAWlB,GAAMA,EAAE,IAAMpH,EAAI,CAAC,EACnCsI,EAAK,MAAA,CAEP,CAEA,SAASD,IAAe,CACvBF,GAAAT,GAAS5H,EAAT4H,EAAS,EAAI,CAAC,EACdS,GAAA7J,GAAQ,IAAI,IAAK,EAAA,EACbyI,EAAG,GAAI,CAACjH,IAAY,GAAIA,EAAA4H,EAAS,GAAIX,EAAG,EAAC,UAAU,QAAQ1C,EAAA,cAAA,CAChE,CAEA,SAAS0E,GAAUrJ,EAAYsJ,EAAY,CAC1C,MAAMxB,EAAIT,IAAK,UAAUrH,CAAE,EAC3B,GAAI8H,EAAE,YAAa,CAClB,MAAMyB,GAAO,IAAI,IAAGnJ,EAACxB,EAAK,CAAA,EACtB2K,GAAK,IAAID,CAAE,EAAGC,GAAK,OAAOD,CAAE,EAC3BC,GAAK,IAAID,CAAE,EAChBb,GAAA7J,GAAQ2K,GAAI,EAAA,EACZ,MACD,CACA,MAAMpK,EAAOR,GAAc,CAAC2K,CAAE,EAAGxB,CAAC,EAC7B3I,IACAwF,EAAA,OAAOxF,CAAI,EAChBwJ,GAAY,EACb,CAEA,SAASa,GAAaxJ,EAAY,CACjC,MAAMb,EAAOR,GAAc,CAAC,GAAAyB,EAAGxB,EAAK,CAAA,EAAGyI,EAAG,EAAE,UAAUrH,CAAE,CAAC,EACpDb,IACAwF,EAAA,OAAOxF,CAAI,EAChBwJ,GAAY,EACb,CAGA,eAAec,GAAOC,EAAiB,CACtC,GAAEtJ,EAAE8H,EAAK,EAAE,CACV,MAAMvD,EAAA,OAAO+E,EAAS,QAAU,YAAY,EAC5C/E,EAAA,cAAA,EACA,MACD,CACA,MAAMrE,EAAMqE,EAAA,QAAQ,QAAQ,KAAM+C,GACjCgC,EAAShC,EAAE,QAAU,iBAAmBF,GAAKE,EAAE,KAAK,IAAM,QAAO,EAE9DpH,GAAK,MAAMjB,GAAKiB,CAAG,CACxB,CAGA,SAAS6F,IAAO,CACVxB,EAAA,OAAOvE,EAAAkI,EAAM,EAAG,WAAa,OAAO,CAC1C,CAKA,MAAMqB,GAAc,kBAEdnE,GAAa,OAQbgB,GAAShG,EAAe,IAAM,CACnC,MAAMoJ,EAAwC,CAAA,EAC9C,UAAWC,KAAYlF,EAAA,QAAQ,MAAQ,IAAI,MAAM,GAAG,EAAG,CACtD,MAAMmF,EAAID,EAAQ,KAAI,EAAG,MAAMF,EAAW,EAEtC,CAACG,GAAM,CAAC,WAAW,KAAKA,EAAE,CAAC,CAAC,GAAKA,EAAE,CAAC,IAAM,OAASA,EAAE,CAAC,IAAM,SAChEF,EAAI,KAAK,CAAE,IAAKE,EAAE,CAAC,EAAG,MAAOA,EAAE,CAAC,EAAG,CACpC,CACA,OAAOF,CACR,CAAC,EAGD,SAASnJ,GAAWT,EAAYkD,EAAmC,CAClE,MAAM4E,EAAIT,KAAK,UAAUrH,CAAE,EAC3B,GAAI,CAAC8H,EAAG,OACR,MAAMiC,EAAIvC,GAAKtE,CAAK,EACpB,OAAO4E,EAAE,QAAQ,KAAMJ,IAAMF,GAAKE,GAAE,KAAK,IAAMqC,GAAMA,IAAM,IAAMvC,GAAKE,GAAE,KAAK,EAAE,WAAWqC,CAAC,CAAE,GAC1F,OACJ,CAGA,SAASC,GAAOC,EAAiB,CAChC,sBAAsB,IAAMA,EAAG,eAAe,CAAE,MAAO,SAAS,CAAE,CAAC,CACpE,CAEA,MAAMC,GAAY1J,EAAA,IAAY+G,GAAU,GAAI,CAACF,EAAG,CAAA,EAC1C8C,GAAK3J,EAAA,IAAYJ,EAAA8J,EAAY,EAAG,oBAAsB,kBAAkB,EAqH9E,IAAAE,GAAAC,GAAA,SAMC,IAAAC,GAAMzJ,EANPuJ,EAAA,EAOEG,KADDD,EAAM,EACLtJ,EAAA,IAAAK,GAAAkJ,GAAY,OAAOnK,EAAA8J,EAAY,EAAG,2BAA6B,mBAAmB,CAAA,MAClFM,GAAI7I,EADJ4I,GAAY,CAAA,EACZE,GAAA3I,EAAA0I,GAAI,EAAA,EAAJE,GAAA/I,EAAA6I,GAAI,CAAA,cACQ,IAAAG,EAAYvJ,GAAA,EAAZwJ,EAAAD,EAAY,EAAA,IAAA,EAAZtJ,GAAAsJ,EAAY,OAAA,WAAA,EAAZxI,EAAApC,EAAA4K,CAAa,YAArB7H,GAAM,GAAAvB,EAAAsJ,EAAA,MAHXP,EAAM,WAANA,GAAM,CAAA,6CAOCjD,EAAG,EAAC,UAAaS,GAAOA,EAAE,SAAQ,CAAA/H,EAAjB+H,EAAC9H,IAAA,OAChB8K,EAAItK,EAAA,IAAGsC,GAAM,GAAK1C,EAAA+H,EAAO,GAAI,GAAK/H,EAAAJ,CAAE,EAAAI,EAAG+H,EAAO,CAAC,EAC/C4C,QAAS,CAACjI,GAAM,GAAI1C,EAAAJ,CAAE,MAAKmI,EAAO,CAAA,EACzC,IAAA6C,EAAGC,GAAA,YACFC,EAAIrK,EADLmK,CAAI,QACH,IAAAG,EAAArJ,EAAAoJ,EAAI,EAAA,EACJE,EAACzJ,EADDuJ,EAAI,CAAA,EACJG,EAAAvJ,EAAAsJ,EAAC,EAAA,EAADE,GAAA3J,EAAAyJ,EAAC,CAAA,cAEA,IAAAG,EAAGC,GAAA,EAAHrJ,EAAApC,EAAAwL,CAAI,6BAEIzL,UAASE,CAAE,CAAA,eACXqE,EAAYoH,EAAA,IAAC,uBAAuBrL,EAAA0H,CAAC,EAAC,QAAQ,EAAE,2BAGxD4D,EAAG3H,GAAA4H,CAAA,EAAHrF,GAAAoF,EAAG,GAAA,IACItL,EAAA0H,CAAC,EAAC,QAAW8D,GAASA,EAAI,MAAK,CAAA7L,EAAlB6L,EAAGtC,IAAA,CACrB,IAAAuC,EAAAC,GAAA,SAAA,IAAAC,EAAAlL,EAAAgL,CAAA,kBAQEG,GAAQ5K,GAAA,kBAAR4K,GAAQ,OAAAC,EAAA,EAAA,KAGF7L,EAAA2K,CAAM,GAAI3K,IAAK,EAAC,MAAIkJ,CAAE,CAAA,EACzB,sBACA,0CALH0C,GAAQ,EAAA,oBAAA,KAAAE,GAAA,CAAA,GAAAD,GAAA,EAAA,CAAA,IAEE7L,GAAM,GAAIA,EAAAxB,EAAK,EAAC,IAAGwB,EAACkJ,CAAE,CAAA,CAAC,CAAA,MAFjC0C,EAAQ,UAQR,IAAAG,GAAIpL,GAAA,EAAJqL,GAAAtK,EAAAqK,GAAI,EAAA,EAAcnL,EAAA,IAAAC,EAAAmL,GAAAhM,EAAAkJ,CAAE,EAAG,CAAC,CAAA,EAAxBnH,EAAApC,EAAAoM,EAAK,WATF/L,EAAA0H,CAAC,EAAC,YAAWvG,EAAA8K,EAAA,EAAA9K,EAAA+K,GAAA,EAAA,IAWjB,IAAAC,EAAI5K,EAAAoK,EAAA,CAAA,EACHS,GAAI3L,EADL0L,CAAK,EACJE,GAAA3K,EAAA0K,GAAI,EAAA,EAAJE,GAAA/K,EAAA6K,GAAI,CAAA,cACiB,IAAAG,GAAI1K,GAAA,EAAJ2K,GAAA9K,EAAA6K,GAAI,EAAA,EAAe3L,EAAA,IAAAC,EAAA2L,GAAAxM,EAAAwL,CAAG,EAAC,WAAW,CAAA,EAAlCzJ,EAAApC,EAAA4M,EAAK,YAAtBvM,EAAAwL,CAAG,EAAC,aAAWrK,EAAAsL,EAAA,6BACF,IAAAC,GAAGxK,GAAA,EAAHyK,GAAAjL,EAAAgL,GAAG,EAAA,EAAkB9L,EAAA,IAAAC,EAAA8L,GAAA3M,EAAAwL,CAAG,EAAC,OAAO,CAAA,EAAhCzJ,EAAApC,EAAA+M,EAAI,WAAjB1M,EAAAwL,CAAG,EAAC,SAAOrK,EAAAyL,CAAA,IAHhBxK,EAAA+J,CAAK,EAlBN/J,EAAAqJ,CAAA,QAAAoB,GAAArC,EAAAiB,EAAA,EAAA,oBAAA,KAAAoB,GAAA,CAAA,IAAAhB,EAAA,EAAAJ,EAAA,SAIU,CAACzL,EAAA2K,CAAM,GAAI,CAAC3K,EAAA8H,EAAK,EAeNjH,EAAAwL,GAAArM,EAAAwL,CAAG,EAAC,KAAK,QAhBnBxL,EAAA2K,CAAM,GAAI3K,EAAA0H,CAAC,EAAC,aAAe1H,IAAK,EAAC,IAAGA,EAACkJ,CAAE,CAAA,IAHlDvG,GAAA,QAAA8I,EAKS,IAAMxC,GAASjJ,EAACJ,CAAE,EAAAI,EAAEkJ,CAAE,CAAA,CAAC,EALhCnH,EAAApC,EAAA8L,CAAA,IAFFrJ,EAAAkJ,CAAI,EAAJ,IAAAwB,EAAAvL,EAAA+J,EAAG,CAAA,yDAkCStL,EAAAxB,EAAK,EAAC,OAAS,CAAC,EAJ1BgF,GAAA7D,EAAA,kFAKS,IAAMyJ,GAAYpJ,EAACJ,CAAE,CAAA,kGAKtBgD,QAAS,sBAAqB,IAAE,uBAAuB5C,EAAA0H,CAAC,EAAC,QAAQ,EAAE,WAXxE1H,EAAA0H,CAAC,EAAC,YAAWvG,EAAA4L,CAAA,EAAA5L,EAAA6L,GAAA,EAAA,oBADdhN,EAAA2K,CAAM,KAAI7C,EAAK,GAAA3G,EAAA8L,CAAA,qBAnChBjN,EAAA0K,CAAI,EAAAvJ,EAAA+L,EAAA,EAEClN,EAAA2K,CAAM,GAAApG,EAAA,QAAc,CAACvE,EAAAgG,EAAS,EAAA7E,EAAAgM,GAAA,CAAA,EAAAhM,EAAAiM,EAAA,EAAA,IALxChL,EAAAwI,CAAI,SAAJyC,EAAA7C,EAAAI,EAAG,EAAA,sBAAA,KAAAyC,EAAA,CAAA,SAA+B,CAACrN,EAAA2K,CAAM,GAAI,CAAC3K,EAAA0K,CAAI,EAAA,MACjDI,wCAA8BJ,CAAI,CAAA,CAAA,EAAG7J,EAAAkK,EAAA/K,EAAA0H,CAAC,EAAC,MAAM,EACzB7G,EAAAoK,EAAAjL,EAAA0H,CAAC,EAAC,QAAQ,IAF/B3F,EAAApC,EAAAiL,CAAI,6BA2DJ,IAAA0C,EAAGC,GAAA,EAAHC,EAAA/M,EAAA6M,CAAI,aACkB,IAAAG,EAACC,GAAA,EAADC,EAAAjM,EAAA+L,EAAC,EAAA,EAAmB7M,EAAA,IAAAC,EAAA8M,EAAApJ,EAAA,OAAO,QAAQ,CAAA,EAAnCxC,EAAApC,EAAA8N,CAAE,WAAnBlJ,EAAA,OAAO,UAAQpD,EAAAyM,CAAA,iBACXlO,EAAQmO,EAAA,IAAC,EAAE,0BACYjL,EAAQjD,EAAA,IAAC,sBAAqB,IAAE,iBAAiB,YAA5EK,EAAAoE,EAAO,KAAIP,EAAM,IAAA1C,EAAA2M,CAAA,IAHtB1L,EAAAkL,CAAI,EAAJvL,EAAApC,EAAA2N,CAAI,WAFDtN,EAAAuH,EAAS,EAAG,GAAChD,EAAA,QAAc,CAAC7B,GAAM,GAAAvB,EAAA4M,EAAA,kCAUrCC,EAAMC,GAAA,EACLC,IADDF,CAAM,EACLG,EAAA1N,EAAAyN,CAAK,iFAIuBtN,EAAAiL,GAAAhL,EAAAuN,EAAA,GAAAvC,GAAA,EAAA,OAAA5E,EAAG,EAAC,UAAU,QAAM,EAAA,WAAA,EAAA,CAAA,IAA9C,KAAK,IAAI,EAACjH,EAAE+H,EAAO,CAAA,CAAC,CAAA,oBAHjBE,EAAQ,EAAA9G,EAAAkN,CAAA,EAAAlN,EAAAmN,EAAA,EAAA,IADblM,EAAA8L,CAAK,EAAL,IAAAK,EAAAhN,EAAA2M,EAAI,CAAA,GAOuC,IAAArC,EAAAzL,EAAA,IAAA,CAACJ,EAAAiI,EAAQ,CAAA,EAApDzE,GAAM+K,EAAA,uDAAyD,QAAA,IAAA,CAAWlF,GAAO,EAAK,yFAM5E,IAAAwC,EAAAzL,EAAA,IAAA,CAACJ,EAAAiI,EAAQ,CAAA,UACZjI,EAAAiI,EAAQ,EAAG,sBAAwB,6BAA6B,EAJvEzE,GAAAgL,EAAA,kFAKS,QAAA,IAAA,CAAWnF,GAAO,EAAI,gCAE9BoF,GAAY9K,GAAA+K,EAAA,EAAZzN,GAAAwN,GAAY,OAAA,eAAA,yCAlBdT,CAAM,MAANA,CAAM,YADHhO,EAAAgI,EAAY,GAAI,CAACtF,GAAM,GAAAvB,EAAAwN,EAAA,6BAuBIrK,EAAO3E,CAAA,WAAlC4E,EAAA,QAAU,CAAC7B,GAAM,GAAAvB,EAAAyN,CAAA,8BAErBC,EAAGlL,GAAAmL,CAAA,EAAHC,EAAAtO,EAAAoO,CAAI,cACkB,IAAAG,EAACtB,GAAA,EAADuB,EAAAvN,EAAAsN,EAAC,EAAA,EAAmBpO,EAAA,IAAAC,EAAAoO,EAAA1K,EAAA,OAAO,QAAQ,CAAA,EAAnCxC,EAAApC,EAAAqP,CAAE,WAAnBzK,EAAA,OAAO,UAAQpD,EAAA+N,EAAA,kBACXxP,EAAQyP,GAAA,IAAC,EAAE,iBACXlL,SAAa,iBAAiB,EAHvC7B,EAAAyM,CAAI,EAAJ,IAAAO,EAAA7N,EAAAsN,EAAG,CAAA,EAKKvK,EAAO8K,CAAA,iBAEf,IAAAC,EAACC,GAAA,EAADvN,EAAApC,EAAA0P,CAAE,YAtGCpI,EAAG,QA8FE1C,EAAA,QAAU,CAAC7B,GAAM,EAAAvB,EAAAoO,GAAA,CAAA,EAOhB7M,MAAMvB,EAAAqO,GAAA,CAAA,IAjHjBpN,EAAA4H,EAAA,EAAAyF,GAAAzF,GAAA3H,GAAAuH,KAAAvH,CAAA,CAAA,SAAAqN,GAAAlF,EAAAR,GAAA,EAAA,4BAAA,KAAA0F,GAAA,CAAA,OAAAhN,GAAA,EAAA,EAAAiN,GAAA3F,GAAA,aAAAhK,EAGY+J,EAAK,CAAA,OAKTrH,GAAM,EAAG,WAAU1C,EAAG+J,EAAK,CAAA,IARnChI,EAAApC,EAAAqK,EAAA,MApHO,eCjSD,SAAS4F,GAAiBC,EAAkC,CACjE,MAAMC,EAAQ,qBAAqB,KAAKD,CAAI,EAC5C,OAAOC,EAAQ,CAAE,OAAQA,EAAM,CAAC,EAAG,KAAMA,EAAM,CAAC,CAAA,EAAM,IACxD,CCVA,MAAMC,GAAmC,CACxC,CAAC,sDAAuD,SAAS,EACjE,CAAC,gCAAiC,2BAA2B,EAC7D,CAAC,UAAW,YAAY,EACxB,CAAC,SAAU,WAAW,CACvB,EAGO,SAASC,GAASH,EAAsB,CAC9C,MAAMI,EAAML,GAAiBC,CAAI,EACjC,GAAII,EACH,OAAOF,GAAa,KAAK,CAAC,CAACG,CAAO,IAAMA,EAAQ,KAAKD,EAAI,MAAM,CAAC,IAAI,CAAC,GAAK,yBAE3E,MAAM3H,EAAIuH,EAAK,YAAA,EACf,OAAIvH,EAAE,SAAS,MAAM,GAAKA,EAAE,SAAS,SAAS,EAAU,cACpDA,EAAE,SAAS,MAAM,GAAKA,EAAE,SAAS,OAAO,GAAKA,EAAE,SAAS,UAAU,EAAU,wBAC5EA,EAAE,SAAS,MAAM,EAAU,uBAC3BA,EAAE,SAAS,MAAM,GAAKA,EAAE,SAAS,MAAM,GAAKA,EAAE,SAAS,QAAQ,EAAU,cACzEA,EAAE,SAAS,MAAM,GAAKA,EAAE,SAAS,OAAO,EAAU,oBAClDA,EAAE,SAAS,KAAK,EAAU,UAC1BA,EAAE,SAAS,MAAM,EAAU,8BACxB,WACR,kMCzBA,UAUC,MAAM2H,EAAG7P,EAAA,IAAYwP,UAAsB,EAErCO,EAAG/P,EAAA,IAAYJ,EAAAiQ,CAAG,EAAG1L,EAAA,QAAQ,MAAM,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,IAAI,EAAI,EAAE,6CAG9D7D,GAAIiD,GAAAyM,EAAA,OAAJ1P,GAAI,EAAA,EAA8DY,KAAlEZ,GAAI,CAAA,EAA8DI,GAAAY,EAAAJ,GAAI,EAAA,EAAJK,GAAAJ,EAAAD,EAAK,eAErE,IAAAE,GAAIb,GAAA,EAAJc,GAAAC,EAAAF,GAAI,EAAA,eAAc2O,CAAG,CAAA,CAAA,EAArBpO,EAAApC,GAAA6B,EAAK,eAAV2O,CAAG,GAAAhP,GAAAC,EAAA,WAFqBP,EAAAuH,GAAApI,EAAAiQ,CAAG,EAAC,MAAM,EACrCpP,EAAAC,GAAAd,EAAAiQ,CAAG,EAAC,IAAI,8EADPA,CAAG,EAAA9O,GAAAa,CAAA,EAAAb,GAAAE,GAAA,EAAA,eAFA,CCyBR,MAAMgP,GAAW,qGACXC,GAAc,kBAGpB,SAASC,GAAeC,EAAuC,CAC7D,MAAMC,EAAQD,EAAM,UAAW7G,GAAMA,EAAE,KAAA,IAAW,EAAE,EACpD,OAAO8G,IAAU,GAAK,CAACD,EAAO,CAAA,CAAE,EAAI,CAACA,EAAM,MAAM,EAAGC,CAAK,EAAGD,EAAM,MAAMC,EAAQ,CAAC,CAAC,CACpF,CAEA,SAASC,GAAKF,EAAyB,CACrC,OAAOA,EAAM,KAAK;AAAA,CAAI,EAAE,KAAA,CAC1B,CAGO,SAASG,GAAgBvI,EAAiC,CAC/D,MAAMoI,EAAQpI,EAAK,MAAM;AAAA,CAAI,EACvBwI,EAAmB,CAAA,EAIzB,GAHAJ,EAAM,QAAQ,CAACK,EAAMlS,KAAM,CACrB0R,GAAS,KAAKQ,CAAI,GAAGD,EAAO,KAAKjS,EAAC,CACxC,CAAC,EACGiS,EAAO,SAAW,EAAG,OAAO,KAEhC,MAAME,EAAQJ,GAAKF,EAAM,MAAM,EAAGI,EAAO,CAAC,CAAC,CAAC,EACtCG,EAA6B,CAAA,EACnC,IAAIC,EAAQ,GAEZ,OAAAJ,EAAO,QAAQ,CAACpR,EAAOI,KAAO,CAC5B,MAAMqR,GAAML,EAAOhR,GAAK,CAAC,GAAK4Q,EAAM,OAC9B9G,GAAI8G,EAAMhR,CAAK,EAAE,MAAM6Q,EAAQ,EAC/Ba,GAAOV,EAAM,MAAMhR,EAAQ,EAAGyR,EAAG,EACjCE,GAAQD,GAAK,UAAWvH,IAAM2G,GAAY,KAAK3G,EAAC,CAAC,EACjDyH,GAAY,CAAC1H,GAAE,CAAC,EAAG,GAAIyH,KAAU,GAAKD,GAAOA,GAAK,MAAM,EAAGC,EAAK,CAAE,EAExE,IAAIE,GAA6B,KACjC,GAAIF,KAAU,GAAI,CAChB,MAAMG,GAAW,CAACJ,GAAKC,EAAK,EAAE,MAAMb,EAAW,EAAG,CAAC,EAAG,GAAGY,GAAK,MAAMC,GAAQ,CAAC,CAAC,EACxE,CAACI,GAAMC,EAAK,EAAIjB,GAAee,EAAQ,EAC7CD,GAAcX,GAAKa,EAAI,GAAK,KAGxB3R,KAAOgR,EAAO,OAAS,EAAGI,EAAQN,GAAKc,EAAK,EACvCd,GAAKc,EAAK,IAAGH,GAAcX,GAAKY,EAAQ,EACnD,CAEAP,EAAU,KAAK,CACb,EAAG,OAAOrH,GAAE,CAAC,CAAC,EACd,OAAQA,GAAE,CAAC,GAAKA,GAAE,CAAC,IAAI,QAAU,KACjC,KAAMgH,GAAKU,EAAS,EACpB,YAAAC,EAAA,CACD,CACH,CAAC,EAEM,CAAE,MAAAP,EAAO,UAAAC,EAAW,MAAAC,CAAA,CAC7B,CAOO,SAASS,GAAkBC,EAAmBC,EAA8C,CACjG,OAAOD,EAAM,UACV,IAAKhK,GAAM,CACV,MAAM5E,EAAQ4E,EAAE,MAAQ,IAAIA,EAAE,CAAC,KAAKA,EAAE,KAAK,IAAM,IAAIA,EAAE,CAAC,GAClDkK,EAASD,EAAQjK,EAAE,CAAC,IAAMA,EAAE,YAAc,CAAE,KAAM,QAAA,EAAa,CAAE,KAAM,MAAA,GAC7E,OAAIkK,EAAO,OAAS,SAAiB,GAAG9O,CAAK,yCACzC8O,EAAO,OAAS,QAAU,CAACA,EAAO,KAAK,OAAe,GAAG9O,CAAK,iCAC3D,GAAGA,CAAK,KAAK8O,EAAO,KAAK,MAAM,EACxC,CAAC,EACA,KAAK;AAAA,CAAI,CACd,CCtGO,SAASC,GAASC,EAAgD,CACvE,OAAOA,IAAU,MAAQ,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,EACrEA,EACD,IACN,CAEO,SAASC,GAAWD,EAA+B,CACxD,OAAO,OAAOA,GAAU,SAAWA,EAAQ,IAC7C,CCqBA,MAAME,OAAuB,IAAI,CAC/B,OACA,QACA,YACA,aACA,aACA,eACA,gBACA,iBACF,CAAC,EAED,SAASC,GAASC,EAA4C,CAC5D,OACEA,EAAM,OAAS,QACfA,EAAM,QAAU,MAChB,CAACA,EAAM,OACP,CAACF,GAAiB,IAAIE,EAAM,IAAI,CAEpC,CAQA,MAAMC,GAAS,CAAC7J,EAAW8J,EAAaC,IAAiB,GAAG/J,CAAC,IAAIA,IAAM,EAAI8J,EAAMC,CAAI,GAC/EC,GAAShK,GAAc6J,GAAO7J,EAAG,OAAQ,OAAO,EAEhDiK,GAAkB,CACtB,IAAK,QACL,OAASjK,GAAM,OAAO6J,GAAO7J,EAAG,gBAAiB,gBAAgB,CAAC,EACpE,EACMkK,GAAiB,CAAE,IAAK,OAAQ,OAASlK,GAAM,QAAQ6J,GAAO7J,EAAG,OAAQ,OAAO,CAAC,EAAA,EACjFmK,GAAiB,CAAE,IAAK,OAAQ,OAASnK,GAAM,UAAU6J,GAAO7J,EAAG,OAAQ,OAAO,CAAC,EAAA,EACnFoK,GAAkB,CAAE,IAAK,QAAS,OAASpK,GAAM,SAAS6J,GAAO7J,EAAG,OAAQ,OAAO,CAAC,EAAA,EACpFqK,GAAmB,CACvB,IAAK,SACL,OAASrK,GAAM,gBAAgB6J,GAAO7J,EAAG,UAAW,UAAU,CAAC,EACjE,EACMsK,GAAiB,CACrB,IAAK,OACL,OAAStK,GAAM,UAAU6J,GAAO7J,EAAG,YAAa,aAAa,CAAC,EAChE,EACMuK,GAAkB,CAAE,IAAK,QAAS,OAASvK,GAAM,WAAW6J,GAAO7J,EAAG,OAAQ,OAAO,CAAC,EAAA,EACtFwK,GAAuB,CAAE,IAAK,YAAa,OAASxK,GAAM,oBAAoBgK,GAAMhK,CAAC,CAAC,EAAA,EAGtFyK,GAAW,cACXC,GAAwC,CAC5C,GAAIJ,GACJ,KAAMA,GACN,KAAMD,GACN,GAAIA,GACJ,GAAIA,GACJ,IAAKH,GACL,KAAMA,GACN,KAAMA,EACR,EAGA,SAASS,GAAcC,EAAyB,CAC9C,IAAIC,EACJ,GAAI,CACFA,EAAUpB,GAAWF,GAAS,KAAK,MAAMqB,CAAK,CAAC,GAAG,OAAO,GAAG,KAAA,CAC9D,MAAQ,CAER,CACA,GAAI,CAACC,GAAWJ,GAAS,KAAKI,CAAO,EAAG,OAAOZ,GAC/C,KAAM,CAACa,EAAM,GAAGC,CAAI,EAAIF,EAAQ,MAAM,KAAK,EACrCG,EAAWN,GAAYI,CAAI,GAAKb,GAEtC,OAAIe,IAAad,IAAQa,EAAK,OAAQzU,GAAM,CAACA,EAAE,WAAW,GAAG,CAAC,EAAE,SAAW,EAAU2T,GAC9Ee,CACT,CAEA,MAAMC,GAA4C,CAChD,WAAYhB,GACZ,UAAWA,GACX,WAAYA,GACZ,KAAMC,GACN,KAAMC,GACN,UAAWA,GACX,aAAcA,GACd,MAAOC,GACP,KAAMC,GACN,KAAMA,GACN,GAAIC,GACJ,SAAUC,GACV,UAAWC,EACb,EAMMU,OAAoB,QAE1B,SAASC,GAAWC,EAA2B,CAC7C,IAAIJ,EAAWE,GAAc,IAAIE,CAAI,EACrC,OAAKJ,IACHA,EAAWK,GAAmBD,CAAI,EAClCF,GAAc,IAAIE,EAAMJ,CAAQ,GAE3BA,CACT,CAEA,SAASK,GAAmBD,EAA2B,CACrD,MAAMzD,EAAML,GAAiB8D,EAAK,IAAI,EACtC,OAAIzD,EAAY,CAAE,IAAK,OAAOA,EAAI,MAAM,GAAI,OAAS3H,GAAM,UAAU2H,EAAI,MAAM,IAAIqC,GAAMhK,CAAC,CAAC,EAAA,EACvFoL,EAAK,OAAS,OAAeT,GAAcS,EAAK,KAAK,EAEvDH,GAAgBG,EAAK,IAAI,GAAK,CAC5B,IAAK,QAAQA,EAAK,IAAI,GACtB,OAASpL,GAAM,QAAQoL,EAAK,IAAI,IAAIpB,GAAMhK,CAAC,CAAC,EAAA,CAGlD,CAGO,SAASsL,GAAiBC,EAA4B,CAC3D,MAAMC,MAAa,IACnB,UAAWJ,KAAQG,EAAO,CACxB,MAAMP,EAAWG,GAAWC,CAAI,EAC1BK,EAAOD,EAAO,IAAIR,EAAS,GAAG,EAChCS,EAAMA,EAAK,IACVD,EAAO,IAAIR,EAAS,IAAK,CAAE,SAAAA,EAAU,EAAG,EAAG,CAClD,CACA,MAAMlL,EAAO,CAAC,GAAG0L,EAAO,OAAA,CAAQ,EAAE,IAAI,CAAC,CAAE,SAAAR,EAAU,EAAAhL,CAAA,IAAQgL,EAAS,OAAOhL,CAAC,CAAC,EAAE,KAAK,IAAI,EACxF,OAAOF,EAAK,OAAO,CAAC,EAAE,cAAgBA,EAAK,MAAM,CAAC,CACpD,CAMO,SAAS4L,GAAcC,EAA8C,CAC1E,MAAMC,EAA0B,CAAA,EAChC,IAAIC,EAAyB,CAAA,EAE7B,MAAMC,EAAQ,IAAM,CAElB,IAAI5U,EAAQ,EACRyR,EAAMkD,EAAI,OACd,KAAO3U,EAAQyR,GAAOkD,EAAI3U,CAAK,EAAE,OAAS,YAAYA,IACtD,KAAOyR,EAAMzR,GAAS2U,EAAIlD,EAAM,CAAC,EAAE,OAAS,YAAYA,IACxD,MAAMoD,EAAOF,EAAI,MAAM3U,EAAOyR,CAAG,EAC3B4C,GAAQQ,EAAK,OAAOpC,EAAQ,EAC9B4B,GAAM,QAAU,GAClBK,EAAM,KAAK,GAAGC,EAAI,MAAM,EAAG3U,CAAK,CAAC,EACjC0U,EAAM,KAAK,CACT,KAAM,QACN,GAAIG,EAAK,CAAC,EAAE,GACZ,QAASA,EACT,QAAST,GAAiBC,EAAK,EAC/B,OAAQA,GAAM,OAAQS,IAAMA,GAAE,QAAQ,KAAO,EAAK,EAAE,MAAA,CACrD,EACDJ,EAAM,KAAK,GAAGC,EAAI,MAAMlD,CAAG,CAAC,GAE5BiD,EAAM,KAAK,GAAGC,CAAG,EAEnBA,EAAM,CAAA,CACR,EAEA,UAAWjC,KAAS+B,EAAS,CAC3B,GAAI/B,EAAM,OAAS,YAAcD,GAASC,CAAK,EAAG,CAChDiC,EAAI,KAAKjC,CAAK,EACd,QACF,CACAkC,EAAA,EACAF,EAAM,KAAKhC,CAAK,CAClB,CACA,OAAAkC,EAAA,EACOF,CACT,m+BCjNA,UAUC,IAGCK,EAAIrN,GAAA3C,EAAA,OAAA,GAAa,EAAK,EAWvB,MAAMiQ,EAAMpU,EAAA,IAAYqU,GAAUlQ,EAAA,KAAK,KAAK,CAAC,EACvClF,EAAKe,EAAA,IAAY,GAAGmE,OAAK,MAAM,MAAM,IAAIA,EAAA,KAAK,MAAM,SAAW,EAAI,OAAS,OAAO,EAAE,sCAI1FyF,GAAO0K,GAAA,EACNxK,KADDF,EAAO,EAELtJ,KADDwJ,EAAM,OACLxJ,EAAI,EACmCY,GAAIC,EAAA6G,EAAA,EAAJtH,GAAAY,EAAAJ,EAAK,EAC3CE,GAAID,EADkCD,GAAI,CAAA,EAC1CG,GAAAC,EAAAF,EAAK,IAFNd,EAAI,WAAJA,GAAI,CAAA,EAKJ8C,GAAM7B,GAAA,2FAA4F,IAAO4S,EAAO,EAAK,iGAO/G,IAAA1I,GAAAzL,EAAA,IAAAmE,EAAA,KAAK,IAAI,CAAC,EAJhBf,GAAAmR,GAAA,6PATDzK,EAAM,EAoBN,IAAA0K,KApBA1K,GAAM,CAAA,KAoBN0K,GAAE,GAAA,IACKrQ,EAAA,KAAK,MAASsQ,IAAGA,GAAE,KAAI,CAAAlV,GAATkV,KAAC,CACb,MAAAC,GAAM1U,EAAA,IAAG2U,GAAY/U,EAAC6U,EAAC,CAAA,CAAC,MAC/BG,GAAEjV,GAAA,EACDnB,GAAA6B,EADDuU,EAAE,EAOApT,GAAInB,EANL7B,EAAA,EAMCkF,GAAApC,EAAAE,GAAI,EAAA,EACJ+C,GAAIpD,EADJK,GAAI,CAAA,EACeqT,GAAGxU,EAAtBkE,EAAK,OAAcsQ,GAAG,EAAA,EAAtB7S,EAAAuC,EAAK,EAAL,IAAA1B,GAAA1B,EAAAoD,GAAI,CAAA,eAEH,IAAAyF,GAAIpJ,GAAA,EAAJe,EAAApC,GAAAyK,EAAK,8CAEY,IAAAU,GAAIjJ,GAAA,EAAJ4E,GAAA/E,EAAAoJ,EAAK,EAAclK,EAAA,IAAAC,EAAA4F,GAAA,IAAAzG,EAAA6U,EAAC,EAAC,WAAS,EAAA,EAAA,CAAA,EAA9B9S,EAAApC,GAAAmL,EAAK,aAAlB9K,EAAA6U,EAAC,EAAC,WAAS1T,GAAAa,EAAA,gCACE,IAAA+J,GAAI7J,GAAA,EAAJwE,GAAAhF,EAAAqK,EAAK,EAAcnL,EAAA,IAAAC,EAAA6F,GAAA,IAAA1G,EAAA6U,EAAC,EAAC,WAAS,EAAA,EAAA,CAAA,EAA9B9S,EAAApC,GAAAoM,EAAK,aAAlB/L,EAAA6U,EAAC,EAAC,WAAS1T,GAAAgB,EAAA,wBAJZnC,EAAA6U,EAAC,EAAC,OAAM1T,GAAAC,EAAA,EAAAD,GAAAE,GAAA,EAAA,IARbe,EAAAxD,EAAA,IADDoW,EAAE,iBACDrF,GAAA/Q,GAAA,OAAAiN,EAAA,KAAAjN,GAAA,QAEOoB,EAAA6U,EAAC,EAAC,QAAU,GAAG7U,IAAC,EAAC,OAAO,MAAMA,EAAA6U,EAAC,EAAC,IAAI,GAAK7U,EAAA6U,EAAC,EAAC,IAAI,EAIrDrK,EAAA5I,GAAI,EAAA,SAAAsT,IAAA,EAAA,GAAA,gBAAA,SAA8DJ,EAAM,CAAA,iBALnEvQ,EAAA,KAAKvE,EAAA6U,EAAC,EAAC,IAAI,MAKG7U,EAAA8U,EAAM,IAAK,IAAM,IAAM9U,EAAA8U,EAAM,EAAC,YAAW,EACpC,IAAAK,GAAYnV,EAAA6U,EAAC,EAAC,KAAItQ,EAAA,IAAA,SAR5CyQ,EAAE,MAHJJ,EAAE,IArBH5K,EAAO,gCAGWzF,EAAA,KAAK,MAAM,QAAM,EAAA,MAAA,EAAyB1D,EAAAC,GAAA,IAAAd,EAAAwU,CAAM,EAAC,WAAS,EAAA,EAAA,EACtD3T,EAAAY,GAAA,IAAAzB,EAAAwU,CAAM,EAAC,WAAS,EAAA,EAAA,SAJtCxK,EAAO,eA6CP1J,GAAM0C,GAAA,EACLjC,KADDT,EAAM,KACLS,GAAY,OAAA,mBAAA,IAAZA,GAAY,EAAA,gBAAA,MACZoL,KADApL,GAAY,CAAA,EACZgG,GAAArF,EAAAyK,EAAK,EACLC,GAAI7K,EADJ4K,GAAI,CAAA,EACeI,GAAI9L,EAAvB2L,EAAK,EAAc/B,GAAA3I,EAAA6K,EAAK,EAAwC2B,GAAI3M,EAAjDgL,GAAI,CAAA,EAAyCxB,GAAArJ,EAAAwM,EAAK,EAArE9L,EAAAgK,EAAK,IAHN9L,EAAM,2BAESjB,CAAK,GAAA,EAAA,EAAA,EACmBwB,EAAAwJ,GAAA,IAAArK,EAAAwU,CAAM,EAAC,WAAS,EAAA,EAAA,EAA6B3T,EAAAkK,GAAA,IAAA/K,EAAAwU,CAAM,EAAC,WAAS,EAAA,EAAA,IAHpG7R,GAAA,QAAArC,GAA2C,IAAOiU,EAAO,EAAI,CAAC,OAA9DjU,EAAM,YA9CHiU,EAAI,EAAApT,GAAAkD,EAAA,EAAAlD,GAAA+K,GAAA,EAAA,eAFD,opPC1BR,gBAoXUkJ,EAAK,CAAAzV,EAAC0V,EAAUxV,GAAE6R,EAAiB7R,KAAA,CACpC,MAAAyV,EAAIlV,EAAA,IAAGiV,EAAE,IAAArV,EAAKuV,EAAW,GAAI,CAACC,GAAUH,EAAE,CAAA,GAAK9Q,EAAA,aAAe,IAAI,EAGlEkR,EAAKrV,EAAA,IAAGJ,GAAI,GAAI0V,EAAY,IAAK,WAAaA,EAAY,IAAK,YAAY,qCAGjF5V,EAAGa,GAAA,EAAHgV,GAAA7V,MAA2C8V,GAAelE,EAAK,EAAC,KAAK,EAAC,EAAA,IAAtE5R,CAAG,OAAHA,CAAG,YAFA4R,EAAK,EAAC,OAAKvQ,GAAAC,CAAA,QAIf4I,EAAOzI,EAAAf,EAAA,CAAA,gBAAPwJ,CAAO,cACA0H,EAAK,EAAC,UAAahK,IAAGA,GAAE,EAAC,CAAA/H,GAAN+H,IAAC,CAClB,MAAA9I,QAAIiX,GAASR,EAAE,EAAArV,EAAE0H,CAAC,CAAA,CAAC,EAC1B,IAAArC,EAAGtF,GAAA,YACFW,EAAID,EADL4E,CAAI,MACH3E,CAAI,EACJkK,IADAlK,EAAI,CAAA,EACJiU,EAAAlU,EAAAmK,CAAI,iBACUnG,GAACzD,GAAA,OAADyD,GAAC,EAAA,EAAmB7D,EAAA,IAAAC,EAAAY,GAAAzB,EAAA0H,CAAC,EAAC,KAAK,CAAA,MAA3BjD,EAAC,WAAVzE,EAAA0H,CAAC,EAAC,OAAKvG,EAAAa,CAAA,IAEX,IAAAmJ,EAAG5J,EAAAoT,EAAA,CAAA,EAAHgB,GAAAxK,EAAG,IAAiCyK,GAAe5V,EAAA0H,CAAC,EAAC,IAAI,EAAC,EAAA,EAA1DtF,EAAA+I,CAAI,EAAJ,IAAAlI,GAAA1B,EAAA4J,EAAG,CAAA,+CAGD,IAAA7K,EAAAuB,GAAA,QAOC,IAAAd,GAAQN,EAPTH,CAAA,WAOCS,GAAQ,OACFf,GAAC,EAAC,OAAS,SAAW,mBAAqB,oBAAoB,CAAA,IADrEe,GAAQ,EAAA,eAAA,MAIRO,KAJAP,GAAQ,CAAA,EAIR4U,GAAArU,GAAI,IAAyBsU,GAAe5V,EAAA0H,CAAC,EAAC,WAAW,EAAC,EAAA,EAA1DtF,EAAAd,EAAK,EAXNc,EAAA9B,CAAA,SAAAoP,EAAAlF,EAAAlK,EAAA,EAAA,uBAAA,KAAAoP,EAAA,CAAA,GAGU1P,EAAApB,CAAC,EAAC,OAAS,QAAQ,CAAA,EAH7B+Q,GAAArP,EAAA,eAIcN,EAAApB,CAAC,EAAC,OAAS,QAAQ,IAJjC+D,GAAA,QAAArC,EAKS,IAAMwV,GAAUT,EAAE,EAAErV,EAAA0H,CAAC,EAAC,EAAG,CAAE,KAAM,QAAQ,CAAE,CAAC,EALrD3F,EAAApC,EAAAW,CAAA,UAcA,IAAAgL,EAAGpJ,GAAA,EACFwB,EAAYjD,EADb6K,CAAI,EACHrK,GAAAyC,EAAY,OAAA,iBAAA,EAAZ8G,EAAA9G,EAAY,EAAA,eAAA,MAEZlC,GAAID,EAFJmC,EAAY,CAAA,EAEZiS,GAAAnU,GAAI,IAAyBoU,GAAe5V,EAAA0H,CAAC,EAAC,WAAW,EAAC,EAAA,EAA1DtF,EAAAZ,EAAK,EAHNY,EAAAkJ,CAAI,EAAJvJ,EAAApC,EAAA2L,CAAI,cAfDgK,CAAI,EAAAnU,EAAAgB,EAAA,EAAAhB,EAAAE,GAAA,EAAA,sBADLrB,EAAA0H,CAAC,EAAC,aAAWvG,EAAAkD,CAAA,+BAwBhB,IAAAiJ,GAAG/M,GAAA,EACFwV,GAAAtV,EADD6M,EAAI,EACH0I,GAAAD,EAAA,SAAAtG,GAAAsG,GAAA1T,GAAA4T,KAAA5T,CAAA,CAAA,MAQAyC,GAAAvD,EARAwU,GAAA,CAAA,QAQA,IAAAjU,EAAAJ,EAAAoD,GAAA,EAAA,EATD1C,EAAAkL,EAAI,aACHqC,GAAAoG,GAAA,cAGa/V,GAAC,EAAC,YAAc,8BAAgC,aAAa,EAH1EkW,GAAAH,GAAAlK,CAAA,EAAAwB,GAAA7C,EAAAuL,GAAA,EAAA,gBAAA,KAAA1I,GAAA,CAAA,OAAA6H,GAAA,EAQAiB,EAAA3L,EAAA1F,GAAA,EAAA,wBAAA,KAAAqR,EAAA,CAAA,GAGUnW,EAAApB,CAAC,EAAC,OAAS,MAAM,CAAA,EAH3B+Q,GAAA7K,GAAA,eAIc9E,EAAApB,CAAC,EAAC,OAAS,MAAM,EAK9BiC,EAAAiB,EAAA9B,EAAApB,CAAC,EAAC,OAAS,OAAS,YAAc,MAAM,IAblC,IAAAwX,GAAQf,EAAE,EAAArV,EAAE0H,CAAC,CAAA,EAEN,IAAA1H,EAAApB,CAAC,EAAC,OAAS,OAASoB,EAAApB,CAAC,EAAC,KAAK,SAAW,KANpD+D,GAAA,QAAAoT,GAKUhS,GAAMsS,GAAWhB,IAAErV,EAAE0H,CAAC,EAAE3D,EAAE,cAAc,KAAK,CAAC,EAGxDpB,GAAA,QAAAmC,GAMS,IACRgR,GAAUT,EAAE,EAAErV,EAAA0H,CAAC,EAAC,EAAG1H,EAAApB,CAAC,EAAC,OAAS,OAAUoB,EAAA0H,CAAC,EAAC,YAAc,CAAE,KAAM,QAAQ,EAAK,CAAE,KAAM,MAAO,KAAM,EAAE,EAAM,CAAE,KAAM,MAAM,CAAE,CAAC,EAhB7H3F,EAAApC,EAAA2N,EAAI,cADDgI,CAAI,GAAAnU,EAAAmV,EAAA,IA3BTlU,EAAAwI,CAAI,EAFLxI,EAAAiD,CAAI,aAAJA,uCAA8BrF,EAAAsV,CAAI,GAAItV,GAAC,EAAC,OAAS,OAAM,EAClCa,EAAAC,EAAA,IAAAd,EAAA0H,CAAC,EAAC,GAAC,EAAA,EAAA,IADxB3F,EAAApC,GAAA0F,CAAI,iCAwDJ2I,EAAM0G,GAAA,EACL9S,IADDoM,CAAM,EACLuI,EAAA7U,EAAAE,EAAI,EAAA,EACJqD,EAAA1D,EADAK,EAAI,CAAA,EACJkC,EAAApC,EAAAuD,EAAA,EAAA,IAFD+I,CAAM,eAEL/I,EAAA,SAGU,CAACjF,EAAAyV,CAAK,GAAIzV,EAAAwW,EAAY,IAAKnB,EAAE,KAHvCpQ,EAAA,QAIOjF,EAAAyV,CAAA,EACJ,0CACA,oDAAoD,EAGtD5U,EAAAiD,EAAA9D,EAAAwW,EAAY,IAAKnB,EAAE,EAAG,WAAa,cAAc,GAVxB,CAAA,IAAAoB,GAAMpB,EAAE,EAAE3D,EAAK,CAAA,CAAC,cAC1CzM,EAOS,IAAA,CAAWyR,GAAUrB,EAAE,EAAE3D,EAAK,CAAA,EAAC,OATzC1D,CAAM,UAeN,IAAA2I,EAAM3T,GAAA,EAANjB,EAAApC,GAAAgX,CAAO,YAhBJ3W,EAAAsV,CAAI,EAAAnU,GAAA8E,CAAA,EAeCuP,GAAUH,EAAE,CAAA,GAAClU,GAAA6F,EAAA,CAAA,MAzEvBgD,CAAO,WAAPA,EAAO,CAAA,eA+EN,IAAA6E,EAAGlO,GAAA,EAAHgV,GAAA9G,EAAG,IAAwC+G,GAAelE,EAAK,EAAC,KAAK,EAAC,EAAA,EAAtEtP,EAAAyM,CAAI,EAAJ9M,EAAApC,GAAAkP,CAAI,aAFD6C,EAAK,EAAC,OAAKvQ,GAAAsJ,EAAA,cA7EfT,EAAO,EAAA,sBAAA,KAAAvH,EAAA,CAAA,KAAAzC,EAAAsV,CAAA,CAAA,CAAA,CAAA,UArWR,IAICI,EAAYxO,GAAA3C,EAAA,eAAA,EAAG,IAAI,EACnBqS,yBAAgB,IAAI,EACpBC,oBAAW,IAAI,EACfC,0BAAY,CAAA,CAAE,EACdC,uBAAa,IAAI,EAEjBC,uBAAa,IAAI,EACjBC,4BAAY,CAAA,EAAE,EAIdC,uBAAa,CAAC,EACdC,2BAAiB,EAAK,EAKtBC,GAAWlQ,GAAA3C,EAAA,cAAA,EAAG,IAAI,EAwDf8S,GAAMxP,MAAO,KAAK,IAAG,CAAE,CAAA,EAC3B,MAAMyP,GAASlX,EAAA,IAAYyW,EAAQ,GAAE,YAAc,IAAI,EACjDU,GAAOnX,EAAA,IAAYJ,EAAAsX,EAAS,IAAK,IAAI,EAC3CnP,GAAQ,IAAM,CACb,GAAI,CAACnI,EAAAuX,EAAO,EAAE,OACdlP,GAAAgP,GAAM,KAAK,IAAG,EAAE,EAAA,EAChB,MAAMhC,EAAK,YAAY,IAAAhN,GAAOgP,GAAM,KAAK,IAAG,EAAE,EAAA,EAAG,GAAI,EACrD,MAAO,IAAM,cAAchC,CAAE,CAC9B,CAAC,EAGD,MAAMmC,GAAO,yFAEPC,GAAWrX,EAAA,IAChBJ,EAAAsX,EAAS,IAAK,KAAOI,GAAqB,KAAK,IAAI,EAAG,KAAK,WAAU,EAAA1X,EAAGsX,EAAS,GAAI,GAAI,CAAC,CAAC,EAAI,IAAA,EAI1FpD,GAAK9T,EAAA,IAAY4T,aAAsB,EAGvC2D,GAAWvX,EAAA,IAAYsV,EAAY,IAAK,MAAQA,EAAY,IAAK,MAAM,EACvEkC,GAASxX,EAAA,IACdmE,EAAA,aAAe6S,GAAA,EACZS,GAAgB7X,EAACkU,EAAK,EAAEkD,GAAW,EAAC,MAAOA,KAAY,QAAOpX,EAAE2X,EAAW,CAAA,EAC3E,IAAI,GAAkB,EAGpBG,GAAU1X,EAAA,IAAY,CAAC,GAAGJ,EAAA4X,EAAS,EAAC,OAAM,CAAE,EAAE,GAAG,EAAE,GAAG,IAAM,IAAI,EAEtE,IAAIG,GAAQC,GAAmC,EAAE,EAQ7CC,GAAMD,GAAmC,EAAE,EAQ/C,MAAME,GAAa,IAAI,IACvB,SAASC,GAAW/P,EAAiC,CACpD,GAAI,CAACA,EAAK,SAAS,GAAG,EAAG,OAAO,KAChC,IAAIsJ,EAAQwG,GAAW,IAAI9P,CAAI,EAC/B,OAAIsJ,IAAU,SACbA,EAAQf,GAAgBvI,CAAI,EAC5B8P,GAAW,IAAI9P,EAAMsJ,CAAK,GAEpBA,CACR,CASA,MAAM6D,GAAWnV,EAAe,IAAM,CACrC,QAASzB,EAAI4F,UAAQ,OAAS,EAAG5F,GAAK,EAAGA,IAAK,CAC7C,MAAMoF,EAAIQ,EAAA,QAAQ5F,CAAC,EACnB,GAAIoF,EAAE,OAAS,QAAUA,EAAE,OAAS,UAAYA,EAAE,OAAS,OAASA,EAAE,OAAS,YAC9E,OAAO,KACR,GAAIA,EAAE,OAAS,QAAUoU,GAAWpU,EAAE,IAAI,EAAG,OAAOA,EAAE,EACvD,CACA,OAAO,IACR,CAAC,EAED,IAAIqU,GAAYJ,GAAuD,EAAE,EACrExB,GAAe3O,GAAsB,IAAI,EACzC2N,GAASwC,GAAmC,EAAE,EAElD,SAASnC,GAASR,EAAY3N,EAAiD,CAC9E,OAAO0Q,GAAa/C,CAAE,IAAI3N,EAAE,CAAC,IAAMA,EAAE,YAAc,CAAE,KAAM,QAAQ,EAAK,CAAE,KAAM,MAAO,KAAM,IAC9F,CAEA,SAASoO,GAAUT,EAAY/M,EAAWsJ,EAAqB,CAC9DwG,GAAa/C,CAAE,EAAI,CAAE,GAAI+C,GAAa/C,CAAE,GAAK,CAAA,EAAK,CAAC/M,CAAC,EAAGsJ,CAAM,CAC9D,CAGA,SAASyE,GAAWhB,EAAY3N,EAAoCU,EAAc,CAC7EA,EAAK,KAAI,IAAO,IAAMV,EAAE,YAAaoO,GAAUT,EAAI3N,EAAE,EAAG,CAAE,KAAM,SAAU,EACzEoO,GAAUT,EAAI3N,EAAE,EAAG,CAAE,KAAM,MAAO,KAAAU,EAAM,CAC9C,CAEA,SAASgO,GAAQf,EAAY3N,EAA4C,CACxE,MAAM9I,EAAIiX,GAASR,EAAI3N,CAAC,EACxB,OAAO9I,EAAE,OAAS,MAAQA,EAAE,KAAO,EACpC,CAEA,SAAS6X,GAAMpB,EAAY3D,EAA2B,CACrD,IAAI2G,EAAS,EACTC,EAAM,EACN/D,EAAO,EACX,UAAW7M,KAAKgK,EAAM,UAAW,CAChC,MAAM9S,EAAIiX,GAASR,EAAI3N,CAAC,EACpB9I,EAAE,OAAS,SAAUyZ,IAChBzZ,EAAE,OAAS,OAASA,EAAE,KAAK,KAAI,EAAI0Z,IACvC/D,GACN,CACA,MAAMgE,EAAkB,CAAA,EACxB,OAAIF,GAAQE,EAAM,KAAK,GAAGF,CAAM,SAAS,EACrCC,GAAKC,EAAM,KAAK,GAAGD,CAAG,gBAAgB,EACtC/D,GAAMgE,EAAM,KAAK,GAAGhE,CAAI,YAAY,EACjCgE,EAAM,KAAK,IAAI,CACvB,CAEA,eAAe7B,GAAUrB,EAAY3D,EAAmB,CACvD,GAAI,CAACnN,EAAA,aAAWvE,EAAIwW,EAAY,EAAE,OAClC,MAAM7E,EAAuC,CAAA,EAC7C,UAAWjK,KAAKgK,EAAM,UAAWC,EAAQjK,EAAE,CAAC,EAAImO,GAASR,EAAI3N,CAAC,EAC9DW,GAAAmO,GAAenB,EAAE,EAAA,EACjB,GAAI,CACC,MAAM9Q,EAAA,YAAYkN,GAAkBC,EAAOC,CAAO,CAAC,IAAG6D,GAAUH,CAAE,EAAI,GAC3E,QAAC,CACAhN,GAAAmO,GAAe,IAAI,CACpB,CACD,CAGA,SAASP,GAASpM,EAAyB,CAC1C,MAAM2O,EAAM,IAAM,CACjB3O,EAAG,MAAM,OAAS,OAClBA,EAAG,MAAM,OAAS,GAAGA,EAAG,YAAY,IACrC,EACA,OAAA2O,EAAG,EACH3O,EAAG,iBAAiB,QAAS2O,CAAG,EACzB,CAAE,QAAS,IAAM3O,EAAG,oBAAoB,QAAS2O,CAAG,CAAC,CAC7D,CAQA,MAAMC,GAASrY,EAAA,KACbsV,EAAY,IAAK,WAAaA,EAAY,IAAK,eAAiBnR,cAAc,IAAA,EAG1EmU,GAAStY,EAAA,IACdJ,EAAAyY,EAAA,EACIlU,EAAA,QAAQ,SAAUR,GAAMA,EAAE,OAAS,OAAS,CAACA,EAAE,SAAW,CAACA,EAAE,QAAQ,GAAG,IAAM,KAC/E,IAAA,EASE4U,GAASvY,EAAA,IAAYJ,EAAA0Y,EAAS,IAAK1B,GAAU,GAAAhX,EAAIyY,EAAS,EAAG,OAAS,KAAK,EAEjF,IAAIG,GAAW/Q,GAAsB,IAAI,EAErCgR,GAAYhR,GAAsB,IAAI,EAC1CM,GAAQ,IAAM,CACTnI,EAAA2Y,EAAS,IAAK,MACjBtQ,GAAAuQ,GAAW,IAAI,EACfvQ,GAAAwQ,GAAY,IAAI,GACN7B,OACV3O,GAAAuQ,KAAWD,EAAS,EAAA,EAAA,EAEpBtQ,GAAAwQ,GAAY,IAAI,EAElB,CAAC,EAED,MAAMC,GAAY1Y,EAAA,IACjBJ,IAAS,IAAK,OACXA,EAAA4Y,EAAQ,MAAKD,EAAS,GAAI3B,GAAU,IAAK,MAAShX,EAAA6Y,EAAS,IAAA7Y,EAAK2Y,EAAS,EAAA,EAO7E,IAAII,GAAYf,GAAgC,EAAE,EAC9CgB,GAAoD,KACxD7Q,GAAQ,IAAM,CACTnI,EAAA0Y,EAAS,GAAA1Y,EAAI8Y,EAAY,IAAEC,GAAY/Y,EAAC0Y,EAAS,CAAA,EAAI,IAGrDM,IAAeA,GAAY,KAAEhZ,EAAK0Y,EAAS,GAAIM,GAAY,OAC9DD,GAAaC,GAAY,EAAE,EAAI,IAEhCA,GAAchZ,EAAA0Y,EAAS,EAAG,CAAE,KAAIA,EAAS,EAAE,KAAM1Y,EAAA4Y,EAAQ,IAAA5Y,EAAK0Y,EAAS,CAAE,EAAG,IAC7E,CAAC,EAED,MAAMO,GAAU7Y,EAAA,IAAYJ,EAAA0Y,EAAS,IAAK,MAAQ1B,GAAU,IAAK,IAAI,EAO/DkC,GAAY9Y,EAAe,IAAM,CACtC,MAAMoJ,EAAM,IAAI,IAChB,UAAWrE,KAAK2R,IAAW,CAC1B,MAAM1O,EAAOjD,EAAE,KAAK,KAAI,EAElBgU,EAAO5U,UAAQ,KACnBR,IAECA,EAAE,OAAS,QAAWA,EAAE,OAAS,UAAY,CAACA,EAAE,YACjD,CAACyF,EAAI,IAAIzF,EAAE,EAAE,GACbA,EAAE,IAAMoB,EAAE,GAAK,KACfpB,EAAE,KAAK,KAAI,IAAOqE,CAAA,EAEhB+Q,GAAM3P,EAAI,IAAI2P,EAAK,GAAIhU,EAAE,GAAG,CACjC,CACA,OAAOqE,CACR,CAAC,EAED,SAAS4P,GAAWC,EAAoB,CACvC,GAAI,CACH,OAAO,IAAI,KAAKA,CAAE,EAAE,mBAAmB,OAAW,CACjD,KAAM,UACN,OAAQ,UACR,CACF,MAAQ,CACP,MAAO,EACR,CACD,CAYA,SAASC,GACRC,EACAC,EACkE,CAClE,IAAIvF,EACJ,GAAI,CACHA,EAAU,OAAO,QAAQ,KAAK,MAAMsF,CAAS,CAAC,CAC/C,MAAQ,CACP,MAAO,CAAE,IAAK,KAAM,MAAO,CAAA,EAAI,KAAM,CAAC,CAAE,IAAK,QAAS,MAAOA,CAAS,CAAE,CAAG,CAC5E,CACA,MAAME,EAAUD,EAAS,YAAW,EAAG,SAAS,MAAM,EACtD,IAAIE,EAAqB,KACzB,MAAMC,EAAsB,CAAA,EACtBC,EAAqB,CAAA,EAC3B,SAAW,CAACC,EAAKC,CAAG,IAAK7F,EAAS,CACjC,MAAMnC,EAAQ,OAAOgI,GAAQ,SAAWA,EAAO,KAAK,UAAUA,EAAK,KAAM,CAAC,GAAK,OAAOA,CAAG,EACrFL,GAAWI,IAAQ,UACtBH,EAAM5H,EACIA,EAAM,SAAS;AAAA,CAAI,GAAKA,EAAM,OAAS,GACjD8H,EAAK,KAAK,CAAE,IAAAC,EAAK,MAAA/H,CAAK,CAAE,EAExB6H,EAAM,KAAK,CAAE,IAAAE,EAAK,MAAA/H,CAAK,CAAE,CAE3B,CACA,MAAO,CAAE,IAAA4H,EAAK,MAAAC,EAAO,KAAAC,CAAI,CAC1B,CAgGA,IAAAG,GAAGC,GAAA,SA8BOC,EAAS,CAAAta,EAACua,EAAiBra,KAAA,+BAElC,IAAAmF,EAAYN,GAAA,EAAZ8F,EAAAxF,EAAY,EAAA,yBAAA,EAAZ/D,GAAA+D,EAAY,OAAA,gBAAA,EAAZ/D,GAAA+D,EAAY,QAAA,UAAA,EAAZjD,EAAApC,EAAAqF,CAAa,SAEb,IAAAL,EAAIkB,GAAA,EAAJ9D,EAAApC,EAAAgF,CAAK,WAHFuV,EAAQ,EAAA/Y,EAAA+L,CAAA,EAAA/L,EAAA+K,EAAA,EAAA,YAMJiO,EAAG,CAAAxa,EAAC0V,EAAUxV,KAAA,CACf,MAAAua,QAAMpa,EAAAkZ,EAAY,EAAC,IAAI7D,EAAE,CAAA,CAAC,gCAEhC,IAAAjL,EAAA7D,GAAA,EAAA3B,EAAAlD,EAAA0I,EAAA,EAAA,YAAAA,EAAA,QAEOpK,EAAAoa,CAAG,IAAK,QAAU,gCAAkC,qBAAqB,EAC9EvZ,EAAA+D,EAAA5E,EAAAoa,CAAG,IAAK,QAAU,QAAU,QAAQ,IAHtCrY,EAAApC,EAAAyK,CAAA,aADGgQ,CAAG,GAAAjZ,EAAAgM,CAAA,YAQCjN,EAAG,CAAAP,EAACuS,EAAsBrS,KAAA,+BAEjC,IAAAwa,EAAG3O,GAAA,QAAH,IAAApB,EAAA7J,EAAA4Z,CAAI,EACKJ,EAAS3P,EAAA,IAAC4H,EAAK,EAAC,UAAY,EAAK,0BAMxC,IAAAoI,GAAGlP,GAAA,EACFN,GAAIrK,EADL6Z,EAAI,EACH7T,EAAA/E,EAAAoJ,GAAI,EAAA,EAAJyP,GAAAhZ,EAAAuJ,EAAK,cAAuE,IAAAiB,EAAAjF,GAAA,EAAAJ,EAAAhF,EAAAqK,EAAA,EAAA,YACvDmG,EAAK,EAAC,QAAQ,IAAI,CAAA,EADqCnQ,EAAApC,EAAAoM,CAAA,YAApBmG,EAAK,EAAC,QAAQ,MAAI/Q,EAAA8K,EAAA,+BAOzE,IAAAuO,EAAGC,GAAA,EAAH1T,EAAArF,EAAA8Y,EAAG,EAAA,YAAuBtI,EAAK,EAAC,QAAQ,MAAM,CAAA,EAA9CnQ,EAAApC,EAAA6a,CAAI,YADDtI,EAAK,EAAC,QAAQ,QAAM/Q,EAAAsL,EAAA,IAPzBrK,EAAAkY,EAAI,YACsBpI,EAAK,EAAC,QAAQ,IAAI,CAAA,EAD5CnQ,EAAApC,EAAA2a,EAAI,SAYJ,IAAAI,GAAGC,GAAA,EAAHtQ,GAAA3I,EAAAgZ,GAAG,EAAA,EAAoB9Z,EAAA,IAAAC,EAAAwJ,GAAA6H,EAAK,EAAC,IAAI,CAAA,EAAjCnQ,EAAApC,EAAA+a,EAAI,WAbDxI,EAAK,EAAC,QAAO/Q,EAAAyL,CAAA,EAAAzL,EAAA6L,EAAA,EAAA,IAejB,IAAAb,EAAI5K,EAAAqZ,EAAA,CAAA,EAAJC,EAAApa,EAAA0L,CAAK,EAAsBgO,EAAGU,EAAA,IAAC3I,EAAK,EAAC,EAAE,mBAAvC9P,EAAA+J,CAAK,EArBN/J,EAAAiY,CAAI,QAAJxN,EAAArC,EAAA6P,EAAG,EAAA,2BAAA,KAAAxN,EAAA,CAAA,SAAoCqF,EAAK,EAAC,QAAQ,CAAA,EAArDvC,GAAA0K,EAAG,gBAAmEnI,EAAK,EAAC,EAAE,WAqBnC,CAAA,IAAAkH,GAAWlH,EAAK,EAAC,EAAE,CAAC,GArB/DnQ,EAAApC,EAAA0a,CAAI,uCAyBH,IAAAS,EAAGC,GAAA,QAAH,IAAApP,EAAAlL,EAAAqa,CAAI,EACKb,EAAStO,EAAA,IAACuG,EAAK,EAAC,UAAY,EAAK,EACzC,IAAA8I,EAAGzZ,EAAAoK,EAAA,CAAA,EAAHV,GAAAvJ,EAAAsZ,EAAG,EAAA,EACH5O,EAAI7K,EADJyZ,EAAG,CAAA,EACH1O,GAAA7L,EAAA2L,CAAK,EACI+N,EAAG7N,GAAA,IAAC4F,EAAK,EAAC,EAAE,EACpB,IAAAhN,GAAY3D,EAAA+K,GAAA,CAAA,EAAZrL,GAAAiE,GAAY,OAAA,gBAAA,EAAZsF,EAAAtF,GAAY,EAAA,eAAA,EAAZ,IAAA8G,EAAAzK,EAAA2D,EAAa,EAFd9C,EAAAgK,CAAK,EAHNhK,EAAA0Y,CAAI,SAAJhP,EAAAtB,EAAAsQ,EAAG,EAAA,2BAAA,KAAAhP,EAAA,CAAA,SAAoCoG,EAAK,EAAC,QAAQ,CAAA,EAArDvC,GAAAmL,EAAG,gBAAmE5I,EAAK,EAAC,EAAE,EAEtDrR,EAAAoK,GAAAiH,EAAK,EAAC,IAAI,qBAIhC,CAAA,IAAAkH,GAAWlH,EAAK,EAAC,EAAE,CAAC,GANtBnQ,EAAApC,EAAAmb,CAAI,WADA5I,EAAK,EAAC,WAAS/Q,EAAA8L,CAAA,kBAYpB,IAAAgO,EAAGvN,GAAA,EACFlI,EAAY/E,EADbwa,CAAI,EACHzQ,EAAAhF,EAAY,EAAA,yBAAA,EAAZvE,GAAAuE,EAAY,OAAA,qBAAA,MACZ0V,EAAG3Z,EADHiE,EAAY,CAAA,EACZ2V,EAAA1a,EAAAya,CAAI,aACa,IAAA3O,GAAI1B,GAAA,EAAJwB,GAAA3K,EAAA6K,GAAI,EAAA,EAAoB3L,EAAA,IAAAC,EAAAwL,GAAA6F,EAAK,EAAC,IAAI,CAAA,EAAlCnQ,EAAApC,EAAA4M,EAAK,WAAjB2F,EAAK,EAAC,MAAI/Q,EAAA2M,CAAA,IACd,IAAAsN,EAAG7Z,EAAA4Z,EAAA,CAAA,EAAH3O,EAAA9K,EAAA0Z,EAAG,EAAA,EAFJhZ,EAAA8Y,CAAI,MAIJhN,EAAI3M,EAJJ2Z,EAAG,CAAA,EAIHvO,GAAAjL,EAAAwM,EAAI,EAAA,EANL9L,EAAA6Y,CAAI,QAI+Bpa,EAAA2L,EAAA0F,EAAK,EAAC,IAAI,WAEf,CAAA,IAAAkH,GAAWlH,EAAK,EAAC,EAAE,CAAC,GANlDnQ,EAAApC,EAAAsb,CAAI,SAWJ,IAAAI,EAAG9N,GAAA,EACF7H,EAAYjF,EADb4a,CAAI,EACHpa,GAAAyE,EAAY,OAAA,yBAAA,EAAZ8E,EAAA9E,EAAY,EAAA,eAAA,MACZ4V,EAAI/Z,EADJmE,EAAY,CAAA,EACZ6V,EAAA7Z,EAAA4Z,EAAI,EAAA,EACJE,EAAIja,EADJ+Z,EAAI,CAAA,EACJ3N,EAAAjM,EAAA8Z,EAAI,EAAA,EAHLpZ,EAAAiZ,CAAI,QAEuBxa,EAAA0a,EAAArJ,EAAK,EAAC,IAAI,UACjB,CAAA,IAAAkH,GAAWlH,EAAK,EAAC,EAAE,CAAC,GAHxCnQ,EAAApC,EAAA0b,CAAI,aAQJI,EAAOC,GAAA,EACNC,IADDF,CAAO,EAEL3V,IADD6V,CAAO,EACN1a,GAAA6E,EAAY,OAAA,6BAAA,EAAZ0E,EAAA1E,EAAY,EAAA,eAAA,MACZ8V,EAAIra,EADJuE,EAAY,CAAA,EACZ+V,EAAAna,EAAAka,CAAK,EAAL9O,EAAAvL,EAAAqa,EAAI,CAAA,aAIH,IAAAE,GAAIC,GAAA,EAAJ3N,GAAA1M,EAAAoa,EAAK,yDACJ,KAAK,MAAM5J,EAAK,EAAC,UAAY,GAAI,MAAO,KAAK,MAAMA,EAAK,EAAC,WAAa,GAAI,IAD3EnQ,EAAApC,EAAAmc,EAAK,WADF5J,EAAK,EAAC,WAAaA,EAAK,EAAC,YAAU/Q,EAAAwN,CAAA,IAKvC,IAAAqN,EAAIza,EAAAuL,EAAA,CAAA,EAAJmP,GAAAva,EAAAsa,EAAI,EAAA,IAVLL,CAAO,UAAPA,EAAO,CAAA,cAaN,IAAAO,GAAGjO,GAAA,EAAH0H,GAAAuG,GAAG,IAAgCtG,GAAe1D,EAAK,EAAC,OAAO,EAAC,EAAA,EAAhE9P,EAAA8Z,EAAI,EAAJna,EAAApC,EAAAuc,EAAI,UAEJ,IAAArV,GAACsV,GAAA,EAADpa,EAAApC,EAAAkH,EAAE,WAHCqL,EAAK,EAAC,QAAO/Q,EAAAyN,EAAA,EAAAzN,EAAAiM,GAAA,EAAA,MAblBqO,CAAO,QAIa5a,EAAAgb,EAAA,oBAAA3J,EAAK,EAAC,UAAY,SAAW,cAAgB,gBAAgB,EAAA,WAO5D,CAAA,IAAAkH,GAAWlH,EAAK,EAAC,EAAE,CAAC,OAXzCuJ,CAAO,uCAqBN,IAAAW,EAAOC,GAAA,EACNC,EAAO7b,EADR2b,CAAQ,EAENjS,KADDmS,CAAO,EACNrb,GAAAkJ,GAAY,OAAA,2BAAA,EAAZK,EAAAL,GAAY,EAAA,eAAA,MACZoS,EAAIhb,EADJ4I,GAAY,CAAA,EACZqD,GAAA/M,EAAA8b,CAAK,8FAIHrK,EAAK,EAAC,UACL,IAAKxK,GAAM,GAAGA,EAAE,MAAM,KAAKwK,IAAM,UAAUxK,EAAE,QAAQ,GAAK,GAAG,EAAE,EAC/D,KAAK,KAAK,wBALRwK,EAAK,EAAC,SAAQ/Q,GAAA+N,EAAA,EAAA/N,GAAAmN,EAAA,EAAA,IADnBlM,EAAAma,CAAK,MASLhS,GAAYhJ,EATZgb,EAAI,CAAA,EASJ/R,EAAAD,GAAY,EAAA,8BAAA,EAAZtJ,GAAAsJ,GAAY,OAAA,WAAA,IAXb+R,CAAO,MAaPE,KAbAF,EAAO,CAAA,EAaPpW,GAAAsW,GAAG,GAAA,IACItK,EAAK,EAAC,UAAaxK,IAAGA,GAAE,SAAQ,CAAA/H,GAAb+H,KAAC,CACzB,IAAA+U,EAAGC,GAAA,EACFC,EAAIlc,EADLgc,CAAI,EACHG,EAAAlb,EAAAib,EAAI,EAAA,EACJ3R,GAACzJ,EADDob,EAAI,CAAA,EACJE,GAAAnb,EAAAsJ,GAAC,EAAA,EAAD6C,GAAAtM,EAAAyJ,GAAC,CAAA,eACKhL,EAAA0H,EAAC,EAAC,QAAW8D,IAAKA,GAAI,MAAK,CAAA7L,GAAd6L,KAAG,CACrB,IAAAsR,GAAGxN,GAAA,SAAH,IAAAyN,GAAArb,EAAAob,GAAG,EAAA,SAAHE,GAAAxS,EAAAsS,GAAG,EAAA,+BAAA,KAAAE,GAAA,QAAsC9K,IAAM,UAAUlS,EAAA0H,EAAC,EAAC,QAAQ,IAAM1H,EAAAwL,EAAG,EAAC,QAC5E3K,EAAAkc,GAAA/c,EAAAwL,EAAG,EAAC,KAAK,IADVzJ,EAAApC,GAAAmd,EAAI,gCAKJ,IAAAG,GAAGhT,GAAA,EAAHiT,GAAAxb,EAAAub,GAAG,EAAA,EAAgCrc,EAAA,IAAAC,EAAAqc,GAAAhL,EAAK,EAAC,UAAUlS,EAAA0H,EAAC,EAAC,QAAQ,CAAC,CAAA,EAA9D3F,EAAApC,GAAAsd,EAAI,YADD/K,EAAK,EAAC,SAAW,CAAClS,EAAA0H,EAAC,EAAC,QAAQ,KAAMJ,IAAMA,GAAE,QAAU4K,EAAK,EAAC,UAAUlS,EAAA0H,EAAC,EAAC,QAAQ,CAAC,CAAC,4BARrFtF,EAAAqa,CAAI,SAC2B5b,EAAA+b,EAAA5c,EAAA0H,EAAC,EAAC,MAAM,EACd7G,EAAAgc,GAAA7c,EAAA0H,EAAC,EAAC,QAAQ,IAFnC3F,EAAApC,GAAA8c,CAAI,IAFNra,EAAAoa,EAAI,EAdLpa,EAAAga,CAAQ,EAARra,EAAApC,EAAAyc,CAAQ,UAkCA,IAAAvQ,EAAAzL,EAAA,IAAA8R,IAAM,KAAElS,EAAK0Y,EAAS,EAAG1B,GAAU,EAAG,IAAI,EACtC9B,EAAA9U,EAAA,IAAAsV,EAAY,IAAK,YAAY,EACjCyH,GAAA/c,EAAA,IAAA8R,IAAM,KAAElS,EAAK0Y,EAAS,KAAII,EAAY,CAAA,EAJ9CsE,GAAAzd,EAAA,kBACKuS,EAAK,sFAIF,OAACnT,GAASwF,EAAA,aAAaxF,CAAI,EAC3B,OAACqJ,GAAS7D,EAAA,iBAAiB6D,CAAI,EAC1B,YAAA,IAAAC,GAAOwQ,GAAY3G,EAAK,EAAC,GAAE,EAAA,YAGxC,IAAAmL,EAAG9P,GAAA,EACF3B,EAAYnL,EADb4c,CAAI,EACHpc,GAAA2K,EAAY,OAAA,2BAAA,EAAZpB,EAAAoB,EAAY,EAAA,eAAA,MACZ0R,GAAI/b,EADJqK,EAAY,CAAA,EACZ2R,EAAA7b,EAAA4b,EAAK,EAGLE,GAAIjc,EAHJ+b,GAAI,CAAA,EAGJG,GAAA/b,EAAA8b,GAAI,EAAA,EALLpb,EAAAib,CAAI,+DAGqB,IAAAnL,EAAK,EAAC,UAAU,IAAKxK,GAAMA,EAAE,MAAM,EAAE,KAAK,KAAK,EAEpD,IAAA0R,GAAWlH,EAAK,EAAC,EAAE,IALvCnQ,EAAApC,EAAA0d,CAAI,WA3CDnL,EAAK,EAAC,SAAWA,EAAK,EAAC,cAgClBA,EAAK,EAAC,KAAElS,EAAK0Y,EAAS,GAAIK,GAAa7G,EAAK,EAAC,EAAE,EAAC/Q,EAAAuc,EAAA,CAAA,EAAAvc,EAAAwc,EAAA,EAAA,mBAoBjC,IAAA9R,EAAAzL,EAAA,IAAA+X,GAAWjG,EAAK,EAAC,IAAI,CAAC,EAAtCkD,EAAKzV,EAAA,IAACuS,EAAK,EAAC,GAAE,IAAAlS,EAAA6L,CAAA,CAAA,aADdqG,IAAM,OAAS,QAAUiG,GAAWjG,IAAM,IAAI,CAAC,SAIvD,IAAA0L,EAAGjd,GAAA,EAAHgV,GAAAiI,EAAG,IAAwChI,GAAe1D,EAAK,EAAC,IAAI,EAAC,EAAA,EAArE9P,EAAAwb,CAAI,EAAJ7b,EAAApC,EAAAie,CAAI,UAEJ,IAAAC,EAAOC,GAAA,EACNC,EAAOtd,EADRod,CAAQ,EAENpP,IADDsP,CAAO,EACN9c,GAAAwN,EAAY,OAAA,4BAAA,EAAZjE,EAAAiE,EAAY,EAAA,eAAA,UADbsP,CAAO,MAIPC,IAJAD,EAAO,CAAA,EAIPE,EAAAvc,EAAAsc,EAAG,EAAA,EALJ5b,EAAAyb,CAAQ,EAKoBjd,EAAA,IAAAC,EAAAod,EAAA/L,EAAK,EAAC,IAAI,CAAA,EALtCnQ,EAAApC,EAAAke,CAAQ,eAQD3K,EAAK9S,EAAA,IAAGkZ,GAAWpH,EAAK,EAAC,MAAOA,IAAM,IAAI,CAAC,EAC3CgM,QAAahM,EAAK,EAAC,QAAU,MAAQ,EAAEA,EAAK,EAAC,OAASA,EAAK,EAAC,OAAO,GAAG,EACtEiM,QAAMlH,GAAS,EAAC/E,EAAK,EAAC,EAAE,CAAC,EACzBkM,EAAKhe,EAAA,IAAGJ,EAAAme,CAAG,GAAE,QAAUne,EAAAme,CAAG,EAAC,SAASne,EAAAme,CAAG,EAAC,SAAS,OAAS,CAAC,EAAI,IAAI,EAC1E,IAAAE,EAAAC,GAAA,QAWC,IAAAC,EAAO9d,EAXR4d,CAAA,EAYEG,IADDD,CAAO,EACN/T,EAAAgU,EAAY,EAAA,yBAAA,EAAZ5d,EAAAiL,GAAA5K,GAAAud,EAAY,OAAA3S,CAAA,EAAA,CAAA,IAAyBmE,GAASkC,IAAM,IAAI,CAAC,CAAA,EAAzD,IAAAuM,GAAAld,EAAAid,EAAY,CAAA,wBAEXE,EAAI/a,GAAAgb,CAAA,EACHC,GAAIne,EADLie,CAAK,EACJG,GAAAnd,EAAAkd,GAAI,EAAA,EAAJzQ,GAAA5M,EAAAqd,GAAI,CAAA,eACe,IAAAE,GAAIC,GAAA,EAAJC,EAAAtd,EAAAod,GAAI,EAAA,EAAqBle,EAAA,IAAAC,EAAAme,EAAAhf,EAAAme,CAAG,EAAC,SAAS,CAAA,EAAtCpc,EAAApC,GAAAmf,EAAK,aAApB9e,EAAAme,CAAG,EAAC,WAAShd,GAAA8d,EAAA,gCAEhB,IAAAC,GAAIC,GAAA,EAAJ3Q,EAAA/N,EAAAye,EAAK,EAA0BE,GAAS5Q,EAAA,YAAO,OAAAxO,EAAAoe,CAAK,EAAC,oBAAe,OAAApe,EAAAoe,CAAK,EAAC,WAA1Ehc,EAAA8c,EAAK,EAALnd,EAAApC,GAAAuf,EAAK,WAEL,IAAAG,GAAIC,GAAA,EAAJC,EAAA7d,EAAA2d,EAAK,eAAqBrf,EAAAme,CAAG,EAAC,SAAS,QAAM,EAAA,QAAA,CAAA,EAA7Cpc,EAAApC,GAAA0f,EAAK,aAHFrf,EAAAoe,CAAK,SAEApe,EAAAme,CAAG,EAAC,SAAS,OAAS,GAAChd,GAAAqe,GAAA,CAAA,IALjCpd,EAAAsc,CAAK,EAAL,IAAAe,GAAAle,EAAAmd,EAAI,CAAA,eAUH,IAAAgB,GAAAC,GAAA,EAOCC,EAAYnf,EAPbif,EAAA,EAOCze,GAAA2e,EAAY,OAAA,iBAAA,EAAZpV,EAAAoV,EAAY,EAAA,eAAA,EAPbxd,EAAAsd,EAAA,EAAA9e,EAAAiL,GAAA8D,GAAA+P,GAAA,OAAA7T,CAAA,EAAA,CAAA,IAEMtH,EAAA,UAAUvE,EAAAme,CAAG,EAAC,OAAO,CAAC,CAAA,EAF5Bxb,GAAA,QAAA+c,GAKU3b,GAAMA,EAAE,iBAAiB,EALnChC,EAAApC,GAAA+f,EAAA,mCATyB9e,EAAA,IAAAC,EAAAge,GAAA7e,EAAAme,CAAG,EAAC,aAAejM,IAAM,OAAO,CAAA,iBAqBnD,MAAA2N,QAAQtb,EAAA,SAAWub,GAAe5N,GAAK,EAAI,IAAI,aADtD6N,GAAIpc,GAAAqc,CAAA,EAAJjR,GAAAtO,EAAAsf,EAAK,EAA0BX,GAASrQ,GAAA,YAAO,OAAAmD,EAAK,EAAC,oBAAe,OAAAA,EAAK,EAAC,WAA1E9P,EAAA2d,EAAK,EAAL,IAAA5Q,GAAA5N,EAAAwe,GAAI,CAAA,eAGH,IAAAE,GAAAC,GAAA,EASCC,GAAY1f,EATbwf,EAAA,EASChf,GAAAkf,GAAY,OAAA,sBAAA,EAAZ3V,EAAA2V,GAAY,EAAA,eAAA,EATb/d,EAAA6d,EAAA,SAAAtQ,GAAAsQ,GAAA,OAAApU,EAAA,KAAAoU,GAAA,QAAA,gBAGqBjgB,EAAA6f,CAAK,EAAC,KAAO,YAAY7f,GAAK,EAAC,IAAI,GAAK,EAAE,EAAA,GADzD,CAAA,IAAAuE,EAAA,SAASvE,GAAK,EAAC,KAAMA,EAAA6f,CAAK,EAAC,IAAI,CAAC,GAFtCld,GAAA,QAAAsd,GAOUlc,IAAMA,GAAE,iBAAiB,EAPnChC,EAAApC,GAAAsgB,EAAA,aADGjgB,EAAA6f,CAAK,GAAAtb,EAAA,UAAYpD,GAAAif,EAAA,uBAxBlBjC,CAAG,EAAAhd,EAAAkf,CAAA,EAAAlf,EAAAmf,GAAA,EAAA,kCAuCNC,EAAQ7b,GAAA,WAAR6b,EAAQ,OAEFrO,IAAM,OAAO,GAAK,YAAc,0BAA0B,CAAA,UAFhEqO,EAAQ,EAAA,eACYrO,EAAK,EAAC,OAAO,GAAK,KAAO,MAAM,GAAA,eAAA,CAAA,MADnDqO,CAAQ,UAKR,IAAAC,EAAY9b,GAAA,EAAZ8F,EAAAgW,EAAY,EAAA,wCAAA,EAAZvf,GAAAuf,EAAY,OAAA,aAAA,EAAZze,EAAApC,EAAA6gB,CAAa,YANVtO,EAAK,EAAC,OAAM/Q,EAAAsf,CAAA,EAAAtf,EAAAuf,GAAA,EAAA,MAxCjBnC,CAAO,WAAPA,EAAO,CAAA,cAkDN,IAAAoC,EAAGC,GAAA,EACFC,EAAGpgB,EADJkgB,CAAI,EACHG,GAAArgB,EAAAogB,CAAI,cACY,IAAAE,EAAIC,GAAA,EAAJC,GAAAvf,EAAAqf,EAAI,EAAA,EAAqBngB,EAAA,IAAAC,EAAAogB,GAAAjhB,EAAAme,CAAG,EAAC,KAAK,CAAA,EAAlCpc,EAAApC,EAAAohB,CAAK,YAAhB/gB,EAAAme,CAAG,EAAC,OAAKhd,EAAA+f,EAAA,IACb,IAAAC,GAAI5f,EAAAuf,GAAA,CAAA,EAAJM,GAAA1f,EAAAyf,EAAK,EAALE,GAAA9f,EAAA4f,GAAI,CAAA,cACa,IAAAG,EAAIC,GAAA,EAAJxf,EAAApC,EAAA2hB,CAAK,YAAlBthB,EAAAme,CAAG,EAAC,SAAOhd,EAAAqgB,EAAA,IAHhBpf,EAAAye,CAAI,EAAJ,IAAAY,GAAAlgB,EAAAsf,EAAG,CAAA,cAMF,IAAAa,EAAGC,GAAA,EAAHC,GAAAlgB,EAAAggB,CAAI,EAAuB9gB,EAAA,IAAAC,EAAA+gB,GAAA,GAAA5hB,EAAAme,CAAG,EAAC,SAAO,EAAA,0BAAA,CAAA,EAAtCpc,EAAApC,EAAA+hB,CAAI,YADD1hB,EAAAme,CAAG,EAAC,QAAU,GAAChd,EAAA0gB,EAAA,QAGnBC,GAAEvgB,EAAAkgB,GAAA,CAAA,KAAFK,GAAE,GAAA,IACK9hB,EAAAme,CAAG,EAAC,SAAY4D,GAAKA,EAAI,GAAE,CAAApiB,EAAXoiB,IAAG,CACxB,IAAAC,GAAEC,GAAA,aACDC,GAAYzhB,EADbuhB,EAAG,EACFxX,EAAA0X,GAAY,EAAA,yBAAA,EAAZthB,EAAAiL,IAAA5K,GAAAihB,GAAY,OAAArW,EAAA,EAAA,CAAA,IAAyBmE,GAAShQ,EAAA+hB,CAAG,EAAC,IAAI,CAAC,CAAA,MACvDI,GAAI5gB,EADJ2gB,GAAY,CAAA,EACZE,GAAA3hB,EAAA0hB,EAAK,EAAc/C,GAASgD,GAAA,YAAO,OAAApiB,EAAA+hB,CAAG,EAAC,oBAAe,OAAA/hB,EAAA+hB,CAAG,EAAC,WAA1D3f,EAAA+f,EAAK,EAFN/f,EAAA4f,EAAG,EAAHphB,EAAA,IAAAyhB,GAAA7X,EAAAwX,GAAE,EAAA,gBAAA,KAAAK,GAAA,SAAgBriB,EAAA+hB,CAAG,EAAC,KAAO,YAAoB/hB,EAAA+hB,CAAG,EAAC,KAAO,MAA5DhgB,EAAApC,EAAAqiB,EAAG,MAFLF,EAAE,WAAFA,GAAE,CAAA,cASD,IAAAQ,EAAGC,GAAA,EAGFC,GAAGjhB,EAAAd,EAHJ6hB,CAAI,EAAD,CAAA,EAGF3M,GAAA6M,GAAG,IAAyB5M,GAAe5V,EAAAme,CAAG,EAAC,MAAM,EAAC,EAAA,EAAtD/b,EAAAogB,EAAI,EAHLpgB,EAAAkgB,CAAI,EAAJvgB,EAAApC,EAAA2iB,CAAI,YADDtiB,EAAAme,CAAG,EAAC,QAAMhd,EAAAshB,EAAA,IAjBfrgB,EAAAue,CAAI,gBAGuB3gB,EAAAme,CAAG,EAAC,SAAS,QAAM,EAAA,QAAA,CAAA,EAH9Cpc,EAAApC,EAAAghB,CAAI,UA0BL,IAAA+B,EAAGC,GAAA,QAAH,IAAAC,GAAAniB,EAAAiiB,CAAI,eAEF,IAAAG,GAAOC,GAAA,EACN5Y,GAAMzJ,EADPoiB,EAAQ,SACP3Y,EAAM,CAAA,cAEiB,IAAA6Y,EAAIC,GAAA,EAAJC,GAAAvhB,EAAAqhB,EAAI,EAAA,sBAAoB7Q,EAAK,EAAC,MAAM,KAAK,MAAM,GAAG,EAAE,IAAG,CAAE,CAAA,EAAzDnQ,EAAApC,EAAAojB,CAAK,YAAvB7Q,EAAK,EAAC,MAAM,MAAI/Q,EAAA+hB,EAAA,MAFrBhZ,EAAM,EAIN,IAAAjI,KAJAiI,GAAM,CAAA,EAINhE,GAAAjE,UAAwBiQ,EAAK,EAAC,MAAM,YAASiR,IAAI,aAAWC,GAAIzf,GAAA0f,EAAA,EAAJC,GAAA5hB,EAAA0hB,GAAI,EAAA,EAAJG,GAAAhiB,EAAA6hB,GAAI,EAAA,EAAA;4BAAoDpjB,EAAAmjB,CAAI,EAAC,MAAKK,GAAA,CAAA7jB,GAAI8jB,KAAE,aAAWC,GAAA/f,GAAA+K,EAAA,EAAAiV,GAAAjiB,EAAAgiB,GAAA,EAAA,EAAAE,GAAAriB,EAAAmiB,GAAA,EAAA,EAAA;SAAAlZ,EAAAkZ,GAAA,EAAA7X,GAAA,eAAA,SACrD4X,EAAE,CAAA,IAAnF,IAAAI,GAAA7jB,EAAAyjB,EAAE,EAAC,WAAW,GAAG,EAAI,WAAazjB,EAAAyjB,EAAE,EAAC,WAAW,GAAG,EAAI,WAAa,UAAU,eADH7iB,EAAA,IAAAC,EAAAyiB,GAAAtjB,EAAAmjB,CAAI,EAAC,MAAM,CAAA,cAA/FlhB,EAAG,EALJG,EAAAygB,EAAQ,EAAR9gB,EAAApC,GAAAkjB,EAAQ,WASR,IAAAiB,GAAOC,GAAA,EAAPC,GAAAziB,EAAAd,EAAAqjB,EAAQ,EAAD,CAAA,cAGL,IAAApX,EAAGuX,GAAA,EAAHC,GAAA3iB,EAAAd,EAAAiM,CAAI,CAAD,EAAHtK,EAAAsK,CAAI,EAA8C9L,EAAA,IAAAC,EAAAqjB,GAAA,IAAAlkB,EAAAkT,CAAK,EAAC,KAAG,EAAA,EAAA,CAAA,EAA3DnR,EAAApC,EAAA+M,CAAI,YADD1M,EAAAkT,CAAK,EAAC,KAAG/R,EAAAgjB,EAAA,gCAGPnkB,EAAAkT,CAAK,EAAC,MAASkR,GAAOA,EAAM,IAAG,CAAAzkB,EAAhBykB,IAAK,CACzB,IAAAC,GAAGC,GAAA,EAAaC,GAAI9jB,EAApB4jB,EAAI,EAAYG,GAAA9iB,EAAA6iB,GAAI,EAAA,EAA8BE,GAAIljB,EAAtCgjB,EAAK,EAA6BG,GAAAhjB,EAAA+iB,GAAI,EAAA,EAAtDriB,EAAAiiB,EAAI,SAA4BxjB,EAAA2jB,GAAAxkB,EAAAokB,CAAK,EAAC,GAAG,EAAyBvjB,EAAA6jB,GAAA1kB,EAAAokB,CAAK,EAAC,KAAK,IAA7EriB,EAAApC,EAAA0kB,EAAI,gCAECrkB,EAAAkT,CAAK,EAAC,KAAQkR,GAAOA,EAAM,IAAG,CAAAzkB,EAAhBykB,IAAK,CACxB,IAAAO,GAAGC,GAAA,EACFC,GAAIpkB,EADLkkB,EAAI,EACHG,GAAApjB,EAAAmjB,GAAI,EAAA,EACJE,GAAGxjB,EADHsjB,GAAI,CAAA,EACJG,GAAAtjB,EAAAqjB,GAAG,EAAA,EAFJ3iB,EAAAuiB,EAAI,SACa9jB,EAAAikB,GAAA9kB,EAAAokB,CAAK,EAAC,GAAG,EACpBvjB,EAAAmkB,GAAAhlB,EAAAokB,CAAK,EAAC,KAAK,IAFjBriB,EAAApC,EAAAglB,EAAI,IATNviB,EAAA0hB,EAAQ,EAAR/hB,EAAApC,GAAAmkB,EAAQ,aAVL5R,EAAK,EAAC,MAAK/Q,GAAA8jB,EAAA,GASNjlB,EAAAkT,CAAK,EAAC,KAAOlT,GAAK,EAAC,MAAM,OAAS,GAAKA,EAAAkT,CAAK,EAAC,KAAK,OAAS,IAAC/R,GAAA+jB,GAAA,CAAA,gCAkBpE,IAAAC,GAAOC,GAAA,aACNC,GAAM5kB,EADP0kB,EAAQ,EACPG,GAAA5jB,EAAA2jB,GAAM,EAAA,EAANE,GAAAhkB,EAAA8jB,GAAM,CAAA,eACAnT,EAAK,EAAC,OAAO,QAAU,UAAMsT,KAAI,CAC/B,MAAAC,SAAM,yBAAyB,mBAAkBzlB,EAACwlB,EAAI,EAAC,EAAE,EAChE,IAAAE,GAACC,GAAA,EACAC,GAAGlkB,EADJgkB,EAAE,YAAFA,YAA6BD,EAAG,CAAA,EAC/B9V,GAAAiW,WAAKH,EAAG,CAAA,KAARG,GAAG,MAAA/Z,EAAA,GAAY,CAAA,IAAA7L,EAAAwlB,EAAI,EAAC,MAAM,GAAG,EAAE,IAAG,CAAE,GADrCzjB,EAAApC,GAAA+lB,EAAE,8BAKF,IAAAG,GAAGC,GAAA,EAAHC,GAAArkB,EAAAmkB,GAAG,EAAA,EAAEjlB,EAAA,IAAAC,EAAAklB,GAAA7T,EAAK,EAAC,OAAO,QAAU,aAAa,CAAA,EAAzCnQ,EAAApC,GAAAkmB,EAAK,aADF3T,EAAK,EAAC,OAAO,QAAU,CAACA,EAAK,EAAC,OAAO,SAAM/Q,GAAA6kB,CAAA,IARhD5jB,EAAA+iB,EAAQ,SAARc,GAAAzb,EAAA2a,GAAO,EAAA,4BAAA,KAAAc,GAAA,CAAA,GAA+B/T,EAAK,EAAC,OAAO,GAAE,KAAc,CAACA,IAAM,OAAO,GAAE,EACxDrR,EAAAykB,GAAApT,EAAK,EAAC,OAAO,GAAK,SAAW,OAAO,IAD/DnQ,EAAApC,GAAAwlB,EAAQ,aADLnlB,EAAAke,CAAU,GAAIhM,EAAK,EAAC,QAAM/Q,GAAA+kB,EAAA,IA3B/B9jB,EAAAsgB,CAAI,EAAJ9hB,EAAA,IAAAulB,EAAA3b,EAAAkY,EAAG,EAAA,4BAAA,KAAAyD,EAAA,CAAA,UAAoCnmB,EAAAke,CAAU,GAAI,CAAChM,EAAK,EAAC,KAAK,CAAA,CAAA,EAAjEnQ,EAAApC,EAAA+iB,CAAI,cA3BAvE,CAAG,EAAAhd,EAAAilB,EAAA,EAAAjlB,EAAAklB,GAAA,EAAA,IA5DRjkB,EAAAic,CAAA,SAAAiI,EAAA9b,EAAA6T,EAAA,EAAA,8BAAA,KAAAiI,EAAA,CAEa,MAAApU,EAAK,EAAC,QAAQ,KAAO,GACrB,MAAAlS,EAAAme,CAAG,GAAI,UAHpBE,EAAA,gBAIenM,EAAK,EAAC,EAAE,EAJvBmM,EAAA,KAKMpG,GAAO/F,EAAK,EAAC,EAAE,GAAK,iBAL1BmM,EAMWta,GAAM,CAChBkU,GAAO/F,EAAK,EAAC,EAAE,EAAInO,EAAE,cAAc,KAC/B/D,EAAAme,CAAG,GAAI,CAACne,EAAAme,CAAG,EAAC,MAAQpa,EAAE,cAAc,MAAMQ,mBAAiBvE,EAAAme,CAAG,EAAC,OAAO,CAC3E,CAAC,EATDpc,EAAApC,EAAA0e,CAAA,WAjJGnM,EAAK,EAAC,OAAS,YAwBVA,EAAK,EAAC,OAAS,SAAQ/Q,EAAAyM,EAAA,CAAA,EAYvBsE,EAAK,EAAC,OAAS,OAAM/Q,EAAA4M,EAAA,CAAA,EASrBmE,IAAM,OAAS,YAAW/Q,EAAAkN,EAAA,CAAA,EAQ1B6D,EAAK,EAAC,OAAS,UAAS/Q,EAAAolB,EAAA,CAAA,EAsBxBrU,EAAK,EAAC,OAAS,MAAK/Q,EAAAqlB,EAAA,CAAA,EAAAxmB,EAAAymB,EAAA,EAAAtlB,EAAAulB,EAAA,CAAA,EAsDpBxU,EAAK,EAAC,OAAS,OAAM/Q,EAAAwlB,GAAA,CAAA,EAGrBzU,EAAK,EAAC,OAAS,mBAQfA,IAAM,OAAS,QAAM/Q,EAAAylB,EAAA,CAAA,YA5LhC,IAAAC,GAAApmB,EAAAsZ,EAAI,cAEF,IAAA+M,EAAGC,GAAA,EACFC,EAAYvmB,EADbqmB,CAAI,EACHtc,EAAAwc,EAAY,EAAA,oBAAA,EAAZ/lB,GAAA+lB,EAAY,OAAA,aAAA,EAAZC,GAAAD,EAAY,kBAAA,QADb5kB,EAAA0kB,CAAI,EAAJ/kB,EAAApC,EAAAmnB,CAAI,UAOJ,IAAAI,EAAGC,GAAA,EACFC,EAAY3mB,EADbymB,CAAI,EACHjmB,GAAAmmB,EAAY,OAAA,2BAAA,EAAZH,GAAAG,EAAY,kBAAA,EAAZ5c,EAAA4c,EAAY,EAAA,eAAA,QADbhlB,EAAA8kB,CAAI,EAAJnlB,EAAApC,EAAAunB,CAAI,UAKJ,IAAAG,EAAGC,GAAA,EACFC,EAAY9mB,EADb4mB,CAAI,EACHpmB,GAAAsmB,EAAY,OAAA,6BAAA,EAAZN,GAAAM,EAAY,kBAAA,EAAZ/c,EAAA+c,EAAY,EAAA,eAAA,QADbnlB,EAAAilB,CAAI,EAAJtlB,EAAApC,EAAA0nB,CAAI,YAbA9iB,EAAA,OAKI,CAACA,EAAA,WAAamR,KAAgBA,MAAiB,OAAMvU,EAAAqmB,GAAA,CAAA,EAOpDjjB,EAAA,WAASpD,EAAAsmB,GAAA,CAAA,EAZRtmB,EAAAumB,EAAA,+BAoBV,IAAAC,EAAGC,GAAA,EACFriB,EAAM9E,EADPknB,CAAI,EAEFE,EAAYpnB,EADb8E,CAAO,EACN3E,EAAA,IAAAK,GAAA4mB,EAAY,OAAO1Q,KAAiB,cAAgB,uBAAuB,CAAA,EAA3E3M,EAAAqd,EAAY,EAAA,eAAA,EAAZ,IAAAC,EAAAvmB,EAAAsmB,CAAa,EADdzlB,EAAAmD,CAAO,MAKPwiB,EAAIxmB,EALJgE,EAAM,CAAA,EAKNyiB,EAAAtmB,EAAAqmB,CAAK,EANN3lB,EAAAulB,CAAI,SACHpiB,WAA+B4R,GAAc,UAG5CA,GAAc,EAAG,WAAa,cAAc,EAAA,EAEjBtW,EAAAmnB,EAAA,GAAA9Q,GAAU,eAASA,GAAU,IAAK,EAAI,QAAU,SAAS,EAAA,eALrF3R,EAAwD,IAAMhB,EAAA,gBAAA,CAAiB,EADhFxC,EAAApC,EAAAgoB,CAAI,YADDzQ,GAAU,EAAG,GAAC/V,EAAA8mB,EAAA,mBAkTZ/hB,GAAAgiB,GAAA,GAAA,IAAAloB,EAAAkU,EAAK,EAAIiU,GAAMA,EAAK,MAAXA,IAAI,OA4BXC,EAAOhoB,EAAA,IAAGJ,IAAS,EAAC,IAAIA,EAAAmoB,CAAI,EAAC,EAAE,CAAC,gCAxBtC,IAAAE,EAAAC,GAAA,EAKCC,GAAO9nB,EALR4nB,CAAA,EAMEG,KADDD,EAAO,EACN/d,EAAAge,GAAY,EAAA,yBAAA,EAAZvnB,GAAAunB,GAAY,OAAA,oBAAA,MACZC,GAAIlnB,EADJinB,GAAY,CAAA,EACZE,EAAAhnB,EAAA+mB,GAAI,EAAA,EAAJE,EAAApnB,EAAAknB,GAAI,CAAA,wBAEHG,EAAIjlB,GAAAmL,CAAA,EAAJ+Z,EAAAnnB,EAAAknB,CAAK,EACLE,EAAYvnB,EADZqnB,EAAI,CAAA,EACJpe,EAAAse,EAAY,EAAA,gCAAA,EAAZ7nB,GAAA6nB,EAAY,OAAA,0BAAA,EADeloB,EAAA,IAAAC,EAAAgoB,EAAA,GAAA7oB,EAAAmoB,CAAI,EAAC,QAAM,EAAA,SAAA,CAAA,gBAGtC,IAAAY,EAAYrkB,GAAA,EAAZ8F,EAAAue,EAAY,EAAA,8BAAA,EAAZ9nB,GAAA8nB,EAAY,OAAA,WAAA,EAAZhnB,EAAApC,EAAAopB,CAAa,WAJV/oB,EAAAmoB,CAAI,EAAC,OAAS,EAAChnB,EAAA6nB,CAAA,EAAA7nB,EAAA8nB,EAAA,EAAA,MAHpBV,EAAO,MAUPW,IAVAX,GAAO,CAAA,EAUPriB,GAAAgjB,EAAG,GAAA,IACIlpB,EAAAmoB,CAAI,EAAC,QAAWjW,GAAOA,EAAM,GAAE,CAAAvS,EAAfuS,IAAK,CAClBhS,UAAIgS,CAAK,CAAA,IAFnB9P,EAAA8mB,CAAI,EAfL9mB,EAAAimB,CAAA,SAAAA,EAAA,KAEMpQ,GAAO,SAASjY,EAAAmoB,CAAI,EAAC,EAAE,EAAE,GAAKlQ,GAAOjY,EAAAmoB,CAAI,EAAC,EAAE,GAAK,GAK3BtnB,EAAA6nB,EAAA1oB,EAAAmoB,CAAI,EAAC,OAAO,IAPxCgB,GAAA,SAAAd,EAGWtkB,GAAOkU,GAAO,SAASjY,EAAAmoB,CAAI,EAAC,EAAE,EAAE,EAAIpkB,EAAE,cAAc,IAAI,EAHnEhC,EAAApC,EAAA0oB,CAAA,SAsBQnoB,UAAIioB,CAAI,CAAA,WAzBbnoB,EAAAmoB,CAAI,EAAC,OAAS,QAAOhnB,EAAAioB,CAAA,EAAAjoB,EAAAkoB,EAAA,EAAA,kCAgCb,IAAMtR,GAAS/X,EAAAooB,CAAO,EAAC,EAAE,GAAMpoB,EAAAooB,CAAO,EAAC,KAAEpoB,EAAK8X,EAAU,KAAGwR,IAAOvR,GAAS/X,EAAAooB,CAAO,EAAC,EAAE,EAAKkB,iBAD/FlS,GAAW,GAAE,MAAQ,IAAI,EAF/BmS,GAAA5pB,EAAA,qBACMyoB,CAAO,6EAGNoB,IAASjlB,EAAA,YAAYvE,EAAAooB,CAAO,EAAC,EAAGoB,EAAI,cALxCxpB,EAAAooB,CAAO,GAAA7jB,EAAA,aAAepD,EAAAsoB,CAAA,uCAad,IAAA5d,EAAAzL,EAAA,IAAAsV,EAAY,IAAK,YAAY,EAFzC0H,GAAAzd,EAAA,qBACQqX,GAAU,iCAEV,OAACjY,GAASwF,EAAA,aAAaxF,CAAI,EAC3B,OAACqJ,GAAS7D,EAAA,iBAAiB6D,CAAI,gBALpC6Q,EAAU,GAAA9X,EAAAuoB,CAAA,4BAYb,IAAAC,EAAGC,GAAA,EAAHC,EAAAppB,EAAAkpB,CAAI,EACHG,GAAqBD,EAAA,CAAA,MAAA,MAAA,CAAA,qCAEpBE,EAAIpmB,GAAAqmB,CAAA,EAAJC,EAAAvoB,EAAAqoB,EAAI,EAAA,EACJG,EAAI3oB,EADJwoB,EAAI,CAAA,EACJI,GAAA1pB,EAAAypB,CAAK,cAEHE,GAAKzqB,EAAA,+KACJ,IAAA0qB,EAAIC,GAAA,EAAJC,EAAA7oB,EAAA2oB,EAAI,EAAA,EAAmBzpB,EAAA,IAAAC,EAAA0pB,EAAA1T,EAAQ,EAAC,KAAK,CAAA,EAArC9U,EAAApC,EAAA0qB,CAAK,oCAFHxT,EAAQ,EAAC,OAAK1V,EAAAqpB,EAAA,8BAKDJ,GAAKzqB,EAAA,yKAA6C8X,EAAW,CAAA,CAAA,6CAA1EA,EAAW,GAAAtW,EAAAspB,CAAA,6BAEdL,GAAKzqB,EAAA,6JACHiB,EAAA,IAAAC,EAAA6pB,EAAA,GAAA7T,IAAS,OAAO,MAAQ,KAAO,IAAM,GAAG,IAAGA,IAAS,OAAO,OAAK,EAAA,SAAA,CAAA,0CAF/DA,EAAQ,EAAC,QAAM1V,EAAAwpB,CAAA,4BAKIP,GAAKzqB,EAAA,yBAA0B6X,oCAAO5W,EAAA,IAAAC,EAAA+pB,EAAA/T,EAAQ,EAAC,QAAQ,CAAA,0CAA1EA,EAAQ,EAAC,UAAQ1V,EAAA0pB,CAAA,IAZtBzoB,EAAA8nB,CAAK,EADwBtpB,EAAA,IAAAC,EAAAopB,EAAApT,EAAQ,EAAC,IAAI,CAAA,gBAgB1C,IAAAiU,EAAIC,GAAA,EAAJC,EAAAtpB,EAAAopB,EAAI,EAAA,EAAyBlqB,EAAA,IAAAC,EAAAmqB,EAAApU,EAAa,GAAI,UAAU,CAAA,EAAxD7U,EAAApC,EAAAmrB,CAAK,WAjBFjU,EAAQ,EAAA1V,EAAA8pB,CAAA,EAAA9pB,EAAA+pB,EAAA,EAAA,IAFb9oB,EAAAunB,CAAI,EAAJ5nB,EAAApC,EAAAgqB,CAAI,UAuBG,MAAAwB,IAAQzV,CAAY,EAC3B,IAAA0V,EAAGC,GAAA,EAAHC,EAAA7qB,EAAA2qB,CAAI,EACHtB,GAAqBwB,EAAA,sBAAEH,CAAK,KAC5B,IAAAI,EAAIhqB,EAAA+pB,EAAA,CAAA,EAAJE,EAAA/qB,EAAA8qB,CAAK,4XACAvrB,EAAA8Y,EAAY,OAEP9Y,EAAA0Y,EAAS,GAAA1Y,EAAIiZ,EAAU,EAAA9X,EAAAsqB,EAAA,CAAA,EAEvBzrB,EAAAmrB,CAAK,IAAK,aAAYhqB,EAAAuqB,EAAA,CAAA,EAAAvqB,EAAAwqB,EAAA,EAAA,IALhCvpB,EAAAmpB,CAAK,EAFNnpB,EAAAgpB,CAAI,EAAJxqB,EAAAiL,GAAAob,GAAAmE,EAAG,UAAAvf,GAAA,EAAA,EAAA,EAAA,CAAA,IAA2C+f,KAAmBT,CAAK,CAAA,EAAE,KAAK,CAAA,EAA7EppB,EAAApC,EAAAyrB,CAAI,WAzBD1V,EAAY,IAAK,OAAMvU,EAAA0qB,CAAA,GAuBlBnW,EAAY,IAAK,cAAgBA,EAAY,IAAK,YAASvU,EAAA2qB,GAAA,CAAA,8BAsBnE,IAAArmB,EAAAsmB,GAAA,EAOCC,EAAGzqB,EAAAd,EAPJgF,CAAA,EAAA,CAAA,EAOCwmB,EAAAvqB,EAAAsqB,EAAG,EAAA,EACHE,EAAI3qB,EADJyqB,EAAG,CAAA,EAEFG,EAAY1rB,EADbyrB,CAAK,EACJjrB,GAAAkrB,EAAY,OAAA,8BAAA,EAAZ3hB,EAAA2hB,EAAY,EAAA,eAAA,QADb/pB,EAAA8pB,CAAK,EARN9pB,EAAAqD,CAAA,YAOwBsR,GAAU,CAAA,CAAA,EAPlCpU,GAAA,QAAA8C,EAAA,YAAA2mB,EAAA,uCAAArqB,EAAApC,EAAA8F,CAAA,YAJGsR,GAAU,GAAA5V,EAAAkrB,EAAA,IAjafjqB,EAAA2X,EAAI,EAAJhY,EAAApC,EAAAoa,EAAI,MA9FG,uBCxUR,MAAMuS,GAAe,IAQd,MAAMC,WAAwBC,EAAkB,IAC5C3kB,MAA0B,CAAA,CAAE,CAAA,MAAtC,SAAA,uBAAA,QAAAiK,EAAA,qBAEYjK,MAAwC,CAAA,CAAE,CAAA,MAAtD,WAAA,uBAAA,UAAAiK,EAAA,kBAGC2a,GAAArsB,EAAA,IAAA,OAAO,YACN,OAAO,OAAO,KAAK,SAAS,EAC1B,OAAQ+d,GAAQA,EAAI,SAAS,EAC7B,IAAKA,GAAQ,CAACA,EAAI,UAAqBA,CAAG,CAAC,CAAA,CAC9C,MALD,iBAAA,uBAAA,gBAAArM,EAAA,kBAQUjK,GAA4B,IAAI,MAA1C,SAAA,uBAAA,QAAAiK,EAAA,qBAEQjK,GAAsB,IAAI,MAAlC,OAAA,uBAAA,MAAAiK,EAAA,qBAEYjK,GAAO,EAAK,MAAxB,WAAA,uBAAA,UAAAiK,EAAA,qBAEWjK,GAAO,CAAC,MAAnB,UAAA,uBAAA,SAAAiK,EAAA,qBAMajK,GAAO,CAAC,MAArB,YAAA,uBAAA,WAAAiK,EAAA,qBAEiBjK,GAAO,EAAK,MAA7B,gBAAA,uBAAA,eAAAiK,EAAA,kBAEQ,eAAsC,KAEtC,cAAgB,IAChB,UAA2B,KAE3B,QAAyB,KAEvB,UAAmB,CAC5B,MAAM4a,EAAW,OAAO,SAAS,WAAa,SAAW,OAAS,MAC5DC,EAAU,mBAAmB,KAAK,SAAU,EAC5CC,EAAQ,KAAK,QAAU,WAAW,mBAAmB,KAAK,OAAO,CAAC,GAAK,GAC7E,MAAO,GAAGF,CAAQ,KAAK,OAAO,SAAS,IAAI,iBAAiBC,CAAO,GAAGC,CAAK,oBAC5E,CAEU,cAAuB,CAChC,MAAO,cACR,CAEU,iBAA2B,CACpC,OAAO,KAAK,YAAc,IAC3B,CAEU,cAAcC,EAA2B,CAClD,IAAIC,EACJ,GAAI,CACHA,EAAO,KAAK,MAAMD,EAAM,IAAI,CAC7B,MAAQ,CACP,MACD,CACA,OAAQC,EAAK,KAAA,CACZ,IAAK,WACJ,KAAK,cAAcA,CAAI,EACvB,MACD,IAAK,UACJ,KAAK,aAAaA,CAAI,EACtB,MACD,IAAK,UACJ,KAAK,aAAaA,CAAI,EACtB,MACD,IAAK,YACJ,KAAK,eAAeA,EAAK,SAAS,EAClC,MACD,IAAK,UACJ,KAAK,QAAUA,EAAK,QACpB,MACD,IAAK,QACJ,KAAK,MAAQA,EAAK,MAClB,KACF,CACD,CAEQ,cAAcC,EAAwB,CAC7C,KAAK,QAAUA,EAAI,QACnB,KAAK,UAAYA,EAAI,UACrB,KAAK,WAAaA,EAAI,WACtB,KAAK,cAAA,EACL,KAAK,QAAUA,EAAI,SAAW,KAC9B,KAAK,MAAQA,EAAI,OAAS,KAC1B,KAAK,QAAA,EACL,KAAK,UAAY,CAAA,EACjB,KAAK,eAAeA,EAAI,WAAa,CAAA,CAAE,CACxC,CAGQ,aAAaA,EAAuB,CAE3C,MAAMC,EAAQD,EAAI,QAAQ,OAAQ7a,GAAU,CAAC,KAAK,UAAU,IAAIA,EAAM,EAAE,CAAC,EACrE8a,EAAM,OAAS,IAClB,KAAK,QAAU,CAAC,GAAGA,EAAO,GAAG,KAAK,OAAO,EACzC,KAAK,WAAaD,EAAI,WACtB,KAAK,QAAA,GAEN,KAAK,cAAA,CACN,CAGQ,eAAsB,CAC7B,KAAK,eAAiB,GACtB,KAAK,iBAAA,EACL,KAAK,eAAiB,IACvB,CAEQ,SAAgB,CACvB,KAAK,UAAY,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC7a,EAAO,IAAM,CAACA,EAAM,GAAI,CAAC,CAAC,CAAC,CACvE,CAQA,aAA6B,CAS5B,OARI,KAAK,YAAc,GAAK,KAAK,gBAQ7B,CAPS,KAAK,KACjB,KAAK,UAAU,CACd,KAAM,kBACN,OAAQ,KAAK,WACb,MAAOoa,EACP,CAAA,CAAA,EAEgB,QAAQ,QAAA,GAC1B,KAAK,eAAiB,GACf,IAAI,QAASW,GAAY,CAC/B,KAAK,eAAiBA,CACvB,CAAC,EACF,CAMA,aAAaC,EAAuB,CACnC,MAAMC,EAAO,KAAK,UAAUD,CAAO,EAC/B,CAACC,GAAQA,EAAK,MAClB,KAAK,KAAK,KAAK,UAAU,CAAE,KAAM,mBAAoB,QAAAD,CAAA,CAAS,CAAC,CAChE,CAOQ,eAAejW,EAAoC,CAC1D,UAAWkH,KAAOlH,EAAW,CAC5B,MAAMkW,EAAO,KAAK,UAAUhP,EAAI,OAAO,EACvC,GAAIgP,GAAM,MAAQ,CAAChP,EAAI,KAAM,CAC5B,MAAMpK,EAAO,IAAI,IAAIoK,EAAI,SAAS,IAAKvf,GAAMA,EAAE,EAAE,CAAC,EAC5CwuB,EAAOD,EAAK,SAAS,OAAQvuB,GAAM,CAACmV,EAAK,IAAInV,EAAE,EAAE,CAAC,EACxD,KAAK,UAAUuf,EAAI,OAAO,EAAI,CAC7B,GAAGA,EACH,SAAU,CAAC,GAAGiP,EAAM,GAAGjP,EAAI,QAAQ,EACnC,QAAS,KAAK,IAAI,EAAGA,EAAI,QAAUiP,EAAK,MAAM,EAC9C,OAAQjP,EAAI,QAAUgP,EAAK,OAC3B,KAAM,IAEP,QACD,CACA,KAAK,UAAUhP,EAAI,OAAO,EAAIA,CAC/B,CACD,CAEQ,aAAa4O,EAAuB,CAC3C,KAAK,UAAY,GACjB,SAAW,CAAC,EAAG7a,CAAK,IAAK6a,EAAI,QAAQ,UAAW,CAC/C,MAAMM,EAAQ,KAAK,UAAU,IAAInb,EAAM,EAAE,EACzC,GAAImb,IAAU,OAAW,CACxB,KAAK,QAAQA,CAAK,EAAInb,EACtB,QACD,CAGI6a,EAAI,QAAQ,CAAC,EAAI,KAAK,aAC1B,KAAK,UAAU,IAAI7a,EAAM,GAAI,KAAK,QAAQ,MAAM,EAChD,KAAK,QAAQ,KAAKA,CAAK,EACvB,KAAK,WACN,CACD,CAQA,WAAWob,EAAsCJ,EAAyB,KAAY,CAErF,MAAM/jB,EAAOmkB,GAAa,KACpBC,EAAYpkB,EAAO+jB,EAAU,KAEnC,GAAI,KAAK,YAAc/jB,GAAQ,KAAK,UAAYokB,EAAW,CAE1D,GADIpkB,IAAS,MACT,KAAK,GAAI,OACb,KAAK,UAAA,EACL,MACD,CAEI,KAAK,KACR,KAAK,UAAY,KACjB,KAAK,aAAA,GAEN,KAAK,QAAU,CAAA,EACf,KAAK,UAAY,CAAA,EACjB,KAAK,QAAU,KACf,KAAK,UAAY,GACjB,KAAK,SAAW,EAChB,KAAK,WAAa,EAClB,KAAK,cAAA,EACL,KAAK,cAAA,EACL,KAAK,cAAgB,IACrB,KAAK,UAAYA,EACjB,KAAK,QAAUokB,EAEXpkB,QAAW,UAAA,CAChB,CACD,CAEO,MAAMqkB,GAAkB,IAAIjB"}
|
|
1
|
+
{"version":3,"file":"00FvOOKA.js","sources":["../../../../../../../src/tmux/answer-keys.ts","../../../../../../src/lib/components/DialogCard.svelte","../../../../../../../src/transcript/mcp.ts","../../../../../../src/lib/tool-icons.ts","../../../../../../src/lib/components/ToolLabel.svelte","../../../../../../../src/transcript/grilling.ts","../../../../../../../src/transcript/json.ts","../../../../../../../src/transcript/tool-groups.ts","../../../../../../src/lib/components/TurnChangesCard.svelte","../../../../../../src/lib/components/TranscriptView.svelte","../../../../../../src/lib/stores/transcript.svelte.ts"],"sourcesContent":["/**\n * Translation of an AskUserQuestion answer into Claude Code TUI keystrokes.\n *\n * The dialog puts the cursor on the first option; Down walks the list, Space\n * toggles a checkbox in multi-select, and Enter submits the question. Keeping\n * this next to the other pane-driving code (rather than in the view) means the\n * protocol has one home and can be unit-tested when the TUI changes.\n */\n\n/**\n * Keys for answering one question, given the option indices to pick.\n * Returns null when the selection can't be expressed (no picks, or more than\n * one pick on a single-select question).\n */\nexport function keysForAnswer(\n picks: number[],\n options: { multiSelect: boolean },\n): string | null {\n const sorted = [...new Set(picks)].filter((i) => Number.isInteger(i) && i >= 0).sort((a, b) => a - b);\n if (sorted.length === 0) return null;\n if (!options.multiSelect) {\n if (sorted.length > 1) return null;\n // Same arrow walk as a pane dialog, from a cursor that always starts at 0.\n return keysForOptionPick(0, sorted[0], sorted[0] + 1);\n }\n\n const keys: string[] = [];\n let cursor = 0;\n for (const pick of sorted) {\n for (let step = 0; step < pick - cursor; step++) keys.push(\"Down\");\n keys.push(\"Space\");\n cursor = pick;\n }\n keys.push(\"Enter\");\n return keys.join(\" \");\n}\n\n/**\n * Keys that move Claude Code's own highlight from the row it is on to the row\n * the user tapped, then submit.\n *\n * Walks with arrows from where the pane says the highlight already is, rather\n * than typing the option's number — a dialog that does not take digits still\n * answers correctly, and a dialog whose highlight has moved since the last\n * capture lands on the row the user could see.\n *\n * @param from Index of the highlighted row, or -1 when none is marked.\n * @param to Index of the row to pick.\n * @returns The key sequence, or null when `to` is not a real row.\n */\nexport function keysForOptionPick(from: number, to: number, count: number): string | null {\n const move = keysForOptionMove(from, to, count);\n if (move === null) return null;\n return move ? `${move} Enter` : \"Enter\";\n}\n\n/**\n * Keys that move the highlight to a row without picking it.\n *\n * Some dialogs hang a setting off the highlighted row — the model picker's\n * effort level applies to whichever model the highlight is on — and a\n * question's notes field opens for the highlighted option, so moving the\n * highlight is an action of its own, not just the first half of a pick.\n *\n * @returns The arrow keys, \"\" when the highlight is already there, or null\n * when `to` is not a real row.\n */\nexport function keysForOptionMove(from: number, to: number, count: number): string | null {\n if (!Number.isInteger(to) || to < 0 || to >= count) return null;\n const start = from < 0 || from >= count ? 0 : from;\n const steps = to - start;\n return Array(Math.abs(steps)).fill(steps > 0 ? \"Down\" : \"Up\").join(\" \");\n}\n","<script lang=\"ts\">\n\timport type { TranscriptEntry } from '../../../../src/transcript/parser';\n\timport type { PaneChoice } from '$shared/types/ws-messages.js';\n\timport {\n\t\tkeysForAnswer,\n\t\tkeysForOptionMove,\n\t\tkeysForOptionPick\n\t} from '$shared/tmux/answer-keys.js';\n\timport { longPress } from '$lib/actions/longPress';\n\timport { Button } from '$lib/components/ui/button';\n\timport { Input } from '$lib/components/ui/input';\n\n\ttype AskEntry = Extract<TranscriptEntry, { kind: 'ask' }>;\n\ttype Row = PaneChoice['options'][number];\n\n\tlet {\n\t\tchoice,\n\t\task = null,\n\t\tpermission = false,\n\t\tclosed = false,\n\t\tonKeys,\n\t\tonText,\n\t\tonSubmitted\n\t}: {\n\t\t/** The dialog as the pane draws it right now; null when the poll has not read one. */\n\t\tchoice: PaneChoice | null;\n\t\t/** The AskUserQuestion call behind the dialog, when it is one: every question up front. */\n\t\task?: AskEntry | null;\n\t\t/** A permission prompt rather than a question. */\n\t\tpermission?: boolean;\n\t\t/** The dialog has been answered and is gone from the pane. */\n\t\tclosed?: boolean;\n\t\t/** Sends a tmux key sequence (space-separated) to the pane. */\n\t\tonKeys: (keys: string) => Promise<void> | void;\n\t\t/** Types text into the pane as-is, with no Enter after it. */\n\t\tonText: (text: string) => Promise<void> | void;\n\t\t/** The card sent the keys that close the dialog without the pane to confirm it. */\n\t\tonSubmitted?: () => void;\n\t} = $props();\n\n\t// ── where the dialog stands ──────────────────────────────────────────\n\t// The pane is the truth about which question is open and which row is\n\t// highlighted. The AskUserQuestion entry knows every question in advance,\n\t// so the card can draw them all and say which ones are already answered.\n\n\tconst norm = (s: string | null | undefined) => (s ?? '').replace(/\\s+/g, ' ').trim().toLowerCase();\n\n\t/** The pane is on the Submit tab a multi-question or multi-select dialog ends with. */\n\tconst reviewing = $derived(\n\t\tchoice != null && choice.options.some((o) => o.label === 'Submit answers')\n\t);\n\n\t/** Which of the entry's questions the pane has open; -1 when it cannot tell. */\n\tconst liveIndex = $derived.by(() => {\n\t\tif (!ask || !choice) return -1;\n\t\tif (reviewing) return ask.questions.length;\n\t\tconst asked = norm(choice.question);\n\t\tconst byText = ask.questions.findIndex(\n\t\t\t(q) => asked !== '' && (norm(q.question) === asked || asked.startsWith(norm(q.question)))\n\t\t);\n\t\tif (byText >= 0) return byText;\n\t\t// The question wrapped or was cut; the rows still name the same options.\n\t\tconst first = norm(choice.options[0]?.label);\n\t\treturn ask.questions.findIndex(\n\t\t\t(q) => q.options.length > 0 && first !== '' && norm(q.options[0].label).startsWith(first.slice(0, 16))\n\t\t);\n\t});\n\n\t/** Driving the entry's questions blind: no pane read, so the card keeps count. */\n\tlet sentCount = $state(0);\n\tlet picks = $state<Set<number>>(new Set());\n\tconst blind = $derived(ask != null && choice == null && !closed);\n\n\t/** The question the card answers now: an index into the entry, or its length on the Submit tab. */\n\tconst current = $derived(blind ? sentCount : liveIndex);\n\n\t/** A dialog with a Submit tab: several questions, or any multi-select. */\n\tconst hasSubmitTab = $derived(\n\t\task != null && (ask.questions.length > 1 || ask.questions.some((q) => q.multiSelect))\n\t);\n\tconst atSubmit = $derived(ask != null && current === ask.questions.length);\n\n\t// ── free text ────────────────────────────────────────────────────────\n\n\tlet draft = $state('');\n\tlet sending = $state(false);\n\tlet inputEl = $state<HTMLInputElement | null>(null);\n\n\t/** The pane's \"Type something\" row, which the card answers with its own field. */\n\tconst textRow = $derived(choice?.options.find((o) => o.text) ?? null);\n\t/** Rows the card draws as buttons: everything but the text row. */\n\tconst rows = $derived(choice?.options.filter((o) => !o.text) ?? []);\n\n\t/** The pane has a text field open: the free-text row, or the highlighted option's notes. */\n\tconst typing = $derived(choice?.typing === true);\n\tconst noting = $derived(choice?.noting === true);\n\n\t/** Notes go on the highlighted option; say which. */\n\tconst notingOn = $derived(\n\t\tnoting ? (choice?.options.find((o) => o.selected)?.label ?? choice?.question ?? 'this option') : null\n\t);\n\n\t$effect(() => {\n\t\t// The pane opened a text field (a key, or the terminal): the card's field is where to type.\n\t\tif ((typing || noting) && inputEl && document.activeElement?.tagName !== 'TEXTAREA') {\n\t\t\tinputEl.focus({ preventScroll: true });\n\t\t}\n\t});\n\n\tasync function sendFree() {\n\t\tconst text = draft.trim();\n\t\tif (!text || sending) return;\n\t\tsending = true;\n\t\ttry {\n\t\t\tif (blind) {\n\t\t\t\tconst q = ask!.questions[sentCount];\n\t\t\t\t// The text row sits under the options; the cursor starts on the first.\n\t\t\t\tconst n = q.options.length;\n\t\t\t\tawait onKeys(keysForOptionMove(0, n, n + 1) ?? '');\n\t\t\t\tawait onText(text);\n\t\t\t\tawait onKeys('Enter');\n\t\t\t\tadvanceBlind();\n\t\t\t} else if (choice) {\n\t\t\t\tconst opts = choice.options;\n\t\t\t\tconst multi = choice.multi === true;\n\t\t\t\tconst wasNoting = noting;\n\t\t\t\tif (!typing && !wasNoting) {\n\t\t\t\t\tconst to = opts.findIndex((o) => o.text);\n\t\t\t\t\tconst move = keysForOptionMove(\n\t\t\t\t\t\topts.findIndex((o) => o.selected),\n\t\t\t\t\t\tto,\n\t\t\t\t\t\topts.length\n\t\t\t\t\t);\n\t\t\t\t\tif (move === null) return;\n\t\t\t\t\t// Highlighting the row is what opens it for typing. Until the pane\n\t\t\t\t\t// says it is open, letters would drive the list (\"n\" opens notes)\n\t\t\t\t\t// and the Enter would pick whatever row is highlighted.\n\t\t\t\t\tif (move) await onKeys(move);\n\t\t\t\t\tif (!(await paneTyping())) return;\n\t\t\t\t}\n\t\t\t\tawait onText(text);\n\t\t\t\t// A note closes with Escape, which keeps it and brings the rows back;\n\t\t\t\t// a multi-select's row ticks with its text, and the answer goes in\n\t\t\t\t// from the Submit tab, so only a single-select takes Enter.\n\t\t\t\tif (wasNoting) await onKeys('Escape');\n\t\t\t\telse if (!multi) await onKeys('Enter');\n\t\t\t}\n\t\t\tdraft = '';\n\t\t} finally {\n\t\t\tsending = false;\n\t\t}\n\t}\n\n\t/** How long the free-text row may take to open before the card gives up and keeps the text. */\n\tconst OPEN_TIMEOUT_MS = 3000;\n\n\t/** Waits for the pane's next reads to show the text row open. */\n\tasync function paneTyping(): Promise<boolean> {\n\t\tconst until = Date.now() + OPEN_TIMEOUT_MS;\n\t\twhile (Date.now() < until) {\n\t\t\tif (choice?.typing === true) return true;\n\t\t\tawait new Promise((r) => setTimeout(r, 100));\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction freeKeydown(e: KeyboardEvent) {\n\t\t// The card's field never leaks keys to the page's own shortcuts.\n\t\te.stopPropagation();\n\t\tif (e.key === 'Enter' && !e.shiftKey && !e.isComposing) {\n\t\t\te.preventDefault();\n\t\t\tvoid sendFree();\n\t\t} else if (e.key === 'Escape' && (typing || noting)) {\n\t\t\te.preventDefault();\n\t\t\tvoid onKeys(noting ? 'Escape' : 'Up');\n\t\t}\n\t}\n\n\t// ── picking rows ─────────────────────────────────────────────────────\n\n\t/**\n\t * Move Claude Code's own highlight to the row you tapped, then submit.\n\t *\n\t * Walks with arrows from the row the pane says is selected rather than\n\t * typing the number, so it works whether or not the dialog takes digits.\n\t */\n\tasync function pick(row: Row) {\n\t\t// An open text field is the selected row, so the walk starts from it.\n\t\tconst keys = walkTo(row, keysForOptionPick);\n\t\tif (keys) await onKeys(keys);\n\t}\n\n\t/**\n\t * Move the highlight without picking — a long press. Some dialogs hang a\n\t * setting off the highlighted row: the model picker's effort, a\n\t * question's notes.\n\t */\n\tasync function highlight(row: Row) {\n\t\tconst keys = walkTo(row, keysForOptionMove);\n\t\tif (keys) await onKeys(keys);\n\t}\n\n\t/** Keys from the pane's highlighted row to `row`, by the given walk. */\n\tfunction walkTo(row: Row, walk: typeof keysForOptionMove): string | null {\n\t\tif (!choice) return null;\n\t\tconst opts = choice.options;\n\t\treturn walk(\n\t\t\topts.findIndex((o) => o.selected),\n\t\t\topts.findIndex((o) => o.n === row.n),\n\t\t\topts.length\n\t\t);\n\t}\n\n\tfunction advanceBlind() {\n\t\tsentCount += 1;\n\t\tpicks = new Set();\n\t\tif (ask && !hasSubmitTab && sentCount >= ask.questions.length) onSubmitted?.();\n\t}\n\n\tfunction pickBlind(qi: number, oi: number) {\n\t\tconst q = ask!.questions[qi];\n\t\tif (q.multiSelect) {\n\t\t\tconst next = new Set(picks);\n\t\t\tif (next.has(oi)) next.delete(oi);\n\t\t\telse next.add(oi);\n\t\t\tpicks = next;\n\t\t\treturn;\n\t\t}\n\t\tconst keys = keysForAnswer([oi], q);\n\t\tif (!keys) return;\n\t\tvoid onKeys(keys);\n\t\tadvanceBlind();\n\t}\n\n\tfunction confirmBlind(qi: number) {\n\t\tconst keys = keysForAnswer([...picks], ask!.questions[qi]);\n\t\tif (!keys) return;\n\t\tvoid onKeys(keys);\n\t\tadvanceBlind();\n\t}\n\n\t/** Submit or Cancel on the closing tab. */\n\tasync function finish(submit: boolean) {\n\t\tif (blind) {\n\t\t\tawait onKeys(submit ? 'Enter' : 'Down Enter');\n\t\t\tonSubmitted?.();\n\t\t\treturn;\n\t\t}\n\t\tconst row = choice?.options.find((o) =>\n\t\t\tsubmit ? o.label === 'Submit answers' : norm(o.label) === 'cancel'\n\t\t);\n\t\tif (row) await pick(row);\n\t}\n\n\t/** A multi-select's ticks are done: on to the next tab (Submit, after the last question). */\n\tfunction done() {\n\t\tvoid onKeys(typing ? 'Up Right' : 'Right');\n\t}\n\n\t// ── the dialog's other keys ──────────────────────────────────────────\n\n\t/** A hint segment naming a key and what it does: \"s to use this session only\". */\n\tconst KEY_SEGMENT = /^(\\S+) to (.+)$/;\n\t/** A note the dialog adjusts with the horizontal arrows. */\n\tconst ARROW_NOTE = /←\\/→/;\n\n\t/**\n\t * The keys a dialog answers to beyond picking a row — the model picker's\n\t * \"s to use this session only\", a question's \"n to add notes\" — read off\n\t * the hint line the dialog draws under itself, so a dialog this page has\n\t * never seen still gets its extra keys offered as buttons.\n\t */\n\tconst extraKeys = $derived.by(() => {\n\t\tconst out: { key: string; label: string }[] = [];\n\t\tfor (const segment of (choice?.keys ?? '').split('·')) {\n\t\t\tconst m = segment.trim().match(KEY_SEGMENT);\n\t\t\t// Only keys the card does not already drive with its rows and buttons.\n\t\t\tif (!m || (!/^[a-z]$/i.test(m[1]) && m[1] !== 'Tab' && m[1] !== 'Space')) continue;\n\t\t\tout.push({ key: m[1], label: m[2] });\n\t\t}\n\t\treturn out;\n\t});\n\n\t/** The panel a question draws beside an option, from the entry the pane cuts it out of. */\n\tfunction previewFor(qi: number, label: string): string | undefined {\n\t\tconst q = ask?.questions[qi];\n\t\tif (!q) return undefined;\n\t\tconst l = norm(label);\n\t\treturn q.options.find((o) => norm(o.label) === l || (l !== '' && norm(o.label).startsWith(l)))\n\t\t\t?.preview;\n\t}\n\n\t/** Someone opened the session to answer this: bring the card into view once. */\n\tfunction reveal(el: HTMLElement) {\n\t\trequestAnimationFrame(() => el.scrollIntoView({ block: 'nearest' }));\n\t}\n\n\tconst isPermission = $derived(permission && !ask);\n\tconst title = $derived(isPermission ? 'Permission needed' : 'Claude is asking');\n</script>\n\n{#snippet liveRows(qi: number)}\n\t<div class=\"rows\" role=\"group\">\n\t\t{#each rows as row (row.n)}\n\t\t\t{@const preview = previewFor(qi, row.label)}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"row\"\n\t\t\t\tclass:sel={row.selected}\n\t\t\t\tdisabled={closed}\n\t\t\t\ttitle=\"Tap to pick · hold to highlight only\"\n\t\t\t\tonclick={() => void pick(row)}\n\t\t\t\tuse:longPress={{ onTrigger: () => void highlight(row) }}\n\t\t\t>\n\t\t\t\t{#if row.checked === undefined}\n\t\t\t\t\t<span class=\"num\">{row.n}</span>\n\t\t\t\t{:else}\n\t\t\t\t\t<iconify-icon\n\t\t\t\t\t\tclass=\"box\"\n\t\t\t\t\t\tclass:on={row.checked}\n\t\t\t\t\t\ticon={row.checked ? 'mdi:checkbox-marked' : 'mdi:checkbox-blank-outline'}\n\t\t\t\t\t></iconify-icon>\n\t\t\t\t{/if}\n\t\t\t\t<span class=\"label\">\n\t\t\t\t\t<span class=\"name\">{row.label}</span>\n\t\t\t\t\t{#if row.hint}<span class=\"hint\">{row.hint}</span>{/if}\n\t\t\t\t\t{#if preview}<pre class=\"preview\">{preview}</pre>{/if}\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t{/each}\n\t</div>\n{/snippet}\n\n{#snippet freeText(placeholder: string, label: string)}\n\t<form\n\t\tclass=\"free\"\n\t\tonsubmit={(e) => {\n\t\t\te.preventDefault();\n\t\t\tvoid sendFree();\n\t\t}}\n\t>\n\t\t<Input\n\t\t\tbind:ref={inputEl}\n\t\t\tbind:value={draft}\n\t\t\tdata-dialog-input\n\t\t\tclass=\"free-input\"\n\t\t\t{placeholder}\n\t\t\taria-label={label}\n\t\t\tdisabled={closed}\n\t\t\tonkeydown={freeKeydown}\n\t\t/>\n\t\t<Button\n\t\t\ttype=\"submit\"\n\t\t\tvariant=\"warning\"\n\t\t\tsize=\"sm\"\n\t\t\tclass=\"free-send\"\n\t\t\tdisabled={closed || sending || draft.trim() === ''}\n\t\t>\n\t\t\t<iconify-icon icon={noting ? 'mdi:note-check-outline' : 'mdi:send'}></iconify-icon>\n\t\t\t{noting ? 'Save' : 'Send'}\n\t\t</Button>\n\t</form>\n{/snippet}\n\n{#snippet paneFreeText(answerLabel: string)}\n\t{#if textRow || noting}\n\t\t{@render freeText(\n\t\t\tnoting ? `Note on ${notingOn}` : 'Type something else',\n\t\t\tnoting ? 'Note' : answerLabel\n\t\t)}\n\t{/if}\n{/snippet}\n\n{#snippet keysBar()}\n\t{#each choice?.notes ?? [] as note (note)}\n\t\t<p class=\"note\">\n\t\t\t<span>{note}</span>\n\t\t\t{#if ARROW_NOTE.test(note)}\n\t\t\t\t<button type=\"button\" class=\"arrow\" title=\"Left\" onclick={() => void onKeys('Left')}>\n\t\t\t\t\t<iconify-icon icon=\"mdi:chevron-left\"></iconify-icon>\n\t\t\t\t</button>\n\t\t\t\t<button type=\"button\" class=\"arrow\" title=\"Right\" onclick={() => void onKeys('Right')}>\n\t\t\t\t\t<iconify-icon icon=\"mdi:chevron-right\"></iconify-icon>\n\t\t\t\t</button>\n\t\t\t{/if}\n\t\t</p>\n\t{/each}\n\t<div class=\"extra\">\n\t\t<!-- Move the highlight without picking: what a setting under the rows,\n\t\t or a note, applies to. A held row does the same. -->\n\t\t<button type=\"button\" class=\"key nav\" title=\"Highlight the row above\" onclick={() => void onKeys('Up')}>\n\t\t\t<iconify-icon icon=\"mdi:chevron-up\"></iconify-icon>\n\t\t</button>\n\t\t<button type=\"button\" class=\"key nav\" title=\"Highlight the row below\" onclick={() => void onKeys('Down')}>\n\t\t\t<iconify-icon icon=\"mdi:chevron-down\"></iconify-icon>\n\t\t</button>\n\t\t{#if choice?.multi && !reviewing}\n\t\t\t<!-- Ticking a box leaves the dialog open; the answer goes in from a\n\t\t\t tab of its own, one key to the right. -->\n\t\t\t<button type=\"button\" class=\"key done\" onclick={done}>\n\t\t\t\t<iconify-icon icon=\"mdi:check-all\"></iconify-icon>Done\n\t\t\t</button>\n\t\t{/if}\n\t\t{#each extraKeys as extra (extra.key)}\n\t\t\t<button type=\"button\" class=\"key\" onclick={() => void onKeys(extra.key)}>\n\t\t\t\t<kbd>{extra.key}</kbd>{extra.label}\n\t\t\t</button>\n\t\t{/each}\n\t\t<button type=\"button\" class=\"key\" title=\"Dismiss the dialog\" onclick={() => void onKeys('Escape')}>\n\t\t\t<kbd>Esc</kbd>cancel\n\t\t</button>\n\t</div>\n\t{#if choice?.keys}<p class=\"keys\">{choice.keys}</p>{/if}\n{/snippet}\n\n<section\n\tclass=\"dialog-card\"\n\tclass:closed\n\taria-label={title}\n\tuse:reveal\n>\n\t<header class=\"title\">\n\t\t<iconify-icon icon={isPermission ? 'mdi:shield-alert-outline' : 'mdi:chat-question'}></iconify-icon>\n\t\t<span>{closed ? 'Answered' : title}</span>\n\t\t{#if closed}<iconify-icon class=\"ok\" icon=\"mdi:check\"></iconify-icon>{/if}\n\t</header>\n\n\t{#if ask}\n\t\t{#each ask.questions as q, qi (q.question)}\n\t\t\t{@const sent = closed || (current >= 0 && qi < current)}\n\t\t\t{@const active = !closed && qi === current}\n\t\t\t<div class=\"ask-q\" class:inactive={!active && !sent}>\n\t\t\t\t<span class=\"chip\" class:done={sent}>{q.header}</span>\n\t\t\t\t<p class=\"question\">{q.question}</p>\n\t\t\t\t{#if sent}\n\t\t\t\t\t<div class=\"sent\">answer sent ✓</div>\n\t\t\t\t{:else if active && choice && !reviewing}\n\t\t\t\t\t{@render liveRows(qi)}\n\t\t\t\t\t{@render paneFreeText(`Your own answer to: ${q.question}`)}\n\t\t\t\t{:else}\n\t\t\t\t\t<!-- Not open in the pane yet, or no pane read: the entry's own options. -->\n\t\t\t\t\t<div class=\"rows\">\n\t\t\t\t\t\t{#each q.options as opt, oi (opt.label)}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"row\"\n\t\t\t\t\t\t\t\tclass:sel={active && q.multiSelect && picks.has(oi)}\n\t\t\t\t\t\t\t\tdisabled={!active || !blind}\n\t\t\t\t\t\t\t\tonclick={() => pickBlind(qi, oi)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{#if q.multiSelect}\n\t\t\t\t\t\t\t\t\t<iconify-icon\n\t\t\t\t\t\t\t\t\t\tclass=\"box\"\n\t\t\t\t\t\t\t\t\t\tclass:on={active && picks.has(oi)}\n\t\t\t\t\t\t\t\t\t\ticon={active && picks.has(oi)\n\t\t\t\t\t\t\t\t\t\t\t? 'mdi:checkbox-marked'\n\t\t\t\t\t\t\t\t\t\t\t: 'mdi:checkbox-blank-outline'}\n\t\t\t\t\t\t\t\t\t></iconify-icon>\n\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t<span class=\"num\">{oi + 1}</span>\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t<span class=\"label\">\n\t\t\t\t\t\t\t\t\t<span class=\"name\">{opt.label}</span>\n\t\t\t\t\t\t\t\t\t{#if opt.description}<span class=\"hint\">{opt.description}</span>{/if}\n\t\t\t\t\t\t\t\t\t{#if opt.preview}<pre class=\"preview\">{opt.preview}</pre>{/if}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</div>\n\t\t\t\t\t{#if active && blind}\n\t\t\t\t\t\t{#if q.multiSelect}\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"warning\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tclass=\"confirm\"\n\t\t\t\t\t\t\t\tdisabled={picks.size === 0}\n\t\t\t\t\t\t\t\tonclick={() => confirmBlind(qi)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tConfirm selection\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t{@render freeText('Type something else', `Your own answer to: ${q.question}`)}\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t{/if}\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t{/each}\n\n\t\t{#if liveIndex < 0 && choice && !closed}\n\t\t\t<!-- The pane shows something the entry does not name: draw it as it is. -->\n\t\t\t<div class=\"ask-q\">\n\t\t\t\t{#if choice.question}<p class=\"question\">{choice.question}</p>{/if}\n\t\t\t\t{@render liveRows(-1)}\n\t\t\t\t{#if textRow || noting}{@render freeText('Type something else', 'Your own answer')}{/if}\n\t\t\t</div>\n\t\t{/if}\n\n\t\t{#if hasSubmitTab && !closed}\n\t\t\t<footer class=\"foot\">\n\t\t\t\t<span class=\"tally\">\n\t\t\t\t\t{#if atSubmit}\n\t\t\t\t\t\tAll answered — ready to submit\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t{Math.max(0, current)} of {ask.questions.length} answered\n\t\t\t\t\t{/if}\n\t\t\t\t</span>\n\t\t\t\t<Button variant=\"ghost\" size=\"sm\" disabled={!atSubmit} onclick={() => void finish(false)}>\n\t\t\t\t\tCancel\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"warning\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tdisabled={!atSubmit}\n\t\t\t\t\ttitle={atSubmit ? 'Submit your answers' : 'Answer every question first'}\n\t\t\t\t\tonclick={() => void finish(true)}\n\t\t\t\t>\n\t\t\t\t\t<iconify-icon icon=\"mdi:check-all\"></iconify-icon>Submit\n\t\t\t\t</Button>\n\t\t\t</footer>\n\t\t{/if}\n\t\t{#if choice && !closed}{@render keysBar()}{/if}\n\t{:else if choice && !closed}\n\t\t<div class=\"ask-q\">\n\t\t\t{#if choice.question}<p class=\"question\">{choice.question}</p>{/if}\n\t\t\t{@render liveRows(-1)}\n\t\t\t{@render paneFreeText('Your own answer')}\n\t\t</div>\n\t\t{@render keysBar()}\n\t{:else if !closed}\n\t\t<p class=\"question muted\">Reading the dialog from the pane…</p>\n\t{/if}\n</section>\n\n<style>\n\t/* The one thing in the transcript that wants you: amber, the colour every\n\t surface gives a waiting session. It cools to a log line once answered. */\n\t.dialog-card {\n\t\tmargin: 14px 0 14px 12px;\n\t\tborder: 1px solid #5c4410;\n\t\tborder-left: 3px solid #fbbf24;\n\t\tborder-radius: 8px;\n\t\tbackground: #1a1610;\n\t\tpadding: 10px 12px 12px;\n\t\tscroll-margin: 16px;\n\t}\n\t.dialog-card.closed {\n\t\tborder-color: #2a2a2e;\n\t\tborder-left-color: #4d7c5f;\n\t\tbackground: #161616;\n\t}\n\t.title {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 7px;\n\t\tmargin-bottom: 8px;\n\t\tfont-size: 11px;\n\t\tfont-weight: 700;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.08em;\n\t\tcolor: #fbbf24;\n\t}\n\t.closed .title {\n\t\tcolor: #86b898;\n\t}\n\t.ask-q + .ask-q {\n\t\tmargin-top: 12px;\n\t\tpadding-top: 10px;\n\t\tborder-top: 1px solid #2c2416;\n\t}\n\t.ask-q.inactive {\n\t\topacity: 0.45;\n\t}\n\t.chip {\n\t\tdisplay: inline-block;\n\t\tmargin-bottom: 4px;\n\t\tpadding: 1px 7px;\n\t\tborder-radius: 4px;\n\t\tbackground: #3a2d0d;\n\t\tcolor: #fde68a;\n\t\tfont-size: 10px;\n\t\tfont-weight: 700;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.08em;\n\t}\n\t.chip.done {\n\t\tbackground: #262220;\n\t\tcolor: #a8a29e;\n\t}\n\t.question {\n\t\tmargin: 0 0 8px;\n\t\tcolor: #f5f0ee;\n\t\tfont-weight: 600;\n\t\t/* Carried whole from the pane, with the breaks the dialog drew itself. */\n\t\twhite-space: pre-line;\n\t\toverflow-wrap: anywhere;\n\t}\n\t.question.muted {\n\t\tcolor: #a8a29e;\n\t\tfont-weight: 400;\n\t}\n\t.sent {\n\t\tfont-size: 12.5px;\n\t\tcolor: #86b898;\n\t}\n\t.rows {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 5px;\n\t}\n\t.row {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tgap: 9px;\n\t\twidth: 100%;\n\t\tmin-height: 34px;\n\t\tpadding: 7px 10px;\n\t\tborder: 1px solid #2c2416;\n\t\tborder-radius: 7px;\n\t\tbackground: #201b12;\n\t\tcolor: #d6d3d1;\n\t\ttext-align: left;\n\t\tcursor: pointer;\n\t\ttransition:\n\t\t\tborder-color 0.12s,\n\t\t\tbackground 0.12s;\n\t}\n\t.row:hover:not(:disabled) {\n\t\tborder-color: #b45309;\n\t\tbackground: #2a2214;\n\t}\n\t.row:disabled {\n\t\tcursor: default;\n\t}\n\t/* Claude Code's own highlight: Enter (or the gamepad's A) takes this row. */\n\t.row.sel {\n\t\tborder-color: #fbbf24;\n\t\tbackground: #3a2d0d;\n\t\tcolor: #fde68a;\n\t}\n\t.num {\n\t\tflex: none;\n\t\twidth: 10px;\n\t\tpadding-top: 2px;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10.5px;\n\t\tcolor: #78716c;\n\t}\n\t.row.sel .num {\n\t\tcolor: #fbbf24;\n\t}\n\t/* A multi-select row says what it is with its own box: the box is the\n\t thing a tap changes. */\n\t.box {\n\t\tflex: none;\n\t\tpadding-top: 1px;\n\t\tfont-size: 15px;\n\t\tcolor: #57534e;\n\t}\n\t.box.on {\n\t\tcolor: #34d399;\n\t}\n\t.label {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 2px;\n\t\tmin-width: 0;\n\t\tflex: 1;\n\t}\n\t.name {\n\t\tfont-size: 13px;\n\t\tfont-weight: 600;\n\t\tcolor: inherit;\n\t\toverflow-wrap: anywhere;\n\t}\n\t.hint {\n\t\tfont-size: 12px;\n\t\tline-height: 1.45;\n\t\tcolor: #a8a29e;\n\t\twhite-space: pre-line;\n\t\toverflow-wrap: anywhere;\n\t}\n\t.row.sel .hint {\n\t\tcolor: #c8a94a;\n\t}\n\t/* The panel the terminal draws beside a highlighted option, shown under\n\t it here: on a phone there is no room to the side. */\n\t.preview {\n\t\tmargin: 6px 0 0;\n\t\tpadding: 8px 10px;\n\t\tborder: 1px solid #2c2416;\n\t\tborder-radius: 6px;\n\t\tbackground: #14110c;\n\t\tcolor: #d6d3d1;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 12px;\n\t\tline-height: 1.5;\n\t\twhite-space: pre;\n\t\toverflow-x: auto;\n\t}\n\t.free {\n\t\tdisplay: flex;\n\t\tgap: 6px;\n\t\tmargin-top: 8px;\n\t}\n\t.free :global(.free-input) {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\theight: 34px;\n\t\tborder-color: #3a2f1a;\n\t\tbackground: #14110c;\n\t\tcolor: #f5f0ee;\n\t\tfont-size: 13px;\n\t}\n\t.free :global(.free-send) {\n\t\theight: 34px;\n\t}\n\t.dialog-card :global(.confirm) {\n\t\tmargin-top: 8px;\n\t}\n\t.foot {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tflex-wrap: wrap;\n\t\tgap: 6px;\n\t\tmargin-top: 12px;\n\t\tpadding-top: 10px;\n\t\tborder-top: 1px solid #2c2416;\n\t}\n\t.tally {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tfont-size: 12px;\n\t\tcolor: #a8a29e;\n\t}\n\t/* A line the dialog prints for itself under the rows, with the arrows that\n\t adjust it when the line says they do. */\n\t.note {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 4px;\n\t\tmargin: 8px 0 0;\n\t\tfont-size: 12px;\n\t\tline-height: 1.4;\n\t\tcolor: #a8a29e;\n\t}\n\t.note span {\n\t\tmin-width: 0;\n\t}\n\t.arrow {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 26px;\n\t\theight: 24px;\n\t\tpadding: 0;\n\t\tborder: 0;\n\t\tborder-radius: 6px;\n\t\tbackground: #26262a;\n\t\tcolor: #d6d3d1;\n\t\tfont-size: 16px;\n\t\tcursor: pointer;\n\t}\n\t.extra {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tgap: 6px;\n\t\tmargin-top: 8px;\n\t}\n\t/* One of the keys the dialog names: the key as a cap, then its verb. */\n\t.key {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\theight: 30px;\n\t\tpadding: 0 11px 0 8px;\n\t\tborder: 0;\n\t\tborder-radius: 8px;\n\t\tbackground: #26262a;\n\t\tcolor: #d6d3d1;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 11.5px;\n\t\tcursor: pointer;\n\t}\n\t.key:hover {\n\t\tbackground: #33333a;\n\t}\n\t.key.nav {\n\t\twidth: 34px;\n\t\tpadding: 0;\n\t\tjustify-content: center;\n\t\tfont-size: 17px;\n\t}\n\t.key.done {\n\t\tbackground: #1c3326;\n\t\tcolor: #6ee7b7;\n\t}\n\t.key.done:hover {\n\t\tbackground: #244433;\n\t}\n\t.key kbd {\n\t\tpadding: 0 5px;\n\t\tborder: 1px solid #44444a;\n\t\tborder-radius: 4px;\n\t\tfont-family: inherit;\n\t\tfont-size: 10.5px;\n\t\tcolor: #fbbf24;\n\t}\n\t.keys {\n\t\tmargin: 6px 0 0;\n\t\tcolor: #6b6b70;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10.5px;\n\t\toverflow-wrap: anywhere;\n\t}\n\t@media (pointer: coarse) {\n\t\t.row {\n\t\t\tmin-height: 44px;\n\t\t}\n\t\t.key,\n\t\t.free :global(.free-input),\n\t\t.free :global(.free-send) {\n\t\t\theight: 40px;\n\t\t}\n\t\t/* Below 16px, iOS zooms the page to the field on focus. */\n\t\t.free :global(.free-input) {\n\t\t\tfont-size: 16px;\n\t\t}\n\t}\n</style>\n","/**\n * MCP tools reach the transcript as `mcp__<server>__<tool>`. Server names may\n * themselves hold single underscores (`claude_ai_Claude_Docs`), so the name is\n * split on the double underscore, never on `_`.\n */\nexport interface McpToolName {\n server: string;\n tool: string;\n}\n\nexport function parseMcpToolName(name: string): McpToolName | null {\n const match = /^mcp__(.+?)__(.+)$/.exec(name);\n return match ? { server: match[1], tool: match[2] } : null;\n}\n","import { parseMcpToolName } from '$shared/transcript/mcp.js';\n\n/** Icons for MCP server families recognisable from the server name. */\nconst MCP_FAMILIES: [RegExp, string][] = [\n\t[/brave|chrome|browser|devtools|playwright|puppeteer/i, 'mdi:web'],\n\t[/docs|notion|confluence|drive/i, 'mdi:file-document-outline'],\n\t[/github/i, 'mdi:github'],\n\t[/slack/i, 'mdi:slack']\n];\n\n/** The icon a tool call is drawn with in the transcript. */\nexport function toolIcon(name: string): string {\n\tconst mcp = parseMcpToolName(name);\n\tif (mcp) {\n\t\treturn MCP_FAMILIES.find(([pattern]) => pattern.test(mcp.server))?.[1] ?? 'mdi:power-plug-outline';\n\t}\n\tconst n = name.toLowerCase();\n\tif (n.includes('bash') || n.includes('command')) return 'mdi:console';\n\tif (n.includes('edit') || n.includes('write') || n.includes('notebook')) return 'mdi:file-edit-outline';\n\tif (n.includes('read')) return 'mdi:file-eye-outline';\n\tif (n.includes('grep') || n.includes('glob') || n.includes('search')) return 'mdi:magnify';\n\tif (n.includes('task') || n.includes('agent')) return 'mdi:robot-outline';\n\tif (n.includes('web')) return 'mdi:web';\n\tif (n.includes('todo')) return 'mdi:checkbox-marked-outline';\n\treturn 'mdi:tools';\n}\n","<script lang=\"ts\">\n\timport { parseMcpToolName } from '$shared/transcript/mcp.js';\n\n\t/**\n\t * A tool call's one-line label. Built-in tools read as their summary; an MCP\n\t * tool adds the server it came from, faint, ahead of the tool name, and sets\n\t * its key argument apart from the name.\n\t */\n\tlet { name, summary }: { name: string; summary: string } = $props();\n\n\tconst mcp = $derived(parseMcpToolName(name));\n\t// The summary reads `tool: arg`; tool names never hold ': '.\n\tconst arg = $derived(mcp ? summary.split(': ').slice(1).join(': ') : '');\n</script>\n\n{#if mcp}<span class=\"server\">{mcp.server}</span><span class=\"sep\">·</span><span class=\"tool\"\n\t\t>{mcp.tool}</span\n\t>{#if arg}<span class=\"arg\">{arg}</span>{/if}{:else}{summary}{/if}\n\n<style>\n\t.server {\n\t\topacity: 0.55;\n\t}\n\t.sep {\n\t\topacity: 0.4;\n\t\tmargin: 0 0.45em;\n\t}\n\t.arg {\n\t\tmargin-left: 1.2em;\n\t\topacity: 0.7;\n\t}\n</style>\n","/**\n * A grilling round, read out of Claude's reply so it can be answered as a form.\n *\n * The grilling skill asks a whole round of questions at once, each in the\n * same shape, with its own recommendation under it:\n *\n * ❓ **Q1** - **Storage**: Where do drafts live?\n *\n * ➡️ In the session JSON, next to the rest of the live state.\n *\n * Answering that in a text box means retyping \"Q1: yes, Q2: …\" for every\n * question, most of which you agree with. Read as a round, each question\n * becomes a row you accept with one tap or answer in your own words, and the\n * reply is written for you.\n */\n\nexport interface GrillQuestion {\n /** The number Claude gave it: Q3 is 3. */\n n: number;\n /** The bold title after the number, when the question has one. */\n title: string | null;\n /** The question itself, as markdown. */\n body: string;\n /** Claude's recommended answer, as markdown; null when it offered none. */\n recommended: string | null;\n}\n\nexport interface GrillRound {\n /** Whatever Claude wrote before the first question. */\n intro: string;\n questions: GrillQuestion[];\n /** Whatever it wrote after the last question's recommendation. */\n outro: string;\n}\n\nexport type GrillAnswer = { mode: \"accept\" } | { mode: \"own\"; text: string } | { mode: \"skip\" };\n\n/** `❓ **Q1** - **Title**: body`, or `❓ **Q1 - Title**: body`. */\nconst QUESTION = /^\\s*❓️?\\s*\\*\\*Q(\\d+)(?:\\s*[-–—:.]\\s*([^*]+?))?\\*\\*\\s*[-–—:.]?\\s*(?:\\*\\*([^*]+?)\\*\\*\\s*:?)?\\s*(.*)$/;\nconst RECOMMENDED = /^\\s*➡️?\\s*(.*)$/;\n\n/** Splits text at blank lines into its first paragraph and the rest. */\nfunction firstParagraph(lines: string[]): [string[], string[]] {\n const blank = lines.findIndex((l) => l.trim() === \"\");\n return blank === -1 ? [lines, []] : [lines.slice(0, blank), lines.slice(blank + 1)];\n}\n\nfunction join(lines: string[]): string {\n return lines.join(\"\\n\").trim();\n}\n\n/** The round in `text`, or null when it asks no numbered questions. */\nexport function parseGrillRound(text: string): GrillRound | null {\n const lines = text.split(\"\\n\");\n const starts: number[] = [];\n lines.forEach((line, i) => {\n if (QUESTION.test(line)) starts.push(i);\n });\n if (starts.length === 0) return null;\n\n const intro = join(lines.slice(0, starts[0]));\n const questions: GrillQuestion[] = [];\n let outro = \"\";\n\n starts.forEach((start, qi) => {\n const end = starts[qi + 1] ?? lines.length;\n const m = lines[start].match(QUESTION)!;\n const rest = lines.slice(start + 1, end);\n const recAt = rest.findIndex((l) => RECOMMENDED.test(l));\n const bodyLines = [m[4], ...(recAt === -1 ? rest : rest.slice(0, recAt))];\n\n let recommended: string | null = null;\n if (recAt !== -1) {\n const recLines = [rest[recAt].match(RECOMMENDED)![1], ...rest.slice(recAt + 1)];\n const [para, after] = firstParagraph(recLines);\n recommended = join(para) || null;\n // Past the last question, what follows the recommendation is Claude\n // talking to you again, not part of the answer it proposed.\n if (qi === starts.length - 1) outro = join(after);\n else if (join(after)) recommended = join(recLines);\n }\n\n questions.push({\n n: Number(m[1]),\n title: (m[2] ?? m[3])?.trim() || null,\n body: join(bodyLines),\n recommended,\n });\n });\n\n return { intro, questions, outro };\n}\n\n/**\n * The reply a round's answers make, one line per question in Claude's order.\n * A skipped question is said to be skipped, so Claude knows it is still open\n * rather than guessing it was agreed.\n */\nexport function composeGrillReply(round: GrillRound, answers: Record<number, GrillAnswer>): string {\n return round.questions\n .map((q) => {\n const label = q.title ? `Q${q.n} (${q.title})` : `Q${q.n}`;\n const answer = answers[q.n] ?? (q.recommended ? { mode: \"accept\" } : { mode: \"skip\" });\n if (answer.mode === \"accept\") return `${label}: agreed, go with your recommendation.`;\n if (answer.mode === \"skip\" || !answer.text.trim()) return `${label}: skip for now, leave it open.`;\n return `${label}: ${answer.text.trim()}`;\n })\n .join(\"\\n\");\n}\n","/**\n * Narrowing helpers for the untyped records that come out of Claude Code's\n * JSONL. Every field is optional in practice — the format is undocumented and\n * shifts between versions — so readers return null (or 0) rather than throw.\n */\n\nexport function asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nexport function readString(value: unknown): string | null {\n return typeof value === \"string\" ? value : null;\n}\n\n/** A finite number off a record, or 0 — the sane default for a token count. */\nexport function readNumber(record: Record<string, unknown>, key: string): number {\n const value = record[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n}\n","/**\n * Folds runs of routine tool calls into one summary line, the way Claude\n * Code's fullscreen TUI does: \"Ran 4 shell commands\", \"Searched for 1\n * pattern, called brave-windows 2 times\". A working session otherwise reads\n * as a wall of tool rows with the prose lost between them.\n *\n * Only calls that are finished and unremarkable fold. Anything the reader\n * should see without opening a group stays a row of its own and ends the run:\n * a call still in flight, a subagent, a todo or plan update, an edit drawn as\n * a diff, a question. Thinking between folded calls folds with them; thinking\n * before the first call or after the last stays outside, with the prose.\n */\n\nimport { asRecord, readString } from \"./json.js\";\nimport { parseMcpToolName } from \"./mcp.js\";\nimport type { TranscriptEntry } from \"./parser.js\";\n\ntype ToolEntry = Extract<TranscriptEntry, { kind: \"tool\" }>;\n\nexport interface ToolGroup {\n kind: \"group\";\n /** The first call's id, so the group keeps its key as it grows. */\n id: string;\n entries: TranscriptEntry[];\n summary: string;\n failed: number;\n}\n\n/**\n * An entry passes through as the same object, so a keyed `each` over the\n * items re-renders only the rows that changed, not every row on every delta.\n */\nexport type TranscriptItem = TranscriptEntry | ToolGroup;\n\n/** Tools whose rows the transcript draws specially, never folded. */\nconst STANDALONE_TOOLS = new Set([\n \"Task\",\n \"Agent\",\n \"TodoWrite\",\n \"TaskCreate\",\n \"TaskUpdate\",\n \"ExitPlanMode\",\n \"EnterPlanMode\",\n \"AskUserQuestion\",\n]);\n\nfunction foldable(entry: TranscriptEntry): entry is ToolEntry {\n return (\n entry.kind === \"tool\" &&\n entry.result != null &&\n !entry.patch &&\n !STANDALONE_TOOLS.has(entry.name)\n );\n}\n\n/** A verb phrase, singular and plural, for one category of call. */\ninterface Category {\n key: string;\n phrase: (n: number) => string;\n}\n\nconst plural = (n: number, one: string, many: string) => `${n} ${n === 1 ? one : many}`;\nconst times = (n: number) => plural(n, \"time\", \"times\");\n\nconst SHELL: Category = {\n key: \"shell\",\n phrase: (n) => `ran ${plural(n, \"shell command\", \"shell commands\")}`,\n};\nconst READ: Category = { key: \"read\", phrase: (n) => `read ${plural(n, \"file\", \"files\")}` };\nconst EDIT: Category = { key: \"edit\", phrase: (n) => `edited ${plural(n, \"file\", \"files\")}` };\nconst WRITE: Category = { key: \"write\", phrase: (n) => `wrote ${plural(n, \"file\", \"files\")}` };\nconst SEARCH: Category = {\n key: \"search\",\n phrase: (n) => `searched for ${plural(n, \"pattern\", \"patterns\")}`,\n};\nconst LIST: Category = {\n key: \"list\",\n phrase: (n) => `listed ${plural(n, \"directory\", \"directories\")}`,\n};\nconst FETCH: Category = { key: \"fetch\", phrase: (n) => `fetched ${plural(n, \"page\", \"pages\")}` };\nconst WEB_SEARCH: Category = { key: \"websearch\", phrase: (n) => `searched the web ${times(n)}` };\n\n/** A shell command chaining, redirecting or spanning lines is just a shell command. */\nconst COMPOUND = /[|;&<>`$\\n]/;\nconst SHELL_VERBS: Record<string, Category> = {\n ls: LIST,\n tree: LIST,\n grep: SEARCH,\n rg: SEARCH,\n ag: SEARCH,\n cat: READ,\n head: READ,\n tail: READ,\n};\n\n/** A lone `ls` or `grep` reads as what it does, as the TUI shows it. */\nfunction shellCategory(input: string): Category {\n let command: string | undefined;\n try {\n command = readString(asRecord(JSON.parse(input))?.command)?.trim();\n } catch {\n // Truncated input: fall through to a plain shell command.\n }\n if (!command || COMPOUND.test(command)) return SHELL;\n const [verb, ...args] = command.split(/\\s+/);\n const category = SHELL_VERBS[verb] ?? SHELL;\n // `cat a b` is not \"read 1 file\"; only a read of exactly one file says so.\n if (category === READ && args.filter((a) => !a.startsWith(\"-\")).length !== 1) return SHELL;\n return category;\n}\n\nconst TOOL_CATEGORIES: Record<string, Category> = {\n BashOutput: SHELL,\n KillShell: SHELL,\n PowerShell: SHELL,\n Read: READ,\n Edit: EDIT,\n MultiEdit: EDIT,\n NotebookEdit: EDIT,\n Write: WRITE,\n Grep: SEARCH,\n Glob: SEARCH,\n LS: LIST,\n WebFetch: FETCH,\n WebSearch: WEB_SEARCH,\n};\n\n/**\n * Categories by entry. The view regroups on every streamed delta, and a Bash\n * call's category costs a JSON parse; an entry that changes is a new object.\n */\nconst categoryCache = new WeakMap<ToolEntry, Category>();\n\nfunction categorize(tool: ToolEntry): Category {\n let category = categoryCache.get(tool);\n if (!category) {\n category = categorizeUncached(tool);\n categoryCache.set(tool, category);\n }\n return category;\n}\n\nfunction categorizeUncached(tool: ToolEntry): Category {\n const mcp = parseMcpToolName(tool.name);\n if (mcp) return { key: `mcp:${mcp.server}`, phrase: (n) => `called ${mcp.server} ${times(n)}` };\n if (tool.name === \"Bash\") return shellCategory(tool.input);\n return (\n TOOL_CATEGORIES[tool.name] ?? {\n key: `tool:${tool.name}`,\n phrase: (n) => `used ${tool.name} ${times(n)}`,\n }\n );\n}\n\n/** \"Listed 1 directory, ran 2 shell commands\": categories in order of first use. */\nexport function summarizeToolRun(tools: ToolEntry[]): string {\n const counts = new Map<string, { category: Category; n: number }>();\n for (const tool of tools) {\n const category = categorize(tool);\n const seen = counts.get(category.key);\n if (seen) seen.n++;\n else counts.set(category.key, { category, n: 1 });\n }\n const text = [...counts.values()].map(({ category, n }) => category.phrase(n)).join(\", \");\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/**\n * The transcript as the view draws it: entries in order, with every run of two\n * or more foldable calls (and the thinking among them) gathered into a group.\n */\nexport function groupToolRuns(entries: TranscriptEntry[]): TranscriptItem[] {\n const items: TranscriptItem[] = [];\n let run: TranscriptEntry[] = [];\n\n const flush = () => {\n // Thinking around the calls belongs to the prose beside it.\n let start = 0;\n let end = run.length;\n while (start < end && run[start].kind === \"thinking\") start++;\n while (end > start && run[end - 1].kind === \"thinking\") end--;\n const body = run.slice(start, end);\n const tools = body.filter(foldable);\n if (tools.length >= 2) {\n items.push(...run.slice(0, start));\n items.push({\n kind: \"group\",\n id: body[0].id,\n entries: body,\n summary: summarizeToolRun(tools),\n failed: tools.filter((t) => t.result?.ok === false).length,\n });\n items.push(...run.slice(end));\n } else {\n items.push(...run);\n }\n run = [];\n };\n\n for (const entry of entries) {\n if (entry.kind === \"thinking\" || foldable(entry)) {\n run.push(entry);\n continue;\n }\n flush();\n items.push(entry);\n }\n flush();\n return items;\n}\n","<script lang=\"ts\">\n\t/**\n\t * What one turn changed, drawn where the turn ends in the transcript. Closed,\n\t * it is one quiet line (\"Changed 3 files +42 −10\"); open, a card with the\n\t * turn's files and their counts. A file, or \"View diff\", opens the side\n\t * panel's Changes pane on this turn.\n\t */\n\timport { Button } from '$lib/components/ui/button';\n\timport { displayPath, statusLetter, sumCounts, type Turn } from '$lib/side-panel/changes';\n\n\tlet {\n\t\tturn,\n\t\troot,\n\t\topen = $bindable(false),\n\t\tlink\n\t}: {\n\t\tturn: Turn;\n\t\t/** Paths under it are shown relative to it. */\n\t\troot: string | null;\n\t\topen?: boolean;\n\t\t/** Where the Changes pane opens on this turn, at `file` or its first file. */\n\t\tlink: (file: string | null) => string;\n\t} = $props();\n\n\tconst totals = $derived(sumCounts(turn.files));\n\tconst count = $derived(`${turn.files.length} ${turn.files.length === 1 ? 'file' : 'files'}`);\n</script>\n\n{#if open}\n\t<section class=\"card\" aria-label=\"Files changed in this turn\">\n\t\t<header>\n\t\t\t<span class=\"label\">\n\t\t\t\tCHANGED FILES ({turn.files.length}) · <span class=\"add\">+{totals.additions}</span>\n\t\t\t\t<span class=\"del\">−{totals.deletions}</span>\n\t\t\t</span>\n\t\t\t<span class=\"grow\"></span>\n\t\t\t<Button variant=\"ghost\" size=\"sm\" class=\"h-[30px] border border-[#2f2a27] px-2.5 text-xs\" onclick={() => (open = false)}>\n\t\t\t\tCollapse\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\tsize=\"sm\"\n\t\t\t\tclass=\"h-[30px] border border-[#3f3a36] px-2.5 text-xs\"\n\t\t\t\thref={link(null)}\n\t\t\t\tdata-sveltekit-noscroll\n\t\t\t\tdata-sveltekit-keepfocus\n\t\t\t>\n\t\t\t\tView diff\n\t\t\t</Button>\n\t\t</header>\n\t\t<ul>\n\t\t\t{#each turn.files as f (f.file)}\n\t\t\t\t{@const letter = statusLetter(f)}\n\t\t\t\t<li>\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={link(f.file)}\n\t\t\t\t\t\ttitle={f.oldPath ? `${f.oldPath} → ${f.file}` : f.file}\n\t\t\t\t\t\tdata-sveltekit-noscroll\n\t\t\t\t\t\tdata-sveltekit-keepfocus\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"st st-{letter === '?' ? 'u' : letter.toLowerCase()}\">{letter}</span>\n\t\t\t\t\t\t<span class=\"path\"><bdi>{displayPath(f.file, root)}</bdi></span>\n\t\t\t\t\t\t{#if f.binary}\n\t\t\t\t\t\t\t<span class=\"dim\">bin</span>\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t{#if f.additions}<span class=\"add\">+{f.additions}</span>{/if}\n\t\t\t\t\t\t\t{#if f.deletions}<span class=\"del\">−{f.deletions}</span>{/if}\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</a>\n\t\t\t\t</li>\n\t\t\t{/each}\n\t\t</ul>\n\t</section>\n{:else}\n\t<button type=\"button\" class=\"line\" onclick={() => (open = true)} aria-expanded=\"false\">\n\t\t<iconify-icon icon=\"mdi:chevron-right\"></iconify-icon>\n\t\t<span>Changed {count}</span>\n\t\t<span class=\"nums\"><span class=\"add\">+{totals.additions}</span> <span class=\"del\">−{totals.deletions}</span></span>\n\t</button>\n{/if}\n\n<style>\n\t.card {\n\t\tmargin: 8px 0 10px 12px;\n\t\tborder: 1px solid #262220;\n\t\tborder-radius: 10px;\n\t\tbackground: #141210;\n\t}\n\theader {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tpadding: 8px 10px 8px 14px;\n\t}\n\t.label {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 10.5px;\n\t\tletter-spacing: 0.12em;\n\t\tcolor: #a8a29e;\n\t\twhite-space: nowrap;\n\t}\n\t.grow {\n\t\tflex: 1;\n\t}\n\tul {\n\t\tlist-style: none;\n\t\tmargin: 0;\n\t\tpadding: 6px;\n\t\tborder-top: 1px solid #221e1c;\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 12px;\n\t}\n\tli a {\n\t\tdisplay: flex;\n\t\tgap: 10px;\n\t\tpadding: 6px 10px;\n\t\tborder-radius: 6px;\n\t\tcolor: #d6d3d1;\n\t\ttext-decoration: none;\n\t}\n\tli a:hover {\n\t\tbackground: #1f1c1a;\n\t\tcolor: #fff;\n\t}\n\t.st {\n\t\twidth: 1ch;\n\t}\n\t.st-m,\n\t.st-r {\n\t\tcolor: #fbbf24;\n\t}\n\t.st-a {\n\t\tcolor: #4ade80;\n\t}\n\t.st-d {\n\t\tcolor: #f87171;\n\t}\n\t.st-u,\n\t.dim {\n\t\tcolor: #78716c;\n\t}\n\t.path {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\t/* Cut from the left, so the file name stays in view. */\n\t\tdirection: rtl;\n\t\ttext-align: left;\n\t}\n\t.add {\n\t\tcolor: #4ade80;\n\t}\n\t.del {\n\t\tcolor: #f87171;\n\t}\n\t.line {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tmargin: 6px 0 8px 12px;\n\t\tpadding: 6px 12px 6px 8px;\n\t\tborder: 1px solid #1f1c1a;\n\t\tborder-radius: 8px;\n\t\tbackground: transparent;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 13px;\n\t\tcursor: pointer;\n\t}\n\t.line:hover {\n\t\tborder-color: #2f2a27;\n\t\tcolor: #d6d3d1;\n\t}\n\t.line iconify-icon {\n\t\tcolor: #78716c;\n\t\tfont-size: 15px;\n\t}\n\t.nums {\n\t\tfont-family: var(--font-mono);\n\t\tfont-size: 12px;\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { renderMarkdown } from '$lib/markdown';\n\timport type { TranscriptEntry } from '../../../../src/transcript/parser';\n\timport DialogCard from '$lib/components/DialogCard.svelte';\n\timport type { SubagentPayload } from '$lib/stores/transcript.svelte';\n\timport { toolIcon } from '$lib/tool-icons';\n\timport ToolLabel from '$lib/components/ToolLabel.svelte';\n\timport { toolFileTarget } from '$lib/side-panel/files';\n\timport SessionStateIndicator from '$lib/components/SessionStateIndicator.svelte';\n\timport { sessionStateVisual } from '$shared/session-state.js';\n\timport type { DeliveryInfo } from '$shared/types/ws-messages.js';\n\timport type { PaneActivity, PaneChoice } from '$shared/types/ws-messages.js';\n\timport { formatSpinnerElapsed } from '$lib/format';\n\timport { Badge } from '$lib/components/ui/badge';\n\timport {\n\t\tparseGrillRound,\n\t\tcomposeGrillReply,\n\t\ttype GrillAnswer,\n\t\ttype GrillRound\n\t} from '$shared/transcript/grilling.js';\n\timport { groupToolRuns } from '$shared/transcript/tool-groups.js';\n\timport TurnChangesCard from '$lib/components/TurnChangesCard.svelte';\n\timport { placeTurnChanges, type TranscriptChanges, type Turn } from '$lib/side-panel/changes';\n\n\tlet {\n\t\tentries,\n\t\tavailable,\n\t\tloaded,\n\t\tsessionState = null,\n\t\tcurrentAction = null,\n\t\tactivity = null,\n\t\tdelivered = [],\n\t\tsuggestion = null,\n\t\tonAcceptSuggestion,\n\t\tpaneChoice = null,\n\t\tsubagents = {},\n\t\tonLoadSubagent,\n\t\tonSendKeys,\n\t\tonSendPaneText,\n\t\tolderCount = 0,\n\t\tloadingEarlier = false,\n\t\tonLoadEarlier,\n\t\tonSendReply,\n\t\tfileLink,\n\t\tagentLink,\n\t\tturnChanges = null,\n\t\tchangesLink\n\t}: {\n\t\tentries: TranscriptEntry[];\n\t\tavailable: boolean;\n\t\t/** False while the first snapshot is still in flight. */\n\t\tloaded: boolean;\n\t\t/** Live session state from the hooks (real-time, unlike the JSONL which lags). */\n\t\tsessionState?: 'busy' | 'idle' | 'waiting' | 'permission' | null;\n\t\tcurrentAction?: string | null;\n\t\t/** Claude Code's spinner line, split into its parts; null outside tmux or between frames. */\n\t\tactivity?: PaneActivity | null;\n\t\t/** What claude-mux's queue and steers handed the pane lately, newest last. */\n\t\tdelivered?: DeliveryInfo[];\n\t\t/** Claude Code's own ghost-text proposal for the next prompt. */\n\t\tsuggestion?: string | null;\n\t\t/** Accepts the suggestion (Tab then Enter in the pane). */\n\t\tonAcceptSuggestion?: () => void;\n\t\t/** The dialog the pane is drawing, as the poll read it; drawn as a card here. */\n\t\tpaneChoice?: PaneChoice | null;\n\t\t/** Sends a tmux key sequence (space-separated) to answer a dialog. */\n\t\tonSendKeys?: (keys: string) => Promise<void> | void;\n\t\t/** Types text into the pane as-is, for a dialog's free-text row or notes. */\n\t\tonSendPaneText?: (text: string) => Promise<void> | void;\n\t\t/** Subagent work, keyed by the Task tool_use id that spawned it. */\n\t\tsubagents?: Record<string, SubagentPayload>;\n\t\t/** A reader opened an agent's card: fetch everything it ran and reported. */\n\t\tonLoadSubagent?: (agentId: string) => void;\n\t\t/** Entries the server holds before the ones passed in `entries`. */\n\t\tolderCount?: number;\n\t\t/** A request for those older entries is in flight. */\n\t\tloadingEarlier?: boolean;\n\t\t/**\n\t\t * Asks for the next slice of older entries. Called before they render,\n\t\t * so the scroll container can note where the reader was.\n\t\t */\n\t\tonLoadEarlier?: () => void;\n\t\t/**\n\t\t * Sends a message as the next prompt, the way the composer does;\n\t\t * resolves false when the pane did not take it.\n\t\t */\n\t\tonSendReply?: (text: string) => Promise<boolean>;\n\t\t/** The link that opens a file a tool row touched, at a line; without it the rows draw none. */\n\t\tfileLink?: (path: string, line: number | null) => string;\n\t\t/** Where a subagent opens as a page of its own; without it agent cards link nowhere. */\n\t\tagentLink?: (agentId: string) => string;\n\t\t/** The session's turns that edited files, from the changes API's session source. */\n\t\tturnChanges?: TranscriptChanges | null;\n\t\t/** Where the Changes pane opens on turn `n`, at `file` or its first file; without it no summaries draw. */\n\t\tchangesLink?: (n: number, file: string | null) => string;\n\t} = $props();\n\n\t// ── live activity line ───────────────────────────────────────────────\n\t// The pane's elapsed count would move every second; the server sends the\n\t// turn's start instead, and the count ticks here.\n\n\tlet now = $state(Date.now());\n\tconst startedAt = $derived(activity?.started_at ?? null);\n\tconst ticking = $derived(startedAt !== null);\n\t$effect(() => {\n\t\tif (!ticking) return;\n\t\tnow = Date.now();\n\t\tconst id = setInterval(() => (now = Date.now()), 1000);\n\t\treturn () => clearInterval(id);\n\t});\n\n\t/** The spinner's parts, drawn as quiet pills beside its verb. */\n\tconst CHIP = 'border-[#2f2f36] px-[7px] py-0 text-[11.5px] leading-[18px] font-normal text-[#78716c]';\n\n\tconst elapsedText = $derived(\n\t\tstartedAt !== null ? formatSpinnerElapsed(Math.max(0, Math.floor((now - startedAt) / 1000))) : null\n\t);\n\n\t/** Entries as drawn: runs of routine tool calls fold into one summary row. */\n\tconst items = $derived(groupToolRuns(entries));\n\n\t/** Each turn's change summary, by the item it follows; the turn still running has none yet. */\n\tconst turnRunning = $derived(sessionState !== null && sessionState !== 'idle');\n\tconst turnCards = $derived(\n\t\tchangesLink && turnChanges\n\t\t\t? placeTurnChanges(items, turnChanges.turns, turnChanges.prompts, turnRunning)\n\t\t\t: new Map<string, Turn>()\n\t);\n\t/** The latest summary (the map runs in transcript order) starts open, the rest closed, until the reader says otherwise. */\n\tconst latestCard = $derived([...turnCards.values()].at(-1)?.id ?? null);\n\t/** By the turn's prompt id, which unlike its number never repeats across sessions in one pane. */\n\tlet cardOpen = $state<Record<string, boolean>>({});\n\n\t/**\n\t * Which tool cards and groups the reader has open, by entry id (a group\n\t * under `group:<first call>`). A run folds only as its calls finish, so the\n\t * card someone is reading can turn into a group under them; remembering it\n\t * here lets the new group open on that card instead of snapping shut.\n\t */\n\tlet opened = $state<Record<string, boolean>>({});\n\n\t// ── grilling rounds ──────────────────────────────────────────────────\n\t// A reply that asks a numbered round of questions, each with Claude's\n\t// recommendation, is drawn as a form: take the recommendation, write your\n\t// own answer, or leave the question open — and the reply is composed.\n\n\t/** Parsed rounds by entry text; a reply's text never changes once written. */\n\tconst roundCache = new Map<string, GrillRound | null>();\n\tfunction grillRound(text: string): GrillRound | null {\n\t\tif (!text.includes('❓')) return null;\n\t\tlet round = roundCache.get(text);\n\t\tif (round === undefined) {\n\t\t\tround = parseGrillRound(text);\n\t\t\troundCache.set(text, round);\n\t\t}\n\t\treturn round;\n\t}\n\n\t/**\n\t * The one round that can still be answered: the latest one with nothing\n\t * from you after it. Claude may go on talking past it — a background\n\t * agent reports in, and it says so — without the questions being any\n\t * less open; only your reply, or a question dialog, closes a round.\n\t * Older rounds are history, drawn read-only.\n\t */\n\tconst liveGrillId = $derived.by(() => {\n\t\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\t\tconst e = entries[i];\n\t\t\tif (e.kind === 'user' || e.kind === 'queued' || e.kind === 'ask' || e.kind === 'interrupt')\n\t\t\t\treturn null;\n\t\t\tif (e.kind === 'text' && grillRound(e.text)) return e.id;\n\t\t}\n\t\treturn null;\n\t});\n\n\tlet grillAnswers = $state<Record<string, Record<number, GrillAnswer>>>({});\n\tlet grillSending = $state<string | null>(null);\n\tlet grillSent = $state<Record<string, boolean>>({});\n\n\tfunction answerOf(id: string, q: GrillRound['questions'][number]): GrillAnswer {\n\t\treturn grillAnswers[id]?.[q.n] ?? (q.recommended ? { mode: 'accept' } : { mode: 'own', text: '' });\n\t}\n\n\tfunction setAnswer(id: string, n: number, answer: GrillAnswer) {\n\t\tgrillAnswers[id] = { ...(grillAnswers[id] ?? {}), [n]: answer };\n\t}\n\n\t/** Typing makes the answer yours; clearing the field hands it back. */\n\tfunction typeAnswer(id: string, q: GrillRound['questions'][number], text: string) {\n\t\tif (text.trim() === '' && q.recommended) setAnswer(id, q.n, { mode: 'accept' });\n\t\telse setAnswer(id, q.n, { mode: 'own', text });\n\t}\n\n\tfunction ownText(id: string, q: GrillRound['questions'][number]): string {\n\t\tconst a = answerOf(id, q);\n\t\treturn a.mode === 'own' ? a.text : '';\n\t}\n\n\tfunction tally(id: string, round: GrillRound): string {\n\t\tlet agreed = 0;\n\t\tlet own = 0;\n\t\tlet open = 0;\n\t\tfor (const q of round.questions) {\n\t\t\tconst a = answerOf(id, q);\n\t\t\tif (a.mode === 'accept') agreed++;\n\t\t\telse if (a.mode === 'own' && a.text.trim()) own++;\n\t\t\telse open++;\n\t\t}\n\t\tconst parts: string[] = [];\n\t\tif (agreed) parts.push(`${agreed} agreed`);\n\t\tif (own) parts.push(`${own} in your words`);\n\t\tif (open) parts.push(`${open} left open`);\n\t\treturn parts.join(', ');\n\t}\n\n\tasync function sendRound(id: string, round: GrillRound) {\n\t\tif (!onSendReply || grillSending) return;\n\t\tconst answers: Record<number, GrillAnswer> = {};\n\t\tfor (const q of round.questions) answers[q.n] = answerOf(id, q);\n\t\tgrillSending = id;\n\t\ttry {\n\t\t\tif (await onSendReply(composeGrillReply(round, answers))) grillSent[id] = true;\n\t\t} finally {\n\t\t\tgrillSending = null;\n\t\t}\n\t}\n\n\t/** Grows a textarea with what is typed into it, up to the CSS max-height. */\n\tfunction autosize(el: HTMLTextAreaElement) {\n\t\tconst fit = () => {\n\t\t\tel.style.height = 'auto';\n\t\t\tel.style.height = `${el.scrollHeight}px`;\n\t\t};\n\t\tfit();\n\t\tel.addEventListener('input', fit);\n\t\treturn { destroy: () => el.removeEventListener('input', fit) };\n\t}\n\n\t/**\n\t * Only the newest unanswered dialog can be driven — older cards are history.\n\t * Claude Code also sends a permission notification for a question, which\n\t * a hook from before 0.29.1 took for a permission prompt; an open question\n\t * is answerable either way.\n\t */\n\tconst canAnswer = $derived(\n\t\t(sessionState === 'waiting' || sessionState === 'permission') && onSendKeys != null\n\t);\n\n\tconst liveAskId = $derived(\n\t\tcanAnswer\n\t\t\t? (entries.findLast((e) => e.kind === 'ask' && !e.answers && !e.rejected)?.id ?? null)\n\t\t\t: null\n\t);\n\n\t// ── the open dialog ──────────────────────────────────────────────────\n\t// A dialog is drawn as a card in the transcript, never in the composer:\n\t// an AskUserQuestion where its entry sits, anything else (a permission\n\t// prompt, a local command's picker) at the foot, where the turn stopped.\n\n\t/** Which dialog is open: the live question's entry, or the pane's own. */\n\tconst dialogKey = $derived(liveAskId ?? (paneChoice || canAnswer ? 'pane' : null));\n\t/** The pane drew this dialog at some point, so its going away means it was answered. */\n\tlet seenLive = $state<string | null>(null);\n\t/** The card sent the keys that close this dialog, with no pane read to confirm it. */\n\tlet submitted = $state<string | null>(null);\n\t$effect(() => {\n\t\tif (dialogKey === null) {\n\t\t\tseenLive = null;\n\t\t\tsubmitted = null;\n\t\t} else if (paneChoice) {\n\t\t\tseenLive = dialogKey;\n\t\t\t// The pane still draws it, whatever keys the card sent blind.\n\t\t\tsubmitted = null;\n\t\t}\n\t});\n\t/** Answered and gone from the pane, while the hooks may still say it is open. */\n\tconst dialogClosed = $derived(\n\t\tdialogKey !== null &&\n\t\t\t((seenLive === dialogKey && paneChoice === null) || submitted === dialogKey)\n\t);\n\t/**\n\t * Questions answered here before the log says so. The JSONL records the\n\t * answers a moment after the dialog closes, and the card should not flash\n\t * back to open in between.\n\t */\n\tlet answeredAsks = $state<Record<string, true>>({});\n\tlet lastLiveAsk: { id: string; seen: boolean } | null = null;\n\t$effect(() => {\n\t\tif (liveAskId && dialogClosed) answeredAsks[liveAskId] = true;\n\t\t// The hooks can leave `waiting` on the same tick the pane drops the\n\t\t// dialog, so a question seen live that stops being live was answered.\n\t\tif (lastLiveAsk && lastLiveAsk.id !== liveAskId && lastLiveAsk.seen) {\n\t\t\tansweredAsks[lastLiveAsk.id] = true;\n\t\t}\n\t\tlastLiveAsk = liveAskId ? { id: liveAskId, seen: seenLive === liveAskId } : null;\n\t});\n\t/** The pane's dialog at the foot, when it is not the live question's. */\n\tconst footDialog = $derived(liveAskId === null && paneChoice !== null);\n\n\t/**\n\t * The turns claude-mux delivered from its queue or as a steer, by entry id.\n\t * Each delivery labels the first turn after it that carries its text, so\n\t * the same words sent twice label two turns, not one.\n\t */\n\tconst deliveredVia = $derived.by(() => {\n\t\tconst out = new Map<string, DeliveryInfo['via']>();\n\t\tfor (const d of delivered) {\n\t\t\tconst text = d.text.trim();\n\t\t\t// The JSONL stamps the turn a moment after the paste; allow for clock skew.\n\t\t\tconst turn = entries.find(\n\t\t\t\t(e) =>\n\t\t\t\t\t// A delivered queued entry is hidden behind its user turn.\n\t\t\t\t\t(e.kind === 'user' || (e.kind === 'queued' && !e.delivered)) &&\n\t\t\t\t\t!out.has(e.id) &&\n\t\t\t\t\te.ts >= d.at - 5000 &&\n\t\t\t\t\te.text.trim() === text\n\t\t\t);\n\t\t\tif (turn) out.set(turn.id, d.via);\n\t\t}\n\t\treturn out;\n\t});\n\n\tfunction formatTime(ts: number): string {\n\t\ttry {\n\t\t\treturn new Date(ts).toLocaleTimeString(undefined, {\n\t\t\t\thour: '2-digit',\n\t\t\t\tminute: '2-digit'\n\t\t\t});\n\t\t} catch {\n\t\t\treturn '';\n\t\t}\n\t}\n\n\tinterface InputField {\n\t\tkey: string;\n\t\tvalue: string;\n\t}\n\n\t/**\n\t * Split a tool's input into the shell command (when it has one), short\n\t * key/value rows and long text blocks — one pass, since the template would\n\t * otherwise filter the same list three times per render.\n\t */\n\tfunction inputPanes(\n\t\tinputJson: string,\n\t\ttoolName: string\n\t): { cmd: string | null; short: InputField[]; long: InputField[] } {\n\t\tlet entries: [string, unknown][];\n\t\ttry {\n\t\t\tentries = Object.entries(JSON.parse(inputJson) as Record<string, unknown>);\n\t\t} catch {\n\t\t\treturn { cmd: null, short: [], long: [{ key: 'input', value: inputJson }] };\n\t\t}\n\t\tconst isShell = toolName.toLowerCase().includes('bash');\n\t\tlet cmd: string | null = null;\n\t\tconst short: InputField[] = [];\n\t\tconst long: InputField[] = [];\n\t\tfor (const [key, raw] of entries) {\n\t\t\tconst value = typeof raw === 'string' ? raw : (JSON.stringify(raw, null, 2) ?? String(raw));\n\t\t\tif (isShell && key === 'command') {\n\t\t\t\tcmd = value;\n\t\t\t} else if (value.includes('\\n') || value.length > 90) {\n\t\t\t\tlong.push({ key, value });\n\t\t\t} else {\n\t\t\t\tshort.push({ key, value });\n\t\t\t}\n\t\t}\n\t\treturn { cmd, short, long };\n\t}\n\n</script>\n\n{#snippet grill(id: string, round: GrillRound)}\n\t{@const live = id === liveGrillId && !grillSent[id] && onSendReply != null}\n\t<!-- A busy session takes the reply into Claude Code's own queue, as the\n\t composer's does; only an open dialog would swallow it as keystrokes. -->\n\t{@const ready = live && sessionState !== 'waiting' && sessionState !== 'permission'}\n\t{#if round.intro}\n\t\t<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown output with raw HTML escaped above -->\n\t\t<div class=\"assistant-text markdown\">{@html renderMarkdown(round.intro)}</div>\n\t{/if}\n\t<section class=\"grill\" class:live aria-label=\"Questions from Claude\">\n\t\t{#each round.questions as q (q.n)}\n\t\t\t{@const a = answerOf(id, q)}\n\t\t\t<div class=\"gq\" class:skipped={live && a.mode === 'skip'}>\n\t\t\t\t<span class=\"gq-n\">Q{q.n}</span>\n\t\t\t\t<div class=\"gq-main\">\n\t\t\t\t\t{#if q.title}<p class=\"gq-title\">{q.title}</p>{/if}\n\t\t\t\t\t<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown output with raw HTML escaped above -->\n\t\t\t\t\t<div class=\"gq-body markdown\">{@html renderMarkdown(q.body)}</div>\n\t\t\t\t\t{#if q.recommended}\n\t\t\t\t\t\t{#if live}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"gq-rec\"\n\t\t\t\t\t\t\t\tclass:on={a.mode === 'accept'}\n\t\t\t\t\t\t\t\taria-pressed={a.mode === 'accept'}\n\t\t\t\t\t\t\t\tonclick={() => setAnswer(id, q.n, { mode: 'accept' })}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<iconify-icon\n\t\t\t\t\t\t\t\t\ticon={a.mode === 'accept' ? 'mdi:check-circle' : 'mdi:circle-outline'}\n\t\t\t\t\t\t\t\t></iconify-icon>\n\t\t\t\t\t\t\t\t<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown output with raw HTML escaped above -->\n\t\t\t\t\t\t\t\t<span class=\"markdown\">{@html renderMarkdown(q.recommended)}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t<div class=\"gq-rec past\">\n\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:arrow-right\"></iconify-icon>\n\t\t\t\t\t\t\t\t<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown output with raw HTML escaped above -->\n\t\t\t\t\t\t\t\t<span class=\"markdown\">{@html renderMarkdown(q.recommended)}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t{/if}\n\t\t\t\t\t{#if live}\n\t\t\t\t\t\t<div class=\"gq-own\">\n\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\trows=\"1\"\n\t\t\t\t\t\t\t\tuse:autosize\n\t\t\t\t\t\t\t\tplaceholder={q.recommended ? 'Or answer in your own words' : 'Your answer'}\n\t\t\t\t\t\t\t\tvalue={ownText(id, q)}\n\t\t\t\t\t\t\t\toninput={(e) => typeAnswer(id, q, e.currentTarget.value)}\n\t\t\t\t\t\t\t\tclass:filled={a.mode === 'own' && a.text.trim() !== ''}\n\t\t\t\t\t\t\t></textarea>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"gq-skip\"\n\t\t\t\t\t\t\t\tclass:on={a.mode === 'skip'}\n\t\t\t\t\t\t\t\taria-pressed={a.mode === 'skip'}\n\t\t\t\t\t\t\t\ttitle=\"Leave this question open for a later round\"\n\t\t\t\t\t\t\t\tonclick={() =>\n\t\t\t\t\t\t\t\t\tsetAnswer(id, q.n, a.mode === 'skip' ? (q.recommended ? { mode: 'accept' } : { mode: 'own', text: '' }) : { mode: 'skip' })}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{a.mode === 'skip' ? 'Left open' : 'Skip'}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t{/each}\n\t\t{#if live}\n\t\t\t<footer class=\"grill-foot\">\n\t\t\t\t<span class=\"grill-tally\">{tally(id, round)}</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"grill-send\"\n\t\t\t\t\tdisabled={!ready || grillSending === id}\n\t\t\t\t\ttitle={ready\n\t\t\t\t\t\t? 'Send these answers as your next message'\n\t\t\t\t\t\t: 'Answer the open dialog first; these go in after it'}\n\t\t\t\t\tonclick={() => void sendRound(id, round)}\n\t\t\t\t>\n\t\t\t\t\t{grillSending === id ? 'Sending…' : 'Send answers'}\n\t\t\t\t</button>\n\t\t\t</footer>\n\t\t{:else if grillSent[id]}\n\t\t\t<footer class=\"grill-foot\"><span class=\"grill-tally\">Answers sent</span></footer>\n\t\t{/if}\n\t</section>\n\t{#if round.outro}\n\t\t<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown output with raw HTML escaped above -->\n\t\t<div class=\"assistant-text markdown\">{@html renderMarkdown(round.outro)}</div>\n\t{/if}\n{/snippet}\n\n<div class=\"transcript\">\n\t{#if !loaded}\n\t\t<div class=\"empty\">\n\t\t\t<iconify-icon class=\"spin\" icon=\"mdi:loading\" style=\"font-size: 32px;\"></iconify-icon>\n\t\t\t<p>Loading transcript…</p>\n\t\t</div>\n\t{:else if !available && sessionState && sessionState !== 'idle'}\n\t\t<!-- The turn is under way; Claude Code writes the log as each block\n\t\t finishes, and the live row below says what it is doing meanwhile. -->\n\t\t<div class=\"empty starting\">\n\t\t\t<iconify-icon icon=\"mdi:text-box-plus-outline\" style=\"font-size: 32px;\"></iconify-icon>\n\t\t\t<p>Starting… waiting for the first entry.</p>\n\t\t</div>\n\t{:else if !available}\n\t\t<div class=\"empty\">\n\t\t\t<iconify-icon icon=\"mdi:text-box-search-outline\" style=\"font-size: 32px;\"></iconify-icon>\n\t\t\t<p>No transcript for this session yet.</p>\n\t\t\t<p class=\"hint\">It appears as soon as Claude Code writes its session log.</p>\n\t\t</div>\n\t{/if}\n\t{#if olderCount > 0}\n\t\t<div class=\"earlier\">\n\t\t\t<button type=\"button\" disabled={loadingEarlier} onclick={() => onLoadEarlier?.()}>\n\t\t\t\t<iconify-icon icon={loadingEarlier ? 'mdi:loading' : 'mdi:chevron-double-up'}\n\t\t\t\t></iconify-icon>\n\t\t\t\t{loadingEarlier ? 'Loading…' : 'Load earlier'}\n\t\t\t</button>\n\t\t\t<span class=\"earlier-count\">{olderCount} older {olderCount === 1 ? 'entry' : 'entries'}</span>\n\t\t</div>\n\t{/if}\n\t{#snippet turnGlyph(dictated: boolean)}\n\t\t{#if dictated}\n\t\t\t<iconify-icon class=\"mic-glyph\" icon=\"mdi:microphone\" title=\"dictated\"></iconify-icon>\n\t\t{:else}\n\t\t\t<span class=\"prompt-glyph\">❯</span>\n\t\t{/if}\n\t{/snippet}\n\t{#snippet via(id: string)}\n\t\t{@const how = deliveredVia.get(id)}\n\t\t{#if how}\n\t\t\t<span\n\t\t\t\tclass=\"via\"\n\t\t\t\ttitle={how === 'steer' ? 'Steered into the running turn' : 'Sent from the queue'}\n\t\t\t\t>{how === 'steer' ? 'Steer' : 'Queued'}</span\n\t\t\t>\n\t\t{/if}\n\t{/snippet}\n\t{#snippet row(entry: TranscriptEntry)}\n\t\t{#if entry.kind === 'user'}\n\t\t\t<div class=\"user-block\" class:dictated={entry.dictated} data-entry-id={entry.id}>\n\t\t\t\t{@render turnGlyph(entry.dictated ?? false)}\n\t\t\t\t<!-- A slash command is a different kind of turn: not prose the agent\n\t\t\t\t read, but an instruction to the harness. Show the command as a\n\t\t\t\t token so it is scannable, and its arguments as ordinary prompt\n\t\t\t\t text — the raw <command-*> tags never reach the reader. -->\n\t\t\t\t{#if entry.command}\n\t\t\t\t\t<div class=\"user-text\">\n\t\t\t\t\t\t<span class=\"slash-name\">{entry.command.name}</span>{#if entry.command.args}<span\n\t\t\t\t\t\t\t\tclass=\"slash-args\">{entry.command.args}</span\n\t\t\t\t\t\t\t>{/if}\n\t\t\t\t\t\t<!-- A local command answers on the spot — \"Set model to Fable\" —\n\t\t\t\t\t\t and that answer is the harness's, not the agent's, so it sits\n\t\t\t\t\t\t under the command rather than as a turn. -->\n\t\t\t\t\t\t{#if entry.command.output}\n\t\t\t\t\t\t\t<div class=\"slash-output\">{entry.command.output}</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t{:else}\n\t\t\t\t\t<div class=\"user-text\">{entry.text}</div>\n\t\t\t\t{/if}\n\t\t\t\t<span class=\"time\">{@render via(entry.id)}{formatTime(entry.ts)}</span>\n\t\t\t</div>\n\t\t{:else if entry.kind === 'queued'}\n\t\t\t{#if !entry.delivered}\n\t\t\t\t<div class=\"user-block\" class:dictated={entry.dictated} data-entry-id={entry.id}>\n\t\t\t\t\t{@render turnGlyph(entry.dictated ?? false)}\n\t\t\t\t\t<div class=\"user-text\">{entry.text}</div>\n\t\t\t\t\t<span class=\"time\" title=\"sent while the agent was working\">\n\t\t\t\t\t\t{@render via(entry.id)}\n\t\t\t\t\t\t<iconify-icon icon=\"mdi:clock-fast\"></iconify-icon>\n\t\t\t\t\t\t{formatTime(entry.ts)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t{:else if entry.kind === 'peer'}\n\t\t\t<div class=\"user-block peer\">\n\t\t\t\t<iconify-icon class=\"peer-icon\" icon=\"mdi:swap-horizontal\"></iconify-icon>\n\t\t\t\t<div class=\"peer-body\">\n\t\t\t\t\t{#if entry.from}<span class=\"peer-from\">{entry.from}</span>{/if}\n\t\t\t\t\t<div class=\"user-text peer-text\">{entry.text}</div>\n\t\t\t\t</div>\n\t\t\t\t<span class=\"time peer-time\">{formatTime(entry.ts)}</span>\n\t\t\t</div>\n\t\t{:else if entry.kind === 'interrupt'}\n\t\t\t<!-- Escape stopped the turn. Claude Code logs it as a user line, but\n\t\t\t nobody typed it, so it reads as a log note like \"Question dismissed\". -->\n\t\t\t<div class=\"row note\">\n\t\t\t\t<iconify-icon icon=\"mdi:stop-circle-outline\"></iconify-icon>\n\t\t\t\t<span class=\"row-summary\">{entry.text}</span>\n\t\t\t\t<span class=\"time\">{formatTime(entry.ts)}</span>\n\t\t\t</div>\n\t\t{:else if entry.kind === 'compact'}\n\t\t\t<!-- The conversation was folded here. Everything above it is what the\n\t\t\t model no longer sees; the summary is what it reads instead. -->\n\t\t\t<details class=\"compact\">\n\t\t\t\t<summary>\n\t\t\t\t\t<iconify-icon icon=\"mdi:arrow-collapse-vertical\"></iconify-icon>\n\t\t\t\t\t<span class=\"compact-title\">\n\t\t\t\t\t\tContext compacted{entry.trigger === 'manual' ? ' (/compact)' : ' automatically'}\n\t\t\t\t\t</span>\n\t\t\t\t\t{#if entry.preTokens && entry.postTokens}\n\t\t\t\t\t\t<span class=\"compact-tokens\">\n\t\t\t\t\t\t\t{Math.round(entry.preTokens / 1000)}k → {Math.round(entry.postTokens / 1000)}k tokens\n\t\t\t\t\t\t</span>\n\t\t\t\t\t{/if}\n\t\t\t\t\t<span class=\"time\">{formatTime(entry.ts)}</span>\n\t\t\t\t</summary>\n\t\t\t\t{#if entry.summary}\n\t\t\t\t\t<div class=\"compact-summary\">{@html renderMarkdown(entry.summary)}</div>\n\t\t\t\t{:else}\n\t\t\t\t\t<p class=\"compact-summary muted\">Summary not written yet.</p>\n\t\t\t\t{/if}\n\t\t\t</details>\n\t\t{:else if entry.kind === 'ask'}\n\t\t\t{#if entry.answers || entry.rejected}\n\t\t\t\t<details class=\"row ask-done\">\n\t\t\t\t\t<summary>\n\t\t\t\t\t\t<iconify-icon icon=\"mdi:chat-question-outline\"></iconify-icon>\n\t\t\t\t\t\t<span class=\"row-summary\">\n\t\t\t\t\t\t\t{#if entry.rejected}\n\t\t\t\t\t\t\t\tQuestion dismissed\n\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t{entry.questions\n\t\t\t\t\t\t\t\t\t.map((q) => `${q.header}: ${entry.answers?.[q.question] ?? '—'}`)\n\t\t\t\t\t\t\t\t\t.join(' · ')}\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<iconify-icon class=\"tool-status ok\" icon=\"mdi:check\"></iconify-icon>\n\t\t\t\t\t</summary>\n\t\t\t\t\t<div class=\"ask-detail\">\n\t\t\t\t\t\t{#each entry.questions as q (q.question)}\n\t\t\t\t\t\t\t<div class=\"ask-q-review\">\n\t\t\t\t\t\t\t\t<span class=\"ask-header-chip\">{q.header}</span>\n\t\t\t\t\t\t\t\t<p class=\"ask-question\">{q.question}</p>\n\t\t\t\t\t\t\t\t{#each q.options as opt (opt.label)}\n\t\t\t\t\t\t\t\t\t<div class=\"ask-opt-review\" class:chosen={entry.answers?.[q.question] === opt.label}>\n\t\t\t\t\t\t\t\t\t\t{opt.label}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t\t{#if entry.answers && !q.options.some((o) => o.label === entry.answers?.[q.question])}\n\t\t\t\t\t\t\t\t\t<div class=\"ask-opt-review chosen\">{entry.answers?.[q.question]}</div>\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</div>\n\t\t\t\t</details>\n\t\t\t{:else if entry.id === liveAskId || answeredAsks[entry.id]}\n\t\t\t\t<DialogCard\n\t\t\t\t\task={entry}\n\t\t\t\t\tchoice={entry.id === liveAskId ? paneChoice : null}\n\t\t\t\t\tpermission={sessionState === 'permission'}\n\t\t\t\t\tclosed={entry.id !== liveAskId || dialogClosed}\n\t\t\t\t\tonKeys={(keys) => onSendKeys?.(keys)}\n\t\t\t\t\tonText={(text) => onSendPaneText?.(text)}\n\t\t\t\t\tonSubmitted={() => (submitted = entry.id)}\n\t\t\t\t/>\n\t\t\t{:else}\n\t\t\t\t<div class=\"row note\">\n\t\t\t\t\t<iconify-icon icon=\"mdi:chat-question-outline\"></iconify-icon>\n\t\t\t\t\t<span class=\"row-summary\">\n\t\t\t\t\t\tQuestion not answered: {entry.questions.map((q) => q.header).join(' · ')}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\"time\">{formatTime(entry.ts)}</span>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t{:else if entry.kind === 'text' && grillRound(entry.text)}\n\t\t\t{@render grill(entry.id, grillRound(entry.text)!)}\n\t\t{:else if entry.kind === 'text'}\n\t\t\t<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown output with raw HTML escaped above -->\n\t\t\t<div class=\"assistant-text markdown\">{@html renderMarkdown(entry.text)}</div>\n\t\t{:else if entry.kind === 'thinking'}\n\t\t\t<details class=\"row thinking\">\n\t\t\t\t<summary>\n\t\t\t\t\t<iconify-icon icon=\"mdi:thought-bubble-outline\"></iconify-icon>\n\t\t\t\t\t<span class=\"row-summary\">Thinking</span>\n\t\t\t\t</summary>\n\t\t\t\t<div class=\"thinking-text\">{entry.text}</div>\n\t\t\t</details>\n\t\t{:else if entry.kind === 'tool'}\n\t\t\t{@const input = inputPanes(entry.input, entry.name)}\n\t\t\t{@const showResult = entry.result != null && !(entry.patch && entry.result.ok)}\n\t\t\t{@const sub = subagents[entry.id]}\n\t\t\t{@const doing = sub?.running ? sub.activity[sub.activity.length - 1] : null}\n\t\t\t<details\n\t\t\t\tclass=\"row tool-card\"\n\t\t\t\tclass:error={entry.result?.ok === false}\n\t\t\t\tclass:agent={sub != null}\n\t\t\t\tdata-entry-id={entry.id}\n\t\t\t\topen={opened[entry.id] ?? false}\n\t\t\t\tontoggle={(e) => {\n\t\t\t\t\topened[entry.id] = e.currentTarget.open;\n\t\t\t\t\tif (sub && !sub.full && e.currentTarget.open) onLoadSubagent?.(sub.agentId);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<summary>\n\t\t\t\t\t<iconify-icon class=\"tool-icon\" icon={toolIcon(entry.name)}></iconify-icon>\n\t\t\t\t\t{#if sub}\n\t\t\t\t\t\t<span class=\"row-summary agent-line\">\n\t\t\t\t\t\t\t<span class=\"agent-name\">{sub.description ?? entry.summary}</span>\n\t\t\t\t\t\t\t{#if sub.agentType}<span class=\"agent-type\">{sub.agentType}</span>{/if}\n\t\t\t\t\t\t\t{#if doing}\n\t\t\t\t\t\t\t\t<span class=\"agent-doing mono\"><ToolLabel name={doing.name} summary={doing.summary} /></span>\n\t\t\t\t\t\t\t{:else if sub.activity.length > 0}\n\t\t\t\t\t\t\t\t<span class=\"agent-count\">{sub.activity.length} tools</span>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{#if agentLink}\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\tclass=\"tool-open\"\n\t\t\t\t\t\t\t\thref={agentLink(sub.agentId)}\n\t\t\t\t\t\t\t\ttitle=\"Open agent\"\n\t\t\t\t\t\t\t\taria-label=\"Open agent\"\n\t\t\t\t\t\t\t\tonclick={(e) => e.stopPropagation()}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:open-in-new\"></iconify-icon>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t<span class=\"row-summary mono\"><ToolLabel name={entry.name} summary={entry.summary} /></span>\n\t\t\t\t\t\t{@const opens = fileLink ? toolFileTarget(entry) : null}\n\t\t\t\t\t\t{#if opens && fileLink}\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\tclass=\"tool-open\"\n\t\t\t\t\t\t\t\thref={fileLink(opens.path, opens.line)}\n\t\t\t\t\t\t\t\ttitle=\"Open in Files{opens.line ? ` at line ${opens.line}` : ''}\"\n\t\t\t\t\t\t\t\taria-label=\"Open in Files\"\n\t\t\t\t\t\t\t\tdata-sveltekit-noscroll\n\t\t\t\t\t\t\t\tdata-sveltekit-keepfocus\n\t\t\t\t\t\t\t\tonclick={(e) => e.stopPropagation()}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<iconify-icon icon=\"mdi:file-eye-outline\"></iconify-icon>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t{/if}\n\t\t\t\t\t{#if entry.result}\n\t\t\t\t\t\t<iconify-icon\n\t\t\t\t\t\t\tclass=\"tool-status {entry.result.ok ? 'ok' : 'fail'}\"\n\t\t\t\t\t\t\ticon={entry.result.ok ? 'mdi:check' : 'mdi:alert-circle-outline'}\n\t\t\t\t\t\t></iconify-icon>\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t<iconify-icon class=\"tool-status running spin\" icon=\"mdi:loading\"></iconify-icon>\n\t\t\t\t\t{/if}\n\t\t\t\t</summary>\n\t\t\t\t{#if sub}\n\t\t\t\t\t<div class=\"agent-detail\">\n\t\t\t\t\t\t<div class=\"agent-meta\">\n\t\t\t\t\t\t\t{#if sub.model}<span class=\"agent-chip\">{sub.model}</span>{/if}\n\t\t\t\t\t\t\t<span class=\"agent-chip\">{sub.activity.length} tools</span>\n\t\t\t\t\t\t\t{#if sub.running}<span class=\"agent-chip live\">running</span>{/if}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{#if sub.trimmed > 0}\n\t\t\t\t\t\t\t<div class=\"agent-trimmed\">{sub.trimmed} earlier calls not shown</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t<ol class=\"agent-activity\">\n\t\t\t\t\t\t\t{#each sub.activity as act (act.id)}\n\t\t\t\t\t\t\t\t<li class:pending={act.ok === null} class:failed={act.ok === false}>\n\t\t\t\t\t\t\t\t\t<iconify-icon class=\"tool-icon\" icon={toolIcon(act.name)}></iconify-icon>\n\t\t\t\t\t\t\t\t\t<span class=\"mono\"><ToolLabel name={act.name} summary={act.summary} /></span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t</ol>\n\t\t\t\t\t\t{#if sub.report}\n\t\t\t\t\t\t\t<div class=\"agent-report\">\n\t\t\t\t\t\t\t\t<header class=\"pane-head\">Report</header>\n\t\t\t\t\t\t\t\t<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown output with raw HTML escaped above -->\n\t\t\t\t\t\t\t\t<div class=\"markdown\">{@html renderMarkdown(sub.report)}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t{:else}\n\t\t\t\t<div class=\"tool-detail\" class:two-col={showResult && !entry.patch}>\n\t\t\t\t\t{#if entry.patch}\n\t\t\t\t\t\t<section class=\"pane diff-pane\">\n\t\t\t\t\t\t\t<header class=\"pane-head\">\n\t\t\t\t\t\t\t\tDiff\n\t\t\t\t\t\t\t\t{#if entry.patch.file}<span class=\"diff-file\">{entry.patch.file.split('/').pop()}</span>{/if}\n\t\t\t\t\t\t\t</header>\n\t\t\t\t\t\t\t<pre class=\"diff\">{#each entry.patch.hunks as hunk, hi (hi)}<span class=\"diff-hunk\">{hunk.header}</span>{'\\n'}{#each hunk.lines as dl, li (li)}<span\n\t\t\t\t\t\t\t\t\t\tclass={dl.startsWith('+') ? 'diff-add' : dl.startsWith('-') ? 'diff-del' : 'diff-ctx'}>{dl}</span>{'\\n'}{/each}{/each}</pre>\n\t\t\t\t\t\t</section>\n\t\t\t\t\t{:else if input.cmd || input.short.length > 0 || input.long.length > 0}\n\t\t\t\t\t\t<section class=\"pane\">\n\t\t\t\t\t\t\t<header class=\"pane-head\">Input</header>\n\t\t\t\t\t\t\t{#if input.cmd}\n\t\t\t\t\t\t\t\t<pre class=\"cmd\"><span class=\"cmd-glyph\">$</span> {input.cmd}</pre>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{#each input.short as field (field.key)}\n\t\t\t\t\t\t\t\t<div class=\"kv\"><span class=\"k\">{field.key}</span><span class=\"v\">{field.value}</span></div>\n\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t{#each input.long as field (field.key)}\n\t\t\t\t\t\t\t\t<div class=\"kv-long\">\n\t\t\t\t\t\t\t\t\t<span class=\"k\">{field.key}</span>\n\t\t\t\t\t\t\t\t\t<pre>{field.value}</pre>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t</section>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{#if showResult && entry.result}\n\t\t\t\t\t\t<section class=\"pane result\" class:ok={entry.result.ok} class:fail={!entry.result.ok}>\n\t\t\t\t\t\t\t<header class=\"pane-head\">{entry.result.ok ? 'Result' : 'Error'}</header>\n\t\t\t\t\t\t\t{#each entry.result.images ?? [] as path, i (i)}\n\t\t\t\t\t\t\t\t{@const src = `/api/files/image?path=${encodeURIComponent(path)}`}\n\t\t\t\t\t\t\t\t<a class=\"result-image\" href={src} target=\"_blank\" rel=\"noopener\">\n\t\t\t\t\t\t\t\t\t<img {src} alt={path.split('/').pop()} loading=\"lazy\" />\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t{#if entry.result.output || !entry.result.images}\n\t\t\t\t\t\t\t\t<pre>{entry.result.output || '(no output)'}</pre>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</section>\n\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\t\t\t</details>\n\t\t{/if}\n\t{/snippet}\n\t{#each items as item (item.id)}\n\t\t{#if item.kind === 'group'}\n\t\t\t<!-- A run of routine calls, folded the way the terminal folds it. Open,\n\t\t\t it is the same rows the run would have drawn on its own. -->\n\t\t\t<details\n\t\t\t\tclass=\"row tool-group\"\n\t\t\t\topen={opened[`group:${item.id}`] ?? opened[item.id] ?? false}\n\t\t\t\tontoggle={(e) => (opened[`group:${item.id}`] = e.currentTarget.open)}\n\t\t\t>\n\t\t\t\t<summary>\n\t\t\t\t\t<iconify-icon class=\"tool-icon\" icon=\"mdi:layers-outline\"></iconify-icon>\n\t\t\t\t\t<span class=\"row-summary\">{item.summary}</span>\n\t\t\t\t\t{#if item.failed > 0}\n\t\t\t\t\t\t<span class=\"group-failed\">{item.failed} failed</span>\n\t\t\t\t\t\t<iconify-icon class=\"tool-status fail\" icon=\"mdi:alert-circle-outline\"></iconify-icon>\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t<iconify-icon class=\"tool-status ok\" icon=\"mdi:check\"></iconify-icon>\n\t\t\t\t\t{/if}\n\t\t\t\t</summary>\n\t\t\t\t<div class=\"group-rows\">\n\t\t\t\t\t{#each item.entries as entry (entry.id)}\n\t\t\t\t\t\t{@render row(entry)}\n\t\t\t\t\t{/each}\n\t\t\t\t</div>\n\t\t\t</details>\n\t\t{:else}\n\t\t\t{@render row(item)}\n\t\t{/if}\n\t\t{@const changed = turnCards.get(item.id)}\n\t\t{#if changed && changesLink}\n\t\t\t<TurnChangesCard\n\t\t\t\tturn={changed}\n\t\t\t\troot={turnChanges?.root ?? null}\n\t\t\t\tbind:open={() => cardOpen[changed.id!] ?? changed.id === latestCard, (v) => (cardOpen[changed.id!] = v)}\n\t\t\t\tlink={(file) => changesLink(changed.n, file)}\n\t\t\t/>\n\t\t{/if}\n\t{/each}\n\n\t{#if footDialog}\n\t\t<DialogCard\n\t\t\tchoice={paneChoice}\n\t\t\tpermission={sessionState === 'permission'}\n\t\t\tonKeys={(keys) => onSendKeys?.(keys)}\n\t\t\tonText={(text) => onSendPaneText?.(text)}\n\t\t/>\n\t{/if}\n\n\t<!-- Live status: driven by hooks, which fire the instant a tool starts;\n\t the JSONL itself is written in batches and lags by seconds. -->\n\t{#if sessionState === 'busy'}\n\t\t<div class=\"live-row busy\">\n\t\t\t<SessionStateIndicator state=\"busy\" />\n\t\t\t{#if activity}\n\t\t\t\t<span class=\"live-verb mono\">{activity.verb}</span>\n\t\t\t\t<span class=\"live-chips\">\n\t\t\t\t\t{#if activity.doing}\n\t\t\t\t\t\t<Badge variant=\"outline\" class=\"{CHIP} min-w-0 shrink justify-start text-[#a8a29e]\">\n\t\t\t\t\t\t\t<span class=\"truncate\">{activity.doing}</span>\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{#if elapsedText}<Badge variant=\"outline\" class=\"{CHIP} font-mono\">{elapsedText}</Badge>{/if}\n\t\t\t\t\t{#if activity.tokens}\n\t\t\t\t\t\t<Badge variant=\"outline\" class=\"{CHIP} font-mono\"\n\t\t\t\t\t\t\t>{activity.tokens.dir === 'up' ? '↑' : '↓'} {activity.tokens.count} tokens</Badge\n\t\t\t\t\t\t>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{#if activity.thinking}<Badge variant=\"outline\" class={CHIP}>{activity.thinking}</Badge>{/if}\n\t\t\t\t</span>\n\t\t\t{:else}\n\t\t\t\t<span class=\"live-text mono\">{currentAction ?? 'Working…'}</span>\n\t\t\t{/if}\n\t\t</div>\n\t{:else if sessionState === 'permission' || sessionState === 'waiting'}\n\t\t{@const state = sessionState}\n\t\t<div class=\"live-row attention\" style=\"color: {sessionStateVisual(state).color}\">\n\t\t\t<SessionStateIndicator {state} />\n\t\t\t<span class=\"live-text\">\n\t\t\t\t{#if dialogClosed}\n\t\t\t\t\tAnswer sent — waiting for Claude to carry on\n\t\t\t\t{:else if liveAskId || footDialog}\n\t\t\t\t\tWaiting for your answer — answer in the card above ↑\n\t\t\t\t{:else if state === 'permission'}\n\t\t\t\t\tWaiting for permission — reading the dialog, or switch to terminal view to respond\n\t\t\t\t{:else}\n\t\t\t\t\tQuestion incoming… answer here when it appears, or in the terminal view\n\t\t\t\t{/if}\n\t\t\t</span>\n\t\t</div>\n\t{/if}\n\n\t{#if suggestion}\n\t\t<!-- Claude's own next-prompt proposal, drawn as the same not-yet-happened\n\t\t turn anchor as a queued message — but in the suggestion's blue, and\n\t\t tappable: accepting is the only interaction it has. -->\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"user-block pending suggested\"\n\t\t\tonclick={onAcceptSuggestion}\n\t\t\ttitle=\"Accept Claude's suggestion\"\n\t\t>\n\t\t\t<span class=\"prompt-glyph\">❯</span>\n\t\t\t<div class=\"user-text\">{suggestion}</div>\n\t\t\t<span class=\"time suggested-tag\" title=\"Claude's suggested next prompt — tap to accept\">\n\t\t\t\t<iconify-icon icon=\"mdi:star-four-points-outline\"></iconify-icon>\n\t\t\t\tsuggested · accept <kbd>⇥</kbd>\n\t\t\t</span>\n\t\t</button>\n\t{/if}\n</div>\n\n<style>\n\t.transcript {\n\t\twidth: 100%;\n\t\tmax-width: 860px;\n\t\tmargin: 0 auto;\n\t\t/* Assistant prose reads as text, not terminal output — deliberate contrast\n\t\t with the mono user prompts and tool rows (the terminal's vernacular). */\n\t\tfont-family:\n\t\t\tui-sans-serif,\n\t\t\tsystem-ui,\n\t\t\t-apple-system,\n\t\t\t'Segoe UI',\n\t\t\tRoboto,\n\t\t\tsans-serif;\n\t\t--mono: var(--font-mono);\n\t\tfont-size: 14.5px;\n\t\tline-height: 1.65;\n\t\tcolor: #d6d3d1;\n\t\tpadding-bottom: 8px;\n\t\t/* The .output host is a terminal container with pre-wrap; without this,\n\t\t the newlines marked emits between blocks render as visible gaps. */\n\t\twhite-space: normal;\n\t\tcontainer-type: inline-size;\n\t}\n\n\t.empty {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\tpadding: 56px 16px;\n\t\tcolor: #78716c;\n\t\ttext-align: center;\n\t}\n\t.empty.starting {\n\t\tpadding-bottom: 24px;\n\t}\n\t.empty.starting iconify-icon {\n\t\tanimation: starting-breathe 1.8s ease-in-out infinite;\n\t}\n\t@keyframes starting-breathe {\n\t\t50% {\n\t\t\topacity: 0.4;\n\t\t}\n\t}\n\t.empty .hint {\n\t\tfont-size: 12px;\n\t\tcolor: #57534e;\n\t}\n\n\t/* --- The head of a windowed transcript: quiet, since the reader who wants\n\t older turns is looking for it and everyone else is reading downward. --- */\n\t.earlier {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-wrap: wrap;\n\t\tgap: 8px 12px;\n\t\tpadding: 14px 8px 18px;\n\t\tborder-bottom: 1px solid #292524;\n\t\tmargin-bottom: 8px;\n\t}\n\t.earlier button {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\tpadding: 5px 12px;\n\t\tborder: 1px solid #44403c;\n\t\tborder-radius: 999px;\n\t\tbackground: #1c1917;\n\t\tcolor: #d6d3d1;\n\t\tfont-size: 12px;\n\t\tcursor: pointer;\n\t}\n\t.earlier button:hover {\n\t\tborder-color: #57534e;\n\t\tcolor: #fafaf9;\n\t}\n\t.earlier button[disabled] {\n\t\topacity: 0.6;\n\t\tcursor: default;\n\t}\n\t.earlier-count {\n\t\tfont-size: 11px;\n\t\tcolor: #78716c;\n\t}\n\n\t/* --- User prompt: the turn anchor, in the terminal's own voice.\n\t The one place this view spends visual weight: a warm panel against the\n\t cool-dark tool cards, so turns are findable when scrolling fast. --- */\n\t.user-block {\n\t\tdisplay: flex;\n\t\talign-items: baseline;\n\t\tgap: 10px;\n\t\tmargin: 30px 0 12px;\n\t\tpadding: 10px 12px;\n\t\tbackground: #241d12;\n\t\tborder: 1px solid #46351c;\n\t\tborder-left: 3px solid #d97706;\n\t\tborder-radius: 8px;\n\t}\n\t.user-block:first-child {\n\t\tmargin-top: 6px;\n\t}\n\t/* Queued in the terminal: the same turn anchor, drawn as an outline because\n\t it has not happened yet. */\n\t.user-block.pending {\n\t\tbackground: transparent;\n\t\tborder-style: dashed;\n\t\tborder-left-style: solid;\n\t\tborder-left-color: #7c5e2a;\n\t\tmargin: 12px 0;\n\t}\n\t.user-block.pending .prompt-glyph,\n\t.user-block.pending .user-text {\n\t\tcolor: #8f8578;\n\t}\n\t/* Claude's suggestion: the queued anchor's shape, in the one colour nothing\n\t else in the app uses — and clickable, because tapping accepts it. */\n\t.user-block.suggested {\n\t\twidth: 100%;\n\t\tfont: inherit;\n\t\ttext-align: left;\n\t\tcursor: pointer;\n\t\tborder-color: #3b3b5c;\n\t\tborder-left-color: #6366f1;\n\t}\n\t.user-block.suggested:hover {\n\t\tbackground: #14141c;\n\t}\n\t.user-block.suggested:focus-visible {\n\t\toutline: 2px solid #818cf8;\n\t\toutline-offset: -2px;\n\t}\n\t.user-block.suggested .prompt-glyph {\n\t\tcolor: #818cf8;\n\t}\n\t/* Ghost text reads faint in the terminal; keep it reading that way here. */\n\t.user-block.suggested .user-text {\n\t\tcolor: #8b8fb0;\n\t}\n\t.user-block.suggested .suggested-tag {\n\t\tcolor: #a5b4fc;\n\t}\n\t.suggested-tag kbd {\n\t\tfont: inherit;\n\t\tpadding: 0 4px;\n\t\tborder: 1px solid #3a3a52;\n\t\tborder-radius: 3px;\n\t}\n\t/* How a turn got there, when claude-mux delivered it for you. */\n\t.via {\n\t\tmargin-right: 6px;\n\t\tpadding: 0 5px;\n\t\tborder-radius: 4px;\n\t\tbackground: #292524;\n\t\tcolor: #a8a29e;\n\t\tfont-size: 10px;\n\t}\n\n\t.prompt-glyph,\n\t.mic-glyph {\n\t\tflex-shrink: 0;\n\t\twidth: 14px;\n\t\tfont-family: var(--mono);\n\t\tfont-weight: 700;\n\t\tfont-size: 14px;\n\t\tcolor: #f59e0b;\n\t}\n\t/* Dictated prompt: same turn anchor, warmed toward coral — spoken, not\n\t typed — with the microphone standing where the prompt glyph would be. */\n\t.user-block.dictated {\n\t\tbackground: #261418;\n\t\tborder-color: #492530;\n\t\tborder-left-color: #e0566f;\n\t}\n\t.mic-glyph {\n\t\tcolor: #fb7185;\n\t\talign-self: baseline;\n\t\ttransform: translateY(2px);\n\t}\n\t.user-block.dictated .user-text {\n\t\tcolor: #fde8e8;\n\t}\n\t.user-text {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tfont-family: var(--mono);\n\t\tfont-size: 13px;\n\t\tline-height: 1.55;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tcolor: #fef3c7;\n\t}\n\t/* Slash command: the name reads as a token, its arguments as plain prompt\n\t text — the same distinction the terminal's own input line makes. */\n\t.slash-name {\n\t\tpadding: 1px 6px;\n\t\tborder: 1px solid #6b4c1a;\n\t\tborder-radius: 5px;\n\t\tbackground: #33260f;\n\t\tcolor: #fbbf24;\n\t\tfont-weight: 600;\n\t}\n\t.slash-args {\n\t\tmargin-left: 8px;\n\t}\n\t/* What the command printed back, in the harness's voice: quieter than the\n\t prompt, and kept as printed. */\n\t.slash-output {\n\t\tmargin-top: 5px;\n\t\tpadding-left: 10px;\n\t\tborder-left: 2px solid #6b4c1a;\n\t\tcolor: #b8a87a;\n\t\tfont-size: 12.5px;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t}\n\n\t.time {\n\t\tflex-shrink: 0;\n\t\tfont-size: 10px;\n\t\tcolor: #8a7a55;\n\t\tfont-variant-numeric: tabular-nums;\n\t}\n\n\t.time iconify-icon {\n\t\tfont-size: 12px;\n\t\tvertical-align: -2px;\n\t}\n\n\t/* Cross-session (A2A) message: same anchor shape as a human turn, cool\n\t teal instead of warm amber — another agent's voice, not the user's. */\n\t.user-block.peer {\n\t\tbackground: #10201f;\n\t\tborder-color: #1e3d3a;\n\t\tborder-left-color: #14b8a6;\n\t}\n\t.peer-icon {\n\t\tflex-shrink: 0;\n\t\talign-self: baseline;\n\t\tfont-size: 15px;\n\t\tcolor: #2dd4bf;\n\t}\n\t.peer-body {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\t.peer-from {\n\t\tdisplay: block;\n\t\tfont-family: var(--mono);\n\t\tfont-size: 10.5px;\n\t\tfont-weight: 700;\n\t\tcolor: #2dd4bf;\n\t\tmargin-bottom: 2px;\n\t}\n\t.peer-text {\n\t\tcolor: #d8f3ef;\n\t}\n\t.peer-time {\n\t\tcolor: #3f6f68;\n\t}\n\n\t/* Agent activity sits slightly indented under its prompt anchor — the\n\t amber panel alone carries the turn structure, no rail needed. */\n\t.assistant-text,\n\t.row {\n\t\tmargin-left: 12px;\n\t}\n\n\t/* --- Assistant prose --- */\n\t.assistant-text {\n\t\tmargin-top: 10px;\n\t\tmargin-bottom: 10px;\n\t\tword-break: break-word;\n\t}\n\n\t/* --- Collapsible rows (tools + thinking): closed, they read as slim log\n\t lines — no box, dimmed, clearly \"machine activity\" next to the prose.\n\t The card chrome only appears when a row is opened. --- */\n\t.row {\n\t\tmargin-top: 1px;\n\t\tmargin-bottom: 1px;\n\t\tborder: 1px solid transparent;\n\t\tborder-radius: 7px;\n\t\tbackground: transparent;\n\t}\n\t.row[open] {\n\t\tmargin-top: 6px;\n\t\tmargin-bottom: 8px;\n\t\tborder-color: #262220;\n\t\tbackground: #1b1816;\n\t}\n\t.row summary {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tpadding: 2px 8px;\n\t\tcursor: pointer;\n\t\tlist-style: none;\n\t\tuser-select: none;\n\t\tfont-size: 12.5px;\n\t\tcolor: #8a837c;\n\t\tborder-radius: 7px;\n\t\ttransition: background 0.12s;\n\t}\n\t.row summary:hover {\n\t\tbackground: #201c18;\n\t\tcolor: #c7c2bd;\n\t}\n\t.row summary::-webkit-details-marker {\n\t\tdisplay: none;\n\t}\n\t.row[open] > summary {\n\t\tpadding: 5px 10px;\n\t\tcolor: #c7c2bd;\n\t\tborder-bottom: 1px solid #262220;\n\t\tborder-bottom-left-radius: 0;\n\t\tborder-bottom-right-radius: 0;\n\t}\n\t/* A row with nothing to open: the closed summary's look, no hover. */\n\t.row.note {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\tpadding: 2px 8px;\n\t\tfont-size: 12.5px;\n\t\tcolor: #8a837c;\n\t}\n\t.row-summary {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t.mono {\n\t\tfont-family: var(--mono);\n\t\tfont-size: 12px;\n\t\tcolor: inherit;\n\t}\n\n\t.tool-icon {\n\t\tflex-shrink: 0;\n\t\tcolor: #78716c;\n\t\tfont-size: 15px;\n\t}\n\t.tool-status {\n\t\tflex-shrink: 0;\n\t\tfont-size: 14px;\n\t}\n\t.tool-open {\n\t\tflex-shrink: 0;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 24px;\n\t\theight: 24px;\n\t\tmargin: -4px 0;\n\t\tborder-radius: 6px;\n\t\tcolor: #78716c;\n\t\tfont-size: 14px;\n\t}\n\t.tool-open:hover {\n\t\tbackground: #262626;\n\t\tcolor: #e7e5e4;\n\t}\n\t.tool-status.ok {\n\t\tcolor: #4d7c5f;\n\t}\n\t.tool-status.fail {\n\t\tcolor: #f87171;\n\t}\n\t.tool-status.running {\n\t\tcolor: #d97706;\n\t}\n\t.tool-card.error {\n\t\tborder-color: rgba(127, 29, 29, 0.6);\n\t}\n\t/* A folded run opens in place, without a card of its own: its rows hang off\n\t a thin rule under the summary, so a call opened inside it still reads as\n\t the one card on the screen. */\n\t.tool-group[open] {\n\t\tborder-color: transparent;\n\t\tbackground: transparent;\n\t}\n\t.tool-group[open] > summary {\n\t\tpadding: 2px 8px;\n\t\tborder-bottom: none;\n\t\tborder-radius: 7px;\n\t}\n\t.group-rows {\n\t\tmargin: 2px 0 6px 15px;\n\t\tpadding-left: 8px;\n\t\tborder-left: 1px solid #292524;\n\t}\n\t.group-failed {\n\t\tflex-shrink: 0;\n\t\tfont-size: 11.5px;\n\t\tcolor: #f87171;\n\t}\n\t.spin {\n\t\tanimation: spin 1s linear infinite;\n\t}\n\t@keyframes spin {\n\t\tto {\n\t\t\ttransform: rotate(360deg);\n\t\t}\n\t}\n\n\t.tool-detail {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: 1fr;\n\t\tgap: 8px;\n\t\tpadding: 8px 10px 10px;\n\t}\n\t/* Input and result share the row when there is room — the card stays short. */\n\t@container (min-width: 700px) {\n\t\t.tool-detail.two-col {\n\t\t\tgrid-template-columns: minmax(0, 5fr) minmax(0, 7fr);\n\t\t}\n\t}\n\t.pane {\n\t\tmin-width: 0;\n\t\tbackground: #14110e;\n\t\tborder: 1px solid #221e1a;\n\t\tborder-radius: 6px;\n\t\tpadding: 6px 9px 8px;\n\t}\n\t.pane.result.ok {\n\t\tborder-color: #1f2b22;\n\t\tbackground: #10140f;\n\t}\n\t.pane.result.fail {\n\t\tborder-color: #3d1d1d;\n\t\tbackground: #171010;\n\t}\n\t.pane-head {\n\t\tfont-size: 9.5px;\n\t\tfont-weight: 700;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.1em;\n\t\tcolor: #6b6560;\n\t\tmargin-bottom: 5px;\n\t}\n\t.pane.result.ok .pane-head {\n\t\tcolor: #5f8a6e;\n\t}\n\t.pane.result.fail .pane-head {\n\t\tcolor: #d16b6b;\n\t}\n\t.result-image {\n\t\tdisplay: block;\n\t\tmargin-bottom: 6px;\n\t}\n\t.result-image img {\n\t\tdisplay: block;\n\t\tmax-width: 100%;\n\t\tmax-height: 320px;\n\t\tborder: 1px solid #221e1a;\n\t\tborder-radius: 4px;\n\t}\n\t.pane pre {\n\t\tfont-family: var(--mono);\n\t\tfont-size: 11.5px;\n\t\tline-height: 1.5;\n\t\toverflow-x: auto;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tmax-height: 260px;\n\t\toverflow-y: auto;\n\t\tmargin: 0;\n\t}\n\t.diff-file {\n\t\tmargin-left: 8px;\n\t\ttext-transform: none;\n\t\tletter-spacing: 0;\n\t\tfont-size: 11px;\n\t\tfont-weight: 400;\n\t\tcolor: #a8a29e;\n\t\tfont-family: var(--mono);\n\t}\n\t.diff-hunk {\n\t\tcolor: #7d96b8;\n\t}\n\t.diff-add {\n\t\tcolor: #b7e0ae;\n\t\tbackground: rgba(46, 160, 67, 0.14);\n\t\tdisplay: inline-block;\n\t\twidth: 100%;\n\t}\n\t.diff-del {\n\t\tcolor: #f0b0aa;\n\t\tbackground: rgba(248, 81, 73, 0.13);\n\t\tdisplay: inline-block;\n\t\twidth: 100%;\n\t}\n\t.diff-ctx {\n\t\tcolor: #7d7871;\n\t}\n\n\t.cmd {\n\t\tcolor: #e7e5e4;\n\t}\n\t.cmd-glyph {\n\t\tcolor: #d97706;\n\t\tfont-weight: 700;\n\t\tuser-select: none;\n\t}\n\t.kv {\n\t\tdisplay: flex;\n\t\tgap: 8px;\n\t\talign-items: baseline;\n\t\tfont-size: 11.5px;\n\t\tmargin-top: 4px;\n\t\tmin-width: 0;\n\t}\n\t.kv-long {\n\t\tmargin-top: 6px;\n\t}\n\t.k {\n\t\tflex-shrink: 0;\n\t\tfont-family: var(--mono);\n\t\tfont-size: 10.5px;\n\t\tcolor: #6b6560;\n\t}\n\t.kv-long .k {\n\t\tdisplay: block;\n\t\tmargin-bottom: 3px;\n\t}\n\t.v {\n\t\tfont-family: var(--mono);\n\t\tcolor: #c7c2bd;\n\t\toverflow-wrap: anywhere;\n\t\tmin-width: 0;\n\t}\n\n\t/* --- A grilling round: questions as a form. Amber while it waits on you,\n\t the colour every surface keeps for \"a person is needed\"; the numbers sit\n\t in a gutter of their own because the round is read in order. --- */\n\t.grill {\n\t\tmargin: 12px 0 14px;\n\t\tborder: 1px solid #2a2a2c;\n\t\tborder-radius: 10px;\n\t\tbackground: #161514;\n\t}\n\t.grill.live {\n\t\tborder-color: #5a4310;\n\t\tborder-left: 3px solid #f59e0b;\n\t\tbackground: #1a1712;\n\t}\n\t.gq {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: 34px 1fr;\n\t\tpadding: 12px 14px 12px 0;\n\t}\n\t.gq + .gq {\n\t\tborder-top: 1px solid #262320;\n\t}\n\t.gq.skipped .gq-main {\n\t\topacity: 0.55;\n\t}\n\t.gq-n {\n\t\tfont-family: var(--mono);\n\t\tfont-size: 12px;\n\t\t/* The title's line box, so the number sits on the title's baseline. */\n\t\tline-height: calc(14.5px * 1.65);\n\t\tcolor: #78716c;\n\t\ttext-align: right;\n\t\tpadding-right: 10px;\n\t}\n\t.live .gq-n {\n\t\tcolor: #fbbf24;\n\t}\n\t.gq-main {\n\t\tmin-width: 0;\n\t}\n\t.gq-title {\n\t\tmargin: 0 0 2px;\n\t\tfont-weight: 600;\n\t\tcolor: #f5f5f4;\n\t}\n\t.gq-body {\n\t\tcolor: #d6d3d1;\n\t}\n\t.gq-rec {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tgap: 8px;\n\t\twidth: 100%;\n\t\tmargin-top: 9px;\n\t\tpadding: 8px 10px;\n\t\tborder: 1px dashed #44403c;\n\t\tborder-radius: 8px;\n\t\tbackground: transparent;\n\t\tcolor: #a8a29e;\n\t\tfont: inherit;\n\t\tfont-size: 13.5px;\n\t\tline-height: 1.55;\n\t\ttext-align: left;\n\t}\n\tbutton.gq-rec {\n\t\tcursor: pointer;\n\t}\n\tbutton.gq-rec:hover {\n\t\tborder-color: #78716c;\n\t\tcolor: #d6d3d1;\n\t}\n\t.gq-rec.on {\n\t\tborder-style: solid;\n\t\tborder-color: #a16207;\n\t\tbackground: #2a2112;\n\t\tcolor: #fde68a;\n\t}\n\t.gq-rec iconify-icon {\n\t\tflex: none;\n\t\tfont-size: 16px;\n\t\tmargin-top: 2px;\n\t}\n\t.gq-rec.on iconify-icon {\n\t\tcolor: #fbbf24;\n\t}\n\t.gq-rec.past {\n\t\tborder-style: solid;\n\t\tborder-color: #292524;\n\t\tcolor: #a8a29e;\n\t}\n\t.gq-rec .markdown {\n\t\tmin-width: 0;\n\t}\n\t.gq-own {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tgap: 6px;\n\t\tmargin-top: 6px;\n\t}\n\t.gq-own textarea {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tmax-height: 160px;\n\t\tresize: none;\n\t\tpadding: 6px 10px;\n\t\tborder: 1px solid #292524;\n\t\tborder-radius: 8px;\n\t\tbackground: #121110;\n\t\tcolor: #e7e5e4;\n\t\tfont: inherit;\n\t\tfont-size: 13.5px;\n\t\tline-height: 1.5;\n\t\toutline: none;\n\t}\n\t.gq-own textarea::placeholder {\n\t\tcolor: #57534e;\n\t}\n\t.gq-own textarea:focus {\n\t\tborder-color: #78716c;\n\t}\n\t.gq-own textarea.filled {\n\t\tborder-color: #a16207;\n\t}\n\t.gq-skip {\n\t\tflex: none;\n\t\theight: 32px;\n\t\tpadding: 0 10px;\n\t\tborder: 1px solid transparent;\n\t\tborder-radius: 8px;\n\t\tbackground: transparent;\n\t\tcolor: #78716c;\n\t\tfont-size: 12px;\n\t\tcursor: pointer;\n\t}\n\t.gq-skip:hover,\n\t.gq-skip.on {\n\t\tborder-color: #292524;\n\t\tcolor: #d6d3d1;\n\t}\n\t.grill-foot {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 10px;\n\t\tpadding: 10px 14px 12px 34px;\n\t\tborder-top: 1px solid #262320;\n\t}\n\t.grill-tally {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t\tfont-family: var(--mono);\n\t\tfont-size: 11.5px;\n\t\tcolor: #a8a29e;\n\t}\n\t.grill-send {\n\t\tflex: none;\n\t\theight: 34px;\n\t\tpadding: 0 16px;\n\t\tborder: 0;\n\t\tborder-radius: 8px;\n\t\tbackground: #f59e0b;\n\t\tcolor: #1c1307;\n\t\tfont-size: 13px;\n\t\tfont-weight: 600;\n\t\tcursor: pointer;\n\t}\n\t.grill-send:hover:not(:disabled) {\n\t\tbackground: #fbbf24;\n\t}\n\t.grill-send:disabled {\n\t\topacity: 0.45;\n\t\tcursor: default;\n\t}\n\t.gq-rec:focus-visible,\n\t.gq-skip:focus-visible,\n\t.grill-send:focus-visible {\n\t\toutline: 2px solid #fbbf24;\n\t\toutline-offset: 2px;\n\t}\n\t@media (pointer: coarse) {\n\t\t.gq-skip,\n\t\t.grill-send {\n\t\t\theight: 40px;\n\t\t}\n\t}\n\n\t/* --- AskUserQuestion, once answered: a log line that opens to the\n\t choices. The open dialog is DialogCard's. --- */\n\t.ask-header-chip {\n\t\tdisplay: inline-block;\n\t\tfont-size: 10px;\n\t\tfont-weight: 700;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.08em;\n\t\tcolor: #a8a29e;\n\t\tbackground: #262220;\n\t\tborder-radius: 4px;\n\t\tpadding: 1px 7px;\n\t\tmargin-bottom: 4px;\n\t}\n\t.ask-question {\n\t\tfont-weight: 500;\n\t\tcolor: #d6d3d1;\n\t\tmargin: 4px 0 6px;\n\t}\n\t/* Answered question: review layout inside the collapsed row */\n\t.ask-detail {\n\t\tpadding: 8px 12px 10px;\n\t}\n\t.ask-q-review + .ask-q-review {\n\t\tmargin-top: 10px;\n\t\tpadding-top: 8px;\n\t\tborder-top: 1px solid #262220;\n\t}\n\t.ask-opt-review {\n\t\tfont-size: 12.5px;\n\t\tcolor: #78716c;\n\t\tpadding: 2px 8px;\n\t\tborder-left: 2px solid transparent;\n\t}\n\t.ask-opt-review.chosen {\n\t\tcolor: #e7e5e4;\n\t\tborder-left-color: #4d7c5f;\n\t\tbackground: #161a16;\n\t\tborder-radius: 3px;\n\t}\n\n\t/* --- Subagent Task card: the one row that carries hierarchy. Closed, it\n\t reports what its agent is doing right now; open, it becomes that agent's\n\t own activity log and final report. --- */\n\t.tool-card.agent[open] {\n\t\tborder-color: #33302a;\n\t}\n\t.agent-line {\n\t\tdisplay: flex;\n\t\talign-items: baseline;\n\t\tgap: 8px;\n\t\tmin-width: 0;\n\t}\n\t.agent-name {\n\t\tmin-width: 0;\n\t\tmax-width: 60%;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\tfont-weight: 600;\n\t\tcolor: #d6d3d1;\n\t}\n\t.agent-type {\n\t\tflex-shrink: 0;\n\t\tfont-size: 9.5px;\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.08em;\n\t\tcolor: #9b8fd4;\n\t\tbackground: #221f2e;\n\t\tborder-radius: 4px;\n\t\tpadding: 1px 6px;\n\t}\n\t.agent-doing,\n\t.agent-count {\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\tfont-size: 11.5px;\n\t\tcolor: #7d7871;\n\t}\n\t.agent-doing::before {\n\t\tcontent: '● ';\n\t\tcolor: #34d399;\n\t}\n\n\t.agent-detail {\n\t\tpadding: 8px 12px 10px;\n\t}\n\t.agent-meta {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tgap: 5px;\n\t\tmargin-bottom: 8px;\n\t}\n\t.agent-chip {\n\t\tfont-size: 10px;\n\t\tcolor: #a8a29e;\n\t\tbackground: #232019;\n\t\tborder-radius: 4px;\n\t\tpadding: 1px 7px;\n\t}\n\t.agent-chip.live {\n\t\tcolor: #6ee7b7;\n\t\tbackground: #14251d;\n\t}\n\t.agent-activity {\n\t\tlist-style: none;\n\t\tmargin: 0;\n\t\tpadding: 0 0 0 11px;\n\t\tborder-left: 2px solid #2b2622;\n\t\t/* Agents reach 150+ calls; scroll inside the card instead of growing it. */\n\t\tmax-height: 260px;\n\t\toverflow-y: auto;\n\t}\n\t.agent-trimmed {\n\t\tfont-size: 10.5px;\n\t\tcolor: #6b6560;\n\t\tmargin-bottom: 3px;\n\t}\n\t.agent-activity li {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 7px;\n\t\tpadding: 1px 0;\n\t\tfont-size: 11.5px;\n\t\tcolor: #8a837c;\n\t\tmin-width: 0;\n\t}\n\t.agent-activity li span {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t.agent-activity li.pending {\n\t\tcolor: #d6d3d1;\n\t}\n\t.agent-activity li.failed {\n\t\tcolor: #f0b0aa;\n\t}\n\t.agent-report {\n\t\tmargin-top: 10px;\n\t\tpadding-top: 8px;\n\t\tborder-top: 1px solid #262220;\n\t\tfont-size: 13.5px;\n\t}\n\n\t/* --- Compaction boundary: a fold line across the conversation --- */\n\t.compact {\n\t\tmargin: 22px 0 14px;\n\t\tborder: 1px dashed #3a3a42;\n\t\tborder-radius: 8px;\n\t\tbackground: #121216;\n\t\tfont-size: 12.5px;\n\t}\n\t.compact summary {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 9px;\n\t\tpadding: 8px 12px;\n\t\tlist-style: none;\n\t\tcursor: pointer;\n\t\tcolor: #a8a29e;\n\t}\n\t.compact summary::-webkit-details-marker {\n\t\tdisplay: none;\n\t}\n\t.compact summary iconify-icon {\n\t\tfont-size: 15px;\n\t\tcolor: #a78bfa;\n\t}\n\t.compact-title {\n\t\tcolor: #c4b5fd;\n\t}\n\t.compact-tokens {\n\t\tfont-family: var(--mono);\n\t\tfont-size: 11px;\n\t\tcolor: #78716c;\n\t}\n\t.compact summary .time {\n\t\tmargin-left: auto;\n\t}\n\t.compact-summary {\n\t\tpadding: 4px 14px 12px;\n\t\tborder-top: 1px dashed #3a3a42;\n\t\tfont-size: 13px;\n\t\tline-height: 1.55;\n\t\tcolor: #a8a29e;\n\t}\n\t.compact-summary.muted {\n\t\tcolor: #57534e;\n\t}\n\n\t/* --- Live status row --- */\n\t.live-row {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 9px;\n\t\tmargin: 8px 0 4px 12px;\n\t\tfont-size: 12.5px;\n\t\tcolor: #a8a29e;\n\t}\n\t.live-verb {\n\t\tflex: none;\n\t\tcolor: #d6d3d1;\n\t}\n\t.live-chips {\n\t\tdisplay: flex;\n\t\tgap: 5px;\n\t\tmin-width: 0;\n\t\toverflow: hidden;\n\t}\n\t.live-text {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.spin,\n\t\t.empty.starting iconify-icon {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.thinking summary {\n\t\tcolor: #6b6560;\n\t\tfont-style: italic;\n\t}\n\t.thinking-text {\n\t\tpadding: 8px 12px;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tcolor: #78716c;\n\t\tfont-size: 13px;\n\t\tfont-style: italic;\n\t}\n</style>\n","import { browser } from '$app/environment';\nimport { ReliableWebSocket } from './websocket-base.svelte';\nimport type { ContextUsage } from '../../../../src/transcript/context.js';\nimport type { TranscriptEntry } from '../../../../src/transcript/parser.js';\nimport type { SubagentPayload } from '../../../../src/server/ws-handlers.js';\n\nexport type { SubagentPayload };\n\ninterface SnapshotMsg {\n\ttype: 'snapshot';\n\tentries: TranscriptEntry[];\n\tfirstIndex: number;\n\tsubagents: SubagentPayload[];\n\tcontext: ContextUsage | null;\n\tmodel?: string | null;\n\tavailable: boolean;\n}\ninterface HistoryMsg {\n\ttype: 'history';\n\tentries: TranscriptEntry[];\n\tfirstIndex: number;\n}\ninterface EntriesMsg {\n\ttype: 'entries';\n\tentries: TranscriptEntry[];\n\tindices: number[];\n}\ninterface SubagentsMsg {\n\ttype: 'subagents';\n\tsubagents: SubagentPayload[];\n}\ninterface ContextMsg {\n\ttype: 'context';\n\tcontext: ContextUsage;\n}\ninterface ModelMsg {\n\ttype: 'model';\n\tmodel: string;\n}\ntype TranscriptMsg = SnapshotMsg | HistoryMsg | EntriesMsg | SubagentsMsg | ContextMsg | ModelMsg;\n\n/** Entries per \"load earlier\" request. */\nconst HISTORY_PAGE = 200;\n\n/**\n * Transcript view model: an ordered list of entries upserted by id.\n * The server sends a full snapshot on attach and per-entry deltas afterwards\n * (an updated entry — e.g. a tool call receiving its result — keeps its\n * position; a new one is appended).\n */\nexport class TranscriptStore extends ReliableWebSocket {\n\tentries = $state<TranscriptEntry[]>([]);\n\t/** All subagents, keyed by their own id — some have no parent Task id. */\n\tsubagents = $state<Record<string, SubagentPayload>>({});\n\t/** The subset that can be attached to a Task card, keyed by that card's id. */\n\tsubagentsByTask: Record<string, SubagentPayload> = $derived(\n\t\tObject.fromEntries(\n\t\t\tObject.values(this.subagents)\n\t\t\t\t.filter((sub) => sub.toolUseId)\n\t\t\t\t.map((sub) => [sub.toolUseId as string, sub])\n\t\t)\n\t);\n\t/** Context window in use as of the last API response, null before one. */\n\tcontext = $state<ContextUsage | null>(null);\n\t/** The model on the latest assistant line, as the API names it. */\n\tmodel = $state<string | null>(null);\n\t/** False until the session's JSONL file has been found and read. */\n\tavailable = $state(false);\n\t/** Entries appended since attach (page diffs it for the \"new below\" pill). */\n\tappended = $state(0);\n\t/**\n\t * Position of `entries[0]` in the session's whole transcript: the server\n\t * sends only the tail, so this is how many older entries exist. Zero once\n\t * the reader has pulled the whole thing back.\n\t */\n\tfirstIndex = $state(0);\n\t/** A history request is in flight (the button waits rather than stacking). */\n\tloadingEarlier = $state(false);\n\t/** Resolved when the slice a `loadEarlier()` caller asked for has landed. */\n\tprivate pendingEarlier: (() => void) | null = null;\n\n\tprivate indexById = new Map<string, number>();\n\tprivate sessionId: string | null = null;\n\t/** Set when this store reads one of the session's subagents instead of the session. */\n\tprivate agentId: string | null = null;\n\n\tprotected getWsUrl(): string {\n\t\tconst protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n\t\tconst session = encodeURIComponent(this.sessionId!);\n\t\tconst agent = this.agentId ? `/agents/${encodeURIComponent(this.agentId)}` : '';\n\t\treturn `${protocol}//${window.location.host}/api/sessions/${session}${agent}/transcript/stream`;\n\t}\n\n\tprotected getLogPrefix(): string {\n\t\treturn '[transcript]';\n\t}\n\n\tprotected shouldReconnect(): boolean {\n\t\treturn this.sessionId !== null;\n\t}\n\n\tprotected handleMessage(event: MessageEvent): void {\n\t\tlet data: TranscriptMsg;\n\t\ttry {\n\t\t\tdata = JSON.parse(event.data);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tswitch (data.type) {\n\t\t\tcase 'snapshot':\n\t\t\t\tthis.applySnapshot(data);\n\t\t\t\tbreak;\n\t\t\tcase 'history':\n\t\t\t\tthis.applyHistory(data);\n\t\t\t\tbreak;\n\t\t\tcase 'entries':\n\t\t\t\tthis.applyEntries(data);\n\t\t\t\tbreak;\n\t\t\tcase 'subagents':\n\t\t\t\tthis.applySubagents(data.subagents);\n\t\t\t\tbreak;\n\t\t\tcase 'context':\n\t\t\t\tthis.context = data.context;\n\t\t\t\tbreak;\n\t\t\tcase 'model':\n\t\t\t\tthis.model = data.model;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate applySnapshot(msg: SnapshotMsg): void {\n\t\tthis.entries = msg.entries;\n\t\tthis.available = msg.available;\n\t\tthis.firstIndex = msg.firstIndex;\n\t\tthis.settleEarlier();\n\t\tthis.context = msg.context ?? null;\n\t\tthis.model = msg.model ?? null;\n\t\tthis.reindex();\n\t\tthis.subagents = {};\n\t\tthis.applySubagents(msg.subagents ?? []);\n\t}\n\n\t/** An older slice, prepended in front of what is already held. */\n\tprivate applyHistory(msg: HistoryMsg): void {\n\t\t// A snapshot may have overtaken the request; anything already held wins.\n\t\tconst older = msg.entries.filter((entry) => !this.indexById.has(entry.id));\n\t\tif (older.length > 0) {\n\t\t\tthis.entries = [...older, ...this.entries];\n\t\t\tthis.firstIndex = msg.firstIndex;\n\t\t\tthis.reindex();\n\t\t}\n\t\tthis.settleEarlier();\n\t}\n\n\t/** Ends the wait a `loadEarlier()` caller is in, whatever answered it. */\n\tprivate settleEarlier(): void {\n\t\tthis.loadingEarlier = false;\n\t\tthis.pendingEarlier?.();\n\t\tthis.pendingEarlier = null;\n\t}\n\n\tprivate reindex(): void {\n\t\tthis.indexById = new Map(this.entries.map((entry, i) => [entry.id, i]));\n\t}\n\n\t/**\n\t * Ask the server for the slice before the oldest entry held. Resolves once\n\t * those entries are in `entries`, so a caller holding the reader's scroll\n\t * position knows when to restore it. Resolves immediately when there is\n\t * nothing older or a request is already out.\n\t */\n\tloadEarlier(): Promise<void> {\n\t\tif (this.firstIndex <= 0 || this.loadingEarlier) return Promise.resolve();\n\t\tconst sent = this.send(\n\t\t\tJSON.stringify({\n\t\t\t\ttype: 'history_request',\n\t\t\t\tbefore: this.firstIndex,\n\t\t\t\tcount: HISTORY_PAGE\n\t\t\t})\n\t\t);\n\t\tif (!sent) return Promise.resolve();\n\t\tthis.loadingEarlier = true;\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.pendingEarlier = resolve;\n\t\t});\n\t}\n\n\t/**\n\t * Ask for everything an agent ran and reported. Cards arrive lean — the\n\t * tail of the activity, no report — and this is what opening one sends.\n\t */\n\tloadSubagent(agentId: string): void {\n\t\tconst held = this.subagents[agentId];\n\t\tif (!held || held.full) return;\n\t\tthis.send(JSON.stringify({ type: 'subagent_request', agentId }));\n\t}\n\n\t/**\n\t * Subagents arrive lean unless their card was opened. A lean update for an\n\t * agent already held in full keeps what is held and appends the new tail,\n\t * so an open card does not lose its list to the next live update.\n\t */\n\tprivate applySubagents(subagents: SubagentPayload[]): void {\n\t\tfor (const sub of subagents) {\n\t\t\tconst held = this.subagents[sub.agentId];\n\t\t\tif (held?.full && !sub.full) {\n\t\t\t\tconst seen = new Set(sub.activity.map((a) => a.id));\n\t\t\t\tconst kept = held.activity.filter((a) => !seen.has(a.id));\n\t\t\t\tthis.subagents[sub.agentId] = {\n\t\t\t\t\t...sub,\n\t\t\t\t\tactivity: [...kept, ...sub.activity],\n\t\t\t\t\ttrimmed: Math.max(0, sub.trimmed - kept.length),\n\t\t\t\t\treport: sub.report ?? held.report,\n\t\t\t\t\tfull: true\n\t\t\t\t};\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.subagents[sub.agentId] = sub;\n\t\t}\n\t}\n\n\tprivate applyEntries(msg: EntriesMsg): void {\n\t\tthis.available = true;\n\t\tfor (const [i, entry] of msg.entries.entries()) {\n\t\t\tconst index = this.indexById.get(entry.id);\n\t\t\tif (index !== undefined) {\n\t\t\t\tthis.entries[index] = entry;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// An update to an entry older than the tail this client holds: it\n\t\t\t// belongs in the gap above, and arrives with the history slice.\n\t\t\tif (msg.indices[i] < this.firstIndex) continue;\n\t\t\tthis.indexById.set(entry.id, this.entries.length);\n\t\t\tthis.entries.push(entry);\n\t\t\tthis.appended++;\n\t\t}\n\t}\n\n\t/**\n\t * Single entry point: pass a claude-mux session id to view its transcript,\n\t * or null to detach. Mirrors terminalStore.setTarget's lifecycle contract.\n\t * With `agentId`, the store holds that subagent's transcript instead, and\n\t * `subagents` holds that one agent.\n\t */\n\tsetSession(sessionId: string | null | undefined, agentId: string | null = null): void {\n\t\tif (!browser) return;\n\t\tconst next = sessionId ?? null;\n\t\tconst nextAgent = next ? agentId : null;\n\n\t\tif (this.sessionId === next && this.agentId === nextAgent) {\n\t\t\tif (next === null) return;\n\t\t\tif (this.ws) return;\n\t\t\tthis.doConnect();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.ws) {\n\t\t\tthis.sessionId = null; // suppress reconnect in doDisconnect\n\t\t\tthis.doDisconnect();\n\t\t}\n\t\tthis.entries = [];\n\t\tthis.subagents = {};\n\t\tthis.context = null;\n\t\tthis.available = false;\n\t\tthis.appended = 0;\n\t\tthis.firstIndex = 0;\n\t\tthis.settleEarlier();\n\t\tthis.resetReceived();\n\t\tthis.indexById = new Map();\n\t\tthis.sessionId = next;\n\t\tthis.agentId = nextAgent;\n\n\t\tif (next) this.doConnect();\n\t}\n}\n\nexport const transcriptStore = new TranscriptStore();\n"],"names":["keysForAnswer","picks","options","sorted","i","a","b","keysForOptionPick","keys","cursor","pick","step","from","to","count","move","keysForOptionMove","start","steps","liveRows","$$anchor","qi","$.noop","div","root_5","$.get","rows","row","preview","$.derived","previewFor","button","root_4","node","$.child","span","root","$.template_effect","$.set_text","text_1","iconify_icon","root_1","$.set_custom_element_data","classes_1","$$render","consequent","alternate","span_1","$.sibling","span_2","text_2","$.only_child","node_1","span_3","root_2","text_3","$.append","consequent_1","pre","root_3","consequent_2","$.reset","$$node","$$action_arg","longPress","highlight","classes","closed","$.delegated","freeText","placeholder","label","form","root_7","node_3","Input","freeKeydown","inputEl","$$value","draft","sending","Button","node_4","iconify_icon_1","$.first_child","fragment","noting","text_5","e","sendFree","paneFreeText","answerLabel","notingOn","textRow","consequent_3","keysBar","$$props","note","p","root_9","span_4","text_6","node_7","button_1","fragment_4","iconify_icon_2","button_2","iconify_icon_3","d","ARROW_NOTE","div_1","node_6","button_3","iconify_icon_4","button_4","iconify_icon_5","node_8","button_5","root_10","iconify_icon_6","done","reviewing","consequent_5","$.each","node_9","extraKeys","extra","button_6","root_11","kbd","text_7","text_8","button_7","node_10","p_1","root_12","text_9","consequent_6","ask","$.prop","permission","norm","s","o","liveIndex","asked","byText","q","first","sentCount","$.state","blind","current","hasSubmitTab","atSubmit","typing","$.user_effect","text","$.set","n","advanceBlind","opts","multi","wasNoting","paneTyping","OPEN_TIMEOUT_MS","until","r","walkTo","walk","pickBlind","oi","next","confirmBlind","finish","submit","KEY_SEGMENT","out","segment","m","l","reveal","el","isPermission","title","section","root_26","header","iconify_icon_7","span_5","text_10","node_11","iconify_icon_8","$.set_class","consequent_7","sent","active","div_2","root_18","span_6","text_11","p_2","text_12","node_14","div_3","root_14","node_16","div_4","fragment_7","opt","button_8","root_16","node_17","iconify_icon_9","$0","classes_6","span_7","text_13","consequent_10","alternate_1","span_8","span_9","text_14","node_18","span_10","text_15","consequent_11","pre_1","text_16","consequent_12","classes_5","node_20","consequent_13","alternate_2","consequent_14","consequent_8","consequent_9","alternate_3","classes_3","div_5","root_20","node_23","p_3","root_19","text_18","consequent_15","node_24","consequent_16","consequent_17","footer","root_22","span_11","node_27","text_20","consequent_18","alternate_4","node_28","node_29","iconify_icon_10","fragment_13","consequent_19","consequent_20","div_6","fragment_15","node_31","p_4","text_22","consequent_22","node_32","node_34","p_5","root_25","consequent_23","consequent_24","$.action","classes_2","$.set_attribute","parseMcpToolName","name","match","MCP_FAMILIES","toolIcon","mcp","pattern","arg","fragment_1","QUESTION","RECOMMENDED","firstParagraph","lines","blank","join","parseGrillRound","starts","line","intro","questions","outro","end","rest","recAt","bodyLines","recommended","recLines","para","after","composeGrillReply","round","answers","answer","asRecord","value","readString","STANDALONE_TOOLS","foldable","entry","plural","one","many","times","SHELL","READ","EDIT","WRITE","SEARCH","LIST","FETCH","WEB_SEARCH","COMPOUND","SHELL_VERBS","shellCategory","input","command","verb","args","category","TOOL_CATEGORIES","categoryCache","categorize","tool","categorizeUncached","summarizeToolRun","tools","counts","seen","groupToolRuns","entries","items","run","flush","body","t","open","totals","sumCounts","root_6","node_2","ul","f","letter","statusLetter","li","bdi","$1","displayPath","grill","id","live","liveGrillId","grillSent","ready","sessionState","$.html","renderMarkdown","answerOf","setAnswer","textarea","$.remove_textarea_child","autosize","$.set_value","classes_4","ownText","typeAnswer","consequent_4","text_4","grillSending","tally","sendRound","footer_1","currentAction","activity","delivered","suggestion","paneChoice","subagents","olderCount","loadingEarlier","turnChanges","now","startedAt","ticking","CHIP","elapsedText","formatSpinnerElapsed","turnRunning","turnCards","placeTurnChanges","latestCard","cardOpen","$.proxy","opened","roundCache","grillRound","grillAnswers","agreed","own","parts","fit","canAnswer","liveAskId","dialogKey","seenLive","submitted","dialogClosed","answeredAsks","lastLiveAsk","footDialog","deliveredVia","turn","formatTime","ts","inputPanes","inputJson","toolName","isShell","cmd","short","long","key","raw","div_7","root_69","turnGlyph","dictated","via","how","div_8","div_9","node_13","div_10","root_13","div_11","root_15","node_12","node_15","div_12","root_17","div_13","div_14","div_15","node_19","div_16","div_17","span_12","text_17","span_13","details","root_24","summary","span_14","text_19","span_15","root_21","span_16","text_21","div_18","root_23","details_1","root_28","summary_1","span_17","div_19","div_20","root_27","span_18","text_24","text_25","div_21","text_26","classes_7","div_22","text_27","$2","DialogCard","div_23","span_19","text_28","span_20","text_29","consequent_25","alternate_5","div_24","details_2","root_29","summary_2","div_25","text_30","showResult","sub","doing","details_3","root_55","summary_3","iconify_icon_11","node_26","span_21","fragment_10","span_22","text_31","span_23","root_30","text_32","consequent_30","span_24","root_31","ToolLabel","span_25","root_32","text_33","consequent_32","node_30","a_1","root_33","iconify_icon_12","opens","toolFileTarget","span_26","fragment_11","a_2","root_35","iconify_icon_13","consequent_35","consequent_34","alternate_6","iconify_icon_14","iconify_icon_15","consequent_36","alternate_7","div_26","root_42","div_27","node_35","span_27","root_37","text_34","consequent_37","span_28","text_35","node_36","span_29","root_38","consequent_38","node_37","div_28","root_39","text_36","consequent_39","ol","act","li_1","root_40","iconify_icon_16","span_30","node_38","classes_9","div_29","root_41","div_30","consequent_40","div_31","root_54","node_40","section_1","root_46","span_31","root_43","text_37","consequent_42","hunk","span_32","fragment_12","text_38","text_39","$.index","dl","span_33","text_40","text_41","$.clsx","section_2","root_50","node_43","root_47","text_42","consequent_44","field","div_32","root_48","span_34","text_43","span_35","text_44","div_33","root_49","span_36","text_45","pre_2","text_46","consequent_43","consequent_45","section_3","root_53","header_1","text_47","node_47","path","src","a_3","root_51","img","pre_3","root_52","text_48","consequent_46","classes_11","consequent_47","classes_10","consequent_41","alternate_8","classes_8","consequent_21","consequent_26","d_2","consequent_27","consequent_28","consequent_48","node_49","div_34","root_56","iconify_icon_17","$.set_style","div_35","root_57","iconify_icon_18","div_36","root_58","iconify_icon_19","consequent_50","consequent_51","consequent_49","div_37","root_59","iconify_icon_20","text_49","span_37","text_50","consequent_52","node_51","item","changed","details_4","root_61","summary_4","iconify_icon_21","span_38","text_51","node_53","span_39","text_52","iconify_icon_22","iconify_icon_23","consequent_53","alternate_9","div_38","$.event","consequent_54","alternate_10","v","TurnChangesCard","file","consequent_55","consequent_56","div_39","root_66","node_57","SessionStateIndicator","span_40","fragment_20","text_53","span_41","node_59","Badge","span_42","root_63","text_54","consequent_57","consequent_58","text_56","consequent_59","text_57","consequent_60","span_43","root_65","text_58","consequent_61","alternate_11","state","div_40","root_67","node_63","span_44","node_64","consequent_64","consequent_65","alternate_12","sessionStateVisual","consequent_62","consequent_66","root_68","div_41","text_63","span_45","iconify_icon_24","$$args","consequent_67","HISTORY_PAGE","TranscriptStore","ReliableWebSocket","#subagentsByTask","protocol","session","agent","event","data","msg","older","resolve","agentId","held","kept","index","sessionId","nextAgent","transcriptStore"],"mappings":"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"}
|