@invana/assistant 0.0.33 → 0.0.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +13 -13
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/answers/page.ts","../src/answers/index.ts","../src/conversations/thread.ts","../src/answers/blocks/cite-focus.ts","../src/answers/shared.tsx","../src/conversations/registry.ts","../src/protocol/reduce.ts","../src/protocol/stream.ts","../src/styles/base/context.tsx","../src/styles/base/format.ts","../src/styles/base/model.ts","../src/styles/base/chrome.tsx","../src/asks/index.ts","../src/conversations/relative-time.ts","../src/grammar/stages.ts","../src/grammar/patterns.ts","../src/grammar/asks.ts","../src/grammar/answers.ts","../src/grammar/flows.ts","../src/styles/base/ask.tsx","../src/conversations/block-status.tsx","../src/styles/base/blocks.tsx","../src/styles/base/composer.tsx","../src/styles/base/steps.tsx","../src/styles/cli/cli-session.tsx","../src/styles/types.ts","../src/conversations/turn-label.tsx","../src/styles/web/web-session.tsx","../src/styles/chat-session.tsx","../src/styles/use-chat-session.ts","../src/styles/web/turn.tsx","../src/protocol/events.ts","../src/protocol/validate.ts"],"names":["UiEmissionCard","UiEmissionBody","UiEmissionHeader","UiCitationMarker","UiTemplatePicker","UiChatSession","UiChatSessionMessage","UiChatSessionMessageOptions","UiChatSessionComposer","UiChatSessionActivityRow","UiChatSessionActivitySubLine","uiChatSessionGutterClass","UiChatSessionPromptRow","UiChatSessionProgressLine","UiChatSessionCaret","UiChatSessionDisclosure","UiChatSessionDisclosureCode","UiChatSessionDisclosureSteps","UiChatSessionTaskRow","UiChatSessionTaskGroup","UiChatSessionStatusBar","UiChatSessionContextChip","React","BLOCK_RENDERERS","patchesOfAny","fromNdjsonOf","fromEventSourceOf","playScriptOf","offsetScriptOf","started","React2","jsx","React3","UiClarifyCard","UiClarifyFootnote","UiClarifyActions","jsxs","SuggestionChips","cn","Placeholder","isRunning","React4","Fragment","React5","ChatSession","React7","set","React8","ASK_KINDS","ANSWER_KINDS"],"mappings":"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","file":"index.js","sourcesContent":["import { BLOCK_RENDERERS, type BlockSpec as SharedBlockSpec, type PageSpec } from \"@invana/blocks\"\n\nimport type { AnswerTurn } from \"../protocol/types\"\n\n/**\n * An answer opened as a page: the blocks `@invana/blocks` draws, in order,\n * under the answer's title. What only a conversation shows — citations,\n * caveats, the trace — stays in the thread.\n */\nexport function answerToPage(turn: AnswerTurn): PageSpec {\n // Drawn only: a kind with a renderer, and data that has arrived — not still\n // loading, and not empty (a page has no room for the thread's empty line).\n const blocks = turn.blocks.filter(\n (b) =>\n BLOCK_RENDERERS[b.kind as keyof typeof BLOCK_RENDERERS] != null &&\n b.status !== \"loading\" &&\n b.status !== \"empty\",\n ) as unknown as SharedBlockSpec[]\n return { title: turn.title, sections: [{ blocks }] }\n}\n","import {\n CitationMarker as UiCitationMarker,\n EmissionBody as UiEmissionBody,\n EmissionCard as UiEmissionCard,\n EmissionHeader as UiEmissionHeader,\n TemplatePicker as UiTemplatePicker,\n} from \"@invana/ui\"\n\n/*\n * The answer card and what hangs off it, moving from `@invana/ui`; see\n * `conversations/thread.ts` for why they are re-declared.\n */\n\n/** The answer card. An answer is its blocks inside this card. */\nexport const EmissionCard = UiEmissionCard\n/** The card's body: its blocks in one padded column. */\nexport const EmissionBody = UiEmissionBody\n/** The strip that says what an answer is and what it is grounded in. */\nexport const EmissionHeader = UiEmissionHeader\n/** The superscript that ties a clause to the records behind it. */\nexport const CitationMarker = UiCitationMarker\n/** Re-render the same records as another block. */\nexport const TemplatePicker = UiTemplatePicker\n\nexport type {\n EmissionCardProps,\n EmissionHeaderProps,\n EmissionKind,\n TemplateOption,\n TemplatePickerProps,\n} from \"@invana/ui\"\n\nexport { answerToPage } from \"./page\"\n","import {\n ChatSession as UiChatSession,\n ChatSessionActivityRow as UiChatSessionActivityRow,\n ChatSessionActivitySubLine as UiChatSessionActivitySubLine,\n ChatSessionComposer as UiChatSessionComposer,\n ChatSessionContextChip as UiChatSessionContextChip,\n ChatSessionCaret as UiChatSessionCaret,\n ChatSessionDisclosure as UiChatSessionDisclosure,\n ChatSessionDisclosureCode as UiChatSessionDisclosureCode,\n ChatSessionDisclosureSteps as UiChatSessionDisclosureSteps,\n ChatSessionMessage as UiChatSessionMessage,\n ChatSessionMessageOptions as UiChatSessionMessageOptions,\n ChatSessionProgressLine as UiChatSessionProgressLine,\n ChatSessionPromptRow as UiChatSessionPromptRow,\n ChatSessionStatusBar as UiChatSessionStatusBar,\n ChatSessionTaskGroup as UiChatSessionTaskGroup,\n ChatSessionTaskRow as UiChatSessionTaskRow,\n chatSessionGutterClass as uiChatSessionGutterClass,\n} from \"@invana/ui\"\n\n/*\n * The thread parts, moving from `@invana/ui` to here (Assistant Package RFC,\n * migration step 2). For one release the source stays in ui, marked\n * `@deprecated` there, and these are re-declared rather than re-exported so the\n * deprecation does not follow the import. The next release moves the source\n * into this folder; the names and props do not change.\n */\n\n/**\n * The frame a session is drawn in: a scrolling stack that sticks to the\n * latest, with a fixed footer. `ChatSession` is the conversation itself, drawn\n * from JSON; this is only its layout.\n */\nexport const ChatSessionFrame = UiChatSession\n/** The assistant's turn, with running, stopped, error and idle states. */\nexport const ChatSessionMessage = UiChatSessionMessage\n/** Actions under a message: copy, retry, rate. */\nexport const ChatSessionMessageOptions = UiChatSessionMessageOptions\n/** Prompt input with start and end slots, and send or stop. */\nexport const ChatSessionComposer = UiChatSessionComposer\n/** A console row with the shared gutter glyph. */\nexport const ChatSessionActivityRow = UiChatSessionActivityRow\n/** The indented line under an activity row. */\nexport const ChatSessionActivitySubLine = UiChatSessionActivitySubLine\n/** The gutter every console row shares, so bodies line up. */\nexport const chatSessionGutterClass = uiChatSessionGutterClass\n/** The analyst's turn, on the shared gutter. */\nexport const ChatSessionPromptRow = UiChatSessionPromptRow\n/** One-line status while work is in flight. */\nexport const ChatSessionProgressLine = UiChatSessionProgressLine\n/** The cursor at the end of text still being written. */\nexport const ChatSessionCaret = UiChatSessionCaret\n/** Collapsible detail under a row: query, preview, context. */\nexport const ChatSessionDisclosure = UiChatSessionDisclosure\n/** The code a disclosure opens onto, keywords marked, when it opens onto more than code. */\nexport const ChatSessionDisclosureCode = UiChatSessionDisclosureCode\n/** A method of several steps, numbered, each with its count or time. */\nexport const ChatSessionDisclosureSteps = UiChatSessionDisclosureSteps\n/** A background task with its lifecycle. */\nexport const ChatSessionTaskRow = UiChatSessionTaskRow\n/** A group of background tasks under one heading. */\nexport const ChatSessionTaskGroup = UiChatSessionTaskGroup\n/** Slim bar under the composer: mode, counts, hints. */\nexport const ChatSessionStatusBar = UiChatSessionStatusBar\n/** What the next question is about, bound from a selection. */\nexport const ChatSessionContextChip = UiChatSessionContextChip\n\nexport type { ChatSessionProps as ChatSessionFrameProps } from \"@invana/ui\"\nexport type {\n ChatSessionMessageProps,\n ChatSessionMessageRole,\n ChatSessionMessageStatus,\n ChatSessionMessageAction,\n ChatSessionMessageOptionsProps,\n ChatSessionComposerProps,\n ChatSessionActivityRowProps,\n ChatSessionActivityStatus,\n ChatSessionActivitySubLineProps,\n ChatSessionPromptRowProps,\n ChatSessionProgressLineProps,\n ChatSessionDisclosureProps,\n ChatSessionDisclosureStepsProps,\n ChatSessionTaskRowProps,\n ChatSessionTaskGroupProps,\n ChatSessionTaskStatus,\n ChatSessionStatusBarProps,\n ChatSessionContextChipProps,\n} from \"@invana/ui\"\n","import * as React from \"react\"\n\n/*\n * Which source the reader is on, per answer. A marker in the prose and a row in\n * the citations are separate blocks, so they meet here, keyed by the turn: point\n * at marker 2 and row 2 lights with it.\n */\nconst focus = new Map<string, number | undefined>()\nconst listeners = new Set<() => void>()\n\nfunction set(turn: string, n: number | undefined) {\n if (focus.get(turn) === n) return\n focus.set(turn, n)\n listeners.forEach((l) => l())\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\n\n/** The source lit in this answer: the one pointed at, else the one the spec names. */\nexport function useCiteFocus(turn: string, initial?: number): [number | undefined, (n: number | undefined) => void] {\n const pointed = React.useSyncExternalStore(\n subscribe,\n () => focus.get(turn),\n () => undefined,\n )\n return [pointed ?? initial, (n) => set(turn, n)]\n}\n","import type * as React from \"react\"\nimport {\n ANSWER_KINDS,\n ASK_KINDS,\n BLOCK_RENDERERS,\n CitationsBlock,\n NarrativeBlock,\n ScopeBlock,\n type AnswerKind,\n type AskKind,\n type BlockProps,\n} from \"@invana/blocks\"\n\nimport { EmissionBody, EmissionCard } from \".\"\nimport type {\n AskRenderer,\n AskRendererProps,\n AskRegistry,\n BlockRegistry,\n BlockRenderer,\n BlockRendererProps,\n} from \"../conversations/registry\"\nimport { ChatSessionCaret } from \"../conversations/thread\"\nimport type { ConversationEvent } from \"../protocol/events\"\nimport { useCiteFocus } from \"./blocks/cite-focus\"\n\n/**\n * A block's action, as the conversation event it means on this turn. A block\n * names what the reader did; only the conversation knows the turn it was on.\n */\nfunction toEvent(turn: string, action: string, value: unknown, block: number): ConversationEvent | undefined {\n switch (action) {\n case \"reply\":\n return { type: \"reply\", turn, value }\n case \"change\":\n return { type: \"change\", turn, value }\n case \"skip\":\n return { type: \"skip\", turn }\n case \"prompt\":\n return { type: \"prompt\", text: String(value) }\n case \"scope\": {\n const edit = value as { part?: number; value?: unknown } | undefined\n return typeof edit?.part === \"number\" ? { type: \"scope\", turn, part: edit.part, value: edit.value } : undefined\n }\n case \"open\":\n // Only a block in the answer's own list can be opened; an envelope's has no index.\n return block >= 0 ? { type: \"open\", turn, block } : undefined\n case \"action\":\n // An action the spec declares, by its own id.\n return { type: \"action\", turn, action: String(value) }\n default:\n // One the block names — `select` with a row's key, `download` with a file.\n return value === undefined ? { type: \"action\", turn, action } : { type: \"action\", turn, action, value }\n }\n}\n\n/** A block in an answer, drawn from `@invana/blocks`. */\nfunction answerBlock<K extends AnswerKind>(kind: K): BlockRenderer<K> {\n const Renderer = BLOCK_RENDERERS[kind] as React.ComponentType<BlockProps<K>>\n function AnswerBlock({ turn, block, onEvent }: BlockRendererProps<K>) {\n const index = (turn.blocks as unknown[]).indexOf(block)\n return (\n <Renderer\n // The same map, indexed generically: TypeScript cannot see AnswerOptionsByKind[K] is BlockOptionsByKind[K].\n spec={block as unknown as BlockProps<K>[\"spec\"]}\n onAction={(action, value) => {\n const event = toEvent(turn.id, action, value, index)\n if (event) onEvent(event)\n }}\n />\n )\n }\n AnswerBlock.displayName = `Answer(${kind})`\n return AnswerBlock\n}\n\n/** A block in an ask, drawn from `@invana/blocks`: the turn's state and value, and its replies. */\nfunction askBlock<K extends AskKind>(kind: K): AskRenderer<K> {\n const Renderer = BLOCK_RENDERERS[kind] as React.ComponentType<BlockProps<K>>\n function AskBlock({ turn, options, onEvent }: AskRendererProps<K>) {\n return (\n <Renderer\n spec={options as unknown as BlockProps<K>[\"spec\"]}\n state={turn.state}\n value={turn.value}\n id={turn.id}\n onAction={(action, value) => {\n const event = toEvent(turn.id, action, value, -1)\n if (event) onEvent(event)\n }}\n />\n )\n }\n AskBlock.displayName = `Ask(${kind})`\n return AskBlock\n}\n\n/**\n * The narrative, with what only a conversation has: the source lit across the\n * answer's blocks, and the caret while the answer is still being written.\n */\nfunction NarrativeAnswer({ block, turn }: BlockRendererProps<\"narrative\">) {\n const [active, setActive] = useCiteFocus(turn.id, block.active)\n const writing = turn.state === \"running\" && turn.blocks[turn.blocks.length - 1] === block\n return (\n <NarrativeBlock\n spec={block}\n active={active}\n onActiveChange={setActive}\n trailing={writing ? <ChatSessionCaret /> : null}\n />\n )\n}\n\n/** The citations, with the row the prose's marker points at lit. */\nfunction CitationsAnswer({ block, turn }: BlockRendererProps<\"citations\">) {\n const [active] = useCiteFocus(turn.id, block.active)\n return <CitationsBlock spec={block} active={active} />\n}\n\n/** The scope, with the envelope's freshness fixed: a fact about the data, not a choice. */\nfunction ScopeAnswer({ block, turn, onEvent }: BlockRendererProps<\"scope\">) {\n const fromEnvelope = !(turn.blocks as unknown[]).includes(block)\n const fixed = fromEnvelope && turn.envelope?.freshness ? [block.parts.length - 1] : undefined\n return (\n <ScopeBlock\n spec={block}\n fixed={fixed}\n onAction={(action, value) => {\n const event = toEvent(turn.id, action, value, -1)\n if (event) onEvent(event)\n }}\n />\n )\n}\n\n/** A proposal, in a card of its own under the answer: something to approve, not evidence. */\nconst ProposalBody = answerBlock(\"proposal\")\nfunction ProposalAnswer(props: BlockRendererProps<\"proposal\">) {\n return (\n <EmissionCard kind=\"proposal\" title={props.block.title} citation={props.block.done?.at}>\n <EmissionBody>\n <ProposalBody {...props} />\n </EmissionBody>\n </EmissionCard>\n )\n}\n\nconst ANSWER_WRAPPERS: Partial<{ [K in AnswerKind]: BlockRenderer<K> }> = {\n narrative: NarrativeAnswer,\n citations: CitationsAnswer,\n scope: ScopeAnswer,\n proposal: ProposalAnswer,\n}\n\n/** Every kind an answer can hold: its block from `@invana/blocks`, or `null` when none is built yet. */\nexport const ANSWER_RENDERERS = Object.fromEntries(\n ANSWER_KINDS.map((kind) => [kind, BLOCK_RENDERERS[kind] ? (ANSWER_WRAPPERS[kind] ?? answerBlock(kind)) : null]),\n) as BlockRegistry\n\n/** Every kind an ask can hold, the same way. */\nexport const ASK_RENDERERS = Object.fromEntries(\n ASK_KINDS.map((kind) => [kind, BLOCK_RENDERERS[kind] ? askBlock(kind) : null]),\n) as AskRegistry\n","import type * as React from \"react\"\n\nimport { ANSWER_RENDERERS, ASK_RENDERERS } from \"../answers/shared\"\nimport type { AnswerKind, AskKind } from \"@invana/blocks\"\nimport type { ConversationEvent } from \"../protocol/events\"\nimport type {\n AnswerTurn,\n AskOptionsByKind,\n AskTurn,\n BlockBase,\n AnswerOptionsByKind,\n} from \"../protocol/types\"\n\nexport interface AskRendererProps<P extends AskKind = AskKind> {\n turn: AskTurn\n /** The ask's options, already narrowed to its block. */\n options: AskOptionsByKind[P]\n onEvent: (event: ConversationEvent) => void\n}\n\nexport interface BlockRendererProps<P extends AnswerKind = AnswerKind> {\n turn: AnswerTurn\n /** The block's options, already narrowed to its block. */\n block: BlockBase & AnswerOptionsByKind[P]\n onEvent: (event: ConversationEvent) => void\n}\n\n// `any`, as in the board's registry: a registry holds renderers for many\n// option shapes, and one typed on its own options is not assignable to `unknown`.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AskRenderer<P extends AskKind = any> = React.ComponentType<AskRendererProps<P>>\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type BlockRenderer<P extends AnswerKind = any> = React.ComponentType<BlockRendererProps<P>>\n\n/**\n * Every block the grammar names, and what renders it. `null` is a block\n * not built yet: it renders as a labelled placeholder, so the number of `null`s\n * is the work left and a session story shows exactly where.\n *\n * Keyed by the grammar's ids, so a block added to the grammar and not here is\n * a compile error, and `grammar.test.ts` checks the same at runtime.\n */\nexport type AskRegistry = { [P in AskKind]: AskRenderer<P> | null }\nexport type BlockRegistry = { [P in AnswerKind]: BlockRenderer<P> | null }\n\nexport const BUILT_IN_ASKS: AskRegistry = ASK_RENDERERS\n\nexport const BUILT_IN_BLOCKS: BlockRegistry = ANSWER_RENDERERS\n\n/**\n * How an ask sits in the thread, apart from what its renderer draws.\n *\n * `frame: \"card\"` draws it in the ask card, with its state, the stage that\n * asked and when it was answered; `\"none\"` draws the renderer alone — chips\n * that show their own pick. `kind` is the card's header word while it waits.\n */\nexport interface AskTraits {\n frame?: \"card\" | \"none\"\n kind?: string\n}\n\n/**\n * How a block sits in an answer. `\"card\"` is inside the answer card with the\n * rest of the evidence; `\"own\"` is a card of its own under it — a proposal is\n * something to approve, not part of the evidence.\n */\nexport interface BlockTraits {\n placement?: \"card\" | \"own\"\n}\n\n/** Traits of the built-in blocks; every block not named takes the defaults. */\nexport const BUILT_IN_ASK_TRAITS: Partial<Record<string, AskTraits>> = {\n suggestions: { frame: \"none\" },\n confirm: { kind: \"confirm\" },\n approval: { kind: \"proposal\" },\n}\nexport const BUILT_IN_BLOCK_TRAITS: Partial<Record<string, BlockTraits>> = {\n proposal: { placement: \"own\" },\n}\n\n/**\n * Renderers a consumer adds or replaces — `{ blocks: { subgraph: CanvasBlock } }`\n * — with their traits. Consumer entries win over the built-ins, as in the\n * board, so a template of your own sits in the thread exactly as you say.\n */\nexport interface RegistryOverrides {\n asks?: Partial<Record<string, AskRenderer>>\n blocks?: Partial<Record<string, BlockRenderer>>\n askTraits?: Partial<Record<string, AskTraits>>\n blockTraits?: Partial<Record<string, BlockTraits>>\n}\n\nexport interface ResolvedRegistry {\n asks: Record<string, AskRenderer | null | undefined>\n blocks: Record<string, BlockRenderer | null | undefined>\n askTraits: (kind: string) => Required<Pick<AskTraits, \"frame\">> & AskTraits\n blockTraits: (kind: string) => Required<BlockTraits>\n}\n\nexport function resolveRegistry(extra?: RegistryOverrides): ResolvedRegistry {\n const askTraits = { ...BUILT_IN_ASK_TRAITS, ...extra?.askTraits }\n const blockTraits = { ...BUILT_IN_BLOCK_TRAITS, ...extra?.blockTraits }\n return {\n asks: { ...BUILT_IN_ASKS, ...extra?.asks },\n blocks: { ...BUILT_IN_BLOCKS, ...extra?.blocks },\n askTraits: (kind) => ({ frame: \"card\", ...askTraits[kind] }),\n blockTraits: (kind) => ({ placement: \"card\", ...blockTraits[kind] }),\n }\n}\n\n// ── the options maps must name exactly the grammar's blocks ────────────────\n\ntype Same<A, B> = [A] extends [B] ? ([B] extends [A] ? true : false) : false\nconst askOptionsMatchGrammar: Same<keyof AskOptionsByKind, AskKind> = true\nconst blockOptionsMatchGrammar: Same<keyof AnswerOptionsByKind, AnswerKind> = true\nvoid askOptionsMatchGrammar\nvoid blockOptionsMatchGrammar\n","import { applyBlockPatch, type BlockPatch, BlockPatchError } from \"@invana/blocks\"\n\nimport type {\n AnswerState,\n AnswerTurn,\n AskState,\n BlockSpec,\n ConversationSpec,\n TraceStep,\n Turn,\n} from \"./types\"\n\n/**\n * How a spec changes while an answer streams. The API sends one of these at a\n * time; {@link applyPatch} returns a new spec and never mutates the old one, so\n * a controlled `<ChatSession spec>` re-renders exactly what changed.\n */\nexport type ConversationPatch =\n | { op: \"add-turn\"; turn: Turn }\n /** Move a turn through its states. An answered ask carries its `value`. */\n | { op: \"set-state\"; turn: string; state: AskState | AnswerState; value?: unknown }\n | { op: \"add-block\"; turn: string; block: BlockSpec }\n /**\n * Stream a block: one {@link BlockPatch} — the same patch a board or a page\n * streams the block by. `block` is its index, the last block when left out.\n */\n | { op: \"patch-block\"; turn: string; block?: number; patch: BlockPatch }\n /** Change a block in place — its rows arriving, a loading block settling. `block` is its index. A `set` block patch. */\n | { op: \"update-block\"; turn: string; block: number; fields: Record<string, unknown> }\n /**\n * Stream words into a block: `text` is appended to its string `field`\n * (default `text`). `block` is its index, the last block when left out — so\n * a stream sends `add-block` with the field empty, then its words. An\n * `append` block patch.\n */\n | { op: \"append-text\"; turn: string; text: string; block?: number; field?: string }\n | { op: \"add-trace-step\"; turn: string; step: TraceStep }\n /** Change a step in place, by id — its detail counting up, its state settling. */\n | { op: \"update-trace-step\"; turn: string; step: string; fields: Partial<TraceStep> }\n /** Stream a step's reasoning: `text` is appended to its `thinking`. */\n | { op: \"append-thinking\"; turn: string; step: string; text: string }\n /** Anything else on a turn — its envelope once known, its outcome, its duration. */\n | { op: \"update-turn\"; turn: string; fields: Record<string, unknown> }\n /** A model's record count, as it changes — the live count behind the header's data reach. */\n | { op: \"set-records\"; model: string; records: number }\n /** The conversation's own fields — its title, its composer. Never its turns. */\n | { op: \"update-spec\"; fields: Partial<Omit<ConversationSpec, \"id\" | \"turns\">> }\n\nexport type ConversationPatchOp = ConversationPatch[\"op\"]\n\nexport class PatchError extends Error {}\n\nfunction onTurn(spec: ConversationSpec, id: string, fn: (turn: Turn) => Turn): ConversationSpec {\n const index = spec.turns.findIndex((t) => t.id === id)\n if (index < 0) throw new PatchError(`No turn \"${id}\" in conversation \"${spec.id}\".`)\n const turns = spec.turns.slice()\n turns[index] = fn(turns[index])\n return { ...spec, turns }\n}\n\nfunction asAnswer(turn: Turn, op: string): AnswerTurn {\n if (turn.role !== \"assistant\" || turn.kind !== \"answer\") {\n throw new PatchError(`\"${op}\" applies to an answer; turn \"${turn.id}\" is not one.`)\n }\n return turn\n}\n\nfunction onStep(answer: AnswerTurn, id: string, op: string, fn: (step: TraceStep) => TraceStep): AnswerTurn {\n const trace = answer.trace ?? []\n const at = trace.findIndex((s) => s.id === id)\n if (at < 0) throw new PatchError(`\"${op}\": no step \"${id}\" on turn \"${answer.id}\".`)\n return { ...answer, trace: trace.map((s, i) => (i === at ? fn(s) : s)) }\n}\n\n/** Block `index` of an answer (the last when left out) after a block patch — the one way a block changes. */\nfunction patchBlock(answer: AnswerTurn, op: string, index: number | undefined, patch: BlockPatch): AnswerTurn {\n const at = index ?? answer.blocks.length - 1\n const block = answer.blocks[at]\n if (!block) throw new PatchError(`\"${op}\": turn \"${answer.id}\" has no block ${at}.`)\n const blocks = answer.blocks.slice()\n try {\n blocks[at] = applyBlockPatch(block, patch)\n } catch (error) {\n if (error instanceof BlockPatchError) {\n throw new PatchError(`\"${op}\": block ${at} on turn \"${answer.id}\": ${error.message}`)\n }\n throw error\n }\n return { ...answer, blocks }\n}\n\nexport function applyPatch(spec: ConversationSpec, patch: ConversationPatch): ConversationSpec {\n switch (patch.op) {\n case \"add-turn\":\n if (spec.turns.some((t) => t.id === patch.turn.id)) {\n throw new PatchError(`Turn \"${patch.turn.id}\" already exists.`)\n }\n return { ...spec, turns: [...spec.turns, patch.turn] }\n case \"set-state\":\n return onTurn(spec, patch.turn, (turn) => {\n if (turn.role !== \"assistant\") throw new PatchError(`Turn \"${turn.id}\" has no state.`)\n if (turn.kind === \"ask\") {\n return {\n ...turn,\n state: patch.state as AskState,\n ...(patch.value !== undefined ? { value: patch.value } : {}),\n }\n }\n return { ...turn, state: patch.state as AnswerState }\n })\n case \"add-block\":\n return onTurn(spec, patch.turn, (turn) => {\n const answer = asAnswer(turn, patch.op)\n return { ...answer, blocks: [...answer.blocks, patch.block] }\n })\n case \"patch-block\":\n return onTurn(spec, patch.turn, (turn) => patchBlock(asAnswer(turn, patch.op), patch.op, patch.block, patch.patch))\n case \"update-block\":\n return onTurn(spec, patch.turn, (turn) =>\n patchBlock(asAnswer(turn, patch.op), patch.op, patch.block, { op: \"set\", fields: patch.fields }),\n )\n case \"append-text\":\n return onTurn(spec, patch.turn, (turn) =>\n patchBlock(asAnswer(turn, patch.op), patch.op, patch.block, { op: \"append\", at: [patch.field ?? \"text\"], text: patch.text }),\n )\n case \"add-trace-step\":\n return onTurn(spec, patch.turn, (turn) => {\n const answer = asAnswer(turn, patch.op)\n const trace = answer.trace ?? []\n // A step with a known id replaces itself — `running` settling to `done`.\n const at = patch.step.id ? trace.findIndex((s) => s.id === patch.step.id) : -1\n const next = at >= 0 ? trace.map((s, i) => (i === at ? patch.step : s)) : [...trace, patch.step]\n return { ...answer, trace: next }\n })\n case \"update-trace-step\":\n return onTurn(spec, patch.turn, (turn) =>\n onStep(asAnswer(turn, patch.op), patch.step, patch.op, (s) => ({ ...s, ...patch.fields, id: s.id })),\n )\n case \"append-thinking\":\n return onTurn(spec, patch.turn, (turn) =>\n onStep(asAnswer(turn, patch.op), patch.step, patch.op, (s) => ({\n ...s,\n thinking: (s.thinking ?? \"\") + patch.text,\n })),\n )\n case \"update-turn\":\n return onTurn(spec, patch.turn, (turn) => ({ ...turn, ...patch.fields, id: turn.id }) as Turn)\n case \"set-records\": {\n const models = spec.access?.models ?? []\n if (!spec.access || !models.some((m) => m.id === patch.model)) {\n throw new PatchError(`\"set-records\": no model \"${patch.model}\" in conversation \"${spec.id}\".`)\n }\n return {\n ...spec,\n access: {\n ...spec.access,\n models: models.map((m) => (m.id === patch.model ? { ...m, records: patch.records } : m)),\n },\n }\n }\n case \"update-spec\":\n return { ...spec, ...patch.fields, id: spec.id, turns: spec.turns }\n }\n}\n\n/** Apply patches in order — a recorded stream, replayed. */\nexport function applyPatches(spec: ConversationSpec, patches: ConversationPatch[]): ConversationSpec {\n return patches.reduce(applyPatch, spec)\n}\n","import {\n type EventSourceOptions,\n fromEventSource as fromEventSourceOf,\n fromNdjson as fromNdjsonOf,\n offsetScript as offsetScriptOf,\n type PatchChunk as PatchChunkOf,\n type PatchScript as PatchScriptOf,\n patchesOf as patchesOfAny,\n type PatchSource as PatchSourceOf,\n playScript as playScriptOf,\n type PlayOptions,\n type ScriptStep as ScriptStepOf,\n scriptLength,\n} from \"@invana/blocks\"\n\nimport type { ConversationPatch } from \"./reduce\"\nimport type { AnswerTurn, ConversationSpec } from \"./types\"\n\n/**\n * A conversation arrives as a spec, then as patches — by the same transport\n * every block streams by (`@invana/blocks`), carrying {@link ConversationPatch}.\n * These are the ways the patches can arrive — one at a time or in batches,\n * from a fetch body, an EventSource, a generator, or a recorded script — all\n * read the same way by `<ChatSession stream>` and `useChatSession().stream()`.\n */\nexport type PatchChunk = PatchChunkOf<ConversationPatch>\nexport type PatchSource = PatchSourceOf<ConversationPatch>\n/** A patch and when it lands, in ms from the start of the script. */\nexport type ScriptStep = ScriptStepOf<ConversationPatch>\n/** A recorded run: plain JSON, replayed by {@link playScript}. */\nexport type PatchScript = PatchScriptOf<ConversationPatch>\nexport type { EventSourceOptions, PlayOptions }\n\n/** Every patch of a source, flattened, in order. */\nexport const patchesOf = (source: PatchSource) => patchesOfAny<ConversationPatch>(source)\n\n/**\n * Patches from a newline-delimited JSON body: one patch, or an array of them,\n * per line. Pass the `Response` of a streaming `fetch`, or its body.\n */\nexport const fromNdjson = (input: Response | ReadableStream<Uint8Array>) => fromNdjsonOf<ConversationPatch>(input)\n\n/** Patches from Server-Sent Events: each event's `data` is a patch, or an array of them. */\nexport const fromEventSource = (source: EventSource, options?: EventSourceOptions) =>\n fromEventSourceOf<ConversationPatch>(source, options)\n\n/**\n * A script as a stream: each step is yielded when it is due. Steps due at the\n * same moment are yielded together; aborting ends the stream where it stands.\n */\nexport const playScript = (script: PatchScript, options?: PlayOptions) => playScriptOf(script, options)\n\n/** Shift every step of a script by `ms` — to chain scripts one after another. */\nexport const offsetScript = (script: PatchScript, ms: number): PatchScript => offsetScriptOf(script, ms)\n\n/** When a script's last step lands. */\nexport { scriptLength }\n\nexport interface DeltaOptions {\n /** When the first delta lands, in ms. @default 0 */\n from?: number\n /** The gap between deltas, in ms. @default 40 */\n every?: number\n /** Stream word by word, or a few characters at a time. @default \"word\" */\n by?: \"word\" | \"char\"\n}\n\nfunction deltas(text: string, by: \"word\" | \"char\"): string[] {\n if (by === \"char\") return text.match(/[\\s\\S]{1,3}/g) ?? []\n // Keep each word's trailing space with it, so the deltas join back exactly.\n return text.match(/\\S+\\s*|\\s+/g) ?? []\n}\n\n/**\n * A block's words, streamed: `append-text` steps, one per word, into `field`\n * (default `text`) of block `block` (default the last).\n */\nexport function textDeltas(\n turn: string,\n text: string,\n { from = 0, every = 40, by = \"word\", block, field }: DeltaOptions & { block?: number; field?: string } = {},\n): PatchScript {\n return deltas(text, by).map((piece, i) => ({\n at: from + i * every,\n patch: {\n op: \"append-text\",\n turn,\n text: piece,\n ...(block === undefined ? {} : { block }),\n ...(field === undefined ? {} : { field }),\n },\n }))\n}\n\n/** A step's reasoning, streamed: `append-thinking` steps, one per word. */\nexport function thinkingDeltas(\n turn: string,\n step: string,\n text: string,\n { from = 0, every = 40, by = \"word\" }: DeltaOptions = {},\n): PatchScript {\n return deltas(text, by).map((piece, i) => ({\n at: from + i * every,\n patch: { op: \"append-thinking\", turn, step, text: piece },\n }))\n}\n\n// ── state helpers ───────────────────────────────────────────────────────────\n\nconst LIVE_STEP = new Set([\"running\", \"retrying\"])\n\n/**\n * Whether an answer is still being produced. `partial` is not: it is an\n * answer given in part — the rest in the background, or not to be had.\n */\nexport const isLive = (turn: AnswerTurn) => turn.state === \"running\"\n\n/** Whether anything in the conversation is still running. */\nexport function isRunning(spec: ConversationSpec): boolean {\n return spec.turns.some((t) => t.role === \"assistant\" && t.kind === \"answer\" && isLive(t))\n}\n\n/**\n * What stopping does, as patches: each running answer is marked `stopped`,\n * its running step `stopped` with the time it had run, the steps after it left\n * as they were — so the record shows how far it got. `now` is in ms.\n */\nexport function stopPatches(spec: ConversationSpec, now: number = Date.now()): ConversationPatch[] {\n const patches: ConversationPatch[] = []\n for (const turn of spec.turns) {\n if (turn.role !== \"assistant\" || turn.kind !== \"answer\" || !isLive(turn)) continue\n for (const step of turn.trace ?? []) {\n if (!step.id || !LIVE_STEP.has(step.state)) continue\n const started = step.startedAt ? Date.parse(step.startedAt) : NaN\n patches.push({\n op: \"update-trace-step\",\n turn: turn.id,\n step: step.id,\n fields: {\n state: \"stopped\",\n thinking: undefined,\n ...(Number.isNaN(started) ? {} : { duration: now - started }),\n },\n })\n }\n const started = turn.startedAt ? Date.parse(turn.startedAt) : NaN\n patches.push({\n op: \"update-turn\",\n turn: turn.id,\n fields: {\n at: new Date(now).toISOString(),\n ...(Number.isNaN(started) ? {} : { duration: now - started }),\n },\n })\n patches.push({ op: \"set-state\", turn: turn.id, state: \"stopped\" })\n }\n return patches\n}\n","import * as React from \"react\"\n\nimport type { ResolvedRegistry } from \"../../conversations/registry\"\nimport type { ConversationEvent } from \"../../protocol/events\"\nimport type { ConversationSpec } from \"../../protocol/types\"\nimport type { ChatSessionAnswerAction, ChatSessionIcons, ChatSessionView } from \"../types\"\n\n/**\n * Everything a variant's parts read, so no part takes more than its turn as a\n * prop. The spec is data; the rest is how the session is being looked at —\n * which steps are open, which view — and never goes back to the API.\n */\nexport interface ChatSessionContextValue {\n spec: ConversationSpec\n registry: ResolvedRegistry\n emit: (event: ConversationEvent) => void\n icons: ChatSessionIcons\n now: number\n /** Whether the host opens runs itself (`onOpenRun`); if not, the time opens the steps in place. */\n opensRuns: boolean\n /** An answer's steps shown, or folded to one line. Unset follows the run: open while it runs. */\n stepsOpen: (turnId: string, live: boolean) => boolean\n toggleSteps: (turnId: string, open?: boolean) => void\n /** The analyst opened or folded an answer's steps: toggles them, and sends `toggle-steps`. */\n setSteps: (turnId: string, open: boolean) => void\n /** The actions beside a settled answer's time. */\n actions: ChatSessionAnswerAction[]\n /** One step's record open. */\n recordOpen: (turnId: string, stepId: string) => boolean\n toggleRecord: (turnId: string, stepId: string, open?: boolean) => void\n /** A rating given here, before the spec comes back with it. */\n rating: (turnId: string) => number | undefined\n rate: (turnId: string, value: number) => void\n view: ChatSessionView\n setView: (view: ChatSessionView) => void\n scrollToTurn: (turnId: string) => void\n focusComposer: () => void\n /** The composer registers its element, so `focusComposer` can reach it. */\n setComposer: (element: HTMLDivElement | null) => void\n}\n\nexport const ChatSessionContext = React.createContext<ChatSessionContextValue | null>(null)\n\nexport function useChatSessionContext(): ChatSessionContextValue {\n const value = React.useContext(ChatSessionContext)\n if (!value) throw new Error(\"A ChatSession part was rendered outside <ChatSession>.\")\n return value\n}\n\nexport const DEFAULT_ICONS: ChatSessionIcons = {\n send: \"↑\",\n stop: \"■\",\n attach: \"+\",\n close: \"×\",\n retry: \"↻\",\n copy: \"⧉\",\n steps: \"≡\",\n rateUp: \"+1\",\n rateDown: \"−1\",\n}\n\n/**\n * The session's own view state: open steps, open records, ratings given, the\n * view. Keyed by turn and step id, so it survives every patch.\n */\nexport function useViewState() {\n const [steps, setSteps] = React.useState<Record<string, boolean>>({})\n const [records, setRecords] = React.useState<Record<string, boolean>>({})\n const [ratings, setRatings] = React.useState<Record<string, number>>({})\n\n const stepsOpen = React.useCallback((turnId: string, live: boolean) => steps[turnId] ?? live, [steps])\n const toggleSteps = React.useCallback(\n (turnId: string, open?: boolean) =>\n setSteps((prev) => ({ ...prev, [turnId]: open ?? !(prev[turnId] ?? false) })),\n [],\n )\n const recordOpen = React.useCallback(\n (turnId: string, stepId: string) => !!records[`${turnId}/${stepId}`],\n [records],\n )\n const toggleRecord = React.useCallback((turnId: string, stepId: string, open?: boolean) => {\n const key = `${turnId}/${stepId}`\n setRecords((prev) => ({ ...prev, [key]: open ?? !prev[key] }))\n }, [])\n const rating = React.useCallback((turnId: string) => ratings[turnId], [ratings])\n const setRating = React.useCallback(\n (turnId: string, value: number) => setRatings((prev) => ({ ...prev, [turnId]: value })),\n [],\n )\n return { stepsOpen, toggleSteps, recordOpen, toggleRecord, rating, setRating }\n}\n\n/** The clock: the given one, or one that ticks while `live`. */\nexport function useClock(fixed: number | undefined, live: boolean, every = 250): number {\n const [now, setNow] = React.useState(() => fixed ?? Date.now())\n React.useEffect(() => {\n if (fixed !== undefined || !live) return\n const timer = setInterval(() => setNow(Date.now()), every)\n return () => clearInterval(timer)\n }, [fixed, live, every])\n return fixed ?? now\n}\n","/**\n * How a thread writes time. Every function takes the clock it reads against,\n * so a story or a test reads the same every run.\n */\n\n/** `912ms`, `1.4s`, `2m 5s`, `1h 20m` — `spaced` writes `1.4 s`, as a sentence does. */\nexport function formatDuration(ms: number, { spaced = false }: { spaced?: boolean } = {}): string {\n const gap = spaced ? \" \" : \"\"\n if (!Number.isFinite(ms) || ms < 0) return `0${gap}ms`\n if (ms < 1000) return `${Math.round(ms)}${gap}ms`\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}${gap}s`\n const pair = (big: number, bigUnit: string, small: number, smallUnit: string) =>\n small ? `${big}${gap}${bigUnit} ${small}${gap}${smallUnit}` : `${big}${gap}${bigUnit}`\n if (ms < 3_600_000) return pair(Math.floor(ms / 60_000), \"m\", Math.round((ms % 60_000) / 1000), \"s\")\n return pair(Math.floor(ms / 3_600_000), \"h\", Math.round((ms % 3_600_000) / 60_000), \"m\")\n}\n\n/** ms since an ISO time, never below zero; `undefined` when there is no time. */\nexport function elapsedSince(iso: string | undefined, now: number): number | undefined {\n if (!iso) return undefined\n const then = Date.parse(iso)\n return Number.isNaN(then) ? undefined : Math.max(0, now - then)\n}\n\n/** `09:02` — the time a turn was sent, on a 24-hour clock. */\nexport function clockTime(iso: string | undefined): string | undefined {\n if (!iso) return undefined\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return undefined\n return date.toLocaleTimeString(\"en-GB\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false })\n}\n\nconst dayKey = (d: Date) => `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`\n\n/** Whether two ISO times fall on the same local day. */\nexport function sameDay(a: string | undefined, b: string | undefined): boolean {\n if (!a || !b) return true\n return dayKey(new Date(a)) === dayKey(new Date(b))\n}\n\n/** `Today · Wed 30 Sep`, `Yesterday · Tue 29 Sep`, `Mon 28 Sep`. */\nexport function dayLabel(iso: string, now: number): string {\n const date = new Date(iso)\n const written = date.toLocaleDateString(\"en-GB\", { weekday: \"short\", day: \"numeric\", month: \"short\" })\n const today = new Date(now)\n if (dayKey(date) === dayKey(today)) return `Today · ${written}`\n const yesterday = new Date(now - 86_400_000)\n if (dayKey(date) === dayKey(yesterday)) return `Yesterday · ${written}`\n return written\n}\n","import type {\n AnalystTurn,\n AnswerTurn,\n AskTurn,\n ConversationSpec,\n TraceStep,\n Turn,\n} from \"../../protocol/types\"\nimport { isLive } from \"../../protocol/stream\"\nimport { elapsedSince } from \"./format\"\n\n/**\n * The view model both variants draw from. Nothing here knows a kind: it\n * reads only the protocol's own fields — roles, kinds, states, the trace —\n * so an ask or a block of your own flows through exactly like a built-in.\n */\n\nexport type AssistantTurn = AskTurn | AnswerTurn\n\n/** A prompt and everything the assistant said back to it, in order. */\nexport interface Exchange {\n /** Stable across patches: the prompt's id, or the first reply's. */\n id: string\n prompt?: AnalystTurn\n replies: AssistantTurn[]\n}\n\n/** The thread as exchanges. Replies before any prompt form an exchange of their own. */\nexport function exchangesOf(spec: ConversationSpec): Exchange[] {\n const out: Exchange[] = []\n for (const turn of spec.turns) {\n if (turn.role === \"analyst\") {\n out.push({ id: turn.id, prompt: turn, replies: [] })\n continue\n }\n const last = out[out.length - 1]\n if (last) last.replies.push(turn)\n else out.push({ id: turn.id, replies: [turn] })\n }\n return out\n}\n\nexport const isAnswer = (turn: Turn): turn is AnswerTurn => turn.role === \"assistant\" && turn.kind === \"answer\"\nexport const isAsk = (turn: Turn): turn is AskTurn => turn.role === \"assistant\" && turn.kind === \"ask\"\n\nconst ACTIVE = new Set<TraceStep[\"state\"]>([\"running\", \"retrying\", \"waiting\"])\n\n/** The step the run is on — running, retrying, or waiting on the analyst. */\nexport function currentStep(answer: AnswerTurn): TraceStep | undefined {\n return answer.trace?.find((s) => ACTIVE.has(s.state))\n}\n\n/** A step's time: counting up while it runs, its duration once settled. */\nexport function stepTime(step: TraceStep, now: number): number | undefined {\n if (step.state === \"running\" || step.state === \"retrying\") return elapsedSince(step.startedAt, now)\n return step.duration\n}\n\n/**\n * An answer's time: counting up while it runs; once settled its `duration`,\n * else the span from `startedAt` to `at`, else the sum of its steps.\n */\nexport function answerTime(answer: AnswerTurn, now: number): number | undefined {\n if (isLive(answer)) return elapsedSince(answer.startedAt, now)\n if (answer.duration !== undefined) return answer.duration\n if (answer.startedAt && answer.at) {\n const span = Date.parse(answer.at) - Date.parse(answer.startedAt)\n if (!Number.isNaN(span)) return span\n }\n const steps = answer.trace ?? []\n return steps.some((s) => s.duration !== undefined)\n ? steps.reduce((sum, s) => sum + (s.duration ?? 0), 0)\n : undefined\n}\n\nexport type RunOutcome = \"live\" | \"waiting\" | \"done\" | \"failed\" | \"stopped\"\n\n/** Where an answer's run stands, from its state and its steps. */\nexport function runOutcome(answer: AnswerTurn): RunOutcome {\n if (answer.state === \"error\") return \"failed\"\n if (answer.state === \"stopped\") return \"stopped\"\n if (isLive(answer)) return answer.trace?.some((s) => s.state === \"waiting\") ? \"waiting\" : \"live\"\n return \"done\"\n}\n\n/** `4 of 4 steps` — how far the run got. */\nexport function stepCount(answer: AnswerTurn): { done: number; total: number } {\n const steps = answer.trace ?? []\n return { done: steps.filter((s) => s.state === \"done\").length, total: steps.length }\n}\n\n/**\n * Whether an ask holds the thread until it is answered. The session passes\n * the registry's answer — an ask drawn in the question card does; bare\n * follow-up chips do not — so no block is named here.\n */\nexport type BlocksThread = (ask: AskTurn) => boolean\n\n/** Whether an exchange is still being answered, or waits on the analyst. */\nexport function exchangeState(\n exchange: Exchange,\n blocks: BlocksThread = () => true,\n): \"running\" | \"waiting\" | \"settled\" {\n let waiting = false\n for (const reply of exchange.replies) {\n if (isAsk(reply) && reply.state === \"pending\" && blocks(reply)) waiting = true\n if (isAnswer(reply)) {\n const outcome = runOutcome(reply)\n if (outcome === \"live\") return \"running\"\n if (outcome === \"waiting\") waiting = true\n }\n }\n return waiting ? \"waiting\" : \"settled\"\n}\n\n/** The counts a status bar shows: what runs, what waits, how many steps in all. */\nexport function threadCounts(spec: ConversationSpec, blocks?: BlocksThread) {\n let running = 0\n let waiting = 0\n let steps = 0\n for (const exchange of exchangesOf(spec)) {\n const state = exchangeState(exchange, blocks)\n if (state === \"running\") running++\n if (state === \"waiting\") waiting++\n for (const reply of exchange.replies) if (isAnswer(reply)) steps += reply.trace?.length ?? 0\n }\n return { running, waiting, steps }\n}\n\n/**\n * The words of a turn, for Copy: every string field named `text` on its\n * blocks, in order. Read by field, not by block, so a block of your own that\n * says something in `text` is copied too.\n */\nexport function plainText(answer: AnswerTurn): string {\n return answer.blocks\n .map((b) => (b as { text?: unknown }).text)\n .filter((t): t is string => typeof t === \"string\" && t.length > 0)\n .join(\"\\n\\n\")\n .replace(/\\*\\*(.+?)\\*\\*/g, \"$1\")\n .replace(/\\[(\\d+)\\]/g, \"\")\n}\n\n/** The DOM id a turn is drawn under, so a variant can scroll to it. */\nexport const turnDomId = (spec: ConversationSpec, turnId: string) => `chat-${spec.id}-${turnId}`\n","import * as React from \"react\"\nimport { cn } from \"@invana/ui\"\n\nimport { ChatSessionMessageOptions, type ChatSessionMessageAction } from \"../../conversations/thread\"\nimport type { AnswerTurn } from \"../../protocol/types\"\nimport type { ChatSessionBuiltInAction } from \"../types\"\nimport { useChatSessionContext } from \"./context\"\nimport { isAnswer, plainText, runOutcome } from \"./model\"\n\n/** The session's title bar: what the thread is about, how long it is, and close. */\nexport function SessionHeader({ onClose, className }: { onClose?: () => void; className?: string }) {\n const ctx = useChatSessionContext()\n const prompts = ctx.spec.turns.filter((t) => t.role === \"analyst\").length\n return (\n <div className={cn(\"flex h-[34px] shrink-0 items-center gap-2 border-b border-border px-3\", className)}>\n <span className=\"min-w-0 truncate font-medium\">{ctx.spec.title}</span>\n {prompts ? (\n <span className=\"shrink-0 text-muted-foreground tabular-nums\">\n · {prompts} {prompts === 1 ? \"question\" : \"questions\"}\n </span>\n ) : null}\n {onClose ? (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close the session\"\n title=\"Close\"\n className=\"ml-auto inline-flex size-[22px] shrink-0 items-center justify-center rounded-control text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {ctx.icons.close}\n </button>\n ) : null}\n </div>\n )\n}\n\nconst SETTLED_RATEABLE = new Set([\"complete\", \"partial\"])\n\n/**\n * The actions beside a settled answer's time, at the right of its line: the\n * ones the session's `actions` prop names, in its order. Every one is an\n * event — `retry`, `copy`, `toggle-steps`, `rate`, or `action` for your own —\n * so a host hears each through its callback; none knows what the answer's\n * blocks are.\n */\nexport function AnswerActions({ turn }: { turn: AnswerTurn }) {\n const ctx = useChatSessionContext()\n const running = ctx.spec.turns.some((t) => isAnswer(t) && runOutcome(t) === \"live\")\n const rating = ctx.rating(turn.id) ?? turn.rating\n const text = plainText(turn)\n const rate = (value: number) => {\n const next = rating === value ? 0 : value\n ctx.rate(turn.id, next)\n ctx.emit({ type: \"rate\", turn: turn.id, value: next })\n }\n const built: Record<ChatSessionBuiltInAction, () => ChatSessionMessageAction[]> = {\n retry: () => [\n {\n icon: ctx.icons.retry,\n label: \"Run again\",\n disabled: running,\n onClick: () => ctx.emit({ type: \"retry\", turn: turn.id }),\n },\n ],\n copy: () =>\n text\n ? [\n {\n icon: ctx.icons.copy,\n label: \"Copy\",\n onClick: () => {\n void navigator.clipboard?.writeText(text)\n ctx.emit({ type: \"copy\", turn: turn.id, text })\n },\n },\n ]\n : [],\n steps: () => {\n if (!turn.trace?.length) return []\n const open = ctx.stepsOpen(turn.id, false)\n return [{ icon: ctx.icons.steps, label: \"Steps\", active: open, onClick: () => ctx.setSteps(turn.id, !open) }]\n },\n rate: () =>\n SETTLED_RATEABLE.has(turn.state)\n ? [\n {\n icon: ctx.icons.rateUp,\n label: \"Good answer\",\n active: rating === 1,\n activeClassName: \"text-success hover:text-success\",\n onClick: () => rate(1),\n },\n {\n icon: ctx.icons.rateDown,\n label: \"Not what I wanted\",\n active: rating === -1,\n activeClassName: \"text-destructive hover:text-destructive\",\n onClick: () => rate(-1),\n },\n ]\n : [],\n }\n const actions = ctx.actions.flatMap((a): ChatSessionMessageAction[] =>\n typeof a === \"string\"\n ? built[a]()\n : !a.states || a.states.includes(turn.state)\n ? [{ icon: a.icon, label: a.label, onClick: () => ctx.emit({ type: \"action\", turn: turn.id, action: a.id }) }]\n : [],\n )\n if (!actions.length) return null\n // All at the end: the row's start is the answer's time. Small and quiet — they\n // sit on a line of metadata, not beside the answer's words; whatever size the\n // host's icons are, they draw at 11px, and come up to full strength on hover.\n return (\n <ChatSessionMessageOptions\n actions={actions.map((a) => ({\n ...a,\n align: \"end\",\n className: cn(\n \"size-5 hover:bg-transparent [&_svg]:!size-[11px]\",\n !a.active && \"text-muted-foreground/60 hover:text-foreground\",\n ),\n }))}\n />\n )\n}\n\n/** A settled answer's line: what it says at the left, its actions at the right. */\nexport function AnswerLine({ turn, children }: { turn: AnswerTurn; children?: React.ReactNode }) {\n return (\n <div className=\"flex min-w-0 items-center gap-2\">\n {children ? <div className=\"min-w-0 shrink truncate\">{children}</div> : null}\n <div className=\"min-w-0 flex-1\">\n <AnswerActions turn={turn} />\n </div>\n </div>\n )\n}\n\n/** The keys that work now: send and newline, or stop while a run is in flight. */\nexport function KeyHints({ running }: { running: boolean }) {\n return running ? (\n <>\n <span>esc stop</span>\n </>\n ) : (\n <>\n <span>↵ send</span>\n <span>⇧↵ newline</span>\n </>\n )\n}\n\n/** Esc stops the run from anywhere on the page, as in a console. */\nexport function useStopKey(running: boolean, stop: () => void) {\n React.useEffect(() => {\n if (!running) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented) return\n e.preventDefault()\n stop()\n }\n document.addEventListener(\"keydown\", onKey)\n return () => document.removeEventListener(\"keydown\", onKey)\n }, [running, stop])\n}\n","import {\n ClarifyActions as UiClarifyActions,\n ClarifyCard as UiClarifyCard,\n ClarifyFootnote as UiClarifyFootnote,\n} from \"@invana/ui\"\n\n/*\n * The live ask and its parts, moving from `@invana/ui`; see\n * `conversations/thread.ts` for why they are re-declared.\n */\n\n/** The ask, through its whole life: pending, answered, skipped, superseded, expired. */\nexport const ClarifyCard = UiClarifyCard\n/** The line under an ask: why these options, or where a default came from. */\nexport const ClarifyFootnote = UiClarifyFootnote\n/** The row of controls that answers, skips or changes an ask. */\nexport const ClarifyActions = UiClarifyActions\n\nexport type {\n ClarifyActionsProps,\n ClarifyCardProps,\n ClarifyFootnoteProps,\n ClarifyOption,\n ClarifyState,\n} from \"@invana/ui\"\nexport { ConfirmCard, SuggestionChips, type ConfirmCardProps, type ConfirmCost, type SuggestionChipsProps } from \"@invana/blocks\"\n","/**\n * How long ago, in the words a thread uses — `just now`, `4 min ago`,\n * `3 h ago`, then the date, `28 Sep`. `now` is passed in, so a story or a\n * test reads the same every time it runs.\n */\nexport function relativeTime(iso: string, now: number): string | undefined {\n const then = Date.parse(iso)\n if (Number.isNaN(then)) return undefined\n const minutes = Math.floor((now - then) / 60_000)\n if (minutes < 1) return \"just now\"\n if (minutes < 60) return `${minutes} min ago`\n const hours = Math.floor(minutes / 60)\n if (hours < 24) return `${hours} h ago`\n return new Date(then).toLocaleDateString(\"en-GB\", { day: \"numeric\", month: \"short\" })\n}\n","// Ids follow the Design Kit Spec (https://claude.ai/artifact/VcN3AYgmbdCpHbxXZjMir5).\n// Do not edit by hand: change the spec first, then copy the ids here.\n// grammar.test.ts fails when these ids and the block registry disagree.\n\n/** The seven stages every flow walks some of, in order. */\nexport const STAGES = [\n { id: \"frame\", name: \"Frame\" },\n { id: \"scope\", name: \"Scope\" },\n { id: \"check\", name: \"Check data\" },\n { id: \"analyse\", name: \"Analyse\" },\n { id: \"explain\", name: \"Explain\" },\n { id: \"act\", name: \"Act\" },\n { id: \"monitor\", name: \"Monitor\" },\n] as const\n\nexport type StageId = (typeof STAGES)[number][\"id\"]\n","// Ids follow the Design Kit Spec (https://claude.ai/artifact/VcN3AYgmbdCpHbxXZjMir5).\n// Do not edit by hand: change the spec first, then copy the ids here.\n// grammar.test.ts fails when these ids and the block registry disagree.\n\nimport type { AnswerKind } from \"@invana/blocks\"\n\n/**\n * Answer patterns: which blocks an answer has, in order. The flow picks the\n * pattern, and `validate()` checks each answer against it.\n */\nexport const PATTERNS = [\n { id: \"snapshot\", name: \"KPI snapshot\", blocks: [\"grid\", \"timeseries\", \"narrative\", \"scope\"] },\n { id: \"bridge\", name: \"Change explanation\", blocks: [\"narrative\", \"waterfall\", \"ranked\", \"citations\"] },\n { id: \"comparison\", name: \"Comparison\", blocks: [\"bars\", \"table\", \"caveat\"] },\n { id: \"ranking\", name: \"Ranked list\", blocks: [\"ranked\", \"table\"] },\n { id: \"profile\", name: \"Segment profile\", blocks: [\"table\", \"bars\", \"narrative\"] },\n { id: \"cohort\", name: \"Cohort matrix\", blocks: [\"matrix\", \"narrative\"] },\n { id: \"forecast\", name: \"Forecast\", blocks: [\"timeseries\", \"record\", \"caveat\"] },\n { id: \"anomaly\", name: \"Anomaly report\", blocks: [\"timeseries\", \"timeline\", \"ranked\"] },\n { id: \"drivers\", name: \"Driver ranking\", blocks: [\"ranked\", \"narrative\", \"caveat\"] },\n { id: \"readout\", name: \"Experiment readout\", blocks: [\"metric\", \"record\", \"caveat\", \"proposal\"] },\n { id: \"scenariot\", name: \"Scenario table\", blocks: [\"record\", \"table\", \"ranked\"] },\n { id: \"funnelv\", name: \"Funnel\", blocks: [\"funnel\", \"table\"] },\n { id: \"spread\", name: \"Distribution\", blocks: [\"histogram\", \"table\"] },\n { id: \"quality\", name: \"Quality report\", blocks: [\"checks\", \"table\", \"files\"] },\n { id: \"e360\", name: \"Entity 360\", blocks: [\"record\", \"timeline\", \"table\"] },\n { id: \"relmap\", name: \"Relationship map\", blocks: [\"subgraph\", \"ranked\"] },\n { id: \"memo\", name: \"Findings memo\", blocks: [\"narrative\", \"citations\", \"caveat\"] },\n { id: \"recommend\", name: \"Recommendation\", blocks: [\"table\", \"ranked\", \"proposal\"] },\n { id: \"delivery\", name: \"Scheduled delivery\", blocks: [\"files\", \"proposal\", \"record\"] },\n { id: \"shortlist\", name: \"Candidate shortlist\", blocks: [\"attr\", \"histogram\", \"caveat\", \"proposal\"] },\n { id: \"significance\", name: \"Significance test\", blocks: [\"test\", \"box\", \"evidence\", \"caveat\"] },\n { id: \"effects\", name: \"Effect estimates\", blocks: [\"coef\", \"forest\", \"method\", \"caveat\"] },\n { id: \"association\", name: \"Association\", blocks: [\"correlation\", \"scatter\", \"caveat\"] },\n { id: \"spc\", name: \"Control report\", blocks: [\"control\", \"pareto\", \"decomposition\"] },\n { id: \"timeto\", name: \"Time to event\", blocks: [\"survival\", \"quantiles\", \"dumbbell\", \"caveat\"] },\n { id: \"modelcheck\", name: \"Model check\", blocks: [\"modeleval\", \"profile\", \"pivot\", \"tornado\"] },\n] as const satisfies readonly { id: string; name: string; blocks: readonly AnswerKind[] }[]\n\nexport type PatternId = (typeof PATTERNS)[number][\"id\"]\n","// Ids follow the Design Kit Spec (https://claude.ai/artifact/VcN3AYgmbdCpHbxXZjMir5).\n// Do not edit by hand: change the spec first, then copy the ids here.\n// grammar.test.ts fails when these ids and the block registry disagree.\n\nimport type { AskKind } from \"@invana/blocks\"\nimport type { StageId } from \"./stages\"\n\n/** The things the assistant asks back, each on one block. */\nexport const ASK_INTENTS = [\n { id: \"clarify\", name: \"Clarify what was meant\", stage: \"frame\", kind: \"single\" },\n { id: \"measure\", name: \"Choose the measure\", stage: \"frame\", kind: \"single\" },\n { id: \"definition\", name: \"Confirm a definition\", stage: \"frame\", kind: \"confirm\" },\n { id: \"hunch\", name: \"Share a hunch\", stage: \"frame\", kind: \"long\" },\n { id: \"window\", name: \"Time window\", stage: \"scope\", kind: \"period\" },\n { id: \"baseline\", name: \"Compare against\", stage: \"scope\", kind: \"single\" },\n { id: \"filter\", name: \"Filter and segment\", stage: \"scope\", kind: \"multi\" },\n { id: \"granularity\", name: \"Granularity\", stage: \"scope\", kind: \"quick\" },\n { id: \"entities\", name: \"Pick entities\", stage: \"scope\", kind: \"entity\" },\n { id: \"threshold\", name: \"Set a threshold\", stage: \"scope\", kind: \"number\" },\n { id: \"ambiguity\", name: \"Resolve ambiguity\", stage: \"check\", kind: \"single\" },\n { id: \"dataissue\", name: \"Handle a data issue\", stage: \"check\", kind: \"single\" },\n { id: \"cost\", name: \"Approve an expensive run\", stage: \"check\", kind: \"confirm\" },\n { id: \"method\", name: \"Choose a method\", stage: \"analyse\", kind: \"single\" },\n { id: \"assumptions\", name: \"Confirm assumptions\", stage: \"analyse\", kind: \"multi\" },\n { id: \"confidence\", name: \"Confidence level\", stage: \"analyse\", kind: \"quick\" },\n { id: \"objectives\", name: \"Weigh objectives\", stage: \"analyse\", kind: \"weights\" },\n { id: \"scenario\", name: \"Scenario inputs\", stage: \"analyse\", kind: \"form\" },\n { id: \"format\", name: \"Choose the output\", stage: \"explain\", kind: \"quick\" },\n { id: \"rate\", name: \"Rate the answer\", stage: \"explain\", kind: \"scale\" },\n { id: \"next\", name: \"Suggest what's next\", stage: \"explain\", kind: \"suggestions\" },\n { id: \"approve\", name: \"Approve an action\", stage: \"act\", kind: \"approval\" },\n { id: \"schedule\", name: \"Schedule and share\", stage: \"monitor\", kind: \"multistep\" },\n { id: \"reading\", name: \"Check my reading\", stage: \"frame\", kind: \"interpretation\" },\n { id: \"fork\", name: \"Pick a reading\", stage: \"frame\", kind: \"fork\" },\n { id: \"range\", name: \"Set a range\", stage: \"scope\", kind: \"range\" },\n { id: \"model\", name: \"Specify the model\", stage: \"analyse\", kind: \"modelspec\" },\n { id: \"plan\", name: \"Review the plan\", stage: \"analyse\", kind: \"plan\" },\n { id: \"hypothesis\", name: \"State the hypothesis\", stage: \"analyse\", kind: \"hypothesis\" },\n] as const satisfies readonly { id: string; name: string; stage: StageId; kind: AskKind }[]\n\nexport type AskIntentId = (typeof ASK_INTENTS)[number][\"id\"]\n","// Ids follow the Design Kit Spec (https://claude.ai/artifact/VcN3AYgmbdCpHbxXZjMir5).\n// Do not edit by hand: change the spec first, then copy the ids here.\n// grammar.test.ts fails when these ids and the blocks disagree.\n\nimport type { AnswerKind } from \"@invana/blocks\"\n\n/**\n * What an answer tells, each drawn by one or more blocks. The answer\n * half of {@link ASK_INTENTS}: an intent is an id and a name, the block is the\n * drawing, and several intents may share one block with different options.\n */\nexport const ANSWER_INTENTS = [\n { id: \"say\", name: \"Say it in words\", kinds: [\"narrative\"] },\n { id: \"figure\", name: \"One number, or a few\", kinds: [\"metric\", \"grid\"] },\n { id: \"trend\", name: \"Change over time\", kinds: [\"timeseries\", \"control\"] },\n { id: \"compare\", name: \"Groups side by side\", kinds: [\"bars\", \"dumbbell\", \"matrix\", \"funnel\"] },\n { id: \"rank\", name: \"Leaders and laggards\", kinds: [\"ranked\", \"pareto\", \"tornado\"] },\n { id: \"explain-change\", name: \"What moved the total\", kinds: [\"waterfall\", \"decomposition\"] },\n { id: \"records\", name: \"Rows, or one entity\", kinds: [\"table\", \"record\", \"attr\", \"pivot\", \"profile\"] },\n { id: \"sequence\", name: \"What happened when\", kinds: [\"timeline\", \"heatstrip\"] },\n { id: \"spread\", name: \"The shape of the values\", kinds: [\"histogram\", \"box\", \"quantiles\", \"survival\"] },\n { id: \"relate\", name: \"How things connect\", kinds: [\"scatter\", \"correlation\", \"subgraph\"] },\n { id: \"stats\", name: \"Test and model results\", kinds: [\"test\", \"coef\", \"forest\", \"evidence\", \"modeleval\"] },\n { id: \"trust\", name: \"Method, sources, scope and limits\", kinds: [\"method\", \"citations\", \"scope\", \"caveat\", \"cannot\", \"checks\"] },\n { id: \"act\", name: \"A proposed action, or a file\", kinds: [\"proposal\", \"files\"] },\n { id: \"run.steps\", name: \"What the run did, in order\", kinds: [\"trace\", \"gantt\"] },\n { id: \"run.activity\", name: \"Which layers were busy\", kinds: [\"activity\"] },\n] as const satisfies readonly { id: string; name: string; kinds: readonly AnswerKind[] }[]\n\nexport type AnswerIntentId = (typeof ANSWER_INTENTS)[number][\"id\"]\n","// Ids follow the Design Kit Spec (https://claude.ai/artifact/VcN3AYgmbdCpHbxXZjMir5).\n// Do not edit by hand: change the spec first, then copy the ids here.\n// grammar.test.ts fails when these ids and the block registry disagree.\n\nimport type { AskIntentId } from \"./asks\"\nimport type { PatternId } from \"./patterns\"\nimport type { StageId } from \"./stages\"\n\n/** The research flows: the shapes of question analysts bring. */\nexport const FLOWS = [\n { id: \"kpi\", name: \"KPI check\", template: \"How is {measure} tracking against {baseline}?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"measure\", \"window\", \"baseline\"], pattern: \"snapshot\" },\n { id: \"diagnose\", name: \"Root cause\", template: \"Why did {measure} change in {period}?\", stages: [\"frame\", \"scope\", \"check\", \"analyse\", \"explain\", \"act\"], asks: [\"measure\", \"window\", \"baseline\", \"hunch\"], pattern: \"bridge\" },\n { id: \"compare\", name: \"Comparison & benchmark\", template: \"How does {A} compare with {B} on {measures}?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"entities\", \"measure\", \"confidence\"], pattern: \"comparison\" },\n { id: \"rank\", name: \"Top-N ranking\", template: \"Which {entities} lead or lag on {measure}?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\", \"act\"], asks: [\"measure\", \"filter\", \"threshold\"], pattern: \"ranking\" },\n { id: \"segment\", name: \"Segmentation\", template: \"What groups exist within {population}, and how do they differ?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"filter\", \"method\", \"assumptions\"], pattern: \"profile\" },\n { id: \"cohort\", name: \"Cohort & retention\", template: \"How do {cohorts} behave over time?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"definition\", \"window\", \"granularity\"], pattern: \"cohort\" },\n { id: \"forecast\", name: \"Trend & forecast\", template: \"Where is {measure} heading?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\", \"monitor\"], asks: [\"window\", \"granularity\", \"method\", \"assumptions\"], pattern: \"forecast\" },\n { id: \"anomaly\", name: \"Anomaly & monitoring\", template: \"Tell me when {measure} behaves unusually.\", stages: [\"scope\", \"analyse\", \"act\", \"monitor\"], asks: [\"measure\", \"threshold\", \"approve\", \"schedule\"], pattern: \"anomaly\" },\n { id: \"drivers\", name: \"Driver analysis\", template: \"What moves {measure}?\", stages: [\"frame\", \"analyse\", \"explain\"], asks: [\"measure\", \"method\", \"assumptions\"], pattern: \"drivers\" },\n { id: \"experiment\", name: \"Experiment readout\", template: \"Did {change} work?\", stages: [\"frame\", \"check\", \"analyse\", \"explain\", \"act\"], asks: [\"entities\", \"definition\", \"confidence\"], pattern: \"readout\" },\n { id: \"scenario\", name: \"Scenario & what-if\", template: \"What happens to {outcome} if {input} changes?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\", \"act\"], asks: [\"scenario\", \"assumptions\"], pattern: \"scenariot\" },\n { id: \"funnel\", name: \"Funnel & journey\", template: \"Where do {entities} drop out of {process}?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"definition\", \"window\", \"filter\"], pattern: \"funnelv\" },\n { id: \"distribution\", name: \"Distribution & outliers\", template: \"What does the spread of {measure} look like, and what sits outside it?\", stages: [\"scope\", \"analyse\", \"explain\"], asks: [\"measure\", \"filter\", \"threshold\"], pattern: \"spread\" },\n { id: \"audit\", name: \"Data audit & reconciliation\", template: \"Can I trust {dataset}? Do {A} and {B} agree?\", stages: [\"check\", \"analyse\", \"explain\", \"act\"], asks: [\"definition\", \"dataissue\", \"cost\"], pattern: \"quality\" },\n { id: \"entity\", name: \"Entity lookup (360)\", template: \"Tell me everything about {entity}.\", stages: [\"frame\", \"check\", \"explain\"], asks: [\"ambiguity\", \"entities\"], pattern: \"e360\" },\n { id: \"network\", name: \"Relationships & networks\", template: \"How are {entities} connected?\", stages: [\"frame\", \"scope\", \"check\", \"analyse\", \"explain\"], asks: [\"entities\", \"threshold\", \"cost\"], pattern: \"relmap\" },\n { id: \"qual\", name: \"Qualitative synthesis\", template: \"What are people saying about {topic}?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"filter\", \"window\", \"hunch\"], pattern: \"memo\" },\n { id: \"recommend\", name: \"Recommendation & priority\", template: \"What should we do about {problem}, and in what order?\", stages: [\"analyse\", \"explain\", \"act\"], asks: [\"assumptions\", \"method\", \"approve\"], pattern: \"recommend\" },\n { id: \"report\", name: \"Report & schedule\", template: \"Send me {analysis} every {cadence}.\", stages: [\"explain\", \"act\", \"monitor\"], asks: [\"format\", \"schedule\", \"approve\"], pattern: \"delivery\" },\n { id: \"combine\", name: \"Combination design\", template: \"Which combination of {candidates} best meets {objectives}?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\", \"act\"], asks: [\"entities\", \"objectives\", \"threshold\", \"assumptions\"], pattern: \"shortlist\" },\n { id: \"significance\", name: \"Significance test\", template: \"Is the difference in {measure} between {A} and {B} real?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"hypothesis\", \"confidence\", \"assumptions\"], pattern: \"significance\" },\n { id: \"effects\", name: \"Effect estimation\", template: \"How much does each {factor} change {outcome}, holding the others fixed?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"model\", \"plan\", \"assumptions\"], pattern: \"effects\" },\n { id: \"association\", name: \"Correlation & association\", template: \"Which {measures} move together, and how strongly?\", stages: [\"frame\", \"scope\", \"check\", \"analyse\", \"explain\"], asks: [\"reading\", \"filter\", \"range\"], pattern: \"association\" },\n { id: \"spc\", name: \"Process control\", template: \"Is {process} in control, and what causes most of the defects?\", stages: [\"scope\", \"analyse\", \"explain\", \"monitor\"], asks: [\"window\", \"granularity\", \"range\"], pattern: \"spc\" },\n { id: \"timeto\", name: \"Time to event\", template: \"How long until {event}, and does it differ by {group}?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"definition\", \"fork\", \"window\"], pattern: \"timeto\" },\n { id: \"modelcheck\", name: \"Model check\", template: \"How well does {model} predict {outcome}, and where does it fail?\", stages: [\"check\", \"analyse\", \"explain\", \"act\"], asks: [\"model\", \"range\", \"plan\"], pattern: \"modelcheck\" },\n] as const satisfies readonly {\n id: string\n name: string\n template: string\n stages: readonly StageId[]\n asks: readonly AskIntentId[]\n pattern: PatternId\n}[]\n\nexport type FlowId = (typeof FLOWS)[number][\"id\"]\n","import { ClarifyCard } from \"../../asks\"\nimport { Placeholder } from \"@invana/blocks\"\nimport type { ResolvedRegistry } from \"../../conversations/registry\"\nimport { relativeTime } from \"../../conversations/relative-time\"\nimport { STAGES } from \"../../grammar\"\nimport type { ConversationEvent } from \"../../protocol/events\"\nimport type { AskTurn } from \"../../protocol/types\"\n\nconst STAGE_NAME = new Map<string, string>(STAGES.map((s) => [s.id, s.name]))\nconst stageName = (stage: string) => (STAGE_NAME.get(stage) ?? stage).toLowerCase()\n\nexport interface AskViewProps {\n turn: AskTurn\n registry: ResolvedRegistry\n onEvent: (event: ConversationEvent) => void\n /** The clock an answered ask's time is read against, in ms. */\n now: number\n}\n\n/**\n * An ask, drawn by whatever the registry holds for its block. Its traits say\n * how it sits: in the ask card — its state, the stage that asked, when it was\n * answered, the header word the block names — or bare, as its renderer draws\n * it. An ask with no renderer is a labelled placeholder in the card.\n */\nexport function AskView({ turn, registry, onEvent, now }: AskViewProps) {\n const Renderer = registry.asks[turn.ask.kind]\n const traits = registry.askTraits(turn.ask.kind)\n if (Renderer && traits.frame === \"none\") {\n return <Renderer turn={turn} options={turn.ask} onEvent={onEvent} />\n }\n const time =\n turn.state === \"answered\" && turn.answeredAt ? relativeTime(turn.answeredAt, now) : undefined\n return (\n <ClarifyCard\n state={turn.state}\n kind={traits.kind}\n step={stageName(turn.stage)}\n waiting={turn.state === \"pending\" ? turn.waiting : undefined}\n time={time}\n >\n {Renderer ? (\n <Renderer turn={turn} options={turn.ask} onEvent={onEvent} />\n ) : (\n <Placeholder kind={turn.ask.kind} options={turn.ask} />\n )}\n </ClarifyCard>\n )\n}\n","import { cn, Skeleton } from \"@invana/ui\"\n\nimport { SuggestionChips } from \"@invana/blocks\"\nimport type { Tone } from \"../protocol/types\"\n\n/** One bar of a skeleton: its width as a share of the block, and a height in px when it is not a text line. */\ntype Bar = [width: number, height?: number]\n\nconst LINES: Bar[] = [[0.6], [0.75], [0.5]]\n/** A chart: the plot, then its legend. */\nconst CHART: Bar[] = [[1, 110], [0.55, 7]]\n/** A ranked list or a timeline: rows that shorten, then the line under them. */\nconst ROWS: Bar[] = [[0.92], [0.74], [0.55], [0.38], [0.4, 7]]\n\n/**\n * The skeleton each block draws while its data is on the way, shaped like the\n * block so the card does not jump when it lands. A block not named here gets\n * text lines.\n */\nconst SHAPE: Record<string, Bar[]> = {\n metric: [[0.45], [0.3, 22], [0.55]],\n grid: [[1, 56]],\n record: [[0.6], [0.75], [0.5], [0.68]],\n table: [[1, 7], [1], [1], [1]],\n attr: [[1, 7], [1], [1], [1]],\n pivot: [[1, 7], [1], [1], [1]],\n coef: [[1, 7], [1], [1], [1]],\n files: [[0.7], [0.55], [0.62]],\n ranked: ROWS,\n timeline: ROWS,\n funnel: ROWS,\n pareto: ROWS,\n tornado: ROWS,\n forest: ROWS,\n dumbbell: ROWS,\n timeseries: CHART,\n bars: CHART,\n waterfall: CHART,\n histogram: CHART,\n matrix: CHART,\n correlation: CHART,\n scatter: CHART,\n box: CHART,\n control: CHART,\n survival: CHART,\n decomposition: CHART,\n modeleval: CHART,\n quantiles: CHART,\n subgraph: CHART,\n}\n\n/** A block whose data is on the way. */\nexport function BlockSkeleton({ kind }: { kind: string }) {\n const bars = SHAPE[kind] ?? LINES\n return (\n <div role=\"status\" aria-label=\"Loading\" className=\"flex flex-col gap-1.5 py-0.5\">\n {bars.map(([width, height], i) => (\n <Skeleton\n key={i}\n style={{ width: `${width * 100}%`, height: height ?? 9 }}\n />\n ))}\n </div>\n )\n}\n\n/**\n * A block with nothing to draw, saying what is missing — never a blank card.\n * Follow-ups that would find something sit under it.\n */\nexport function BlockEmpty({\n text,\n suggestions,\n onSuggest,\n}: {\n text: string\n suggestions?: string[]\n onSuggest: (text: string) => void\n}) {\n return (\n <div className=\"flex flex-col gap-2\">\n <p className=\"m-0 rounded-md border border-dashed border-border px-2 py-3.5 text-center text-sm text-muted-foreground\">\n {text}\n </p>\n {suggestions?.length ? <SuggestionChips items={suggestions} onSelect={onSuggest} /> : null}\n </div>\n )\n}\n\n/** The line under a block. A warning is inked as one. */\nexport function BlockCaption({ text, tone }: { text: string; tone?: Tone }) {\n return (\n <p\n className={cn(\n \"m-0 text-xs\",\n tone === \"warn\" ? \"text-warning\" : tone === \"bad\" ? \"text-destructive\" : \"text-muted-foreground\",\n )}\n >\n {text}\n </p>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"@invana/ui\"\n\nimport { ActionRow } from \"@invana/blocks\"\nimport { BlockCaption, BlockEmpty, BlockSkeleton } from \"../../conversations/block-status\"\nimport { Placeholder } from \"@invana/blocks\"\nimport type { ResolvedRegistry } from \"../../conversations/registry\"\nimport type { ConversationEvent } from \"../../protocol/events\"\nimport type { AnswerTurn, BlockSpec, Outcome } from \"../../protocol/types\"\n\nexport interface BlockViewProps {\n block: BlockSpec\n turn: AnswerTurn\n registry: ResolvedRegistry\n onEvent: (event: ConversationEvent) => void\n}\n\n/**\n * One block, drawn by whatever the registry holds for its block — a built-in,\n * a renderer of your own, or a labelled placeholder when there is none. Its\n * loading and empty states and its caption are the protocol's, so they look\n * the same under every renderer.\n */\nexport function BlockView({ block, turn, registry, onEvent }: BlockViewProps) {\n const Renderer = registry.blocks[block.kind]\n const body =\n block.status === \"loading\" ? (\n <BlockSkeleton kind={block.kind} />\n ) : block.status === \"empty\" ? (\n <BlockEmpty\n text={block.emptyText ?? \"Nothing to show.\"}\n suggestions={block.emptySuggestions}\n onSuggest={(text) => onEvent({ type: \"prompt\", text })}\n />\n ) : !Renderer ? (\n <Placeholder kind={block.kind} options={block} />\n ) : (\n <Renderer block={block} turn={turn} onEvent={onEvent} />\n )\n // A skeleton or an empty block says it all; the line under the block is about its data.\n if (!block.caption || block.status) return body\n return (\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n {body}\n <BlockCaption text={block.caption} tone={block.captionTone} />\n </div>\n )\n}\n\n/**\n * The envelope, drawn by the blocks a block would use so it looks the same\n * everywhere: scope and freshness over the evidence, method and caveats under.\n * These are the protocol's envelope fields, not answer types.\n */\nexport function envelopeBlocks(turn: AnswerTurn): { top: BlockSpec[]; bottom: BlockSpec[] } {\n const env = turn.envelope\n if (!env) return { top: [], bottom: [] }\n const parts = [...(env.scope ?? []), ...(env.freshness ? [`as of ${env.freshness}`] : [])]\n const top: BlockSpec[] = parts.length ? [{ kind: \"scope\", parts }] : []\n const bottom: BlockSpec[] = [\n ...(env.method ? [{ kind: \"method\" as const, label: \"method\", code: env.method }] : []),\n ...(env.caveats ?? []).map((c) => ({ kind: \"caveat\" as const, label: c.label, text: c.text })),\n ]\n return { top, bottom }\n}\n\n/**\n * An answer's blocks, split by where the registry says each sits: in the\n * answer's card with its envelope, or in a card of its own under it.\n */\nexport function splitBlocks(turn: AnswerTurn, registry: ResolvedRegistry) {\n const { top, bottom } = envelopeBlocks(turn)\n const own = turn.blocks.filter((b) => registry.blockTraits(b.kind).placement === \"own\")\n const inCard = turn.blocks.filter((b) => registry.blockTraits(b.kind).placement !== \"own\")\n return { inCard: [...top, ...inCard, ...bottom], own, hasEvidence: inCard.length > 0 }\n}\n\n/** `cite · 3,406 fills` — what the card's header says it rests on. */\nexport function citationOf(turn: AnswerTurn): string | undefined {\n const g = turn.envelope?.grounding\n return g ? `cite · ${g.records.toLocaleString(\"en-GB\")}${g.noun ? ` ${g.noun}` : \"\"}` : undefined\n}\n\n/**\n * What the run produced, outside the thread, and what to do with it —\n * `14 nodes · 212 relationships` with `Load to canvas`. Each action is sent as\n * an `action` event on the turn.\n */\nexport function OutcomeView({\n outcome,\n turn,\n onEvent,\n tone,\n className,\n}: {\n outcome: Outcome\n turn: AnswerTurn\n onEvent: (event: ConversationEvent) => void\n /** `bad` rules it in the destructive tone — what to do after a failure. */\n tone?: \"bad\"\n className?: string\n}) {\n return (\n <div\n className={cn(\n \"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1.5 rounded-md border border-border px-2 py-1.5\",\n tone === \"bad\" && \"border-destructive/50\",\n className,\n )}\n >\n {outcome.text ? <span className=\"min-w-0 flex-1 text-muted-foreground\">{outcome.text}</span> : null}\n {outcome.actions?.length ? (\n <div className={cn(\"min-w-0\", outcome.text ? \"shrink-0\" : \"flex-1\")}>\n <ActionRow\n actions={outcome.actions}\n onAction={(action) => onEvent({ type: \"action\", turn: turn.id, action })}\n />\n </div>\n ) : null}\n </div>\n )\n}\n\n/** Blocks in a column, with the gap an answer's body uses. */\nexport function BlockStack({ children, className }: { children: React.ReactNode; className?: string }) {\n return <div className={cn(\"flex min-w-0 flex-col gap-3\", className)}>{children}</div>\n}\n","import * as React from \"react\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@invana/forms\"\nimport { cn } from \"@invana/ui\"\n\nimport { ChatSessionComposer } from \"../../conversations/thread\"\nimport type { ComposerControl, ComposerSpec } from \"../../protocol/types\"\nimport { useChatSessionContext } from \"./context\"\n\n/** A 16×16 stroked icon from its path data, as the API sends one. */\nexport function PathIcon({ path, className }: { path: string; className?: string }) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.3}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"size-3.5 shrink-0\", className)}\n >\n <path d={path} />\n </svg>\n )\n}\n\nexport interface ComposerSelectProps {\n control: ComposerControl\n value: string\n onValueChange: (value: string) => void\n /** Let the select take the free width and truncate — the model name. */\n grow?: boolean\n}\n\n/**\n * A select that sits in the composer's toolbar: borderless, compact, the\n * value alone until opened. `quiet` mutes it — a setting rather than the mode.\n */\nexport function ComposerSelect({ control, value, onValueChange, grow }: ComposerSelectProps) {\n return (\n <Select value={value} onValueChange={onValueChange}>\n <SelectTrigger\n aria-label={control.label}\n title={control.label}\n className={cn(\n \"h-control-sm gap-1 border-0 bg-transparent px-2 shadow-none hover:bg-accent\",\n grow ? \"w-full min-w-0\" : \"w-auto shrink-0\",\n control.quiet && \"text-muted-foreground\",\n )}\n >\n {control.icon ? <PathIcon path={control.icon} /> : null}\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {control.options.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\n\n/** A file waiting to be sent, removable until it is. */\nexport function AttachmentChip({ name, onRemove }: { name: string; onRemove?: () => void }) {\n return (\n <span className=\"inline-flex max-w-40 items-center gap-1 rounded-control border border-border bg-muted/40 px-2 py-1 text-sm\">\n <span className=\"truncate\">{name}</span>\n {onRemove ? (\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label={`Remove ${name}`}\n className=\"shrink-0 rounded-sm px-0.5 text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n ×\n </button>\n ) : null}\n </span>\n )\n}\n\n/** Every control's value: what was picked, else its default, else its first option. */\nexport function initialSettings(composer: ComposerSpec | undefined): Record<string, string> {\n const out: Record<string, string> = {}\n for (const c of composer?.controls ?? []) out[c.id] = c.default ?? c.options[0]?.value ?? \"\"\n return out\n}\n\nexport interface ComposerBarProps {\n isRunning: boolean\n onStop: () => void\n}\n\n/**\n * The composer, drawn from the spec's `composer`: the prompt, the toolbar's\n * controls at the start and end, attach, and send — or stop while a run is in\n * flight. The same in every variant. A pick that sets a placeholder or mono\n * type (a query language) changes the prompt box to match.\n */\nexport function ComposerBar({ isRunning, onStop }: ComposerBarProps) {\n const { spec, emit, icons, setComposer } = useChatSessionContext()\n const composer = spec.composer\n const controls = composer?.controls ?? []\n const [draft, setDraft] = React.useState(\"\")\n const [files, setFiles] = React.useState<File[]>([])\n // Only what the analyst picked is held; every other control reads its\n // default, so a control the spec adds later starts there, and one it drops\n // is forgotten.\n const [picks, setPicks] = React.useState<Record<string, string>>({})\n const settings = initialSettings(composer)\n for (const c of controls) {\n const pick = picks[c.id]\n if (pick !== undefined && c.options.some((o) => o.value === pick)) settings[c.id] = pick\n }\n const fileInput = React.useRef<HTMLInputElement>(null)\n\n const picked = controls.map((c) => c.options.find((o) => o.value === settings[c.id])).filter(Boolean)\n const placeholder = picked.find((o) => o?.placeholder)?.placeholder ?? composer?.placeholder\n const mono = picked.some((o) => o?.mono)\n\n const setting = (id: string, value: string) => {\n setPicks((prev) => ({ ...prev, [id]: value }))\n emit({ type: \"setting\", id, value })\n }\n\n const send = () => {\n const text = draft.trim()\n if (!text && !files.length) return\n emit({\n type: \"prompt\",\n text,\n ...(controls.length ? { settings } : {}),\n ...(files.length ? { files } : {}),\n })\n setDraft(\"\")\n setFiles([])\n }\n\n const attach = composer?.attach\n const attachOptions = typeof attach === \"object\" ? attach : {}\n const select = (c: ComposerControl, grow?: boolean) => (\n <ComposerSelect\n key={c.id}\n control={c}\n value={settings[c.id] ?? \"\"}\n onValueChange={(v) => setting(c.id, v)}\n grow={grow}\n />\n )\n const start = controls.filter((c) => (c.align ?? \"start\") === \"start\")\n const end = controls.filter((c) => c.align === \"end\")\n\n return (\n <div ref={setComposer}>\n <ChatSessionComposer\n value={draft}\n onChange={setDraft}\n onSend={send}\n onStop={onStop}\n isRunning={isRunning}\n placeholder={placeholder}\n textareaClassName={cn(\"h-[72px] min-h-14\", mono && \"font-mono\")}\n sendIcon={icons.send}\n stopIcon={icons.stop}\n sendDisabled={isRunning || (!draft.trim() && !files.length)}\n attachments={\n files.length\n ? files.map((f, i) => (\n <AttachmentChip\n key={`${f.name}-${i}`}\n name={f.name}\n onRemove={() => setFiles((prev) => prev.filter((_, j) => j !== i))}\n />\n ))\n : undefined\n }\n // The last start control takes the free width: it is the one that truncates.\n toolbarStart={start.length ? <>{start.map((c, i) => select(c, i === start.length - 1))}</> : undefined}\n toolbarEnd={\n end.length || attach ? (\n <>\n {end.map((c) => select(c))}\n {attach ? (\n <>\n <input\n ref={fileInput}\n type=\"file\"\n hidden\n accept={attachOptions.accept}\n multiple={attachOptions.multiple ?? true}\n onChange={(e) => {\n const list = e.target.files\n if (list?.length) setFiles((prev) => [...prev, ...Array.from(list)])\n // Reset, so choosing the same file again still fires.\n e.target.value = \"\"\n }}\n />\n <button\n type=\"button\"\n onClick={() => fileInput.current?.click()}\n title=\"Attach files\"\n aria-label=\"Attach files\"\n className=\"inline-flex size-7 shrink-0 items-center justify-center rounded-control text-muted-foreground hover:bg-accent\"\n >\n {icons.attach}\n </button>\n </>\n ) : null}\n </>\n ) : undefined\n }\n />\n </div>\n )\n}\n","import { cn, Eyebrow, PropertyList, PropertyRow } from \"@invana/ui\"\n\nimport {\n ChatSessionActivitySubLine,\n ChatSessionDisclosure,\n ChatSessionTaskRow,\n type ChatSessionTaskStatus,\n} from \"../../conversations/thread\"\nimport type { AnswerTurn, TraceIoRow, TraceStep } from \"../../protocol/types\"\nimport { useChatSessionContext } from \"./context\"\nimport { formatDuration } from \"./format\"\nimport { answerTime, runOutcome, stepCount, stepTime } from \"./model\"\n\nconst ROW_STATUS: Record<TraceStep[\"state\"], ChatSessionTaskStatus> = {\n pending: \"queued\",\n running: \"running\",\n done: \"success\",\n failed: \"error\",\n waiting: \"needs-input\",\n retrying: \"needs-input\",\n stopped: \"needs-input\",\n}\n\nconst TONE: Partial<Record<TraceStep[\"state\"], string>> = {\n failed: \"text-destructive\",\n waiting: \"text-warning\",\n retrying: \"text-warning\",\n stopped: \"text-warning\",\n}\n\n/** A step's line, saying its state where the dot alone would not. */\nexport function stepDescription(step: TraceStep): string | undefined {\n const detail = step.state === \"failed\" ? (step.error ?? step.detail) : step.detail\n switch (step.state) {\n case \"retrying\":\n return [`retrying ${step.attempt ?? 2}${step.attempts ? `/${step.attempts}` : \"\"}`, detail]\n .filter(Boolean)\n .join(\" · \")\n case \"waiting\":\n return [\"needs input\", detail].filter(Boolean).join(\" · \")\n case \"stopped\":\n return \"stopped\"\n default:\n return detail\n }\n}\n\nfunction IoRows({ label, rows }: { label: string; rows: TraceIoRow[] }) {\n return (\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <Eyebrow>{label}</Eyebrow>\n <PropertyList labelWidth=\"auto\" variant=\"summary\">\n {rows.map((row, i) => (\n <PropertyRow key={`${row.label}-${i}`} label={row.label} mono={row.code}>\n {row.code ? <pre className=\"m-0 whitespace-pre-wrap break-words\">{row.value}</pre> : row.value}\n </PropertyRow>\n ))}\n </PropertyList>\n </div>\n )\n}\n\n/** What went into a step and what came out: its audit record. */\nexport function StepRecord({ step }: { step: TraceStep }) {\n const input = step.io?.input ?? []\n const output = step.io?.output ?? []\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n {input.length ? <IoRows label=\"Input\" rows={input} /> : null}\n {output.length ? <IoRows label=\"Output\" rows={output} /> : null}\n {step.error ? <IoRows label=\"Error\" rows={[{ label: \"cause\", value: step.error }]} /> : null}\n </div>\n )\n}\n\nconst hasRecord = (step: TraceStep) => !!(step.io?.input?.length || step.io?.output?.length || step.error)\n\nexport interface StepRowProps {\n turn: AnswerTurn\n step: TraceStep\n /** Draw the streamed reasoning and the open record under the row. @default true */\n detail?: boolean\n /** In place of opening the record — the Tasks view jumps to the reply instead. */\n onSelect?: () => void\n /** Written after the description — `↑ 1.2k tokens`. */\n suffix?: string\n}\n\n/**\n * One step of a run: its state as a dot, its name, what it is doing, and its\n * time — counting up while it runs. Clicking it opens its record; while it\n * runs, its reasoning streams under it.\n */\nexport function StepRow({ turn, step, detail = true, onSelect, suffix }: StepRowProps) {\n const ctx = useChatSessionContext()\n const id = step.id ?? step.label\n const time = stepTime(step, ctx.now)\n const description = [stepDescription(step), suffix].filter(Boolean).join(\" · \")\n const open = detail && ctx.recordOpen(turn.id, id)\n const select =\n onSelect ??\n (hasRecord(step)\n ? () => ctx.toggleRecord(turn.id, id)\n : ctx.opensRuns\n ? () => ctx.emit({ type: \"open-run\", turn: turn.id, step: step.id })\n : undefined)\n return (\n <div className=\"flex min-w-0 flex-col\">\n <ChatSessionTaskRow\n status={ROW_STATUS[step.state]}\n name={step.label}\n description={description ? <span className={TONE[step.state]}>{description}</span> : undefined}\n meta={time !== undefined ? formatDuration(time) : undefined}\n onClick={select}\n />\n {detail && step.thinking && (step.state === \"running\" || step.state === \"retrying\") ? (\n <ChatSessionActivitySubLine className=\"pl-[22px] italic\">{step.thinking}</ChatSessionActivitySubLine>\n ) : null}\n {open && hasRecord(step) ? (\n <ChatSessionDisclosure\n className=\"my-0.5 ml-[22px]\"\n label={<span className=\"font-mono\">{step.key ?? step.label}</span>}\n meta={[\n step.attempt ? `attempt ${step.attempt}` : undefined,\n step.duration !== undefined ? formatDuration(step.duration) : undefined,\n ]\n .filter(Boolean)\n .join(\" · \")}\n open\n onOpenChange={() => ctx.toggleRecord(turn.id, id, false)}\n >\n <StepRecord step={step} />\n </ChatSessionDisclosure>\n ) : null}\n </div>\n )\n}\n\n/** Every step of an answer, in the order they run. */\nexport function StepList({ turn, className }: { turn: AnswerTurn; className?: string }) {\n return (\n <div className={cn(\"flex min-w-0 flex-col gap-px\", className)}>\n {(turn.trace ?? []).map((step, i) => (\n <StepRow key={step.id ?? i} turn={turn} step={step} />\n ))}\n </div>\n )\n}\n\nconst VERB = { done: \"Thought for\", failed: \"Failed after\", stopped: \"Stopped after\" } as const\n\n/**\n * A settled run in one line — `✻ Thought for 2.4s · 4 of 4 steps ▸`. The line\n * opens the steps; the time opens the whole run when the host does that\n * (`onOpenRun`), and the steps otherwise.\n */\nexport function RunSummaryLine({ turn }: { turn: AnswerTurn }) {\n const ctx = useChatSessionContext()\n const outcome = runOutcome(turn)\n const verb = VERB[outcome === \"failed\" || outcome === \"stopped\" ? outcome : \"done\"]\n const time = answerTime(turn, ctx.now)\n const { done, total } = stepCount(turn)\n const open = ctx.stepsOpen(turn.id, false)\n return (\n <div className=\"flex min-w-0 items-center gap-2 text-muted-foreground\">\n <span className=\"select-none text-border\" aria-hidden>\n ✻\n </span>\n <span className=\"min-w-0 truncate\">\n {verb}{\" \"}\n {time !== undefined ? (\n <button\n type=\"button\"\n className=\"tabular-nums underline-offset-2 hover:text-foreground hover:underline\"\n onClick={() =>\n ctx.opensRuns ? ctx.emit({ type: \"open-run\", turn: turn.id }) : ctx.setSteps(turn.id, !open)\n }\n >\n {formatDuration(time)}\n </button>\n ) : (\n \"—\"\n )}\n {total ? ` · ${done} of ${total} steps` : null}\n </span>\n {total ? (\n <button\n type=\"button\"\n aria-expanded={open}\n aria-label={open ? \"Fold the steps\" : \"Show the steps\"}\n className=\"hover:text-foreground\"\n onClick={() => ctx.setSteps(turn.id, !open)}\n >\n <span className={cn(\"inline-block transition-transform\", open && \"rotate-90\")}>▸</span>\n </button>\n ) : null}\n </div>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"@invana/ui\"\n\nimport {\n ChatSessionActivityRow,\n type ChatSessionActivityStatus,\n ChatSessionActivitySubLine,\n ChatSessionFrame,\n ChatSessionProgressLine,\n ChatSessionPromptRow,\n ChatSessionStatusBar,\n ChatSessionTaskGroup,\n} from \"../../conversations/thread\"\nimport type { AnswerTurn, AskTurn } from \"../../protocol/types\"\nimport { AskView } from \"../base/ask\"\nimport { BlockStack, BlockView, OutcomeView, splitBlocks } from \"../base/blocks\"\nimport { AnswerLine, KeyHints, SessionHeader } from \"../base/chrome\"\nimport { ComposerBar } from \"../base/composer\"\nimport { useChatSessionContext } from \"../base/context\"\nimport { clockTime, formatDuration } from \"../base/format\"\nimport {\n answerTime,\n currentStep,\n exchangesOf,\n exchangeState,\n type Exchange,\n isAnswer,\n runOutcome,\n type RunOutcome,\n threadCounts,\n turnDomId,\n} from \"../base/model\"\nimport { RunSummaryLine, StepList, StepRow } from \"../base/steps\"\n\nconst ANSWER_DOT: Record<RunOutcome, ChatSessionActivityStatus> = {\n live: \"pending\",\n waiting: \"info\",\n done: \"success\",\n failed: \"error\",\n stopped: \"warning\",\n}\n\nconst ASK_DOT: Record<string, ChatSessionActivityStatus> = {\n pending: \"info\",\n answered: \"success\",\n skipped: \"default\",\n superseded: \"default\",\n expired: \"default\",\n}\n\n/** Open the reply in the chat, steps showing, and scroll to it. */\nfunction useJump() {\n const ctx = useChatSessionContext()\n return (turnId: string) => {\n ctx.setView(\"chat\")\n ctx.toggleSteps(turnId, true)\n ctx.scrollToTurn(turnId)\n }\n}\n\n/**\n * An answer as the console draws it: a status dot, then its blocks — every\n * one through the registry, bare, the row being the frame — its steps under\n * it while it runs and folded to one line after, what it produced, and what\n * can be done with it.\n */\nfunction CliAnswer({ turn }: { turn: AnswerTurn }) {\n const ctx = useChatSessionContext()\n const outcome = runOutcome(turn)\n const live = outcome === \"live\" || outcome === \"waiting\"\n const { inCard, own, hasEvidence } = splitBlocks(turn, ctx.registry)\n const blocks = [...inCard, ...own]\n const step = currentStep(turn)\n const time = answerTime(turn, ctx.now)\n const showSteps = !!turn.trace?.length && (live || ctx.stepsOpen(turn.id, false))\n\n const body =\n live && !hasEvidence ? (\n <ChatSessionProgressLine\n className=\"-ml-[22px]\"\n elapsed={time !== undefined ? formatDuration(time) : undefined}\n // Waiting on the analyst is not work in flight: no spinner, the ask's tone.\n spinner={outcome === \"waiting\" ? <span className=\"size-1.5 rounded-full bg-info\" aria-hidden /> : undefined}\n >\n {outcome === \"waiting\" ? \"Waiting on your answer\" : step ? `${step.label}…` : \"Planning…\"}\n </ChatSessionProgressLine>\n ) : blocks.length ? (\n <BlockStack className=\"whitespace-normal\">\n {blocks.map((b, i) => (\n <BlockView key={`${b.kind}-${i}`} block={b} turn={turn} registry={ctx.registry} onEvent={ctx.emit} />\n ))}\n </BlockStack>\n ) : outcome === \"failed\" ? (\n \"The run failed.\"\n ) : outcome === \"stopped\" ? (\n \"Stopped by you.\"\n ) : null\n\n return (\n <ChatSessionActivityRow\n status={ANSWER_DOT[outcome]}\n meta={!live && turn.meta ? turn.meta : undefined}\n footer={\n <>\n {live && turn.trace?.length ? <StepList turn={turn} className=\"pt-0.5\" /> : null}\n {!live ? (\n // The run in one line, and what can be done with the answer at its right.\n <AnswerLine turn={turn}>{turn.trace?.length ? <RunSummaryLine turn={turn} /> : null}</AnswerLine>\n ) : null}\n {!live && showSteps ? <StepList turn={turn} className=\"pt-0.5\" /> : null}\n {turn.outcome && !live ? (\n <OutcomeView\n className=\"mt-0.5\"\n outcome={turn.outcome}\n turn={turn}\n onEvent={ctx.emit}\n tone={outcome === \"failed\" ? \"bad\" : undefined}\n />\n ) : null}\n {outcome === \"stopped\" ? (\n <ChatSessionActivitySubLine>Interrupted · ask again, or narrow the question</ChatSessionActivitySubLine>\n ) : null}\n </>\n }\n >\n {body}\n </ChatSessionActivityRow>\n )\n}\n\nfunction CliAsk({ turn }: { turn: AskTurn }) {\n const ctx = useChatSessionContext()\n return (\n <ChatSessionActivityRow status={ASK_DOT[turn.state] ?? \"default\"}>\n <div className=\"whitespace-normal\">\n <AskView turn={turn} registry={ctx.registry} onEvent={ctx.emit} now={ctx.now} />\n </div>\n </ChatSessionActivityRow>\n )\n}\n\nfunction CliExchange({ exchange }: { exchange: Exchange }) {\n const ctx = useChatSessionContext()\n const prompt = exchange.prompt\n return (\n <div className=\"contents\">\n {prompt ? (\n <div id={turnDomId(ctx.spec, prompt.id)} className=\"scroll-mt-3\">\n <ChatSessionPromptRow meta={prompt.at ? <span className=\"tabular-nums\">{clockTime(prompt.at)}</span> : undefined}>\n {prompt.text}\n </ChatSessionPromptRow>\n </div>\n ) : null}\n {exchange.replies.map((reply) => (\n <div key={reply.id} id={turnDomId(ctx.spec, reply.id)} className=\"min-w-0 scroll-mt-3\">\n {isAnswer(reply) ? <CliAnswer turn={reply} /> : <CliAsk turn={reply} />}\n </div>\n ))}\n </div>\n )\n}\n\nconst WEIGHT = { running: 0, waiting: 1, settled: 2 } as const\n\n/**\n * Every step of every reply, grouped by prompt, newest first — what runs and\n * what waits on you float to the top. A row jumps to its reply.\n */\nfunction CliTasks() {\n const ctx = useChatSessionContext()\n const jump = useJump()\n const blocks = (ask: AskTurn) => ctx.registry.askTraits(ask.ask.kind).frame === \"card\"\n const groups = exchangesOf(ctx.spec)\n .filter((e) => e.replies.some((r) => isAnswer(r) && r.trace?.length))\n .reverse()\n .sort((a, b) => WEIGHT[exchangeState(a, blocks)] - WEIGHT[exchangeState(b, blocks)])\n return (\n <>\n {groups.map((exchange) => {\n const state = exchangeState(exchange, blocks)\n const answers = exchange.replies.filter(isAnswer)\n const total = answers.reduce((sum, a) => sum + (answerTime(a, ctx.now) ?? 0), 0)\n const when = clockTime(exchange.prompt?.at)\n const said = state === \"running\" ? \"running\" : state === \"waiting\" ? \"waiting on you\" : formatDuration(total)\n return (\n <ChatSessionTaskGroup\n key={exchange.id}\n heading={\n <div className=\"flex justify-between gap-2\">\n <span className=\"min-w-0 truncate\" title={exchange.prompt?.text}>\n {exchange.prompt?.text ?? ctx.spec.title}\n </span>\n <span className=\"shrink-0 font-normal text-muted-foreground tabular-nums\">\n {[when, said].filter(Boolean).join(\" · \")}\n </span>\n </div>\n }\n >\n {answers.flatMap((a) =>\n (a.trace ?? []).map((s, i) => (\n <StepRow key={`${a.id}-${s.id ?? i}`} turn={a} step={s} detail={false} onSelect={() => jump(a.id)} />\n )),\n )}\n </ChatSessionTaskGroup>\n )\n })}\n </>\n )\n}\n\n/** While anything runs, the step it is on stays pinned above the composer. */\nfunction PinnedSteps() {\n const ctx = useChatSessionContext()\n const jump = useJump()\n const live = ctx.spec.turns.filter(\n (t): t is AnswerTurn => isAnswer(t) && (runOutcome(t) === \"live\" || runOutcome(t) === \"waiting\"),\n )\n if (!live.length) return null\n return (\n <div className=\"border-b border-border px-3 py-1.5\">\n {live.map((a) => {\n const step = currentStep(a) ?? a.trace?.[0]\n return step ? (\n <StepRow key={a.id} turn={a} step={step} detail={false} onSelect={() => jump(a.id)} />\n ) : null\n })}\n </div>\n )\n}\n\nexport interface CliSessionProps {\n running: boolean\n onStop: () => void\n /** `true` draws the session's own header; a node is drawn in its place. */\n header: React.ReactNode\n onClose?: () => void\n emptyState?: React.ReactNode\n className?: string\n}\n\n/**\n * The console: your prompt as a caret row, every reply a status-dotted row\n * with the steps that produced it under it, the running step pinned above the\n * composer, and a status bar that switches to every step of the session.\n */\nexport function CliSession({ running, onStop, header, onClose, emptyState, className }: CliSessionProps) {\n const ctx = useChatSessionContext()\n const counts = threadCounts(ctx.spec, (ask) => ctx.registry.askTraits(ask.ask.kind).frame === \"card\")\n const tasks = ctx.view === \"tasks\"\n const viewButton = (target: \"chat\" | \"tasks\", label: string) => (\n <button\n type=\"button\"\n aria-pressed={ctx.view === target}\n onClick={() => ctx.setView(target)}\n className={ctx.view === target ? \"font-medium text-foreground\" : \"hover:text-foreground\"}\n >\n {label}\n </button>\n )\n return (\n <div className={cn(\"flex h-full min-h-0 flex-col bg-background\", className)}>\n {header === true ? <SessionHeader onClose={onClose} /> : header || null}\n <ChatSessionFrame\n className=\"min-h-0 flex-1\"\n autoScrollKey={`${ctx.view}-${ctx.spec.turns.length}`}\n emptyState={emptyState}\n bodyClassName={tasks ? \"gap-[18px]\" : undefined}\n footer={\n <div className=\"border-t border-border\">\n {!tasks ? <PinnedSteps /> : null}\n <ComposerBar isRunning={running} onStop={onStop} />\n <ChatSessionStatusBar\n className=\"pt-0\"\n start={\n <>\n {viewButton(\"chat\", \"Chat\")}\n {viewButton(\"tasks\", `Tasks (${counts.steps})`)}\n {counts.running ? (\n <span className=\"text-primary\">{counts.running} running</span>\n ) : counts.waiting ? (\n <span className=\"text-warning\">{counts.waiting} needs input</span>\n ) : null}\n </>\n }\n end={ctx.spec.composer?.hints === false ? undefined : <KeyHints running={running} />}\n />\n </div>\n }\n >\n {tasks ? <CliTasks /> : exchangesOf(ctx.spec).map((e) => <CliExchange key={e.id} exchange={e} />)}\n </ChatSessionFrame>\n </div>\n )\n}\n","import type * as React from \"react\"\n\nimport type { RegistryOverrides } from \"../conversations/registry\"\nimport type { ConversationEvent, ConversationEventType } from \"../protocol/events\"\nimport type { PatchSource } from \"../protocol/stream\"\nimport type { AnswerState, ConversationSpec } from \"../protocol/types\"\n\n/** `cli` is the console: caret prompts, status-dotted replies, step rows, a Tasks view. `web` is the chat: labelled turns, answer cards. */\nexport type ChatSessionVariant = \"cli\" | \"web\"\n\n/** The event of one type — `ChatSessionEventOf<\"reply\">` is `{ type: \"reply\"; turn; value }`. */\nexport type ChatSessionEventOf<T extends ConversationEventType> = Extract<ConversationEvent, { type: T }>\n\ntype Camel<S extends string> = S extends `${infer Head}-${infer Rest}` ? `${Head}${Capitalize<Camel<Rest>>}` : S\n\n/**\n * One typed callback per event: `onPrompt`, `onReply`, `onAction`,\n * `onOpenRun`, `onRate`, `onStop`, … Each receives exactly its event. They are\n * derived from {@link ConversationEvent}, so an event added to the protocol\n * gets its callback here with no other change.\n */\nexport type ChatSessionHandlers = {\n [T in ConversationEventType as `on${Capitalize<Camel<T>>}`]?: (event: ChatSessionEventOf<T>) => void\n}\n\n/**\n * The glyphs the session draws. The kit ships no icon set: pass your own nodes\n * (`{ send: <ArrowUp /> }`); anything left out falls back to a text glyph.\n */\nexport interface ChatSessionIcons {\n send: React.ReactNode\n stop: React.ReactNode\n attach: React.ReactNode\n close: React.ReactNode\n retry: React.ReactNode\n copy: React.ReactNode\n steps: React.ReactNode\n rateUp: React.ReactNode\n rateDown: React.ReactNode\n}\n\n/**\n * The actions on a settled answer, beside its time. `retry` is sent as\n * `retry`, `copy` as `copy` (and written to the clipboard), `steps` as\n * `toggle-steps`, `rate` as `rate`.\n */\nexport type ChatSessionBuiltInAction = \"retry\" | \"copy\" | \"steps\" | \"rate\"\n\n/** An action of your own on a settled answer, sent as an `action` event with its `id`. */\nexport interface ChatSessionCustomAction {\n id: string\n /** Its accessible name and tooltip. */\n label: string\n icon: React.ReactNode\n /** Only on answers in these states. Every settled state when left out. */\n states?: AnswerState[]\n}\n\nexport type ChatSessionAnswerAction = ChatSessionBuiltInAction | ChatSessionCustomAction\n\nexport const DEFAULT_ANSWER_ACTIONS: ChatSessionAnswerAction[] = [\"retry\", \"copy\", \"steps\", \"rate\"]\n\n/** What the CLI variant shows: the thread, or every step of every reply. */\nexport type ChatSessionView = \"chat\" | \"tasks\"\n\nexport interface ChatSessionProps extends ChatSessionHandlers {\n /**\n * The whole conversation, as JSON — what the API sends. Controlled: apply\n * patches to it (`applyPatch`, `useChatSession`) and pass the result, or\n * hand the patches over as `stream`.\n */\n spec: ConversationSpec\n /** @default \"web\" */\n variant?: ChatSessionVariant\n /**\n * Every event, whatever its type, after its own callback — the one place to\n * forward everything to an API.\n */\n onEvent?: (event: ConversationEvent) => void\n /**\n * Patches to apply as they arrive — a streaming fetch (`fromNdjson`), an\n * EventSource (`fromEventSource`), a generator, or a recorded script\n * (`playScript`). The session draws `spec` with them applied; a new `spec`\n * starts over from it. Stopping ends the stream and records how far it got.\n *\n * Pass a function, `(signal) => source`, to open the source afresh each time\n * the session mounts — a generator can be read only once. Keep it stable\n * (module scope, `useCallback`): a new one starts a new stream.\n */\n stream?: PatchSource | ((signal: AbortSignal) => PatchSource) | null\n /** The stream ended; `spec` is the conversation as it left it. */\n onStreamEnd?: (spec: ConversationSpec) => void\n /** A patch did not apply, or the source failed. The stream stops there. */\n onStreamError?: (error: unknown) => void\n /** Renderers and traits of your own asks and blocks, merged over the built-ins. */\n registry?: RegistryOverrides\n icons?: Partial<ChatSessionIcons>\n /**\n * The actions beside a settled answer's time, in order — the built-ins by\n * name, yours as `{ id, label, icon }`. `[]` shows none.\n * @default [\"retry\", \"copy\", \"steps\", \"rate\"]\n */\n actions?: ChatSessionAnswerAction[]\n /**\n * The clock, in ms. Left out, the session ticks while anything runs so\n * elapsed times move; a story passes a fixed one to read the same every run.\n */\n now?: number\n /** Shows a close control in the header. */\n onClose?: () => void\n /**\n * The header. `true` draws the session's own — title, turn count, close;\n * `false` draws none; any node is drawn in its place, so a host composes\n * its own header from whatever it needs. @default true when the spec has a title\n */\n header?: boolean | React.ReactNode\n /** Shown when the spec has no turns yet. */\n emptyState?: React.ReactNode\n /** The CLI's view, controlled. */\n view?: ChatSessionView\n /** @default \"chat\" */\n defaultView?: ChatSessionView\n onViewChange?: (view: ChatSessionView) => void\n className?: string\n}\n\n/** What a parent can do to a session it holds a ref to. */\nexport interface ChatSessionHandle {\n /** Scroll a turn into view. */\n scrollToTurn: (turnId: string) => void\n /** Open or fold an answer's steps. */\n showSteps: (turnId: string, open?: boolean) => void\n /** Open one step's record — what went in and came out. */\n openStep: (turnId: string, stepId: string) => void\n setView: (view: ChatSessionView) => void\n /** Focus the composer. */\n focusComposer: () => void\n}\n","import * as React from \"react\"\nimport { cn } from \"@invana/ui\"\n\nexport interface TurnLabelProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Who is speaking — the analyst's name, or `Assistant`. */\n children: React.ReactNode\n /** `end` over the analyst's prompt, which sits at the right; `start` over an ask. */\n align?: \"start\" | \"end\"\n}\n\n/**\n * Who is speaking, over the turn they spoke — `RESEARCHER`, `ASSISTANT`.\n *\n * Drawn over the analyst's prompts and the assistant's asks, the two kinds of\n * turn that address someone. An answer is a card with its own header and needs\n * no label. Mono, small and spaced, so it reads as a tag on the turn rather than\n * a heading of the thread.\n */\nexport const TurnLabel = React.forwardRef<HTMLDivElement, TurnLabelProps>(\n ({ align = \"start\", className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"font-mono text-xs tracking-wider text-muted-foreground uppercase\",\n align === \"end\" && \"text-right\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n ),\n)\nTurnLabel.displayName = \"TurnLabel\"\n","import * as React from \"react\"\nimport { cn } from \"@invana/ui\"\n\nimport { EmissionBody, EmissionCard } from \"../../answers\"\nimport { TurnLabel } from \"../../conversations/turn-label\"\nimport { ChatSessionFrame, ChatSessionMessage, ChatSessionStatusBar } from \"../../conversations/thread\"\nimport type { AnswerTurn } from \"../../protocol/types\"\nimport { AskView } from \"../base/ask\"\nimport { BlockView, citationOf, OutcomeView, splitBlocks } from \"../base/blocks\"\nimport { AnswerLine, KeyHints, SessionHeader } from \"../base/chrome\"\nimport { ComposerBar } from \"../base/composer\"\nimport { useChatSessionContext } from \"../base/context\"\nimport { clockTime, dayLabel, formatDuration, sameDay } from \"../base/format\"\nimport { answerTime, exchangesOf, type Exchange, isAnswer, runOutcome, turnDomId } from \"../base/model\"\nimport { StepList } from \"../base/steps\"\n\nconst RUN_WORDS = { done: \"Answered in\", failed: \"Failed after\", stopped: \"Stopped after\" } as const\n\n/** Under a settled answer: when, and how long it took — the time opens the run. */\nfunction RunLine({ turn }: { turn: AnswerTurn }) {\n const ctx = useChatSessionContext()\n const outcome = runOutcome(turn)\n const time = answerTime(turn, ctx.now)\n const at = clockTime(turn.at)\n const words = RUN_WORDS[outcome === \"failed\" || outcome === \"stopped\" ? outcome : \"done\"]\n const open = ctx.stepsOpen(turn.id, false)\n return (\n <div className=\"flex min-w-0 items-center gap-1.5 text-sm text-muted-foreground\">\n {at ? <span className=\"tabular-nums\">{at}</span> : null}\n {at && time !== undefined ? <span aria-hidden>·</span> : null}\n {time !== undefined ? (\n <button\n type=\"button\"\n aria-haspopup={ctx.opensRuns ? \"dialog\" : undefined}\n aria-expanded={ctx.opensRuns ? undefined : open}\n className=\"underline decoration-dotted underline-offset-2 hover:text-foreground\"\n onClick={() =>\n ctx.opensRuns ? ctx.emit({ type: \"open-run\", turn: turn.id }) : ctx.setSteps(turn.id, !open)\n }\n >\n {words} {formatDuration(time, { spaced: true })}\n </button>\n ) : null}\n </div>\n )\n}\n\n/**\n * An answer as the chat draws it: the live steps while it runs; the evidence\n * in one card, with its envelope; blocks that are cards of their own under it;\n * what the run produced; then when it was answered and in how long.\n */\nexport function WebAnswer({ turn, chrome = true }: { turn: AnswerTurn; chrome?: boolean }) {\n const ctx = useChatSessionContext()\n const outcome = runOutcome(turn)\n const live = outcome === \"live\" || outcome === \"waiting\"\n const { inCard, own, hasEvidence } = splitBlocks(turn, ctx.registry)\n const block = (b: (typeof inCard)[number], i: number) => (\n <BlockView key={`${b.kind}-${i}`} block={b} turn={turn} registry={ctx.registry} onEvent={ctx.emit} />\n )\n const steps = !!turn.trace?.length && (live || ctx.stepsOpen(turn.id, outcome === \"failed\"))\n\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n {live && !turn.trace?.length && !hasEvidence ? (\n <ChatSessionMessage role=\"assistant\" status=\"running\">\n Working\n </ChatSessionMessage>\n ) : null}\n {steps ? (\n <EmissionCard kind={live ? (outcome === \"waiting\" ? \"waiting\" : \"running\") : \"steps\"}>\n <EmissionBody>\n <StepList turn={turn} />\n </EmissionBody>\n </EmissionCard>\n ) : null}\n {hasEvidence ? (\n <EmissionCard\n kind={turn.label ?? turn.pattern ?? \"answer\"}\n title={turn.title}\n citation={\n citationOf(turn) ??\n turn.aside ??\n (live && !inCard.some((b) => b.status === \"loading\") ? \"writing…\" : undefined)\n }\n note={turn.state === \"partial\" ? turn.state : undefined}\n >\n <EmissionBody>{inCard.map(block)}</EmissionBody>\n </EmissionCard>\n ) : null}\n {own.map(block)}\n {!hasEvidence && !own.length && (outcome === \"failed\" || outcome === \"stopped\") ? (\n <ChatSessionMessage role=\"assistant\" status={outcome === \"failed\" ? \"error\" : \"stopped\"}>\n {outcome === \"failed\" ? \"The run failed.\" : \"Stopped by you.\"}\n </ChatSessionMessage>\n ) : null}\n {turn.outcome && !live ? (\n <OutcomeView outcome={turn.outcome} turn={turn} onEvent={ctx.emit} tone={outcome === \"failed\" ? \"bad\" : undefined} />\n ) : null}\n {chrome && !live ? (\n <AnswerLine turn={turn}>\n <RunLine turn={turn} />\n </AnswerLine>\n ) : null}\n </div>\n )\n}\n\nfunction WebExchange({ exchange, dayBreak }: { exchange: Exchange; dayBreak?: string }) {\n const ctx = useChatSessionContext()\n const you = ctx.spec.analyst ?? \"You\"\n const assistant = ctx.spec.assistant ?? \"Assistant\"\n const prompt = exchange.prompt\n const sentAt = clockTime(prompt?.at)\n return (\n <>\n {dayBreak ? (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\" role=\"separator\">\n <span className=\"h-px flex-1 bg-border\" />\n <span>{dayBreak}</span>\n <span className=\"h-px flex-1 bg-border\" />\n </div>\n ) : null}\n {prompt ? (\n <div id={turnDomId(ctx.spec, prompt.id)} className=\"flex scroll-mt-3 flex-col gap-1\">\n <TurnLabel align=\"end\">{you}</TurnLabel>\n <ChatSessionMessage role=\"user\">{prompt.text}</ChatSessionMessage>\n {sentAt ? <span className=\"self-end text-sm text-muted-foreground tabular-nums\">{sentAt}</span> : null}\n </div>\n ) : null}\n {exchange.replies.length ? (\n <div className=\"flex min-w-0 flex-col gap-2\">\n <TurnLabel>{assistant}</TurnLabel>\n {exchange.replies.map((reply) => (\n <div key={reply.id} id={turnDomId(ctx.spec, reply.id)} className=\"min-w-0 scroll-mt-3\">\n {isAnswer(reply) ? (\n <WebAnswer turn={reply} />\n ) : (\n <AskView turn={reply} registry={ctx.registry} onEvent={ctx.emit} now={ctx.now} />\n )}\n </div>\n ))}\n </div>\n ) : null}\n </>\n )\n}\n\n/**\n * The day line over each exchange that starts a new day — the first one too,\n * so the thread opens with when it is from. Exchanges with no time take none.\n */\nfunction dayBreaks(exchanges: Exchange[], now: number): (string | undefined)[] {\n let last: string | undefined\n return exchanges.map((exchange) => {\n const at = exchange.prompt?.at\n if (!at) return undefined\n const label = last === undefined || !sameDay(last, at) ? dayLabel(at, now) : undefined\n last = at\n return label\n })\n}\n\nexport interface WebSessionProps {\n running: boolean\n onStop: () => void\n /** `true` draws the session's own header; a node is drawn in its place. */\n header: React.ReactNode\n onClose?: () => void\n emptyState?: React.ReactNode\n className?: string\n}\n\n/**\n * The chat: who is speaking over each turn, the prompt as a bubble with its\n * time, the assistant's asks and answer cards under it, a day line where the\n * day changes, and the composer.\n */\nexport function WebSession({ running, onStop, header, onClose, emptyState, className }: WebSessionProps) {\n const ctx = useChatSessionContext()\n const exchanges = exchangesOf(ctx.spec)\n const breaks = dayBreaks(exchanges, ctx.now)\n return (\n <div className={cn(\"flex h-full min-h-0 flex-col bg-background\", className)}>\n {header === true ? <SessionHeader onClose={onClose} /> : header || null}\n <ChatSessionFrame\n className=\"min-h-0 flex-1\"\n autoScrollKey={ctx.spec.turns.length}\n emptyState={emptyState}\n bodyClassName=\"mx-auto w-full max-w-[52rem] gap-5\"\n footer={\n <div className=\"mx-auto w-full max-w-[52rem]\">\n <ComposerBar isRunning={running} onStop={onStop} />\n <ChatSessionStatusBar\n className=\"pt-0\"\n start={ctx.spec.assistant ? <span className=\"truncate\">{ctx.spec.assistant}</span> : undefined}\n end={ctx.spec.composer?.hints === false ? undefined : <KeyHints running={running} />}\n />\n </div>\n }\n >\n {exchanges.map((exchange, i) => (\n <WebExchange key={exchange.id} exchange={exchange} dayBreak={breaks[i]} />\n ))}\n </ChatSessionFrame>\n </div>\n )\n}\n","import * as React from \"react\"\nimport { useStreamedSpec } from \"@invana/blocks\"\n\nimport { resolveRegistry } from \"../conversations/registry\"\nimport type { ConversationEvent } from \"../protocol/events\"\nimport { applyPatches } from \"../protocol/reduce\"\nimport { stopPatches } from \"../protocol/stream\"\nimport { useStopKey } from \"./base/chrome\"\nimport {\n ChatSessionContext,\n type ChatSessionContextValue,\n DEFAULT_ICONS,\n useClock,\n useViewState,\n} from \"./base/context\"\nimport { isAnswer, runOutcome, turnDomId } from \"./base/model\"\nimport { CliSession } from \"./cli/cli-session\"\nimport { type ChatSessionHandle, type ChatSessionProps, type ChatSessionView, DEFAULT_ANSWER_ACTIONS } from \"./types\"\nimport { WebSession } from \"./web/web-session\"\n\n/** `open-run` → `onOpenRun`: the callback prop an event goes to. */\nconst handlerName = (type: string) =>\n `on${type.replace(/(^|-)([a-z])/g, (_, __, c: string) => c.toUpperCase())}`\n\n/**\n * A conversation with the assistant, drawn from JSON alone, in one of two\n * variants: `cli`, the console, or `web`, the chat.\n *\n * The API sends a {@link ConversationSpec}, then patches — pass the patched\n * spec, or the patches themselves as `stream`. Every ask and block is drawn by\n * the block registry, so templates of your own draw exactly like the\n * built-ins; the session itself knows no block. Everything the analyst does\n * comes back as a typed event: to its own callback (`onReply`, `onAction`,\n * `onOpenRun`, …) and then to `onEvent`.\n */\nexport const ChatSession = React.forwardRef<ChatSessionHandle, ChatSessionProps>(function ChatSession(\n props,\n ref,\n) {\n const {\n spec,\n variant = \"web\",\n stream,\n onStreamEnd,\n onStreamError,\n registry,\n icons,\n now: fixedNow,\n onClose,\n header,\n emptyState,\n view: controlledView,\n defaultView = \"chat\",\n actions = DEFAULT_ANSWER_ACTIONS,\n className,\n } = props\n\n // Read as every shell reads its stream; stopping records how far it got.\n const { live, stop: stopStream } = useStreamedSpec(spec, stream, applyPatches, {\n onEnd: onStreamEnd,\n onError: onStreamError,\n stopPatches,\n })\n // A run held on the analyst's answer is not in flight: the composer takes\n // their words, and there is nothing to stop.\n const running = live.turns.some((t) => isAnswer(t) && runOutcome(t) === \"live\")\n const now = useClock(fixedNow, running)\n const resolved = React.useMemo(() => resolveRegistry(registry), [registry])\n const resolvedIcons = React.useMemo(() => ({ ...DEFAULT_ICONS, ...icons }), [icons])\n const viewState = useViewState()\n const [uncontrolledView, setUncontrolledView] = React.useState<ChatSessionView>(defaultView)\n const view = controlledView ?? uncontrolledView\n const root = React.useRef<HTMLDivElement>(null)\n const composer = React.useRef<HTMLDivElement | null>(null)\n const setComposer = React.useCallback((element: HTMLDivElement | null) => {\n composer.current = element\n }, [])\n\n // The latest props and spec, so `emit` and the rest stay one function for the session's life.\n const latest = React.useRef(props)\n const liveRef = React.useRef(live)\n React.useLayoutEffect(() => {\n latest.current = props\n liveRef.current = live\n })\n const emit = React.useCallback((event: ConversationEvent) => {\n const handler = (latest.current as unknown as Record<string, unknown>)[handlerName(event.type)]\n if (typeof handler === \"function\") handler(event)\n latest.current.onEvent?.(event)\n }, [])\n\n const stop = React.useCallback(() => {\n stopStream()\n emit({ type: \"stop\" })\n }, [stopStream, emit])\n useStopKey(running, stop)\n\n const setView = React.useCallback(\n (next: ChatSessionView) => {\n if (latest.current.view === undefined) setUncontrolledView(next)\n latest.current.onViewChange?.(next)\n },\n [],\n )\n\n const scrollToTurn = React.useCallback((turnId: string) => {\n // After the frame's own follow-the-bottom, which a step list opening would trigger.\n setTimeout(() => {\n const id = turnDomId(liveRef.current, turnId)\n root.current\n ?.querySelector(`[id=\"${CSS.escape(id)}\"]`)\n ?.scrollIntoView({ block: \"start\", behavior: \"smooth\" })\n }, 80)\n }, [])\n const focusComposer = React.useCallback(() => {\n composer.current?.querySelector(\"textarea\")?.focus()\n }, [])\n\n React.useImperativeHandle(\n ref,\n () => ({\n scrollToTurn,\n showSteps: (turnId, open = true) => viewState.toggleSteps(turnId, open),\n openStep: (turnId, stepId) => {\n viewState.toggleSteps(turnId, true)\n viewState.toggleRecord(turnId, stepId, true)\n scrollToTurn(turnId)\n },\n setView,\n focusComposer,\n }),\n [scrollToTurn, setView, focusComposer, viewState],\n )\n\n const context: ChatSessionContextValue = {\n spec: live,\n registry: resolved,\n emit,\n icons: resolvedIcons,\n now,\n opensRuns: typeof props.onOpenRun === \"function\",\n stepsOpen: viewState.stepsOpen,\n toggleSteps: viewState.toggleSteps,\n setSteps: (turnId, open) => {\n viewState.toggleSteps(turnId, open)\n emit({ type: \"toggle-steps\", turn: turnId, open })\n },\n actions,\n recordOpen: viewState.recordOpen,\n toggleRecord: viewState.toggleRecord,\n rating: viewState.rating,\n rate: viewState.setRating,\n view,\n setView,\n scrollToTurn,\n focusComposer,\n setComposer,\n }\n\n const shared = {\n running,\n onStop: stop,\n header: header === undefined ? !!live.title : header,\n onClose,\n emptyState,\n className,\n }\n return (\n <ChatSessionContext.Provider value={context}>\n <div ref={root} data-variant={variant} className=\"contents\">\n {variant === \"cli\" ? <CliSession {...shared} /> : <WebSession {...shared} />}\n </div>\n </ChatSessionContext.Provider>\n )\n})\n","import * as React from \"react\"\n\nimport { applyPatches, type ConversationPatch } from \"../protocol/reduce\"\nimport {\n isRunning,\n type PatchScript,\n type PatchSource,\n patchesOf,\n playScript,\n stopPatches,\n} from \"../protocol/stream\"\nimport type { ConversationSpec } from \"../protocol/types\"\n\nexport interface UseChatSession {\n /** The conversation as it stands — pass it to `<ChatSession spec>`. */\n spec: ConversationSpec\n /** Apply a patch, or several in order. */\n apply: (patch: ConversationPatch | ConversationPatch[]) => void\n /**\n * Apply a stream of patches as they arrive — `fromNdjson(await fetch(…))`,\n * `fromEventSource(…)`, a generator. Resolves with the spec where it ended.\n * A stream started while another runs runs beside it; `stop()` ends both.\n */\n stream: (source: PatchSource) => Promise<ConversationSpec>\n /** Replay a recorded script, on its own timing. */\n play: (script: PatchScript, options?: { speed?: number }) => Promise<ConversationSpec>\n /** End every stream, and mark what was running as stopped where it stood. */\n stop: () => void\n /** Start over from a spec, ending every stream. */\n reset: (spec: ConversationSpec) => void\n /** Whether a stream is still arriving. */\n streaming: boolean\n /** Whether anything in the spec is still running. */\n running: boolean\n}\n\n/**\n * A conversation's state for a host that drives it: the spec, and the ways\n * patches reach it. The session draws; this holds.\n *\n * ```tsx\n * const chat = useChatSession(initial)\n * <ChatSession spec={chat.spec} onPrompt={(e) => chat.stream(fromNdjson(await ask(e.text)))} onStop={chat.stop} />\n * ```\n */\nexport function useChatSession(initial: ConversationSpec | (() => ConversationSpec)): UseChatSession {\n const [spec, setSpec] = React.useState(initial)\n const current = React.useRef(spec)\n const controllers = React.useRef(new Set<AbortController>())\n const [streams, setStreams] = React.useState(0)\n\n const set = React.useCallback((next: ConversationSpec) => {\n current.current = next\n setSpec(next)\n }, [])\n\n const apply = React.useCallback(\n (patch: ConversationPatch | ConversationPatch[]) =>\n set(applyPatches(current.current, Array.isArray(patch) ? patch : [patch])),\n [set],\n )\n\n const run = React.useCallback(\n async (open: (signal: AbortSignal) => PatchSource) => {\n const controller = new AbortController()\n controllers.current.add(controller)\n setStreams((n) => n + 1)\n try {\n for await (const batch of patchesOf(open(controller.signal))) {\n if (controller.signal.aborted) break\n set(applyPatches(current.current, batch))\n }\n } finally {\n controllers.current.delete(controller)\n setStreams((n) => n - 1)\n }\n return current.current\n },\n [set],\n )\n\n const stream = React.useCallback((source: PatchSource) => run(() => source), [run])\n const play = React.useCallback(\n (script: PatchScript, options?: { speed?: number }) =>\n run((signal) => playScript(script, { ...options, signal })),\n [run],\n )\n\n const abortAll = () => {\n for (const c of controllers.current) c.abort()\n controllers.current.clear()\n }\n\n const stop = React.useCallback(() => {\n abortAll()\n set(applyPatches(current.current, stopPatches(current.current)))\n }, [set])\n\n const reset = React.useCallback(\n (next: ConversationSpec) => {\n abortAll()\n set(next)\n },\n [set],\n )\n\n // Streams end with the component that started them.\n React.useEffect(() => () => abortAll(), [])\n\n return { spec, apply, stream, play, stop, reset, streaming: streams > 0, running: isRunning(spec) }\n}\n","import * as React from \"react\"\n\nimport { type RegistryOverrides, resolveRegistry } from \"../../conversations/registry\"\nimport { ChatSessionMessage } from \"../../conversations/thread\"\nimport type { ConversationEvent } from \"../../protocol/events\"\nimport type { Turn } from \"../../protocol/types\"\nimport { AskView } from \"../base/ask\"\nimport { ChatSessionContext, type ChatSessionContextValue, DEFAULT_ICONS, useViewState } from \"../base/context\"\nimport { WebAnswer } from \"./web-session\"\n\nexport interface ChatSessionTurnProps {\n turn: Turn\n onEvent?: (event: ConversationEvent) => void\n registry?: RegistryOverrides\n /** The clock an answered ask's time is read against, in ms. Defaults to the time of render. */\n now?: number\n}\n\n/**\n * One turn on its own, as the web variant draws it — the analyst's prompt,\n * an ask in its frame, or an answer's cards — without the thread around it.\n * For a block's board, where each cell is one turn.\n */\nexport function ChatSessionTurn({ turn, onEvent, registry, now }: ChatSessionTurnProps) {\n const resolved = React.useMemo(() => resolveRegistry(registry), [registry])\n const view = useViewState()\n const [clock] = React.useState(() => now ?? Date.now())\n const emit = React.useCallback((event: ConversationEvent) => onEvent?.(event), [onEvent])\n const context: ChatSessionContextValue = {\n spec: { id: `turn-${turn.id}`, turns: [turn] },\n registry: resolved,\n emit,\n icons: DEFAULT_ICONS,\n now: now ?? clock,\n opensRuns: false,\n stepsOpen: view.stepsOpen,\n toggleSteps: view.toggleSteps,\n setSteps: (turnId, open) => {\n view.toggleSteps(turnId, open)\n emit({ type: \"toggle-steps\", turn: turnId, open })\n },\n actions: [],\n recordOpen: view.recordOpen,\n toggleRecord: view.toggleRecord,\n rating: view.rating,\n rate: view.setRating,\n view: \"chat\",\n setView: () => {},\n scrollToTurn: () => {},\n focusComposer: () => {},\n setComposer: () => {},\n }\n return (\n <ChatSessionContext.Provider value={context}>\n {turn.role === \"analyst\" ? (\n <ChatSessionMessage role=\"user\">{turn.text}</ChatSessionMessage>\n ) : turn.kind === \"ask\" ? (\n <AskView turn={turn} registry={resolved} onEvent={emit} now={context.now} />\n ) : (\n <WebAnswer turn={turn} chrome={false} />\n )}\n </ChatSessionContext.Provider>\n )\n}\n","/**\n * Everything the analyst can do, as data. The component never acts on a\n * conversation itself: it reports an event, and the API answers with patches.\n *\n * Every event but `prompt`, `stop` and `setting` names the turn it came from.\n */\nexport type ConversationEvent =\n /**\n * A prompt. `settings` is what the composer's controls held — `{ mode: \"nl\",\n * model: \"qwen\" }`; `files` what was attached, as the browser gave them.\n */\n | { type: \"prompt\"; text: string; context?: string[]; settings?: Record<string, string>; files?: File[] }\n /** An ask was answered. `value` has the type its block fixes. */\n | { type: \"reply\"; turn: string; value: unknown }\n /** An ask was skipped; its default is used and recorded. */\n | { type: \"skip\"; turn: string }\n /** An answered ask was changed. Re-runs from that turn, not from scratch. */\n | { type: \"change\"; turn: string; value: unknown }\n /**\n * An action the answer's spec declares — `approve`, `create-drafts` — or one a\n * block names with what it carries: `select` with a table row's key,\n * `download` with a file's digest.\n */\n | { type: \"action\"; turn: string; action: string; value?: unknown }\n /** One part of an answer's scope line was edited. */\n | { type: \"scope\"; turn: string; part: number; value: unknown }\n /**\n * Open a block's records in full — the rows a table previews. `block` is its\n * index in the turn's `blocks`.\n */\n | { type: \"open\"; turn: string; block: number }\n /** Render the same records as another block. */\n | { type: \"template\"; turn: string; kind: string }\n /** Change the current answer in place — `by-region`. */\n | { type: \"refine\"; turn: string; refine: string }\n | { type: \"rate\"; turn: string; value: number }\n | { type: \"stop\" }\n | { type: \"retry\"; turn: string }\n /** Open the whole run behind an answer — its elapsed time was clicked. `step` when one step was. */\n | { type: \"open-run\"; turn: string; step?: string }\n /** A composer control changed — the mode, the model, the timeout. */\n | { type: \"setting\"; id: string; value: string }\n /** An answer's words were copied, as `text`. */\n | { type: \"copy\"; turn: string; text: string }\n /** An answer's steps were opened or folded. */\n | { type: \"toggle-steps\"; turn: string; open: boolean }\n\nexport type ConversationEventType = ConversationEvent[\"type\"]\n\n/** The event types, in the grammar's order. `grammar.test.ts` checks the union against it. */\nexport const EVENT_TYPES = [\n \"prompt\",\n \"reply\",\n \"skip\",\n \"change\",\n \"action\",\n \"scope\",\n \"open\",\n \"template\",\n \"refine\",\n \"rate\",\n \"stop\",\n \"retry\",\n \"open-run\",\n \"setting\",\n \"copy\",\n \"toggle-steps\",\n] as const satisfies readonly ConversationEventType[]\n","import { ANSWER_KINDS, ASK_KINDS, FLOWS, PATTERNS, STAGES } from \"../grammar\"\nimport type { AnswerTurn, ConversationSpec } from \"./types\"\n\n/**\n * What the compiler cannot see: a spec that arrived off the wire.\n *\n * `error` means the spec breaks the contract — an unknown block, a turn with\n * no id, an envelope field sent as a free block. `warning` means the spec is\n * valid but an answer does not match its pattern, which is how a change\n * explanation without a bridge gets noticed in fixtures and in development.\n */\nexport interface ValidationIssue {\n level: \"error\" | \"warning\"\n /** The turn the issue is on, when there is one. */\n turn?: string\n message: string\n}\n\nexport interface ValidateOptions {\n /** Kinds a consumer registered beyond the grammar's. */\n extraAsks?: string[]\n extraBlocks?: string[]\n}\n\nconst ASK_IDS = new Set<string>(ASK_KINDS)\nconst BLOCK_IDS = new Set<string>(ANSWER_KINDS)\nconst STAGE_IDS = new Set<string>(STAGES.map((s) => s.id))\nconst FLOW_IDS = new Set<string>(FLOWS.map((f) => f.id))\nconst PATTERN_BY = new Map<string, readonly string[]>(PATTERNS.map((p) => [p.id, p.blocks]))\n\nconst ASK_STATES = new Set([\"pending\", \"answered\", \"skipped\", \"superseded\", \"expired\"])\nconst ANSWER_STATES = new Set([\"running\", \"partial\", \"complete\", \"cannot\", \"error\", \"stopped\"])\nconst STEP_STATES = new Set([\"done\", \"running\", \"pending\", \"failed\", \"waiting\", \"retrying\", \"stopped\"])\n\nconst notIso = (value: unknown) => value !== undefined && (typeof value !== \"string\" || Number.isNaN(Date.parse(value)))\n\n/**\n * Blocks a pattern names that the answer carries elsewhere: the envelope, or\n * the answer's own `trace`. Sent as blocks they are an error.\n */\nconst CARRIED: Record<string, (a: AnswerTurn) => boolean> = {\n scope: (a) => !!a.envelope?.scope?.length,\n method: (a) => !!a.envelope?.method,\n caveat: (a) => !!a.envelope?.caveats?.length,\n trace: (a) => !!a.trace?.length,\n}\n\n/** Blocks any answer may add to its pattern: the words and the sources. */\nconst ANYWHERE = new Set([\"narrative\", \"citations\"])\n\nfunction checkPattern(turn: AnswerTurn, issues: ValidationIssue[]) {\n if (!turn.pattern) return\n const expected = PATTERN_BY.get(turn.pattern)\n if (!expected) return\n const present = new Set<string>(turn.blocks.map((b) => b.kind))\n for (const kind of expected) {\n const carried = CARRIED[kind]\n const has = carried ? carried(turn) : present.has(kind)\n if (!has) {\n issues.push({\n level: \"warning\",\n turn: turn.id,\n message: `Pattern \"${turn.pattern}\" expects \"${kind}\", which this answer does not have.`,\n })\n }\n }\n for (const kind of present) {\n if (!expected.includes(kind) && !ANYWHERE.has(kind)) {\n issues.push({\n level: \"warning\",\n turn: turn.id,\n message: `Block \"${kind}\" is not part of pattern \"${turn.pattern}\".`,\n })\n }\n }\n}\n\nexport function validate(spec: ConversationSpec, options: ValidateOptions = {}): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n const error = (message: string, turn?: string) => issues.push({ level: \"error\", turn, message })\n const asks = new Set([...ASK_IDS, ...(options.extraAsks ?? [])])\n const blocks = new Set([...BLOCK_IDS, ...(options.extraBlocks ?? [])])\n\n if (typeof spec?.id !== \"string\" || !spec.id) error(\"The conversation has no id.\")\n if (spec?.analyst !== undefined && (typeof spec.analyst !== \"string\" || !spec.analyst)) {\n error(\"The analyst's name is not a non-empty string.\")\n }\n const controls = spec?.composer?.controls ?? []\n const controlIds = new Set<string>()\n for (const control of controls) {\n if (!control?.id) error(\"A composer control has no id.\")\n else if (controlIds.has(control.id)) error(`Composer control id \"${control.id}\" is used twice.`)\n else controlIds.add(control.id)\n if (!control?.options?.length) error(`Composer control \"${control?.id}\" has no options.`)\n else if (control.default !== undefined && !control.options.some((o) => o.value === control.default)) {\n error(`Composer control \"${control.id}\" defaults to \"${control.default}\", which is not one of its options.`)\n }\n }\n if (!Array.isArray(spec?.turns)) {\n error(\"The conversation has no turns array.\")\n return issues\n }\n\n const seen = new Set<string>()\n for (const turn of spec.turns) {\n const id = typeof turn?.id === \"string\" ? turn.id : undefined\n if (!id) {\n error(\"A turn has no id.\")\n continue\n }\n if (seen.has(id)) error(`Turn id \"${id}\" is used twice.`, id)\n seen.add(id)\n\n if (turn.role === \"analyst\") {\n if (typeof turn.text !== \"string\" || !turn.text) error(\"An analyst turn has no text.\", id)\n if (notIso(turn.at)) error(`at \"${turn.at}\" is not an ISO time.`, id)\n continue\n }\n if (turn.role !== \"assistant\") {\n error(`Unknown role \"${(turn as { role?: string }).role}\".`, id)\n continue\n }\n\n if (turn.kind === \"ask\") {\n if (!STAGE_IDS.has(turn.stage)) error(`Unknown stage \"${turn.stage}\".`, id)\n if (!ASK_STATES.has(turn.state)) error(`Unknown ask state \"${turn.state}\".`, id)\n if (!asks.has(turn.ask?.kind)) error(`Unknown ask block \"${turn.ask?.kind}\".`, id)\n if (turn.answeredAt !== undefined && Number.isNaN(Date.parse(turn.answeredAt))) {\n error(`answeredAt \"${turn.answeredAt}\" is not an ISO time.`, id)\n }\n if (turn.ask?.kind === \"multistep\") {\n for (const step of turn.ask.steps ?? []) {\n if (!asks.has(step.kind)) error(`Unknown ask block \"${step.kind}\" in step \"${step.id}\".`, id)\n }\n }\n continue\n }\n\n if (turn.kind === \"answer\") {\n if (!ANSWER_STATES.has(turn.state)) error(`Unknown answer state \"${turn.state}\".`, id)\n if (turn.flow && !FLOW_IDS.has(turn.flow)) error(`Unknown flow \"${turn.flow}\".`, id)\n if (turn.pattern && !PATTERN_BY.has(turn.pattern)) error(`Unknown pattern \"${turn.pattern}\".`, id)\n if (notIso(turn.at)) error(`at \"${turn.at}\" is not an ISO time.`, id)\n if (notIso(turn.startedAt)) error(`startedAt \"${turn.startedAt}\" is not an ISO time.`, id)\n const stepIds = new Set<string>()\n for (const step of turn.trace ?? []) {\n if (!STEP_STATES.has(step?.state)) error(`Unknown step state \"${step?.state}\" on \"${step?.label}\".`, id)\n if (notIso(step?.startedAt)) error(`Step \"${step.label}\" startedAt \"${step.startedAt}\" is not an ISO time.`, id)\n if (step?.id) {\n if (stepIds.has(step.id)) error(`Step id \"${step.id}\" is used twice.`, id)\n stepIds.add(step.id)\n }\n }\n for (const action of turn.outcome?.actions ?? []) {\n if (!action?.id || !action.label) error(\"An outcome action has no id or label.\", id)\n }\n if (!Array.isArray(turn.blocks)) {\n error(\"An answer has no blocks array.\", id)\n continue\n }\n for (const block of turn.blocks) {\n if (!blocks.has(block?.kind)) error(`Unknown block \"${block?.kind}\".`, id)\n else if (block.kind in CARRIED) {\n error(`\"${block.kind}\" is part of the answer, not a block: send it in the ${block.kind === \"trace\" ? `answer's \"trace\"` : \"envelope\"}.`, id)\n }\n if (block?.status !== undefined && block.status !== \"loading\" && block.status !== \"empty\") {\n error(`Unknown block status \"${block.status as string}\".`, id)\n }\n if (block?.status === \"empty\" && !block.emptyText) {\n error(`An empty \"${block.kind}\" block does not say what is missing in emptyText.`, id)\n }\n }\n checkPattern(turn, issues)\n continue\n }\n\n error(`Unknown assistant turn kind \"${(turn as { kind?: string }).kind}\".`, id)\n }\n return issues\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/answers/page.ts","../src/answers/index.ts","../src/conversations/thread.ts","../src/answers/blocks/cite-focus.ts","../src/answers/shared.tsx","../src/conversations/registry.ts","../src/protocol/reduce.ts","../src/protocol/stream.ts","../src/styles/base/context.tsx","../src/styles/base/format.ts","../src/styles/base/model.ts","../src/styles/base/chrome.tsx","../src/asks/index.ts","../src/conversations/relative-time.ts","../src/grammar/stages.ts","../src/grammar/patterns.ts","../src/grammar/asks.ts","../src/grammar/answers.ts","../src/grammar/flows.ts","../src/styles/base/ask.tsx","../src/conversations/block-status.tsx","../src/styles/base/blocks.tsx","../src/styles/base/composer.tsx","../src/styles/base/steps.tsx","../src/styles/cli/cli-session.tsx","../src/styles/types.ts","../src/conversations/turn-label.tsx","../src/styles/web/web-session.tsx","../src/styles/chat-session.tsx","../src/styles/use-chat-session.ts","../src/styles/web/turn.tsx","../src/protocol/events.ts","../src/protocol/validate.ts"],"names":["UiEmissionCard","UiEmissionBody","UiEmissionHeader","UiCitationMarker","UiTemplatePicker","UiChatSession","UiChatSessionMessage","UiChatSessionMessageOptions","UiChatSessionComposer","UiChatSessionActivityRow","UiChatSessionActivitySubLine","uiChatSessionGutterClass","UiChatSessionPromptRow","UiChatSessionProgressLine","UiChatSessionCaret","UiChatSessionDisclosure","UiChatSessionDisclosureCode","UiChatSessionDisclosureSteps","UiChatSessionTaskRow","UiChatSessionTaskGroup","UiChatSessionStatusBar","UiChatSessionContextChip","React","BLOCK_RENDERERS","patchesOfAny","fromNdjsonOf","fromEventSourceOf","playScriptOf","offsetScriptOf","started","React2","jsx","React3","UiClarifyCard","UiClarifyFootnote","UiClarifyActions","jsxs","SuggestionChips","cn","Placeholder","isRunning","React4","Fragment","React5","ChatSession","React7","set","React8","ASK_KINDS","ANSWER_KINDS"],"mappings":";;;;;;;;AASO,SAAS,aAAa,IAAA,EAA4B;AAGvD,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,MAAA;AAAA,IACzB,CAAC,CAAA,KACC,eAAA,CAAgB,CAAA,CAAE,IAAoC,CAAA,IAAK,IAAA,IAC3D,CAAA,CAAE,MAAA,KAAW,SAAA,IACb,CAAA,CAAE,MAAA,KAAW;AAAA,GACjB;AACA,EAAA,OAAO,EAAE,OAAO,IAAA,CAAK,KAAA,EAAO,UAAU,CAAC,EAAE,MAAA,EAAQ,CAAA,EAAE;AACrD;;;ACLO,IAAM,YAAA,GAAeA;AAErB,IAAM,YAAA,GAAeC;AAErB,IAAM,cAAA,GAAiBC;AAEvB,IAAM,cAAA,GAAiBC;AAEvB,IAAM,cAAA,GAAiBC;ACWvB,IAAM,gBAAA,GAAmBC;AAEzB,IAAM,kBAAA,GAAqBC;AAE3B,IAAM,yBAAA,GAA4BC;AAElC,IAAM,mBAAA,GAAsBC;AAE5B,IAAM,sBAAA,GAAyBC;AAE/B,IAAM,0BAAA,GAA6BC;AAEnC,IAAM,sBAAA,GAAyBC;AAE/B,IAAM,oBAAA,GAAuBC;AAE7B,IAAM,uBAAA,GAA0BC;AAEhC,IAAM,gBAAA,GAAmBC;AAEzB,IAAM,qBAAA,GAAwBC;AAE9B,IAAM,yBAAA,GAA4BC;AAElC,IAAM,0BAAA,GAA6BC;AAEnC,IAAM,kBAAA,GAAqBC;AAE3B,IAAM,oBAAA,GAAuBC;AAE7B,IAAM,oBAAA,GAAuBC;AAE7B,IAAM,sBAAA,GAAyBC;AC1DtC,IAAM,KAAA,uBAAY,GAAA,EAAgC;AAClD,IAAM,SAAA,uBAAgB,GAAA,EAAgB;AAEtC,SAAS,GAAA,CAAI,MAAc,CAAA,EAAuB;AAChD,EAAA,IAAI,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,KAAM,CAAA,EAAG;AAC3B,EAAA,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AACjB,EAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA;AAC9B;AAEA,SAAS,UAAU,QAAA,EAAsB;AACvC,EAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,EAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AACxC;AAGO,SAAS,YAAA,CAAa,MAAc,OAAA,EAAyE;AAClH,EAAA,MAAM,OAAA,GAAgBC,MAAA,CAAA,oBAAA;AAAA,IACpB,SAAA;AAAA,IACA,MAAM,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAAA,IACpB,MAAM;AAAA,GACR;AACA,EAAA,OAAO,CAAC,WAAW,OAAA,EAAS,CAAC,MAAM,GAAA,CAAI,IAAA,EAAM,CAAC,CAAC,CAAA;AACjD;ACCA,SAAS,OAAA,CAAQ,IAAA,EAAc,MAAA,EAAgB,KAAA,EAAgB,KAAA,EAA8C;AAC3G,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,IACtC,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM;AAAA,IACvC,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAAA,IAC9B,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IAC/C,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,IAAA,GAAO,KAAA;AACb,MAAA,OAAO,OAAO,IAAA,EAAM,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,OAAM,GAAI,MAAA;AAAA,IACxG;AAAA,IACA,KAAK,MAAA;AAEH,MAAA,OAAO,SAAS,CAAA,GAAI,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,OAAM,GAAI,MAAA;AAAA,IACtD,KAAK,QAAA;AAEH,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,MAAA,EAAQ,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IACvD;AAEE,MAAA,OAAO,KAAA,KAAU,MAAA,GAAY,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAO,GAAI,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAQ,KAAA,EAAM;AAAA;AAE5G;AAGA,SAAS,YAAkC,IAAA,EAA2B;AACpE,EAAA,MAAM,QAAA,GAAWC,gBAAgB,IAAI,CAAA;AACrC,EAAA,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,KAAA,EAAO,SAAQ,EAA0B;AACpE,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,MAAA,CAAqB,OAAA,CAAQ,KAAK,CAAA;AACtD,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAM,KAAA;AAAA,QAEN,QAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,CAAC,MAAA,EAAQ,KAAA,KAAU;AAC3B,UAAA,MAAM,QAAQ,OAAA,CAAQ,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ,OAAO,KAAK,CAAA;AACnD,UAAA,IAAI,KAAA,UAAe,KAAK,CAAA;AAAA,QAC1B;AAAA;AAAA,KACF;AAAA,EAEJ;AACA,EAAA,WAAA,CAAY,WAAA,GAAc,UAAU,IAAI,CAAA,CAAA,CAAA;AACxC,EAAA,OAAO,WAAA;AACT;AAGA,SAAS,SAA4B,IAAA,EAAyB;AAC5D,EAAA,MAAM,QAAA,GAAWA,gBAAgB,IAAI,CAAA;AACrC,EAAA,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,OAAA,EAAS,SAAQ,EAAwB;AACjE,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,OAAA;AAAA,QACN,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,QAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,CAAC,MAAA,EAAQ,KAAA,KAAU;AAC3B,UAAA,MAAM,QAAQ,OAAA,CAAQ,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ,OAAO,EAAE,CAAA;AAChD,UAAA,IAAI,KAAA,UAAe,KAAK,CAAA;AAAA,QAC1B;AAAA;AAAA,KACF;AAAA,EAEJ;AACA,EAAA,QAAA,CAAS,WAAA,GAAc,OAAO,IAAI,CAAA,CAAA,CAAA;AAClC,EAAA,OAAO,QAAA;AACT;AAMA,SAAS,eAAA,CAAgB,EAAE,KAAA,EAAO,IAAA,EAAK,EAAoC;AACzE,EAAA,MAAM,CAAC,QAAQ,SAAS,CAAA,GAAI,aAAa,IAAA,CAAK,EAAA,EAAI,MAAM,MAAM,CAAA;AAC9D,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,KAAU,SAAA,IAAa,IAAA,CAAK,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,KAAM,KAAA;AACpF,EAAA,uBACE,GAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,KAAA;AAAA,MACN,MAAA;AAAA,MACA,cAAA,EAAgB,SAAA;AAAA,MAChB,QAAA,EAAU,OAAA,mBAAU,GAAA,CAAC,gBAAA,EAAA,EAAiB,CAAA,GAAK;AAAA;AAAA,GAC7C;AAEJ;AAGA,SAAS,eAAA,CAAgB,EAAE,KAAA,EAAO,IAAA,EAAK,EAAoC;AACzE,EAAA,MAAM,CAAC,MAAM,CAAA,GAAI,aAAa,IAAA,CAAK,EAAA,EAAI,MAAM,MAAM,CAAA;AACnD,EAAA,uBAAO,GAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,KAAA,EAAO,MAAA,EAAgB,CAAA;AACtD;AAGA,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,IAAA,EAAM,SAAQ,EAAgC;AAC1E,EAAA,MAAM,YAAA,GAAe,CAAE,IAAA,CAAK,MAAA,CAAqB,SAAS,KAAK,CAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,YAAA,IAAgB,IAAA,CAAK,QAAA,EAAU,SAAA,GAAY,CAAC,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,GAAI,MAAA;AACpF,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,KAAA;AAAA,MACN,KAAA;AAAA,MACA,QAAA,EAAU,CAAC,MAAA,EAAQ,KAAA,KAAU;AAC3B,QAAA,MAAM,QAAQ,OAAA,CAAQ,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ,OAAO,EAAE,CAAA;AAChD,QAAA,IAAI,KAAA,UAAe,KAAK,CAAA;AAAA,MAC1B;AAAA;AAAA,GACF;AAEJ;AAGA,IAAM,YAAA,GAAe,YAAY,UAAU,CAAA;AAC3C,SAAS,eAAe,KAAA,EAAuC;AAC7D,EAAA,uBACE,GAAA,CAAC,gBAAa,IAAA,EAAK,UAAA,EAAW,OAAO,KAAA,CAAM,KAAA,CAAM,OAAO,QAAA,EAAU,KAAA,CAAM,MAAM,IAAA,EAAM,EAAA,EAClF,8BAAC,YAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,gBAAc,GAAG,KAAA,EAAO,GAC3B,CAAA,EACF,CAAA;AAEJ;AAEA,IAAM,eAAA,GAAoE;AAAA,EACxE,SAAA,EAAW,eAAA;AAAA,EACX,SAAA,EAAW,eAAA;AAAA,EACX,KAAA,EAAO,WAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAGO,IAAM,mBAAmB,MAAA,CAAO,WAAA;AAAA,EACrC,aAAa,GAAA,CAAI,CAAC,IAAA,KAAS,CAAC,MAAMA,eAAAA,CAAgB,IAAI,CAAA,GAAK,eAAA,CAAgB,IAAI,CAAA,IAAK,WAAA,CAAY,IAAI,CAAA,GAAK,IAAI,CAAC;AAChH,CAAA;AAGO,IAAM,gBAAgB,MAAA,CAAO,WAAA;AAAA,EAClC,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,KAAS,CAAC,IAAA,EAAMA,eAAAA,CAAgB,IAAI,CAAA,GAAI,QAAA,CAAS,IAAI,CAAA,GAAI,IAAI,CAAC;AAC/E,CAAA;;;ACzHO,IAAM,aAAA,GAA6B;AAEnC,IAAM,eAAA,GAAiC;AAwBvC,IAAM,mBAAA,GAA0D;AAAA,EACrE,WAAA,EAAa,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,EAC7B,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,EAC3B,QAAA,EAAU,EAAE,IAAA,EAAM,UAAA;AACpB;AACO,IAAM,qBAAA,GAA8D;AAAA,EACzE,QAAA,EAAU,EAAE,SAAA,EAAW,KAAA;AACzB;AAqBO,SAAS,gBAAgB,KAAA,EAA6C;AAC3E,EAAA,MAAM,YAAY,EAAE,GAAG,mBAAA,EAAqB,GAAG,OAAO,SAAA,EAAU;AAChE,EAAA,MAAM,cAAc,EAAE,GAAG,qBAAA,EAAuB,GAAG,OAAO,WAAA,EAAY;AACtE,EAAA,OAAO;AAAA,IACL,MAAM,EAAE,GAAG,aAAA,EAAe,GAAG,OAAO,IAAA,EAAK;AAAA,IACzC,QAAQ,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAO,MAAA,EAAO;AAAA,IAC/C,SAAA,EAAW,CAAC,IAAA,MAAU,EAAE,OAAO,MAAA,EAAQ,GAAG,SAAA,CAAU,IAAI,CAAA,EAAE,CAAA;AAAA,IAC1D,WAAA,EAAa,CAAC,IAAA,MAAU,EAAE,WAAW,MAAA,EAAQ,GAAG,WAAA,CAAY,IAAI,CAAA,EAAE;AAAA,GACpE;AACF;AC1DO,IAAM,UAAA,GAAN,cAAyB,KAAA,CAAM;AAAC;AAEvC,SAAS,MAAA,CAAO,IAAA,EAAwB,EAAA,EAAY,EAAA,EAA4C;AAC9F,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AACrD,EAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,MAAM,IAAI,UAAA,CAAW,YAAY,EAAE,CAAA,mBAAA,EAAsB,IAAA,CAAK,EAAE,CAAA,EAAA,CAAI,CAAA;AACnF,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAM;AAC/B,EAAA,KAAA,CAAM,KAAK,CAAA,GAAI,EAAA,CAAG,KAAA,CAAM,KAAK,CAAC,CAAA;AAC9B,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,KAAA,EAAM;AAC1B;AAEA,SAAS,QAAA,CAAS,MAAY,EAAA,EAAwB;AACpD,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,WAAA,IAAe,IAAA,CAAK,SAAS,QAAA,EAAU;AACvD,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,CAAA,EAAI,EAAE,CAAA,8BAAA,EAAiC,IAAA,CAAK,EAAE,CAAA,aAAA,CAAe,CAAA;AAAA,EACpF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,MAAA,CAAO,MAAA,EAAoB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAgD;AAC1G,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,EAAC;AAC/B,EAAA,MAAM,KAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC7C,EAAA,IAAI,EAAA,GAAK,CAAA,EAAG,MAAM,IAAI,UAAA,CAAW,CAAA,CAAA,EAAI,EAAE,CAAA,YAAA,EAAe,EAAE,CAAA,WAAA,EAAc,MAAA,CAAO,EAAE,CAAA,EAAA,CAAI,CAAA;AACnF,EAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,MAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAO,MAAM,EAAA,GAAK,EAAA,CAAG,CAAC,CAAA,GAAI,CAAE,CAAA,EAAE;AACzE;AAGA,SAAS,UAAA,CAAW,MAAA,EAAoB,EAAA,EAAY,KAAA,EAA2B,KAAA,EAA+B;AAC5G,EAAA,MAAM,EAAA,GAAK,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAC9B,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,UAAA,CAAW,CAAA,CAAA,EAAI,EAAE,CAAA,SAAA,EAAY,MAAA,CAAO,EAAE,CAAA,eAAA,EAAkB,EAAE,CAAA,CAAA,CAAG,CAAA;AACnF,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,KAAA,EAAM;AACnC,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,EAAE,CAAA,GAAI,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AAAA,EAC3C,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,CAAA,EAAI,EAAE,CAAA,SAAA,EAAY,EAAE,CAAA,UAAA,EAAa,MAAA,CAAO,EAAE,CAAA,GAAA,EAAM,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IACtF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACA,EAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAO;AAC7B;AAEO,SAAS,UAAA,CAAW,MAAwB,KAAA,EAA4C;AAC7F,EAAA,QAAQ,MAAM,EAAA;AAAI,IAChB,KAAK,UAAA;AACH,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,EAAG;AAClD,QAAA,MAAM,IAAI,UAAA,CAAW,CAAA,MAAA,EAAS,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,iBAAA,CAAmB,CAAA;AAAA,MAChE;AACA,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,IAAI,CAAA,EAAE;AAAA,IACvD,KAAK,WAAA;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAC,IAAA,KAAS;AACxC,QAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa,MAAM,IAAI,UAAA,CAAW,CAAA,MAAA,EAAS,IAAA,CAAK,EAAE,CAAA,eAAA,CAAiB,CAAA;AACrF,QAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,UAAA,OAAO;AAAA,YACL,GAAG,IAAA;AAAA,YACH,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,GAAI,MAAM,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI;AAAC,WAC5D;AAAA,QACF;AACA,QAAA,OAAO,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,MAAM,KAAA,EAAqB;AAAA,MACtD,CAAC,CAAA;AAAA,IACH,KAAK,WAAA;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAC,IAAA,KAAS;AACxC,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,KAAA,CAAM,EAAE,CAAA;AACtC,QAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,CAAC,GAAG,MAAA,CAAO,MAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,MAC9D,CAAC,CAAA;AAAA,IACH,KAAK,aAAA;AACH,MAAA,OAAO,OAAO,IAAA,EAAM,KAAA,CAAM,MAAM,CAAC,IAAA,KAAS,WAAW,QAAA,CAAS,IAAA,EAAM,KAAA,CAAM,EAAE,GAAG,KAAA,CAAM,EAAA,EAAI,MAAM,KAAA,EAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACpH,KAAK,cAAA;AACH,MAAA,OAAO,MAAA;AAAA,QAAO,IAAA;AAAA,QAAM,KAAA,CAAM,IAAA;AAAA,QAAM,CAAC,IAAA,KAC/B,UAAA,CAAW,SAAS,IAAA,EAAM,KAAA,CAAM,EAAE,CAAA,EAAG,KAAA,CAAM,EAAA,EAAI,KAAA,CAAM,OAAO,EAAE,EAAA,EAAI,OAAO,MAAA,EAAQ,KAAA,CAAM,QAAQ;AAAA,OACjG;AAAA,IACF,KAAK,aAAA;AACH,MAAA,OAAO,MAAA;AAAA,QAAO,IAAA;AAAA,QAAM,KAAA,CAAM,IAAA;AAAA,QAAM,CAAC,IAAA,KAC/B,UAAA,CAAW,QAAA,CAAS,IAAA,EAAM,MAAM,EAAE,CAAA,EAAG,KAAA,CAAM,EAAA,EAAI,KAAA,CAAM,KAAA,EAAO,EAAE,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,CAAC,KAAA,CAAM,KAAA,IAAS,MAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM;AAAA,OAC7H;AAAA,IACF,KAAK,gBAAA;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAC,IAAA,KAAS;AACxC,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,KAAA,CAAM,EAAE,CAAA;AACtC,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,EAAC;AAE/B,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,IAAA,CAAK,EAAA,GAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,GAAI,EAAA;AAC5E,QAAA,MAAM,OAAO,EAAA,IAAM,CAAA,GAAI,MAAM,GAAA,CAAI,CAAC,GAAG,CAAA,KAAO,CAAA,KAAM,EAAA,GAAK,KAAA,CAAM,OAAO,CAAE,CAAA,GAAI,CAAC,GAAG,KAAA,EAAO,MAAM,IAAI,CAAA;AAC/F,QAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAK;AAAA,MAClC,CAAC,CAAA;AAAA,IACH,KAAK,mBAAA;AACH,MAAA,OAAO,MAAA;AAAA,QAAO,IAAA;AAAA,QAAM,KAAA,CAAM,IAAA;AAAA,QAAM,CAAC,SAC/B,MAAA,CAAO,QAAA,CAAS,MAAM,KAAA,CAAM,EAAE,CAAA,EAAG,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,IAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,GAAG,MAAM,MAAA,EAAQ,EAAA,EAAI,CAAA,CAAE,EAAA,EAAG,CAAE;AAAA,OACrG;AAAA,IACF,KAAK,iBAAA;AACH,MAAA,OAAO,MAAA;AAAA,QAAO,IAAA;AAAA,QAAM,KAAA,CAAM,IAAA;AAAA,QAAM,CAAC,IAAA,KAC/B,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,KAAA,CAAM,EAAE,CAAA,EAAG,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,EAAA,EAAI,CAAC,CAAA,MAAO;AAAA,UAC7D,GAAG,CAAA;AAAA,UACH,QAAA,EAAA,CAAW,CAAA,CAAE,QAAA,IAAY,EAAA,IAAM,KAAA,CAAM;AAAA,SACvC,CAAE;AAAA,OACJ;AAAA,IACF,KAAK,aAAA;AACH,MAAA,OAAO,MAAA,CAAO,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,CAAM,MAAA,EAAQ,EAAA,EAAI,IAAA,CAAK,IAAG,CAAU,CAAA;AAAA,IAC/F,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,MAAA,IAAU,EAAC;AACvC,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,KAAA,CAAM,KAAK,CAAA,EAAG;AAC7D,QAAA,MAAM,IAAI,WAAW,CAAA,yBAAA,EAA4B,KAAA,CAAM,KAAK,CAAA,mBAAA,EAAsB,IAAA,CAAK,EAAE,CAAA,EAAA,CAAI,CAAA;AAAA,MAC/F;AACA,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,MAAA,EAAQ;AAAA,UACN,GAAG,IAAA,CAAK,MAAA;AAAA,UACR,QAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAO,EAAE,EAAA,KAAO,KAAA,CAAM,KAAA,GAAQ,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,KAAA,CAAM,OAAA,KAAY,CAAE;AAAA;AACzF,OACF;AAAA,IACF;AAAA,IACA,KAAK,aAAA;AACH,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,CAAM,MAAA,EAAQ,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAAA;AAExE;AAGO,SAAS,YAAA,CAAa,MAAwB,OAAA,EAAgD;AACnG,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAA,EAAY,IAAI,CAAA;AACxC;ACtIO,IAAM,SAAA,GAAY,CAAC,MAAA,KAAwBC,WAAA,CAAgC,MAAM;AAMjF,IAAM,UAAA,GAAa,CAAC,KAAA,KAAiDC,YAAA,CAAgC,KAAK;AAG1G,IAAM,kBAAkB,CAAC,MAAA,EAAqB,OAAA,KACnDC,iBAAA,CAAqC,QAAQ,OAAO;AAM/C,IAAM,aAAa,CAAC,MAAA,EAAqB,OAAA,KAA0BC,YAAA,CAAa,QAAQ,OAAO;AAG/F,IAAM,eAAe,CAAC,MAAA,EAAqB,EAAA,KAA4BC,cAAA,CAAe,QAAQ,EAAE;AAcvG,SAAS,MAAA,CAAO,MAAc,EAAA,EAA+B;AAC3D,EAAA,IAAI,OAAO,MAAA,EAAQ,OAAO,KAAK,KAAA,CAAM,cAAc,KAAK,EAAC;AAEzD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA,IAAK,EAAC;AACvC;AAMO,SAAS,UAAA,CACd,IAAA,EACA,IAAA,EACA,EAAE,OAAO,CAAA,EAAG,KAAA,GAAQ,EAAA,EAAI,EAAA,GAAK,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAM,GAAuD,EAAC,EAC7F;AACb,EAAA,OAAO,OAAO,IAAA,EAAM,EAAE,EAAE,GAAA,CAAI,CAAC,OAAO,CAAA,MAAO;AAAA,IACzC,EAAA,EAAI,OAAO,CAAA,GAAI,KAAA;AAAA,IACf,KAAA,EAAO;AAAA,MACL,EAAA,EAAI,aAAA;AAAA,MACJ,IAAA;AAAA,MACA,IAAA,EAAM,KAAA;AAAA,MACN,GAAI,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,KAAA,EAAM;AAAA,MACvC,GAAI,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,KAAA;AAAM;AACzC,GACF,CAAE,CAAA;AACJ;AAGO,SAAS,cAAA,CACd,IAAA,EACA,IAAA,EACA,IAAA,EACA,EAAE,IAAA,GAAO,CAAA,EAAG,KAAA,GAAQ,EAAA,EAAI,EAAA,GAAK,MAAA,EAAO,GAAkB,EAAC,EAC1C;AACb,EAAA,OAAO,OAAO,IAAA,EAAM,EAAE,EAAE,GAAA,CAAI,CAAC,OAAO,CAAA,MAAO;AAAA,IACzC,EAAA,EAAI,OAAO,CAAA,GAAI,KAAA;AAAA,IACf,OAAO,EAAE,EAAA,EAAI,mBAAmB,IAAA,EAAM,IAAA,EAAM,MAAM,KAAA;AAAM,GAC1D,CAAE,CAAA;AACJ;AAIA,IAAM,4BAAY,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,UAAU,CAAC,CAAA;AAM1C,IAAM,MAAA,GAAS,CAAC,IAAA,KAAqB,IAAA,CAAK,KAAA,KAAU;AAGpD,SAAS,UAAU,IAAA,EAAiC;AACzD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,WAAA,IAAe,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,CAAC,CAAC,CAAA;AAC1F;AAOO,SAAS,WAAA,CAAY,IAAA,EAAwB,GAAA,GAAc,IAAA,CAAK,KAAI,EAAwB;AACjG,EAAA,MAAM,UAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,IAAA,IAAI,IAAA,CAAK,SAAS,WAAA,IAAe,IAAA,CAAK,SAAS,QAAA,IAAY,CAAC,MAAA,CAAO,IAAI,CAAA,EAAG;AAC1E,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG;AACnC,MAAA,IAAI,CAAC,KAAK,EAAA,IAAM,CAAC,UAAU,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,EAAG;AAC5C,MAAA,MAAMC,WAAU,IAAA,CAAK,SAAA,GAAY,KAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,GAAI,GAAA;AAC9D,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,EAAA,EAAI,mBAAA;AAAA,QACJ,MAAM,IAAA,CAAK,EAAA;AAAA,QACX,MAAM,IAAA,CAAK,EAAA;AAAA,QACX,MAAA,EAAQ;AAAA,UACN,KAAA,EAAO,SAAA;AAAA,UACP,QAAA,EAAU,MAAA;AAAA,UACV,GAAI,MAAA,CAAO,KAAA,CAAMA,QAAO,CAAA,GAAI,EAAC,GAAI,EAAE,QAAA,EAAU,GAAA,GAAMA,QAAAA;AAAQ;AAC7D,OACD,CAAA;AAAA,IACH;AACA,IAAA,MAAM,UAAU,IAAA,CAAK,SAAA,GAAY,KAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,GAAI,GAAA;AAC9D,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,EAAA,EAAI,aAAA;AAAA,MACJ,MAAM,IAAA,CAAK,EAAA;AAAA,MACX,MAAA,EAAQ;AAAA,QACN,EAAA,EAAI,IAAI,IAAA,CAAK,GAAG,EAAE,WAAA,EAAY;AAAA,QAC9B,GAAI,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,GAAI,EAAC,GAAI,EAAE,QAAA,EAAU,GAAA,GAAM,OAAA;AAAQ;AAC7D,KACD,CAAA;AACD,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAA,EAAI,WAAA,EAAa,MAAM,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,OAAA;AACT;ACpHO,IAAM,kBAAA,GAA2BC,qBAA8C,IAAI,CAAA;AAEnF,SAAS,qBAAA,GAAiD;AAC/D,EAAA,MAAM,KAAA,GAAcA,kBAAW,kBAAkB,CAAA;AACjD,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,wDAAwD,CAAA;AACpF,EAAA,OAAO,KAAA;AACT;AAEO,IAAM,aAAA,GAAkC;AAAA,EAC7C,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,GAAA;AAAA,EACR,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAMO,SAAS,YAAA,GAAe;AAC7B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,MAAA,CAAA,QAAA,CAAkC,EAAE,CAAA;AACpE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,MAAA,CAAA,QAAA,CAAkC,EAAE,CAAA;AACxE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,MAAA,CAAA,QAAA,CAAiC,EAAE,CAAA;AAEvE,EAAA,MAAM,SAAA,GAAkBA,MAAA,CAAA,WAAA,CAAY,CAAC,MAAA,EAAgB,IAAA,KAAkB,KAAA,CAAM,MAAM,CAAA,IAAK,IAAA,EAAM,CAAC,KAAK,CAAC,CAAA;AACrG,EAAA,MAAM,WAAA,GAAoBA,MAAA,CAAA,WAAA;AAAA,IACxB,CAAC,MAAA,EAAgB,IAAA,KACf,SAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,CAAC,MAAM,GAAG,IAAA,IAAQ,EAAE,KAAK,MAAM,CAAA,IAAK,QAAO,CAAE,CAAA;AAAA,IAC9E;AAAC,GACH;AACA,EAAA,MAAM,UAAA,GAAmBA,MAAA,CAAA,WAAA;AAAA,IACvB,CAAC,MAAA,EAAgB,MAAA,KAAmB,CAAC,CAAC,QAAQ,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IACnE,CAAC,OAAO;AAAA,GACV;AACA,EAAA,MAAM,YAAA,GAAqBA,MAAA,CAAA,WAAA,CAAY,CAAC,MAAA,EAAgB,QAAgB,IAAA,KAAmB;AACzF,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC/B,IAAA,UAAA,CAAW,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,CAAC,GAAG,GAAG,IAAA,IAAQ,CAAC,IAAA,CAAK,GAAG,GAAE,CAAE,CAAA;AAAA,EAC/D,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,MAAA,GAAeA,mBAAY,CAAC,MAAA,KAAmB,QAAQ,MAAM,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAC/E,EAAA,MAAM,SAAA,GAAkBA,MAAA,CAAA,WAAA;AAAA,IACtB,CAAC,MAAA,EAAgB,KAAA,KAAkB,UAAA,CAAW,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,CAAC,MAAM,GAAG,OAAM,CAAE,CAAA;AAAA,IACtF;AAAC,GACH;AACA,EAAA,OAAO,EAAE,SAAA,EAAW,WAAA,EAAa,UAAA,EAAY,YAAA,EAAc,QAAQ,SAAA,EAAU;AAC/E;AAGO,SAAS,QAAA,CAAS,KAAA,EAA2B,IAAA,EAAe,KAAA,GAAQ,GAAA,EAAa;AACtF,EAAA,MAAM,CAAC,KAAK,MAAM,CAAA,GAAUA,gBAAS,MAAM,KAAA,IAAS,IAAA,CAAK,GAAA,EAAK,CAAA;AAC9D,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,CAAC,IAAA,EAAM;AAClC,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM,MAAA,CAAO,KAAK,GAAA,EAAK,GAAG,KAAK,CAAA;AACzD,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,KAAA,EAAO,IAAA,EAAM,KAAK,CAAC,CAAA;AACvB,EAAA,OAAO,KAAA,IAAS,GAAA;AAClB;;;AC/FO,SAAS,eAAe,EAAA,EAAY,EAAE,SAAS,KAAA,EAAM,GAA0B,EAAC,EAAW;AAChG,EAAA,MAAM,GAAA,GAAM,SAAS,GAAA,GAAM,EAAA;AAC3B,EAAA,IAAI,CAAC,OAAO,QAAA,CAAS,EAAE,KAAK,EAAA,GAAK,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,EAAA,CAAA;AAClD,EAAA,IAAI,EAAA,GAAK,KAAM,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,EAAE,CAAC,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AAC7C,EAAA,IAAI,EAAA,GAAK,GAAA,EAAQ,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,KAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG,GAAG,CAAA,CAAA,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,EAAa,OAAA,EAAiB,KAAA,EAAe,cACzD,KAAA,GAAQ,CAAA,EAAG,GAAG,CAAA,EAAG,GAAG,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,EAAG,GAAG,CAAA,EAAG,SAAS,CAAA,CAAA,GAAK,CAAA,EAAG,GAAG,CAAA,EAAG,GAAG,CAAA,EAAG,OAAO,CAAA,CAAA;AACtF,EAAA,IAAI,KAAK,IAAA,EAAW,OAAO,IAAA,CAAK,IAAA,CAAK,MAAM,EAAA,GAAK,GAAM,CAAA,EAAG,GAAA,EAAK,KAAK,KAAA,CAAO,EAAA,GAAK,GAAA,GAAU,GAAI,GAAG,GAAG,CAAA;AACnG,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,IAAS,CAAA,EAAG,GAAA,EAAK,IAAA,CAAK,KAAA,CAAO,EAAA,GAAK,IAAA,GAAa,GAAM,GAAG,GAAG,CAAA;AACzF;AAGO,SAAS,YAAA,CAAa,KAAyB,GAAA,EAAiC;AACrF,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,OAAO,MAAA,CAAO,MAAM,IAAI,CAAA,GAAI,SAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,IAAI,CAAA;AAChE;AAGO,SAAS,UAAU,GAAA,EAA6C;AACrE,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA;AACzB,EAAA,IAAI,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,GAAG,OAAO,MAAA;AACzC,EAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,KAAA,EAAO,CAAA;AAC/F;AAEA,IAAM,MAAA,GAAS,CAAC,CAAA,KAAY,CAAA,EAAG,EAAE,WAAA,EAAa,CAAA,CAAA,EAAI,CAAA,CAAE,QAAA,EAAU,CAAA,CAAA,EAAI,CAAA,CAAE,SAAS,CAAA,CAAA;AAGtE,SAAS,OAAA,CAAQ,GAAuB,CAAA,EAAgC;AAC7E,EAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AACrB,EAAA,OAAO,MAAA,CAAO,IAAI,IAAA,CAAK,CAAC,CAAC,MAAM,MAAA,CAAO,IAAI,IAAA,CAAK,CAAC,CAAC,CAAA;AACnD;AAGO,SAAS,QAAA,CAAS,KAAa,GAAA,EAAqB;AACzD,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA;AACzB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,EAAE,OAAA,EAAS,OAAA,EAAS,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,CAAA;AACrG,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,GAAG,CAAA;AAC1B,EAAA,IAAI,MAAA,CAAO,IAAI,CAAA,KAAM,MAAA,CAAO,KAAK,CAAA,EAAG,OAAO,cAAW,OAAO,CAAA,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,GAAA,GAAM,KAAU,CAAA;AAC3C,EAAA,IAAI,MAAA,CAAO,IAAI,CAAA,KAAM,MAAA,CAAO,SAAS,CAAA,EAAG,OAAO,kBAAe,OAAO,CAAA,CAAA;AACrE,EAAA,OAAO,OAAA;AACT;;;ACrBO,SAAS,YAAY,IAAA,EAAoC;AAC9D,EAAA,MAAM,MAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,IAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,QAAQ,IAAA,EAAM,OAAA,EAAS,EAAC,EAAG,CAAA;AACnD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,IAAA,IAAI,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,SAC3B,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,CAAK,IAAI,OAAA,EAAS,CAAC,IAAI,CAAA,EAAG,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,GAAA;AACT;AAEO,IAAM,WAAW,CAAC,IAAA,KAAmC,KAAK,IAAA,KAAS,WAAA,IAAe,KAAK,IAAA,KAAS,QAAA;AAChG,IAAM,QAAQ,CAAC,IAAA,KAAgC,KAAK,IAAA,KAAS,WAAA,IAAe,KAAK,IAAA,KAAS,KAAA;AAEjG,IAAM,yBAAS,IAAI,GAAA,CAAwB,CAAC,SAAA,EAAW,UAAA,EAAY,SAAS,CAAC,CAAA;AAGtE,SAAS,YAAY,MAAA,EAA2C;AACrE,EAAA,OAAO,MAAA,CAAO,OAAO,IAAA,CAAK,CAAC,MAAM,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AACtD;AAGO,SAAS,QAAA,CAAS,MAAiB,GAAA,EAAiC;AACzE,EAAA,IAAI,IAAA,CAAK,KAAA,KAAU,SAAA,IAAa,IAAA,CAAK,KAAA,KAAU,YAAY,OAAO,YAAA,CAAa,IAAA,CAAK,SAAA,EAAW,GAAG,CAAA;AAClG,EAAA,OAAO,IAAA,CAAK,QAAA;AACd;AAMO,SAAS,UAAA,CAAW,QAAoB,GAAA,EAAiC;AAC9E,EAAA,IAAI,OAAO,MAAM,CAAA,SAAU,YAAA,CAAa,MAAA,CAAO,WAAW,GAAG,CAAA;AAC7D,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW,OAAO,MAAA,CAAO,QAAA;AACjD,EAAA,IAAI,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,EAAA,EAAI;AACjC,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAChE,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,IAAI,GAAG,OAAO,IAAA;AAAA,EAClC;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,EAAC;AAC/B,EAAA,OAAO,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,MAAS,CAAA,GAC7C,KAAA,CAAM,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,IAAO,EAAE,QAAA,IAAY,CAAA,CAAA,EAAI,CAAC,CAAA,GACnD,MAAA;AACN;AAKO,SAAS,WAAW,MAAA,EAAgC;AACzD,EAAA,IAAI,MAAA,CAAO,KAAA,KAAU,OAAA,EAAS,OAAO,QAAA;AACrC,EAAA,IAAI,MAAA,CAAO,KAAA,KAAU,SAAA,EAAW,OAAO,SAAA;AACvC,EAAA,IAAI,MAAA,CAAO,MAAM,CAAA,EAAG,OAAO,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,SAAS,IAAI,SAAA,GAAY,MAAA;AAC1F,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,UAAU,MAAA,EAAqD;AAC7E,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,EAAC;AAC/B,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,MAAM,CAAA,CAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,MAAA,EAAO;AACrF;AAUO,SAAS,aAAA,CACd,QAAA,EACA,MAAA,GAAuB,MAAM,IAAA,EACM;AACnC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,MAAW,KAAA,IAAS,SAAS,OAAA,EAAS;AACpC,IAAA,IAAI,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,CAAM,UAAU,SAAA,IAAa,MAAA,CAAO,KAAK,CAAA,EAAG,OAAA,GAAU,IAAA;AAC1E,IAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AACnB,MAAA,MAAM,OAAA,GAAU,WAAW,KAAK,CAAA;AAChC,MAAA,IAAI,OAAA,KAAY,QAAQ,OAAO,SAAA;AAC/B,MAAA,IAAI,OAAA,KAAY,WAAW,OAAA,GAAU,IAAA;AAAA,IACvC;AAAA,EACF;AACA,EAAA,OAAO,UAAU,SAAA,GAAY,SAAA;AAC/B;AAGO,SAAS,YAAA,CAAa,MAAwB,MAAA,EAAuB;AAC1E,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,QAAA,IAAY,WAAA,CAAY,IAAI,CAAA,EAAG;AACxC,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,QAAA,EAAU,MAAM,CAAA;AAC5C,IAAA,IAAI,UAAU,SAAA,EAAW,OAAA,EAAA;AACzB,IAAA,IAAI,UAAU,SAAA,EAAW,OAAA,EAAA;AACzB,IAAA,KAAA,MAAW,KAAA,IAAS,QAAA,CAAS,OAAA,EAAS,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG,KAAA,IAAS,KAAA,CAAM,KAAA,EAAO,MAAA,IAAU,CAAA;AAAA,EAC7F;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,KAAA,EAAM;AACnC;AAOO,SAAS,UAAU,MAAA,EAA4B;AACpD,EAAA,OAAO,MAAA,CAAO,MAAA,CACX,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAyB,IAAI,CAAA,CACzC,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAChE,IAAA,CAAK,MAAM,CAAA,CACX,OAAA,CAAQ,gBAAA,EAAkB,IAAI,CAAA,CAC9B,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAC7B;AAGO,IAAM,SAAA,GAAY,CAAC,IAAA,EAAwB,MAAA,KAAmB,QAAQ,IAAA,CAAK,EAAE,IAAI,MAAM,CAAA,CAAA;ACtIvF,SAAS,aAAA,CAAc,EAAE,OAAA,EAAS,SAAA,EAAU,EAAiD;AAClG,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,CAAE,MAAA;AACnE,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,uEAAA,EAAyE,SAAS,CAAA,EACnG,QAAA,EAAA;AAAA,oBAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,GAAA,CAAI,KAAK,KAAA,EAAM,CAAA;AAAA,IAC9D,OAAA,mBACC,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA8C,QAAA,EAAA;AAAA,MAAA,OAAA;AAAA,MACzD,OAAA;AAAA,MAAQ,GAAA;AAAA,MAAE,OAAA,KAAY,IAAI,UAAA,GAAa;AAAA,KAAA,EAC5C,CAAA,GACE,IAAA;AAAA,IACH,0BACCA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,OAAA;AAAA,QACT,YAAA,EAAW,mBAAA;AAAA,QACX,KAAA,EAAM,OAAA;AAAA,QACN,SAAA,EAAU,kJAAA;AAAA,QAET,cAAI,KAAA,CAAM;AAAA;AAAA,KACb,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAEA,IAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,SAAS,CAAC,CAAA;AASjD,SAAS,aAAA,CAAc,EAAE,IAAA,EAAK,EAAyB;AAC5D,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,CAAS,CAAC,CAAA,IAAK,UAAA,CAAW,CAAC,MAAM,MAAM,CAAA;AAClF,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAE,KAAK,IAAA,CAAK,MAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,UAAU,IAAI,CAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAkB;AAC9B,IAAA,MAAM,IAAA,GAAO,MAAA,KAAW,KAAA,GAAQ,CAAA,GAAI,KAAA;AACpC,IAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AACtB,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,EACvD,CAAA;AACA,EAAA,MAAM,KAAA,GAA4E;AAAA,IAChF,OAAO,MAAM;AAAA,MACX;AAAA,QACE,IAAA,EAAM,IAAI,KAAA,CAAM,KAAA;AAAA,QAChB,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV,OAAA,EAAS,MAAM,GAAA,CAAI,IAAA,CAAK,EAAE,MAAM,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI;AAAA;AAC1D,KACF;AAAA,IACA,IAAA,EAAM,MACJ,IAAA,GACI;AAAA,MACE;AAAA,QACE,IAAA,EAAM,IAAI,KAAA,CAAM,IAAA;AAAA,QAChB,KAAA,EAAO,MAAA;AAAA,QACP,SAAS,MAAM;AACb,UAAA,KAAK,SAAA,CAAU,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AACxC,UAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,EAAA,EAAI,MAAM,CAAA;AAAA,QAChD;AAAA;AACF,QAEF,EAAC;AAAA,IACP,OAAO,MAAM;AACX,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,MAAA,SAAe,EAAC;AACjC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,IAAI,KAAK,CAAA;AACzC,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,IAAI,KAAA,CAAM,KAAA,EAAO,OAAO,OAAA,EAAS,MAAA,EAAQ,MAAM,OAAA,EAAS,MAAM,IAAI,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,IAAI,GAAG,CAAA;AAAA,IAC9G,CAAA;AAAA,IACA,MAAM,MACJ,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,GAC3B;AAAA,MACE;AAAA,QACE,IAAA,EAAM,IAAI,KAAA,CAAM,MAAA;AAAA,QAChB,KAAA,EAAO,aAAA;AAAA,QACP,QAAQ,MAAA,KAAW,CAAA;AAAA,QACnB,eAAA,EAAiB,iCAAA;AAAA,QACjB,OAAA,EAAS,MAAM,IAAA,CAAK,CAAC;AAAA,OACvB;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAI,KAAA,CAAM,QAAA;AAAA,QAChB,KAAA,EAAO,mBAAA;AAAA,QACP,QAAQ,MAAA,KAAW,EAAA;AAAA,QACnB,eAAA,EAAiB,yCAAA;AAAA,QACjB,OAAA,EAAS,MAAM,IAAA,CAAK,EAAE;AAAA;AACxB,QAEF;AAAC,GACT;AACA,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,OAAA;AAAA,IAAQ,CAAC,CAAA,KACnC,OAAO,MAAM,QAAA,GACT,KAAA,CAAM,CAAC,CAAA,EAAE,GACT,CAAC,CAAA,CAAE,MAAA,IAAU,EAAE,MAAA,CAAO,QAAA,CAAS,KAAK,KAAK,CAAA,GACvC,CAAC,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,EAAS,MAAM,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,IAAA,CAAK,EAAA,EAAI,QAAQ,CAAA,CAAE,EAAA,EAAI,CAAA,EAAG,IAC3G;AAAC,GACT;AACA,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,IAAA;AAI5B,EAAA,uBACEA,GAAAA;AAAA,IAAC,yBAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC3B,GAAG,CAAA;AAAA,QACH,KAAA,EAAO,KAAA;AAAA,QACP,SAAA,EAAW,EAAA;AAAA,UACT,kDAAA;AAAA,UACA,CAAC,EAAE,MAAA,IAAU;AAAA;AACf,OACF,CAAE;AAAA;AAAA,GACJ;AAEJ;AAGO,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,QAAA,EAAS,EAAqD;AAC/F,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,QAAA,mBAAWA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA2B,UAAS,CAAA,GAAS,IAAA;AAAA,oBACxEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACb,QAAA,kBAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAY,CAAA,EAC7B;AAAA,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,QAAA,CAAS,EAAE,OAAA,EAAQ,EAAyB;AAC1D,EAAA,OAAO,OAAA,mBACLA,GAAAA,CAAA,QAAA,EAAA,EACE,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,QAAA,EAAA,UAAA,EAAQ,CAAA,EAChB,CAAA,mBAEA,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAA,GAAAA,CAAC,UAAK,QAAA,EAAA,aAAA,EAAM,CAAA;AAAA,oBACZA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,sBAAA,EAAU;AAAA,GAAA,EAClB,CAAA;AAEJ;AAGO,SAAS,UAAA,CAAW,SAAkB,IAAA,EAAkB;AAC7D,EAAMC,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAA,CAAE,gBAAA,EAAkB;AAC9C,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAA,EAAK;AAAA,IACP,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,OAAA,EAAS,IAAI,CAAC,CAAA;AACpB;ACzJO,IAAM,WAAA,GAAcC;AAEpB,IAAM,eAAA,GAAkBC;AAExB,IAAM,cAAA,GAAiBC;;;ACXvB,SAAS,YAAA,CAAa,KAAa,GAAA,EAAiC;AACzE,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG,OAAO,MAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAA,CAAO,GAAA,GAAM,QAAQ,GAAM,CAAA;AAChD,EAAA,IAAI,OAAA,GAAU,GAAG,OAAO,UAAA;AACxB,EAAA,IAAI,OAAA,GAAU,EAAA,EAAI,OAAO,CAAA,EAAG,OAAO,CAAA,QAAA,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACrC,EAAA,IAAI,KAAA,GAAQ,EAAA,EAAI,OAAO,CAAA,EAAG,KAAK,CAAA,MAAA,CAAA;AAC/B,EAAA,OAAO,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,CAAA;AACtF;;;ACTO,IAAM,MAAA,GAAS;AAAA,EACpB,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC7B,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC7B,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,YAAA,EAAa;AAAA,EAClC,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA,EACjC,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA,EACjC,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,KAAA,EAAM;AAAA,EACzB,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA;AACzB;;;ACHO,IAAM,QAAA,GAAW;AAAA,EACtB,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,cAAA,EAAgB,MAAA,EAAQ,CAAC,MAAA,EAAQ,YAAA,EAAc,WAAA,EAAa,OAAO,CAAA,EAAE;AAAA,EAC7F,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,oBAAA,EAAsB,MAAA,EAAQ,CAAC,WAAA,EAAa,WAAA,EAAa,QAAA,EAAU,WAAW,CAAA,EAAE;AAAA,EACtG,EAAE,EAAA,EAAI,YAAA,EAAc,IAAA,EAAM,YAAA,EAAc,QAAQ,CAAC,MAAA,EAAQ,OAAA,EAAS,QAAQ,CAAA,EAAE;AAAA,EAC5E,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,eAAe,MAAA,EAAQ,CAAC,QAAA,EAAU,OAAO,CAAA,EAAE;AAAA,EAClE,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,iBAAA,EAAmB,QAAQ,CAAC,OAAA,EAAS,MAAA,EAAQ,WAAW,CAAA,EAAE;AAAA,EACjF,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,iBAAiB,MAAA,EAAQ,CAAC,QAAA,EAAU,WAAW,CAAA,EAAE;AAAA,EACvE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,QAAQ,CAAC,YAAA,EAAc,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA,EAC/E,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,gBAAA,EAAkB,QAAQ,CAAC,YAAA,EAAc,UAAA,EAAY,QAAQ,CAAA,EAAE;AAAA,EACtF,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,gBAAA,EAAkB,QAAQ,CAAC,QAAA,EAAU,WAAA,EAAa,QAAQ,CAAA,EAAE;AAAA,EACnF,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,oBAAA,EAAsB,MAAA,EAAQ,CAAC,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU,UAAU,CAAA,EAAE;AAAA,EAChG,EAAE,EAAA,EAAI,WAAA,EAAa,IAAA,EAAM,gBAAA,EAAkB,QAAQ,CAAC,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAA,EAAE;AAAA,EACjF,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,UAAU,MAAA,EAAQ,CAAC,QAAA,EAAU,OAAO,CAAA,EAAE;AAAA,EAC7D,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,gBAAgB,MAAA,EAAQ,CAAC,WAAA,EAAa,OAAO,CAAA,EAAE;AAAA,EACrE,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,gBAAA,EAAkB,QAAQ,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,EAC9E,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,YAAA,EAAc,QAAQ,CAAC,QAAA,EAAU,UAAA,EAAY,OAAO,CAAA,EAAE;AAAA,EAC1E,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,oBAAoB,MAAA,EAAQ,CAAC,UAAA,EAAY,QAAQ,CAAA,EAAE;AAAA,EACzE,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,QAAQ,CAAC,WAAA,EAAa,WAAA,EAAa,QAAQ,CAAA,EAAE;AAAA,EAClF,EAAE,EAAA,EAAI,WAAA,EAAa,IAAA,EAAM,gBAAA,EAAkB,QAAQ,CAAC,OAAA,EAAS,QAAA,EAAU,UAAU,CAAA,EAAE;AAAA,EACnF,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,oBAAA,EAAsB,QAAQ,CAAC,OAAA,EAAS,UAAA,EAAY,QAAQ,CAAA,EAAE;AAAA,EACtF,EAAE,EAAA,EAAI,WAAA,EAAa,IAAA,EAAM,qBAAA,EAAuB,MAAA,EAAQ,CAAC,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,UAAU,CAAA,EAAE;AAAA,EACpG,EAAE,EAAA,EAAI,cAAA,EAAgB,IAAA,EAAM,mBAAA,EAAqB,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,QAAQ,CAAA,EAAE;AAAA,EAC/F,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,kBAAA,EAAoB,MAAA,EAAQ,CAAC,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA,EAC1F,EAAE,EAAA,EAAI,aAAA,EAAe,IAAA,EAAM,aAAA,EAAe,QAAQ,CAAC,aAAA,EAAe,SAAA,EAAW,QAAQ,CAAA,EAAE;AAAA,EACvF,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,gBAAA,EAAkB,QAAQ,CAAC,SAAA,EAAW,QAAA,EAAU,eAAe,CAAA,EAAE;AAAA,EACpF,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,eAAA,EAAiB,MAAA,EAAQ,CAAC,UAAA,EAAY,WAAA,EAAa,UAAA,EAAY,QAAQ,CAAA,EAAE;AAAA,EAC/F,EAAE,EAAA,EAAI,YAAA,EAAc,IAAA,EAAM,aAAA,EAAe,MAAA,EAAQ,CAAC,WAAA,EAAa,SAAA,EAAW,OAAA,EAAS,SAAS,CAAA;AAC9F;;;AC7BO,IAAM,WAAA,GAAc;AAAA,EACzB,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,0BAA0B,KAAA,EAAO,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,EAChF,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,sBAAsB,KAAA,EAAO,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,EAC5E,EAAE,IAAI,YAAA,EAAc,IAAA,EAAM,wBAAwB,KAAA,EAAO,OAAA,EAAS,MAAM,SAAA,EAAU;AAAA,EAClF,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,iBAAiB,KAAA,EAAO,OAAA,EAAS,MAAM,MAAA,EAAO;AAAA,EACnE,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,eAAe,KAAA,EAAO,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,EACpE,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,mBAAmB,KAAA,EAAO,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,EAC1E,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,sBAAsB,KAAA,EAAO,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,EAC1E,EAAE,IAAI,aAAA,EAAe,IAAA,EAAM,eAAe,KAAA,EAAO,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,EACxE,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,iBAAiB,KAAA,EAAO,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,EACxE,EAAE,IAAI,WAAA,EAAa,IAAA,EAAM,mBAAmB,KAAA,EAAO,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,EAC3E,EAAE,IAAI,WAAA,EAAa,IAAA,EAAM,qBAAqB,KAAA,EAAO,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,EAC7E,EAAE,IAAI,WAAA,EAAa,IAAA,EAAM,uBAAuB,KAAA,EAAO,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,EAC/E,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,4BAA4B,KAAA,EAAO,OAAA,EAAS,MAAM,SAAA,EAAU;AAAA,EAChF,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,mBAAmB,KAAA,EAAO,SAAA,EAAW,MAAM,QAAA,EAAS;AAAA,EAC1E,EAAE,IAAI,aAAA,EAAe,IAAA,EAAM,uBAAuB,KAAA,EAAO,SAAA,EAAW,MAAM,OAAA,EAAQ;AAAA,EAClF,EAAE,IAAI,YAAA,EAAc,IAAA,EAAM,oBAAoB,KAAA,EAAO,SAAA,EAAW,MAAM,OAAA,EAAQ;AAAA,EAC9E,EAAE,IAAI,YAAA,EAAc,IAAA,EAAM,oBAAoB,KAAA,EAAO,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,EAChF,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,mBAAmB,KAAA,EAAO,SAAA,EAAW,MAAM,MAAA,EAAO;AAAA,EAC1E,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,qBAAqB,KAAA,EAAO,SAAA,EAAW,MAAM,OAAA,EAAQ;AAAA,EAC3E,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,mBAAmB,KAAA,EAAO,SAAA,EAAW,MAAM,OAAA,EAAQ;AAAA,EACvE,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,uBAAuB,KAAA,EAAO,SAAA,EAAW,MAAM,aAAA,EAAc;AAAA,EACjF,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,qBAAqB,KAAA,EAAO,KAAA,EAAO,MAAM,UAAA,EAAW;AAAA,EAC3E,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,sBAAsB,KAAA,EAAO,SAAA,EAAW,MAAM,WAAA,EAAY;AAAA,EAClF,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,oBAAoB,KAAA,EAAO,OAAA,EAAS,MAAM,gBAAA,EAAiB;AAAA,EAClF,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,kBAAkB,KAAA,EAAO,OAAA,EAAS,MAAM,MAAA,EAAO;AAAA,EACnE,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,eAAe,KAAA,EAAO,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,EAClE,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,qBAAqB,KAAA,EAAO,SAAA,EAAW,MAAM,WAAA,EAAY;AAAA,EAC9E,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,mBAAmB,KAAA,EAAO,SAAA,EAAW,MAAM,MAAA,EAAO;AAAA,EACtE,EAAE,IAAI,YAAA,EAAc,IAAA,EAAM,wBAAwB,KAAA,EAAO,SAAA,EAAW,MAAM,YAAA;AAC5E;;;AC3BO,IAAM,cAAA,GAAiB;AAAA,EAC5B,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,mBAAmB,KAAA,EAAO,CAAC,WAAW,CAAA,EAAE;AAAA,EAC3D,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,wBAAwB,KAAA,EAAO,CAAC,QAAA,EAAU,MAAM,CAAA,EAAE;AAAA,EACxE,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,oBAAoB,KAAA,EAAO,CAAC,YAAA,EAAc,SAAS,CAAA,EAAE;AAAA,EAC1E,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,qBAAA,EAAuB,KAAA,EAAO,CAAC,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA,EAC9F,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,sBAAA,EAAwB,OAAO,CAAC,QAAA,EAAU,QAAA,EAAU,SAAS,CAAA,EAAE;AAAA,EACnF,EAAE,IAAI,gBAAA,EAAkB,IAAA,EAAM,wBAAwB,KAAA,EAAO,CAAC,WAAA,EAAa,eAAe,CAAA,EAAE;AAAA,EAC5F,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,qBAAA,EAAuB,KAAA,EAAO,CAAC,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA,EAAE;AAAA,EACrG,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,sBAAsB,KAAA,EAAO,CAAC,UAAA,EAAY,WAAW,CAAA,EAAE;AAAA,EAC/E,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,yBAAA,EAA2B,KAAA,EAAO,CAAC,WAAA,EAAa,KAAA,EAAO,WAAA,EAAa,UAAU,CAAA,EAAE;AAAA,EACtG,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,oBAAA,EAAsB,OAAO,CAAC,SAAA,EAAW,aAAA,EAAe,UAAU,CAAA,EAAE;AAAA,EAC1F,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,wBAAA,EAA0B,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,UAAA,EAAY,WAAW,CAAA,EAAE;AAAA,EAC1G,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,mCAAA,EAAqC,KAAA,EAAO,CAAC,QAAA,EAAU,WAAA,EAAa,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA,EAChI,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,gCAAgC,KAAA,EAAO,CAAC,UAAA,EAAY,OAAO,CAAA,EAAE;AAAA,EAChF,EAAE,IAAI,WAAA,EAAa,IAAA,EAAM,8BAA8B,KAAA,EAAO,CAAC,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,EACjF,EAAE,IAAI,cAAA,EAAgB,IAAA,EAAM,0BAA0B,KAAA,EAAO,CAAC,UAAU,CAAA;AAC1E;;;AClBO,IAAM,KAAA,GAAQ;AAAA,EACnB,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,aAAa,QAAA,EAAU,+CAAA,EAAiD,QAAQ,CAAC,OAAA,EAAS,SAAS,SAAA,EAAW,SAAS,GAAG,IAAA,EAAM,CAAC,WAAW,QAAA,EAAU,UAAU,CAAA,EAAG,OAAA,EAAS,UAAA,EAAW;AAAA,EAC1M,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,YAAA,EAAc,UAAU,uCAAA,EAAyC,MAAA,EAAQ,CAAC,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,WAAW,SAAA,EAAW,KAAK,CAAA,EAAG,IAAA,EAAM,CAAC,SAAA,EAAW,UAAU,UAAA,EAAY,OAAO,CAAA,EAAG,OAAA,EAAS,QAAA,EAAS;AAAA,EAC/N,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,0BAA0B,QAAA,EAAU,8CAAA,EAAgD,QAAQ,CAAC,OAAA,EAAS,SAAS,SAAA,EAAW,SAAS,GAAG,IAAA,EAAM,CAAC,YAAY,SAAA,EAAW,YAAY,CAAA,EAAG,OAAA,EAAS,YAAA,EAAa;AAAA,EAChO,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,iBAAiB,QAAA,EAAU,4CAAA,EAA8C,MAAA,EAAQ,CAAC,OAAA,EAAS,OAAA,EAAS,WAAW,SAAA,EAAW,KAAK,GAAG,IAAA,EAAM,CAAC,WAAW,QAAA,EAAU,WAAW,CAAA,EAAG,OAAA,EAAS,SAAA,EAAU;AAAA,EACnN,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,gBAAgB,QAAA,EAAU,gEAAA,EAAkE,QAAQ,CAAC,OAAA,EAAS,SAAS,SAAA,EAAW,SAAS,GAAG,IAAA,EAAM,CAAC,UAAU,QAAA,EAAU,aAAa,CAAA,EAAG,OAAA,EAAS,SAAA,EAAU;AAAA,EACnO,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,sBAAsB,QAAA,EAAU,oCAAA,EAAsC,QAAQ,CAAC,OAAA,EAAS,SAAS,SAAA,EAAW,SAAS,GAAG,IAAA,EAAM,CAAC,cAAc,QAAA,EAAU,aAAa,CAAA,EAAG,OAAA,EAAS,QAAA,EAAS;AAAA,EAC/M,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,oBAAoB,QAAA,EAAU,6BAAA,EAA+B,MAAA,EAAQ,CAAC,OAAA,EAAS,OAAA,EAAS,WAAW,SAAA,EAAW,SAAS,CAAA,EAAG,IAAA,EAAM,CAAC,QAAA,EAAU,eAAe,QAAA,EAAU,aAAa,CAAA,EAAG,OAAA,EAAS,UAAA,EAAW;AAAA,EAChO,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,wBAAwB,QAAA,EAAU,2CAAA,EAA6C,MAAA,EAAQ,CAAC,OAAA,EAAS,SAAA,EAAW,OAAO,SAAS,CAAA,EAAG,MAAM,CAAC,SAAA,EAAW,aAAa,SAAA,EAAW,UAAU,CAAA,EAAG,OAAA,EAAS,SAAA,EAAU;AAAA,EAChO,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,mBAAmB,QAAA,EAAU,uBAAA,EAAyB,QAAQ,CAAC,OAAA,EAAS,WAAW,SAAS,CAAA,EAAG,MAAM,CAAC,SAAA,EAAW,UAAU,aAAa,CAAA,EAAG,SAAS,SAAA,EAAU;AAAA,EACrL,EAAE,IAAI,YAAA,EAAc,IAAA,EAAM,sBAAsB,QAAA,EAAU,oBAAA,EAAsB,MAAA,EAAQ,CAAC,OAAA,EAAS,OAAA,EAAS,WAAW,SAAA,EAAW,KAAK,GAAG,IAAA,EAAM,CAAC,YAAY,YAAA,EAAc,YAAY,CAAA,EAAG,OAAA,EAAS,SAAA,EAAU;AAAA,EAC5M,EAAE,IAAI,UAAA,EAAY,IAAA,EAAM,sBAAsB,QAAA,EAAU,+CAAA,EAAiD,QAAQ,CAAC,OAAA,EAAS,SAAS,SAAA,EAAW,SAAA,EAAW,KAAK,CAAA,EAAG,IAAA,EAAM,CAAC,UAAA,EAAY,aAAa,CAAA,EAAG,OAAA,EAAS,WAAA,EAAY;AAAA,EAC1N,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,oBAAoB,QAAA,EAAU,4CAAA,EAA8C,QAAQ,CAAC,OAAA,EAAS,SAAS,SAAA,EAAW,SAAS,GAAG,IAAA,EAAM,CAAC,cAAc,QAAA,EAAU,QAAQ,CAAA,EAAG,OAAA,EAAS,SAAA,EAAU;AAAA,EACjN,EAAE,IAAI,cAAA,EAAgB,IAAA,EAAM,2BAA2B,QAAA,EAAU,wEAAA,EAA0E,QAAQ,CAAC,OAAA,EAAS,WAAW,SAAS,CAAA,EAAG,MAAM,CAAC,SAAA,EAAW,UAAU,WAAW,CAAA,EAAG,SAAS,QAAA,EAAS;AAAA,EAChP,EAAE,IAAI,OAAA,EAAS,IAAA,EAAM,+BAA+B,QAAA,EAAU,8CAAA,EAAgD,QAAQ,CAAC,OAAA,EAAS,WAAW,SAAA,EAAW,KAAK,GAAG,IAAA,EAAM,CAAC,cAAc,WAAA,EAAa,MAAM,CAAA,EAAG,OAAA,EAAS,SAAA,EAAU;AAAA,EAC5N,EAAE,EAAA,EAAI,QAAA,EAAU,MAAM,qBAAA,EAAuB,QAAA,EAAU,sCAAsC,MAAA,EAAQ,CAAC,SAAS,OAAA,EAAS,SAAS,GAAG,IAAA,EAAM,CAAC,aAAa,UAAU,CAAA,EAAG,SAAS,MAAA,EAAO;AAAA,EACrL,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,4BAA4B,QAAA,EAAU,+BAAA,EAAiC,MAAA,EAAQ,CAAC,OAAA,EAAS,OAAA,EAAS,SAAS,SAAA,EAAW,SAAS,GAAG,IAAA,EAAM,CAAC,YAAY,WAAA,EAAa,MAAM,CAAA,EAAG,OAAA,EAAS,QAAA,EAAS;AAAA,EACpN,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,yBAAyB,QAAA,EAAU,uCAAA,EAAyC,QAAQ,CAAC,OAAA,EAAS,SAAS,SAAA,EAAW,SAAS,GAAG,IAAA,EAAM,CAAC,UAAU,QAAA,EAAU,OAAO,CAAA,EAAG,OAAA,EAAS,MAAA,EAAO;AAAA,EACvM,EAAE,IAAI,WAAA,EAAa,IAAA,EAAM,6BAA6B,QAAA,EAAU,uDAAA,EAAyD,QAAQ,CAAC,SAAA,EAAW,WAAW,KAAK,CAAA,EAAG,MAAM,CAAC,aAAA,EAAe,UAAU,SAAS,CAAA,EAAG,SAAS,WAAA,EAAY;AAAA,EACjO,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,qBAAqB,QAAA,EAAU,qCAAA,EAAuC,QAAQ,CAAC,SAAA,EAAW,OAAO,SAAS,CAAA,EAAG,MAAM,CAAC,QAAA,EAAU,YAAY,SAAS,CAAA,EAAG,SAAS,UAAA,EAAW;AAAA,EAChM,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,sBAAsB,QAAA,EAAU,4DAAA,EAA8D,MAAA,EAAQ,CAAC,OAAA,EAAS,OAAA,EAAS,WAAW,SAAA,EAAW,KAAK,CAAA,EAAG,IAAA,EAAM,CAAC,UAAA,EAAY,cAAc,WAAA,EAAa,aAAa,CAAA,EAAG,OAAA,EAAS,WAAA,EAAY;AAAA,EACjQ,EAAE,IAAI,cAAA,EAAgB,IAAA,EAAM,qBAAqB,QAAA,EAAU,0DAAA,EAA4D,QAAQ,CAAC,OAAA,EAAS,SAAS,SAAA,EAAW,SAAS,GAAG,IAAA,EAAM,CAAC,cAAc,YAAA,EAAc,aAAa,CAAA,EAAG,OAAA,EAAS,cAAA,EAAe;AAAA,EACpP,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,qBAAqB,QAAA,EAAU,yEAAA,EAA2E,QAAQ,CAAC,OAAA,EAAS,SAAS,SAAA,EAAW,SAAS,GAAG,IAAA,EAAM,CAAC,SAAS,MAAA,EAAQ,aAAa,CAAA,EAAG,OAAA,EAAS,SAAA,EAAU;AAAA,EAC9O,EAAE,IAAI,aAAA,EAAe,IAAA,EAAM,6BAA6B,QAAA,EAAU,mDAAA,EAAqD,MAAA,EAAQ,CAAC,OAAA,EAAS,OAAA,EAAS,SAAS,SAAA,EAAW,SAAS,GAAG,IAAA,EAAM,CAAC,WAAW,QAAA,EAAU,OAAO,CAAA,EAAG,OAAA,EAAS,aAAA,EAAc;AAAA,EAC/O,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,mBAAmB,QAAA,EAAU,+DAAA,EAAiE,QAAQ,CAAC,OAAA,EAAS,WAAW,SAAA,EAAW,SAAS,GAAG,IAAA,EAAM,CAAC,UAAU,aAAA,EAAe,OAAO,CAAA,EAAG,OAAA,EAAS,KAAA,EAAM;AAAA,EAC9N,EAAE,IAAI,QAAA,EAAU,IAAA,EAAM,iBAAiB,QAAA,EAAU,wDAAA,EAA0D,QAAQ,CAAC,OAAA,EAAS,SAAS,SAAA,EAAW,SAAS,GAAG,IAAA,EAAM,CAAC,cAAc,MAAA,EAAQ,QAAQ,CAAA,EAAG,OAAA,EAAS,QAAA,EAAS;AAAA,EACvN,EAAE,IAAI,YAAA,EAAc,IAAA,EAAM,eAAe,QAAA,EAAU,kEAAA,EAAoE,QAAQ,CAAC,OAAA,EAAS,WAAW,SAAA,EAAW,KAAK,GAAG,IAAA,EAAM,CAAC,SAAS,OAAA,EAAS,MAAM,CAAA,EAAG,OAAA,EAAS,YAAA;AACpN;AC5BA,IAAM,UAAA,GAAa,IAAI,GAAA,CAAoB,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AAC5E,IAAM,SAAA,GAAY,CAAC,KAAA,KAAA,CAAmB,UAAA,CAAW,IAAI,KAAK,CAAA,IAAK,OAAO,WAAA,EAAY;AAgB3E,SAAS,QAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,KAAI,EAAiB;AACtE,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAI,IAAI,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,IAAI,IAAI,CAAA;AAC/C,EAAA,IAAI,QAAA,IAAY,MAAA,CAAO,KAAA,KAAU,MAAA,EAAQ;AACvC,IAAA,uBAAOJ,GAAAA,CAAC,QAAA,EAAA,EAAS,MAAY,OAAA,EAAS,IAAA,CAAK,KAAK,OAAA,EAAkB,CAAA;AAAA,EACpE;AACA,EAAA,MAAM,IAAA,GACJ,IAAA,CAAK,KAAA,KAAU,UAAA,IAAc,IAAA,CAAK,aAAa,YAAA,CAAa,IAAA,CAAK,UAAA,EAAY,GAAG,CAAA,GAAI,MAAA;AACtF,EAAA,uBACEA,GAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AAAA,MAC1B,OAAA,EAAS,IAAA,CAAK,KAAA,KAAU,SAAA,GAAY,KAAK,OAAA,GAAU,MAAA;AAAA,MACnD,IAAA;AAAA,MAEC,qCACCA,GAAAA,CAAC,YAAS,IAAA,EAAY,OAAA,EAAS,KAAK,GAAA,EAAK,OAAA,EAAkB,oBAE3DA,GAAAA,CAAC,eAAY,IAAA,EAAM,IAAA,CAAK,IAAI,IAAA,EAAM,OAAA,EAAS,KAAK,GAAA,EAAK;AAAA;AAAA,GAEzD;AAEJ;ACxCA,IAAM,KAAA,GAAe,CAAC,CAAC,GAAG,CAAA,EAAG,CAAC,IAAI,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAE1C,IAAM,KAAA,GAAe,CAAC,CAAC,CAAA,EAAG,GAAG,CAAA,EAAG,CAAC,IAAA,EAAM,CAAC,CAAC,CAAA;AAEzC,IAAM,OAAc,CAAC,CAAC,IAAI,CAAA,EAAG,CAAC,IAAI,CAAA,EAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,GAAA,EAAK,CAAC,CAAC,CAAA;AAO7D,IAAM,KAAA,GAA+B;AAAA,EACnC,MAAA,EAAQ,CAAC,CAAC,IAAI,CAAA,EAAG,CAAC,GAAA,EAAK,EAAE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAAA,EAClC,IAAA,EAAM,CAAC,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,EACd,MAAA,EAAQ,CAAC,CAAC,GAAG,CAAA,EAAG,CAAC,IAAI,CAAA,EAAG,CAAC,GAAG,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAAA,EACrC,KAAA,EAAO,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAAA,EAC7B,IAAA,EAAM,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAAA,EAC5B,KAAA,EAAO,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAAA,EAC7B,IAAA,EAAM,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAAA,EAC5B,KAAA,EAAO,CAAC,CAAC,GAAG,CAAA,EAAG,CAAC,IAAI,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAAA,EAC7B,MAAA,EAAQ,IAAA;AAAA,EACR,QAAA,EAAU,IAAA;AAAA,EACV,MAAA,EAAQ,IAAA;AAAA,EACR,MAAA,EAAQ,IAAA;AAAA,EACR,OAAA,EAAS,IAAA;AAAA,EACT,MAAA,EAAQ,IAAA;AAAA,EACR,QAAA,EAAU,IAAA;AAAA,EACV,UAAA,EAAY,KAAA;AAAA,EACZ,IAAA,EAAM,KAAA;AAAA,EACN,SAAA,EAAW,KAAA;AAAA,EACX,SAAA,EAAW,KAAA;AAAA,EACX,MAAA,EAAQ,KAAA;AAAA,EACR,WAAA,EAAa,KAAA;AAAA,EACb,OAAA,EAAS,KAAA;AAAA,EACT,GAAA,EAAK,KAAA;AAAA,EACL,OAAA,EAAS,KAAA;AAAA,EACT,QAAA,EAAU,KAAA;AAAA,EACV,aAAA,EAAe,KAAA;AAAA,EACf,SAAA,EAAW,KAAA;AAAA,EACX,SAAA,EAAW,KAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAA;AAGO,SAAS,aAAA,CAAc,EAAE,IAAA,EAAK,EAAqB;AACxD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAI,CAAA,IAAK,KAAA;AAC5B,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,QAAA,EAAS,cAAW,SAAA,EAAU,SAAA,EAAU,8BAAA,EAC/C,QAAA,EAAA,IAAA,CAAK,IAAI,CAAC,CAAC,OAAO,MAAM,CAAA,EAAG,sBAC1BA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MAEC,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,GAAG,CAAA,CAAA,CAAA,EAAK,MAAA,EAAQ,MAAA,IAAU,CAAA;AAAE,KAAA;AAAA,IADlD;AAAA,GAGR,CAAA,EACH,CAAA;AAEJ;AAMO,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,oBAAAL,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yGAAA,EACV,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,IACC,WAAA,EAAa,MAAA,mBAASA,GAAAA,CAACM,eAAAA,EAAA,EAAgB,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,SAAA,EAAW,CAAA,GAAK;AAAA,GAAA,EACxF,CAAA;AAEJ;AAGO,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,IAAA,EAAK,EAAkC;AAC1E,EAAA,uBACEN,GAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWO,EAAAA;AAAA,QACT,aAAA;AAAA,QACA,IAAA,KAAS,MAAA,GAAS,cAAA,GAAiB,IAAA,KAAS,QAAQ,kBAAA,GAAqB;AAAA,OAC3E;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AC9EO,SAAS,UAAU,EAAE,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,SAAQ,EAAmB;AAC5E,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC3C,EAAA,MAAM,IAAA,GACJ,KAAA,CAAM,MAAA,KAAW,SAAA,mBACfP,GAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA,GAC/B,KAAA,CAAM,MAAA,KAAW,0BACnBA,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,MAAM,SAAA,IAAa,kBAAA;AAAA,MACzB,aAAa,KAAA,CAAM,gBAAA;AAAA,MACnB,SAAA,EAAW,CAAC,IAAA,KAAS,OAAA,CAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM;AAAA;AAAA,MAErD,CAAC,QAAA,mBACHA,GAAAA,CAACQ,WAAAA,EAAA,EAAY,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA,mBAE/CR,IAAC,QAAA,EAAA,EAAS,KAAA,EAAc,MAAY,OAAA,EAAkB,CAAA;AAG1D,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,QAAQ,OAAO,IAAA;AAC3C,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACZ,QAAA,EAAA;AAAA,IAAA,IAAA;AAAA,oBACDL,IAAC,YAAA,EAAA,EAAa,IAAA,EAAM,MAAM,OAAA,EAAS,IAAA,EAAM,MAAM,WAAA,EAAa;AAAA,GAAA,EAC9D,CAAA;AAEJ;AAOO,SAAS,eAAe,IAAA,EAA6D;AAC1F,EAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,EAAA,IAAI,CAAC,KAAK,OAAO,EAAE,KAAK,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AACvC,EAAA,MAAM,QAAQ,CAAC,GAAI,GAAA,CAAI,KAAA,IAAS,EAAC,EAAI,GAAI,GAAA,CAAI,SAAA,GAAY,CAAC,CAAA,MAAA,EAAS,GAAA,CAAI,SAAS,CAAA,CAAE,CAAA,GAAI,EAAG,CAAA;AACzF,EAAA,MAAM,GAAA,GAAmB,KAAA,CAAM,MAAA,GAAS,CAAC,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,CAAA,GAAI,EAAC;AACtE,EAAA,MAAM,MAAA,GAAsB;AAAA,IAC1B,GAAI,GAAA,CAAI,MAAA,GAAS,CAAC,EAAE,IAAA,EAAM,QAAA,EAAmB,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,GAAA,CAAI,MAAA,EAAQ,IAAI,EAAC;AAAA,IACrF,IAAI,GAAA,CAAI,OAAA,IAAW,EAAC,EAAG,IAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,UAAmB,KAAA,EAAO,CAAA,CAAE,OAAO,IAAA,EAAM,CAAA,CAAE,MAAK,CAAE;AAAA,GAC/F;AACA,EAAA,OAAO,EAAE,KAAK,MAAA,EAAO;AACvB;AAMO,SAAS,WAAA,CAAY,MAAkB,QAAA,EAA4B;AACxE,EAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAI,eAAe,IAAI,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,QAAA,CAAS,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA,CAAE,SAAA,KAAc,KAAK,CAAA;AACtF,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,QAAA,CAAS,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA,CAAE,SAAA,KAAc,KAAK,CAAA;AACzF,EAAA,OAAO,EAAE,MAAA,EAAQ,CAAC,GAAG,KAAK,GAAG,MAAA,EAAQ,GAAG,MAAM,CAAA,EAAG,GAAA,EAAK,WAAA,EAAa,MAAA,CAAO,SAAS,CAAA,EAAE;AACvF;AAGO,SAAS,WAAW,IAAA,EAAsC;AAC/D,EAAA,MAAM,CAAA,GAAI,KAAK,QAAA,EAAU,SAAA;AACzB,EAAA,OAAO,CAAA,GAAI,CAAA,UAAA,EAAU,CAAA,CAAE,OAAA,CAAQ,eAAe,OAAO,CAAC,CAAA,EAAG,CAAA,CAAE,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,GAAK,MAAA;AAC1F;AAOO,SAAS,WAAA,CAAY;AAAA,EAC1B,OAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,uBACEK,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWE,EAAAA;AAAA,QACT,mGAAA;AAAA,QACA,SAAS,KAAA,IAAS,uBAAA;AAAA,QAClB;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,IAAA,mBAAOP,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,sCAAA,EAAwC,QAAA,EAAA,OAAA,CAAQ,MAAK,CAAA,GAAU,IAAA;AAAA,QAC9F,OAAA,CAAQ,OAAA,EAAS,MAAA,mBAChBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAWO,EAAAA,CAAG,SAAA,EAAW,OAAA,CAAQ,IAAA,GAAO,UAAA,GAAa,QAAQ,GAChE,QAAA,kBAAAP,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,QAAA,EAAU,CAAC,MAAA,KAAW,OAAA,CAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ;AAAA;AAAA,WAE3E,CAAA,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;AAGO,SAAS,UAAA,CAAW,EAAE,QAAA,EAAU,SAAA,EAAU,EAAsD;AACrG,EAAA,uBAAOA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAWO,GAAG,6BAAA,EAA+B,SAAS,GAAI,QAAA,EAAS,CAAA;AACjF;ACrHO,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,EAAU,EAAyC;AAClF,EAAA,uBACEP,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa,GAAA;AAAA,MACb,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAWO,EAAAA,CAAG,mBAAA,EAAqB,SAAS,CAAA;AAAA,MAE5C,QAAA,kBAAAP,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAG,IAAA,EAAM;AAAA;AAAA,GACjB;AAEJ;AAcO,SAAS,eAAe,EAAE,OAAA,EAAS,KAAA,EAAO,aAAA,EAAe,MAAK,EAAwB;AAC3F,EAAA,uBACEK,IAAAA,CAAC,MAAA,EAAA,EAAO,KAAA,EAAc,aAAA,EACpB,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,cAAY,OAAA,CAAQ,KAAA;AAAA,QACpB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,SAAA,EAAWE,EAAAA;AAAA,UACT,6EAAA;AAAA,UACA,OAAO,gBAAA,GAAmB,iBAAA;AAAA,UAC1B,QAAQ,KAAA,IAAS;AAAA,SACnB;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,OAAA,CAAQ,uBAAOP,GAAAA,CAAC,YAAS,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA,GAAK,IAAA;AAAA,0BACnDA,IAAC,WAAA,EAAA,EAAY;AAAA;AAAA;AAAA,KACf;AAAA,oBACAA,GAAAA,CAAC,aAAA,EAAA,EACE,kBAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACpBA,IAAC,UAAA,EAAA,EAAyB,KAAA,EAAO,EAAE,KAAA,EAChC,QAAA,EAAA,CAAA,CAAE,SADY,CAAA,CAAE,KAEnB,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,QAAA,EAAS,EAA4C;AAC1F,EAAA,uBACEK,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4GAAA,EACd,QAAA,EAAA;AAAA,oBAAAL,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,IAChC,2BACCA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,QAAA;AAAA,QACT,YAAA,EAAY,UAAU,IAAI,CAAA,CAAA;AAAA,QAC1B,SAAA,EAAU,wFAAA;AAAA,QACX,QAAA,EAAA;AAAA;AAAA,KAED,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAGO,SAAS,gBAAgB,QAAA,EAA4D;AAC1F,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAA,IAAK,QAAA,EAAU,QAAA,IAAY,IAAI,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,GAAI,EAAE,OAAA,IAAW,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAG,KAAA,IAAS,EAAA;AAC1F,EAAA,OAAO,GAAA;AACT;AAaO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAAS,UAAAA,EAAW,QAAO,EAAqB;AACnE,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,WAAA,KAAgB,qBAAA,EAAsB;AACjE,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,EAAA,MAAM,QAAA,GAAW,QAAA,EAAU,QAAA,IAAY,EAAC;AACxC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUC,gBAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,MAAA,CAAA,QAAA,CAAiB,EAAE,CAAA;AAInD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,MAAA,CAAA,QAAA,CAAiC,EAAE,CAAA;AACnE,EAAA,MAAM,QAAA,GAAW,gBAAgB,QAAQ,CAAA;AACzC,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAA,CAAE,EAAE,CAAA;AACvB,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,IAAI,CAAA,EAAG,QAAA,CAAS,CAAA,CAAE,EAAE,CAAA,GAAI,IAAA;AAAA,EACtF;AACA,EAAA,MAAM,SAAA,GAAkBA,cAAyB,IAAI,CAAA;AAErD,EAAA,MAAM,SAAS,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,SAAS,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA,CAAE,OAAO,OAAO,CAAA;AACpG,EAAA,MAAM,WAAA,GAAc,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,EAAG,WAAW,CAAA,EAAG,WAAA,IAAe,QAAA,EAAU,WAAA;AACjF,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,GAAG,IAAI,CAAA;AAEvC,EAAA,MAAM,OAAA,GAAU,CAAC,EAAA,EAAY,KAAA,KAAkB;AAC7C,IAAA,QAAA,CAAS,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,KAAA,EAAM,CAAE,CAAA;AAC7C,IAAA,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,OAAO,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,EAAK;AACxB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,CAAM,MAAA,EAAQ;AAC5B,IAAA,IAAA,CAAK;AAAA,MACH,IAAA,EAAM,QAAA;AAAA,MACN,IAAA;AAAA,MACA,GAAI,QAAA,CAAS,MAAA,GAAS,EAAE,QAAA,KAAa,EAAC;AAAA,MACtC,GAAI,KAAA,CAAM,MAAA,GAAS,EAAE,KAAA,KAAU;AAAC,KACjC,CAAA;AACD,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,SAAS,QAAA,EAAU,MAAA;AACzB,EAAA,MAAM,aAAA,GAAgB,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,EAAC;AAC7D,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,EAAoB,IAAA,qBAClCV,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MAEC,OAAA,EAAS,CAAA;AAAA,MACT,KAAA,EAAO,QAAA,CAAS,CAAA,CAAE,EAAE,CAAA,IAAK,EAAA;AAAA,MACzB,eAAe,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,MACrC;AAAA,KAAA;AAAA,IAJK,CAAA,CAAE;AAAA,GAKT;AAEF,EAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,CAAO,CAAC,OAAO,CAAA,CAAE,KAAA,IAAS,aAAa,OAAO,CAAA;AACrE,EAAA,MAAM,MAAM,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AAEpD,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,aACR,QAAA,kBAAAA,GAAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,KAAA;AAAA,MACP,QAAA,EAAU,QAAA;AAAA,MACV,MAAA,EAAQ,IAAA;AAAA,MACR,MAAA;AAAA,MACA,SAAA,EAAWS,UAAAA;AAAA,MACX,WAAA;AAAA,MACA,iBAAA,EAAmBF,EAAAA,CAAG,mBAAA,EAAqB,IAAA,IAAQ,WAAW,CAAA;AAAA,MAC9D,UAAU,KAAA,CAAM,IAAA;AAAA,MAChB,UAAU,KAAA,CAAM,IAAA;AAAA,MAChB,cAAcE,UAAAA,IAAc,CAAC,MAAM,IAAA,EAAK,IAAK,CAAC,KAAA,CAAM,MAAA;AAAA,MACpD,WAAA,EACE,MAAM,MAAA,GACF,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG,sBACZT,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UAEC,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,QAAA,EAAU,MAAM,QAAA,CAAS,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,CAAC,CAAC;AAAA,SAAA;AAAA,QAF5D,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,OAItB,CAAA,GACD,MAAA;AAAA,MAGN,YAAA,EAAc,MAAM,MAAA,mBAASA,IAAAW,QAAAA,EAAA,EAAG,gBAAM,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,MAAA,CAAO,GAAG,CAAA,KAAM,KAAA,CAAM,SAAS,CAAC,CAAC,GAAE,CAAA,GAAM,MAAA;AAAA,MAC7F,YACE,GAAA,CAAI,MAAA,IAAU,yBACZN,IAAAA,CAAAM,UAAA,EACG,QAAA,EAAA;AAAA,QAAA,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,QACxB,MAAA,mBACCN,IAAAA,CAAAM,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAX,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,SAAA;AAAA,cACL,IAAA,EAAK,MAAA;AAAA,cACL,MAAA,EAAM,IAAA;AAAA,cACN,QAAQ,aAAA,CAAc,MAAA;AAAA,cACtB,QAAA,EAAU,cAAc,QAAA,IAAY,IAAA;AAAA,cACpC,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,MAAM,IAAA,GAAO,EAAE,MAAA,CAAO,KAAA;AACtB,gBAAA,IAAI,IAAA,EAAM,MAAA,EAAQ,QAAA,CAAS,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AAEnE,gBAAA,CAAA,CAAE,OAAO,KAAA,GAAQ,EAAA;AAAA,cACnB;AAAA;AAAA,WACF;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,SAAA,CAAU,OAAA,EAAS,KAAA,EAAM;AAAA,cACxC,KAAA,EAAM,cAAA;AAAA,cACN,YAAA,EAAW,cAAA;AAAA,cACX,SAAA,EAAU,+GAAA;AAAA,cAET,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA;AACT,SAAA,EACF,CAAA,GACE;AAAA,OAAA,EACN,CAAA,GACE;AAAA;AAAA,GAER,EACF,CAAA;AAEJ;AC3MA,IAAM,UAAA,GAAgE;AAAA,EACpE,OAAA,EAAS,QAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,SAAA;AAAA,EACN,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,aAAA;AAAA,EACT,QAAA,EAAU,aAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,IAAA,GAAoD;AAAA,EACxD,MAAA,EAAQ,kBAAA;AAAA,EACR,OAAA,EAAS,cAAA;AAAA,EACT,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAGO,SAAS,gBAAgB,IAAA,EAAqC;AACnE,EAAA,MAAM,MAAA,GAAS,KAAK,KAAA,KAAU,QAAA,GAAY,KAAK,KAAA,IAAS,IAAA,CAAK,SAAU,IAAA,CAAK,MAAA;AAC5E,EAAA,QAAQ,KAAK,KAAA;AAAO,IAClB,KAAK,UAAA;AACH,MAAA,OAAO,CAAC,YAAY,IAAA,CAAK,OAAA,IAAW,CAAC,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAA,GAAK,EAAE,IAAI,MAAM,CAAA,CACvF,OAAO,OAAO,CAAA,CACd,KAAK,QAAK,CAAA;AAAA,IACf,KAAK,SAAA;AACH,MAAA,OAAO,CAAC,eAAe,MAAM,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,KAAK,QAAK,CAAA;AAAA,IAC3D,KAAK,SAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAEA,SAAS,MAAA,CAAO,EAAE,KAAA,EAAO,IAAA,EAAK,EAA0C;AACtE,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,oBAAAL,GAAAA,CAAC,WAAS,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAChBA,GAAAA,CAAC,YAAA,EAAA,EAAa,YAAW,MAAA,EAAO,OAAA,EAAQ,WACrC,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,sBACdA,GAAAA,CAAC,eAAsC,KAAA,EAAO,GAAA,CAAI,OAAO,IAAA,EAAM,GAAA,CAAI,IAAA,EAChE,QAAA,EAAA,GAAA,CAAI,uBAAOA,GAAAA,CAAC,SAAI,SAAA,EAAU,qCAAA,EAAuC,cAAI,KAAA,EAAM,CAAA,GAAS,GAAA,CAAI,KAAA,EAAA,EADzE,GAAG,GAAA,CAAI,KAAK,IAAI,CAAC,CAAA,CAEnC,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,UAAA,CAAW,EAAE,IAAA,EAAK,EAAwB;AACxD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAA,EAAI,KAAA,IAAS,EAAC;AACjC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,EAAA,EAAI,MAAA,IAAU,EAAC;AACnC,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,MAAA,mBAASL,GAAAA,CAAC,MAAA,EAAA,EAAO,OAAM,OAAA,EAAQ,IAAA,EAAM,OAAO,CAAA,GAAK,IAAA;AAAA,IACvD,MAAA,CAAO,yBAASA,GAAAA,CAAC,UAAO,KAAA,EAAM,QAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,CAAA,GAAK,IAAA;AAAA,IAC1D,KAAK,KAAA,mBAAQA,GAAAA,CAAC,MAAA,EAAA,EAAO,OAAM,OAAA,EAAQ,IAAA,EAAM,CAAC,EAAE,OAAO,OAAA,EAAS,KAAA,EAAO,KAAK,KAAA,EAAO,GAAG,CAAA,GAAK;AAAA,GAAA,EAC1F,CAAA;AAEJ;AAEA,IAAM,SAAA,GAAY,CAAC,IAAA,KAAoB,CAAC,EAAE,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,MAAA,IAAU,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ,UAAU,IAAA,CAAK,KAAA,CAAA;AAkB7F,SAAS,OAAA,CAAQ,EAAE,IAAA,EAAM,IAAA,EAAM,SAAS,IAAA,EAAM,QAAA,EAAU,QAAO,EAAiB;AACrF,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,KAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA;AACnC,EAAA,MAAM,WAAA,GAAc,CAAC,eAAA,CAAgB,IAAI,CAAA,EAAG,MAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,QAAK,CAAA;AAC9E,EAAA,MAAM,OAAO,MAAA,IAAU,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,IAAI,EAAE,CAAA;AACjD,EAAA,MAAM,MAAA,GACJ,QAAA,KACC,SAAA,CAAU,IAAI,CAAA,GACX,MAAM,GAAA,CAAI,YAAA,CAAa,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA,GAClC,GAAA,CAAI,SAAA,GACF,MAAM,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,CAAA,GACjE,MAAA,CAAA;AACR,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,oBAAAL,GAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAAA,QAC7B,MAAM,IAAA,CAAK,KAAA;AAAA,QACX,WAAA,EAAa,WAAA,mBAAcA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAI,QAAA,EAAA,WAAA,EAAY,CAAA,GAAU,MAAA;AAAA,QACrF,IAAA,EAAM,IAAA,KAAS,MAAA,GAAY,cAAA,CAAe,IAAI,CAAA,GAAI,MAAA;AAAA,QAClD,OAAA,EAAS;AAAA;AAAA,KACX;AAAA,IACC,UAAU,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,KAAA,KAAU,aAAa,IAAA,CAAK,KAAA,KAAU,UAAA,CAAA,mBACtEA,IAAC,0BAAA,EAAA,EAA2B,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,IAAA,CAAK,UAAS,CAAA,GACtE,IAAA;AAAA,IACH,IAAA,IAAQ,SAAA,CAAU,IAAI,CAAA,mBACrBA,GAAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,kBAAA;AAAA,QACV,KAAA,kBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,WAAA,EAAa,QAAA,EAAA,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,QAC3D,IAAA,EAAM;AAAA,UACJ,IAAA,CAAK,OAAA,GAAU,CAAA,QAAA,EAAW,IAAA,CAAK,OAAO,CAAA,CAAA,GAAK,MAAA;AAAA,UAC3C,KAAK,QAAA,KAAa,MAAA,GAAY,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,GAAI;AAAA,SAChE,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,QAAK,CAAA;AAAA,QACb,IAAA,EAAI,IAAA;AAAA,QACJ,cAAc,MAAM,GAAA,CAAI,aAAa,IAAA,CAAK,EAAA,EAAI,IAAI,KAAK,CAAA;AAAA,QAEvD,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAY;AAAA;AAAA,KAC1B,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAGO,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,EAAU,EAA6C;AACtF,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWO,EAAAA,CAAG,gCAAgC,SAAS,CAAA,EACxD,QAAA,EAAA,CAAA,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,IAAI,CAAC,IAAA,EAAM,CAAA,qBAC7BP,GAAAA,CAAC,OAAA,EAAA,EAA2B,IAAA,EAAY,IAAA,EAAA,EAA1B,IAAA,CAAK,EAAA,IAAM,CAA2B,CACrD,CAAA,EACH,CAAA;AAEJ;AAEA,IAAM,OAAO,EAAE,IAAA,EAAM,eAAe,MAAA,EAAQ,cAAA,EAAgB,SAAS,eAAA,EAAgB;AAO9E,SAAS,cAAA,CAAe,EAAE,IAAA,EAAK,EAAyB;AAC7D,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,MAAM,OAAA,GAAU,WAAW,IAAI,CAAA;AAC/B,EAAA,MAAM,OAAO,IAAA,CAAK,OAAA,KAAY,YAAY,OAAA,KAAY,SAAA,GAAY,UAAU,MAAM,CAAA;AAClF,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA;AACrC,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,UAAU,IAAI,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,IAAI,KAAK,CAAA;AACzC,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,oBAAAL,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,aAAA,EAAW,MAAC,QAAA,EAAA,QAAA,EAEtD,CAAA;AAAA,oBACAK,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,MAAA,IAAA;AAAA,MAAM,GAAA;AAAA,MACN,IAAA,KAAS,yBACRL,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,uEAAA;AAAA,UACV,SAAS,MACP,GAAA,CAAI,YAAY,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,MAAM,IAAA,CAAK,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,SAAS,IAAA,CAAK,EAAA,EAAI,CAAC,IAAI,CAAA;AAAA,UAG5F,yBAAe,IAAI;AAAA;AAAA,OACtB,GAEA,QAAA;AAAA,MAED,KAAA,GAAQ,CAAA,MAAA,EAAM,IAAI,CAAA,IAAA,EAAO,KAAK,CAAA,MAAA,CAAA,GAAW;AAAA,KAAA,EAC5C,CAAA;AAAA,IACC,wBACCA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,eAAA,EAAe,IAAA;AAAA,QACf,YAAA,EAAY,OAAO,gBAAA,GAAmB,gBAAA;AAAA,QACtC,SAAA,EAAU,uBAAA;AAAA,QACV,SAAS,MAAM,GAAA,CAAI,SAAS,IAAA,CAAK,EAAA,EAAI,CAAC,IAAI,CAAA;AAAA,QAE1C,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAWO,GAAG,mCAAA,EAAqC,IAAA,IAAQ,WAAW,CAAA,EAAG,QAAA,EAAA,QAAA,EAAC;AAAA;AAAA,KAClF,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;ACpKA,IAAM,UAAA,GAA4D;AAAA,EAChE,IAAA,EAAM,SAAA;AAAA,EACN,OAAA,EAAS,MAAA;AAAA,EACT,IAAA,EAAM,SAAA;AAAA,EACN,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,OAAA,GAAqD;AAAA,EACzD,OAAA,EAAS,MAAA;AAAA,EACT,QAAA,EAAU,SAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,UAAA,EAAY,SAAA;AAAA,EACZ,OAAA,EAAS;AACX,CAAA;AAGA,SAAS,OAAA,GAAU;AACjB,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,OAAO,CAAC,MAAA,KAAmB;AACzB,IAAA,GAAA,CAAI,QAAQ,MAAM,CAAA;AAClB,IAAA,GAAA,CAAI,WAAA,CAAY,QAAQ,IAAI,CAAA;AAC5B,IAAA,GAAA,CAAI,aAAa,MAAM,CAAA;AAAA,EACzB,CAAA;AACF;AAQA,SAAS,SAAA,CAAU,EAAE,IAAA,EAAK,EAAyB;AACjD,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,MAAM,OAAA,GAAU,WAAW,IAAI,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,OAAA,KAAY,MAAA,IAAU,OAAA,KAAY,SAAA;AAC/C,EAAA,MAAM,EAAE,QAAQ,GAAA,EAAK,WAAA,KAAgB,WAAA,CAAY,IAAA,EAAM,IAAI,QAAQ,CAAA;AACnE,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAA,EAAQ,GAAG,GAAG,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA;AACrC,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,IAAA,CAAK,KAAA,EAAO,MAAA,KAAW,IAAA,IAAQ,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,EAAA,EAAI,KAAK,CAAA,CAAA;AAE/E,EAAA,MAAM,IAAA,GACJ,IAAA,IAAQ,CAAC,WAAA,mBACPP,GAAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,YAAA;AAAA,MACV,OAAA,EAAS,IAAA,KAAS,MAAA,GAAY,cAAA,CAAe,IAAI,CAAA,GAAI,MAAA;AAAA,MAErD,OAAA,EAAS,OAAA,KAAY,SAAA,mBAAYA,GAAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EAAgC,aAAA,EAAW,IAAA,EAAC,CAAA,GAAK,MAAA;AAAA,MAEjG,sBAAY,SAAA,GAAY,wBAAA,GAA2B,OAAO,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,MAAA,CAAA,GAAM;AAAA;AAAA,MAE9E,MAAA,CAAO,MAAA,mBACTA,GAAAA,CAAC,cAAW,SAAA,EAAU,mBAAA,EACnB,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACdA,GAAAA,CAAC,SAAA,EAAA,EAAiC,OAAO,CAAA,EAAG,IAAA,EAAY,QAAA,EAAU,GAAA,CAAI,UAAU,OAAA,EAAS,GAAA,CAAI,QAA7E,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAqE,CACpG,GACH,CAAA,GACE,OAAA,KAAY,WACd,iBAAA,GACE,OAAA,KAAY,YACd,iBAAA,GACE,IAAA;AAEN,EAAA,uBACEA,GAAAA;AAAA,IAAC,sBAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ,WAAW,OAAO,CAAA;AAAA,MAC1B,MAAM,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,GAAO,MAAA;AAAA,MACvC,MAAA,kBACEK,IAAAA,CAAAM,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,IAAA,IAAQ,IAAA,CAAK,OAAO,MAAA,mBAASX,IAAC,QAAA,EAAA,EAAS,IAAA,EAAY,SAAA,EAAU,QAAA,EAAS,CAAA,GAAK,IAAA;AAAA,QAC3E,CAAC,IAAA;AAAA;AAAA,0BAEAA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAa,QAAA,EAAA,IAAA,CAAK,KAAA,EAAO,MAAA,mBAASA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAY,CAAA,GAAK,IAAA,EAAK;AAAA,YAClF,IAAA;AAAA,QACH,CAAC,QAAQ,SAAA,mBAAYA,IAAC,QAAA,EAAA,EAAS,IAAA,EAAY,SAAA,EAAU,QAAA,EAAS,CAAA,GAAK,IAAA;AAAA,QACnE,IAAA,CAAK,OAAA,IAAW,CAAC,IAAA,mBAChBA,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,QAAA;AAAA,YACV,SAAS,IAAA,CAAK,OAAA;AAAA,YACd,IAAA;AAAA,YACA,SAAS,GAAA,CAAI,IAAA;AAAA,YACb,IAAA,EAAM,OAAA,KAAY,QAAA,GAAW,KAAA,GAAQ;AAAA;AAAA,SACvC,GACE,IAAA;AAAA,QACH,YAAY,SAAA,mBACXA,GAAAA,CAAC,0BAAA,EAAA,EAA2B,gEAA+C,CAAA,GACzE;AAAA,OAAA,EACN,CAAA;AAAA,MAGD,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,MAAA,CAAO,EAAE,IAAA,EAAK,EAAsB;AAC3C,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,uBACEA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,IAAK,SAAA,EACrD,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,QAAA,EAAU,GAAA,CAAI,QAAA,EAAU,OAAA,EAAS,GAAA,CAAI,IAAA,EAAM,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,CAAA,EAChF,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,QAAA,EAAS,EAA2B;AACzD,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACZ,QAAA,EAAA;AAAA,IAAA,MAAA,mBACCL,GAAAA,CAAC,KAAA,EAAA,EAAI,EAAA,EAAI,UAAU,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,EAAE,CAAA,EAAG,SAAA,EAAU,aAAA,EACjD,QAAA,kBAAAA,IAAC,oBAAA,EAAA,EAAqB,IAAA,EAAM,MAAA,CAAO,EAAA,mBAAKA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAgB,QAAA,EAAA,SAAA,CAAU,MAAA,CAAO,EAAE,CAAA,EAAE,CAAA,GAAU,MAAA,EACpG,QAAA,EAAA,MAAA,CAAO,IAAA,EACV,GACF,CAAA,GACE,IAAA;AAAA,IACH,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,0BACrBA,GAAAA,CAAC,KAAA,EAAA,EAAmB,EAAA,EAAI,UAAU,GAAA,CAAI,IAAA,EAAM,KAAA,CAAM,EAAE,GAAG,SAAA,EAAU,qBAAA,EAC9D,QAAA,EAAA,QAAA,CAAS,KAAK,CAAA,mBAAIA,GAAAA,CAAC,SAAA,EAAA,EAAU,MAAM,KAAA,EAAO,CAAA,mBAAKA,GAAAA,CAAC,UAAO,IAAA,EAAM,KAAA,EAAO,CAAA,EAAA,EAD7D,KAAA,CAAM,EAEhB,CACD;AAAA,GAAA,EACH,CAAA;AAEJ;AAEA,IAAM,SAAS,EAAE,OAAA,EAAS,GAAG,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAE;AAMpD,SAAS,QAAA,GAAW;AAClB,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAiB,GAAA,CAAI,QAAA,CAAS,UAAU,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,CAAE,KAAA,KAAU,MAAA;AAChF,EAAA,MAAM,SAAS,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA,CAChC,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,SAAS,CAAC,CAAA,IAAK,EAAE,KAAA,EAAO,MAAM,CAAC,CAAA,CACnE,SAAQ,CACR,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,MAAA,CAAO,aAAA,CAAc,CAAA,EAAG,MAAM,CAAC,CAAA,GAAI,MAAA,CAAO,cAAc,CAAA,EAAG,MAAM,CAAC,CAAC,CAAA;AACrF,EAAA,uBACEA,GAAAA,CAAAW,QAAAA,EAAA,EACG,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,QAAA,KAAa;AACxB,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,QAAA,EAAU,MAAM,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,UAAA,CAAW,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,IAAK,IAAI,CAAC,CAAA;AAC/E,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA;AAC1C,IAAA,MAAM,IAAA,GAAO,UAAU,SAAA,GAAY,SAAA,GAAY,UAAU,SAAA,GAAY,gBAAA,GAAmB,eAAe,KAAK,CAAA;AAC5G,IAAA,uBACEX,GAAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QAEC,OAAA,kBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4BAAA,EACb,QAAA,EAAA;AAAA,0BAAAL,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,KAAA,EAAO,QAAA,CAAS,MAAA,EAAQ,IAAA,EACxD,QAAA,EAAA,QAAA,CAAS,MAAA,EAAQ,IAAA,IAAQ,GAAA,CAAI,KAAK,KAAA,EACrC,CAAA;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2DACb,QAAA,EAAA,CAAC,IAAA,EAAM,IAAI,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,QAAK,CAAA,EAC1C;AAAA,SAAA,EACF,CAAA;AAAA,QAGD,QAAA,EAAA,OAAA,CAAQ,OAAA;AAAA,UAAQ,CAAC,CAAA,KAAA,CACf,CAAA,CAAE,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACtBA,GAAAA,CAAC,OAAA,EAAA,EAAqC,MAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,MAAM,IAAA,CAAK,EAAE,EAAE,CAAA,EAAA,EAAlF,CAAA,EAAG,CAAA,CAAE,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,EAAA,IAAM,CAAC,EAAiE,CACpG;AAAA;AACH,OAAA;AAAA,MAhBK,QAAA,CAAS;AAAA,KAiBhB;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AAGA,SAAS,WAAA,GAAc;AACrB,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,MAAA;AAAA,IAC1B,CAAC,CAAA,KAAuB,QAAA,CAAS,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAA,KAAM,MAAA,IAAU,UAAA,CAAW,CAAC,CAAA,KAAM,SAAA;AAAA,GACxF;AACA,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA;AACzB,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCACZ,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AACf,IAAA,MAAM,OAAO,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA,CAAE,QAAQ,CAAC,CAAA;AAC1C,IAAA,OAAO,uBACLA,GAAAA,CAAC,OAAA,EAAA,EAAmB,IAAA,EAAM,GAAG,IAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,MAAM,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA,EAAA,EAAnE,CAAA,CAAE,EAAoE,CAAA,GAClF,IAAA;AAAA,EACN,CAAC,CAAA,EACH,CAAA;AAEJ;AAiBO,SAAS,UAAA,CAAW,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAQ,OAAA,EAAS,UAAA,EAAY,WAAU,EAAoB;AACvG,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,CAAC,GAAA,KAAQ,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,CAAE,UAAU,MAAM,CAAA;AACpG,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,KAAS,OAAA;AAC3B,EAAA,MAAM,UAAA,GAAa,CAAC,MAAA,EAA0B,KAAA,qBAC5CA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,cAAA,EAAc,IAAI,IAAA,KAAS,MAAA;AAAA,MAC3B,OAAA,EAAS,MAAM,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AAAA,MACjC,SAAA,EAAW,GAAA,CAAI,IAAA,KAAS,MAAA,GAAS,6BAAA,GAAgC,uBAAA;AAAA,MAEhE,QAAA,EAAA;AAAA;AAAA,GACH;AAEF,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAWE,EAAAA,CAAG,4CAAA,EAA8C,SAAS,CAAA,EACvE,QAAA,EAAA;AAAA,IAAA,MAAA,KAAW,uBAAOP,GAAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAkB,IAAK,MAAA,IAAU,IAAA;AAAA,oBACnEA,GAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,gBAAA;AAAA,QACV,aAAA,EAAe,GAAG,GAAA,CAAI,IAAI,IAAI,GAAA,CAAI,IAAA,CAAK,MAAM,MAAM,CAAA,CAAA;AAAA,QACnD,UAAA;AAAA,QACA,aAAA,EAAe,QAAQ,YAAA,GAAe,MAAA;AAAA,QACtC,MAAA,kBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,CAAC,KAAA,mBAAQL,GAAAA,CAAC,WAAA,EAAA,EAAY,CAAA,GAAK,IAAA;AAAA,0BAC5BA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAW,SAAS,MAAA,EAAgB,CAAA;AAAA,0BACjDA,GAAAA;AAAA,YAAC,oBAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,MAAA;AAAA,cACV,KAAA,kBACEK,IAAAA,CAAAM,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,gBAAA,UAAA,CAAW,QAAQ,MAAM,CAAA;AAAA,gBACzB,UAAA,CAAW,OAAA,EAAS,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,gBAC7C,OAAO,OAAA,mBACNN,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA;AAAA,kBAAA,MAAA,CAAO,OAAA;AAAA,kBAAQ;AAAA,iBAAA,EAAQ,IACrD,MAAA,CAAO,OAAA,mBACTA,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA;AAAA,kBAAA,MAAA,CAAO,OAAA;AAAA,kBAAQ;AAAA,iBAAA,EAAY,CAAA,GACzD;AAAA,eAAA,EACN,CAAA;AAAA,cAEF,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,KAAA,KAAU,QAAQ,MAAA,mBAAYL,GAAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAkB;AAAA;AAAA;AACpF,SAAA,EACF,CAAA;AAAA,QAGD,kCAAQA,GAAAA,CAAC,YAAS,CAAA,GAAK,WAAA,CAAY,IAAI,IAAI,CAAA,CAAE,IAAI,CAAC,CAAA,qBAAMA,GAAAA,CAAC,WAAA,EAAA,EAAuB,UAAU,CAAA,EAAA,EAAhB,CAAA,CAAE,EAAiB,CAAE;AAAA;AAAA;AAClG,GAAA,EACF,CAAA;AAEJ;;;ACzOO,IAAM,sBAAA,GAAoD,CAAC,OAAA,EAAS,MAAA,EAAQ,SAAS,MAAM;AC1C3F,IAAM,SAAA,GAAkBY,MAAA,CAAA,UAAA;AAAA,EAC7B,CAAC,EAAE,KAAA,GAAQ,OAAA,EAAS,SAAA,EAAW,UAAU,GAAG,KAAA,EAAM,EAAG,GAAA,qBACnDZ,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAWO,EAAAA;AAAA,QACT,kEAAA;AAAA,QACA,UAAU,KAAA,IAAS,YAAA;AAAA,QACnB;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA;AAGP;AACA,SAAA,CAAU,WAAA,GAAc,WAAA;ACjBxB,IAAM,YAAY,EAAE,IAAA,EAAM,eAAe,MAAA,EAAQ,cAAA,EAAgB,SAAS,eAAA,EAAgB;AAG1F,SAAS,OAAA,CAAQ,EAAE,IAAA,EAAK,EAAyB;AAC/C,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,MAAM,OAAA,GAAU,WAAW,IAAI,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAC5B,EAAA,MAAM,QAAQ,SAAA,CAAU,OAAA,KAAY,YAAY,OAAA,KAAY,SAAA,GAAY,UAAU,MAAM,CAAA;AACxF,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,IAAI,KAAK,CAAA;AACzC,EAAA,uBACEF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EACZ,QAAA,EAAA;AAAA,IAAA,EAAA,mBAAKL,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAgB,cAAG,CAAA,GAAU,IAAA;AAAA,IAClD,EAAA,IAAM,SAAS,MAAA,mBAAYA,IAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,QAAA,EAAA,MAAA,EAAC,CAAA,GAAU,IAAA;AAAA,IACxD,IAAA,KAAS,yBACRK,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,eAAA,EAAe,GAAA,CAAI,SAAA,GAAY,QAAA,GAAW,MAAA;AAAA,QAC1C,eAAA,EAAe,GAAA,CAAI,SAAA,GAAY,MAAA,GAAY,IAAA;AAAA,QAC3C,SAAA,EAAU,sEAAA;AAAA,QACV,SAAS,MACP,GAAA,CAAI,YAAY,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,MAAM,IAAA,CAAK,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,SAAS,IAAA,CAAK,EAAA,EAAI,CAAC,IAAI,CAAA;AAAA,QAG5F,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAAM,GAAA;AAAA,UAAE,cAAA,CAAe,IAAA,EAAM,EAAE,MAAA,EAAQ,MAAM;AAAA;AAAA;AAAA,KAChD,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAOO,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,GAAS,MAAK,EAA2C;AACzF,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,MAAM,OAAA,GAAU,WAAW,IAAI,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,OAAA,KAAY,MAAA,IAAU,OAAA,KAAY,SAAA;AAC/C,EAAA,MAAM,EAAE,QAAQ,GAAA,EAAK,WAAA,KAAgB,WAAA,CAAY,IAAA,EAAM,IAAI,QAAQ,CAAA;AACnE,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAA4B,CAAA,qBACzCL,GAAAA,CAAC,SAAA,EAAA,EAAiC,OAAO,CAAA,EAAG,IAAA,EAAY,UAAU,GAAA,CAAI,QAAA,EAAU,SAAS,GAAA,CAAI,IAAA,EAAA,EAA7E,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAqE,CAAA;AAErG,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAC,IAAA,CAAK,KAAA,EAAO,MAAA,KAAW,IAAA,IAAQ,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,EAAA,EAAI,OAAA,KAAY,QAAQ,CAAA,CAAA;AAE1F,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAA;AAAA,IAAA,IAAA,IAAQ,CAAC,IAAA,CAAK,KAAA,EAAO,MAAA,IAAU,CAAC,WAAA,mBAC/BL,GAAAA,CAAC,kBAAA,EAAA,EAAmB,IAAA,EAAK,WAAA,EAAY,MAAA,EAAO,SAAA,EAAU,qBAEtD,CAAA,GACE,IAAA;AAAA,IACH,KAAA,mBACCA,GAAAA,CAAC,YAAA,EAAA,EAAa,MAAM,IAAA,GAAQ,OAAA,KAAY,YAAY,SAAA,GAAY,SAAA,GAAa,SAC3E,QAAA,kBAAAA,GAAAA,CAAC,gBACC,QAAA,kBAAAA,GAAAA,CAAC,YAAS,IAAA,EAAY,CAAA,EACxB,GACF,CAAA,GACE,IAAA;AAAA,IACH,8BACCA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,OAAA,IAAW,QAAA;AAAA,QACpC,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,UACE,UAAA,CAAW,IAAI,CAAA,IACf,IAAA,CAAK,UACJ,IAAA,IAAQ,CAAC,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,SAAS,IAAI,eAAA,GAAa,MAAA,CAAA;AAAA,QAEtE,IAAA,EAAM,IAAA,CAAK,KAAA,KAAU,SAAA,GAAY,KAAK,KAAA,GAAQ,MAAA;AAAA,QAE9C,0BAAAA,GAAAA,CAAC,YAAA,EAAA,EAAc,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,EAAE;AAAA;AAAA,KACnC,GACE,IAAA;AAAA,IACH,GAAA,CAAI,IAAI,KAAK,CAAA;AAAA,IACb,CAAC,eAAe,CAAC,GAAA,CAAI,WAAW,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,SAAA,CAAA,mBACnEA,GAAAA,CAAC,sBAAmB,IAAA,EAAK,WAAA,EAAY,MAAA,EAAQ,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,WAC3E,QAAA,EAAA,OAAA,KAAY,QAAA,GAAW,iBAAA,GAAoB,iBAAA,EAC9C,CAAA,GACE,IAAA;AAAA,IACH,KAAK,OAAA,IAAW,CAAC,uBAChBA,GAAAA,CAAC,eAAY,OAAA,EAAS,IAAA,CAAK,SAAS,IAAA,EAAY,OAAA,EAAS,IAAI,IAAA,EAAM,IAAA,EAAM,YAAY,QAAA,GAAW,KAAA,GAAQ,QAAW,CAAA,GACjH,IAAA;AAAA,IACH,MAAA,IAAU,CAAC,IAAA,mBACVA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EACV,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,CAAA,EACvB,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,QAAA,EAAU,QAAA,EAAS,EAA8C;AACtF,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,IAAA,CAAK,OAAA,IAAW,KAAA;AAChC,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,SAAA,IAAa,WAAA;AACxC,EAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,MAAA,EAAQ,EAAE,CAAA;AACnC,EAAA,uBACEK,IAAAA,CAAAM,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,QAAA,mBACCN,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EAAwD,MAAK,WAAA,EAC1E,QAAA,EAAA;AAAA,sBAAAL,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,CAAA;AAAA,sBACxCA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,sBAChBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB;AAAA,KAAA,EAC1C,CAAA,GACE,IAAA;AAAA,IACH,MAAA,mBACCK,IAAAA,CAAC,KAAA,EAAA,EAAI,EAAA,EAAI,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,EAAE,CAAA,EAAG,SAAA,EAAU,iCAAA,EACjD,QAAA,EAAA;AAAA,sBAAAL,GAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAM,KAAA,EAAO,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,sBAC5BA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,IAAA,EAAK,MAAA,EAAQ,iBAAO,IAAA,EAAK,CAAA;AAAA,MAC5C,yBAASA,GAAAA,CAAC,UAAK,SAAA,EAAU,qDAAA,EAAuD,kBAAO,CAAA,GAAU;AAAA,KAAA,EACpG,CAAA,GACE,IAAA;AAAA,IACH,SAAS,OAAA,CAAQ,MAAA,mBAChBK,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EACb,QAAA,EAAA;AAAA,sBAAAL,GAAAA,CAAC,aAAW,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,MACrB,SAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,qBACrBA,IAAC,KAAA,EAAA,EAAmB,EAAA,EAAI,UAAU,GAAA,CAAI,IAAA,EAAM,MAAM,EAAE,CAAA,EAAG,WAAU,qBAAA,EAC9D,QAAA,EAAA,QAAA,CAAS,KAAK,CAAA,mBACbA,IAAC,SAAA,EAAA,EAAU,IAAA,EAAM,OAAO,CAAA,mBAExBA,IAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,OAAO,QAAA,EAAU,GAAA,CAAI,UAAU,OAAA,EAAS,GAAA,CAAI,MAAM,GAAA,EAAK,GAAA,CAAI,KAAK,CAAA,EAAA,EAJzE,KAAA,CAAM,EAMhB,CACD;AAAA,KAAA,EACH,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAMA,SAAS,SAAA,CAAU,WAAuB,GAAA,EAAqC;AAC7E,EAAA,IAAI,IAAA;AACJ,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,KAAa;AACjC,IAAA,MAAM,EAAA,GAAK,SAAS,MAAA,EAAQ,EAAA;AAC5B,IAAA,IAAI,CAAC,IAAI,OAAO,MAAA;AAChB,IAAA,MAAM,KAAA,GAAQ,IAAA,KAAS,MAAA,IAAa,CAAC,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,GAAI,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA,GAAI,MAAA;AAC7E,IAAA,IAAA,GAAO,EAAA;AACP,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AACH;AAiBO,SAAS,UAAA,CAAW,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAQ,OAAA,EAAS,UAAA,EAAY,WAAU,EAAoB;AACvG,EAAA,MAAM,MAAM,qBAAA,EAAsB;AAClC,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,SAAA,EAAW,GAAA,CAAI,GAAG,CAAA;AAC3C,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAWE,EAAAA,CAAG,4CAAA,EAA8C,SAAS,CAAA,EACvE,QAAA,EAAA;AAAA,IAAA,MAAA,KAAW,uBAAOP,GAAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAkB,IAAK,MAAA,IAAU,IAAA;AAAA,oBACnEA,GAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,gBAAA;AAAA,QACV,aAAA,EAAe,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,MAAA;AAAA,QAC9B,UAAA;AAAA,QACA,aAAA,EAAc,oCAAA;AAAA,QACd,MAAA,kBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACb,QAAA,EAAA;AAAA,0BAAAL,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAW,OAAA,EAAS,MAAA,EAAgB,CAAA;AAAA,0BACjDA,GAAAA;AAAA,YAAC,oBAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,MAAA;AAAA,cACV,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,SAAA,mBAAYA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,GAAA,CAAI,IAAA,CAAK,SAAA,EAAU,CAAA,GAAU,MAAA;AAAA,cACrF,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,KAAA,KAAU,QAAQ,MAAA,mBAAYA,GAAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAkB;AAAA;AAAA;AACpF,SAAA,EACF,CAAA;AAAA,QAGD,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,EAAU,sBACxBA,GAAAA,CAAC,WAAA,EAAA,EAA8B,QAAA,EAAoB,UAAU,MAAA,CAAO,CAAC,CAAA,EAAA,EAAnD,QAAA,CAAS,EAA6C,CACzE;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AC1LA,IAAM,WAAA,GAAc,CAAC,IAAA,KACnB,CAAA,EAAA,EAAK,KAAK,OAAA,CAAQ,eAAA,EAAiB,CAAC,CAAA,EAAG,EAAA,EAAI,CAAA,KAAc,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA,CAAA;AAapE,IAAM,WAAA,GAAoB,MAAA,CAAA,UAAA,CAAgD,SAASa,YAAAA,CACxF,OACA,GAAA,EACA;AACA,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,OAAA,GAAU,KAAA;AAAA,IACV,MAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAA,EAAK,QAAA;AAAA,IACL,OAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,GAAc,MAAA;AAAA,IACd,OAAA,GAAU,sBAAA;AAAA,IACV;AAAA,GACF,GAAI,KAAA;AAGJ,EAAA,MAAM,EAAE,MAAM,IAAA,EAAM,UAAA,KAAe,eAAA,CAAgB,IAAA,EAAM,QAAQ,YAAA,EAAc;AAAA,IAC7E,KAAA,EAAO,WAAA;AAAA,IACP,OAAA,EAAS,aAAA;AAAA,IACT;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,CAAS,CAAC,CAAA,IAAK,UAAA,CAAW,CAAC,CAAA,KAAM,MAAM,CAAA;AAC9E,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AACtC,EAAA,MAAM,QAAA,GAAiB,eAAQ,MAAM,eAAA,CAAgB,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAC1E,EAAA,MAAM,aAAA,GAAsB,MAAA,CAAA,OAAA,CAAQ,OAAO,EAAE,GAAG,aAAA,EAAe,GAAG,KAAA,EAAM,CAAA,EAAI,CAAC,KAAK,CAAC,CAAA;AACnF,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAU,gBAA0B,WAAW,CAAA;AAC3F,EAAA,MAAM,OAAO,cAAA,IAAkB,gBAAA;AAC/B,EAAA,MAAM,IAAA,GAAa,cAAuB,IAAI,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAiB,cAA8B,IAAI,CAAA;AACzD,EAAA,MAAM,WAAA,GAAoB,MAAA,CAAA,WAAA,CAAY,CAAC,OAAA,KAAmC;AACxE,IAAA,QAAA,CAAS,OAAA,GAAU,OAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,MAAA,GAAe,cAAO,KAAK,CAAA;AACjC,EAAA,MAAM,OAAA,GAAgB,cAAO,IAAI,CAAA;AACjC,EAAM,uBAAgB,MAAM;AAC1B,IAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AACjB,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,EACpB,CAAC,CAAA;AACD,EAAA,MAAM,IAAA,GAAa,MAAA,CAAA,WAAA,CAAY,CAAC,KAAA,KAA6B;AAC3D,IAAA,MAAM,UAAW,MAAA,CAAO,OAAA,CAA+C,WAAA,CAAY,KAAA,CAAM,IAAI,CAAC,CAAA;AAC9F,IAAA,IAAI,OAAO,OAAA,KAAY,UAAA,EAAY,OAAA,CAAQ,KAAK,CAAA;AAChD,IAAA,MAAA,CAAO,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,EAChC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAa,mBAAY,MAAM;AACnC,IAAA,UAAA,EAAW;AACX,IAAA,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,UAAA,EAAY,IAAI,CAAC,CAAA;AACrB,EAAA,UAAA,CAAW,SAAS,IAAI,CAAA;AAExB,EAAA,MAAM,OAAA,GAAgB,MAAA,CAAA,WAAA;AAAA,IACpB,CAAC,IAAA,KAA0B;AACzB,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,MAAA,sBAA+B,IAAI,CAAA;AAC/D,MAAA,MAAA,CAAO,OAAA,CAAQ,eAAe,IAAI,CAAA;AAAA,IACpC,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,YAAA,GAAqB,MAAA,CAAA,WAAA,CAAY,CAAC,MAAA,KAAmB;AAEzD,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,MAAM,EAAA,GAAK,SAAA,CAAU,OAAA,CAAQ,OAAA,EAAS,MAAM,CAAA;AAC5C,MAAA,IAAA,CAAK,OAAA,EACD,aAAA,CAAc,CAAA,KAAA,EAAQ,GAAA,CAAI,OAAO,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA,EACxC,eAAe,EAAE,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,UAAU,CAAA;AAAA,IAC3D,GAAG,EAAE,CAAA;AAAA,EACP,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,aAAA,GAAsB,mBAAY,MAAM;AAC5C,IAAA,QAAA,CAAS,OAAA,EAAS,aAAA,CAAc,UAAU,CAAA,EAAG,KAAA,EAAM;AAAA,EACrD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAM,MAAA,CAAA,mBAAA;AAAA,IACJ,GAAA;AAAA,IACA,OAAO;AAAA,MACL,YAAA;AAAA,MACA,SAAA,EAAW,CAAC,MAAA,EAAQ,IAAA,GAAO,SAAS,SAAA,CAAU,WAAA,CAAY,QAAQ,IAAI,CAAA;AAAA,MACtE,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAA,KAAW;AAC5B,QAAA,SAAA,CAAU,WAAA,CAAY,QAAQ,IAAI,CAAA;AAClC,QAAA,SAAA,CAAU,YAAA,CAAa,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAC3C,QAAA,YAAA,CAAa,MAAM,CAAA;AAAA,MACrB,CAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,OAAA,EAAS,aAAA,EAAe,SAAS;AAAA,GAClD;AAEA,EAAA,MAAM,OAAA,GAAmC;AAAA,IACvC,IAAA,EAAM,IAAA;AAAA,IACN,QAAA,EAAU,QAAA;AAAA,IACV,IAAA;AAAA,IACA,KAAA,EAAO,aAAA;AAAA,IACP,GAAA;AAAA,IACA,SAAA,EAAW,OAAO,KAAA,CAAM,SAAA,KAAc,UAAA;AAAA,IACtC,WAAW,SAAA,CAAU,SAAA;AAAA,IACrB,aAAa,SAAA,CAAU,WAAA;AAAA,IACvB,QAAA,EAAU,CAAC,MAAA,EAAQ,IAAA,KAAS;AAC1B,MAAA,SAAA,CAAU,WAAA,CAAY,QAAQ,IAAI,CAAA;AAClC,MAAA,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAY,SAAA,CAAU,UAAA;AAAA,IACtB,cAAc,SAAA,CAAU,YAAA;AAAA,IACxB,QAAQ,SAAA,CAAU,MAAA;AAAA,IAClB,MAAM,SAAA,CAAU,SAAA;AAAA,IAChB,IAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,OAAA;AAAA,IACA,MAAA,EAAQ,IAAA;AAAA,IACR,QAAQ,MAAA,KAAW,MAAA,GAAY,CAAC,CAAC,KAAK,KAAA,GAAQ,MAAA;AAAA,IAC9C,OAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,uBACEb,GAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,KAAA,EAAO,OAAA,EAClC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,gBAAc,OAAA,EAAS,SAAA,EAAU,UAAA,EAC9C,QAAA,EAAA,OAAA,KAAY,KAAA,mBAAQA,GAAAA,CAAC,UAAA,EAAA,EAAY,GAAG,MAAA,EAAQ,CAAA,mBAAKA,GAAAA,CAAC,UAAA,EAAA,EAAY,GAAG,MAAA,EAAQ,GAC5E,CAAA,EACF,CAAA;AAEJ,CAAC;ACjIM,SAAS,eAAe,OAAA,EAAsE;AACnG,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUc,gBAAS,OAAO,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAgBA,cAAO,IAAI,CAAA;AACjC,EAAA,MAAM,WAAA,GAAoBA,MAAA,CAAA,MAAA,iBAAO,IAAI,GAAA,EAAsB,CAAA;AAC3D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,gBAAS,CAAC,CAAA;AAE9C,EAAA,MAAMC,IAAAA,GAAYD,MAAA,CAAA,WAAA,CAAY,CAAC,IAAA,KAA2B;AACxD,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,IAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,EACd,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAcA,MAAA,CAAA,WAAA;AAAA,IAClB,CAAC,KAAA,KACCC,IAAAA,CAAI,YAAA,CAAa,QAAQ,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;AAAA,IAC3E,CAACA,IAAG;AAAA,GACN;AAEA,EAAA,MAAM,GAAA,GAAYD,MAAA,CAAA,WAAA;AAAA,IAChB,OAAO,IAAA,KAA+C;AACpD,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,WAAA,CAAY,OAAA,CAAQ,IAAI,UAAU,CAAA;AAClC,MAAA,UAAA,CAAW,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACvB,MAAA,IAAI;AACF,QAAA,WAAA,MAAiB,SAAS,SAAA,CAAU,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA,EAAG;AAC5D,UAAA,IAAI,UAAA,CAAW,OAAO,OAAA,EAAS;AAC/B,UAAAC,IAAAA,CAAI,YAAA,CAAa,OAAA,CAAQ,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,QAC1C;AAAA,MACF,CAAA,SAAE;AACA,QAAA,WAAA,CAAY,OAAA,CAAQ,OAAO,UAAU,CAAA;AACrC,QAAA,UAAA,CAAW,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,MACzB;AACA,MAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAACA,IAAG;AAAA,GACN;AAEA,EAAA,MAAM,MAAA,GAAeD,MAAA,CAAA,WAAA,CAAY,CAAC,MAAA,KAAwB,GAAA,CAAI,MAAM,MAAM,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAClF,EAAA,MAAM,IAAA,GAAaA,MAAA,CAAA,WAAA;AAAA,IACjB,CAAC,MAAA,EAAqB,OAAA,KACpB,GAAA,CAAI,CAAC,MAAA,KAAW,UAAA,CAAW,MAAA,EAAQ,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,CAAC,CAAA;AAAA,IAC5D,CAAC,GAAG;AAAA,GACN;AAEA,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,KAAA,MAAW,CAAA,IAAK,WAAA,CAAY,OAAA,EAAS,CAAA,CAAE,KAAA,EAAM;AAC7C,IAAA,WAAA,CAAY,QAAQ,KAAA,EAAM;AAAA,EAC5B,CAAA;AAEA,EAAA,MAAM,IAAA,GAAaA,mBAAY,MAAM;AACnC,IAAA,QAAA,EAAS;AACT,IAAAC,IAAAA,CAAI,aAAa,OAAA,CAAQ,OAAA,EAAS,YAAY,OAAA,CAAQ,OAAO,CAAC,CAAC,CAAA;AAAA,EACjE,CAAA,EAAG,CAACA,IAAG,CAAC,CAAA;AAER,EAAA,MAAM,KAAA,GAAcD,MAAA,CAAA,WAAA;AAAA,IAClB,CAAC,IAAA,KAA2B;AAC1B,MAAA,QAAA,EAAS;AACT,MAAAC,KAAI,IAAI,CAAA;AAAA,IACV,CAAA;AAAA,IACA,CAACA,IAAG;AAAA,GACN;AAGA,EAAMD,iBAAU,MAAM,MAAM,QAAA,EAAS,EAAG,EAAE,CAAA;AAE1C,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,OAAA,GAAU,CAAA,EAAG,OAAA,EAAS,SAAA,CAAU,IAAI,CAAA,EAAE;AACpG;ACvFO,SAAS,gBAAgB,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,KAAI,EAAyB;AACtF,EAAA,MAAM,QAAA,GAAiBE,eAAQ,MAAM,eAAA,CAAgB,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAC1E,EAAA,MAAM,OAAO,YAAA,EAAa;AAC1B,EAAA,MAAM,CAAC,KAAK,CAAA,GAAUA,MAAA,CAAA,QAAA,CAAS,MAAM,GAAA,IAAO,IAAA,CAAK,KAAK,CAAA;AACtD,EAAA,MAAM,IAAA,GAAaA,mBAAY,CAAC,KAAA,KAA6B,UAAU,KAAK,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACxF,EAAA,MAAM,OAAA,GAAmC;AAAA,IACvC,IAAA,EAAM,EAAE,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,KAAA,EAAO,CAAC,IAAI,CAAA,EAAE;AAAA,IAC7C,QAAA,EAAU,QAAA;AAAA,IACV,IAAA;AAAA,IACA,KAAA,EAAO,aAAA;AAAA,IACP,KAAK,GAAA,IAAO,KAAA;AAAA,IACZ,SAAA,EAAW,KAAA;AAAA,IACX,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,QAAA,EAAU,CAAC,MAAA,EAAQ,IAAA,KAAS;AAC1B,MAAA,IAAA,CAAK,WAAA,CAAY,QAAQ,IAAI,CAAA;AAC7B,MAAA,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,SAAS,EAAC;AAAA,IACV,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,MAAM,IAAA,CAAK,SAAA;AAAA,IACX,IAAA,EAAM,MAAA;AAAA,IACN,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,cAAc,MAAM;AAAA,IAAC,CAAA;AAAA,IACrB,eAAe,MAAM;AAAA,IAAC,CAAA;AAAA,IACtB,aAAa,MAAM;AAAA,IAAC;AAAA,GACtB;AACA,EAAA,uBACEhB,GAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,OAAO,OAAA,EACjC,QAAA,EAAA,IAAA,CAAK,IAAA,KAAS,SAAA,mBACbA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,MAAK,MAAA,EAAQ,QAAA,EAAA,IAAA,CAAK,MAAK,CAAA,GACzC,IAAA,CAAK,IAAA,KAAS,KAAA,mBAChBA,GAAAA,CAAC,OAAA,EAAA,EAAQ,MAAY,QAAA,EAAU,QAAA,EAAU,SAAS,IAAA,EAAM,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,oBAE1EA,GAAAA,CAAC,aAAU,IAAA,EAAY,MAAA,EAAQ,OAAO,CAAA,EAE1C,CAAA;AAEJ;;;ACbO,IAAM,WAAA,GAAc;AAAA,EACzB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;;;AC3CA,IAAM,OAAA,GAAU,IAAI,GAAA,CAAYiB,SAAS,CAAA;AACzC,IAAM,SAAA,GAAY,IAAI,GAAA,CAAYC,YAAY,CAAA;AAC9C,IAAM,SAAA,GAAY,IAAI,GAAA,CAAY,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACzD,IAAM,QAAA,GAAW,IAAI,GAAA,CAAY,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACvD,IAAM,UAAA,GAAa,IAAI,GAAA,CAA+B,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,MAAM,CAAC,CAAC,CAAA;AAE3F,IAAM,UAAA,uBAAiB,GAAA,CAAI,CAAC,WAAW,UAAA,EAAY,SAAA,EAAW,YAAA,EAAc,SAAS,CAAC,CAAA;AACtF,IAAM,aAAA,mBAAgB,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,WAAW,UAAA,EAAY,QAAA,EAAU,OAAA,EAAS,SAAS,CAAC,CAAA;AAC9F,IAAM,WAAA,mBAAc,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,QAAA,EAAU,SAAA,EAAW,UAAA,EAAY,SAAS,CAAC,CAAA;AAEtG,IAAM,MAAA,GAAS,CAAC,KAAA,KAAmB,KAAA,KAAU,MAAA,KAAc,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AAMtH,IAAM,OAAA,GAAsD;AAAA,EAC1D,OAAO,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA,CAAE,UAAU,KAAA,EAAO,MAAA;AAAA,EACnC,QAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,EAAE,QAAA,EAAU,MAAA;AAAA,EAC7B,QAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA,CAAE,UAAU,OAAA,EAAS,MAAA;AAAA,EACtC,OAAO,CAAC,CAAA,KAAM,CAAC,CAAC,EAAE,KAAA,EAAO;AAC3B,CAAA;AAGA,IAAM,2BAAW,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,WAAW,CAAC,CAAA;AAEnD,SAAS,YAAA,CAAa,MAAkB,MAAA,EAA2B;AACjE,EAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAC5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACf,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAY,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAC9D,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAI,CAAA;AAC5B,IAAA,MAAM,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAA,CAAQ,IAAI,IAAI,CAAA;AACtD,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,KAAA,EAAO,SAAA;AAAA,QACP,MAAM,IAAA,CAAK,EAAA;AAAA,QACX,OAAA,EAAS,CAAA,SAAA,EAAY,IAAA,CAAK,OAAO,cAAc,IAAI,CAAA,mCAAA;AAAA,OACpD,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,IAAI,CAAC,SAAS,QAAA,CAAS,IAAI,KAAK,CAAC,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AACnD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,KAAA,EAAO,SAAA;AAAA,QACP,MAAM,IAAA,CAAK,EAAA;AAAA,QACX,OAAA,EAAS,CAAA,OAAA,EAAU,IAAI,CAAA,0BAAA,EAA6B,KAAK,OAAO,CAAA,EAAA;AAAA,OACjE,CAAA;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,QAAA,CAAS,IAAA,EAAwB,OAAA,GAA2B,EAAC,EAAsB;AACjG,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,EAAiB,IAAA,KAAkB,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,CAAA;AAC/F,EAAA,MAAM,IAAA,mBAAO,IAAI,GAAA,CAAI,CAAC,GAAG,OAAA,EAAS,GAAI,OAAA,CAAQ,SAAA,IAAa,EAAG,CAAC,CAAA;AAC/D,EAAA,MAAM,MAAA,mBAAS,IAAI,GAAA,CAAI,CAAC,GAAG,SAAA,EAAW,GAAI,OAAA,CAAQ,WAAA,IAAe,EAAG,CAAC,CAAA;AAErE,EAAA,IAAI,OAAO,MAAM,EAAA,KAAO,QAAA,IAAY,CAAC,IAAA,CAAK,EAAA,QAAU,6BAA6B,CAAA;AACjF,EAAA,IAAI,IAAA,EAAM,YAAY,MAAA,KAAc,OAAO,KAAK,OAAA,KAAY,QAAA,IAAY,CAAC,IAAA,CAAK,OAAA,CAAA,EAAU;AACtF,IAAA,KAAA,CAAM,+CAA+C,CAAA;AAAA,EACvD;AACA,EAAA,MAAM,QAAA,GAAW,IAAA,EAAM,QAAA,EAAU,QAAA,IAAY,EAAC;AAC9C,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,CAAC,OAAA,EAAS,EAAA,EAAI,KAAA,CAAM,+BAA+B,CAAA;AAAA,SAAA,IAC9C,UAAA,CAAW,IAAI,OAAA,CAAQ,EAAE,GAAG,KAAA,CAAM,CAAA,qBAAA,EAAwB,OAAA,CAAQ,EAAE,CAAA,gBAAA,CAAkB,CAAA;AAAA,SAC1F,UAAA,CAAW,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA;AAC9B,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS,MAAA,QAAc,CAAA,kBAAA,EAAqB,OAAA,EAAS,EAAE,CAAA,iBAAA,CAAmB,CAAA;AAAA,SAAA,IAC/E,OAAA,CAAQ,OAAA,KAAY,MAAA,IAAa,CAAC,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnG,MAAA,KAAA,CAAM,qBAAqB,OAAA,CAAQ,EAAE,CAAA,eAAA,EAAkB,OAAA,CAAQ,OAAO,CAAA,mCAAA,CAAqC,CAAA;AAAA,IAC7G;AAAA,EACF;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,EAAG;AAC/B,IAAA,KAAA,CAAM,sCAAsC,CAAA;AAC5C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,IAAA,MAAM,KAAK,OAAO,IAAA,EAAM,EAAA,KAAO,QAAA,GAAW,KAAK,EAAA,GAAK,MAAA;AACpD,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,KAAA,CAAM,mBAAmB,CAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,IAAI,EAAE,CAAA,QAAS,CAAA,SAAA,EAAY,EAAE,oBAAoB,EAAE,CAAA;AAC5D,IAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AAEX,IAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,MAAA,IAAI,OAAO,KAAK,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,CAAK,IAAA,EAAM,KAAA,CAAM,8BAAA,EAAgC,EAAE,CAAA;AACzF,MAAA,IAAI,MAAA,CAAO,KAAK,EAAE,CAAA,QAAS,CAAA,IAAA,EAAO,IAAA,CAAK,EAAE,CAAA,qBAAA,CAAA,EAAyB,EAAE,CAAA;AACpE,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC7B,MAAA,KAAA,CAAM,CAAA,cAAA,EAAkB,IAAA,CAA2B,IAAI,CAAA,EAAA,CAAA,EAAM,EAAE,CAAA;AAC/D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,MAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,EAAG,KAAA,CAAM,CAAA,eAAA,EAAkB,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA,EAAM,EAAE,CAAA;AAC1E,MAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,EAAG,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA,EAAM,EAAE,CAAA;AAC/E,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA,EAAG,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAA,CAAK,GAAA,EAAK,IAAI,MAAM,EAAE,CAAA;AACjF,MAAA,IAAI,IAAA,CAAK,UAAA,KAAe,MAAA,IAAa,MAAA,CAAO,KAAA,CAAM,KAAK,KAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA,EAAG;AAC9E,QAAA,KAAA,CAAM,CAAA,YAAA,EAAe,IAAA,CAAK,UAAU,CAAA,qBAAA,CAAA,EAAyB,EAAE,CAAA;AAAA,MACjE;AACA,MAAA,IAAI,IAAA,CAAK,GAAA,EAAK,IAAA,KAAS,WAAA,EAAa;AAClC,QAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,IAAS,EAAC,EAAG;AACvC,UAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAA,CAAK,IAAI,CAAA,WAAA,EAAc,IAAA,CAAK,EAAE,MAAM,EAAE,CAAA;AAAA,QAC9F;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,EAAG,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA,EAAM,EAAE,CAAA;AACrF,MAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,CAAC,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,KAAA,CAAM,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAI,MAAM,EAAE,CAAA;AACnF,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,CAAC,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,EAAG,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAA,CAAK,OAAO,MAAM,EAAE,CAAA;AACjG,MAAA,IAAI,MAAA,CAAO,KAAK,EAAE,CAAA,QAAS,CAAA,IAAA,EAAO,IAAA,CAAK,EAAE,CAAA,qBAAA,CAAA,EAAyB,EAAE,CAAA;AACpE,MAAA,IAAI,MAAA,CAAO,KAAK,SAAS,CAAA,QAAS,CAAA,WAAA,EAAc,IAAA,CAAK,SAAS,CAAA,qBAAA,CAAA,EAAyB,EAAE,CAAA;AACzF,MAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG;AACnC,QAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA,EAAG,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAA,EAAM,KAAK,CAAA,MAAA,EAAS,IAAA,EAAM,KAAK,MAAM,EAAE,CAAA;AACvG,QAAA,IAAI,MAAA,CAAO,IAAA,EAAM,SAAS,CAAA,EAAG,KAAA,CAAM,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,SAAS,CAAA,qBAAA,CAAA,EAAyB,EAAE,CAAA;AAC/G,QAAA,IAAI,MAAM,EAAA,EAAI;AACZ,UAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,QAAS,CAAA,SAAA,EAAY,IAAA,CAAK,EAAE,CAAA,gBAAA,CAAA,EAAoB,EAAE,CAAA;AACzE,UAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,QACrB;AAAA,MACF;AACA,MAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,EAAS,OAAA,IAAW,EAAC,EAAG;AAChD,QAAA,IAAI,CAAC,QAAQ,EAAA,IAAM,CAAC,OAAO,KAAA,EAAO,KAAA,CAAM,yCAAyC,EAAE,CAAA;AAAA,MACrF;AACA,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AAC/B,QAAA,KAAA,CAAM,kCAAkC,EAAE,CAAA;AAC1C,QAAA;AAAA,MACF;AACA,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,QAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,IAAI,CAAA,EAAG,KAAA,CAAM,CAAA,eAAA,EAAkB,KAAA,EAAO,IAAI,CAAA,EAAA,CAAA,EAAM,EAAE,CAAA;AAAA,aAAA,IAChE,KAAA,CAAM,QAAQ,OAAA,EAAS;AAC9B,UAAA,KAAA,CAAM,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,qDAAA,EAAwD,KAAA,CAAM,SAAS,OAAA,GAAU,CAAA,gBAAA,CAAA,GAAqB,UAAU,CAAA,CAAA,CAAA,EAAK,EAAE,CAAA;AAAA,QAC7I;AACA,QAAA,IAAI,KAAA,EAAO,WAAW,MAAA,IAAa,KAAA,CAAM,WAAW,SAAA,IAAa,KAAA,CAAM,WAAW,OAAA,EAAS;AACzF,UAAA,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAA,CAAM,MAAgB,CAAA,EAAA,CAAA,EAAM,EAAE,CAAA;AAAA,QAC/D;AACA,QAAA,IAAI,KAAA,EAAO,MAAA,KAAW,OAAA,IAAW,CAAC,MAAM,SAAA,EAAW;AACjD,UAAA,KAAA,CAAM,CAAA,UAAA,EAAa,KAAA,CAAM,IAAI,CAAA,kDAAA,CAAA,EAAsD,EAAE,CAAA;AAAA,QACvF;AAAA,MACF;AACA,MAAA,YAAA,CAAa,MAAM,MAAM,CAAA;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,CAAA,6BAAA,EAAiC,IAAA,CAA2B,IAAI,CAAA,EAAA,CAAA,EAAM,EAAE,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["import { BLOCK_RENDERERS, type BlockSpec as SharedBlockSpec, type PageSpec } from \"@invana/blocks\"\n\nimport type { AnswerTurn } from \"../protocol/types\"\n\n/**\n * An answer opened as a page: the blocks `@invana/blocks` draws, in order,\n * under the answer's title. What only a conversation shows — citations,\n * caveats, the trace — stays in the thread.\n */\nexport function answerToPage(turn: AnswerTurn): PageSpec {\n // Drawn only: a kind with a renderer, and data that has arrived — not still\n // loading, and not empty (a page has no room for the thread's empty line).\n const blocks = turn.blocks.filter(\n (b) =>\n BLOCK_RENDERERS[b.kind as keyof typeof BLOCK_RENDERERS] != null &&\n b.status !== \"loading\" &&\n b.status !== \"empty\",\n ) as unknown as SharedBlockSpec[]\n return { title: turn.title, sections: [{ blocks }] }\n}\n","import {\n CitationMarker as UiCitationMarker,\n EmissionBody as UiEmissionBody,\n EmissionCard as UiEmissionCard,\n EmissionHeader as UiEmissionHeader,\n TemplatePicker as UiTemplatePicker,\n} from \"@invana/ui\"\n\n/*\n * The answer card and what hangs off it, moving from `@invana/ui`; see\n * `conversations/thread.ts` for why they are re-declared.\n */\n\n/** The answer card. An answer is its blocks inside this card. */\nexport const EmissionCard = UiEmissionCard\n/** The card's body: its blocks in one padded column. */\nexport const EmissionBody = UiEmissionBody\n/** The strip that says what an answer is and what it is grounded in. */\nexport const EmissionHeader = UiEmissionHeader\n/** The superscript that ties a clause to the records behind it. */\nexport const CitationMarker = UiCitationMarker\n/** Re-render the same records as another block. */\nexport const TemplatePicker = UiTemplatePicker\n\nexport type {\n EmissionCardProps,\n EmissionHeaderProps,\n EmissionKind,\n TemplateOption,\n TemplatePickerProps,\n} from \"@invana/ui\"\n\nexport { answerToPage } from \"./page\"\n","import {\n ChatSession as UiChatSession,\n ChatSessionActivityRow as UiChatSessionActivityRow,\n ChatSessionActivitySubLine as UiChatSessionActivitySubLine,\n ChatSessionComposer as UiChatSessionComposer,\n ChatSessionContextChip as UiChatSessionContextChip,\n ChatSessionCaret as UiChatSessionCaret,\n ChatSessionDisclosure as UiChatSessionDisclosure,\n ChatSessionDisclosureCode as UiChatSessionDisclosureCode,\n ChatSessionDisclosureSteps as UiChatSessionDisclosureSteps,\n ChatSessionMessage as UiChatSessionMessage,\n ChatSessionMessageOptions as UiChatSessionMessageOptions,\n ChatSessionProgressLine as UiChatSessionProgressLine,\n ChatSessionPromptRow as UiChatSessionPromptRow,\n ChatSessionStatusBar as UiChatSessionStatusBar,\n ChatSessionTaskGroup as UiChatSessionTaskGroup,\n ChatSessionTaskRow as UiChatSessionTaskRow,\n chatSessionGutterClass as uiChatSessionGutterClass,\n} from \"@invana/ui\"\n\n/*\n * The thread parts, moving from `@invana/ui` to here (Assistant Package RFC,\n * migration step 2). For one release the source stays in ui, marked\n * `@deprecated` there, and these are re-declared rather than re-exported so the\n * deprecation does not follow the import. The next release moves the source\n * into this folder; the names and props do not change.\n */\n\n/**\n * The frame a session is drawn in: a scrolling stack that sticks to the\n * latest, with a fixed footer. `ChatSession` is the conversation itself, drawn\n * from JSON; this is only its layout.\n */\nexport const ChatSessionFrame = UiChatSession\n/** The assistant's turn, with running, stopped, error and idle states. */\nexport const ChatSessionMessage = UiChatSessionMessage\n/** Actions under a message: copy, retry, rate. */\nexport const ChatSessionMessageOptions = UiChatSessionMessageOptions\n/** Prompt input with start and end slots, and send or stop. */\nexport const ChatSessionComposer = UiChatSessionComposer\n/** A console row with the shared gutter glyph. */\nexport const ChatSessionActivityRow = UiChatSessionActivityRow\n/** The indented line under an activity row. */\nexport const ChatSessionActivitySubLine = UiChatSessionActivitySubLine\n/** The gutter every console row shares, so bodies line up. */\nexport const chatSessionGutterClass = uiChatSessionGutterClass\n/** The analyst's turn, on the shared gutter. */\nexport const ChatSessionPromptRow = UiChatSessionPromptRow\n/** One-line status while work is in flight. */\nexport const ChatSessionProgressLine = UiChatSessionProgressLine\n/** The cursor at the end of text still being written. */\nexport const ChatSessionCaret = UiChatSessionCaret\n/** Collapsible detail under a row: query, preview, context. */\nexport const ChatSessionDisclosure = UiChatSessionDisclosure\n/** The code a disclosure opens onto, keywords marked, when it opens onto more than code. */\nexport const ChatSessionDisclosureCode = UiChatSessionDisclosureCode\n/** A method of several steps, numbered, each with its count or time. */\nexport const ChatSessionDisclosureSteps = UiChatSessionDisclosureSteps\n/** A background task with its lifecycle. */\nexport const ChatSessionTaskRow = UiChatSessionTaskRow\n/** A group of background tasks under one heading. */\nexport const ChatSessionTaskGroup = UiChatSessionTaskGroup\n/** Slim bar under the composer: mode, counts, hints. */\nexport const ChatSessionStatusBar = UiChatSessionStatusBar\n/** What the next question is about, bound from a selection. */\nexport const ChatSessionContextChip = UiChatSessionContextChip\n\nexport type { ChatSessionProps as ChatSessionFrameProps } from \"@invana/ui\"\nexport type {\n ChatSessionMessageProps,\n ChatSessionMessageRole,\n ChatSessionMessageStatus,\n ChatSessionMessageAction,\n ChatSessionMessageOptionsProps,\n ChatSessionComposerProps,\n ChatSessionActivityRowProps,\n ChatSessionActivityStatus,\n ChatSessionActivitySubLineProps,\n ChatSessionPromptRowProps,\n ChatSessionProgressLineProps,\n ChatSessionDisclosureProps,\n ChatSessionDisclosureStepsProps,\n ChatSessionTaskRowProps,\n ChatSessionTaskGroupProps,\n ChatSessionTaskStatus,\n ChatSessionStatusBarProps,\n ChatSessionContextChipProps,\n} from \"@invana/ui\"\n","import * as React from \"react\"\n\n/*\n * Which source the reader is on, per answer. A marker in the prose and a row in\n * the citations are separate blocks, so they meet here, keyed by the turn: point\n * at marker 2 and row 2 lights with it.\n */\nconst focus = new Map<string, number | undefined>()\nconst listeners = new Set<() => void>()\n\nfunction set(turn: string, n: number | undefined) {\n if (focus.get(turn) === n) return\n focus.set(turn, n)\n listeners.forEach((l) => l())\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\n\n/** The source lit in this answer: the one pointed at, else the one the spec names. */\nexport function useCiteFocus(turn: string, initial?: number): [number | undefined, (n: number | undefined) => void] {\n const pointed = React.useSyncExternalStore(\n subscribe,\n () => focus.get(turn),\n () => undefined,\n )\n return [pointed ?? initial, (n) => set(turn, n)]\n}\n","import type * as React from \"react\"\nimport {\n ANSWER_KINDS,\n ASK_KINDS,\n BLOCK_RENDERERS,\n CitationsBlock,\n NarrativeBlock,\n ScopeBlock,\n type AnswerKind,\n type AskKind,\n type BlockProps,\n} from \"@invana/blocks\"\n\nimport { EmissionBody, EmissionCard } from \".\"\nimport type {\n AskRenderer,\n AskRendererProps,\n AskRegistry,\n BlockRegistry,\n BlockRenderer,\n BlockRendererProps,\n} from \"../conversations/registry\"\nimport { ChatSessionCaret } from \"../conversations/thread\"\nimport type { ConversationEvent } from \"../protocol/events\"\nimport { useCiteFocus } from \"./blocks/cite-focus\"\n\n/**\n * A block's action, as the conversation event it means on this turn. A block\n * names what the reader did; only the conversation knows the turn it was on.\n */\nfunction toEvent(turn: string, action: string, value: unknown, block: number): ConversationEvent | undefined {\n switch (action) {\n case \"reply\":\n return { type: \"reply\", turn, value }\n case \"change\":\n return { type: \"change\", turn, value }\n case \"skip\":\n return { type: \"skip\", turn }\n case \"prompt\":\n return { type: \"prompt\", text: String(value) }\n case \"scope\": {\n const edit = value as { part?: number; value?: unknown } | undefined\n return typeof edit?.part === \"number\" ? { type: \"scope\", turn, part: edit.part, value: edit.value } : undefined\n }\n case \"open\":\n // Only a block in the answer's own list can be opened; an envelope's has no index.\n return block >= 0 ? { type: \"open\", turn, block } : undefined\n case \"action\":\n // An action the spec declares, by its own id.\n return { type: \"action\", turn, action: String(value) }\n default:\n // One the block names — `select` with a row's key, `download` with a file.\n return value === undefined ? { type: \"action\", turn, action } : { type: \"action\", turn, action, value }\n }\n}\n\n/** A block in an answer, drawn from `@invana/blocks`. */\nfunction answerBlock<K extends AnswerKind>(kind: K): BlockRenderer<K> {\n const Renderer = BLOCK_RENDERERS[kind] as React.ComponentType<BlockProps<K>>\n function AnswerBlock({ turn, block, onEvent }: BlockRendererProps<K>) {\n const index = (turn.blocks as unknown[]).indexOf(block)\n return (\n <Renderer\n // The same map, indexed generically: TypeScript cannot see AnswerOptionsByKind[K] is BlockOptionsByKind[K].\n spec={block as unknown as BlockProps<K>[\"spec\"]}\n // An answer is running text: its tables sit flush with the sentences.\n seamless\n onAction={(action, value) => {\n const event = toEvent(turn.id, action, value, index)\n if (event) onEvent(event)\n }}\n />\n )\n }\n AnswerBlock.displayName = `Answer(${kind})`\n return AnswerBlock\n}\n\n/** A block in an ask, drawn from `@invana/blocks`: the turn's state and value, and its replies. */\nfunction askBlock<K extends AskKind>(kind: K): AskRenderer<K> {\n const Renderer = BLOCK_RENDERERS[kind] as React.ComponentType<BlockProps<K>>\n function AskBlock({ turn, options, onEvent }: AskRendererProps<K>) {\n return (\n <Renderer\n spec={options as unknown as BlockProps<K>[\"spec\"]}\n state={turn.state}\n value={turn.value}\n id={turn.id}\n seamless\n onAction={(action, value) => {\n const event = toEvent(turn.id, action, value, -1)\n if (event) onEvent(event)\n }}\n />\n )\n }\n AskBlock.displayName = `Ask(${kind})`\n return AskBlock\n}\n\n/**\n * The narrative, with what only a conversation has: the source lit across the\n * answer's blocks, and the caret while the answer is still being written.\n */\nfunction NarrativeAnswer({ block, turn }: BlockRendererProps<\"narrative\">) {\n const [active, setActive] = useCiteFocus(turn.id, block.active)\n const writing = turn.state === \"running\" && turn.blocks[turn.blocks.length - 1] === block\n return (\n <NarrativeBlock\n spec={block}\n active={active}\n onActiveChange={setActive}\n trailing={writing ? <ChatSessionCaret /> : null}\n />\n )\n}\n\n/** The citations, with the row the prose's marker points at lit. */\nfunction CitationsAnswer({ block, turn }: BlockRendererProps<\"citations\">) {\n const [active] = useCiteFocus(turn.id, block.active)\n return <CitationsBlock spec={block} active={active} />\n}\n\n/** The scope, with the envelope's freshness fixed: a fact about the data, not a choice. */\nfunction ScopeAnswer({ block, turn, onEvent }: BlockRendererProps<\"scope\">) {\n const fromEnvelope = !(turn.blocks as unknown[]).includes(block)\n const fixed = fromEnvelope && turn.envelope?.freshness ? [block.parts.length - 1] : undefined\n return (\n <ScopeBlock\n spec={block}\n fixed={fixed}\n onAction={(action, value) => {\n const event = toEvent(turn.id, action, value, -1)\n if (event) onEvent(event)\n }}\n />\n )\n}\n\n/** A proposal, in a card of its own under the answer: something to approve, not evidence. */\nconst ProposalBody = answerBlock(\"proposal\")\nfunction ProposalAnswer(props: BlockRendererProps<\"proposal\">) {\n return (\n <EmissionCard kind=\"proposal\" title={props.block.title} citation={props.block.done?.at}>\n <EmissionBody>\n <ProposalBody {...props} />\n </EmissionBody>\n </EmissionCard>\n )\n}\n\nconst ANSWER_WRAPPERS: Partial<{ [K in AnswerKind]: BlockRenderer<K> }> = {\n narrative: NarrativeAnswer,\n citations: CitationsAnswer,\n scope: ScopeAnswer,\n proposal: ProposalAnswer,\n}\n\n/** Every kind an answer can hold: its block from `@invana/blocks`, or `null` when none is built yet. */\nexport const ANSWER_RENDERERS = Object.fromEntries(\n ANSWER_KINDS.map((kind) => [kind, BLOCK_RENDERERS[kind] ? (ANSWER_WRAPPERS[kind] ?? answerBlock(kind)) : null]),\n) as BlockRegistry\n\n/** Every kind an ask can hold, the same way. */\nexport const ASK_RENDERERS = Object.fromEntries(\n ASK_KINDS.map((kind) => [kind, BLOCK_RENDERERS[kind] ? askBlock(kind) : null]),\n) as AskRegistry\n","import type * as React from \"react\"\n\nimport { ANSWER_RENDERERS, ASK_RENDERERS } from \"../answers/shared\"\nimport type { AnswerKind, AskKind } from \"@invana/blocks\"\nimport type { ConversationEvent } from \"../protocol/events\"\nimport type {\n AnswerTurn,\n AskOptionsByKind,\n AskTurn,\n BlockBase,\n AnswerOptionsByKind,\n} from \"../protocol/types\"\n\nexport interface AskRendererProps<P extends AskKind = AskKind> {\n turn: AskTurn\n /** The ask's options, already narrowed to its block. */\n options: AskOptionsByKind[P]\n onEvent: (event: ConversationEvent) => void\n}\n\nexport interface BlockRendererProps<P extends AnswerKind = AnswerKind> {\n turn: AnswerTurn\n /** The block's options, already narrowed to its block. */\n block: BlockBase & AnswerOptionsByKind[P]\n onEvent: (event: ConversationEvent) => void\n}\n\n// `any`, as in the board's registry: a registry holds renderers for many\n// option shapes, and one typed on its own options is not assignable to `unknown`.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AskRenderer<P extends AskKind = any> = React.ComponentType<AskRendererProps<P>>\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type BlockRenderer<P extends AnswerKind = any> = React.ComponentType<BlockRendererProps<P>>\n\n/**\n * Every block the grammar names, and what renders it. `null` is a block\n * not built yet: it renders as a labelled placeholder, so the number of `null`s\n * is the work left and a session story shows exactly where.\n *\n * Keyed by the grammar's ids, so a block added to the grammar and not here is\n * a compile error, and `grammar.test.ts` checks the same at runtime.\n */\nexport type AskRegistry = { [P in AskKind]: AskRenderer<P> | null }\nexport type BlockRegistry = { [P in AnswerKind]: BlockRenderer<P> | null }\n\nexport const BUILT_IN_ASKS: AskRegistry = ASK_RENDERERS\n\nexport const BUILT_IN_BLOCKS: BlockRegistry = ANSWER_RENDERERS\n\n/**\n * How an ask sits in the thread, apart from what its renderer draws.\n *\n * `frame: \"card\"` draws it in the ask card, with its state, the stage that\n * asked and when it was answered; `\"none\"` draws the renderer alone — chips\n * that show their own pick. `kind` is the card's header word while it waits.\n */\nexport interface AskTraits {\n frame?: \"card\" | \"none\"\n kind?: string\n}\n\n/**\n * How a block sits in an answer. `\"card\"` is inside the answer card with the\n * rest of the evidence; `\"own\"` is a card of its own under it — a proposal is\n * something to approve, not part of the evidence.\n */\nexport interface BlockTraits {\n placement?: \"card\" | \"own\"\n}\n\n/** Traits of the built-in blocks; every block not named takes the defaults. */\nexport const BUILT_IN_ASK_TRAITS: Partial<Record<string, AskTraits>> = {\n suggestions: { frame: \"none\" },\n confirm: { kind: \"confirm\" },\n approval: { kind: \"proposal\" },\n}\nexport const BUILT_IN_BLOCK_TRAITS: Partial<Record<string, BlockTraits>> = {\n proposal: { placement: \"own\" },\n}\n\n/**\n * Renderers a consumer adds or replaces — `{ blocks: { subgraph: CanvasBlock } }`\n * — with their traits. Consumer entries win over the built-ins, as in the\n * board, so a template of your own sits in the thread exactly as you say.\n */\nexport interface RegistryOverrides {\n asks?: Partial<Record<string, AskRenderer>>\n blocks?: Partial<Record<string, BlockRenderer>>\n askTraits?: Partial<Record<string, AskTraits>>\n blockTraits?: Partial<Record<string, BlockTraits>>\n}\n\nexport interface ResolvedRegistry {\n asks: Record<string, AskRenderer | null | undefined>\n blocks: Record<string, BlockRenderer | null | undefined>\n askTraits: (kind: string) => Required<Pick<AskTraits, \"frame\">> & AskTraits\n blockTraits: (kind: string) => Required<BlockTraits>\n}\n\nexport function resolveRegistry(extra?: RegistryOverrides): ResolvedRegistry {\n const askTraits = { ...BUILT_IN_ASK_TRAITS, ...extra?.askTraits }\n const blockTraits = { ...BUILT_IN_BLOCK_TRAITS, ...extra?.blockTraits }\n return {\n asks: { ...BUILT_IN_ASKS, ...extra?.asks },\n blocks: { ...BUILT_IN_BLOCKS, ...extra?.blocks },\n askTraits: (kind) => ({ frame: \"card\", ...askTraits[kind] }),\n blockTraits: (kind) => ({ placement: \"card\", ...blockTraits[kind] }),\n }\n}\n\n// ── the options maps must name exactly the grammar's blocks ────────────────\n\ntype Same<A, B> = [A] extends [B] ? ([B] extends [A] ? true : false) : false\nconst askOptionsMatchGrammar: Same<keyof AskOptionsByKind, AskKind> = true\nconst blockOptionsMatchGrammar: Same<keyof AnswerOptionsByKind, AnswerKind> = true\nvoid askOptionsMatchGrammar\nvoid blockOptionsMatchGrammar\n","import { applyBlockPatch, type BlockPatch, BlockPatchError } from \"@invana/blocks\"\n\nimport type {\n AnswerState,\n AnswerTurn,\n AskState,\n BlockSpec,\n ConversationSpec,\n TraceStep,\n Turn,\n} from \"./types\"\n\n/**\n * How a spec changes while an answer streams. The API sends one of these at a\n * time; {@link applyPatch} returns a new spec and never mutates the old one, so\n * a controlled `<ChatSession spec>` re-renders exactly what changed.\n */\nexport type ConversationPatch =\n | { op: \"add-turn\"; turn: Turn }\n /** Move a turn through its states. An answered ask carries its `value`. */\n | { op: \"set-state\"; turn: string; state: AskState | AnswerState; value?: unknown }\n | { op: \"add-block\"; turn: string; block: BlockSpec }\n /**\n * Stream a block: one {@link BlockPatch} — the same patch a board or a page\n * streams the block by. `block` is its index, the last block when left out.\n */\n | { op: \"patch-block\"; turn: string; block?: number; patch: BlockPatch }\n /** Change a block in place — its rows arriving, a loading block settling. `block` is its index. A `set` block patch. */\n | { op: \"update-block\"; turn: string; block: number; fields: Record<string, unknown> }\n /**\n * Stream words into a block: `text` is appended to its string `field`\n * (default `text`). `block` is its index, the last block when left out — so\n * a stream sends `add-block` with the field empty, then its words. An\n * `append` block patch.\n */\n | { op: \"append-text\"; turn: string; text: string; block?: number; field?: string }\n | { op: \"add-trace-step\"; turn: string; step: TraceStep }\n /** Change a step in place, by id — its detail counting up, its state settling. */\n | { op: \"update-trace-step\"; turn: string; step: string; fields: Partial<TraceStep> }\n /** Stream a step's reasoning: `text` is appended to its `thinking`. */\n | { op: \"append-thinking\"; turn: string; step: string; text: string }\n /** Anything else on a turn — its envelope once known, its outcome, its duration. */\n | { op: \"update-turn\"; turn: string; fields: Record<string, unknown> }\n /** A model's record count, as it changes — the live count behind the header's data reach. */\n | { op: \"set-records\"; model: string; records: number }\n /** The conversation's own fields — its title, its composer. Never its turns. */\n | { op: \"update-spec\"; fields: Partial<Omit<ConversationSpec, \"id\" | \"turns\">> }\n\nexport type ConversationPatchOp = ConversationPatch[\"op\"]\n\nexport class PatchError extends Error {}\n\nfunction onTurn(spec: ConversationSpec, id: string, fn: (turn: Turn) => Turn): ConversationSpec {\n const index = spec.turns.findIndex((t) => t.id === id)\n if (index < 0) throw new PatchError(`No turn \"${id}\" in conversation \"${spec.id}\".`)\n const turns = spec.turns.slice()\n turns[index] = fn(turns[index])\n return { ...spec, turns }\n}\n\nfunction asAnswer(turn: Turn, op: string): AnswerTurn {\n if (turn.role !== \"assistant\" || turn.kind !== \"answer\") {\n throw new PatchError(`\"${op}\" applies to an answer; turn \"${turn.id}\" is not one.`)\n }\n return turn\n}\n\nfunction onStep(answer: AnswerTurn, id: string, op: string, fn: (step: TraceStep) => TraceStep): AnswerTurn {\n const trace = answer.trace ?? []\n const at = trace.findIndex((s) => s.id === id)\n if (at < 0) throw new PatchError(`\"${op}\": no step \"${id}\" on turn \"${answer.id}\".`)\n return { ...answer, trace: trace.map((s, i) => (i === at ? fn(s) : s)) }\n}\n\n/** Block `index` of an answer (the last when left out) after a block patch — the one way a block changes. */\nfunction patchBlock(answer: AnswerTurn, op: string, index: number | undefined, patch: BlockPatch): AnswerTurn {\n const at = index ?? answer.blocks.length - 1\n const block = answer.blocks[at]\n if (!block) throw new PatchError(`\"${op}\": turn \"${answer.id}\" has no block ${at}.`)\n const blocks = answer.blocks.slice()\n try {\n blocks[at] = applyBlockPatch(block, patch)\n } catch (error) {\n if (error instanceof BlockPatchError) {\n throw new PatchError(`\"${op}\": block ${at} on turn \"${answer.id}\": ${error.message}`)\n }\n throw error\n }\n return { ...answer, blocks }\n}\n\nexport function applyPatch(spec: ConversationSpec, patch: ConversationPatch): ConversationSpec {\n switch (patch.op) {\n case \"add-turn\":\n if (spec.turns.some((t) => t.id === patch.turn.id)) {\n throw new PatchError(`Turn \"${patch.turn.id}\" already exists.`)\n }\n return { ...spec, turns: [...spec.turns, patch.turn] }\n case \"set-state\":\n return onTurn(spec, patch.turn, (turn) => {\n if (turn.role !== \"assistant\") throw new PatchError(`Turn \"${turn.id}\" has no state.`)\n if (turn.kind === \"ask\") {\n return {\n ...turn,\n state: patch.state as AskState,\n ...(patch.value !== undefined ? { value: patch.value } : {}),\n }\n }\n return { ...turn, state: patch.state as AnswerState }\n })\n case \"add-block\":\n return onTurn(spec, patch.turn, (turn) => {\n const answer = asAnswer(turn, patch.op)\n return { ...answer, blocks: [...answer.blocks, patch.block] }\n })\n case \"patch-block\":\n return onTurn(spec, patch.turn, (turn) => patchBlock(asAnswer(turn, patch.op), patch.op, patch.block, patch.patch))\n case \"update-block\":\n return onTurn(spec, patch.turn, (turn) =>\n patchBlock(asAnswer(turn, patch.op), patch.op, patch.block, { op: \"set\", fields: patch.fields }),\n )\n case \"append-text\":\n return onTurn(spec, patch.turn, (turn) =>\n patchBlock(asAnswer(turn, patch.op), patch.op, patch.block, { op: \"append\", at: [patch.field ?? \"text\"], text: patch.text }),\n )\n case \"add-trace-step\":\n return onTurn(spec, patch.turn, (turn) => {\n const answer = asAnswer(turn, patch.op)\n const trace = answer.trace ?? []\n // A step with a known id replaces itself — `running` settling to `done`.\n const at = patch.step.id ? trace.findIndex((s) => s.id === patch.step.id) : -1\n const next = at >= 0 ? trace.map((s, i) => (i === at ? patch.step : s)) : [...trace, patch.step]\n return { ...answer, trace: next }\n })\n case \"update-trace-step\":\n return onTurn(spec, patch.turn, (turn) =>\n onStep(asAnswer(turn, patch.op), patch.step, patch.op, (s) => ({ ...s, ...patch.fields, id: s.id })),\n )\n case \"append-thinking\":\n return onTurn(spec, patch.turn, (turn) =>\n onStep(asAnswer(turn, patch.op), patch.step, patch.op, (s) => ({\n ...s,\n thinking: (s.thinking ?? \"\") + patch.text,\n })),\n )\n case \"update-turn\":\n return onTurn(spec, patch.turn, (turn) => ({ ...turn, ...patch.fields, id: turn.id }) as Turn)\n case \"set-records\": {\n const models = spec.access?.models ?? []\n if (!spec.access || !models.some((m) => m.id === patch.model)) {\n throw new PatchError(`\"set-records\": no model \"${patch.model}\" in conversation \"${spec.id}\".`)\n }\n return {\n ...spec,\n access: {\n ...spec.access,\n models: models.map((m) => (m.id === patch.model ? { ...m, records: patch.records } : m)),\n },\n }\n }\n case \"update-spec\":\n return { ...spec, ...patch.fields, id: spec.id, turns: spec.turns }\n }\n}\n\n/** Apply patches in order — a recorded stream, replayed. */\nexport function applyPatches(spec: ConversationSpec, patches: ConversationPatch[]): ConversationSpec {\n return patches.reduce(applyPatch, spec)\n}\n","import {\n type EventSourceOptions,\n fromEventSource as fromEventSourceOf,\n fromNdjson as fromNdjsonOf,\n offsetScript as offsetScriptOf,\n type PatchChunk as PatchChunkOf,\n type PatchScript as PatchScriptOf,\n patchesOf as patchesOfAny,\n type PatchSource as PatchSourceOf,\n playScript as playScriptOf,\n type PlayOptions,\n type ScriptStep as ScriptStepOf,\n scriptLength,\n} from \"@invana/blocks\"\n\nimport type { ConversationPatch } from \"./reduce\"\nimport type { AnswerTurn, ConversationSpec } from \"./types\"\n\n/**\n * A conversation arrives as a spec, then as patches — by the same transport\n * every block streams by (`@invana/blocks`), carrying {@link ConversationPatch}.\n * These are the ways the patches can arrive — one at a time or in batches,\n * from a fetch body, an EventSource, a generator, or a recorded script — all\n * read the same way by `<ChatSession stream>` and `useChatSession().stream()`.\n */\nexport type PatchChunk = PatchChunkOf<ConversationPatch>\nexport type PatchSource = PatchSourceOf<ConversationPatch>\n/** A patch and when it lands, in ms from the start of the script. */\nexport type ScriptStep = ScriptStepOf<ConversationPatch>\n/** A recorded run: plain JSON, replayed by {@link playScript}. */\nexport type PatchScript = PatchScriptOf<ConversationPatch>\nexport type { EventSourceOptions, PlayOptions }\n\n/** Every patch of a source, flattened, in order. */\nexport const patchesOf = (source: PatchSource) => patchesOfAny<ConversationPatch>(source)\n\n/**\n * Patches from a newline-delimited JSON body: one patch, or an array of them,\n * per line. Pass the `Response` of a streaming `fetch`, or its body.\n */\nexport const fromNdjson = (input: Response | ReadableStream<Uint8Array>) => fromNdjsonOf<ConversationPatch>(input)\n\n/** Patches from Server-Sent Events: each event's `data` is a patch, or an array of them. */\nexport const fromEventSource = (source: EventSource, options?: EventSourceOptions) =>\n fromEventSourceOf<ConversationPatch>(source, options)\n\n/**\n * A script as a stream: each step is yielded when it is due. Steps due at the\n * same moment are yielded together; aborting ends the stream where it stands.\n */\nexport const playScript = (script: PatchScript, options?: PlayOptions) => playScriptOf(script, options)\n\n/** Shift every step of a script by `ms` — to chain scripts one after another. */\nexport const offsetScript = (script: PatchScript, ms: number): PatchScript => offsetScriptOf(script, ms)\n\n/** When a script's last step lands. */\nexport { scriptLength }\n\nexport interface DeltaOptions {\n /** When the first delta lands, in ms. @default 0 */\n from?: number\n /** The gap between deltas, in ms. @default 40 */\n every?: number\n /** Stream word by word, or a few characters at a time. @default \"word\" */\n by?: \"word\" | \"char\"\n}\n\nfunction deltas(text: string, by: \"word\" | \"char\"): string[] {\n if (by === \"char\") return text.match(/[\\s\\S]{1,3}/g) ?? []\n // Keep each word's trailing space with it, so the deltas join back exactly.\n return text.match(/\\S+\\s*|\\s+/g) ?? []\n}\n\n/**\n * A block's words, streamed: `append-text` steps, one per word, into `field`\n * (default `text`) of block `block` (default the last).\n */\nexport function textDeltas(\n turn: string,\n text: string,\n { from = 0, every = 40, by = \"word\", block, field }: DeltaOptions & { block?: number; field?: string } = {},\n): PatchScript {\n return deltas(text, by).map((piece, i) => ({\n at: from + i * every,\n patch: {\n op: \"append-text\",\n turn,\n text: piece,\n ...(block === undefined ? {} : { block }),\n ...(field === undefined ? {} : { field }),\n },\n }))\n}\n\n/** A step's reasoning, streamed: `append-thinking` steps, one per word. */\nexport function thinkingDeltas(\n turn: string,\n step: string,\n text: string,\n { from = 0, every = 40, by = \"word\" }: DeltaOptions = {},\n): PatchScript {\n return deltas(text, by).map((piece, i) => ({\n at: from + i * every,\n patch: { op: \"append-thinking\", turn, step, text: piece },\n }))\n}\n\n// ── state helpers ───────────────────────────────────────────────────────────\n\nconst LIVE_STEP = new Set([\"running\", \"retrying\"])\n\n/**\n * Whether an answer is still being produced. `partial` is not: it is an\n * answer given in part — the rest in the background, or not to be had.\n */\nexport const isLive = (turn: AnswerTurn) => turn.state === \"running\"\n\n/** Whether anything in the conversation is still running. */\nexport function isRunning(spec: ConversationSpec): boolean {\n return spec.turns.some((t) => t.role === \"assistant\" && t.kind === \"answer\" && isLive(t))\n}\n\n/**\n * What stopping does, as patches: each running answer is marked `stopped`,\n * its running step `stopped` with the time it had run, the steps after it left\n * as they were — so the record shows how far it got. `now` is in ms.\n */\nexport function stopPatches(spec: ConversationSpec, now: number = Date.now()): ConversationPatch[] {\n const patches: ConversationPatch[] = []\n for (const turn of spec.turns) {\n if (turn.role !== \"assistant\" || turn.kind !== \"answer\" || !isLive(turn)) continue\n for (const step of turn.trace ?? []) {\n if (!step.id || !LIVE_STEP.has(step.state)) continue\n const started = step.startedAt ? Date.parse(step.startedAt) : NaN\n patches.push({\n op: \"update-trace-step\",\n turn: turn.id,\n step: step.id,\n fields: {\n state: \"stopped\",\n thinking: undefined,\n ...(Number.isNaN(started) ? {} : { duration: now - started }),\n },\n })\n }\n const started = turn.startedAt ? Date.parse(turn.startedAt) : NaN\n patches.push({\n op: \"update-turn\",\n turn: turn.id,\n fields: {\n at: new Date(now).toISOString(),\n ...(Number.isNaN(started) ? {} : { duration: now - started }),\n },\n })\n patches.push({ op: \"set-state\", turn: turn.id, state: \"stopped\" })\n }\n return patches\n}\n","import * as React from \"react\"\n\nimport type { ResolvedRegistry } from \"../../conversations/registry\"\nimport type { ConversationEvent } from \"../../protocol/events\"\nimport type { ConversationSpec } from \"../../protocol/types\"\nimport type { ChatSessionAnswerAction, ChatSessionIcons, ChatSessionView } from \"../types\"\n\n/**\n * Everything a variant's parts read, so no part takes more than its turn as a\n * prop. The spec is data; the rest is how the session is being looked at —\n * which steps are open, which view — and never goes back to the API.\n */\nexport interface ChatSessionContextValue {\n spec: ConversationSpec\n registry: ResolvedRegistry\n emit: (event: ConversationEvent) => void\n icons: ChatSessionIcons\n now: number\n /** Whether the host opens runs itself (`onOpenRun`); if not, the time opens the steps in place. */\n opensRuns: boolean\n /** An answer's steps shown, or folded to one line. Unset follows the run: open while it runs. */\n stepsOpen: (turnId: string, live: boolean) => boolean\n toggleSteps: (turnId: string, open?: boolean) => void\n /** The analyst opened or folded an answer's steps: toggles them, and sends `toggle-steps`. */\n setSteps: (turnId: string, open: boolean) => void\n /** The actions beside a settled answer's time. */\n actions: ChatSessionAnswerAction[]\n /** One step's record open. */\n recordOpen: (turnId: string, stepId: string) => boolean\n toggleRecord: (turnId: string, stepId: string, open?: boolean) => void\n /** A rating given here, before the spec comes back with it. */\n rating: (turnId: string) => number | undefined\n rate: (turnId: string, value: number) => void\n view: ChatSessionView\n setView: (view: ChatSessionView) => void\n scrollToTurn: (turnId: string) => void\n focusComposer: () => void\n /** The composer registers its element, so `focusComposer` can reach it. */\n setComposer: (element: HTMLDivElement | null) => void\n}\n\nexport const ChatSessionContext = React.createContext<ChatSessionContextValue | null>(null)\n\nexport function useChatSessionContext(): ChatSessionContextValue {\n const value = React.useContext(ChatSessionContext)\n if (!value) throw new Error(\"A ChatSession part was rendered outside <ChatSession>.\")\n return value\n}\n\nexport const DEFAULT_ICONS: ChatSessionIcons = {\n send: \"↑\",\n stop: \"■\",\n attach: \"+\",\n close: \"×\",\n retry: \"↻\",\n copy: \"⧉\",\n steps: \"≡\",\n rateUp: \"+1\",\n rateDown: \"−1\",\n}\n\n/**\n * The session's own view state: open steps, open records, ratings given, the\n * view. Keyed by turn and step id, so it survives every patch.\n */\nexport function useViewState() {\n const [steps, setSteps] = React.useState<Record<string, boolean>>({})\n const [records, setRecords] = React.useState<Record<string, boolean>>({})\n const [ratings, setRatings] = React.useState<Record<string, number>>({})\n\n const stepsOpen = React.useCallback((turnId: string, live: boolean) => steps[turnId] ?? live, [steps])\n const toggleSteps = React.useCallback(\n (turnId: string, open?: boolean) =>\n setSteps((prev) => ({ ...prev, [turnId]: open ?? !(prev[turnId] ?? false) })),\n [],\n )\n const recordOpen = React.useCallback(\n (turnId: string, stepId: string) => !!records[`${turnId}/${stepId}`],\n [records],\n )\n const toggleRecord = React.useCallback((turnId: string, stepId: string, open?: boolean) => {\n const key = `${turnId}/${stepId}`\n setRecords((prev) => ({ ...prev, [key]: open ?? !prev[key] }))\n }, [])\n const rating = React.useCallback((turnId: string) => ratings[turnId], [ratings])\n const setRating = React.useCallback(\n (turnId: string, value: number) => setRatings((prev) => ({ ...prev, [turnId]: value })),\n [],\n )\n return { stepsOpen, toggleSteps, recordOpen, toggleRecord, rating, setRating }\n}\n\n/** The clock: the given one, or one that ticks while `live`. */\nexport function useClock(fixed: number | undefined, live: boolean, every = 250): number {\n const [now, setNow] = React.useState(() => fixed ?? Date.now())\n React.useEffect(() => {\n if (fixed !== undefined || !live) return\n const timer = setInterval(() => setNow(Date.now()), every)\n return () => clearInterval(timer)\n }, [fixed, live, every])\n return fixed ?? now\n}\n","/**\n * How a thread writes time. Every function takes the clock it reads against,\n * so a story or a test reads the same every run.\n */\n\n/** `912ms`, `1.4s`, `2m 5s`, `1h 20m` — `spaced` writes `1.4 s`, as a sentence does. */\nexport function formatDuration(ms: number, { spaced = false }: { spaced?: boolean } = {}): string {\n const gap = spaced ? \" \" : \"\"\n if (!Number.isFinite(ms) || ms < 0) return `0${gap}ms`\n if (ms < 1000) return `${Math.round(ms)}${gap}ms`\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}${gap}s`\n const pair = (big: number, bigUnit: string, small: number, smallUnit: string) =>\n small ? `${big}${gap}${bigUnit} ${small}${gap}${smallUnit}` : `${big}${gap}${bigUnit}`\n if (ms < 3_600_000) return pair(Math.floor(ms / 60_000), \"m\", Math.round((ms % 60_000) / 1000), \"s\")\n return pair(Math.floor(ms / 3_600_000), \"h\", Math.round((ms % 3_600_000) / 60_000), \"m\")\n}\n\n/** ms since an ISO time, never below zero; `undefined` when there is no time. */\nexport function elapsedSince(iso: string | undefined, now: number): number | undefined {\n if (!iso) return undefined\n const then = Date.parse(iso)\n return Number.isNaN(then) ? undefined : Math.max(0, now - then)\n}\n\n/** `09:02` — the time a turn was sent, on a 24-hour clock. */\nexport function clockTime(iso: string | undefined): string | undefined {\n if (!iso) return undefined\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return undefined\n return date.toLocaleTimeString(\"en-GB\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false })\n}\n\nconst dayKey = (d: Date) => `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`\n\n/** Whether two ISO times fall on the same local day. */\nexport function sameDay(a: string | undefined, b: string | undefined): boolean {\n if (!a || !b) return true\n return dayKey(new Date(a)) === dayKey(new Date(b))\n}\n\n/** `Today · Wed 30 Sep`, `Yesterday · Tue 29 Sep`, `Mon 28 Sep`. */\nexport function dayLabel(iso: string, now: number): string {\n const date = new Date(iso)\n const written = date.toLocaleDateString(\"en-GB\", { weekday: \"short\", day: \"numeric\", month: \"short\" })\n const today = new Date(now)\n if (dayKey(date) === dayKey(today)) return `Today · ${written}`\n const yesterday = new Date(now - 86_400_000)\n if (dayKey(date) === dayKey(yesterday)) return `Yesterday · ${written}`\n return written\n}\n","import type {\n AnalystTurn,\n AnswerTurn,\n AskTurn,\n ConversationSpec,\n TraceStep,\n Turn,\n} from \"../../protocol/types\"\nimport { isLive } from \"../../protocol/stream\"\nimport { elapsedSince } from \"./format\"\n\n/**\n * The view model both variants draw from. Nothing here knows a kind: it\n * reads only the protocol's own fields — roles, kinds, states, the trace —\n * so an ask or a block of your own flows through exactly like a built-in.\n */\n\nexport type AssistantTurn = AskTurn | AnswerTurn\n\n/** A prompt and everything the assistant said back to it, in order. */\nexport interface Exchange {\n /** Stable across patches: the prompt's id, or the first reply's. */\n id: string\n prompt?: AnalystTurn\n replies: AssistantTurn[]\n}\n\n/** The thread as exchanges. Replies before any prompt form an exchange of their own. */\nexport function exchangesOf(spec: ConversationSpec): Exchange[] {\n const out: Exchange[] = []\n for (const turn of spec.turns) {\n if (turn.role === \"analyst\") {\n out.push({ id: turn.id, prompt: turn, replies: [] })\n continue\n }\n const last = out[out.length - 1]\n if (last) last.replies.push(turn)\n else out.push({ id: turn.id, replies: [turn] })\n }\n return out\n}\n\nexport const isAnswer = (turn: Turn): turn is AnswerTurn => turn.role === \"assistant\" && turn.kind === \"answer\"\nexport const isAsk = (turn: Turn): turn is AskTurn => turn.role === \"assistant\" && turn.kind === \"ask\"\n\nconst ACTIVE = new Set<TraceStep[\"state\"]>([\"running\", \"retrying\", \"waiting\"])\n\n/** The step the run is on — running, retrying, or waiting on the analyst. */\nexport function currentStep(answer: AnswerTurn): TraceStep | undefined {\n return answer.trace?.find((s) => ACTIVE.has(s.state))\n}\n\n/** A step's time: counting up while it runs, its duration once settled. */\nexport function stepTime(step: TraceStep, now: number): number | undefined {\n if (step.state === \"running\" || step.state === \"retrying\") return elapsedSince(step.startedAt, now)\n return step.duration\n}\n\n/**\n * An answer's time: counting up while it runs; once settled its `duration`,\n * else the span from `startedAt` to `at`, else the sum of its steps.\n */\nexport function answerTime(answer: AnswerTurn, now: number): number | undefined {\n if (isLive(answer)) return elapsedSince(answer.startedAt, now)\n if (answer.duration !== undefined) return answer.duration\n if (answer.startedAt && answer.at) {\n const span = Date.parse(answer.at) - Date.parse(answer.startedAt)\n if (!Number.isNaN(span)) return span\n }\n const steps = answer.trace ?? []\n return steps.some((s) => s.duration !== undefined)\n ? steps.reduce((sum, s) => sum + (s.duration ?? 0), 0)\n : undefined\n}\n\nexport type RunOutcome = \"live\" | \"waiting\" | \"done\" | \"failed\" | \"stopped\"\n\n/** Where an answer's run stands, from its state and its steps. */\nexport function runOutcome(answer: AnswerTurn): RunOutcome {\n if (answer.state === \"error\") return \"failed\"\n if (answer.state === \"stopped\") return \"stopped\"\n if (isLive(answer)) return answer.trace?.some((s) => s.state === \"waiting\") ? \"waiting\" : \"live\"\n return \"done\"\n}\n\n/** `4 of 4 steps` — how far the run got. */\nexport function stepCount(answer: AnswerTurn): { done: number; total: number } {\n const steps = answer.trace ?? []\n return { done: steps.filter((s) => s.state === \"done\").length, total: steps.length }\n}\n\n/**\n * Whether an ask holds the thread until it is answered. The session passes\n * the registry's answer — an ask drawn in the question card does; bare\n * follow-up chips do not — so no block is named here.\n */\nexport type BlocksThread = (ask: AskTurn) => boolean\n\n/** Whether an exchange is still being answered, or waits on the analyst. */\nexport function exchangeState(\n exchange: Exchange,\n blocks: BlocksThread = () => true,\n): \"running\" | \"waiting\" | \"settled\" {\n let waiting = false\n for (const reply of exchange.replies) {\n if (isAsk(reply) && reply.state === \"pending\" && blocks(reply)) waiting = true\n if (isAnswer(reply)) {\n const outcome = runOutcome(reply)\n if (outcome === \"live\") return \"running\"\n if (outcome === \"waiting\") waiting = true\n }\n }\n return waiting ? \"waiting\" : \"settled\"\n}\n\n/** The counts a status bar shows: what runs, what waits, how many steps in all. */\nexport function threadCounts(spec: ConversationSpec, blocks?: BlocksThread) {\n let running = 0\n let waiting = 0\n let steps = 0\n for (const exchange of exchangesOf(spec)) {\n const state = exchangeState(exchange, blocks)\n if (state === \"running\") running++\n if (state === \"waiting\") waiting++\n for (const reply of exchange.replies) if (isAnswer(reply)) steps += reply.trace?.length ?? 0\n }\n return { running, waiting, steps }\n}\n\n/**\n * The words of a turn, for Copy: every string field named `text` on its\n * blocks, in order. Read by field, not by block, so a block of your own that\n * says something in `text` is copied too.\n */\nexport function plainText(answer: AnswerTurn): string {\n return answer.blocks\n .map((b) => (b as { text?: unknown }).text)\n .filter((t): t is string => typeof t === \"string\" && t.length > 0)\n .join(\"\\n\\n\")\n .replace(/\\*\\*(.+?)\\*\\*/g, \"$1\")\n .replace(/\\[(\\d+)\\]/g, \"\")\n}\n\n/** The DOM id a turn is drawn under, so a variant can scroll to it. */\nexport const turnDomId = (spec: ConversationSpec, turnId: string) => `chat-${spec.id}-${turnId}`\n","import * as React from \"react\"\nimport { cn } from \"@invana/ui\"\n\nimport { ChatSessionMessageOptions, type ChatSessionMessageAction } from \"../../conversations/thread\"\nimport type { AnswerTurn } from \"../../protocol/types\"\nimport type { ChatSessionBuiltInAction } from \"../types\"\nimport { useChatSessionContext } from \"./context\"\nimport { isAnswer, plainText, runOutcome } from \"./model\"\n\n/** The session's title bar: what the thread is about, how long it is, and close. */\nexport function SessionHeader({ onClose, className }: { onClose?: () => void; className?: string }) {\n const ctx = useChatSessionContext()\n const prompts = ctx.spec.turns.filter((t) => t.role === \"analyst\").length\n return (\n <div className={cn(\"flex h-[34px] shrink-0 items-center gap-2 border-b border-border px-3\", className)}>\n <span className=\"min-w-0 truncate font-medium\">{ctx.spec.title}</span>\n {prompts ? (\n <span className=\"shrink-0 text-muted-foreground tabular-nums\">\n · {prompts} {prompts === 1 ? \"question\" : \"questions\"}\n </span>\n ) : null}\n {onClose ? (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close the session\"\n title=\"Close\"\n className=\"ml-auto inline-flex size-[22px] shrink-0 items-center justify-center rounded-control text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {ctx.icons.close}\n </button>\n ) : null}\n </div>\n )\n}\n\nconst SETTLED_RATEABLE = new Set([\"complete\", \"partial\"])\n\n/**\n * The actions beside a settled answer's time, at the right of its line: the\n * ones the session's `actions` prop names, in its order. Every one is an\n * event — `retry`, `copy`, `toggle-steps`, `rate`, or `action` for your own —\n * so a host hears each through its callback; none knows what the answer's\n * blocks are.\n */\nexport function AnswerActions({ turn }: { turn: AnswerTurn }) {\n const ctx = useChatSessionContext()\n const running = ctx.spec.turns.some((t) => isAnswer(t) && runOutcome(t) === \"live\")\n const rating = ctx.rating(turn.id) ?? turn.rating\n const text = plainText(turn)\n const rate = (value: number) => {\n const next = rating === value ? 0 : value\n ctx.rate(turn.id, next)\n ctx.emit({ type: \"rate\", turn: turn.id, value: next })\n }\n const built: Record<ChatSessionBuiltInAction, () => ChatSessionMessageAction[]> = {\n retry: () => [\n {\n icon: ctx.icons.retry,\n label: \"Run again\",\n disabled: running,\n onClick: () => ctx.emit({ type: \"retry\", turn: turn.id }),\n },\n ],\n copy: () =>\n text\n ? [\n {\n icon: ctx.icons.copy,\n label: \"Copy\",\n onClick: () => {\n void navigator.clipboard?.writeText(text)\n ctx.emit({ type: \"copy\", turn: turn.id, text })\n },\n },\n ]\n : [],\n steps: () => {\n if (!turn.trace?.length) return []\n const open = ctx.stepsOpen(turn.id, false)\n return [{ icon: ctx.icons.steps, label: \"Steps\", active: open, onClick: () => ctx.setSteps(turn.id, !open) }]\n },\n rate: () =>\n SETTLED_RATEABLE.has(turn.state)\n ? [\n {\n icon: ctx.icons.rateUp,\n label: \"Good answer\",\n active: rating === 1,\n activeClassName: \"text-success hover:text-success\",\n onClick: () => rate(1),\n },\n {\n icon: ctx.icons.rateDown,\n label: \"Not what I wanted\",\n active: rating === -1,\n activeClassName: \"text-destructive hover:text-destructive\",\n onClick: () => rate(-1),\n },\n ]\n : [],\n }\n const actions = ctx.actions.flatMap((a): ChatSessionMessageAction[] =>\n typeof a === \"string\"\n ? built[a]()\n : !a.states || a.states.includes(turn.state)\n ? [{ icon: a.icon, label: a.label, onClick: () => ctx.emit({ type: \"action\", turn: turn.id, action: a.id }) }]\n : [],\n )\n if (!actions.length) return null\n // All at the end: the row's start is the answer's time. Small and quiet — they\n // sit on a line of metadata, not beside the answer's words; whatever size the\n // host's icons are, they draw at 11px, and come up to full strength on hover.\n return (\n <ChatSessionMessageOptions\n actions={actions.map((a) => ({\n ...a,\n align: \"end\",\n className: cn(\n \"size-5 hover:bg-transparent [&_svg]:!size-[11px]\",\n !a.active && \"text-muted-foreground/60 hover:text-foreground\",\n ),\n }))}\n />\n )\n}\n\n/** A settled answer's line: what it says at the left, its actions at the right. */\nexport function AnswerLine({ turn, children }: { turn: AnswerTurn; children?: React.ReactNode }) {\n return (\n <div className=\"flex min-w-0 items-center gap-2\">\n {children ? <div className=\"min-w-0 shrink truncate\">{children}</div> : null}\n <div className=\"min-w-0 flex-1\">\n <AnswerActions turn={turn} />\n </div>\n </div>\n )\n}\n\n/** The keys that work now: send and newline, or stop while a run is in flight. */\nexport function KeyHints({ running }: { running: boolean }) {\n return running ? (\n <>\n <span>esc stop</span>\n </>\n ) : (\n <>\n <span>↵ send</span>\n <span>⇧↵ newline</span>\n </>\n )\n}\n\n/** Esc stops the run from anywhere on the page, as in a console. */\nexport function useStopKey(running: boolean, stop: () => void) {\n React.useEffect(() => {\n if (!running) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented) return\n e.preventDefault()\n stop()\n }\n document.addEventListener(\"keydown\", onKey)\n return () => document.removeEventListener(\"keydown\", onKey)\n }, [running, stop])\n}\n","import {\n ClarifyActions as UiClarifyActions,\n ClarifyCard as UiClarifyCard,\n ClarifyFootnote as UiClarifyFootnote,\n} from \"@invana/ui\"\n\n/*\n * The live ask and its parts, moving from `@invana/ui`; see\n * `conversations/thread.ts` for why they are re-declared.\n */\n\n/** The ask, through its whole life: pending, answered, skipped, superseded, expired. */\nexport const ClarifyCard = UiClarifyCard\n/** The line under an ask: why these options, or where a default came from. */\nexport const ClarifyFootnote = UiClarifyFootnote\n/** The row of controls that answers, skips or changes an ask. */\nexport const ClarifyActions = UiClarifyActions\n\nexport type {\n ClarifyActionsProps,\n ClarifyCardProps,\n ClarifyFootnoteProps,\n ClarifyOption,\n ClarifyState,\n} from \"@invana/ui\"\nexport { ConfirmCard, SuggestionChips, type ConfirmCardProps, type ConfirmCost, type SuggestionChipsProps } from \"@invana/blocks\"\n","/**\n * How long ago, in the words a thread uses — `just now`, `4 min ago`,\n * `3 h ago`, then the date, `28 Sep`. `now` is passed in, so a story or a\n * test reads the same every time it runs.\n */\nexport function relativeTime(iso: string, now: number): string | undefined {\n const then = Date.parse(iso)\n if (Number.isNaN(then)) return undefined\n const minutes = Math.floor((now - then) / 60_000)\n if (minutes < 1) return \"just now\"\n if (minutes < 60) return `${minutes} min ago`\n const hours = Math.floor(minutes / 60)\n if (hours < 24) return `${hours} h ago`\n return new Date(then).toLocaleDateString(\"en-GB\", { day: \"numeric\", month: \"short\" })\n}\n","// Ids follow the Design Kit Spec (https://claude.ai/artifact/VcN3AYgmbdCpHbxXZjMir5).\n// Do not edit by hand: change the spec first, then copy the ids here.\n// grammar.test.ts fails when these ids and the block registry disagree.\n\n/** The seven stages every flow walks some of, in order. */\nexport const STAGES = [\n { id: \"frame\", name: \"Frame\" },\n { id: \"scope\", name: \"Scope\" },\n { id: \"check\", name: \"Check data\" },\n { id: \"analyse\", name: \"Analyse\" },\n { id: \"explain\", name: \"Explain\" },\n { id: \"act\", name: \"Act\" },\n { id: \"monitor\", name: \"Monitor\" },\n] as const\n\nexport type StageId = (typeof STAGES)[number][\"id\"]\n","// Ids follow the Design Kit Spec (https://claude.ai/artifact/VcN3AYgmbdCpHbxXZjMir5).\n// Do not edit by hand: change the spec first, then copy the ids here.\n// grammar.test.ts fails when these ids and the block registry disagree.\n\nimport type { AnswerKind } from \"@invana/blocks\"\n\n/**\n * Answer patterns: which blocks an answer has, in order. The flow picks the\n * pattern, and `validate()` checks each answer against it.\n */\nexport const PATTERNS = [\n { id: \"snapshot\", name: \"KPI snapshot\", blocks: [\"grid\", \"timeseries\", \"narrative\", \"scope\"] },\n { id: \"bridge\", name: \"Change explanation\", blocks: [\"narrative\", \"waterfall\", \"ranked\", \"citations\"] },\n { id: \"comparison\", name: \"Comparison\", blocks: [\"bars\", \"table\", \"caveat\"] },\n { id: \"ranking\", name: \"Ranked list\", blocks: [\"ranked\", \"table\"] },\n { id: \"profile\", name: \"Segment profile\", blocks: [\"table\", \"bars\", \"narrative\"] },\n { id: \"cohort\", name: \"Cohort matrix\", blocks: [\"matrix\", \"narrative\"] },\n { id: \"forecast\", name: \"Forecast\", blocks: [\"timeseries\", \"record\", \"caveat\"] },\n { id: \"anomaly\", name: \"Anomaly report\", blocks: [\"timeseries\", \"timeline\", \"ranked\"] },\n { id: \"drivers\", name: \"Driver ranking\", blocks: [\"ranked\", \"narrative\", \"caveat\"] },\n { id: \"readout\", name: \"Experiment readout\", blocks: [\"metric\", \"record\", \"caveat\", \"proposal\"] },\n { id: \"scenariot\", name: \"Scenario table\", blocks: [\"record\", \"table\", \"ranked\"] },\n { id: \"funnelv\", name: \"Funnel\", blocks: [\"funnel\", \"table\"] },\n { id: \"spread\", name: \"Distribution\", blocks: [\"histogram\", \"table\"] },\n { id: \"quality\", name: \"Quality report\", blocks: [\"checks\", \"table\", \"files\"] },\n { id: \"e360\", name: \"Entity 360\", blocks: [\"record\", \"timeline\", \"table\"] },\n { id: \"relmap\", name: \"Relationship map\", blocks: [\"subgraph\", \"ranked\"] },\n { id: \"memo\", name: \"Findings memo\", blocks: [\"narrative\", \"citations\", \"caveat\"] },\n { id: \"recommend\", name: \"Recommendation\", blocks: [\"table\", \"ranked\", \"proposal\"] },\n { id: \"delivery\", name: \"Scheduled delivery\", blocks: [\"files\", \"proposal\", \"record\"] },\n { id: \"shortlist\", name: \"Candidate shortlist\", blocks: [\"attr\", \"histogram\", \"caveat\", \"proposal\"] },\n { id: \"significance\", name: \"Significance test\", blocks: [\"test\", \"box\", \"evidence\", \"caveat\"] },\n { id: \"effects\", name: \"Effect estimates\", blocks: [\"coef\", \"forest\", \"method\", \"caveat\"] },\n { id: \"association\", name: \"Association\", blocks: [\"correlation\", \"scatter\", \"caveat\"] },\n { id: \"spc\", name: \"Control report\", blocks: [\"control\", \"pareto\", \"decomposition\"] },\n { id: \"timeto\", name: \"Time to event\", blocks: [\"survival\", \"quantiles\", \"dumbbell\", \"caveat\"] },\n { id: \"modelcheck\", name: \"Model check\", blocks: [\"modeleval\", \"profile\", \"pivot\", \"tornado\"] },\n] as const satisfies readonly { id: string; name: string; blocks: readonly AnswerKind[] }[]\n\nexport type PatternId = (typeof PATTERNS)[number][\"id\"]\n","// Ids follow the Design Kit Spec (https://claude.ai/artifact/VcN3AYgmbdCpHbxXZjMir5).\n// Do not edit by hand: change the spec first, then copy the ids here.\n// grammar.test.ts fails when these ids and the block registry disagree.\n\nimport type { AskKind } from \"@invana/blocks\"\nimport type { StageId } from \"./stages\"\n\n/** The things the assistant asks back, each on one block. */\nexport const ASK_INTENTS = [\n { id: \"clarify\", name: \"Clarify what was meant\", stage: \"frame\", kind: \"single\" },\n { id: \"measure\", name: \"Choose the measure\", stage: \"frame\", kind: \"single\" },\n { id: \"definition\", name: \"Confirm a definition\", stage: \"frame\", kind: \"confirm\" },\n { id: \"hunch\", name: \"Share a hunch\", stage: \"frame\", kind: \"long\" },\n { id: \"window\", name: \"Time window\", stage: \"scope\", kind: \"period\" },\n { id: \"baseline\", name: \"Compare against\", stage: \"scope\", kind: \"single\" },\n { id: \"filter\", name: \"Filter and segment\", stage: \"scope\", kind: \"multi\" },\n { id: \"granularity\", name: \"Granularity\", stage: \"scope\", kind: \"quick\" },\n { id: \"entities\", name: \"Pick entities\", stage: \"scope\", kind: \"entity\" },\n { id: \"threshold\", name: \"Set a threshold\", stage: \"scope\", kind: \"number\" },\n { id: \"ambiguity\", name: \"Resolve ambiguity\", stage: \"check\", kind: \"single\" },\n { id: \"dataissue\", name: \"Handle a data issue\", stage: \"check\", kind: \"single\" },\n { id: \"cost\", name: \"Approve an expensive run\", stage: \"check\", kind: \"confirm\" },\n { id: \"method\", name: \"Choose a method\", stage: \"analyse\", kind: \"single\" },\n { id: \"assumptions\", name: \"Confirm assumptions\", stage: \"analyse\", kind: \"multi\" },\n { id: \"confidence\", name: \"Confidence level\", stage: \"analyse\", kind: \"quick\" },\n { id: \"objectives\", name: \"Weigh objectives\", stage: \"analyse\", kind: \"weights\" },\n { id: \"scenario\", name: \"Scenario inputs\", stage: \"analyse\", kind: \"form\" },\n { id: \"format\", name: \"Choose the output\", stage: \"explain\", kind: \"quick\" },\n { id: \"rate\", name: \"Rate the answer\", stage: \"explain\", kind: \"scale\" },\n { id: \"next\", name: \"Suggest what's next\", stage: \"explain\", kind: \"suggestions\" },\n { id: \"approve\", name: \"Approve an action\", stage: \"act\", kind: \"approval\" },\n { id: \"schedule\", name: \"Schedule and share\", stage: \"monitor\", kind: \"multistep\" },\n { id: \"reading\", name: \"Check my reading\", stage: \"frame\", kind: \"interpretation\" },\n { id: \"fork\", name: \"Pick a reading\", stage: \"frame\", kind: \"fork\" },\n { id: \"range\", name: \"Set a range\", stage: \"scope\", kind: \"range\" },\n { id: \"model\", name: \"Specify the model\", stage: \"analyse\", kind: \"modelspec\" },\n { id: \"plan\", name: \"Review the plan\", stage: \"analyse\", kind: \"plan\" },\n { id: \"hypothesis\", name: \"State the hypothesis\", stage: \"analyse\", kind: \"hypothesis\" },\n] as const satisfies readonly { id: string; name: string; stage: StageId; kind: AskKind }[]\n\nexport type AskIntentId = (typeof ASK_INTENTS)[number][\"id\"]\n","// Ids follow the Design Kit Spec (https://claude.ai/artifact/VcN3AYgmbdCpHbxXZjMir5).\n// Do not edit by hand: change the spec first, then copy the ids here.\n// grammar.test.ts fails when these ids and the blocks disagree.\n\nimport type { AnswerKind } from \"@invana/blocks\"\n\n/**\n * What an answer tells, each drawn by one or more blocks. The answer\n * half of {@link ASK_INTENTS}: an intent is an id and a name, the block is the\n * drawing, and several intents may share one block with different options.\n */\nexport const ANSWER_INTENTS = [\n { id: \"say\", name: \"Say it in words\", kinds: [\"narrative\"] },\n { id: \"figure\", name: \"One number, or a few\", kinds: [\"metric\", \"grid\"] },\n { id: \"trend\", name: \"Change over time\", kinds: [\"timeseries\", \"control\"] },\n { id: \"compare\", name: \"Groups side by side\", kinds: [\"bars\", \"dumbbell\", \"matrix\", \"funnel\"] },\n { id: \"rank\", name: \"Leaders and laggards\", kinds: [\"ranked\", \"pareto\", \"tornado\"] },\n { id: \"explain-change\", name: \"What moved the total\", kinds: [\"waterfall\", \"decomposition\"] },\n { id: \"records\", name: \"Rows, or one entity\", kinds: [\"table\", \"record\", \"attr\", \"pivot\", \"profile\"] },\n { id: \"sequence\", name: \"What happened when\", kinds: [\"timeline\", \"heatstrip\"] },\n { id: \"spread\", name: \"The shape of the values\", kinds: [\"histogram\", \"box\", \"quantiles\", \"survival\"] },\n { id: \"relate\", name: \"How things connect\", kinds: [\"scatter\", \"correlation\", \"subgraph\"] },\n { id: \"stats\", name: \"Test and model results\", kinds: [\"test\", \"coef\", \"forest\", \"evidence\", \"modeleval\"] },\n { id: \"trust\", name: \"Method, sources, scope and limits\", kinds: [\"method\", \"citations\", \"scope\", \"caveat\", \"cannot\", \"checks\"] },\n { id: \"act\", name: \"A proposed action, or a file\", kinds: [\"proposal\", \"files\"] },\n { id: \"run.steps\", name: \"What the run did, in order\", kinds: [\"trace\", \"gantt\"] },\n { id: \"run.activity\", name: \"Which layers were busy\", kinds: [\"activity\"] },\n] as const satisfies readonly { id: string; name: string; kinds: readonly AnswerKind[] }[]\n\nexport type AnswerIntentId = (typeof ANSWER_INTENTS)[number][\"id\"]\n","// Ids follow the Design Kit Spec (https://claude.ai/artifact/VcN3AYgmbdCpHbxXZjMir5).\n// Do not edit by hand: change the spec first, then copy the ids here.\n// grammar.test.ts fails when these ids and the block registry disagree.\n\nimport type { AskIntentId } from \"./asks\"\nimport type { PatternId } from \"./patterns\"\nimport type { StageId } from \"./stages\"\n\n/** The research flows: the shapes of question analysts bring. */\nexport const FLOWS = [\n { id: \"kpi\", name: \"KPI check\", template: \"How is {measure} tracking against {baseline}?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"measure\", \"window\", \"baseline\"], pattern: \"snapshot\" },\n { id: \"diagnose\", name: \"Root cause\", template: \"Why did {measure} change in {period}?\", stages: [\"frame\", \"scope\", \"check\", \"analyse\", \"explain\", \"act\"], asks: [\"measure\", \"window\", \"baseline\", \"hunch\"], pattern: \"bridge\" },\n { id: \"compare\", name: \"Comparison & benchmark\", template: \"How does {A} compare with {B} on {measures}?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"entities\", \"measure\", \"confidence\"], pattern: \"comparison\" },\n { id: \"rank\", name: \"Top-N ranking\", template: \"Which {entities} lead or lag on {measure}?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\", \"act\"], asks: [\"measure\", \"filter\", \"threshold\"], pattern: \"ranking\" },\n { id: \"segment\", name: \"Segmentation\", template: \"What groups exist within {population}, and how do they differ?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"filter\", \"method\", \"assumptions\"], pattern: \"profile\" },\n { id: \"cohort\", name: \"Cohort & retention\", template: \"How do {cohorts} behave over time?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"definition\", \"window\", \"granularity\"], pattern: \"cohort\" },\n { id: \"forecast\", name: \"Trend & forecast\", template: \"Where is {measure} heading?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\", \"monitor\"], asks: [\"window\", \"granularity\", \"method\", \"assumptions\"], pattern: \"forecast\" },\n { id: \"anomaly\", name: \"Anomaly & monitoring\", template: \"Tell me when {measure} behaves unusually.\", stages: [\"scope\", \"analyse\", \"act\", \"monitor\"], asks: [\"measure\", \"threshold\", \"approve\", \"schedule\"], pattern: \"anomaly\" },\n { id: \"drivers\", name: \"Driver analysis\", template: \"What moves {measure}?\", stages: [\"frame\", \"analyse\", \"explain\"], asks: [\"measure\", \"method\", \"assumptions\"], pattern: \"drivers\" },\n { id: \"experiment\", name: \"Experiment readout\", template: \"Did {change} work?\", stages: [\"frame\", \"check\", \"analyse\", \"explain\", \"act\"], asks: [\"entities\", \"definition\", \"confidence\"], pattern: \"readout\" },\n { id: \"scenario\", name: \"Scenario & what-if\", template: \"What happens to {outcome} if {input} changes?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\", \"act\"], asks: [\"scenario\", \"assumptions\"], pattern: \"scenariot\" },\n { id: \"funnel\", name: \"Funnel & journey\", template: \"Where do {entities} drop out of {process}?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"definition\", \"window\", \"filter\"], pattern: \"funnelv\" },\n { id: \"distribution\", name: \"Distribution & outliers\", template: \"What does the spread of {measure} look like, and what sits outside it?\", stages: [\"scope\", \"analyse\", \"explain\"], asks: [\"measure\", \"filter\", \"threshold\"], pattern: \"spread\" },\n { id: \"audit\", name: \"Data audit & reconciliation\", template: \"Can I trust {dataset}? Do {A} and {B} agree?\", stages: [\"check\", \"analyse\", \"explain\", \"act\"], asks: [\"definition\", \"dataissue\", \"cost\"], pattern: \"quality\" },\n { id: \"entity\", name: \"Entity lookup (360)\", template: \"Tell me everything about {entity}.\", stages: [\"frame\", \"check\", \"explain\"], asks: [\"ambiguity\", \"entities\"], pattern: \"e360\" },\n { id: \"network\", name: \"Relationships & networks\", template: \"How are {entities} connected?\", stages: [\"frame\", \"scope\", \"check\", \"analyse\", \"explain\"], asks: [\"entities\", \"threshold\", \"cost\"], pattern: \"relmap\" },\n { id: \"qual\", name: \"Qualitative synthesis\", template: \"What are people saying about {topic}?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"filter\", \"window\", \"hunch\"], pattern: \"memo\" },\n { id: \"recommend\", name: \"Recommendation & priority\", template: \"What should we do about {problem}, and in what order?\", stages: [\"analyse\", \"explain\", \"act\"], asks: [\"assumptions\", \"method\", \"approve\"], pattern: \"recommend\" },\n { id: \"report\", name: \"Report & schedule\", template: \"Send me {analysis} every {cadence}.\", stages: [\"explain\", \"act\", \"monitor\"], asks: [\"format\", \"schedule\", \"approve\"], pattern: \"delivery\" },\n { id: \"combine\", name: \"Combination design\", template: \"Which combination of {candidates} best meets {objectives}?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\", \"act\"], asks: [\"entities\", \"objectives\", \"threshold\", \"assumptions\"], pattern: \"shortlist\" },\n { id: \"significance\", name: \"Significance test\", template: \"Is the difference in {measure} between {A} and {B} real?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"hypothesis\", \"confidence\", \"assumptions\"], pattern: \"significance\" },\n { id: \"effects\", name: \"Effect estimation\", template: \"How much does each {factor} change {outcome}, holding the others fixed?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"model\", \"plan\", \"assumptions\"], pattern: \"effects\" },\n { id: \"association\", name: \"Correlation & association\", template: \"Which {measures} move together, and how strongly?\", stages: [\"frame\", \"scope\", \"check\", \"analyse\", \"explain\"], asks: [\"reading\", \"filter\", \"range\"], pattern: \"association\" },\n { id: \"spc\", name: \"Process control\", template: \"Is {process} in control, and what causes most of the defects?\", stages: [\"scope\", \"analyse\", \"explain\", \"monitor\"], asks: [\"window\", \"granularity\", \"range\"], pattern: \"spc\" },\n { id: \"timeto\", name: \"Time to event\", template: \"How long until {event}, and does it differ by {group}?\", stages: [\"frame\", \"scope\", \"analyse\", \"explain\"], asks: [\"definition\", \"fork\", \"window\"], pattern: \"timeto\" },\n { id: \"modelcheck\", name: \"Model check\", template: \"How well does {model} predict {outcome}, and where does it fail?\", stages: [\"check\", \"analyse\", \"explain\", \"act\"], asks: [\"model\", \"range\", \"plan\"], pattern: \"modelcheck\" },\n] as const satisfies readonly {\n id: string\n name: string\n template: string\n stages: readonly StageId[]\n asks: readonly AskIntentId[]\n pattern: PatternId\n}[]\n\nexport type FlowId = (typeof FLOWS)[number][\"id\"]\n","import { ClarifyCard } from \"../../asks\"\nimport { Placeholder } from \"@invana/blocks\"\nimport type { ResolvedRegistry } from \"../../conversations/registry\"\nimport { relativeTime } from \"../../conversations/relative-time\"\nimport { STAGES } from \"../../grammar\"\nimport type { ConversationEvent } from \"../../protocol/events\"\nimport type { AskTurn } from \"../../protocol/types\"\n\nconst STAGE_NAME = new Map<string, string>(STAGES.map((s) => [s.id, s.name]))\nconst stageName = (stage: string) => (STAGE_NAME.get(stage) ?? stage).toLowerCase()\n\nexport interface AskViewProps {\n turn: AskTurn\n registry: ResolvedRegistry\n onEvent: (event: ConversationEvent) => void\n /** The clock an answered ask's time is read against, in ms. */\n now: number\n}\n\n/**\n * An ask, drawn by whatever the registry holds for its block. Its traits say\n * how it sits: in the ask card — its state, the stage that asked, when it was\n * answered, the header word the block names — or bare, as its renderer draws\n * it. An ask with no renderer is a labelled placeholder in the card.\n */\nexport function AskView({ turn, registry, onEvent, now }: AskViewProps) {\n const Renderer = registry.asks[turn.ask.kind]\n const traits = registry.askTraits(turn.ask.kind)\n if (Renderer && traits.frame === \"none\") {\n return <Renderer turn={turn} options={turn.ask} onEvent={onEvent} />\n }\n const time =\n turn.state === \"answered\" && turn.answeredAt ? relativeTime(turn.answeredAt, now) : undefined\n return (\n <ClarifyCard\n state={turn.state}\n kind={traits.kind}\n step={stageName(turn.stage)}\n waiting={turn.state === \"pending\" ? turn.waiting : undefined}\n time={time}\n >\n {Renderer ? (\n <Renderer turn={turn} options={turn.ask} onEvent={onEvent} />\n ) : (\n <Placeholder kind={turn.ask.kind} options={turn.ask} />\n )}\n </ClarifyCard>\n )\n}\n","import { cn, Skeleton } from \"@invana/ui\"\n\nimport { SuggestionChips } from \"@invana/blocks\"\nimport type { Tone } from \"../protocol/types\"\n\n/** One bar of a skeleton: its width as a share of the block, and a height in px when it is not a text line. */\ntype Bar = [width: number, height?: number]\n\nconst LINES: Bar[] = [[0.6], [0.75], [0.5]]\n/** A chart: the plot, then its legend. */\nconst CHART: Bar[] = [[1, 110], [0.55, 7]]\n/** A ranked list or a timeline: rows that shorten, then the line under them. */\nconst ROWS: Bar[] = [[0.92], [0.74], [0.55], [0.38], [0.4, 7]]\n\n/**\n * The skeleton each block draws while its data is on the way, shaped like the\n * block so the card does not jump when it lands. A block not named here gets\n * text lines.\n */\nconst SHAPE: Record<string, Bar[]> = {\n metric: [[0.45], [0.3, 22], [0.55]],\n grid: [[1, 56]],\n record: [[0.6], [0.75], [0.5], [0.68]],\n table: [[1, 7], [1], [1], [1]],\n attr: [[1, 7], [1], [1], [1]],\n pivot: [[1, 7], [1], [1], [1]],\n coef: [[1, 7], [1], [1], [1]],\n files: [[0.7], [0.55], [0.62]],\n ranked: ROWS,\n timeline: ROWS,\n funnel: ROWS,\n pareto: ROWS,\n tornado: ROWS,\n forest: ROWS,\n dumbbell: ROWS,\n timeseries: CHART,\n bars: CHART,\n waterfall: CHART,\n histogram: CHART,\n matrix: CHART,\n correlation: CHART,\n scatter: CHART,\n box: CHART,\n control: CHART,\n survival: CHART,\n decomposition: CHART,\n modeleval: CHART,\n quantiles: CHART,\n subgraph: CHART,\n}\n\n/** A block whose data is on the way. */\nexport function BlockSkeleton({ kind }: { kind: string }) {\n const bars = SHAPE[kind] ?? LINES\n return (\n <div role=\"status\" aria-label=\"Loading\" className=\"flex flex-col gap-1.5 py-0.5\">\n {bars.map(([width, height], i) => (\n <Skeleton\n key={i}\n style={{ width: `${width * 100}%`, height: height ?? 9 }}\n />\n ))}\n </div>\n )\n}\n\n/**\n * A block with nothing to draw, saying what is missing — never a blank card.\n * Follow-ups that would find something sit under it.\n */\nexport function BlockEmpty({\n text,\n suggestions,\n onSuggest,\n}: {\n text: string\n suggestions?: string[]\n onSuggest: (text: string) => void\n}) {\n return (\n <div className=\"flex flex-col gap-2\">\n <p className=\"m-0 rounded-md border border-dashed border-border px-2 py-3.5 text-center text-sm text-muted-foreground\">\n {text}\n </p>\n {suggestions?.length ? <SuggestionChips items={suggestions} onSelect={onSuggest} /> : null}\n </div>\n )\n}\n\n/** The line under a block. A warning is inked as one. */\nexport function BlockCaption({ text, tone }: { text: string; tone?: Tone }) {\n return (\n <p\n className={cn(\n \"m-0 text-xs\",\n tone === \"warn\" ? \"text-warning\" : tone === \"bad\" ? \"text-destructive\" : \"text-muted-foreground\",\n )}\n >\n {text}\n </p>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"@invana/ui\"\n\nimport { ActionRow } from \"@invana/blocks\"\nimport { BlockCaption, BlockEmpty, BlockSkeleton } from \"../../conversations/block-status\"\nimport { Placeholder } from \"@invana/blocks\"\nimport type { ResolvedRegistry } from \"../../conversations/registry\"\nimport type { ConversationEvent } from \"../../protocol/events\"\nimport type { AnswerTurn, BlockSpec, Outcome } from \"../../protocol/types\"\n\nexport interface BlockViewProps {\n block: BlockSpec\n turn: AnswerTurn\n registry: ResolvedRegistry\n onEvent: (event: ConversationEvent) => void\n}\n\n/**\n * One block, drawn by whatever the registry holds for its block — a built-in,\n * a renderer of your own, or a labelled placeholder when there is none. Its\n * loading and empty states and its caption are the protocol's, so they look\n * the same under every renderer.\n */\nexport function BlockView({ block, turn, registry, onEvent }: BlockViewProps) {\n const Renderer = registry.blocks[block.kind]\n const body =\n block.status === \"loading\" ? (\n <BlockSkeleton kind={block.kind} />\n ) : block.status === \"empty\" ? (\n <BlockEmpty\n text={block.emptyText ?? \"Nothing to show.\"}\n suggestions={block.emptySuggestions}\n onSuggest={(text) => onEvent({ type: \"prompt\", text })}\n />\n ) : !Renderer ? (\n <Placeholder kind={block.kind} options={block} />\n ) : (\n <Renderer block={block} turn={turn} onEvent={onEvent} />\n )\n // A skeleton or an empty block says it all; the line under the block is about its data.\n if (!block.caption || block.status) return body\n return (\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n {body}\n <BlockCaption text={block.caption} tone={block.captionTone} />\n </div>\n )\n}\n\n/**\n * The envelope, drawn by the blocks a block would use so it looks the same\n * everywhere: scope and freshness over the evidence, method and caveats under.\n * These are the protocol's envelope fields, not answer types.\n */\nexport function envelopeBlocks(turn: AnswerTurn): { top: BlockSpec[]; bottom: BlockSpec[] } {\n const env = turn.envelope\n if (!env) return { top: [], bottom: [] }\n const parts = [...(env.scope ?? []), ...(env.freshness ? [`as of ${env.freshness}`] : [])]\n const top: BlockSpec[] = parts.length ? [{ kind: \"scope\", parts }] : []\n const bottom: BlockSpec[] = [\n ...(env.method ? [{ kind: \"method\" as const, label: \"method\", code: env.method }] : []),\n ...(env.caveats ?? []).map((c) => ({ kind: \"caveat\" as const, label: c.label, text: c.text })),\n ]\n return { top, bottom }\n}\n\n/**\n * An answer's blocks, split by where the registry says each sits: in the\n * answer's card with its envelope, or in a card of its own under it.\n */\nexport function splitBlocks(turn: AnswerTurn, registry: ResolvedRegistry) {\n const { top, bottom } = envelopeBlocks(turn)\n const own = turn.blocks.filter((b) => registry.blockTraits(b.kind).placement === \"own\")\n const inCard = turn.blocks.filter((b) => registry.blockTraits(b.kind).placement !== \"own\")\n return { inCard: [...top, ...inCard, ...bottom], own, hasEvidence: inCard.length > 0 }\n}\n\n/** `cite · 3,406 fills` — what the card's header says it rests on. */\nexport function citationOf(turn: AnswerTurn): string | undefined {\n const g = turn.envelope?.grounding\n return g ? `cite · ${g.records.toLocaleString(\"en-GB\")}${g.noun ? ` ${g.noun}` : \"\"}` : undefined\n}\n\n/**\n * What the run produced, outside the thread, and what to do with it —\n * `14 nodes · 212 relationships` with `Load to canvas`. Each action is sent as\n * an `action` event on the turn.\n */\nexport function OutcomeView({\n outcome,\n turn,\n onEvent,\n tone,\n className,\n}: {\n outcome: Outcome\n turn: AnswerTurn\n onEvent: (event: ConversationEvent) => void\n /** `bad` rules it in the destructive tone — what to do after a failure. */\n tone?: \"bad\"\n className?: string\n}) {\n return (\n <div\n className={cn(\n \"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1.5 rounded-md border border-border px-2 py-1.5\",\n tone === \"bad\" && \"border-destructive/50\",\n className,\n )}\n >\n {outcome.text ? <span className=\"min-w-0 flex-1 text-muted-foreground\">{outcome.text}</span> : null}\n {outcome.actions?.length ? (\n <div className={cn(\"min-w-0\", outcome.text ? \"shrink-0\" : \"flex-1\")}>\n <ActionRow\n actions={outcome.actions}\n onAction={(action) => onEvent({ type: \"action\", turn: turn.id, action })}\n />\n </div>\n ) : null}\n </div>\n )\n}\n\n/** Blocks in a column, with the gap an answer's body uses. */\nexport function BlockStack({ children, className }: { children: React.ReactNode; className?: string }) {\n return <div className={cn(\"flex min-w-0 flex-col gap-3\", className)}>{children}</div>\n}\n","import * as React from \"react\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@invana/forms\"\nimport { cn } from \"@invana/ui\"\n\nimport { ChatSessionComposer } from \"../../conversations/thread\"\nimport type { ComposerControl, ComposerSpec } from \"../../protocol/types\"\nimport { useChatSessionContext } from \"./context\"\n\n/** A 16×16 stroked icon from its path data, as the API sends one. */\nexport function PathIcon({ path, className }: { path: string; className?: string }) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.3}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"size-3.5 shrink-0\", className)}\n >\n <path d={path} />\n </svg>\n )\n}\n\nexport interface ComposerSelectProps {\n control: ComposerControl\n value: string\n onValueChange: (value: string) => void\n /** Let the select take the free width and truncate — the model name. */\n grow?: boolean\n}\n\n/**\n * A select that sits in the composer's toolbar: borderless, compact, the\n * value alone until opened. `quiet` mutes it — a setting rather than the mode.\n */\nexport function ComposerSelect({ control, value, onValueChange, grow }: ComposerSelectProps) {\n return (\n <Select value={value} onValueChange={onValueChange}>\n <SelectTrigger\n aria-label={control.label}\n title={control.label}\n className={cn(\n \"h-control-sm gap-1 border-0 bg-transparent px-2 shadow-none hover:bg-accent\",\n grow ? \"w-full min-w-0\" : \"w-auto shrink-0\",\n control.quiet && \"text-muted-foreground\",\n )}\n >\n {control.icon ? <PathIcon path={control.icon} /> : null}\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {control.options.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\n\n/** A file waiting to be sent, removable until it is. */\nexport function AttachmentChip({ name, onRemove }: { name: string; onRemove?: () => void }) {\n return (\n <span className=\"inline-flex max-w-40 items-center gap-1 rounded-control border border-border bg-muted/40 px-2 py-1 text-sm\">\n <span className=\"truncate\">{name}</span>\n {onRemove ? (\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label={`Remove ${name}`}\n className=\"shrink-0 rounded-sm px-0.5 text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n ×\n </button>\n ) : null}\n </span>\n )\n}\n\n/** Every control's value: what was picked, else its default, else its first option. */\nexport function initialSettings(composer: ComposerSpec | undefined): Record<string, string> {\n const out: Record<string, string> = {}\n for (const c of composer?.controls ?? []) out[c.id] = c.default ?? c.options[0]?.value ?? \"\"\n return out\n}\n\nexport interface ComposerBarProps {\n isRunning: boolean\n onStop: () => void\n}\n\n/**\n * The composer, drawn from the spec's `composer`: the prompt, the toolbar's\n * controls at the start and end, attach, and send — or stop while a run is in\n * flight. The same in every variant. A pick that sets a placeholder or mono\n * type (a query language) changes the prompt box to match.\n */\nexport function ComposerBar({ isRunning, onStop }: ComposerBarProps) {\n const { spec, emit, icons, setComposer } = useChatSessionContext()\n const composer = spec.composer\n const controls = composer?.controls ?? []\n const [draft, setDraft] = React.useState(\"\")\n const [files, setFiles] = React.useState<File[]>([])\n // Only what the analyst picked is held; every other control reads its\n // default, so a control the spec adds later starts there, and one it drops\n // is forgotten.\n const [picks, setPicks] = React.useState<Record<string, string>>({})\n const settings = initialSettings(composer)\n for (const c of controls) {\n const pick = picks[c.id]\n if (pick !== undefined && c.options.some((o) => o.value === pick)) settings[c.id] = pick\n }\n const fileInput = React.useRef<HTMLInputElement>(null)\n\n const picked = controls.map((c) => c.options.find((o) => o.value === settings[c.id])).filter(Boolean)\n const placeholder = picked.find((o) => o?.placeholder)?.placeholder ?? composer?.placeholder\n const mono = picked.some((o) => o?.mono)\n\n const setting = (id: string, value: string) => {\n setPicks((prev) => ({ ...prev, [id]: value }))\n emit({ type: \"setting\", id, value })\n }\n\n const send = () => {\n const text = draft.trim()\n if (!text && !files.length) return\n emit({\n type: \"prompt\",\n text,\n ...(controls.length ? { settings } : {}),\n ...(files.length ? { files } : {}),\n })\n setDraft(\"\")\n setFiles([])\n }\n\n const attach = composer?.attach\n const attachOptions = typeof attach === \"object\" ? attach : {}\n const select = (c: ComposerControl, grow?: boolean) => (\n <ComposerSelect\n key={c.id}\n control={c}\n value={settings[c.id] ?? \"\"}\n onValueChange={(v) => setting(c.id, v)}\n grow={grow}\n />\n )\n const start = controls.filter((c) => (c.align ?? \"start\") === \"start\")\n const end = controls.filter((c) => c.align === \"end\")\n\n return (\n <div ref={setComposer}>\n <ChatSessionComposer\n value={draft}\n onChange={setDraft}\n onSend={send}\n onStop={onStop}\n isRunning={isRunning}\n placeholder={placeholder}\n textareaClassName={cn(\"h-[72px] min-h-14\", mono && \"font-mono\")}\n sendIcon={icons.send}\n stopIcon={icons.stop}\n sendDisabled={isRunning || (!draft.trim() && !files.length)}\n attachments={\n files.length\n ? files.map((f, i) => (\n <AttachmentChip\n key={`${f.name}-${i}`}\n name={f.name}\n onRemove={() => setFiles((prev) => prev.filter((_, j) => j !== i))}\n />\n ))\n : undefined\n }\n // The last start control takes the free width: it is the one that truncates.\n toolbarStart={start.length ? <>{start.map((c, i) => select(c, i === start.length - 1))}</> : undefined}\n toolbarEnd={\n end.length || attach ? (\n <>\n {end.map((c) => select(c))}\n {attach ? (\n <>\n <input\n ref={fileInput}\n type=\"file\"\n hidden\n accept={attachOptions.accept}\n multiple={attachOptions.multiple ?? true}\n onChange={(e) => {\n const list = e.target.files\n if (list?.length) setFiles((prev) => [...prev, ...Array.from(list)])\n // Reset, so choosing the same file again still fires.\n e.target.value = \"\"\n }}\n />\n <button\n type=\"button\"\n onClick={() => fileInput.current?.click()}\n title=\"Attach files\"\n aria-label=\"Attach files\"\n className=\"inline-flex size-7 shrink-0 items-center justify-center rounded-control text-muted-foreground hover:bg-accent\"\n >\n {icons.attach}\n </button>\n </>\n ) : null}\n </>\n ) : undefined\n }\n />\n </div>\n )\n}\n","import { cn, Eyebrow, PropertyList, PropertyRow } from \"@invana/ui\"\n\nimport {\n ChatSessionActivitySubLine,\n ChatSessionDisclosure,\n ChatSessionTaskRow,\n type ChatSessionTaskStatus,\n} from \"../../conversations/thread\"\nimport type { AnswerTurn, TraceIoRow, TraceStep } from \"../../protocol/types\"\nimport { useChatSessionContext } from \"./context\"\nimport { formatDuration } from \"./format\"\nimport { answerTime, runOutcome, stepCount, stepTime } from \"./model\"\n\nconst ROW_STATUS: Record<TraceStep[\"state\"], ChatSessionTaskStatus> = {\n pending: \"queued\",\n running: \"running\",\n done: \"success\",\n failed: \"error\",\n waiting: \"needs-input\",\n retrying: \"needs-input\",\n stopped: \"needs-input\",\n}\n\nconst TONE: Partial<Record<TraceStep[\"state\"], string>> = {\n failed: \"text-destructive\",\n waiting: \"text-warning\",\n retrying: \"text-warning\",\n stopped: \"text-warning\",\n}\n\n/** A step's line, saying its state where the dot alone would not. */\nexport function stepDescription(step: TraceStep): string | undefined {\n const detail = step.state === \"failed\" ? (step.error ?? step.detail) : step.detail\n switch (step.state) {\n case \"retrying\":\n return [`retrying ${step.attempt ?? 2}${step.attempts ? `/${step.attempts}` : \"\"}`, detail]\n .filter(Boolean)\n .join(\" · \")\n case \"waiting\":\n return [\"needs input\", detail].filter(Boolean).join(\" · \")\n case \"stopped\":\n return \"stopped\"\n default:\n return detail\n }\n}\n\nfunction IoRows({ label, rows }: { label: string; rows: TraceIoRow[] }) {\n return (\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <Eyebrow>{label}</Eyebrow>\n <PropertyList labelWidth=\"auto\" variant=\"summary\">\n {rows.map((row, i) => (\n <PropertyRow key={`${row.label}-${i}`} label={row.label} mono={row.code}>\n {row.code ? <pre className=\"m-0 whitespace-pre-wrap break-words\">{row.value}</pre> : row.value}\n </PropertyRow>\n ))}\n </PropertyList>\n </div>\n )\n}\n\n/** What went into a step and what came out: its audit record. */\nexport function StepRecord({ step }: { step: TraceStep }) {\n const input = step.io?.input ?? []\n const output = step.io?.output ?? []\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n {input.length ? <IoRows label=\"Input\" rows={input} /> : null}\n {output.length ? <IoRows label=\"Output\" rows={output} /> : null}\n {step.error ? <IoRows label=\"Error\" rows={[{ label: \"cause\", value: step.error }]} /> : null}\n </div>\n )\n}\n\nconst hasRecord = (step: TraceStep) => !!(step.io?.input?.length || step.io?.output?.length || step.error)\n\nexport interface StepRowProps {\n turn: AnswerTurn\n step: TraceStep\n /** Draw the streamed reasoning and the open record under the row. @default true */\n detail?: boolean\n /** In place of opening the record — the Tasks view jumps to the reply instead. */\n onSelect?: () => void\n /** Written after the description — `↑ 1.2k tokens`. */\n suffix?: string\n}\n\n/**\n * One step of a run: its state as a dot, its name, what it is doing, and its\n * time — counting up while it runs. Clicking it opens its record; while it\n * runs, its reasoning streams under it.\n */\nexport function StepRow({ turn, step, detail = true, onSelect, suffix }: StepRowProps) {\n const ctx = useChatSessionContext()\n const id = step.id ?? step.label\n const time = stepTime(step, ctx.now)\n const description = [stepDescription(step), suffix].filter(Boolean).join(\" · \")\n const open = detail && ctx.recordOpen(turn.id, id)\n const select =\n onSelect ??\n (hasRecord(step)\n ? () => ctx.toggleRecord(turn.id, id)\n : ctx.opensRuns\n ? () => ctx.emit({ type: \"open-run\", turn: turn.id, step: step.id })\n : undefined)\n return (\n <div className=\"flex min-w-0 flex-col\">\n <ChatSessionTaskRow\n status={ROW_STATUS[step.state]}\n name={step.label}\n description={description ? <span className={TONE[step.state]}>{description}</span> : undefined}\n meta={time !== undefined ? formatDuration(time) : undefined}\n onClick={select}\n />\n {detail && step.thinking && (step.state === \"running\" || step.state === \"retrying\") ? (\n <ChatSessionActivitySubLine className=\"pl-[22px] italic\">{step.thinking}</ChatSessionActivitySubLine>\n ) : null}\n {open && hasRecord(step) ? (\n <ChatSessionDisclosure\n className=\"my-0.5 ml-[22px]\"\n label={<span className=\"font-mono\">{step.key ?? step.label}</span>}\n meta={[\n step.attempt ? `attempt ${step.attempt}` : undefined,\n step.duration !== undefined ? formatDuration(step.duration) : undefined,\n ]\n .filter(Boolean)\n .join(\" · \")}\n open\n onOpenChange={() => ctx.toggleRecord(turn.id, id, false)}\n >\n <StepRecord step={step} />\n </ChatSessionDisclosure>\n ) : null}\n </div>\n )\n}\n\n/** Every step of an answer, in the order they run. */\nexport function StepList({ turn, className }: { turn: AnswerTurn; className?: string }) {\n return (\n <div className={cn(\"flex min-w-0 flex-col gap-px\", className)}>\n {(turn.trace ?? []).map((step, i) => (\n <StepRow key={step.id ?? i} turn={turn} step={step} />\n ))}\n </div>\n )\n}\n\nconst VERB = { done: \"Thought for\", failed: \"Failed after\", stopped: \"Stopped after\" } as const\n\n/**\n * A settled run in one line — `✻ Thought for 2.4s · 4 of 4 steps ▸`. The line\n * opens the steps; the time opens the whole run when the host does that\n * (`onOpenRun`), and the steps otherwise.\n */\nexport function RunSummaryLine({ turn }: { turn: AnswerTurn }) {\n const ctx = useChatSessionContext()\n const outcome = runOutcome(turn)\n const verb = VERB[outcome === \"failed\" || outcome === \"stopped\" ? outcome : \"done\"]\n const time = answerTime(turn, ctx.now)\n const { done, total } = stepCount(turn)\n const open = ctx.stepsOpen(turn.id, false)\n return (\n <div className=\"flex min-w-0 items-center gap-2 text-muted-foreground\">\n <span className=\"select-none text-border\" aria-hidden>\n ✻\n </span>\n <span className=\"min-w-0 truncate\">\n {verb}{\" \"}\n {time !== undefined ? (\n <button\n type=\"button\"\n className=\"tabular-nums underline-offset-2 hover:text-foreground hover:underline\"\n onClick={() =>\n ctx.opensRuns ? ctx.emit({ type: \"open-run\", turn: turn.id }) : ctx.setSteps(turn.id, !open)\n }\n >\n {formatDuration(time)}\n </button>\n ) : (\n \"—\"\n )}\n {total ? ` · ${done} of ${total} steps` : null}\n </span>\n {total ? (\n <button\n type=\"button\"\n aria-expanded={open}\n aria-label={open ? \"Fold the steps\" : \"Show the steps\"}\n className=\"hover:text-foreground\"\n onClick={() => ctx.setSteps(turn.id, !open)}\n >\n <span className={cn(\"inline-block transition-transform\", open && \"rotate-90\")}>▸</span>\n </button>\n ) : null}\n </div>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"@invana/ui\"\n\nimport {\n ChatSessionActivityRow,\n type ChatSessionActivityStatus,\n ChatSessionActivitySubLine,\n ChatSessionFrame,\n ChatSessionProgressLine,\n ChatSessionPromptRow,\n ChatSessionStatusBar,\n ChatSessionTaskGroup,\n} from \"../../conversations/thread\"\nimport type { AnswerTurn, AskTurn } from \"../../protocol/types\"\nimport { AskView } from \"../base/ask\"\nimport { BlockStack, BlockView, OutcomeView, splitBlocks } from \"../base/blocks\"\nimport { AnswerLine, KeyHints, SessionHeader } from \"../base/chrome\"\nimport { ComposerBar } from \"../base/composer\"\nimport { useChatSessionContext } from \"../base/context\"\nimport { clockTime, formatDuration } from \"../base/format\"\nimport {\n answerTime,\n currentStep,\n exchangesOf,\n exchangeState,\n type Exchange,\n isAnswer,\n runOutcome,\n type RunOutcome,\n threadCounts,\n turnDomId,\n} from \"../base/model\"\nimport { RunSummaryLine, StepList, StepRow } from \"../base/steps\"\n\nconst ANSWER_DOT: Record<RunOutcome, ChatSessionActivityStatus> = {\n live: \"pending\",\n waiting: \"info\",\n done: \"success\",\n failed: \"error\",\n stopped: \"warning\",\n}\n\nconst ASK_DOT: Record<string, ChatSessionActivityStatus> = {\n pending: \"info\",\n answered: \"success\",\n skipped: \"default\",\n superseded: \"default\",\n expired: \"default\",\n}\n\n/** Open the reply in the chat, steps showing, and scroll to it. */\nfunction useJump() {\n const ctx = useChatSessionContext()\n return (turnId: string) => {\n ctx.setView(\"chat\")\n ctx.toggleSteps(turnId, true)\n ctx.scrollToTurn(turnId)\n }\n}\n\n/**\n * An answer as the console draws it: a status dot, then its blocks — every\n * one through the registry, bare, the row being the frame — its steps under\n * it while it runs and folded to one line after, what it produced, and what\n * can be done with it.\n */\nfunction CliAnswer({ turn }: { turn: AnswerTurn }) {\n const ctx = useChatSessionContext()\n const outcome = runOutcome(turn)\n const live = outcome === \"live\" || outcome === \"waiting\"\n const { inCard, own, hasEvidence } = splitBlocks(turn, ctx.registry)\n const blocks = [...inCard, ...own]\n const step = currentStep(turn)\n const time = answerTime(turn, ctx.now)\n const showSteps = !!turn.trace?.length && (live || ctx.stepsOpen(turn.id, false))\n\n const body =\n live && !hasEvidence ? (\n <ChatSessionProgressLine\n className=\"-ml-[22px]\"\n elapsed={time !== undefined ? formatDuration(time) : undefined}\n // Waiting on the analyst is not work in flight: no spinner, the ask's tone.\n spinner={outcome === \"waiting\" ? <span className=\"size-1.5 rounded-full bg-info\" aria-hidden /> : undefined}\n >\n {outcome === \"waiting\" ? \"Waiting on your answer\" : step ? `${step.label}…` : \"Planning…\"}\n </ChatSessionProgressLine>\n ) : blocks.length ? (\n <BlockStack className=\"whitespace-normal\">\n {blocks.map((b, i) => (\n <BlockView key={`${b.kind}-${i}`} block={b} turn={turn} registry={ctx.registry} onEvent={ctx.emit} />\n ))}\n </BlockStack>\n ) : outcome === \"failed\" ? (\n \"The run failed.\"\n ) : outcome === \"stopped\" ? (\n \"Stopped by you.\"\n ) : null\n\n return (\n <ChatSessionActivityRow\n status={ANSWER_DOT[outcome]}\n meta={!live && turn.meta ? turn.meta : undefined}\n footer={\n <>\n {live && turn.trace?.length ? <StepList turn={turn} className=\"pt-0.5\" /> : null}\n {!live ? (\n // The run in one line, and what can be done with the answer at its right.\n <AnswerLine turn={turn}>{turn.trace?.length ? <RunSummaryLine turn={turn} /> : null}</AnswerLine>\n ) : null}\n {!live && showSteps ? <StepList turn={turn} className=\"pt-0.5\" /> : null}\n {turn.outcome && !live ? (\n <OutcomeView\n className=\"mt-0.5\"\n outcome={turn.outcome}\n turn={turn}\n onEvent={ctx.emit}\n tone={outcome === \"failed\" ? \"bad\" : undefined}\n />\n ) : null}\n {outcome === \"stopped\" ? (\n <ChatSessionActivitySubLine>Interrupted · ask again, or narrow the question</ChatSessionActivitySubLine>\n ) : null}\n </>\n }\n >\n {body}\n </ChatSessionActivityRow>\n )\n}\n\nfunction CliAsk({ turn }: { turn: AskTurn }) {\n const ctx = useChatSessionContext()\n return (\n <ChatSessionActivityRow status={ASK_DOT[turn.state] ?? \"default\"}>\n <div className=\"whitespace-normal\">\n <AskView turn={turn} registry={ctx.registry} onEvent={ctx.emit} now={ctx.now} />\n </div>\n </ChatSessionActivityRow>\n )\n}\n\nfunction CliExchange({ exchange }: { exchange: Exchange }) {\n const ctx = useChatSessionContext()\n const prompt = exchange.prompt\n return (\n <div className=\"contents\">\n {prompt ? (\n <div id={turnDomId(ctx.spec, prompt.id)} className=\"scroll-mt-3\">\n <ChatSessionPromptRow meta={prompt.at ? <span className=\"tabular-nums\">{clockTime(prompt.at)}</span> : undefined}>\n {prompt.text}\n </ChatSessionPromptRow>\n </div>\n ) : null}\n {exchange.replies.map((reply) => (\n <div key={reply.id} id={turnDomId(ctx.spec, reply.id)} className=\"min-w-0 scroll-mt-3\">\n {isAnswer(reply) ? <CliAnswer turn={reply} /> : <CliAsk turn={reply} />}\n </div>\n ))}\n </div>\n )\n}\n\nconst WEIGHT = { running: 0, waiting: 1, settled: 2 } as const\n\n/**\n * Every step of every reply, grouped by prompt, newest first — what runs and\n * what waits on you float to the top. A row jumps to its reply.\n */\nfunction CliTasks() {\n const ctx = useChatSessionContext()\n const jump = useJump()\n const blocks = (ask: AskTurn) => ctx.registry.askTraits(ask.ask.kind).frame === \"card\"\n const groups = exchangesOf(ctx.spec)\n .filter((e) => e.replies.some((r) => isAnswer(r) && r.trace?.length))\n .reverse()\n .sort((a, b) => WEIGHT[exchangeState(a, blocks)] - WEIGHT[exchangeState(b, blocks)])\n return (\n <>\n {groups.map((exchange) => {\n const state = exchangeState(exchange, blocks)\n const answers = exchange.replies.filter(isAnswer)\n const total = answers.reduce((sum, a) => sum + (answerTime(a, ctx.now) ?? 0), 0)\n const when = clockTime(exchange.prompt?.at)\n const said = state === \"running\" ? \"running\" : state === \"waiting\" ? \"waiting on you\" : formatDuration(total)\n return (\n <ChatSessionTaskGroup\n key={exchange.id}\n heading={\n <div className=\"flex justify-between gap-2\">\n <span className=\"min-w-0 truncate\" title={exchange.prompt?.text}>\n {exchange.prompt?.text ?? ctx.spec.title}\n </span>\n <span className=\"shrink-0 font-normal text-muted-foreground tabular-nums\">\n {[when, said].filter(Boolean).join(\" · \")}\n </span>\n </div>\n }\n >\n {answers.flatMap((a) =>\n (a.trace ?? []).map((s, i) => (\n <StepRow key={`${a.id}-${s.id ?? i}`} turn={a} step={s} detail={false} onSelect={() => jump(a.id)} />\n )),\n )}\n </ChatSessionTaskGroup>\n )\n })}\n </>\n )\n}\n\n/** While anything runs, the step it is on stays pinned above the composer. */\nfunction PinnedSteps() {\n const ctx = useChatSessionContext()\n const jump = useJump()\n const live = ctx.spec.turns.filter(\n (t): t is AnswerTurn => isAnswer(t) && (runOutcome(t) === \"live\" || runOutcome(t) === \"waiting\"),\n )\n if (!live.length) return null\n return (\n <div className=\"border-b border-border px-3 py-1.5\">\n {live.map((a) => {\n const step = currentStep(a) ?? a.trace?.[0]\n return step ? (\n <StepRow key={a.id} turn={a} step={step} detail={false} onSelect={() => jump(a.id)} />\n ) : null\n })}\n </div>\n )\n}\n\nexport interface CliSessionProps {\n running: boolean\n onStop: () => void\n /** `true` draws the session's own header; a node is drawn in its place. */\n header: React.ReactNode\n onClose?: () => void\n emptyState?: React.ReactNode\n className?: string\n}\n\n/**\n * The console: your prompt as a caret row, every reply a status-dotted row\n * with the steps that produced it under it, the running step pinned above the\n * composer, and a status bar that switches to every step of the session.\n */\nexport function CliSession({ running, onStop, header, onClose, emptyState, className }: CliSessionProps) {\n const ctx = useChatSessionContext()\n const counts = threadCounts(ctx.spec, (ask) => ctx.registry.askTraits(ask.ask.kind).frame === \"card\")\n const tasks = ctx.view === \"tasks\"\n const viewButton = (target: \"chat\" | \"tasks\", label: string) => (\n <button\n type=\"button\"\n aria-pressed={ctx.view === target}\n onClick={() => ctx.setView(target)}\n className={ctx.view === target ? \"font-medium text-foreground\" : \"hover:text-foreground\"}\n >\n {label}\n </button>\n )\n return (\n <div className={cn(\"flex h-full min-h-0 flex-col bg-background\", className)}>\n {header === true ? <SessionHeader onClose={onClose} /> : header || null}\n <ChatSessionFrame\n className=\"min-h-0 flex-1\"\n autoScrollKey={`${ctx.view}-${ctx.spec.turns.length}`}\n emptyState={emptyState}\n bodyClassName={tasks ? \"gap-[18px]\" : undefined}\n footer={\n <div className=\"border-t border-border\">\n {!tasks ? <PinnedSteps /> : null}\n <ComposerBar isRunning={running} onStop={onStop} />\n <ChatSessionStatusBar\n className=\"pt-0\"\n start={\n <>\n {viewButton(\"chat\", \"Chat\")}\n {viewButton(\"tasks\", `Tasks (${counts.steps})`)}\n {counts.running ? (\n <span className=\"text-primary\">{counts.running} running</span>\n ) : counts.waiting ? (\n <span className=\"text-warning\">{counts.waiting} needs input</span>\n ) : null}\n </>\n }\n end={ctx.spec.composer?.hints === false ? undefined : <KeyHints running={running} />}\n />\n </div>\n }\n >\n {tasks ? <CliTasks /> : exchangesOf(ctx.spec).map((e) => <CliExchange key={e.id} exchange={e} />)}\n </ChatSessionFrame>\n </div>\n )\n}\n","import type * as React from \"react\"\n\nimport type { RegistryOverrides } from \"../conversations/registry\"\nimport type { ConversationEvent, ConversationEventType } from \"../protocol/events\"\nimport type { PatchSource } from \"../protocol/stream\"\nimport type { AnswerState, ConversationSpec } from \"../protocol/types\"\n\n/** `cli` is the console: caret prompts, status-dotted replies, step rows, a Tasks view. `web` is the chat: labelled turns, answer cards. */\nexport type ChatSessionVariant = \"cli\" | \"web\"\n\n/** The event of one type — `ChatSessionEventOf<\"reply\">` is `{ type: \"reply\"; turn; value }`. */\nexport type ChatSessionEventOf<T extends ConversationEventType> = Extract<ConversationEvent, { type: T }>\n\ntype Camel<S extends string> = S extends `${infer Head}-${infer Rest}` ? `${Head}${Capitalize<Camel<Rest>>}` : S\n\n/**\n * One typed callback per event: `onPrompt`, `onReply`, `onAction`,\n * `onOpenRun`, `onRate`, `onStop`, … Each receives exactly its event. They are\n * derived from {@link ConversationEvent}, so an event added to the protocol\n * gets its callback here with no other change.\n */\nexport type ChatSessionHandlers = {\n [T in ConversationEventType as `on${Capitalize<Camel<T>>}`]?: (event: ChatSessionEventOf<T>) => void\n}\n\n/**\n * The glyphs the session draws. The kit ships no icon set: pass your own nodes\n * (`{ send: <ArrowUp /> }`); anything left out falls back to a text glyph.\n */\nexport interface ChatSessionIcons {\n send: React.ReactNode\n stop: React.ReactNode\n attach: React.ReactNode\n close: React.ReactNode\n retry: React.ReactNode\n copy: React.ReactNode\n steps: React.ReactNode\n rateUp: React.ReactNode\n rateDown: React.ReactNode\n}\n\n/**\n * The actions on a settled answer, beside its time. `retry` is sent as\n * `retry`, `copy` as `copy` (and written to the clipboard), `steps` as\n * `toggle-steps`, `rate` as `rate`.\n */\nexport type ChatSessionBuiltInAction = \"retry\" | \"copy\" | \"steps\" | \"rate\"\n\n/** An action of your own on a settled answer, sent as an `action` event with its `id`. */\nexport interface ChatSessionCustomAction {\n id: string\n /** Its accessible name and tooltip. */\n label: string\n icon: React.ReactNode\n /** Only on answers in these states. Every settled state when left out. */\n states?: AnswerState[]\n}\n\nexport type ChatSessionAnswerAction = ChatSessionBuiltInAction | ChatSessionCustomAction\n\nexport const DEFAULT_ANSWER_ACTIONS: ChatSessionAnswerAction[] = [\"retry\", \"copy\", \"steps\", \"rate\"]\n\n/** What the CLI variant shows: the thread, or every step of every reply. */\nexport type ChatSessionView = \"chat\" | \"tasks\"\n\nexport interface ChatSessionProps extends ChatSessionHandlers {\n /**\n * The whole conversation, as JSON — what the API sends. Controlled: apply\n * patches to it (`applyPatch`, `useChatSession`) and pass the result, or\n * hand the patches over as `stream`.\n */\n spec: ConversationSpec\n /** @default \"web\" */\n variant?: ChatSessionVariant\n /**\n * Every event, whatever its type, after its own callback — the one place to\n * forward everything to an API.\n */\n onEvent?: (event: ConversationEvent) => void\n /**\n * Patches to apply as they arrive — a streaming fetch (`fromNdjson`), an\n * EventSource (`fromEventSource`), a generator, or a recorded script\n * (`playScript`). The session draws `spec` with them applied; a new `spec`\n * starts over from it. Stopping ends the stream and records how far it got.\n *\n * Pass a function, `(signal) => source`, to open the source afresh each time\n * the session mounts — a generator can be read only once. Keep it stable\n * (module scope, `useCallback`): a new one starts a new stream.\n */\n stream?: PatchSource | ((signal: AbortSignal) => PatchSource) | null\n /** The stream ended; `spec` is the conversation as it left it. */\n onStreamEnd?: (spec: ConversationSpec) => void\n /** A patch did not apply, or the source failed. The stream stops there. */\n onStreamError?: (error: unknown) => void\n /** Renderers and traits of your own asks and blocks, merged over the built-ins. */\n registry?: RegistryOverrides\n icons?: Partial<ChatSessionIcons>\n /**\n * The actions beside a settled answer's time, in order — the built-ins by\n * name, yours as `{ id, label, icon }`. `[]` shows none.\n * @default [\"retry\", \"copy\", \"steps\", \"rate\"]\n */\n actions?: ChatSessionAnswerAction[]\n /**\n * The clock, in ms. Left out, the session ticks while anything runs so\n * elapsed times move; a story passes a fixed one to read the same every run.\n */\n now?: number\n /** Shows a close control in the header. */\n onClose?: () => void\n /**\n * The header. `true` draws the session's own — title, turn count, close;\n * `false` draws none; any node is drawn in its place, so a host composes\n * its own header from whatever it needs. @default true when the spec has a title\n */\n header?: boolean | React.ReactNode\n /** Shown when the spec has no turns yet. */\n emptyState?: React.ReactNode\n /** The CLI's view, controlled. */\n view?: ChatSessionView\n /** @default \"chat\" */\n defaultView?: ChatSessionView\n onViewChange?: (view: ChatSessionView) => void\n className?: string\n}\n\n/** What a parent can do to a session it holds a ref to. */\nexport interface ChatSessionHandle {\n /** Scroll a turn into view. */\n scrollToTurn: (turnId: string) => void\n /** Open or fold an answer's steps. */\n showSteps: (turnId: string, open?: boolean) => void\n /** Open one step's record — what went in and came out. */\n openStep: (turnId: string, stepId: string) => void\n setView: (view: ChatSessionView) => void\n /** Focus the composer. */\n focusComposer: () => void\n}\n","import * as React from \"react\"\nimport { cn } from \"@invana/ui\"\n\nexport interface TurnLabelProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Who is speaking — the analyst's name, or `Assistant`. */\n children: React.ReactNode\n /** `end` over the analyst's prompt, which sits at the right; `start` over an ask. */\n align?: \"start\" | \"end\"\n}\n\n/**\n * Who is speaking, over the turn they spoke — `RESEARCHER`, `ASSISTANT`.\n *\n * Drawn over the analyst's prompts and the assistant's asks, the two kinds of\n * turn that address someone. An answer is a card with its own header and needs\n * no label. Mono, small and spaced, so it reads as a tag on the turn rather than\n * a heading of the thread.\n */\nexport const TurnLabel = React.forwardRef<HTMLDivElement, TurnLabelProps>(\n ({ align = \"start\", className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"font-mono text-xs tracking-wider text-muted-foreground uppercase\",\n align === \"end\" && \"text-right\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n ),\n)\nTurnLabel.displayName = \"TurnLabel\"\n","import * as React from \"react\"\nimport { cn } from \"@invana/ui\"\n\nimport { EmissionBody, EmissionCard } from \"../../answers\"\nimport { TurnLabel } from \"../../conversations/turn-label\"\nimport { ChatSessionFrame, ChatSessionMessage, ChatSessionStatusBar } from \"../../conversations/thread\"\nimport type { AnswerTurn } from \"../../protocol/types\"\nimport { AskView } from \"../base/ask\"\nimport { BlockView, citationOf, OutcomeView, splitBlocks } from \"../base/blocks\"\nimport { AnswerLine, KeyHints, SessionHeader } from \"../base/chrome\"\nimport { ComposerBar } from \"../base/composer\"\nimport { useChatSessionContext } from \"../base/context\"\nimport { clockTime, dayLabel, formatDuration, sameDay } from \"../base/format\"\nimport { answerTime, exchangesOf, type Exchange, isAnswer, runOutcome, turnDomId } from \"../base/model\"\nimport { StepList } from \"../base/steps\"\n\nconst RUN_WORDS = { done: \"Answered in\", failed: \"Failed after\", stopped: \"Stopped after\" } as const\n\n/** Under a settled answer: when, and how long it took — the time opens the run. */\nfunction RunLine({ turn }: { turn: AnswerTurn }) {\n const ctx = useChatSessionContext()\n const outcome = runOutcome(turn)\n const time = answerTime(turn, ctx.now)\n const at = clockTime(turn.at)\n const words = RUN_WORDS[outcome === \"failed\" || outcome === \"stopped\" ? outcome : \"done\"]\n const open = ctx.stepsOpen(turn.id, false)\n return (\n <div className=\"flex min-w-0 items-center gap-1.5 text-sm text-muted-foreground\">\n {at ? <span className=\"tabular-nums\">{at}</span> : null}\n {at && time !== undefined ? <span aria-hidden>·</span> : null}\n {time !== undefined ? (\n <button\n type=\"button\"\n aria-haspopup={ctx.opensRuns ? \"dialog\" : undefined}\n aria-expanded={ctx.opensRuns ? undefined : open}\n className=\"underline decoration-dotted underline-offset-2 hover:text-foreground\"\n onClick={() =>\n ctx.opensRuns ? ctx.emit({ type: \"open-run\", turn: turn.id }) : ctx.setSteps(turn.id, !open)\n }\n >\n {words} {formatDuration(time, { spaced: true })}\n </button>\n ) : null}\n </div>\n )\n}\n\n/**\n * An answer as the chat draws it: the live steps while it runs; the evidence\n * in one card, with its envelope; blocks that are cards of their own under it;\n * what the run produced; then when it was answered and in how long.\n */\nexport function WebAnswer({ turn, chrome = true }: { turn: AnswerTurn; chrome?: boolean }) {\n const ctx = useChatSessionContext()\n const outcome = runOutcome(turn)\n const live = outcome === \"live\" || outcome === \"waiting\"\n const { inCard, own, hasEvidence } = splitBlocks(turn, ctx.registry)\n const block = (b: (typeof inCard)[number], i: number) => (\n <BlockView key={`${b.kind}-${i}`} block={b} turn={turn} registry={ctx.registry} onEvent={ctx.emit} />\n )\n const steps = !!turn.trace?.length && (live || ctx.stepsOpen(turn.id, outcome === \"failed\"))\n\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n {live && !turn.trace?.length && !hasEvidence ? (\n <ChatSessionMessage role=\"assistant\" status=\"running\">\n Working\n </ChatSessionMessage>\n ) : null}\n {steps ? (\n <EmissionCard kind={live ? (outcome === \"waiting\" ? \"waiting\" : \"running\") : \"steps\"}>\n <EmissionBody>\n <StepList turn={turn} />\n </EmissionBody>\n </EmissionCard>\n ) : null}\n {hasEvidence ? (\n <EmissionCard\n kind={turn.label ?? turn.pattern ?? \"answer\"}\n title={turn.title}\n citation={\n citationOf(turn) ??\n turn.aside ??\n (live && !inCard.some((b) => b.status === \"loading\") ? \"writing…\" : undefined)\n }\n note={turn.state === \"partial\" ? turn.state : undefined}\n >\n <EmissionBody>{inCard.map(block)}</EmissionBody>\n </EmissionCard>\n ) : null}\n {own.map(block)}\n {!hasEvidence && !own.length && (outcome === \"failed\" || outcome === \"stopped\") ? (\n <ChatSessionMessage role=\"assistant\" status={outcome === \"failed\" ? \"error\" : \"stopped\"}>\n {outcome === \"failed\" ? \"The run failed.\" : \"Stopped by you.\"}\n </ChatSessionMessage>\n ) : null}\n {turn.outcome && !live ? (\n <OutcomeView outcome={turn.outcome} turn={turn} onEvent={ctx.emit} tone={outcome === \"failed\" ? \"bad\" : undefined} />\n ) : null}\n {chrome && !live ? (\n <AnswerLine turn={turn}>\n <RunLine turn={turn} />\n </AnswerLine>\n ) : null}\n </div>\n )\n}\n\nfunction WebExchange({ exchange, dayBreak }: { exchange: Exchange; dayBreak?: string }) {\n const ctx = useChatSessionContext()\n const you = ctx.spec.analyst ?? \"You\"\n const assistant = ctx.spec.assistant ?? \"Assistant\"\n const prompt = exchange.prompt\n const sentAt = clockTime(prompt?.at)\n return (\n <>\n {dayBreak ? (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\" role=\"separator\">\n <span className=\"h-px flex-1 bg-border\" />\n <span>{dayBreak}</span>\n <span className=\"h-px flex-1 bg-border\" />\n </div>\n ) : null}\n {prompt ? (\n <div id={turnDomId(ctx.spec, prompt.id)} className=\"flex scroll-mt-3 flex-col gap-1\">\n <TurnLabel align=\"end\">{you}</TurnLabel>\n <ChatSessionMessage role=\"user\">{prompt.text}</ChatSessionMessage>\n {sentAt ? <span className=\"self-end text-sm text-muted-foreground tabular-nums\">{sentAt}</span> : null}\n </div>\n ) : null}\n {exchange.replies.length ? (\n <div className=\"flex min-w-0 flex-col gap-2\">\n <TurnLabel>{assistant}</TurnLabel>\n {exchange.replies.map((reply) => (\n <div key={reply.id} id={turnDomId(ctx.spec, reply.id)} className=\"min-w-0 scroll-mt-3\">\n {isAnswer(reply) ? (\n <WebAnswer turn={reply} />\n ) : (\n <AskView turn={reply} registry={ctx.registry} onEvent={ctx.emit} now={ctx.now} />\n )}\n </div>\n ))}\n </div>\n ) : null}\n </>\n )\n}\n\n/**\n * The day line over each exchange that starts a new day — the first one too,\n * so the thread opens with when it is from. Exchanges with no time take none.\n */\nfunction dayBreaks(exchanges: Exchange[], now: number): (string | undefined)[] {\n let last: string | undefined\n return exchanges.map((exchange) => {\n const at = exchange.prompt?.at\n if (!at) return undefined\n const label = last === undefined || !sameDay(last, at) ? dayLabel(at, now) : undefined\n last = at\n return label\n })\n}\n\nexport interface WebSessionProps {\n running: boolean\n onStop: () => void\n /** `true` draws the session's own header; a node is drawn in its place. */\n header: React.ReactNode\n onClose?: () => void\n emptyState?: React.ReactNode\n className?: string\n}\n\n/**\n * The chat: who is speaking over each turn, the prompt as a bubble with its\n * time, the assistant's asks and answer cards under it, a day line where the\n * day changes, and the composer.\n */\nexport function WebSession({ running, onStop, header, onClose, emptyState, className }: WebSessionProps) {\n const ctx = useChatSessionContext()\n const exchanges = exchangesOf(ctx.spec)\n const breaks = dayBreaks(exchanges, ctx.now)\n return (\n <div className={cn(\"flex h-full min-h-0 flex-col bg-background\", className)}>\n {header === true ? <SessionHeader onClose={onClose} /> : header || null}\n <ChatSessionFrame\n className=\"min-h-0 flex-1\"\n autoScrollKey={ctx.spec.turns.length}\n emptyState={emptyState}\n bodyClassName=\"mx-auto w-full max-w-[52rem] gap-5\"\n footer={\n <div className=\"mx-auto w-full max-w-[52rem]\">\n <ComposerBar isRunning={running} onStop={onStop} />\n <ChatSessionStatusBar\n className=\"pt-0\"\n start={ctx.spec.assistant ? <span className=\"truncate\">{ctx.spec.assistant}</span> : undefined}\n end={ctx.spec.composer?.hints === false ? undefined : <KeyHints running={running} />}\n />\n </div>\n }\n >\n {exchanges.map((exchange, i) => (\n <WebExchange key={exchange.id} exchange={exchange} dayBreak={breaks[i]} />\n ))}\n </ChatSessionFrame>\n </div>\n )\n}\n","import * as React from \"react\"\nimport { useStreamedSpec } from \"@invana/blocks\"\n\nimport { resolveRegistry } from \"../conversations/registry\"\nimport type { ConversationEvent } from \"../protocol/events\"\nimport { applyPatches } from \"../protocol/reduce\"\nimport { stopPatches } from \"../protocol/stream\"\nimport { useStopKey } from \"./base/chrome\"\nimport {\n ChatSessionContext,\n type ChatSessionContextValue,\n DEFAULT_ICONS,\n useClock,\n useViewState,\n} from \"./base/context\"\nimport { isAnswer, runOutcome, turnDomId } from \"./base/model\"\nimport { CliSession } from \"./cli/cli-session\"\nimport { type ChatSessionHandle, type ChatSessionProps, type ChatSessionView, DEFAULT_ANSWER_ACTIONS } from \"./types\"\nimport { WebSession } from \"./web/web-session\"\n\n/** `open-run` → `onOpenRun`: the callback prop an event goes to. */\nconst handlerName = (type: string) =>\n `on${type.replace(/(^|-)([a-z])/g, (_, __, c: string) => c.toUpperCase())}`\n\n/**\n * A conversation with the assistant, drawn from JSON alone, in one of two\n * variants: `cli`, the console, or `web`, the chat.\n *\n * The API sends a {@link ConversationSpec}, then patches — pass the patched\n * spec, or the patches themselves as `stream`. Every ask and block is drawn by\n * the block registry, so templates of your own draw exactly like the\n * built-ins; the session itself knows no block. Everything the analyst does\n * comes back as a typed event: to its own callback (`onReply`, `onAction`,\n * `onOpenRun`, …) and then to `onEvent`.\n */\nexport const ChatSession = React.forwardRef<ChatSessionHandle, ChatSessionProps>(function ChatSession(\n props,\n ref,\n) {\n const {\n spec,\n variant = \"web\",\n stream,\n onStreamEnd,\n onStreamError,\n registry,\n icons,\n now: fixedNow,\n onClose,\n header,\n emptyState,\n view: controlledView,\n defaultView = \"chat\",\n actions = DEFAULT_ANSWER_ACTIONS,\n className,\n } = props\n\n // Read as every shell reads its stream; stopping records how far it got.\n const { live, stop: stopStream } = useStreamedSpec(spec, stream, applyPatches, {\n onEnd: onStreamEnd,\n onError: onStreamError,\n stopPatches,\n })\n // A run held on the analyst's answer is not in flight: the composer takes\n // their words, and there is nothing to stop.\n const running = live.turns.some((t) => isAnswer(t) && runOutcome(t) === \"live\")\n const now = useClock(fixedNow, running)\n const resolved = React.useMemo(() => resolveRegistry(registry), [registry])\n const resolvedIcons = React.useMemo(() => ({ ...DEFAULT_ICONS, ...icons }), [icons])\n const viewState = useViewState()\n const [uncontrolledView, setUncontrolledView] = React.useState<ChatSessionView>(defaultView)\n const view = controlledView ?? uncontrolledView\n const root = React.useRef<HTMLDivElement>(null)\n const composer = React.useRef<HTMLDivElement | null>(null)\n const setComposer = React.useCallback((element: HTMLDivElement | null) => {\n composer.current = element\n }, [])\n\n // The latest props and spec, so `emit` and the rest stay one function for the session's life.\n const latest = React.useRef(props)\n const liveRef = React.useRef(live)\n React.useLayoutEffect(() => {\n latest.current = props\n liveRef.current = live\n })\n const emit = React.useCallback((event: ConversationEvent) => {\n const handler = (latest.current as unknown as Record<string, unknown>)[handlerName(event.type)]\n if (typeof handler === \"function\") handler(event)\n latest.current.onEvent?.(event)\n }, [])\n\n const stop = React.useCallback(() => {\n stopStream()\n emit({ type: \"stop\" })\n }, [stopStream, emit])\n useStopKey(running, stop)\n\n const setView = React.useCallback(\n (next: ChatSessionView) => {\n if (latest.current.view === undefined) setUncontrolledView(next)\n latest.current.onViewChange?.(next)\n },\n [],\n )\n\n const scrollToTurn = React.useCallback((turnId: string) => {\n // After the frame's own follow-the-bottom, which a step list opening would trigger.\n setTimeout(() => {\n const id = turnDomId(liveRef.current, turnId)\n root.current\n ?.querySelector(`[id=\"${CSS.escape(id)}\"]`)\n ?.scrollIntoView({ block: \"start\", behavior: \"smooth\" })\n }, 80)\n }, [])\n const focusComposer = React.useCallback(() => {\n composer.current?.querySelector(\"textarea\")?.focus()\n }, [])\n\n React.useImperativeHandle(\n ref,\n () => ({\n scrollToTurn,\n showSteps: (turnId, open = true) => viewState.toggleSteps(turnId, open),\n openStep: (turnId, stepId) => {\n viewState.toggleSteps(turnId, true)\n viewState.toggleRecord(turnId, stepId, true)\n scrollToTurn(turnId)\n },\n setView,\n focusComposer,\n }),\n [scrollToTurn, setView, focusComposer, viewState],\n )\n\n const context: ChatSessionContextValue = {\n spec: live,\n registry: resolved,\n emit,\n icons: resolvedIcons,\n now,\n opensRuns: typeof props.onOpenRun === \"function\",\n stepsOpen: viewState.stepsOpen,\n toggleSteps: viewState.toggleSteps,\n setSteps: (turnId, open) => {\n viewState.toggleSteps(turnId, open)\n emit({ type: \"toggle-steps\", turn: turnId, open })\n },\n actions,\n recordOpen: viewState.recordOpen,\n toggleRecord: viewState.toggleRecord,\n rating: viewState.rating,\n rate: viewState.setRating,\n view,\n setView,\n scrollToTurn,\n focusComposer,\n setComposer,\n }\n\n const shared = {\n running,\n onStop: stop,\n header: header === undefined ? !!live.title : header,\n onClose,\n emptyState,\n className,\n }\n return (\n <ChatSessionContext.Provider value={context}>\n <div ref={root} data-variant={variant} className=\"contents\">\n {variant === \"cli\" ? <CliSession {...shared} /> : <WebSession {...shared} />}\n </div>\n </ChatSessionContext.Provider>\n )\n})\n","import * as React from \"react\"\n\nimport { applyPatches, type ConversationPatch } from \"../protocol/reduce\"\nimport {\n isRunning,\n type PatchScript,\n type PatchSource,\n patchesOf,\n playScript,\n stopPatches,\n} from \"../protocol/stream\"\nimport type { ConversationSpec } from \"../protocol/types\"\n\nexport interface UseChatSession {\n /** The conversation as it stands — pass it to `<ChatSession spec>`. */\n spec: ConversationSpec\n /** Apply a patch, or several in order. */\n apply: (patch: ConversationPatch | ConversationPatch[]) => void\n /**\n * Apply a stream of patches as they arrive — `fromNdjson(await fetch(…))`,\n * `fromEventSource(…)`, a generator. Resolves with the spec where it ended.\n * A stream started while another runs runs beside it; `stop()` ends both.\n */\n stream: (source: PatchSource) => Promise<ConversationSpec>\n /** Replay a recorded script, on its own timing. */\n play: (script: PatchScript, options?: { speed?: number }) => Promise<ConversationSpec>\n /** End every stream, and mark what was running as stopped where it stood. */\n stop: () => void\n /** Start over from a spec, ending every stream. */\n reset: (spec: ConversationSpec) => void\n /** Whether a stream is still arriving. */\n streaming: boolean\n /** Whether anything in the spec is still running. */\n running: boolean\n}\n\n/**\n * A conversation's state for a host that drives it: the spec, and the ways\n * patches reach it. The session draws; this holds.\n *\n * ```tsx\n * const chat = useChatSession(initial)\n * <ChatSession spec={chat.spec} onPrompt={(e) => chat.stream(fromNdjson(await ask(e.text)))} onStop={chat.stop} />\n * ```\n */\nexport function useChatSession(initial: ConversationSpec | (() => ConversationSpec)): UseChatSession {\n const [spec, setSpec] = React.useState(initial)\n const current = React.useRef(spec)\n const controllers = React.useRef(new Set<AbortController>())\n const [streams, setStreams] = React.useState(0)\n\n const set = React.useCallback((next: ConversationSpec) => {\n current.current = next\n setSpec(next)\n }, [])\n\n const apply = React.useCallback(\n (patch: ConversationPatch | ConversationPatch[]) =>\n set(applyPatches(current.current, Array.isArray(patch) ? patch : [patch])),\n [set],\n )\n\n const run = React.useCallback(\n async (open: (signal: AbortSignal) => PatchSource) => {\n const controller = new AbortController()\n controllers.current.add(controller)\n setStreams((n) => n + 1)\n try {\n for await (const batch of patchesOf(open(controller.signal))) {\n if (controller.signal.aborted) break\n set(applyPatches(current.current, batch))\n }\n } finally {\n controllers.current.delete(controller)\n setStreams((n) => n - 1)\n }\n return current.current\n },\n [set],\n )\n\n const stream = React.useCallback((source: PatchSource) => run(() => source), [run])\n const play = React.useCallback(\n (script: PatchScript, options?: { speed?: number }) =>\n run((signal) => playScript(script, { ...options, signal })),\n [run],\n )\n\n const abortAll = () => {\n for (const c of controllers.current) c.abort()\n controllers.current.clear()\n }\n\n const stop = React.useCallback(() => {\n abortAll()\n set(applyPatches(current.current, stopPatches(current.current)))\n }, [set])\n\n const reset = React.useCallback(\n (next: ConversationSpec) => {\n abortAll()\n set(next)\n },\n [set],\n )\n\n // Streams end with the component that started them.\n React.useEffect(() => () => abortAll(), [])\n\n return { spec, apply, stream, play, stop, reset, streaming: streams > 0, running: isRunning(spec) }\n}\n","import * as React from \"react\"\n\nimport { type RegistryOverrides, resolveRegistry } from \"../../conversations/registry\"\nimport { ChatSessionMessage } from \"../../conversations/thread\"\nimport type { ConversationEvent } from \"../../protocol/events\"\nimport type { Turn } from \"../../protocol/types\"\nimport { AskView } from \"../base/ask\"\nimport { ChatSessionContext, type ChatSessionContextValue, DEFAULT_ICONS, useViewState } from \"../base/context\"\nimport { WebAnswer } from \"./web-session\"\n\nexport interface ChatSessionTurnProps {\n turn: Turn\n onEvent?: (event: ConversationEvent) => void\n registry?: RegistryOverrides\n /** The clock an answered ask's time is read against, in ms. Defaults to the time of render. */\n now?: number\n}\n\n/**\n * One turn on its own, as the web variant draws it — the analyst's prompt,\n * an ask in its frame, or an answer's cards — without the thread around it.\n * For a block's board, where each cell is one turn.\n */\nexport function ChatSessionTurn({ turn, onEvent, registry, now }: ChatSessionTurnProps) {\n const resolved = React.useMemo(() => resolveRegistry(registry), [registry])\n const view = useViewState()\n const [clock] = React.useState(() => now ?? Date.now())\n const emit = React.useCallback((event: ConversationEvent) => onEvent?.(event), [onEvent])\n const context: ChatSessionContextValue = {\n spec: { id: `turn-${turn.id}`, turns: [turn] },\n registry: resolved,\n emit,\n icons: DEFAULT_ICONS,\n now: now ?? clock,\n opensRuns: false,\n stepsOpen: view.stepsOpen,\n toggleSteps: view.toggleSteps,\n setSteps: (turnId, open) => {\n view.toggleSteps(turnId, open)\n emit({ type: \"toggle-steps\", turn: turnId, open })\n },\n actions: [],\n recordOpen: view.recordOpen,\n toggleRecord: view.toggleRecord,\n rating: view.rating,\n rate: view.setRating,\n view: \"chat\",\n setView: () => {},\n scrollToTurn: () => {},\n focusComposer: () => {},\n setComposer: () => {},\n }\n return (\n <ChatSessionContext.Provider value={context}>\n {turn.role === \"analyst\" ? (\n <ChatSessionMessage role=\"user\">{turn.text}</ChatSessionMessage>\n ) : turn.kind === \"ask\" ? (\n <AskView turn={turn} registry={resolved} onEvent={emit} now={context.now} />\n ) : (\n <WebAnswer turn={turn} chrome={false} />\n )}\n </ChatSessionContext.Provider>\n )\n}\n","/**\n * Everything the analyst can do, as data. The component never acts on a\n * conversation itself: it reports an event, and the API answers with patches.\n *\n * Every event but `prompt`, `stop` and `setting` names the turn it came from.\n */\nexport type ConversationEvent =\n /**\n * A prompt. `settings` is what the composer's controls held — `{ mode: \"nl\",\n * model: \"qwen\" }`; `files` what was attached, as the browser gave them.\n */\n | { type: \"prompt\"; text: string; context?: string[]; settings?: Record<string, string>; files?: File[] }\n /** An ask was answered. `value` has the type its block fixes. */\n | { type: \"reply\"; turn: string; value: unknown }\n /** An ask was skipped; its default is used and recorded. */\n | { type: \"skip\"; turn: string }\n /** An answered ask was changed. Re-runs from that turn, not from scratch. */\n | { type: \"change\"; turn: string; value: unknown }\n /**\n * An action the answer's spec declares — `approve`, `create-drafts` — or one a\n * block names with what it carries: `select` with a table row's key,\n * `download` with a file's digest.\n */\n | { type: \"action\"; turn: string; action: string; value?: unknown }\n /** One part of an answer's scope line was edited. */\n | { type: \"scope\"; turn: string; part: number; value: unknown }\n /**\n * Open a block's records in full — the rows a table previews. `block` is its\n * index in the turn's `blocks`.\n */\n | { type: \"open\"; turn: string; block: number }\n /** Render the same records as another block. */\n | { type: \"template\"; turn: string; kind: string }\n /** Change the current answer in place — `by-region`. */\n | { type: \"refine\"; turn: string; refine: string }\n | { type: \"rate\"; turn: string; value: number }\n | { type: \"stop\" }\n | { type: \"retry\"; turn: string }\n /** Open the whole run behind an answer — its elapsed time was clicked. `step` when one step was. */\n | { type: \"open-run\"; turn: string; step?: string }\n /** A composer control changed — the mode, the model, the timeout. */\n | { type: \"setting\"; id: string; value: string }\n /** An answer's words were copied, as `text`. */\n | { type: \"copy\"; turn: string; text: string }\n /** An answer's steps were opened or folded. */\n | { type: \"toggle-steps\"; turn: string; open: boolean }\n\nexport type ConversationEventType = ConversationEvent[\"type\"]\n\n/** The event types, in the grammar's order. `grammar.test.ts` checks the union against it. */\nexport const EVENT_TYPES = [\n \"prompt\",\n \"reply\",\n \"skip\",\n \"change\",\n \"action\",\n \"scope\",\n \"open\",\n \"template\",\n \"refine\",\n \"rate\",\n \"stop\",\n \"retry\",\n \"open-run\",\n \"setting\",\n \"copy\",\n \"toggle-steps\",\n] as const satisfies readonly ConversationEventType[]\n","import { ANSWER_KINDS, ASK_KINDS, FLOWS, PATTERNS, STAGES } from \"../grammar\"\nimport type { AnswerTurn, ConversationSpec } from \"./types\"\n\n/**\n * What the compiler cannot see: a spec that arrived off the wire.\n *\n * `error` means the spec breaks the contract — an unknown block, a turn with\n * no id, an envelope field sent as a free block. `warning` means the spec is\n * valid but an answer does not match its pattern, which is how a change\n * explanation without a bridge gets noticed in fixtures and in development.\n */\nexport interface ValidationIssue {\n level: \"error\" | \"warning\"\n /** The turn the issue is on, when there is one. */\n turn?: string\n message: string\n}\n\nexport interface ValidateOptions {\n /** Kinds a consumer registered beyond the grammar's. */\n extraAsks?: string[]\n extraBlocks?: string[]\n}\n\nconst ASK_IDS = new Set<string>(ASK_KINDS)\nconst BLOCK_IDS = new Set<string>(ANSWER_KINDS)\nconst STAGE_IDS = new Set<string>(STAGES.map((s) => s.id))\nconst FLOW_IDS = new Set<string>(FLOWS.map((f) => f.id))\nconst PATTERN_BY = new Map<string, readonly string[]>(PATTERNS.map((p) => [p.id, p.blocks]))\n\nconst ASK_STATES = new Set([\"pending\", \"answered\", \"skipped\", \"superseded\", \"expired\"])\nconst ANSWER_STATES = new Set([\"running\", \"partial\", \"complete\", \"cannot\", \"error\", \"stopped\"])\nconst STEP_STATES = new Set([\"done\", \"running\", \"pending\", \"failed\", \"waiting\", \"retrying\", \"stopped\"])\n\nconst notIso = (value: unknown) => value !== undefined && (typeof value !== \"string\" || Number.isNaN(Date.parse(value)))\n\n/**\n * Blocks a pattern names that the answer carries elsewhere: the envelope, or\n * the answer's own `trace`. Sent as blocks they are an error.\n */\nconst CARRIED: Record<string, (a: AnswerTurn) => boolean> = {\n scope: (a) => !!a.envelope?.scope?.length,\n method: (a) => !!a.envelope?.method,\n caveat: (a) => !!a.envelope?.caveats?.length,\n trace: (a) => !!a.trace?.length,\n}\n\n/** Blocks any answer may add to its pattern: the words and the sources. */\nconst ANYWHERE = new Set([\"narrative\", \"citations\"])\n\nfunction checkPattern(turn: AnswerTurn, issues: ValidationIssue[]) {\n if (!turn.pattern) return\n const expected = PATTERN_BY.get(turn.pattern)\n if (!expected) return\n const present = new Set<string>(turn.blocks.map((b) => b.kind))\n for (const kind of expected) {\n const carried = CARRIED[kind]\n const has = carried ? carried(turn) : present.has(kind)\n if (!has) {\n issues.push({\n level: \"warning\",\n turn: turn.id,\n message: `Pattern \"${turn.pattern}\" expects \"${kind}\", which this answer does not have.`,\n })\n }\n }\n for (const kind of present) {\n if (!expected.includes(kind) && !ANYWHERE.has(kind)) {\n issues.push({\n level: \"warning\",\n turn: turn.id,\n message: `Block \"${kind}\" is not part of pattern \"${turn.pattern}\".`,\n })\n }\n }\n}\n\nexport function validate(spec: ConversationSpec, options: ValidateOptions = {}): ValidationIssue[] {\n const issues: ValidationIssue[] = []\n const error = (message: string, turn?: string) => issues.push({ level: \"error\", turn, message })\n const asks = new Set([...ASK_IDS, ...(options.extraAsks ?? [])])\n const blocks = new Set([...BLOCK_IDS, ...(options.extraBlocks ?? [])])\n\n if (typeof spec?.id !== \"string\" || !spec.id) error(\"The conversation has no id.\")\n if (spec?.analyst !== undefined && (typeof spec.analyst !== \"string\" || !spec.analyst)) {\n error(\"The analyst's name is not a non-empty string.\")\n }\n const controls = spec?.composer?.controls ?? []\n const controlIds = new Set<string>()\n for (const control of controls) {\n if (!control?.id) error(\"A composer control has no id.\")\n else if (controlIds.has(control.id)) error(`Composer control id \"${control.id}\" is used twice.`)\n else controlIds.add(control.id)\n if (!control?.options?.length) error(`Composer control \"${control?.id}\" has no options.`)\n else if (control.default !== undefined && !control.options.some((o) => o.value === control.default)) {\n error(`Composer control \"${control.id}\" defaults to \"${control.default}\", which is not one of its options.`)\n }\n }\n if (!Array.isArray(spec?.turns)) {\n error(\"The conversation has no turns array.\")\n return issues\n }\n\n const seen = new Set<string>()\n for (const turn of spec.turns) {\n const id = typeof turn?.id === \"string\" ? turn.id : undefined\n if (!id) {\n error(\"A turn has no id.\")\n continue\n }\n if (seen.has(id)) error(`Turn id \"${id}\" is used twice.`, id)\n seen.add(id)\n\n if (turn.role === \"analyst\") {\n if (typeof turn.text !== \"string\" || !turn.text) error(\"An analyst turn has no text.\", id)\n if (notIso(turn.at)) error(`at \"${turn.at}\" is not an ISO time.`, id)\n continue\n }\n if (turn.role !== \"assistant\") {\n error(`Unknown role \"${(turn as { role?: string }).role}\".`, id)\n continue\n }\n\n if (turn.kind === \"ask\") {\n if (!STAGE_IDS.has(turn.stage)) error(`Unknown stage \"${turn.stage}\".`, id)\n if (!ASK_STATES.has(turn.state)) error(`Unknown ask state \"${turn.state}\".`, id)\n if (!asks.has(turn.ask?.kind)) error(`Unknown ask block \"${turn.ask?.kind}\".`, id)\n if (turn.answeredAt !== undefined && Number.isNaN(Date.parse(turn.answeredAt))) {\n error(`answeredAt \"${turn.answeredAt}\" is not an ISO time.`, id)\n }\n if (turn.ask?.kind === \"multistep\") {\n for (const step of turn.ask.steps ?? []) {\n if (!asks.has(step.kind)) error(`Unknown ask block \"${step.kind}\" in step \"${step.id}\".`, id)\n }\n }\n continue\n }\n\n if (turn.kind === \"answer\") {\n if (!ANSWER_STATES.has(turn.state)) error(`Unknown answer state \"${turn.state}\".`, id)\n if (turn.flow && !FLOW_IDS.has(turn.flow)) error(`Unknown flow \"${turn.flow}\".`, id)\n if (turn.pattern && !PATTERN_BY.has(turn.pattern)) error(`Unknown pattern \"${turn.pattern}\".`, id)\n if (notIso(turn.at)) error(`at \"${turn.at}\" is not an ISO time.`, id)\n if (notIso(turn.startedAt)) error(`startedAt \"${turn.startedAt}\" is not an ISO time.`, id)\n const stepIds = new Set<string>()\n for (const step of turn.trace ?? []) {\n if (!STEP_STATES.has(step?.state)) error(`Unknown step state \"${step?.state}\" on \"${step?.label}\".`, id)\n if (notIso(step?.startedAt)) error(`Step \"${step.label}\" startedAt \"${step.startedAt}\" is not an ISO time.`, id)\n if (step?.id) {\n if (stepIds.has(step.id)) error(`Step id \"${step.id}\" is used twice.`, id)\n stepIds.add(step.id)\n }\n }\n for (const action of turn.outcome?.actions ?? []) {\n if (!action?.id || !action.label) error(\"An outcome action has no id or label.\", id)\n }\n if (!Array.isArray(turn.blocks)) {\n error(\"An answer has no blocks array.\", id)\n continue\n }\n for (const block of turn.blocks) {\n if (!blocks.has(block?.kind)) error(`Unknown block \"${block?.kind}\".`, id)\n else if (block.kind in CARRIED) {\n error(`\"${block.kind}\" is part of the answer, not a block: send it in the ${block.kind === \"trace\" ? `answer's \"trace\"` : \"envelope\"}.`, id)\n }\n if (block?.status !== undefined && block.status !== \"loading\" && block.status !== \"empty\") {\n error(`Unknown block status \"${block.status as string}\".`, id)\n }\n if (block?.status === \"empty\" && !block.emptyText) {\n error(`An empty \"${block.kind}\" block does not say what is missing in emptyText.`, id)\n }\n }\n checkPattern(turn, issues)\n continue\n }\n\n error(`Unknown assistant turn kind \"${(turn as { kind?: string }).kind}\".`, id)\n }\n return issues\n}\n"]}
|