@varo-ui/ai 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -1
- package/dist/index.d.mts +44 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +340 -46
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/agent-stream.ts +17 -2
- package/src/event-channel.ts +35 -12
- package/src/index.ts +1 -0
- package/src/markdown-view.ts +126 -45
- package/src/sse.ts +34 -9
- package/src/text-stream.ts +126 -39
- package/src/thread.ts +160 -0
- package/src/types.ts +48 -17
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["node"],"sources":["../src/text-stream.ts","../src/agent-stream.ts","../src/event-channel.ts","../src/type-guards.ts","../src/event-parser.ts","../src/markdown.ts","../src/markdown-view.ts","../src/sse.ts"],"sourcesContent":["import { createSmoothMarkdownStream } from 'markstream-core'\nimport type { TextStreamController, TextStreamOptions, TextStreamSnapshot } from './types'\n\ninterface SegmenterLike {\n segment: (value: string) => Iterable<{ segment: string }>\n}\n\nfunction splitGraphemes(value: string): string[] {\n const intlRuntime: unknown = Intl\n if (\n typeof intlRuntime !== 'object'\n || intlRuntime === null\n || !('Segmenter' in intlRuntime)\n || typeof intlRuntime.Segmenter !== 'function'\n ) {\n return Array.from(value)\n }\n\n // Runtime constructor shape is checked above; TypeScript's configured Intl lib omits Segmenter.\n const Segmenter = intlRuntime.Segmenter as new (\n locale?: string,\n options?: { granularity: 'grapheme' }\n ) => SegmenterLike\n return Array.from(new Segmenter(undefined, { granularity: 'grapheme' }).segment(value), (item) => item.segment)\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction createTimerTextStream(options: TextStreamOptions = {}): TextStreamController {\n const minCharsPerSecond = Math.max(1, options.minCharsPerSecond ?? 40)\n const maxCharsPerSecond = Math.max(minCharsPerSecond, options.maxCharsPerSecond ?? 800)\n const targetLatencyMs = Math.max(50, options.targetLatencyMs ?? 700)\n const maxCommitFps = Math.max(1, Math.min(30, options.maxCommitFps ?? 20))\n const maxCharsPerCommit = Math.max(1, options.maxCharsPerCommit ?? 64)\n const catchUpThreshold = Math.max(1, options.catchUpThreshold ?? 320)\n const listeners = new Set<() => void>()\n const pending: string[] = []\n let pendingOffset = 0\n let source = ''\n let visible = ''\n let done = false\n let paused = false\n let destroyed = false\n let timer: ReturnType<typeof setTimeout> | undefined\n let lastTick = Date.now()\n let budget = 0\n\n function pendingCount() {\n return pending.length - pendingOffset\n }\n\n function snapshot(): TextStreamSnapshot {\n const pendingChars = pendingCount()\n return {\n caughtUp: pendingChars === 0,\n done,\n final: done && pendingChars === 0,\n paused,\n pendingChars,\n source,\n visible\n }\n }\n\n function emit() {\n listeners.forEach((listener) => listener())\n }\n\n function compactPending() {\n if (pendingOffset < 1024 || pendingOffset * 2 < pending.length) return\n pending.splice(0, pendingOffset)\n pendingOffset = 0\n }\n\n function schedule() {\n if (destroyed || paused || timer || pendingCount() === 0) return\n timer = setTimeout(tick, Math.ceil(1000 / maxCommitFps))\n }\n\n function tick() {\n timer = undefined\n if (destroyed || paused) return\n\n const now = Date.now()\n const deltaMs = Math.max(1, now - lastTick)\n lastTick = now\n const backlog = pendingCount()\n if (backlog === 0) {\n emit()\n return\n }\n\n const latencyCps = (backlog * 1000) / targetLatencyMs\n const catchUpBoost = backlog >= catchUpThreshold ? 1.8 : 1\n const cps = clamp(latencyCps * catchUpBoost, minCharsPerSecond, maxCharsPerSecond)\n budget += (cps * deltaMs) / 1000\n const commitCount = Math.min(backlog, maxCharsPerCommit, Math.max(1, Math.floor(budget)))\n budget = Math.max(0, budget - commitCount)\n visible += pending.slice(pendingOffset, pendingOffset + commitCount).join('')\n pendingOffset += commitCount\n compactPending()\n emit()\n schedule()\n }\n\n function cancelTimer() {\n clearTimeout(timer)\n timer = undefined\n }\n\n return {\n destroy() {\n if (destroyed) return\n destroyed = true\n cancelTimer()\n pending.length = 0\n listeners.clear()\n },\n enqueue(chunk) {\n if (destroyed || !chunk) return\n if (done) done = false\n source += chunk\n pending.push(...splitGraphemes(chunk))\n lastTick = Date.now()\n emit()\n schedule()\n },\n finish(finishOptions = {}) {\n if (destroyed) return\n done = true\n if (finishOptions.flush) {\n visible = source\n pending.length = 0\n pendingOffset = 0\n cancelTimer()\n }\n emit()\n schedule()\n },\n flush() {\n if (destroyed) return\n visible = source\n pending.length = 0\n pendingOffset = 0\n budget = 0\n cancelTimer()\n emit()\n },\n getSnapshot: snapshot,\n pause() {\n if (destroyed || paused) return\n paused = true\n cancelTimer()\n emit()\n },\n reset(content = '') {\n cancelTimer()\n source = content\n visible = content\n pending.length = 0\n pendingOffset = 0\n done = false\n paused = false\n budget = 0\n lastTick = Date.now()\n emit()\n },\n resume() {\n if (destroyed || !paused) return\n paused = false\n lastTick = Date.now()\n emit()\n schedule()\n },\n subscribe(listener) {\n if (destroyed) return () => {}\n listeners.add(listener)\n return () => listeners.delete(listener)\n }\n }\n}\n\nexport function createTextStream(options: TextStreamOptions = {}): TextStreamController {\n if (typeof requestAnimationFrame !== 'function' || typeof cancelAnimationFrame !== 'function') {\n return createTimerTextStream(options)\n }\n\n const controller = createSmoothMarkdownStream(options)\n return {\n destroy: controller.destroy,\n enqueue: controller.enqueue,\n finish: controller.finish,\n flush: controller.flush,\n getSnapshot: controller.getSnapshot,\n pause: controller.pause,\n reset: controller.reset,\n resume: controller.resume,\n subscribe: controller.subscribe\n }\n}\n","import { createTextStream } from './text-stream'\nimport type {\n AgentApprovalPart,\n AgentErrorEvent,\n AgentReasoningPart,\n AgentStreamController,\n AgentStreamEvent,\n AgentStreamSnapshot,\n AgentToolPart,\n TextStreamOptions\n} from './types'\n\nexport interface AgentStreamControllerOptions {\n text?: TextStreamOptions\n}\n\nfunction initialSnapshot(): AgentStreamSnapshot {\n return {\n data: [],\n eventCount: 0,\n reasoning: [],\n status: 'idle',\n tools: []\n }\n}\n\nexport function createAgentStreamController(\n options: AgentStreamControllerOptions = {}\n): AgentStreamController {\n const text = createTextStream(options.text)\n const listeners = new Set<() => void>()\n let snapshot = initialSnapshot()\n let destroyed = false\n let cancelled = false\n let transportDone = false\n let connecting = false\n let cancelActiveConnect: (() => void) | undefined\n\n function emit() {\n listeners.forEach((listener) => listener())\n }\n\n function setSnapshot(update: Partial<AgentStreamSnapshot>) {\n snapshot = { ...snapshot, ...update }\n emit()\n }\n\n function updateReasoning(id: string, update: Partial<AgentReasoningPart>) {\n setSnapshot({\n reasoning: snapshot.reasoning.map((part) => (part.id === id ? { ...part, ...update } : part))\n })\n }\n\n function updateTool(id: string, update: Partial<AgentToolPart>) {\n setSnapshot({\n tools: snapshot.tools.map((part) => (part.id === id ? { ...part, ...update } : part))\n })\n }\n\n function finalStatus() {\n const textSnapshot = text.getSnapshot()\n if (!transportDone || !textSnapshot.final) return\n setSnapshot({ status: snapshot.error ? 'failed' : cancelled ? 'cancelled' : 'completed' })\n }\n\n const unsubscribeText = text.subscribe(() => {\n if (destroyed || !snapshot.message) return\n const textSnapshot = text.getSnapshot()\n snapshot = {\n ...snapshot,\n message: {\n ...snapshot.message,\n final: textSnapshot.final,\n source: textSnapshot.source,\n visible: textSnapshot.visible\n }\n }\n emit()\n finalStatus()\n })\n\n function push(event: AgentStreamEvent) {\n if (destroyed || cancelled) return\n snapshot = { ...snapshot, eventCount: snapshot.eventCount + 1 }\n\n switch (event.type) {\n case 'message.start':\n transportDone = false\n text.reset()\n setSnapshot({\n error: undefined,\n message: {\n final: false,\n id: event.messageId,\n role: event.role,\n source: '',\n visible: ''\n },\n status: 'streaming'\n })\n break\n case 'text.delta':\n if (snapshot.message?.id === event.messageId) text.enqueue(event.delta)\n break\n case 'message.end':\n if (snapshot.message?.id === event.messageId) text.finish()\n break\n case 'reasoning.start':\n setSnapshot({\n reasoning: [\n ...snapshot.reasoning,\n { content: '', id: event.id, status: 'running', title: event.title }\n ]\n })\n break\n case 'reasoning.delta': {\n const part = snapshot.reasoning.find((item) => item.id === event.id)\n if (part) updateReasoning(event.id, { content: `${part.content}${event.delta}` })\n break\n }\n case 'reasoning.end':\n updateReasoning(event.id, { durationMs: event.durationMs, status: 'completed' })\n break\n case 'tool.start':\n setSnapshot({\n tools: [\n ...snapshot.tools,\n {\n id: event.id,\n input: event.input,\n name: event.name,\n status: 'running',\n summary: event.summary\n }\n ]\n })\n break\n case 'tool.update':\n updateTool(event.id, { summary: event.summary })\n break\n case 'tool.result':\n updateTool(event.id, {\n output: event.output,\n status: 'completed',\n summary: event.summary\n })\n break\n case 'tool.error':\n updateTool(event.id, { error: event.error, status: 'failed' })\n break\n case 'approval.required': {\n const approval: AgentApprovalPart = {\n choices: event.choices ?? [],\n description: event.description,\n id: event.id,\n status: 'waiting',\n title: event.title\n }\n setSnapshot({ approval, status: 'waiting' })\n break\n }\n case 'approval.resolved':\n if (snapshot.approval?.id === event.id) {\n setSnapshot({\n approval: {\n ...snapshot.approval,\n resolvedValue: event.value,\n status: 'completed'\n },\n status: 'streaming'\n })\n }\n break\n case 'data':\n setSnapshot({ data: [...snapshot.data, { name: event.name, value: event.value }] })\n break\n case 'error':\n transportDone = true\n text.finish({ flush: true })\n setSnapshot({ error: event, status: 'failed' })\n break\n case 'done':\n transportDone = true\n text.finish()\n setSnapshot({ usage: event.usage })\n if (!snapshot.message) setSnapshot({ status: 'completed' })\n finalStatus()\n break\n }\n }\n\n async function waitForTerminal() {\n if (snapshot.status === 'completed' || snapshot.status === 'failed' || snapshot.status === 'cancelled') {\n return snapshot\n }\n\n return await new Promise<AgentStreamSnapshot>((resolve) => {\n const unsubscribe = subscribe(() => {\n if (snapshot.status !== 'completed' && snapshot.status !== 'failed' && snapshot.status !== 'cancelled') return\n unsubscribe()\n resolve(snapshot)\n })\n })\n }\n\n function subscribe(listener: () => void) {\n if (destroyed) return () => {}\n listeners.add(listener)\n return () => listeners.delete(listener)\n }\n\n function reset() {\n text.reset()\n snapshot = initialSnapshot()\n cancelled = false\n transportDone = false\n emit()\n }\n\n function cancel(reason = 'Cancelled') {\n if (destroyed || cancelled) return\n cancelled = true\n transportDone = true\n text.finish({ flush: true })\n const error: AgentErrorEvent = { code: 'cancelled', message: reason, retryable: true, type: 'error' }\n setSnapshot({ error, status: 'cancelled' })\n cancelActiveConnect?.()\n }\n\n return {\n cancel,\n async connect(events) {\n if (connecting) throw new Error('Agent stream controller is already connected')\n connecting = true\n reset()\n const iterator = events[Symbol.asyncIterator]()\n let resolveCancellation: (() => void) | undefined\n const cancellation = new Promise<void>((resolve) => {\n resolveCancellation = resolve\n })\n cancelActiveConnect = resolveCancellation\n\n try {\n try {\n while (!cancelled && !destroyed) {\n const outcome = await Promise.race([\n iterator.next().then((result) => ({ kind: 'event' as const, result })),\n cancellation.then(() => ({ kind: 'cancelled' as const }))\n ])\n if (outcome.kind === 'cancelled' || outcome.result.done) break\n push(outcome.result.value)\n }\n if (!transportDone && !cancelled && !destroyed) push({ type: 'done' })\n } catch (error) {\n push({\n message: error instanceof Error ? error.message : String(error),\n retryable: true,\n type: 'error'\n })\n } finally {\n if (cancelled || destroyed) void iterator.return?.()\n }\n return await waitForTerminal()\n } finally {\n connecting = false\n cancelActiveConnect = undefined\n }\n },\n destroy() {\n if (destroyed) return\n cancel('Agent stream controller destroyed')\n destroyed = true\n unsubscribeText()\n text.destroy()\n listeners.clear()\n },\n getSnapshot() {\n return snapshot\n },\n push,\n reset,\n subscribe\n }\n}\n","import type { AgentEventChannel, AgentStreamEvent } from './types'\n\nexport function createAgentEventChannel(): AgentEventChannel {\n const queue: AgentStreamEvent[] = []\n let ended = false\n let failure: Error | undefined\n let wake: (() => void) | undefined\n\n async function* iterate(): AsyncGenerator<AgentStreamEvent> {\n while (!ended || queue.length > 0) {\n if (failure) throw failure\n const event = queue.shift()\n if (event) {\n yield event\n continue\n }\n\n await new Promise<void>((resolve) => {\n wake = resolve\n })\n wake = undefined\n }\n if (failure) throw failure\n }\n\n function notify() {\n wake?.()\n }\n\n return {\n end() {\n ended = true\n notify()\n },\n fail(error) {\n failure = error instanceof Error ? error : new Error(String(error))\n ended = true\n notify()\n },\n push(event) {\n if (ended) return\n queue.push(event)\n notify()\n },\n source: {\n [Symbol.asyncIterator]: iterate\n }\n }\n}\n","export function isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import { isUnknownRecord } from './type-guards'\nimport type { AgentApprovalRequiredEvent, AgentStreamEvent } from './types'\n\n\nfunction requiredString(value: Record<string, unknown>, key: string): string {\n const field = value[key]\n if (typeof field !== 'string' || field.length === 0) {\n throw new TypeError(`Agent stream event field \"${key}\" must be a non-empty string`)\n }\n return field\n}\n\nfunction optionalString(value: Record<string, unknown>, key: string): string | undefined {\n const field = value[key]\n if (field === undefined) return undefined\n if (typeof field !== 'string') throw new TypeError(`Agent stream event field \"${key}\" must be a string`)\n return field\n}\n\nfunction optionalBoolean(value: Record<string, unknown>, key: string): boolean | undefined {\n const field = value[key]\n if (field === undefined) return undefined\n if (typeof field !== 'boolean') throw new TypeError(`Agent stream event field \"${key}\" must be a boolean`)\n return field\n}\n\nfunction optionalNumber(value: Record<string, unknown>, key: string): number | undefined {\n const field = value[key]\n if (field === undefined) return undefined\n if (typeof field !== 'number' || !Number.isFinite(field)) {\n throw new TypeError(`Agent stream event field \"${key}\" must be a finite number`)\n }\n return field\n}\n\nfunction parseChoices(value: unknown): AgentApprovalRequiredEvent['choices'] {\n if (value === undefined) return undefined\n if (!Array.isArray(value)) throw new TypeError('Agent approval choices must be an array')\n\n return value.map((choice) => {\n if (!isUnknownRecord(choice)) throw new TypeError('Agent approval choice must be an object')\n return {\n description: optionalString(choice, 'description'),\n disabled: optionalBoolean(choice, 'disabled'),\n label: requiredString(choice, 'label'),\n value: requiredString(choice, 'value')\n }\n })\n}\n\nexport function parseAgentStreamEvent(value: unknown): AgentStreamEvent {\n if (!isUnknownRecord(value) || typeof value.type !== 'string') {\n throw new TypeError('Agent stream event must be an object with a string type')\n }\n\n switch (value.type) {\n case 'message.start': {\n const role = requiredString(value, 'role')\n if (role !== 'assistant' && role !== 'system' && role !== 'user') {\n throw new TypeError(`Unsupported agent message role: ${role}`)\n }\n return { messageId: requiredString(value, 'messageId'), role, type: value.type }\n }\n case 'text.delta':\n return {\n delta: requiredString(value, 'delta'),\n messageId: requiredString(value, 'messageId'),\n type: value.type\n }\n case 'message.end':\n return { messageId: requiredString(value, 'messageId'), type: value.type }\n case 'reasoning.start':\n return {\n id: requiredString(value, 'id'),\n title: requiredString(value, 'title'),\n type: value.type\n }\n case 'reasoning.delta':\n return {\n delta: requiredString(value, 'delta'),\n id: requiredString(value, 'id'),\n type: value.type\n }\n case 'reasoning.end':\n return {\n durationMs: optionalNumber(value, 'durationMs'),\n id: requiredString(value, 'id'),\n type: value.type\n }\n case 'tool.start':\n return {\n id: requiredString(value, 'id'),\n input: value.input,\n name: requiredString(value, 'name'),\n summary: optionalString(value, 'summary'),\n type: value.type\n }\n case 'tool.update':\n return {\n id: requiredString(value, 'id'),\n summary: optionalString(value, 'summary'),\n type: value.type\n }\n case 'tool.result':\n return {\n id: requiredString(value, 'id'),\n output: value.output,\n summary: optionalString(value, 'summary'),\n type: value.type\n }\n case 'tool.error':\n return {\n error: requiredString(value, 'error'),\n id: requiredString(value, 'id'),\n type: value.type\n }\n case 'approval.required':\n return {\n choices: parseChoices(value.choices),\n description: optionalString(value, 'description'),\n id: requiredString(value, 'id'),\n title: requiredString(value, 'title'),\n type: value.type\n }\n case 'approval.resolved':\n return {\n id: requiredString(value, 'id'),\n type: value.type,\n value: requiredString(value, 'value')\n }\n case 'data':\n if (!('value' in value)) throw new TypeError('Agent data event must include a value field')\n return { name: requiredString(value, 'name'), type: value.type, value: value.value }\n case 'error':\n return {\n code: optionalString(value, 'code'),\n message: requiredString(value, 'message'),\n retryable: optionalBoolean(value, 'retryable'),\n type: value.type\n }\n case 'done': {\n const usage = value.usage\n if (usage !== undefined && !isUnknownRecord(usage)) {\n throw new TypeError('Agent done usage must be an object')\n }\n return {\n type: value.type,\n usage: usage\n ? {\n inputTokens: optionalNumber(usage, 'inputTokens'),\n outputTokens: optionalNumber(usage, 'outputTokens')\n }\n : undefined\n }\n }\n default:\n throw new TypeError(`Unsupported agent stream event type: ${value.type}`)\n }\n}\n","import {\n getMarkdown,\n isUnsafeHtmlUrl,\n parseMarkdownToStructure,\n type GetMarkdownOptions,\n type ParsedNode\n} from 'stream-markdown-parser'\n\nexport interface StreamingMarkdownParserOptions {\n customHtmlTags?: readonly string[]\n enableMath?: boolean\n includeSourceMap?: boolean\n markdownItOptions?: GetMarkdownOptions['markdownItOptions']\n validateLink?: (url: string) => boolean\n}\n\nexport interface StreamingMarkdownParser {\n parse: (content: string, options?: { final?: boolean }) => ParsedNode[]\n reset: () => void\n}\n\nlet parserId = 0\n\nexport function createStreamingMarkdownParser(\n options: StreamingMarkdownParserOptions = {}\n): StreamingMarkdownParser {\n parserId += 1\n const validateLink = options.validateLink ?? ((url: string) => !isUnsafeHtmlUrl(url))\n const markdown = getMarkdown(`varo-agent-${parserId}`, {\n customHtmlTags: options.customHtmlTags,\n enableMath: options.enableMath ?? true,\n markdownItOptions: {\n breaks: true,\n html: false,\n linkify: true,\n ...options.markdownItOptions,\n validateLink\n }\n })\n\n return {\n parse(content, parseOptions = {}) {\n return parseMarkdownToStructure(content, markdown, {\n customHtmlTags: options.customHtmlTags,\n final: parseOptions.final ?? false,\n includeSourceMap: options.includeSourceMap ?? false,\n reuseStableTopLevelNodes: true,\n streamParse: 'auto',\n validateLink\n })\n },\n reset() {\n markdown.stream?.reset?.()\n }\n }\n}\n\nexport type { ParsedNode } from 'stream-markdown-parser'\n","import { isUnknownRecord } from './type-guards'\nimport type { ParsedNode } from 'stream-markdown-parser'\n\nexport type AgentMarkdownNodeKind =\n | 'admonition'\n | 'blockquote'\n | 'checkbox'\n | 'code-block'\n | 'definition'\n | 'definition-list'\n | 'emphasis'\n | 'footnote'\n | 'hardbreak'\n | 'heading'\n | 'highlight'\n | 'image'\n | 'inline-code'\n | 'insert'\n | 'link'\n | 'list'\n | 'list-item'\n | 'math-block'\n | 'math-inline'\n | 'paragraph'\n | 'strikethrough'\n | 'strong'\n | 'subscript'\n | 'superscript'\n | 'table'\n | 'table-cell'\n | 'table-row'\n | 'text'\n | 'thematic-break'\n\nexport interface AgentMarkdownViewNode {\n align?: 'center' | 'left' | 'right'\n alt?: string\n checked?: boolean\n children?: AgentMarkdownViewNode[]\n header?: boolean\n href?: string\n kind: AgentMarkdownNodeKind\n language?: string\n level?: number\n loading?: boolean\n ordered?: boolean\n start?: number\n text?: string\n title?: string\n}\n\nfunction stringValue(value: unknown, fallback = '') {\n return typeof value === 'string' ? value : fallback\n}\n\nfunction booleanValue(value: unknown) {\n return typeof value === 'boolean' ? value : undefined\n}\n\nfunction numberValue(value: unknown) {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction alignValue(value: unknown): 'center' | 'left' | 'right' | undefined {\n return value === 'center' || value === 'left' || value === 'right' ? value : undefined\n}\n\nfunction nodeField(node: ParsedNode, key: string): unknown {\n return key in node ? Reflect.get(node, key) : undefined\n}\n\nfunction normalizeUnknownNode(value: unknown): AgentMarkdownViewNode | undefined {\n if (!isUnknownRecord(value) || typeof value.type !== 'string' || typeof value.raw !== 'string') return undefined\n // The required BaseNode fields are validated above; extension fields stay runtime-checked.\n const node = value as ParsedNode\n return normalizeMarkdownNode(node)\n}\n\nfunction normalizeChildren(value: unknown): AgentMarkdownViewNode[] {\n if (!Array.isArray(value)) return []\n const result: AgentMarkdownViewNode[] = []\n value.forEach((item) => {\n const normalized = normalizeUnknownNode(item)\n if (normalized) result.push(normalized)\n })\n return result\n}\n\nfunction textNode(text: string): AgentMarkdownViewNode {\n return { kind: 'text', text }\n}\n\nexport function normalizeMarkdownNode(node: ParsedNode): AgentMarkdownViewNode {\n const fallback = stringValue(node.raw)\n\n switch (node.type) {\n case 'text':\n return textNode(stringValue(node.content, fallback))\n case 'heading':\n return {\n children: normalizeChildren(node.children),\n kind: 'heading',\n level: numberValue(nodeField(node, 'level')) ?? 2,\n text: stringValue(nodeField(node, 'text'))\n }\n case 'paragraph':\n case 'inline':\n return { children: normalizeChildren(node.children), kind: 'paragraph' }\n case 'list':\n return {\n children: normalizeChildren(nodeField(node, 'items')),\n kind: 'list',\n ordered: booleanValue(nodeField(node, 'ordered')) ?? false,\n start: numberValue(nodeField(node, 'start'))\n }\n case 'list_item':\n return { children: normalizeChildren(node.children), kind: 'list-item' }\n case 'code_block':\n return {\n kind: 'code-block',\n language: stringValue(nodeField(node, 'language')),\n loading: booleanValue(node.loading),\n text: stringValue(node.code, fallback)\n }\n case 'inline_code':\n return { kind: 'inline-code', text: stringValue(node.code, fallback) }\n case 'link':\n return {\n children: normalizeChildren(node.children),\n href: stringValue(nodeField(node, 'href')),\n kind: 'link',\n text: stringValue(nodeField(node, 'text')),\n title: stringValue(nodeField(node, 'title'))\n }\n case 'image':\n return {\n alt: stringValue(nodeField(node, 'alt')),\n href: stringValue(nodeField(node, 'src')),\n kind: 'image',\n title: stringValue(nodeField(node, 'title'))\n }\n case 'thematic_break':\n return { kind: 'thematic-break' }\n case 'blockquote':\n return { children: normalizeChildren(node.children), kind: 'blockquote' }\n case 'table': {\n const header = nodeField(node, 'header')\n const rows = nodeField(node, 'rows')\n return {\n children: normalizeChildren(Array.isArray(rows) ? [header, ...rows] : [header]),\n kind: 'table'\n }\n }\n case 'table_row':\n return { children: normalizeChildren(nodeField(node, 'cells')), kind: 'table-row' }\n case 'table_cell':\n return {\n align: alignValue(nodeField(node, 'align')),\n children: normalizeChildren(node.children),\n header: booleanValue(nodeField(node, 'header')),\n kind: 'table-cell'\n }\n case 'strong':\n return { children: normalizeChildren(node.children), kind: 'strong' }\n case 'emphasis':\n return { children: normalizeChildren(node.children), kind: 'emphasis' }\n case 'strikethrough':\n return { children: normalizeChildren(node.children), kind: 'strikethrough' }\n case 'highlight':\n return { children: normalizeChildren(node.children), kind: 'highlight' }\n case 'insert':\n return { children: normalizeChildren(node.children), kind: 'insert' }\n case 'subscript':\n return { children: normalizeChildren(node.children), kind: 'subscript' }\n case 'superscript':\n return { children: normalizeChildren(node.children), kind: 'superscript' }\n case 'checkbox':\n case 'checkbox_input':\n return { checked: booleanValue(nodeField(node, 'checked')), kind: 'checkbox' }\n case 'emoji':\n return textNode(stringValue(nodeField(node, 'markup'), fallback))\n case 'definition_list':\n return { children: normalizeChildren(nodeField(node, 'items')), kind: 'definition-list' }\n case 'definition_item':\n return {\n children: [\n { children: normalizeChildren(nodeField(node, 'term')), header: true, kind: 'definition' },\n { children: normalizeChildren(nodeField(node, 'definition')), kind: 'definition' }\n ],\n kind: 'definition'\n }\n case 'footnote':\n return { children: normalizeChildren(node.children), kind: 'footnote', title: stringValue(nodeField(node, 'id')) }\n case 'footnote_reference':\n case 'reference':\n return { kind: 'footnote', text: stringValue(nodeField(node, 'id')) }\n case 'admonition':\n return {\n children: normalizeChildren(node.children),\n kind: 'admonition',\n text: stringValue(nodeField(node, 'kind')),\n title: stringValue(nodeField(node, 'title'))\n }\n case 'vmr_container':\n return {\n children: normalizeChildren(node.children),\n kind: 'admonition',\n loading: booleanValue(node.loading),\n title: stringValue(nodeField(node, 'name'))\n }\n case 'hardbreak':\n return { kind: 'hardbreak' }\n case 'math_inline':\n return { kind: 'math-inline', text: stringValue(node.content, fallback) }\n case 'math_block':\n return { kind: 'math-block', text: stringValue(node.content, fallback) }\n case 'html_block':\n case 'html_inline':\n return textNode(stringValue(node.content, fallback))\n default:\n return textNode(fallback)\n }\n}\n\nexport function normalizeMarkdownNodes(nodes: ParsedNode[]): AgentMarkdownViewNode[] {\n return nodes.map(normalizeMarkdownNode)\n}\n","import { createAgentEventChannel } from './event-channel'\nimport { parseAgentStreamEvent } from './event-parser'\nimport type { AgentStreamEvent } from './types'\n\nexport interface AgentSseEventSource {\n end: () => void\n fail: (error: unknown) => void\n feed: (chunk: string | ArrayBuffer | Uint8Array) => void\n source: AsyncIterable<AgentStreamEvent>\n}\n\ninterface Utf8ChunkDecoder {\n decode: (chunk: Uint8Array, final?: boolean) => string\n}\n\nfunction createFallbackUtf8Decoder(): Utf8ChunkDecoder {\n let carry = new Uint8Array(0)\n\n return {\n decode(chunk, final = false) {\n const bytes = new Uint8Array(carry.length + chunk.length)\n bytes.set(carry)\n bytes.set(chunk, carry.length)\n let cursor = 0\n let result = ''\n\n while (cursor < bytes.length) {\n const first = bytes[cursor]\n if (first < 0x80) {\n result += String.fromCodePoint(first)\n cursor += 1\n continue\n }\n\n const size = first >= 0xf0 ? 4 : first >= 0xe0 ? 3 : first >= 0xc0 ? 2 : 1\n if (size === 1) {\n result += '\\uFFFD'\n cursor += 1\n continue\n }\n if (cursor + size > bytes.length) break\n\n let codePoint = first & (size === 2 ? 0x1f : size === 3 ? 0x0f : 0x07)\n let valid = true\n for (let index = 1; index < size; index += 1) {\n const continuation = bytes[cursor + index]\n if ((continuation & 0xc0) !== 0x80) {\n valid = false\n break\n }\n codePoint = (codePoint << 6) | (continuation & 0x3f)\n }\n\n if (!valid || codePoint > 0x10ffff) {\n result += '\\uFFFD'\n cursor += 1\n continue\n }\n\n result += String.fromCodePoint(codePoint)\n cursor += size\n }\n\n carry = bytes.slice(cursor)\n if (final && carry.length > 0) {\n result += '\\uFFFD'\n carry = new Uint8Array(0)\n }\n return result\n }\n }\n}\n\nfunction createUtf8Decoder(): Utf8ChunkDecoder {\n if (typeof TextDecoder === 'function') {\n const decoder = new TextDecoder()\n return {\n decode(chunk, final = false) {\n return decoder.decode(chunk, { stream: !final })\n }\n }\n }\n return createFallbackUtf8Decoder()\n}\n\nfunction toBytes(chunk: ArrayBuffer | Uint8Array) {\n return chunk instanceof Uint8Array ? chunk : new Uint8Array(chunk)\n}\n\nexport function createAgentSseEventSource(): AgentSseEventSource {\n const channel = createAgentEventChannel()\n const decoder = createUtf8Decoder()\n const dataLines: string[] = []\n let textBuffer = ''\n let ended = false\n\n function dispatch() {\n if (dataLines.length === 0 || ended) return\n const payload = dataLines.join('\\n')\n dataLines.length = 0\n if (payload === '[DONE]') {\n channel.push({ type: 'done' })\n return\n }\n\n try {\n channel.push(parseAgentStreamEvent(JSON.parse(payload)))\n } catch (error) {\n ended = true\n channel.fail(error)\n }\n }\n\n function processLine(line: string) {\n const normalized = line.endsWith('\\r') ? line.slice(0, -1) : line\n if (normalized.length === 0) {\n dispatch()\n return\n }\n if (normalized.startsWith(':')) return\n if (normalized === 'data') {\n dataLines.push('')\n return\n }\n if (normalized.startsWith('data:')) {\n const value = normalized.slice(5)\n dataLines.push(value.startsWith(' ') ? value.slice(1) : value)\n }\n }\n\n function appendText(value: string) {\n textBuffer += value\n let lineEnd = textBuffer.indexOf('\\n')\n while (lineEnd >= 0) {\n processLine(textBuffer.slice(0, lineEnd))\n textBuffer = textBuffer.slice(lineEnd + 1)\n lineEnd = textBuffer.indexOf('\\n')\n }\n }\n\n return {\n end() {\n if (ended) return\n appendText(decoder.decode(new Uint8Array(0), true))\n if (textBuffer.length > 0) processLine(textBuffer)\n dispatch()\n ended = true\n channel.end()\n },\n fail(error) {\n if (ended) return\n ended = true\n channel.fail(error)\n },\n feed(chunk) {\n if (ended) return\n appendText(typeof chunk === 'string' ? chunk : decoder.decode(toBytes(chunk)))\n },\n source: channel.source\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["node"],"sources":["../src/text-stream.ts","../src/agent-stream.ts","../src/event-channel.ts","../src/type-guards.ts","../src/event-parser.ts","../src/markdown.ts","../src/markdown-view.ts","../src/sse.ts","../src/thread.ts"],"sourcesContent":["import type { TextStreamController, TextStreamOptions, TextStreamSnapshot } from './types'\nimport { createSmoothMarkdownStream } from 'markstream-core'\n\ninterface SegmenterLike {\n segment: (value: string) => Iterable<{ segment: string }>\n}\n\nfunction splitGraphemes(value: string): string[] {\n const intlRuntime: unknown = Intl\n if (\n typeof intlRuntime !== 'object'\n || intlRuntime === null\n || !('Segmenter' in intlRuntime)\n || typeof intlRuntime.Segmenter !== 'function'\n ) {\n return Array.from(value)\n }\n\n // Runtime constructor shape is checked above; TypeScript's configured Intl lib omits Segmenter.\n const Segmenter = intlRuntime.Segmenter as new (\n locale?: string,\n options?: { granularity: 'grapheme' }\n ) => SegmenterLike\n return Array.from(new Segmenter(undefined, { granularity: 'grapheme' }).segment(value), item => item.segment)\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction hasUnclosedFence(value: string) {\n let marker: '`' | '~' | undefined\n let markerLength = 0\n for (const line of value.split(/\\r?\\n/)) {\n const match = /^ {0,3}(`{3,}|~{3,})/.exec(line)\n if (!match) { continue }\n const nextMarker = match[1][0] as '`' | '~'\n const nextLength = match[1].length\n if (!marker) {\n marker = nextMarker\n markerLength = nextLength\n }\n else if (marker === nextMarker && nextLength >= markerLength) {\n marker = undefined\n markerLength = 0\n }\n }\n return marker !== undefined\n}\n\nfunction fenceSafeCommitCount(visible: string, source: string, segments: string[]) {\n if (segments.length === 0) { return 0 }\n const candidate = visible + segments.join('')\n const lineStart = candidate.lastIndexOf('\\n') + 1\n const candidateLine = candidate.slice(lineStart)\n const sourceLineEnd = source.indexOf('\\n', lineStart)\n const sourceLine = source.slice(lineStart, sourceLineEnd < 0 ? source.length : sourceLineEnd)\n const match = /^ {0,3}(`+|~+)/.exec(sourceLine)\n if (!match) { return segments.length }\n\n const marker = match[1]\n const unresolvedCandidate = marker.length < 3 && sourceLine.trim() === marker\n const completeFence = marker.length >= 3\n if ((unresolvedCandidate || completeFence) && /^ {0,3}(?:`+|~+)/.test(candidateLine)) {\n return 0\n }\n return segments.length\n}\n\nfunction createTimerTextStream(options: TextStreamOptions = {}): TextStreamController {\n const minCharsPerSecond = Math.max(1, options.minCharsPerSecond ?? 40)\n const maxCharsPerSecond = Math.max(minCharsPerSecond, options.maxCharsPerSecond ?? 1000)\n const targetLatencyMs = Math.max(1, options.targetLatencyMs ?? 900)\n const catchUpLatencyMs = Math.max(1, options.catchUpLatencyMs ?? 350)\n const maxCommitFps = Math.max(1, Math.min(30, options.maxCommitFps ?? 30))\n const maxCharsPerCommit = Math.max(1, options.maxCharsPerCommit ?? 80)\n const catchUpThreshold = Math.max(0, options.catchUpThreshold ?? 600)\n const startDelayMs = Math.max(0, options.startDelayMs ?? 80)\n const flushOnFinish = options.flushOnFinish ?? false\n const burstInitialContent = options.burstInitialContent ?? false\n const burstRevealThresholdChars = Math.max(1, options.burstRevealThresholdChars ?? 2048)\n const listeners = new Set<() => void>()\n const pending: string[] = []\n let pendingOffset = 0\n let source = ''\n let visible = ''\n let done = false\n let paused = false\n let destroyed = false\n let timer: ReturnType<typeof setTimeout> | undefined\n let lastTick = Date.now()\n let firstPendingAt = 0\n let budget = 0\n\n function pendingCount() {\n return pending.length - pendingOffset\n }\n\n function snapshot(): TextStreamSnapshot {\n const pendingChars = Math.max(0, source.length - visible.length)\n return {\n caughtUp: pendingCount() === 0,\n done,\n final: done && pendingCount() === 0,\n paused,\n pendingChars,\n source,\n visible,\n }\n }\n\n function emit() {\n listeners.forEach(listener => listener())\n }\n\n function compactPending() {\n if (pendingOffset < 1024 || pendingOffset * 2 < pending.length) { return }\n pending.splice(0, pendingOffset)\n pendingOffset = 0\n }\n\n function schedule() {\n if (destroyed || paused || timer || pendingCount() === 0) { return }\n // The scheduler and tick callback are mutually recursive by design.\n // eslint-disable-next-line ts/no-use-before-define\n timer = setTimeout(tick, Math.ceil(1000 / maxCommitFps))\n }\n\n function tick() {\n timer = undefined\n if (destroyed || paused) { return }\n\n const now = Date.now()\n if (firstPendingAt && now - firstPendingAt < startDelayMs) {\n schedule()\n return\n }\n firstPendingAt = 0\n\n const deltaMs = Math.max(1, now - lastTick)\n lastTick = now\n const backlog = pendingCount()\n if (backlog === 0) {\n emit()\n return\n }\n\n const latencyMs = backlog >= catchUpThreshold ? catchUpLatencyMs : targetLatencyMs\n const latencyCps = (backlog * 1000) / latencyMs\n const cps = clamp(latencyCps, minCharsPerSecond, maxCharsPerSecond)\n budget += (cps * deltaMs) / 1000\n const commitCount = Math.min(backlog, maxCharsPerCommit, Math.max(1, Math.floor(budget)))\n let proposedSegments = pending.slice(pendingOffset, pendingOffset + commitCount)\n let safeCommitCount = fenceSafeCommitCount(visible, source, proposedSegments)\n if (safeCommitCount === 0) {\n const newlineOffset = pending.slice(pendingOffset).findIndex(segment => segment.includes('\\n'))\n if (newlineOffset >= 0) {\n proposedSegments = pending.slice(pendingOffset, pendingOffset + newlineOffset + 1)\n safeCommitCount = fenceSafeCommitCount(visible, source, proposedSegments)\n }\n }\n if (safeCommitCount === 0) {\n emit()\n schedule()\n return\n }\n budget = Math.max(0, budget - safeCommitCount)\n visible += proposedSegments.slice(0, safeCommitCount).join('')\n pendingOffset += safeCommitCount\n compactPending()\n emit()\n schedule()\n }\n\n function cancelTimer() {\n clearTimeout(timer)\n timer = undefined\n }\n\n function destroy() {\n if (destroyed) { return }\n destroyed = true\n cancelTimer()\n pending.length = 0\n listeners.clear()\n }\n\n return {\n destroy,\n dispose: destroy,\n enqueue(chunk) {\n if (destroyed || !chunk) { return }\n if (done) { done = false }\n const initialChunk = source.length === 0\n source += chunk\n pending.push(...splitGraphemes(chunk))\n if (initialChunk) { firstPendingAt = Date.now() }\n lastTick = Date.now()\n\n if (\n initialChunk\n && burstInitialContent\n && pendingCount() >= burstRevealThresholdChars\n && !hasUnclosedFence(source)\n ) {\n visible = source\n pending.length = 0\n pendingOffset = 0\n firstPendingAt = 0\n }\n\n emit()\n schedule()\n },\n finish(finishOptions = {}) {\n if (destroyed) { return }\n done = true\n if (finishOptions.flush ?? flushOnFinish) {\n visible = source\n pending.length = 0\n pendingOffset = 0\n cancelTimer()\n }\n emit()\n schedule()\n },\n flush() {\n if (destroyed) { return }\n visible = source\n pending.length = 0\n pendingOffset = 0\n budget = 0\n cancelTimer()\n emit()\n },\n getSnapshot: snapshot,\n pause() {\n if (destroyed || paused) { return }\n paused = true\n cancelTimer()\n emit()\n },\n reset(content = '', _resetOptions = {}) {\n cancelTimer()\n source = content\n visible = content\n pending.length = 0\n pendingOffset = 0\n done = false\n paused = false\n budget = 0\n firstPendingAt = 0\n lastTick = Date.now()\n emit()\n },\n resume() {\n if (destroyed || !paused) { return }\n paused = false\n lastTick = Date.now()\n emit()\n schedule()\n },\n subscribe(listener) {\n if (destroyed) { return () => {} }\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}\n\nexport function createTextStream(options: TextStreamOptions = {}): TextStreamController {\n if (typeof requestAnimationFrame !== 'function' || typeof cancelAnimationFrame !== 'function') {\n return createTimerTextStream(options)\n }\n\n const controller = createSmoothMarkdownStream(options)\n return {\n destroy: controller.destroy,\n dispose: controller.dispose,\n enqueue: controller.enqueue,\n finish: controller.finish,\n flush: controller.flush,\n getSnapshot: controller.getSnapshot,\n pause: controller.pause,\n reset: controller.reset,\n resume: controller.resume,\n subscribe: controller.subscribe,\n }\n}\n","import { createTextStream } from './text-stream'\nimport type {\n AgentApprovalPart,\n AgentErrorEvent,\n AgentReasoningPart,\n AgentStreamController,\n AgentStreamEvent,\n AgentStreamSnapshot,\n AgentToolPart,\n TextStreamOptions\n} from './types'\n\nexport interface AgentStreamControllerOptions {\n text?: TextStreamOptions\n}\n\nfunction requestIteratorCleanup(iterator: AsyncIterator<AgentStreamEvent>) {\n try {\n const cleanup = iterator.return?.()\n if (cleanup) void cleanup.catch(() => undefined)\n } catch {\n // Cleanup failures must not replace an already terminal connection result.\n }\n}\n\nfunction initialSnapshot(): AgentStreamSnapshot {\n return {\n data: [],\n eventCount: 0,\n reasoning: [],\n status: 'idle',\n tools: []\n }\n}\n\nexport function createAgentStreamController(\n options: AgentStreamControllerOptions = {}\n): AgentStreamController {\n const text = createTextStream(options.text)\n const listeners = new Set<() => void>()\n let snapshot = initialSnapshot()\n let destroyed = false\n let cancelled = false\n let transportDone = false\n let connecting = false\n let cancelActiveConnect: (() => void) | undefined\n\n function emit() {\n listeners.forEach((listener) => listener())\n }\n\n function setSnapshot(update: Partial<AgentStreamSnapshot>) {\n snapshot = { ...snapshot, ...update }\n emit()\n }\n\n function updateReasoning(id: string, update: Partial<AgentReasoningPart>) {\n setSnapshot({\n reasoning: snapshot.reasoning.map((part) => (part.id === id ? { ...part, ...update } : part))\n })\n }\n\n function updateTool(id: string, update: Partial<AgentToolPart>) {\n setSnapshot({\n tools: snapshot.tools.map((part) => (part.id === id ? { ...part, ...update } : part))\n })\n }\n\n function finalStatus() {\n const textSnapshot = text.getSnapshot()\n if (!transportDone || !textSnapshot.final) return\n setSnapshot({ status: snapshot.error ? 'failed' : cancelled ? 'cancelled' : 'completed' })\n }\n\n const unsubscribeText = text.subscribe(() => {\n if (destroyed || !snapshot.message) return\n const textSnapshot = text.getSnapshot()\n snapshot = {\n ...snapshot,\n message: {\n ...snapshot.message,\n final: textSnapshot.final,\n source: textSnapshot.source,\n visible: textSnapshot.visible\n }\n }\n emit()\n finalStatus()\n })\n\n function push(event: AgentStreamEvent) {\n if (destroyed || cancelled) return\n snapshot = { ...snapshot, eventCount: snapshot.eventCount + 1 }\n\n switch (event.type) {\n case 'message.start':\n transportDone = false\n text.reset()\n setSnapshot({\n error: undefined,\n message: {\n final: false,\n id: event.messageId,\n role: event.role,\n source: '',\n visible: ''\n },\n status: 'streaming'\n })\n break\n case 'text.delta':\n if (snapshot.message?.id === event.messageId) text.enqueue(event.delta)\n break\n case 'message.end':\n if (snapshot.message?.id === event.messageId) text.finish()\n break\n case 'reasoning.start':\n setSnapshot({\n reasoning: [\n ...snapshot.reasoning,\n { content: '', id: event.id, status: 'running', title: event.title }\n ]\n })\n break\n case 'reasoning.delta': {\n const part = snapshot.reasoning.find((item) => item.id === event.id)\n if (part) updateReasoning(event.id, { content: `${part.content}${event.delta}` })\n break\n }\n case 'reasoning.end':\n updateReasoning(event.id, { durationMs: event.durationMs, status: 'completed' })\n break\n case 'tool.start':\n setSnapshot({\n tools: [\n ...snapshot.tools,\n {\n id: event.id,\n input: event.input,\n name: event.name,\n status: 'running',\n summary: event.summary\n }\n ]\n })\n break\n case 'tool.update':\n updateTool(event.id, { summary: event.summary })\n break\n case 'tool.result':\n updateTool(event.id, {\n output: event.output,\n status: 'completed',\n summary: event.summary\n })\n break\n case 'tool.error':\n updateTool(event.id, { error: event.error, status: 'failed' })\n break\n case 'approval.required': {\n const approval: AgentApprovalPart = {\n choices: event.choices ?? [],\n description: event.description,\n id: event.id,\n status: 'waiting',\n title: event.title\n }\n setSnapshot({ approval, status: 'waiting' })\n break\n }\n case 'approval.resolved':\n if (snapshot.approval?.id === event.id) {\n setSnapshot({\n approval: {\n ...snapshot.approval,\n resolvedValue: event.value,\n status: 'completed'\n },\n status: 'streaming'\n })\n }\n break\n case 'data':\n setSnapshot({ data: [...snapshot.data, { name: event.name, value: event.value }] })\n break\n case 'error':\n transportDone = true\n text.finish({ flush: true })\n setSnapshot({ error: event, status: 'failed' })\n break\n case 'done':\n transportDone = true\n text.finish()\n setSnapshot({ usage: event.usage })\n if (!snapshot.message) setSnapshot({ status: 'completed' })\n finalStatus()\n break\n }\n }\n\n async function waitForTerminal() {\n if (snapshot.status === 'completed' || snapshot.status === 'failed' || snapshot.status === 'cancelled') {\n return snapshot\n }\n\n return await new Promise<AgentStreamSnapshot>((resolve) => {\n const unsubscribe = subscribe(() => {\n if (snapshot.status !== 'completed' && snapshot.status !== 'failed' && snapshot.status !== 'cancelled') return\n unsubscribe()\n resolve(snapshot)\n })\n })\n }\n\n function subscribe(listener: () => void) {\n if (destroyed) return () => {}\n listeners.add(listener)\n return () => listeners.delete(listener)\n }\n\n function reset() {\n text.reset()\n snapshot = initialSnapshot()\n cancelled = false\n transportDone = false\n emit()\n }\n\n function cancel(reason = 'Cancelled') {\n if (destroyed || cancelled) return\n cancelled = true\n transportDone = true\n text.finish({ flush: true })\n const error: AgentErrorEvent = { code: 'cancelled', message: reason, retryable: true, type: 'error' }\n setSnapshot({ error, status: 'cancelled' })\n cancelActiveConnect?.()\n }\n\n return {\n cancel,\n async connect(events) {\n if (connecting) throw new Error('Agent stream controller is already connected')\n connecting = true\n reset()\n const iterator = events[Symbol.asyncIterator]()\n let resolveCancellation: (() => void) | undefined\n const cancellation = new Promise<void>((resolve) => {\n resolveCancellation = resolve\n })\n cancelActiveConnect = resolveCancellation\n\n let protocolTerminal = false\n try {\n try {\n while (!cancelled && !destroyed) {\n const outcome = await Promise.race([\n iterator.next().then((result) => ({ kind: 'event' as const, result })),\n cancellation.then(() => ({ kind: 'cancelled' as const }))\n ])\n if (outcome.kind === 'cancelled' || outcome.result.done) break\n const event = outcome.result.value\n push(event)\n if (event.type === 'done' || event.type === 'error') {\n protocolTerminal = true\n break\n }\n }\n if (!transportDone && !cancelled && !destroyed) push({ type: 'done' })\n } catch (error) {\n push({\n message: error instanceof Error ? error.message : String(error),\n retryable: true,\n type: 'error'\n })\n } finally {\n if (protocolTerminal || cancelled || destroyed) requestIteratorCleanup(iterator)\n }\n return await waitForTerminal()\n } finally {\n connecting = false\n cancelActiveConnect = undefined\n }\n },\n destroy() {\n if (destroyed) return\n cancel('Agent stream controller destroyed')\n destroyed = true\n unsubscribeText()\n text.destroy()\n listeners.clear()\n },\n getSnapshot() {\n return snapshot\n },\n push,\n reset,\n subscribe\n }\n}\n","import type { AgentEventChannel, AgentStreamEvent } from './types'\n\nexport function createAgentEventChannel(): AgentEventChannel {\n const queue: AgentStreamEvent[] = []\n let ended = false\n let failure: Error | undefined\n let wake: (() => void) | undefined\n\n function stopConsuming() {\n ended = true\n queue.length = 0\n notify()\n }\n\n async function* iterate(): AsyncGenerator<AgentStreamEvent> {\n try {\n while (!ended || queue.length > 0) {\n if (failure) throw failure\n const event = queue.shift()\n if (event) {\n yield event\n continue\n }\n\n await new Promise<void>((resolve) => {\n wake = resolve\n })\n wake = undefined\n }\n if (failure) throw failure\n } finally {\n stopConsuming()\n }\n }\n\n function createIterator(): AsyncIterator<AgentStreamEvent> {\n const iterator = iterate()\n return {\n next() {\n return iterator.next()\n },\n return() {\n stopConsuming()\n return iterator.return(undefined)\n }\n }\n }\n\n function notify() {\n wake?.()\n }\n\n return {\n end() {\n ended = true\n notify()\n },\n fail(error) {\n failure = error instanceof Error ? error : new Error(String(error))\n ended = true\n notify()\n },\n push(event) {\n if (ended) return\n queue.push(event)\n notify()\n },\n source: {\n [Symbol.asyncIterator]: createIterator\n }\n }\n}\n","export function isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import { isUnknownRecord } from './type-guards'\nimport type { AgentApprovalRequiredEvent, AgentStreamEvent } from './types'\n\n\nfunction requiredString(value: Record<string, unknown>, key: string): string {\n const field = value[key]\n if (typeof field !== 'string' || field.length === 0) {\n throw new TypeError(`Agent stream event field \"${key}\" must be a non-empty string`)\n }\n return field\n}\n\nfunction optionalString(value: Record<string, unknown>, key: string): string | undefined {\n const field = value[key]\n if (field === undefined) return undefined\n if (typeof field !== 'string') throw new TypeError(`Agent stream event field \"${key}\" must be a string`)\n return field\n}\n\nfunction optionalBoolean(value: Record<string, unknown>, key: string): boolean | undefined {\n const field = value[key]\n if (field === undefined) return undefined\n if (typeof field !== 'boolean') throw new TypeError(`Agent stream event field \"${key}\" must be a boolean`)\n return field\n}\n\nfunction optionalNumber(value: Record<string, unknown>, key: string): number | undefined {\n const field = value[key]\n if (field === undefined) return undefined\n if (typeof field !== 'number' || !Number.isFinite(field)) {\n throw new TypeError(`Agent stream event field \"${key}\" must be a finite number`)\n }\n return field\n}\n\nfunction parseChoices(value: unknown): AgentApprovalRequiredEvent['choices'] {\n if (value === undefined) return undefined\n if (!Array.isArray(value)) throw new TypeError('Agent approval choices must be an array')\n\n return value.map((choice) => {\n if (!isUnknownRecord(choice)) throw new TypeError('Agent approval choice must be an object')\n return {\n description: optionalString(choice, 'description'),\n disabled: optionalBoolean(choice, 'disabled'),\n label: requiredString(choice, 'label'),\n value: requiredString(choice, 'value')\n }\n })\n}\n\nexport function parseAgentStreamEvent(value: unknown): AgentStreamEvent {\n if (!isUnknownRecord(value) || typeof value.type !== 'string') {\n throw new TypeError('Agent stream event must be an object with a string type')\n }\n\n switch (value.type) {\n case 'message.start': {\n const role = requiredString(value, 'role')\n if (role !== 'assistant' && role !== 'system' && role !== 'user') {\n throw new TypeError(`Unsupported agent message role: ${role}`)\n }\n return { messageId: requiredString(value, 'messageId'), role, type: value.type }\n }\n case 'text.delta':\n return {\n delta: requiredString(value, 'delta'),\n messageId: requiredString(value, 'messageId'),\n type: value.type\n }\n case 'message.end':\n return { messageId: requiredString(value, 'messageId'), type: value.type }\n case 'reasoning.start':\n return {\n id: requiredString(value, 'id'),\n title: requiredString(value, 'title'),\n type: value.type\n }\n case 'reasoning.delta':\n return {\n delta: requiredString(value, 'delta'),\n id: requiredString(value, 'id'),\n type: value.type\n }\n case 'reasoning.end':\n return {\n durationMs: optionalNumber(value, 'durationMs'),\n id: requiredString(value, 'id'),\n type: value.type\n }\n case 'tool.start':\n return {\n id: requiredString(value, 'id'),\n input: value.input,\n name: requiredString(value, 'name'),\n summary: optionalString(value, 'summary'),\n type: value.type\n }\n case 'tool.update':\n return {\n id: requiredString(value, 'id'),\n summary: optionalString(value, 'summary'),\n type: value.type\n }\n case 'tool.result':\n return {\n id: requiredString(value, 'id'),\n output: value.output,\n summary: optionalString(value, 'summary'),\n type: value.type\n }\n case 'tool.error':\n return {\n error: requiredString(value, 'error'),\n id: requiredString(value, 'id'),\n type: value.type\n }\n case 'approval.required':\n return {\n choices: parseChoices(value.choices),\n description: optionalString(value, 'description'),\n id: requiredString(value, 'id'),\n title: requiredString(value, 'title'),\n type: value.type\n }\n case 'approval.resolved':\n return {\n id: requiredString(value, 'id'),\n type: value.type,\n value: requiredString(value, 'value')\n }\n case 'data':\n if (!('value' in value)) throw new TypeError('Agent data event must include a value field')\n return { name: requiredString(value, 'name'), type: value.type, value: value.value }\n case 'error':\n return {\n code: optionalString(value, 'code'),\n message: requiredString(value, 'message'),\n retryable: optionalBoolean(value, 'retryable'),\n type: value.type\n }\n case 'done': {\n const usage = value.usage\n if (usage !== undefined && !isUnknownRecord(usage)) {\n throw new TypeError('Agent done usage must be an object')\n }\n return {\n type: value.type,\n usage: usage\n ? {\n inputTokens: optionalNumber(usage, 'inputTokens'),\n outputTokens: optionalNumber(usage, 'outputTokens')\n }\n : undefined\n }\n }\n default:\n throw new TypeError(`Unsupported agent stream event type: ${value.type}`)\n }\n}\n","import {\n getMarkdown,\n isUnsafeHtmlUrl,\n parseMarkdownToStructure,\n type GetMarkdownOptions,\n type ParsedNode\n} from 'stream-markdown-parser'\n\nexport interface StreamingMarkdownParserOptions {\n customHtmlTags?: readonly string[]\n enableMath?: boolean\n includeSourceMap?: boolean\n markdownItOptions?: GetMarkdownOptions['markdownItOptions']\n validateLink?: (url: string) => boolean\n}\n\nexport interface StreamingMarkdownParser {\n parse: (content: string, options?: { final?: boolean }) => ParsedNode[]\n reset: () => void\n}\n\nlet parserId = 0\n\nexport function createStreamingMarkdownParser(\n options: StreamingMarkdownParserOptions = {}\n): StreamingMarkdownParser {\n parserId += 1\n const validateLink = options.validateLink ?? ((url: string) => !isUnsafeHtmlUrl(url))\n const markdown = getMarkdown(`varo-agent-${parserId}`, {\n customHtmlTags: options.customHtmlTags,\n enableMath: options.enableMath ?? true,\n markdownItOptions: {\n breaks: true,\n html: false,\n linkify: true,\n ...options.markdownItOptions,\n validateLink\n }\n })\n\n return {\n parse(content, parseOptions = {}) {\n return parseMarkdownToStructure(content, markdown, {\n customHtmlTags: options.customHtmlTags,\n final: parseOptions.final ?? false,\n includeSourceMap: options.includeSourceMap ?? false,\n reuseStableTopLevelNodes: true,\n streamParse: 'auto',\n validateLink\n })\n },\n reset() {\n markdown.stream?.reset?.()\n }\n }\n}\n\nexport type { ParsedNode } from 'stream-markdown-parser'\n","import type { ParsedNode } from 'stream-markdown-parser'\nimport { isUnknownRecord } from './type-guards'\n\nexport type AgentMarkdownNodeKind\n = | 'admonition'\n | 'blockquote'\n | 'checkbox'\n | 'code-block'\n | 'definition'\n | 'definition-list'\n | 'emphasis'\n | 'footnote'\n | 'hardbreak'\n | 'heading'\n | 'highlight'\n | 'image'\n | 'inline-code'\n | 'insert'\n | 'link'\n | 'list'\n | 'list-item'\n | 'math-block'\n | 'math-inline'\n | 'paragraph'\n | 'strikethrough'\n | 'strong'\n | 'subscript'\n | 'superscript'\n | 'table'\n | 'table-cell'\n | 'table-row'\n | 'text'\n | 'thematic-break'\n\nexport interface AgentMarkdownViewNode {\n align?: 'center' | 'left' | 'right'\n alt?: string\n checked?: boolean\n children?: AgentMarkdownViewNode[]\n header?: boolean\n href?: string\n kind: AgentMarkdownNodeKind\n language?: string\n level?: number\n loading?: boolean\n ordered?: boolean\n start?: number\n text?: string\n title?: string\n}\n\nexport type AgentRichTextNode\n = | {\n text: string\n type: 'text'\n }\n | {\n attrs?: Record<string, string>\n children?: AgentRichTextNode[]\n name: 'br' | 'code' | 'del' | 'em' | 'ins' | 'mark' | 'span' | 'strong' | 'sub' | 'sup'\n }\ntype AgentRichTextElementName = Extract<AgentRichTextNode, { name: string }>['name']\n\nfunction richTextChildren(children: AgentMarkdownViewNode[] | undefined): AgentRichTextNode[] | undefined {\n const result: AgentRichTextNode[] = []\n for (const child of children ?? []) {\n // Recursive inline nodes intentionally alternate between element and child normalization.\n // eslint-disable-next-line ts/no-use-before-define\n const normalized = richTextNode(child)\n if (!normalized) { return undefined }\n result.push(normalized)\n }\n return result\n}\n\nfunction richTextNode(node: AgentMarkdownViewNode): AgentRichTextNode | undefined {\n if (node.kind === 'text') { return { text: node.text ?? '', type: 'text' } }\n if (node.kind === 'hardbreak') { return { name: 'br' } }\n if (node.kind === 'checkbox') { return { text: node.checked ? '☑ ' : '☐ ', type: 'text' } }\n\n const names: Partial<Record<AgentMarkdownNodeKind, AgentRichTextElementName>> = {\n emphasis: 'em',\n strikethrough: 'del',\n strong: 'strong',\n subscript: 'sub',\n superscript: 'sup',\n }\n const name = names[node.kind]\n if (name) {\n const children = richTextChildren(node.children)\n return children ? { children, name } : undefined\n }\n\n if (node.kind === 'highlight' || node.kind === 'insert') {\n const children = richTextChildren(node.children)\n if (!children) { return undefined }\n return {\n attrs: {\n style: node.kind === 'highlight'\n ? 'background:rgba(250,146,0,.18);border-radius:2px;'\n : 'text-decoration:underline;',\n },\n children,\n name: 'span',\n }\n }\n\n if (node.kind === 'inline-code') {\n return {\n attrs: {\n style: 'font-family:monospace;padding:1px 4px;border-radius:4px;background:rgba(127,127,127,.12);',\n },\n children: [{ text: node.text ?? '', type: 'text' }],\n name: 'code',\n }\n }\n if (node.kind === 'math-inline') {\n return {\n attrs: { style: 'font-family:monospace;' },\n children: [{ text: node.text ?? '', type: 'text' }],\n name: 'span',\n }\n }\n return undefined\n}\n\nexport function toAgentRichTextNodes(nodes: AgentMarkdownViewNode[]): AgentRichTextNode[] | undefined {\n return richTextChildren(nodes)\n}\n\nfunction stringValue(value: unknown, fallback = '') {\n return typeof value === 'string' ? value : fallback\n}\n\nfunction booleanValue(value: unknown) {\n return typeof value === 'boolean' ? value : undefined\n}\n\nfunction numberValue(value: unknown) {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction alignValue(value: unknown): 'center' | 'left' | 'right' | undefined {\n return value === 'center' || value === 'left' || value === 'right' ? value : undefined\n}\n\nfunction nodeField(node: ParsedNode, key: string): unknown {\n return key in node ? Reflect.get(node, key) : undefined\n}\n\nfunction normalizeUnknownNode(value: unknown): AgentMarkdownViewNode | undefined {\n if (!isUnknownRecord(value) || typeof value.type !== 'string' || typeof value.raw !== 'string') { return undefined }\n // The required BaseNode fields are validated above; extension fields stay runtime-checked.\n const node = value as ParsedNode\n // Recursive block normalization is declared below to keep the public switch centralized.\n // eslint-disable-next-line ts/no-use-before-define\n return normalizeMarkdownNode(node)\n}\n\nfunction normalizeChildren(value: unknown): AgentMarkdownViewNode[] {\n if (!Array.isArray(value)) { return [] }\n const result: AgentMarkdownViewNode[] = []\n value.forEach((item) => {\n const normalized = normalizeUnknownNode(item)\n if (normalized) { result.push(normalized) }\n })\n return result\n}\n\nfunction textNode(text: string): AgentMarkdownViewNode {\n return { kind: 'text', text }\n}\n\nexport function normalizeMarkdownNode(node: ParsedNode): AgentMarkdownViewNode {\n const fallback = stringValue(node.raw)\n\n switch (node.type) {\n case 'text':\n return textNode(stringValue(node.content, fallback))\n case 'heading':\n return {\n children: normalizeChildren(node.children),\n kind: 'heading',\n level: numberValue(nodeField(node, 'level')) ?? 2,\n text: stringValue(nodeField(node, 'text')),\n }\n case 'paragraph':\n case 'inline':\n return { children: normalizeChildren(node.children), kind: 'paragraph' }\n case 'list':\n return {\n children: normalizeChildren(nodeField(node, 'items')),\n kind: 'list',\n ordered: booleanValue(nodeField(node, 'ordered')) ?? false,\n start: numberValue(nodeField(node, 'start')),\n }\n case 'list_item':\n return { children: normalizeChildren(node.children), kind: 'list-item' }\n case 'code_block':\n return {\n kind: 'code-block',\n language: stringValue(nodeField(node, 'language')),\n loading: booleanValue(node.loading),\n text: stringValue(node.code, fallback),\n }\n case 'inline_code':\n return { kind: 'inline-code', text: stringValue(node.code, fallback) }\n case 'link':\n return {\n children: normalizeChildren(node.children),\n href: stringValue(nodeField(node, 'href')),\n kind: 'link',\n text: stringValue(nodeField(node, 'text')),\n title: stringValue(nodeField(node, 'title')),\n }\n case 'image':\n return {\n alt: stringValue(nodeField(node, 'alt')),\n href: stringValue(nodeField(node, 'src')),\n kind: 'image',\n title: stringValue(nodeField(node, 'title')),\n }\n case 'thematic_break':\n return { kind: 'thematic-break' }\n case 'blockquote':\n return { children: normalizeChildren(node.children), kind: 'blockquote' }\n case 'table': {\n const header = nodeField(node, 'header')\n const rows = nodeField(node, 'rows')\n return {\n children: normalizeChildren(Array.isArray(rows) ? [header, ...rows] : [header]),\n kind: 'table',\n }\n }\n case 'table_row':\n return { children: normalizeChildren(nodeField(node, 'cells')), kind: 'table-row' }\n case 'table_cell':\n return {\n align: alignValue(nodeField(node, 'align')),\n children: normalizeChildren(node.children),\n header: booleanValue(nodeField(node, 'header')),\n kind: 'table-cell',\n }\n case 'strong':\n return { children: normalizeChildren(node.children), kind: 'strong' }\n case 'emphasis':\n return { children: normalizeChildren(node.children), kind: 'emphasis' }\n case 'strikethrough':\n return { children: normalizeChildren(node.children), kind: 'strikethrough' }\n case 'highlight':\n return { children: normalizeChildren(node.children), kind: 'highlight' }\n case 'insert':\n return { children: normalizeChildren(node.children), kind: 'insert' }\n case 'subscript':\n return { children: normalizeChildren(node.children), kind: 'subscript' }\n case 'superscript':\n return { children: normalizeChildren(node.children), kind: 'superscript' }\n case 'checkbox':\n case 'checkbox_input':\n return { checked: booleanValue(nodeField(node, 'checked')), kind: 'checkbox' }\n case 'emoji':\n return textNode(stringValue(nodeField(node, 'markup'), fallback))\n case 'definition_list':\n return { children: normalizeChildren(nodeField(node, 'items')), kind: 'definition-list' }\n case 'definition_item':\n return {\n children: [\n { children: normalizeChildren(nodeField(node, 'term')), header: true, kind: 'definition' },\n { children: normalizeChildren(nodeField(node, 'definition')), kind: 'definition' },\n ],\n kind: 'definition',\n }\n case 'footnote':\n return { children: normalizeChildren(node.children), kind: 'footnote', title: stringValue(nodeField(node, 'id')) }\n case 'footnote_reference':\n case 'reference':\n return { kind: 'footnote', text: stringValue(nodeField(node, 'id')) }\n case 'admonition':\n return {\n children: normalizeChildren(node.children),\n kind: 'admonition',\n text: stringValue(nodeField(node, 'kind')),\n title: stringValue(nodeField(node, 'title')),\n }\n case 'vmr_container':\n return {\n children: normalizeChildren(node.children),\n kind: 'admonition',\n loading: booleanValue(node.loading),\n title: stringValue(nodeField(node, 'name')),\n }\n case 'hardbreak':\n return { kind: 'hardbreak' }\n case 'math_inline':\n return { kind: 'math-inline', text: stringValue(node.content, fallback) }\n case 'math_block':\n return { kind: 'math-block', text: stringValue(node.content, fallback) }\n case 'html_block':\n case 'html_inline':\n return textNode(stringValue(node.content, fallback))\n default:\n return textNode(fallback)\n }\n}\n\nexport function normalizeMarkdownNodes(nodes: ParsedNode[]): AgentMarkdownViewNode[] {\n return nodes.map(normalizeMarkdownNode)\n}\n","import { createAgentEventChannel } from './event-channel'\nimport { parseAgentStreamEvent } from './event-parser'\nimport type { AgentStreamEvent } from './types'\n\nexport interface AgentSseEventSource {\n end: () => void\n fail: (error: unknown) => void\n feed: (chunk: string | ArrayBuffer | Uint8Array) => void\n source: AsyncIterable<AgentStreamEvent>\n}\n\ninterface Utf8ChunkDecoder {\n decode: (chunk: Uint8Array, final?: boolean) => string\n}\n\nfunction createFallbackUtf8Decoder(): Utf8ChunkDecoder {\n let carry = new Uint8Array(0)\n\n return {\n decode(chunk, final = false) {\n const bytes = new Uint8Array(carry.length + chunk.length)\n bytes.set(carry)\n bytes.set(chunk, carry.length)\n let cursor = 0\n let result = ''\n\n while (cursor < bytes.length) {\n const first = bytes[cursor]\n if (first < 0x80) {\n result += String.fromCodePoint(first)\n cursor += 1\n continue\n }\n\n const size = first >= 0xf0 ? 4 : first >= 0xe0 ? 3 : first >= 0xc0 ? 2 : 1\n if (size === 1) {\n result += '\\uFFFD'\n cursor += 1\n continue\n }\n if (cursor + size > bytes.length) break\n\n let codePoint = first & (size === 2 ? 0x1f : size === 3 ? 0x0f : 0x07)\n let valid = true\n for (let index = 1; index < size; index += 1) {\n const continuation = bytes[cursor + index]\n if ((continuation & 0xc0) !== 0x80) {\n valid = false\n break\n }\n codePoint = (codePoint << 6) | (continuation & 0x3f)\n }\n\n if (!valid || codePoint > 0x10ffff) {\n result += '\\uFFFD'\n cursor += 1\n continue\n }\n\n result += String.fromCodePoint(codePoint)\n cursor += size\n }\n\n carry = bytes.slice(cursor)\n if (final && carry.length > 0) {\n result += '\\uFFFD'\n carry = new Uint8Array(0)\n }\n return result\n }\n }\n}\n\nfunction createUtf8Decoder(): Utf8ChunkDecoder {\n if (typeof TextDecoder === 'function') {\n const decoder = new TextDecoder()\n return {\n decode(chunk, final = false) {\n return decoder.decode(chunk, { stream: !final })\n }\n }\n }\n return createFallbackUtf8Decoder()\n}\n\nfunction toBytes(chunk: ArrayBuffer | Uint8Array) {\n return chunk instanceof Uint8Array ? chunk : new Uint8Array(chunk)\n}\n\nexport function createAgentSseEventSource(): AgentSseEventSource {\n const channel = createAgentEventChannel()\n const decoder = createUtf8Decoder()\n const dataLines: string[] = []\n let textBuffer = ''\n let ended = false\n\n function clearBufferedInput() {\n dataLines.length = 0\n textBuffer = ''\n }\n\n function closeSource() {\n if (ended) return\n ended = true\n clearBufferedInput()\n channel.end()\n }\n\n function failSource(error: unknown) {\n if (ended) return\n ended = true\n clearBufferedInput()\n channel.fail(error)\n }\n\n function finishWith(event: AgentStreamEvent) {\n channel.push(event)\n closeSource()\n }\n\n function dispatch() {\n if (dataLines.length === 0 || ended) return\n const payload = dataLines.join('\\n')\n dataLines.length = 0\n if (payload === '[DONE]') {\n finishWith({ type: 'done' })\n return\n }\n\n try {\n const event = parseAgentStreamEvent(JSON.parse(payload))\n if (event.type === 'done' || event.type === 'error') finishWith(event)\n else channel.push(event)\n } catch (error) {\n failSource(error)\n }\n }\n\n function processLine(line: string) {\n const normalized = line.endsWith('\\r') ? line.slice(0, -1) : line\n if (normalized.length === 0) {\n dispatch()\n return\n }\n if (normalized.startsWith(':')) return\n if (normalized === 'data') {\n dataLines.push('')\n return\n }\n if (normalized.startsWith('data:')) {\n const value = normalized.slice(5)\n dataLines.push(value.startsWith(' ') ? value.slice(1) : value)\n }\n }\n\n function appendText(value: string) {\n if (ended) return\n textBuffer += value\n let lineEnd = textBuffer.indexOf('\\n')\n while (lineEnd >= 0) {\n processLine(textBuffer.slice(0, lineEnd))\n if (ended) return\n textBuffer = textBuffer.slice(lineEnd + 1)\n lineEnd = textBuffer.indexOf('\\n')\n }\n }\n\n return {\n end() {\n if (ended) return\n appendText(decoder.decode(new Uint8Array(0), true))\n if (ended) return\n if (textBuffer.length > 0) processLine(textBuffer)\n dispatch()\n closeSource()\n },\n fail(error) {\n failSource(error)\n },\n feed(chunk) {\n if (ended) return\n appendText(typeof chunk === 'string' ? chunk : decoder.decode(toBytes(chunk)))\n },\n source: channel.source\n }\n}\n","import type {\n AgentThreadController,\n AgentThreadSnapshot,\n AgentThreadVersion,\n} from './types'\n\nconst DESTROYED_ERROR = 'Agent thread controller is destroyed'\n\nfunction assertVersionId(id: string) {\n if (id.length === 0) throw new Error('Agent thread version id must not be empty')\n}\n\nfunction freezeVersion(version: AgentThreadVersion): AgentThreadVersion {\n return Object.freeze({ ...version })\n}\n\nfunction freezeSnapshot(\n versions: readonly AgentThreadVersion[],\n activeVersionId?: string,\n): AgentThreadSnapshot {\n if (activeVersionId === undefined) return Object.freeze({ versions })\n return Object.freeze({ activeVersionId, versions })\n}\n\nfunction validateSnapshot(initial?: AgentThreadSnapshot): AgentThreadSnapshot {\n const sourceVersions = initial?.versions ?? []\n const versionsById = new Map<string, AgentThreadVersion>()\n\n for (const version of sourceVersions) {\n assertVersionId(version.id)\n if (versionsById.has(version.id)) {\n throw new Error(`Agent thread version \"${version.id}\" is duplicated`)\n }\n versionsById.set(version.id, version)\n }\n\n for (const version of sourceVersions) {\n if (version.parentId !== undefined && !versionsById.has(version.parentId)) {\n throw new Error(`Agent thread parent version \"${version.parentId}\" does not exist`)\n }\n }\n\n const resolvedIds = new Set<string>()\n for (const version of sourceVersions) {\n if (resolvedIds.has(version.id)) continue\n\n const path: string[] = []\n const pathIds = new Set<string>()\n let current: AgentThreadVersion | undefined = version\n while (current !== undefined && !resolvedIds.has(current.id)) {\n if (pathIds.has(current.id)) {\n throw new Error(`Agent thread version \"${current.id}\" has a cyclic parent chain`)\n }\n path.push(current.id)\n pathIds.add(current.id)\n current = current.parentId === undefined\n ? undefined\n : versionsById.get(current.parentId)\n }\n path.forEach(id => resolvedIds.add(id))\n }\n\n const activeVersionId = initial?.activeVersionId\n if (activeVersionId !== undefined && !versionsById.has(activeVersionId)) {\n throw new Error(`Agent thread active version \"${activeVersionId}\" does not exist`)\n }\n\n return freezeSnapshot(Object.freeze(sourceVersions.map(freezeVersion)), activeVersionId)\n}\n\nexport function createAgentThreadController(\n initial?: AgentThreadSnapshot,\n): AgentThreadController {\n const listeners = new Set<() => void>()\n let snapshot = validateSnapshot(initial)\n let destroyed = false\n\n function assertActive() {\n if (destroyed) throw new Error(DESTROYED_ERROR)\n }\n\n function findVersion(id: string) {\n return snapshot.versions.find(version => version.id === id)\n }\n\n function replace(nextSnapshot: AgentThreadSnapshot) {\n snapshot = nextSnapshot\n listeners.forEach(listener => listener())\n }\n\n function append(version: AgentThreadVersion) {\n assertActive()\n assertVersionId(version.id)\n if (findVersion(version.id)) {\n throw new Error(`Agent thread version \"${version.id}\" already exists`)\n }\n if (version.parentId !== undefined && !findVersion(version.parentId)) {\n throw new Error(`Agent thread parent version \"${version.parentId}\" does not exist`)\n }\n\n const versions = Object.freeze([...snapshot.versions, freezeVersion(version)])\n replace(freezeSnapshot(versions, version.id))\n }\n\n function fork(\n parentId: string,\n version: Omit<AgentThreadVersion, 'parentId'>,\n ) {\n assertActive()\n assertVersionId(version.id)\n if (findVersion(version.id)) {\n throw new Error(`Agent thread version \"${version.id}\" already exists`)\n }\n if (!findVersion(parentId)) {\n throw new Error(`Agent thread parent version \"${parentId}\" does not exist`)\n }\n\n const forkedVersion = freezeVersion({ ...version, parentId })\n const versions = Object.freeze([...snapshot.versions, forkedVersion])\n replace(freezeSnapshot(versions, forkedVersion.id))\n }\n\n function select(id: string) {\n assertActive()\n if (!findVersion(id)) {\n throw new Error(`Agent thread version \"${id}\" does not exist`)\n }\n replace(freezeSnapshot(snapshot.versions, id))\n }\n\n function reset(nextInitial?: AgentThreadSnapshot) {\n assertActive()\n const nextSnapshot = validateSnapshot(nextInitial)\n replace(nextSnapshot)\n }\n\n function subscribe(listener: () => void) {\n assertActive()\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n }\n\n return {\n append,\n destroy() {\n if (destroyed) return\n destroyed = true\n listeners.clear()\n },\n fork,\n getSnapshot() {\n return snapshot\n },\n reset,\n select,\n subscribe,\n }\n}\n"],"mappings":";;;AAOA,SAAS,eAAe,OAAyB;CAC/C,MAAM,cAAuB;CAC7B,IACE,OAAO,gBAAgB,YACpB,gBAAgB,QAChB,EAAE,eAAe,gBACjB,OAAO,YAAY,cAAc,YAEpC,OAAO,MAAM,KAAK,KAAK;CAIzB,MAAM,YAAY,YAAY;CAI9B,OAAO,MAAM,KAAK,IAAI,UAAU,KAAA,GAAW,EAAE,aAAa,WAAW,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAG,SAAQ,KAAK,OAAO;AAC9G;AAEA,SAAS,MAAM,OAAe,KAAa,KAAa;CACtD,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;AAEA,SAAS,iBAAiB,OAAe;CACvC,IAAI;CACJ,IAAI,eAAe;CACnB,KAAK,MAAM,QAAQ,MAAM,MAAM,OAAO,GAAG;EACvC,MAAM,QAAQ,uBAAuB,KAAK,IAAI;EAC9C,IAAI,CAAC,OAAS;EACd,MAAM,aAAa,MAAM,EAAE,CAAC;EAC5B,MAAM,aAAa,MAAM,EAAE,CAAC;EAC5B,IAAI,CAAC,QAAQ;GACX,SAAS;GACT,eAAe;EACjB,OACK,IAAI,WAAW,cAAc,cAAc,cAAc;GAC5D,SAAS,KAAA;GACT,eAAe;EACjB;CACF;CACA,OAAO,WAAW,KAAA;AACpB;AAEA,SAAS,qBAAqB,SAAiB,QAAgB,UAAoB;CACjF,IAAI,SAAS,WAAW,GAAK,OAAO;CACpC,MAAM,YAAY,UAAU,SAAS,KAAK,EAAE;CAC5C,MAAM,YAAY,UAAU,YAAY,IAAI,IAAI;CAChD,MAAM,gBAAgB,UAAU,MAAM,SAAS;CAC/C,MAAM,gBAAgB,OAAO,QAAQ,MAAM,SAAS;CACpD,MAAM,aAAa,OAAO,MAAM,WAAW,gBAAgB,IAAI,OAAO,SAAS,aAAa;CAC5F,MAAM,QAAQ,iBAAiB,KAAK,UAAU;CAC9C,IAAI,CAAC,OAAS,OAAO,SAAS;CAE9B,MAAM,SAAS,MAAM;CACrB,MAAM,sBAAsB,OAAO,SAAS,KAAK,WAAW,KAAK,MAAM;CACvE,MAAM,gBAAgB,OAAO,UAAU;CACvC,KAAK,uBAAuB,kBAAkB,mBAAmB,KAAK,aAAa,GACjF,OAAO;CAET,OAAO,SAAS;AAClB;AAEA,SAAS,sBAAsB,UAA6B,CAAC,GAAyB;CACpF,MAAM,oBAAoB,KAAK,IAAI,GAAG,QAAQ,qBAAqB,EAAE;CACrE,MAAM,oBAAoB,KAAK,IAAI,mBAAmB,QAAQ,qBAAqB,GAAI;CACvF,MAAM,kBAAkB,KAAK,IAAI,GAAG,QAAQ,mBAAmB,GAAG;CAClE,MAAM,mBAAmB,KAAK,IAAI,GAAG,QAAQ,oBAAoB,GAAG;CACpE,MAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,gBAAgB,EAAE,CAAC;CACzE,MAAM,oBAAoB,KAAK,IAAI,GAAG,QAAQ,qBAAqB,EAAE;CACrE,MAAM,mBAAmB,KAAK,IAAI,GAAG,QAAQ,oBAAoB,GAAG;CACpE,MAAM,eAAe,KAAK,IAAI,GAAG,QAAQ,gBAAgB,EAAE;CAC3D,MAAM,gBAAgB,QAAQ,iBAAiB;CAC/C,MAAM,sBAAsB,QAAQ,uBAAuB;CAC3D,MAAM,4BAA4B,KAAK,IAAI,GAAG,QAAQ,6BAA6B,IAAI;CACvF,MAAM,4BAAY,IAAI,IAAgB;CACtC,MAAM,UAAoB,CAAC;CAC3B,IAAI,gBAAgB;CACpB,IAAI,SAAS;CACb,IAAI,UAAU;CACd,IAAI,OAAO;CACX,IAAI,SAAS;CACb,IAAI,YAAY;CAChB,IAAI;CACJ,IAAI,WAAW,KAAK,IAAI;CACxB,IAAI,iBAAiB;CACrB,IAAI,SAAS;CAEb,SAAS,eAAe;EACtB,OAAO,QAAQ,SAAS;CAC1B;CAEA,SAAS,WAA+B;EACtC,MAAM,eAAe,KAAK,IAAI,GAAG,OAAO,SAAS,QAAQ,MAAM;EAC/D,OAAO;GACL,UAAU,aAAa,MAAM;GAC7B;GACA,OAAO,QAAQ,aAAa,MAAM;GAClC;GACA;GACA;GACA;EACF;CACF;CAEA,SAAS,OAAO;EACd,UAAU,SAAQ,aAAY,SAAS,CAAC;CAC1C;CAEA,SAAS,iBAAiB;EACxB,IAAI,gBAAgB,QAAQ,gBAAgB,IAAI,QAAQ,QAAU;EAClE,QAAQ,OAAO,GAAG,aAAa;EAC/B,gBAAgB;CAClB;CAEA,SAAS,WAAW;EAClB,IAAI,aAAa,UAAU,SAAS,aAAa,MAAM,GAAK;EAG5D,QAAQ,WAAW,MAAM,KAAK,KAAK,MAAO,YAAY,CAAC;CACzD;CAEA,SAAS,OAAO;EACd,QAAQ,KAAA;EACR,IAAI,aAAa,QAAU;EAE3B,MAAM,MAAM,KAAK,IAAI;EACrB,IAAI,kBAAkB,MAAM,iBAAiB,cAAc;GACzD,SAAS;GACT;EACF;EACA,iBAAiB;EAEjB,MAAM,UAAU,KAAK,IAAI,GAAG,MAAM,QAAQ;EAC1C,WAAW;EACX,MAAM,UAAU,aAAa;EAC7B,IAAI,YAAY,GAAG;GACjB,KAAK;GACL;EACF;EAEA,MAAM,YAAY,WAAW,mBAAmB,mBAAmB;EAEnE,MAAM,MAAM,MADQ,UAAU,MAAQ,WACR,mBAAmB,iBAAiB;EAClE,UAAW,MAAM,UAAW;EAC5B,MAAM,cAAc,KAAK,IAAI,SAAS,mBAAmB,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC,CAAC;EACxF,IAAI,mBAAmB,QAAQ,MAAM,eAAe,gBAAgB,WAAW;EAC/E,IAAI,kBAAkB,qBAAqB,SAAS,QAAQ,gBAAgB;EAC5E,IAAI,oBAAoB,GAAG;GACzB,MAAM,gBAAgB,QAAQ,MAAM,aAAa,CAAC,CAAC,WAAU,YAAW,QAAQ,SAAS,IAAI,CAAC;GAC9F,IAAI,iBAAiB,GAAG;IACtB,mBAAmB,QAAQ,MAAM,eAAe,gBAAgB,gBAAgB,CAAC;IACjF,kBAAkB,qBAAqB,SAAS,QAAQ,gBAAgB;GAC1E;EACF;EACA,IAAI,oBAAoB,GAAG;GACzB,KAAK;GACL,SAAS;GACT;EACF;EACA,SAAS,KAAK,IAAI,GAAG,SAAS,eAAe;EAC7C,WAAW,iBAAiB,MAAM,GAAG,eAAe,CAAC,CAAC,KAAK,EAAE;EAC7D,iBAAiB;EACjB,eAAe;EACf,KAAK;EACL,SAAS;CACX;CAEA,SAAS,cAAc;EACrB,aAAa,KAAK;EAClB,QAAQ,KAAA;CACV;CAEA,SAAS,UAAU;EACjB,IAAI,WAAa;EACjB,YAAY;EACZ,YAAY;EACZ,QAAQ,SAAS;EACjB,UAAU,MAAM;CAClB;CAEA,OAAO;EACL;EACA,SAAS;EACT,QAAQ,OAAO;GACb,IAAI,aAAa,CAAC,OAAS;GAC3B,IAAI,MAAQ,OAAO;GACnB,MAAM,eAAe,OAAO,WAAW;GACvC,UAAU;GACV,QAAQ,KAAK,GAAG,eAAe,KAAK,CAAC;GACrC,IAAI,cAAgB,iBAAiB,KAAK,IAAI;GAC9C,WAAW,KAAK,IAAI;GAEpB,IACE,gBACG,uBACA,aAAa,KAAK,6BAClB,CAAC,iBAAiB,MAAM,GAC3B;IACA,UAAU;IACV,QAAQ,SAAS;IACjB,gBAAgB;IAChB,iBAAiB;GACnB;GAEA,KAAK;GACL,SAAS;EACX;EACA,OAAO,gBAAgB,CAAC,GAAG;GACzB,IAAI,WAAa;GACjB,OAAO;GACP,IAAI,cAAc,SAAS,eAAe;IACxC,UAAU;IACV,QAAQ,SAAS;IACjB,gBAAgB;IAChB,YAAY;GACd;GACA,KAAK;GACL,SAAS;EACX;EACA,QAAQ;GACN,IAAI,WAAa;GACjB,UAAU;GACV,QAAQ,SAAS;GACjB,gBAAgB;GAChB,SAAS;GACT,YAAY;GACZ,KAAK;EACP;EACA,aAAa;EACb,QAAQ;GACN,IAAI,aAAa,QAAU;GAC3B,SAAS;GACT,YAAY;GACZ,KAAK;EACP;EACA,MAAM,UAAU,IAAI,gBAAgB,CAAC,GAAG;GACtC,YAAY;GACZ,SAAS;GACT,UAAU;GACV,QAAQ,SAAS;GACjB,gBAAgB;GAChB,OAAO;GACP,SAAS;GACT,SAAS;GACT,iBAAiB;GACjB,WAAW,KAAK,IAAI;GACpB,KAAK;EACP;EACA,SAAS;GACP,IAAI,aAAa,CAAC,QAAU;GAC5B,SAAS;GACT,WAAW,KAAK,IAAI;GACpB,KAAK;GACL,SAAS;EACX;EACA,UAAU,UAAU;GAClB,IAAI,WAAa,aAAa,CAAC;GAC/B,UAAU,IAAI,QAAQ;GACtB,aAAa,UAAU,OAAO,QAAQ;EACxC;CACF;AACF;AAEA,SAAgB,iBAAiB,UAA6B,CAAC,GAAyB;CACtF,IAAI,OAAO,0BAA0B,cAAc,OAAO,yBAAyB,YACjF,OAAO,sBAAsB,OAAO;CAGtC,MAAM,aAAa,2BAA2B,OAAO;CACrD,OAAO;EACL,SAAS,WAAW;EACpB,SAAS,WAAW;EACpB,SAAS,WAAW;EACpB,QAAQ,WAAW;EACnB,OAAO,WAAW;EAClB,aAAa,WAAW;EACxB,OAAO,WAAW;EAClB,OAAO,WAAW;EAClB,QAAQ,WAAW;EACnB,WAAW,WAAW;CACxB;AACF;;;AChRA,SAAS,uBAAuB,UAA2C;CACzE,IAAI;EACF,MAAM,UAAU,SAAS,SAAS;EAClC,IAAI,SAAS,QAAa,YAAY,KAAA,CAAS;CACjD,QAAQ,CAER;AACF;AAEA,SAAS,kBAAuC;CAC9C,OAAO;EACL,MAAM,CAAC;EACP,YAAY;EACZ,WAAW,CAAC;EACZ,QAAQ;EACR,OAAO,CAAC;CACV;AACF;AAEA,SAAgB,4BACd,UAAwC,CAAC,GAClB;CACvB,MAAM,OAAO,iBAAiB,QAAQ,IAAI;CAC1C,MAAM,4BAAY,IAAI,IAAgB;CACtC,IAAI,WAAW,gBAAgB;CAC/B,IAAI,YAAY;CAChB,IAAI,YAAY;CAChB,IAAI,gBAAgB;CACpB,IAAI,aAAa;CACjB,IAAI;CAEJ,SAAS,OAAO;EACd,UAAU,SAAS,aAAa,SAAS,CAAC;CAC5C;CAEA,SAAS,YAAY,QAAsC;EACzD,WAAW;GAAE,GAAG;GAAU,GAAG;EAAO;EACpC,KAAK;CACP;CAEA,SAAS,gBAAgB,IAAY,QAAqC;EACxE,YAAY,EACV,WAAW,SAAS,UAAU,KAAK,SAAU,KAAK,OAAO,KAAK;GAAE,GAAG;GAAM,GAAG;EAAO,IAAI,IAAK,EAC9F,CAAC;CACH;CAEA,SAAS,WAAW,IAAY,QAAgC;EAC9D,YAAY,EACV,OAAO,SAAS,MAAM,KAAK,SAAU,KAAK,OAAO,KAAK;GAAE,GAAG;GAAM,GAAG;EAAO,IAAI,IAAK,EACtF,CAAC;CACH;CAEA,SAAS,cAAc;EACrB,MAAM,eAAe,KAAK,YAAY;EACtC,IAAI,CAAC,iBAAiB,CAAC,aAAa,OAAO;EAC3C,YAAY,EAAE,QAAQ,SAAS,QAAQ,WAAW,YAAY,cAAc,YAAY,CAAC;CAC3F;CAEA,MAAM,kBAAkB,KAAK,gBAAgB;EAC3C,IAAI,aAAa,CAAC,SAAS,SAAS;EACpC,MAAM,eAAe,KAAK,YAAY;EACtC,WAAW;GACT,GAAG;GACH,SAAS;IACP,GAAG,SAAS;IACZ,OAAO,aAAa;IACpB,QAAQ,aAAa;IACrB,SAAS,aAAa;GACxB;EACF;EACA,KAAK;EACL,YAAY;CACd,CAAC;CAED,SAAS,KAAK,OAAyB;EACrC,IAAI,aAAa,WAAW;EAC5B,WAAW;GAAE,GAAG;GAAU,YAAY,SAAS,aAAa;EAAE;EAE9D,QAAQ,MAAM,MAAd;GACE,KAAK;IACH,gBAAgB;IAChB,KAAK,MAAM;IACX,YAAY;KACV,OAAO,KAAA;KACP,SAAS;MACP,OAAO;MACP,IAAI,MAAM;MACV,MAAM,MAAM;MACZ,QAAQ;MACR,SAAS;KACX;KACA,QAAQ;IACV,CAAC;IACD;GACF,KAAK;IACH,IAAI,SAAS,SAAS,OAAO,MAAM,WAAW,KAAK,QAAQ,MAAM,KAAK;IACtE;GACF,KAAK;IACH,IAAI,SAAS,SAAS,OAAO,MAAM,WAAW,KAAK,OAAO;IAC1D;GACF,KAAK;IACH,YAAY,EACV,WAAW,CACT,GAAG,SAAS,WACZ;KAAE,SAAS;KAAI,IAAI,MAAM;KAAI,QAAQ;KAAW,OAAO,MAAM;IAAM,CACrE,EACF,CAAC;IACD;GACF,KAAK,mBAAmB;IACtB,MAAM,OAAO,SAAS,UAAU,MAAM,SAAS,KAAK,OAAO,MAAM,EAAE;IACnE,IAAI,MAAM,gBAAgB,MAAM,IAAI,EAAE,SAAS,GAAG,KAAK,UAAU,MAAM,QAAQ,CAAC;IAChF;GACF;GACA,KAAK;IACH,gBAAgB,MAAM,IAAI;KAAE,YAAY,MAAM;KAAY,QAAQ;IAAY,CAAC;IAC/E;GACF,KAAK;IACH,YAAY,EACV,OAAO,CACL,GAAG,SAAS,OACZ;KACE,IAAI,MAAM;KACV,OAAO,MAAM;KACb,MAAM,MAAM;KACZ,QAAQ;KACR,SAAS,MAAM;IACjB,CACF,EACF,CAAC;IACD;GACF,KAAK;IACH,WAAW,MAAM,IAAI,EAAE,SAAS,MAAM,QAAQ,CAAC;IAC/C;GACF,KAAK;IACH,WAAW,MAAM,IAAI;KACnB,QAAQ,MAAM;KACd,QAAQ;KACR,SAAS,MAAM;IACjB,CAAC;IACD;GACF,KAAK;IACH,WAAW,MAAM,IAAI;KAAE,OAAO,MAAM;KAAO,QAAQ;IAAS,CAAC;IAC7D;GACF,KAAK;IAQH,YAAY;KAAE,UAAA;MANZ,SAAS,MAAM,WAAW,CAAC;MAC3B,aAAa,MAAM;MACnB,IAAI,MAAM;MACV,QAAQ;MACR,OAAO,MAAM;KAEM;KAAG,QAAQ;IAAU,CAAC;IAC3C;GAEF,KAAK;IACH,IAAI,SAAS,UAAU,OAAO,MAAM,IAClC,YAAY;KACV,UAAU;MACR,GAAG,SAAS;MACZ,eAAe,MAAM;MACrB,QAAQ;KACV;KACA,QAAQ;IACV,CAAC;IAEH;GACF,KAAK;IACH,YAAY,EAAE,MAAM,CAAC,GAAG,SAAS,MAAM;KAAE,MAAM,MAAM;KAAM,OAAO,MAAM;IAAM,CAAC,EAAE,CAAC;IAClF;GACF,KAAK;IACH,gBAAgB;IAChB,KAAK,OAAO,EAAE,OAAO,KAAK,CAAC;IAC3B,YAAY;KAAE,OAAO;KAAO,QAAQ;IAAS,CAAC;IAC9C;GACF,KAAK;IACH,gBAAgB;IAChB,KAAK,OAAO;IACZ,YAAY,EAAE,OAAO,MAAM,MAAM,CAAC;IAClC,IAAI,CAAC,SAAS,SAAS,YAAY,EAAE,QAAQ,YAAY,CAAC;IAC1D,YAAY;IACZ;EACJ;CACF;CAEA,eAAe,kBAAkB;EAC/B,IAAI,SAAS,WAAW,eAAe,SAAS,WAAW,YAAY,SAAS,WAAW,aACzF,OAAO;EAGT,OAAO,MAAM,IAAI,SAA8B,YAAY;GACzD,MAAM,cAAc,gBAAgB;IAClC,IAAI,SAAS,WAAW,eAAe,SAAS,WAAW,YAAY,SAAS,WAAW,aAAa;IACxG,YAAY;IACZ,QAAQ,QAAQ;GAClB,CAAC;EACH,CAAC;CACH;CAEA,SAAS,UAAU,UAAsB;EACvC,IAAI,WAAW,aAAa,CAAC;EAC7B,UAAU,IAAI,QAAQ;EACtB,aAAa,UAAU,OAAO,QAAQ;CACxC;CAEA,SAAS,QAAQ;EACf,KAAK,MAAM;EACX,WAAW,gBAAgB;EAC3B,YAAY;EACZ,gBAAgB;EAChB,KAAK;CACP;CAEA,SAAS,OAAO,SAAS,aAAa;EACpC,IAAI,aAAa,WAAW;EAC5B,YAAY;EACZ,gBAAgB;EAChB,KAAK,OAAO,EAAE,OAAO,KAAK,CAAC;EAE3B,YAAY;GAAE,OAAA;IADmB,MAAM;IAAa,SAAS;IAAQ,WAAW;IAAM,MAAM;GAC1E;GAAG,QAAQ;EAAY,CAAC;EAC1C,sBAAsB;CACxB;CAEA,OAAO;EACL;EACA,MAAM,QAAQ,QAAQ;GACpB,IAAI,YAAY,MAAM,IAAI,MAAM,8CAA8C;GAC9E,aAAa;GACb,MAAM;GACN,MAAM,WAAW,OAAO,OAAO,cAAc,CAAC;GAC9C,IAAI;GACJ,MAAM,eAAe,IAAI,SAAe,YAAY;IAClD,sBAAsB;GACxB,CAAC;GACD,sBAAsB;GAEtB,IAAI,mBAAmB;GACvB,IAAI;IACF,IAAI;KACF,OAAO,CAAC,aAAa,CAAC,WAAW;MAC/B,MAAM,UAAU,MAAM,QAAQ,KAAK,CACjC,SAAS,KAAK,CAAC,CAAC,MAAM,YAAY;OAAE,MAAM;OAAkB;MAAO,EAAE,GACrE,aAAa,YAAY,EAAE,MAAM,YAAqB,EAAE,CAC1D,CAAC;MACD,IAAI,QAAQ,SAAS,eAAe,QAAQ,OAAO,MAAM;MACzD,MAAM,QAAQ,QAAQ,OAAO;MAC7B,KAAK,KAAK;MACV,IAAI,MAAM,SAAS,UAAU,MAAM,SAAS,SAAS;OACnD,mBAAmB;OACnB;MACF;KACF;KACA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,WAAW,KAAK,EAAE,MAAM,OAAO,CAAC;IACvE,SAAS,OAAO;KACd,KAAK;MACH,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;MAC9D,WAAW;MACX,MAAM;KACR,CAAC;IACH,UAAU;KACR,IAAI,oBAAoB,aAAa,WAAW,uBAAuB,QAAQ;IACjF;IACA,OAAO,MAAM,gBAAgB;GAC/B,UAAU;IACR,aAAa;IACb,sBAAsB,KAAA;GACxB;EACF;EACA,UAAU;GACR,IAAI,WAAW;GACf,OAAO,mCAAmC;GAC1C,YAAY;GACZ,gBAAgB;GAChB,KAAK,QAAQ;GACb,UAAU,MAAM;EAClB;EACA,cAAc;GACZ,OAAO;EACT;EACA;EACA;EACA;CACF;AACF;;;ACxSA,SAAgB,0BAA6C;CAC3D,MAAM,QAA4B,CAAC;CACnC,IAAI,QAAQ;CACZ,IAAI;CACJ,IAAI;CAEJ,SAAS,gBAAgB;EACvB,QAAQ;EACR,MAAM,SAAS;EACf,OAAO;CACT;CAEA,gBAAgB,UAA4C;EAC1D,IAAI;GACF,OAAO,CAAC,SAAS,MAAM,SAAS,GAAG;IACjC,IAAI,SAAS,MAAM;IACnB,MAAM,QAAQ,MAAM,MAAM;IAC1B,IAAI,OAAO;KACT,MAAM;KACN;IACF;IAEA,MAAM,IAAI,SAAe,YAAY;KACnC,OAAO;IACT,CAAC;IACD,OAAO,KAAA;GACT;GACA,IAAI,SAAS,MAAM;EACrB,UAAU;GACR,cAAc;EAChB;CACF;CAEA,SAAS,iBAAkD;EACzD,MAAM,WAAW,QAAQ;EACzB,OAAO;GACL,OAAO;IACL,OAAO,SAAS,KAAK;GACvB;GACA,SAAS;IACP,cAAc;IACd,OAAO,SAAS,OAAO,KAAA,CAAS;GAClC;EACF;CACF;CAEA,SAAS,SAAS;EAChB,OAAO;CACT;CAEA,OAAO;EACL,MAAM;GACJ,QAAQ;GACR,OAAO;EACT;EACA,KAAK,OAAO;GACV,UAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;GAClE,QAAQ;GACR,OAAO;EACT;EACA,KAAK,OAAO;GACV,IAAI,OAAO;GACX,MAAM,KAAK,KAAK;GAChB,OAAO;EACT;EACA,QAAQ,GACL,OAAO,gBAAgB,eAC1B;CACF;AACF;;;ACvEA,SAAgB,gBAAgB,OAAkD;CAChF,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;ACEA,SAAS,eAAe,OAAgC,KAAqB;CAC3E,MAAM,QAAQ,MAAM;CACpB,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAChD,MAAM,IAAI,UAAU,6BAA6B,IAAI,6BAA6B;CAEpF,OAAO;AACT;AAEA,SAAS,eAAe,OAAgC,KAAiC;CACvF,MAAM,QAAQ,MAAM;CACpB,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;CAChC,IAAI,OAAO,UAAU,UAAU,MAAM,IAAI,UAAU,6BAA6B,IAAI,mBAAmB;CACvG,OAAO;AACT;AAEA,SAAS,gBAAgB,OAAgC,KAAkC;CACzF,MAAM,QAAQ,MAAM;CACpB,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;CAChC,IAAI,OAAO,UAAU,WAAW,MAAM,IAAI,UAAU,6BAA6B,IAAI,oBAAoB;CACzG,OAAO;AACT;AAEA,SAAS,eAAe,OAAgC,KAAiC;CACvF,MAAM,QAAQ,MAAM;CACpB,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;CAChC,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GACrD,MAAM,IAAI,UAAU,6BAA6B,IAAI,0BAA0B;CAEjF,OAAO;AACT;AAEA,SAAS,aAAa,OAAuD;CAC3E,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;CAChC,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,MAAM,IAAI,UAAU,yCAAyC;CAExF,OAAO,MAAM,KAAK,WAAW;EAC3B,IAAI,CAAC,gBAAgB,MAAM,GAAG,MAAM,IAAI,UAAU,yCAAyC;EAC3F,OAAO;GACL,aAAa,eAAe,QAAQ,aAAa;GACjD,UAAU,gBAAgB,QAAQ,UAAU;GAC5C,OAAO,eAAe,QAAQ,OAAO;GACrC,OAAO,eAAe,QAAQ,OAAO;EACvC;CACF,CAAC;AACH;AAEA,SAAgB,sBAAsB,OAAkC;CACtE,IAAI,CAAC,gBAAgB,KAAK,KAAK,OAAO,MAAM,SAAS,UACnD,MAAM,IAAI,UAAU,yDAAyD;CAG/E,QAAQ,MAAM,MAAd;EACE,KAAK,iBAAiB;GACpB,MAAM,OAAO,eAAe,OAAO,MAAM;GACzC,IAAI,SAAS,eAAe,SAAS,YAAY,SAAS,QACxD,MAAM,IAAI,UAAU,mCAAmC,MAAM;GAE/D,OAAO;IAAE,WAAW,eAAe,OAAO,WAAW;IAAG;IAAM,MAAM,MAAM;GAAK;EACjF;EACA,KAAK,cACH,OAAO;GACL,OAAO,eAAe,OAAO,OAAO;GACpC,WAAW,eAAe,OAAO,WAAW;GAC5C,MAAM,MAAM;EACd;EACF,KAAK,eACH,OAAO;GAAE,WAAW,eAAe,OAAO,WAAW;GAAG,MAAM,MAAM;EAAK;EAC3E,KAAK,mBACH,OAAO;GACL,IAAI,eAAe,OAAO,IAAI;GAC9B,OAAO,eAAe,OAAO,OAAO;GACpC,MAAM,MAAM;EACd;EACF,KAAK,mBACH,OAAO;GACL,OAAO,eAAe,OAAO,OAAO;GACpC,IAAI,eAAe,OAAO,IAAI;GAC9B,MAAM,MAAM;EACd;EACF,KAAK,iBACH,OAAO;GACL,YAAY,eAAe,OAAO,YAAY;GAC9C,IAAI,eAAe,OAAO,IAAI;GAC9B,MAAM,MAAM;EACd;EACF,KAAK,cACH,OAAO;GACL,IAAI,eAAe,OAAO,IAAI;GAC9B,OAAO,MAAM;GACb,MAAM,eAAe,OAAO,MAAM;GAClC,SAAS,eAAe,OAAO,SAAS;GACxC,MAAM,MAAM;EACd;EACF,KAAK,eACH,OAAO;GACL,IAAI,eAAe,OAAO,IAAI;GAC9B,SAAS,eAAe,OAAO,SAAS;GACxC,MAAM,MAAM;EACd;EACF,KAAK,eACH,OAAO;GACL,IAAI,eAAe,OAAO,IAAI;GAC9B,QAAQ,MAAM;GACd,SAAS,eAAe,OAAO,SAAS;GACxC,MAAM,MAAM;EACd;EACF,KAAK,cACH,OAAO;GACL,OAAO,eAAe,OAAO,OAAO;GACpC,IAAI,eAAe,OAAO,IAAI;GAC9B,MAAM,MAAM;EACd;EACF,KAAK,qBACH,OAAO;GACL,SAAS,aAAa,MAAM,OAAO;GACnC,aAAa,eAAe,OAAO,aAAa;GAChD,IAAI,eAAe,OAAO,IAAI;GAC9B,OAAO,eAAe,OAAO,OAAO;GACpC,MAAM,MAAM;EACd;EACF,KAAK,qBACH,OAAO;GACL,IAAI,eAAe,OAAO,IAAI;GAC9B,MAAM,MAAM;GACZ,OAAO,eAAe,OAAO,OAAO;EACtC;EACF,KAAK;GACH,IAAI,EAAE,WAAW,QAAQ,MAAM,IAAI,UAAU,6CAA6C;GAC1F,OAAO;IAAE,MAAM,eAAe,OAAO,MAAM;IAAG,MAAM,MAAM;IAAM,OAAO,MAAM;GAAM;EACrF,KAAK,SACH,OAAO;GACL,MAAM,eAAe,OAAO,MAAM;GAClC,SAAS,eAAe,OAAO,SAAS;GACxC,WAAW,gBAAgB,OAAO,WAAW;GAC7C,MAAM,MAAM;EACd;EACF,KAAK,QAAQ;GACX,MAAM,QAAQ,MAAM;GACpB,IAAI,UAAU,KAAA,KAAa,CAAC,gBAAgB,KAAK,GAC/C,MAAM,IAAI,UAAU,oCAAoC;GAE1D,OAAO;IACL,MAAM,MAAM;IACZ,OAAO,QACH;KACE,aAAa,eAAe,OAAO,aAAa;KAChD,cAAc,eAAe,OAAO,cAAc;IACpD,IACA,KAAA;GACN;EACF;EACA,SACE,MAAM,IAAI,UAAU,wCAAwC,MAAM,MAAM;CAC5E;AACF;;;ACzIA,IAAI,WAAW;AAEf,SAAgB,8BACd,UAA0C,CAAC,GAClB;CACzB,YAAY;CACZ,MAAM,eAAe,QAAQ,kBAAkB,QAAgB,CAAC,gBAAgB,GAAG;CACnF,MAAM,WAAW,YAAY,cAAc,YAAY;EACrD,gBAAgB,QAAQ;EACxB,YAAY,QAAQ,cAAc;EAClC,mBAAmB;GACjB,QAAQ;GACR,MAAM;GACN,SAAS;GACT,GAAG,QAAQ;GACX;EACF;CACF,CAAC;CAED,OAAO;EACL,MAAM,SAAS,eAAe,CAAC,GAAG;GAChC,OAAO,yBAAyB,SAAS,UAAU;IACjD,gBAAgB,QAAQ;IACxB,OAAO,aAAa,SAAS;IAC7B,kBAAkB,QAAQ,oBAAoB;IAC9C,0BAA0B;IAC1B,aAAa;IACb;GACF,CAAC;EACH;EACA,QAAQ;GACN,SAAS,QAAQ,QAAQ;EAC3B;CACF;AACF;;;ACQA,SAAS,iBAAiB,UAAgF;CACxG,MAAM,SAA8B,CAAC;CACrC,KAAK,MAAM,SAAS,YAAY,CAAC,GAAG;EAGlC,MAAM,aAAa,aAAa,KAAK;EACrC,IAAI,CAAC,YAAc;EACnB,OAAO,KAAK,UAAU;CACxB;CACA,OAAO;AACT;AAEA,SAAS,aAAa,MAA4D;CAChF,IAAI,KAAK,SAAS,QAAU,OAAO;EAAE,MAAM,KAAK,QAAQ;EAAI,MAAM;CAAO;CACzE,IAAI,KAAK,SAAS,aAAe,OAAO,EAAE,MAAM,KAAK;CACrD,IAAI,KAAK,SAAS,YAAc,OAAO;EAAE,MAAM,KAAK,UAAU,OAAO;EAAM,MAAM;CAAO;CASxF,MAAM,OAAO;EANX,UAAU;EACV,eAAe;EACf,QAAQ;EACR,WAAW;EACX,aAAa;CAEE,EAAE,KAAK;CACxB,IAAI,MAAM;EACR,MAAM,WAAW,iBAAiB,KAAK,QAAQ;EAC/C,OAAO,WAAW;GAAE;GAAU;EAAK,IAAI,KAAA;CACzC;CAEA,IAAI,KAAK,SAAS,eAAe,KAAK,SAAS,UAAU;EACvD,MAAM,WAAW,iBAAiB,KAAK,QAAQ;EAC/C,IAAI,CAAC,UAAY;EACjB,OAAO;GACL,OAAO,EACL,OAAO,KAAK,SAAS,cACjB,sDACA,6BACN;GACA;GACA,MAAM;EACR;CACF;CAEA,IAAI,KAAK,SAAS,eAChB,OAAO;EACL,OAAO,EACL,OAAO,4FACT;EACA,UAAU,CAAC;GAAE,MAAM,KAAK,QAAQ;GAAI,MAAM;EAAO,CAAC;EAClD,MAAM;CACR;CAEF,IAAI,KAAK,SAAS,eAChB,OAAO;EACL,OAAO,EAAE,OAAO,yBAAyB;EACzC,UAAU,CAAC;GAAE,MAAM,KAAK,QAAQ;GAAI,MAAM;EAAO,CAAC;EAClD,MAAM;CACR;AAGJ;AAEA,SAAgB,qBAAqB,OAAiE;CACpG,OAAO,iBAAiB,KAAK;AAC/B;AAEA,SAAS,YAAY,OAAgB,WAAW,IAAI;CAClD,OAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,aAAa,OAAgB;CACpC,OAAO,OAAO,UAAU,YAAY,QAAQ,KAAA;AAC9C;AAEA,SAAS,YAAY,OAAgB;CACnC,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ,KAAA;AACvE;AAEA,SAAS,WAAW,OAAyD;CAC3E,OAAO,UAAU,YAAY,UAAU,UAAU,UAAU,UAAU,QAAQ,KAAA;AAC/E;AAEA,SAAS,UAAU,MAAkB,KAAsB;CACzD,OAAO,OAAO,OAAO,QAAQ,IAAI,MAAM,GAAG,IAAI,KAAA;AAChD;AAEA,SAAS,qBAAqB,OAAmD;CAC/E,IAAI,CAAC,gBAAgB,KAAK,KAAK,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,QAAQ,UAAY;CAKlG,OAAO,sBAAsBA,KAAI;AACnC;AAEA,SAAS,kBAAkB,OAAyC;CAClE,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAK,OAAO,CAAC;CACrC,MAAM,SAAkC,CAAC;CACzC,MAAM,SAAS,SAAS;EACtB,MAAM,aAAa,qBAAqB,IAAI;EAC5C,IAAI,YAAc,OAAO,KAAK,UAAU;CAC1C,CAAC;CACD,OAAO;AACT;AAEA,SAAS,SAAS,MAAqC;CACrD,OAAO;EAAE,MAAM;EAAQ;CAAK;AAC9B;AAEA,SAAgB,sBAAsB,MAAyC;CAC7E,MAAM,WAAW,YAAY,KAAK,GAAG;CAErC,QAAQ,KAAK,MAAb;EACE,KAAK,QACH,OAAO,SAAS,YAAY,KAAK,SAAS,QAAQ,CAAC;EACrD,KAAK,WACH,OAAO;GACL,UAAU,kBAAkB,KAAK,QAAQ;GACzC,MAAM;GACN,OAAO,YAAY,UAAU,MAAM,OAAO,CAAC,KAAK;GAChD,MAAM,YAAY,UAAU,MAAM,MAAM,CAAC;EAC3C;EACF,KAAK;EACL,KAAK,UACH,OAAO;GAAE,UAAU,kBAAkB,KAAK,QAAQ;GAAG,MAAM;EAAY;EACzE,KAAK,QACH,OAAO;GACL,UAAU,kBAAkB,UAAU,MAAM,OAAO,CAAC;GACpD,MAAM;GACN,SAAS,aAAa,UAAU,MAAM,SAAS,CAAC,KAAK;GACrD,OAAO,YAAY,UAAU,MAAM,OAAO,CAAC;EAC7C;EACF,KAAK,aACH,OAAO;GAAE,UAAU,kBAAkB,KAAK,QAAQ;GAAG,MAAM;EAAY;EACzE,KAAK,cACH,OAAO;GACL,MAAM;GACN,UAAU,YAAY,UAAU,MAAM,UAAU,CAAC;GACjD,SAAS,aAAa,KAAK,OAAO;GAClC,MAAM,YAAY,KAAK,MAAM,QAAQ;EACvC;EACF,KAAK,eACH,OAAO;GAAE,MAAM;GAAe,MAAM,YAAY,KAAK,MAAM,QAAQ;EAAE;EACvE,KAAK,QACH,OAAO;GACL,UAAU,kBAAkB,KAAK,QAAQ;GACzC,MAAM,YAAY,UAAU,MAAM,MAAM,CAAC;GACzC,MAAM;GACN,MAAM,YAAY,UAAU,MAAM,MAAM,CAAC;GACzC,OAAO,YAAY,UAAU,MAAM,OAAO,CAAC;EAC7C;EACF,KAAK,SACH,OAAO;GACL,KAAK,YAAY,UAAU,MAAM,KAAK,CAAC;GACvC,MAAM,YAAY,UAAU,MAAM,KAAK,CAAC;GACxC,MAAM;GACN,OAAO,YAAY,UAAU,MAAM,OAAO,CAAC;EAC7C;EACF,KAAK,kBACH,OAAO,EAAE,MAAM,iBAAiB;EAClC,KAAK,cACH,OAAO;GAAE,UAAU,kBAAkB,KAAK,QAAQ;GAAG,MAAM;EAAa;EAC1E,KAAK,SAAS;GACZ,MAAM,SAAS,UAAU,MAAM,QAAQ;GACvC,MAAM,OAAO,UAAU,MAAM,MAAM;GACnC,OAAO;IACL,UAAU,kBAAkB,MAAM,QAAQ,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;IAC9E,MAAM;GACR;EACF;EACA,KAAK,aACH,OAAO;GAAE,UAAU,kBAAkB,UAAU,MAAM,OAAO,CAAC;GAAG,MAAM;EAAY;EACpF,KAAK,cACH,OAAO;GACL,OAAO,WAAW,UAAU,MAAM,OAAO,CAAC;GAC1C,UAAU,kBAAkB,KAAK,QAAQ;GACzC,QAAQ,aAAa,UAAU,MAAM,QAAQ,CAAC;GAC9C,MAAM;EACR;EACF,KAAK,UACH,OAAO;GAAE,UAAU,kBAAkB,KAAK,QAAQ;GAAG,MAAM;EAAS;EACtE,KAAK,YACH,OAAO;GAAE,UAAU,kBAAkB,KAAK,QAAQ;GAAG,MAAM;EAAW;EACxE,KAAK,iBACH,OAAO;GAAE,UAAU,kBAAkB,KAAK,QAAQ;GAAG,MAAM;EAAgB;EAC7E,KAAK,aACH,OAAO;GAAE,UAAU,kBAAkB,KAAK,QAAQ;GAAG,MAAM;EAAY;EACzE,KAAK,UACH,OAAO;GAAE,UAAU,kBAAkB,KAAK,QAAQ;GAAG,MAAM;EAAS;EACtE,KAAK,aACH,OAAO;GAAE,UAAU,kBAAkB,KAAK,QAAQ;GAAG,MAAM;EAAY;EACzE,KAAK,eACH,OAAO;GAAE,UAAU,kBAAkB,KAAK,QAAQ;GAAG,MAAM;EAAc;EAC3E,KAAK;EACL,KAAK,kBACH,OAAO;GAAE,SAAS,aAAa,UAAU,MAAM,SAAS,CAAC;GAAG,MAAM;EAAW;EAC/E,KAAK,SACH,OAAO,SAAS,YAAY,UAAU,MAAM,QAAQ,GAAG,QAAQ,CAAC;EAClE,KAAK,mBACH,OAAO;GAAE,UAAU,kBAAkB,UAAU,MAAM,OAAO,CAAC;GAAG,MAAM;EAAkB;EAC1F,KAAK,mBACH,OAAO;GACL,UAAU,CACR;IAAE,UAAU,kBAAkB,UAAU,MAAM,MAAM,CAAC;IAAG,QAAQ;IAAM,MAAM;GAAa,GACzF;IAAE,UAAU,kBAAkB,UAAU,MAAM,YAAY,CAAC;IAAG,MAAM;GAAa,CACnF;GACA,MAAM;EACR;EACF,KAAK,YACH,OAAO;GAAE,UAAU,kBAAkB,KAAK,QAAQ;GAAG,MAAM;GAAY,OAAO,YAAY,UAAU,MAAM,IAAI,CAAC;EAAE;EACnH,KAAK;EACL,KAAK,aACH,OAAO;GAAE,MAAM;GAAY,MAAM,YAAY,UAAU,MAAM,IAAI,CAAC;EAAE;EACtE,KAAK,cACH,OAAO;GACL,UAAU,kBAAkB,KAAK,QAAQ;GACzC,MAAM;GACN,MAAM,YAAY,UAAU,MAAM,MAAM,CAAC;GACzC,OAAO,YAAY,UAAU,MAAM,OAAO,CAAC;EAC7C;EACF,KAAK,iBACH,OAAO;GACL,UAAU,kBAAkB,KAAK,QAAQ;GACzC,MAAM;GACN,SAAS,aAAa,KAAK,OAAO;GAClC,OAAO,YAAY,UAAU,MAAM,MAAM,CAAC;EAC5C;EACF,KAAK,aACH,OAAO,EAAE,MAAM,YAAY;EAC7B,KAAK,eACH,OAAO;GAAE,MAAM;GAAe,MAAM,YAAY,KAAK,SAAS,QAAQ;EAAE;EAC1E,KAAK,cACH,OAAO;GAAE,MAAM;GAAc,MAAM,YAAY,KAAK,SAAS,QAAQ;EAAE;EACzE,KAAK;EACL,KAAK,eACH,OAAO,SAAS,YAAY,KAAK,SAAS,QAAQ,CAAC;EACrD,SACE,OAAO,SAAS,QAAQ;CAC5B;AACF;AAEA,SAAgB,uBAAuB,OAA8C;CACnF,OAAO,MAAM,IAAI,qBAAqB;AACxC;;;ACpSA,SAAS,4BAA8C;CACrD,IAAI,wBAAQ,IAAI,WAAW,CAAC;CAE5B,OAAO,EACL,OAAO,OAAO,QAAQ,OAAO;EAC3B,MAAM,QAAQ,IAAI,WAAW,MAAM,SAAS,MAAM,MAAM;EACxD,MAAM,IAAI,KAAK;EACf,MAAM,IAAI,OAAO,MAAM,MAAM;EAC7B,IAAI,SAAS;EACb,IAAI,SAAS;EAEb,OAAO,SAAS,MAAM,QAAQ;GAC5B,MAAM,QAAQ,MAAM;GACpB,IAAI,QAAQ,KAAM;IAChB,UAAU,OAAO,cAAc,KAAK;IACpC,UAAU;IACV;GACF;GAEA,MAAM,OAAO,SAAS,MAAO,IAAI,SAAS,MAAO,IAAI,SAAS,MAAO,IAAI;GACzE,IAAI,SAAS,GAAG;IACd,UAAU;IACV,UAAU;IACV;GACF;GACA,IAAI,SAAS,OAAO,MAAM,QAAQ;GAElC,IAAI,YAAY,SAAS,SAAS,IAAI,KAAO,SAAS,IAAI,KAAO;GACjE,IAAI,QAAQ;GACZ,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,SAAS,GAAG;IAC5C,MAAM,eAAe,MAAM,SAAS;IACpC,KAAK,eAAe,SAAU,KAAM;KAClC,QAAQ;KACR;IACF;IACA,YAAa,aAAa,IAAM,eAAe;GACjD;GAEA,IAAI,CAAC,SAAS,YAAY,SAAU;IAClC,UAAU;IACV,UAAU;IACV;GACF;GAEA,UAAU,OAAO,cAAc,SAAS;GACxC,UAAU;EACZ;EAEA,QAAQ,MAAM,MAAM,MAAM;EAC1B,IAAI,SAAS,MAAM,SAAS,GAAG;GAC7B,UAAU;GACV,wBAAQ,IAAI,WAAW,CAAC;EAC1B;EACA,OAAO;CACT,EACF;AACF;AAEA,SAAS,oBAAsC;CAC7C,IAAI,OAAO,gBAAgB,YAAY;EACrC,MAAM,UAAU,IAAI,YAAY;EAChC,OAAO,EACL,OAAO,OAAO,QAAQ,OAAO;GAC3B,OAAO,QAAQ,OAAO,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC;EACjD,EACF;CACF;CACA,OAAO,0BAA0B;AACnC;AAEA,SAAS,QAAQ,OAAiC;CAChD,OAAO,iBAAiB,aAAa,QAAQ,IAAI,WAAW,KAAK;AACnE;AAEA,SAAgB,4BAAiD;CAC/D,MAAM,UAAU,wBAAwB;CACxC,MAAM,UAAU,kBAAkB;CAClC,MAAM,YAAsB,CAAC;CAC7B,IAAI,aAAa;CACjB,IAAI,QAAQ;CAEZ,SAAS,qBAAqB;EAC5B,UAAU,SAAS;EACnB,aAAa;CACf;CAEA,SAAS,cAAc;EACrB,IAAI,OAAO;EACX,QAAQ;EACR,mBAAmB;EACnB,QAAQ,IAAI;CACd;CAEA,SAAS,WAAW,OAAgB;EAClC,IAAI,OAAO;EACX,QAAQ;EACR,mBAAmB;EACnB,QAAQ,KAAK,KAAK;CACpB;CAEA,SAAS,WAAW,OAAyB;EAC3C,QAAQ,KAAK,KAAK;EAClB,YAAY;CACd;CAEA,SAAS,WAAW;EAClB,IAAI,UAAU,WAAW,KAAK,OAAO;EACrC,MAAM,UAAU,UAAU,KAAK,IAAI;EACnC,UAAU,SAAS;EACnB,IAAI,YAAY,UAAU;GACxB,WAAW,EAAE,MAAM,OAAO,CAAC;GAC3B;EACF;EAEA,IAAI;GACF,MAAM,QAAQ,sBAAsB,KAAK,MAAM,OAAO,CAAC;GACvD,IAAI,MAAM,SAAS,UAAU,MAAM,SAAS,SAAS,WAAW,KAAK;QAChE,QAAQ,KAAK,KAAK;EACzB,SAAS,OAAO;GACd,WAAW,KAAK;EAClB;CACF;CAEA,SAAS,YAAY,MAAc;EACjC,MAAM,aAAa,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI;EAC7D,IAAI,WAAW,WAAW,GAAG;GAC3B,SAAS;GACT;EACF;EACA,IAAI,WAAW,WAAW,GAAG,GAAG;EAChC,IAAI,eAAe,QAAQ;GACzB,UAAU,KAAK,EAAE;GACjB;EACF;EACA,IAAI,WAAW,WAAW,OAAO,GAAG;GAClC,MAAM,QAAQ,WAAW,MAAM,CAAC;GAChC,UAAU,KAAK,MAAM,WAAW,GAAG,IAAI,MAAM,MAAM,CAAC,IAAI,KAAK;EAC/D;CACF;CAEA,SAAS,WAAW,OAAe;EACjC,IAAI,OAAO;EACX,cAAc;EACd,IAAI,UAAU,WAAW,QAAQ,IAAI;EACrC,OAAO,WAAW,GAAG;GACnB,YAAY,WAAW,MAAM,GAAG,OAAO,CAAC;GACxC,IAAI,OAAO;GACX,aAAa,WAAW,MAAM,UAAU,CAAC;GACzC,UAAU,WAAW,QAAQ,IAAI;EACnC;CACF;CAEA,OAAO;EACL,MAAM;GACJ,IAAI,OAAO;GACX,WAAW,QAAQ,uBAAO,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC;GAClD,IAAI,OAAO;GACX,IAAI,WAAW,SAAS,GAAG,YAAY,UAAU;GACjD,SAAS;GACT,YAAY;EACd;EACA,KAAK,OAAO;GACV,WAAW,KAAK;EAClB;EACA,KAAK,OAAO;GACV,IAAI,OAAO;GACX,WAAW,OAAO,UAAU,WAAW,QAAQ,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC;EAC/E;EACA,QAAQ,QAAQ;CAClB;AACF;;;ACnLA,MAAM,kBAAkB;AAExB,SAAS,gBAAgB,IAAY;CACnC,IAAI,GAAG,WAAW,GAAG,MAAM,IAAI,MAAM,2CAA2C;AAClF;AAEA,SAAS,cAAc,SAAiD;CACtE,OAAO,OAAO,OAAO,EAAE,GAAG,QAAQ,CAAC;AACrC;AAEA,SAAS,eACP,UACA,iBACqB;CACrB,IAAI,oBAAoB,KAAA,GAAW,OAAO,OAAO,OAAO,EAAE,SAAS,CAAC;CACpE,OAAO,OAAO,OAAO;EAAE;EAAiB;CAAS,CAAC;AACpD;AAEA,SAAS,iBAAiB,SAAoD;CAC5E,MAAM,iBAAiB,SAAS,YAAY,CAAC;CAC7C,MAAM,+BAAe,IAAI,IAAgC;CAEzD,KAAK,MAAM,WAAW,gBAAgB;EACpC,gBAAgB,QAAQ,EAAE;EAC1B,IAAI,aAAa,IAAI,QAAQ,EAAE,GAC7B,MAAM,IAAI,MAAM,yBAAyB,QAAQ,GAAG,gBAAgB;EAEtE,aAAa,IAAI,QAAQ,IAAI,OAAO;CACtC;CAEA,KAAK,MAAM,WAAW,gBACpB,IAAI,QAAQ,aAAa,KAAA,KAAa,CAAC,aAAa,IAAI,QAAQ,QAAQ,GACtE,MAAM,IAAI,MAAM,gCAAgC,QAAQ,SAAS,iBAAiB;CAItF,MAAM,8BAAc,IAAI,IAAY;CACpC,KAAK,MAAM,WAAW,gBAAgB;EACpC,IAAI,YAAY,IAAI,QAAQ,EAAE,GAAG;EAEjC,MAAM,OAAiB,CAAC;EACxB,MAAM,0BAAU,IAAI,IAAY;EAChC,IAAI,UAA0C;EAC9C,OAAO,YAAY,KAAA,KAAa,CAAC,YAAY,IAAI,QAAQ,EAAE,GAAG;GAC5D,IAAI,QAAQ,IAAI,QAAQ,EAAE,GACxB,MAAM,IAAI,MAAM,yBAAyB,QAAQ,GAAG,4BAA4B;GAElF,KAAK,KAAK,QAAQ,EAAE;GACpB,QAAQ,IAAI,QAAQ,EAAE;GACtB,UAAU,QAAQ,aAAa,KAAA,IAC3B,KAAA,IACA,aAAa,IAAI,QAAQ,QAAQ;EACvC;EACA,KAAK,SAAQ,OAAM,YAAY,IAAI,EAAE,CAAC;CACxC;CAEA,MAAM,kBAAkB,SAAS;CACjC,IAAI,oBAAoB,KAAA,KAAa,CAAC,aAAa,IAAI,eAAe,GACpE,MAAM,IAAI,MAAM,gCAAgC,gBAAgB,iBAAiB;CAGnF,OAAO,eAAe,OAAO,OAAO,eAAe,IAAI,aAAa,CAAC,GAAG,eAAe;AACzF;AAEA,SAAgB,4BACd,SACuB;CACvB,MAAM,4BAAY,IAAI,IAAgB;CACtC,IAAI,WAAW,iBAAiB,OAAO;CACvC,IAAI,YAAY;CAEhB,SAAS,eAAe;EACtB,IAAI,WAAW,MAAM,IAAI,MAAM,eAAe;CAChD;CAEA,SAAS,YAAY,IAAY;EAC/B,OAAO,SAAS,SAAS,MAAK,YAAW,QAAQ,OAAO,EAAE;CAC5D;CAEA,SAAS,QAAQ,cAAmC;EAClD,WAAW;EACX,UAAU,SAAQ,aAAY,SAAS,CAAC;CAC1C;CAEA,SAAS,OAAO,SAA6B;EAC3C,aAAa;EACb,gBAAgB,QAAQ,EAAE;EAC1B,IAAI,YAAY,QAAQ,EAAE,GACxB,MAAM,IAAI,MAAM,yBAAyB,QAAQ,GAAG,iBAAiB;EAEvE,IAAI,QAAQ,aAAa,KAAA,KAAa,CAAC,YAAY,QAAQ,QAAQ,GACjE,MAAM,IAAI,MAAM,gCAAgC,QAAQ,SAAS,iBAAiB;EAIpF,QAAQ,eADS,OAAO,OAAO,CAAC,GAAG,SAAS,UAAU,cAAc,OAAO,CAAC,CAC9C,GAAG,QAAQ,EAAE,CAAC;CAC9C;CAEA,SAAS,KACP,UACA,SACA;EACA,aAAa;EACb,gBAAgB,QAAQ,EAAE;EAC1B,IAAI,YAAY,QAAQ,EAAE,GACxB,MAAM,IAAI,MAAM,yBAAyB,QAAQ,GAAG,iBAAiB;EAEvE,IAAI,CAAC,YAAY,QAAQ,GACvB,MAAM,IAAI,MAAM,gCAAgC,SAAS,iBAAiB;EAG5E,MAAM,gBAAgB,cAAc;GAAE,GAAG;GAAS;EAAS,CAAC;EAE5D,QAAQ,eADS,OAAO,OAAO,CAAC,GAAG,SAAS,UAAU,aAAa,CACrC,GAAG,cAAc,EAAE,CAAC;CACpD;CAEA,SAAS,OAAO,IAAY;EAC1B,aAAa;EACb,IAAI,CAAC,YAAY,EAAE,GACjB,MAAM,IAAI,MAAM,yBAAyB,GAAG,iBAAiB;EAE/D,QAAQ,eAAe,SAAS,UAAU,EAAE,CAAC;CAC/C;CAEA,SAAS,MAAM,aAAmC;EAChD,aAAa;EAEb,QADqB,iBAAiB,WACnB,CAAC;CACtB;CAEA,SAAS,UAAU,UAAsB;EACvC,aAAa;EACb,UAAU,IAAI,QAAQ;EACtB,aAAa;GACX,UAAU,OAAO,QAAQ;EAC3B;CACF;CAEA,OAAO;EACL;EACA,UAAU;GACR,IAAI,WAAW;GACf,YAAY;GACZ,UAAU,MAAM;EAClB;EACA;EACA,cAAc;GACZ,OAAO;EACT;EACA;EACA;EACA;CACF;AACF"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@varo-ui/ai",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "2.0.0",
|
|
5
5
|
"description": "Shared event protocol, streaming controller, and safe Markdown primitives for Varo Agent UI.",
|
|
6
6
|
"author": "daguanren21 <1363917353@qq.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
"src"
|
|
38
38
|
],
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"markstream-core": "^2.0.
|
|
41
|
-
"stream-markdown-parser": "^1.2.
|
|
40
|
+
"markstream-core": "^2.0.7",
|
|
41
|
+
"stream-markdown-parser": "^1.2.13"
|
|
42
42
|
},
|
|
43
43
|
"scripts": {
|
|
44
44
|
"build": "tsdown",
|
package/src/agent-stream.ts
CHANGED
|
@@ -14,6 +14,15 @@ export interface AgentStreamControllerOptions {
|
|
|
14
14
|
text?: TextStreamOptions
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
function requestIteratorCleanup(iterator: AsyncIterator<AgentStreamEvent>) {
|
|
18
|
+
try {
|
|
19
|
+
const cleanup = iterator.return?.()
|
|
20
|
+
if (cleanup) void cleanup.catch(() => undefined)
|
|
21
|
+
} catch {
|
|
22
|
+
// Cleanup failures must not replace an already terminal connection result.
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
17
26
|
function initialSnapshot(): AgentStreamSnapshot {
|
|
18
27
|
return {
|
|
19
28
|
data: [],
|
|
@@ -240,6 +249,7 @@ export function createAgentStreamController(
|
|
|
240
249
|
})
|
|
241
250
|
cancelActiveConnect = resolveCancellation
|
|
242
251
|
|
|
252
|
+
let protocolTerminal = false
|
|
243
253
|
try {
|
|
244
254
|
try {
|
|
245
255
|
while (!cancelled && !destroyed) {
|
|
@@ -248,7 +258,12 @@ export function createAgentStreamController(
|
|
|
248
258
|
cancellation.then(() => ({ kind: 'cancelled' as const }))
|
|
249
259
|
])
|
|
250
260
|
if (outcome.kind === 'cancelled' || outcome.result.done) break
|
|
251
|
-
|
|
261
|
+
const event = outcome.result.value
|
|
262
|
+
push(event)
|
|
263
|
+
if (event.type === 'done' || event.type === 'error') {
|
|
264
|
+
protocolTerminal = true
|
|
265
|
+
break
|
|
266
|
+
}
|
|
252
267
|
}
|
|
253
268
|
if (!transportDone && !cancelled && !destroyed) push({ type: 'done' })
|
|
254
269
|
} catch (error) {
|
|
@@ -258,7 +273,7 @@ export function createAgentStreamController(
|
|
|
258
273
|
type: 'error'
|
|
259
274
|
})
|
|
260
275
|
} finally {
|
|
261
|
-
if (cancelled || destroyed)
|
|
276
|
+
if (protocolTerminal || cancelled || destroyed) requestIteratorCleanup(iterator)
|
|
262
277
|
}
|
|
263
278
|
return await waitForTerminal()
|
|
264
279
|
} finally {
|
package/src/event-channel.ts
CHANGED
|
@@ -6,21 +6,44 @@ export function createAgentEventChannel(): AgentEventChannel {
|
|
|
6
6
|
let failure: Error | undefined
|
|
7
7
|
let wake: (() => void) | undefined
|
|
8
8
|
|
|
9
|
+
function stopConsuming() {
|
|
10
|
+
ended = true
|
|
11
|
+
queue.length = 0
|
|
12
|
+
notify()
|
|
13
|
+
}
|
|
14
|
+
|
|
9
15
|
async function* iterate(): AsyncGenerator<AgentStreamEvent> {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
try {
|
|
17
|
+
while (!ended || queue.length > 0) {
|
|
18
|
+
if (failure) throw failure
|
|
19
|
+
const event = queue.shift()
|
|
20
|
+
if (event) {
|
|
21
|
+
yield event
|
|
22
|
+
continue
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
await new Promise<void>((resolve) => {
|
|
26
|
+
wake = resolve
|
|
27
|
+
})
|
|
28
|
+
wake = undefined
|
|
16
29
|
}
|
|
30
|
+
if (failure) throw failure
|
|
31
|
+
} finally {
|
|
32
|
+
stopConsuming()
|
|
33
|
+
}
|
|
34
|
+
}
|
|
17
35
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
36
|
+
function createIterator(): AsyncIterator<AgentStreamEvent> {
|
|
37
|
+
const iterator = iterate()
|
|
38
|
+
return {
|
|
39
|
+
next() {
|
|
40
|
+
return iterator.next()
|
|
41
|
+
},
|
|
42
|
+
return() {
|
|
43
|
+
stopConsuming()
|
|
44
|
+
return iterator.return(undefined)
|
|
45
|
+
}
|
|
22
46
|
}
|
|
23
|
-
if (failure) throw failure
|
|
24
47
|
}
|
|
25
48
|
|
|
26
49
|
function notify() {
|
|
@@ -43,7 +66,7 @@ export function createAgentEventChannel(): AgentEventChannel {
|
|
|
43
66
|
notify()
|
|
44
67
|
},
|
|
45
68
|
source: {
|
|
46
|
-
[Symbol.asyncIterator]:
|
|
69
|
+
[Symbol.asyncIterator]: createIterator
|
|
47
70
|
}
|
|
48
71
|
}
|
|
49
72
|
}
|