@better-agent/client 0.1.0-beta.1 → 0.1.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{controller-Cf_JhTdJ.mjs → controller-BrBUfjhZ.mjs} +3 -2
- package/dist/controller-BrBUfjhZ.mjs.map +1 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/preact/index.mjs +1 -1
- package/dist/react/index.mjs +1 -1
- package/dist/solid/index.mjs +1 -1
- package/dist/svelte/index.mjs +1 -1
- package/dist/vue/index.mjs +1 -1
- package/package.json +3 -3
- package/dist/controller-Cf_JhTdJ.mjs.map +0 -1
|
@@ -311,6 +311,7 @@ const contentToUIParts = (content) => {
|
|
|
311
311
|
}];
|
|
312
312
|
return content.map((part) => contentPartToUIPart(part)).filter((part) => part !== null);
|
|
313
313
|
};
|
|
314
|
+
const isToolResultConversationItem = (item) => item.type === "provider-tool-result" || item.type === "tool-call" && Object.prototype.hasOwnProperty.call(item, "result");
|
|
314
315
|
/** Converts model input messages back into UI messages. */
|
|
315
316
|
const fromModelMessages = (messages, options) => {
|
|
316
317
|
const generateId = options?.generateId ?? makeLocalMessageId;
|
|
@@ -377,7 +378,7 @@ const fromConversationItems = (items, options) => {
|
|
|
377
378
|
activeAssistantMessageIndex = (item.role ?? "user") === "assistant" ? result.length - 1 : void 0;
|
|
378
379
|
continue;
|
|
379
380
|
}
|
|
380
|
-
if ("
|
|
381
|
+
if (item.type === "tool-call" && !isToolResultConversationItem(item)) {
|
|
381
382
|
const part = {
|
|
382
383
|
type: "tool-call",
|
|
383
384
|
callId: item.callId,
|
|
@@ -2120,4 +2121,4 @@ function createAgentChatController(client, options) {
|
|
|
2120
2121
|
|
|
2121
2122
|
//#endregion
|
|
2122
2123
|
export { toModelMessages as a, fromModelMessages as i, createAgentChatController as n, getEventErrorMessage as o, fromConversationItems as r, toAgentClientError as s, AgentChatController as t };
|
|
2123
|
-
//# sourceMappingURL=controller-
|
|
2124
|
+
//# sourceMappingURL=controller-BrBUfjhZ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller-BrBUfjhZ.mjs","names":[],"sources":["../src/core/browser-lifecycle.ts","../src/core/error.ts","../src/core/utils.ts","../src/core/reducer.ts","../src/core/response.ts","../src/core/controller.ts"],"sourcesContent":["declare global {\n interface Window {\n __baPageTeardown?: boolean;\n __baPageTeardownInstalled?: boolean;\n }\n}\n\nconst markPageTeardown = () => {\n if (typeof window !== \"undefined\") {\n window.__baPageTeardown = true;\n }\n};\n\n/** Installs one browser teardown tracker for refresh/navigation. */\nexport const ensureBrowserTeardownTracking = (): void => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n window.__baPageTeardown ??= false;\n if (window.__baPageTeardownInstalled) {\n return;\n }\n\n window.__baPageTeardownInstalled = true;\n window.addEventListener(\"pagehide\", markPageTeardown);\n window.addEventListener(\"beforeunload\", markPageTeardown);\n};\n\n/** Returns true while the current browser page is being torn down. */\nexport const isBrowserPageTearingDown = (): boolean =>\n typeof window !== \"undefined\" && window.__baPageTeardown === true;\n","/** One frame from a serialized Better Agent error trace. */\nexport interface AgentClientErrorTraceFrame {\n /** Trace step name. */\n at: string;\n /** Optional trace metadata. */\n data?: Record<string, unknown>;\n}\n\n/** Client-normalized Better Agent error shape. */\nexport interface AgentClientError extends Error {\n /** Stable error code. */\n code?: string;\n /** HTTP status when available. */\n status?: number;\n /** Whether the request may succeed on retry. */\n retryable?: boolean;\n /** Short human title. */\n title?: string;\n /** Detailed error message. */\n detail?: string;\n /** Validation or structured issues. */\n issues?: unknown[];\n /** Server trace id. */\n traceId?: string;\n /** Extra error context. */\n context?: Record<string, unknown>;\n /** Structured trace frames. */\n trace?: AgentClientErrorTraceFrame[];\n /** Original thrown value. */\n raw?: unknown;\n}\n\n/** Internal error used to mark broken stream transport. */\nexport class StreamDisconnectError extends Error {\n cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"StreamDisconnectError\";\n this.cause = cause;\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst stripSurfacePrefix = (message: string): string =>\n message.replace(/^(run failed|stream failed):\\s*/i, \"\");\n\nconst extractMessage = (error: unknown): string | undefined => {\n if (error instanceof Error && typeof error.message === \"string\" && error.message.trim()) {\n return stripSurfacePrefix(error.message);\n }\n if (!isRecord(error)) return undefined;\n\n const message =\n (typeof error.message === \"string\" && error.message) ||\n (typeof error.detail === \"string\" && error.detail) ||\n (typeof error.title === \"string\" && error.title);\n\n return typeof message === \"string\" && message.trim().length > 0\n ? stripSurfacePrefix(message)\n : undefined;\n};\n\n/** Normalizes unknown failures into `AgentClientError`. */\nexport const toAgentClientError = (\n error: unknown,\n fallbackMessage = \"Run failed.\",\n): AgentClientError => {\n if (error instanceof Error) {\n const enriched = error as AgentClientError;\n enriched.message = stripSurfacePrefix(enriched.message);\n if (typeof enriched.detail === \"string\" && enriched.detail.length > 0) {\n enriched.detail = stripSurfacePrefix(enriched.detail);\n }\n if (enriched.raw === undefined) enriched.raw = error;\n return enriched;\n }\n\n const message = extractMessage(error) ?? fallbackMessage;\n const next = new Error(message) as AgentClientError;\n next.raw = error;\n\n if (!isRecord(error)) return next;\n\n if (typeof error.code === \"string\") next.code = error.code;\n if (typeof error.status === \"number\") next.status = error.status;\n if (typeof error.retryable === \"boolean\") next.retryable = error.retryable;\n if (typeof error.title === \"string\") next.title = error.title;\n if (typeof error.detail === \"string\") next.detail = stripSurfacePrefix(error.detail);\n if (typeof error.traceId === \"string\") next.traceId = error.traceId;\n if (Array.isArray(error.issues)) next.issues = error.issues;\n if (isRecord(error.context)) next.context = error.context;\n if (Array.isArray(error.trace)) next.trace = error.trace as AgentClientErrorTraceFrame[];\n\n return next;\n};\n\n/**\n * Resolves a user-facing message from an event error payload.\n */\nexport const getEventErrorMessage = (error: unknown): string => toAgentClientError(error).message;\n","import type {\n ConversationItem,\n GenerativeModelInputItem,\n GenerativeModelInputMessagePart,\n GenerativeModelProviderToolResult,\n GenerativeModelToolCallResult,\n} from \"@better-agent/core/providers\";\nimport type { UIMessage, UIMessagePart } from \"../types/ui\";\n\nconst withProviderMetadata = (part: { providerMetadata?: unknown }) =>\n part.providerMetadata !== undefined &&\n typeof part.providerMetadata === \"object\" &&\n part.providerMetadata !== null\n ? { providerMetadata: part.providerMetadata as Record<string, unknown> }\n : {};\n\n/** Converts one persisted part into a UI part. */\nexport const contentPartToUIPart = (part: unknown): UIMessagePart | null => {\n if (\n typeof part !== \"object\" ||\n part === null ||\n typeof (part as { type?: unknown }).type !== \"string\"\n ) {\n return null;\n }\n\n const record = part as {\n type: string;\n text?: unknown;\n source?: unknown;\n embedding?: unknown;\n segments?: unknown;\n visibility?: unknown;\n provider?: unknown;\n providerMetadata?: unknown;\n };\n switch (record.type) {\n case \"text\":\n return typeof record.text === \"string\"\n ? {\n type: \"text\",\n text: record.text,\n ...withProviderMetadata(record),\n state: \"complete\",\n }\n : null;\n case \"image\":\n return {\n type: \"image\",\n source: record.source as Extract<UIMessagePart, { type: \"image\" }>[\"source\"],\n ...withProviderMetadata(record),\n state: \"complete\",\n };\n case \"file\":\n return {\n type: \"file\",\n source: record.source as Extract<UIMessagePart, { type: \"file\" }>[\"source\"],\n ...withProviderMetadata(record),\n state: \"complete\",\n };\n case \"audio\":\n return {\n type: \"audio\",\n source: record.source as Extract<UIMessagePart, { type: \"audio\" }>[\"source\"],\n ...withProviderMetadata(record),\n state: \"complete\",\n };\n case \"video\":\n return {\n type: \"video\",\n source: record.source as Extract<UIMessagePart, { type: \"video\" }>[\"source\"],\n ...withProviderMetadata(record),\n state: \"complete\",\n };\n case \"embedding\":\n return Array.isArray(record.embedding) &&\n record.embedding.every((value) => typeof value === \"number\")\n ? {\n type: \"embedding\",\n embedding: record.embedding,\n ...withProviderMetadata(record),\n state: \"complete\",\n }\n : null;\n case \"transcript\":\n return typeof record.text === \"string\"\n ? {\n type: \"transcript\",\n text: record.text,\n ...(Array.isArray(record.segments)\n ? {\n segments: record.segments as Extract<\n UIMessagePart,\n { type: \"transcript\" }\n >[\"segments\"],\n }\n : {}),\n ...withProviderMetadata(record),\n state: \"complete\",\n }\n : null;\n case \"reasoning\":\n return typeof record.text === \"string\" &&\n (record.visibility === \"summary\" || record.visibility === \"full\")\n ? {\n type: \"reasoning\",\n text: record.text,\n visibility: record.visibility,\n ...(typeof record.provider === \"string\" ? { provider: record.provider } : {}),\n ...withProviderMetadata(record),\n state: \"complete\",\n }\n : null;\n default:\n return null;\n }\n};\n\n// UI to model.\n\nconst toModelInputParts = (\n message: UIMessage,\n): Array<\n GenerativeModelInputMessagePart<{\n inputModalities: {\n text: true;\n audio: true;\n image: true;\n file: true;\n video: true;\n };\n additionalSupportedRoles: readonly string[];\n }>\n> => {\n const out: Array<\n GenerativeModelInputMessagePart<{\n inputModalities: {\n text: true;\n audio: true;\n image: true;\n file: true;\n video: true;\n };\n additionalSupportedRoles: readonly string[];\n }>\n > = [];\n for (const part of message.parts) {\n const providerMetadata = \"providerMetadata\" in part ? part.providerMetadata : undefined;\n\n if (part.type === \"text\") {\n out.push({\n type: \"text\",\n text: part.text,\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.type === \"audio\") {\n if (part.source.kind === \"url\") {\n out.push({\n type: \"audio\",\n source: {\n kind: \"url\",\n url: part.source.url,\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n out.push({\n type: \"audio\",\n source: {\n kind: \"base64\",\n data: part.source.data,\n mimeType: part.source.mimeType ?? \"audio/wav\",\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.type === \"image\") {\n if (part.source.kind === \"url\") {\n out.push({\n type: \"image\",\n source: {\n kind: \"url\",\n url: part.source.url,\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n out.push({\n type: \"image\",\n source: {\n kind: \"base64\",\n data: part.source.data,\n mimeType: part.source.mimeType ?? \"image/png\",\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.type === \"file\") {\n if (part.source.kind === \"url\") {\n out.push({\n type: \"file\",\n source: {\n kind: \"url\",\n url: part.source.url,\n ...(part.source.mimeType ? { mimeType: part.source.mimeType } : {}),\n ...(part.source.filename ? { filename: part.source.filename } : {}),\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.source.kind === \"provider-file\") {\n out.push({\n type: \"file\",\n source: {\n kind: \"provider-file\",\n ref: part.source.ref,\n ...(part.source.mimeType ? { mimeType: part.source.mimeType } : {}),\n ...(part.source.filename ? { filename: part.source.filename } : {}),\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n out.push({\n type: \"file\",\n source: {\n kind: \"base64\",\n data: part.source.data,\n mimeType: part.source.mimeType,\n ...(part.source.filename ? { filename: part.source.filename } : {}),\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.type === \"video\") {\n if (part.source.kind === \"url\") {\n out.push({\n type: \"video\",\n source: {\n kind: \"url\",\n url: part.source.url,\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n out.push({\n type: \"video\",\n source: {\n kind: \"base64\",\n data: part.source.data,\n mimeType: part.source.mimeType ?? \"video/mp4\",\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.type === \"embedding\") {\n out.push({\n type: \"embedding\",\n embedding: part.embedding,\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.type === \"transcript\") {\n out.push({\n type: \"transcript\",\n text: part.text,\n ...(part.segments ? { segments: part.segments } : {}),\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.type === \"reasoning\") {\n out.push({\n type: \"reasoning\",\n text: part.text,\n visibility: part.visibility,\n ...(part.provider ? { provider: part.provider } : {}),\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n }\n }\n return out;\n};\n\n/** Converts UI messages into model input messages. */\nexport const toModelMessages = (\n msgs: UIMessage[],\n): Array<\n GenerativeModelInputItem<{\n inputModalities: {\n text: true;\n audio: true;\n image: true;\n file: true;\n video: true;\n };\n additionalSupportedRoles: readonly string[];\n }>\n> =>\n msgs.flatMap((message) => {\n const parts = toModelInputParts(message);\n const items: Array<\n GenerativeModelInputItem<{\n inputModalities: {\n text: true;\n audio: true;\n image: true;\n file: true;\n video: true;\n };\n additionalSupportedRoles: readonly string[];\n }>\n > = [];\n\n if (parts.length > 0) {\n const hasNonText = parts.some((part) => part.type !== \"text\");\n items.push({\n type: \"message\",\n role: message.role as never,\n content:\n hasNonText || parts.length !== 1 || parts[0]?.type !== \"text\"\n ? parts\n : parts[0].text,\n });\n }\n\n const completedCalls = new Map<string, string>();\n for (const part of message.parts) {\n if (part.type !== \"tool-call\") {\n continue;\n }\n\n const toolName = part.name;\n const isCompleted =\n toolName &&\n (part.status === \"success\" ||\n part.status === \"error\" ||\n part.state === \"completed\");\n if (isCompleted) {\n completedCalls.set(part.callId, toolName);\n }\n }\n\n for (const part of message.parts) {\n if (part.type !== \"tool-result\") {\n continue;\n }\n\n const toolName = completedCalls.get(part.callId);\n if (!toolName || (part.status !== \"success\" && part.status !== \"error\")) {\n continue;\n }\n\n items.push({\n type: \"tool-call\",\n name: toolName,\n callId: part.callId,\n result: part.result,\n ...(part.status === \"error\" ? { isError: true } : {}),\n });\n }\n\n return items;\n });\n\n// Model -> UI.\n\nconst contentToUIParts = (content: string | unknown[]): UIMessagePart[] => {\n if (typeof content === \"string\") {\n return [{ type: \"text\", text: content, state: \"complete\" }];\n }\n\n return content\n .map((part) => contentPartToUIPart(part))\n .filter((part): part is UIMessagePart => part !== null);\n};\n\nconst isToolResultConversationItem = (\n item: ConversationItem,\n): item is GenerativeModelToolCallResult | GenerativeModelProviderToolResult =>\n item.type === \"provider-tool-result\" ||\n (item.type === \"tool-call\" && Object.prototype.hasOwnProperty.call(item, \"result\"));\n\n/** Converts model input messages back into UI messages. */\nexport const fromModelMessages = (\n messages: GenerativeModelInputItem[],\n options?: { generateId?: () => string },\n): UIMessage[] => {\n const generateId = options?.generateId ?? makeLocalMessageId;\n const result: UIMessage[] = [];\n let activeAssistantMessageIndex: number | undefined;\n\n for (const item of messages) {\n if (item.type === \"message\") {\n const parts = contentToUIParts(item.content);\n\n if (parts.length === 0) {\n continue;\n }\n\n result.push({\n localId: generateId(),\n role: item.role ?? \"user\",\n parts,\n });\n activeAssistantMessageIndex =\n (item.role ?? \"user\") === \"assistant\" ? result.length - 1 : undefined;\n continue;\n }\n\n const status = item.isError ? \"error\" : \"success\";\n const toolParts: UIMessagePart[] = [\n {\n type: \"tool-call\",\n callId: item.callId,\n name: item.name,\n status,\n state: \"completed\",\n },\n {\n type: \"tool-result\",\n callId: item.callId,\n result: item.result,\n status,\n },\n ];\n\n if (activeAssistantMessageIndex !== undefined) {\n const message = result[activeAssistantMessageIndex];\n if (message?.role === \"assistant\") {\n result[activeAssistantMessageIndex] = {\n ...message,\n parts: [...message.parts, ...toolParts],\n };\n continue;\n }\n }\n\n result.push({\n localId: generateId(),\n role: \"assistant\",\n parts: toolParts,\n });\n activeAssistantMessageIndex = result.length - 1;\n }\n\n return result;\n};\n\n/** Converts durable conversation items back into UI messages. */\nexport const fromConversationItems = (\n items: ConversationItem[],\n options?: { generateId?: () => string },\n): UIMessage[] => {\n const generateId = options?.generateId ?? makeLocalMessageId;\n const result: UIMessage[] = [];\n let activeAssistantMessageIndex: number | undefined;\n\n for (const item of items) {\n if (item.type === \"message\") {\n const parts = contentToUIParts(item.content);\n if (parts.length === 0) {\n continue;\n }\n\n result.push({\n localId: generateId(),\n role: item.role ?? \"user\",\n parts,\n });\n activeAssistantMessageIndex =\n (item.role ?? \"user\") === \"assistant\" ? result.length - 1 : undefined;\n continue;\n }\n\n if (item.type === \"tool-call\" && !isToolResultConversationItem(item)) {\n const part: UIMessagePart = {\n type: \"tool-call\",\n callId: item.callId,\n name: item.name,\n args: item.arguments,\n status: \"pending\",\n state: \"input-complete\",\n };\n\n if (activeAssistantMessageIndex !== undefined) {\n const message = result[activeAssistantMessageIndex];\n if (message?.role === \"assistant\") {\n result[activeAssistantMessageIndex] = {\n ...message,\n parts: [...message.parts, part],\n };\n continue;\n }\n }\n\n result.push({\n localId: generateId(),\n role: \"assistant\",\n parts: [part],\n });\n activeAssistantMessageIndex = result.length - 1;\n continue;\n }\n\n let appendedToExistingMessage = false;\n for (let index = result.length - 1; index >= 0; index -= 1) {\n const message = result[index];\n if (!message || message.role !== \"assistant\") {\n continue;\n }\n\n const partIndex = message.parts.findIndex(\n (part) => part.type === \"tool-call\" && part.callId === item.callId,\n );\n if (partIndex < 0) {\n continue;\n }\n\n const existingPart = message.parts[partIndex];\n if (!existingPart || existingPart.type !== \"tool-call\") {\n break;\n }\n\n const status = item.isError ? \"error\" : \"success\";\n const parts = message.parts.slice();\n parts[partIndex] = {\n ...existingPart,\n ...(existingPart.name === undefined ? { name: item.name } : {}),\n status,\n state: \"completed\",\n };\n parts.splice(partIndex + 1, 0, {\n type: \"tool-result\",\n callId: item.callId,\n result: item.result,\n status,\n });\n result[index] = { ...message, parts };\n appendedToExistingMessage = true;\n break;\n }\n\n if (appendedToExistingMessage) {\n continue;\n }\n\n const status = item.isError ? \"error\" : \"success\";\n const toolParts: UIMessagePart[] = [\n {\n type: \"tool-call\",\n callId: item.callId,\n name: item.name,\n status,\n state: \"completed\",\n },\n {\n type: \"tool-result\",\n callId: item.callId,\n result: item.result,\n status,\n },\n ];\n\n if (activeAssistantMessageIndex !== undefined) {\n const message = result[activeAssistantMessageIndex];\n if (message?.role === \"assistant\") {\n result[activeAssistantMessageIndex] = {\n ...message,\n parts: [...message.parts, ...toolParts],\n };\n continue;\n }\n }\n\n result.push({\n localId: generateId(),\n role: \"assistant\",\n parts: toolParts,\n });\n activeAssistantMessageIndex = result.length - 1;\n }\n\n return result;\n};\n\n/** Creates a local message id. */\nexport const makeLocalMessageId = () =>\n globalThis.crypto?.randomUUID?.() ??\n `msg_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n/** Normalizes optimistic message options. */\nexport const normalizeOptimisticUserMessageConfig = (\n optimisticUserMessage:\n | boolean\n | {\n enabled?: boolean;\n onError?: \"fail\" | \"remove\";\n }\n | undefined,\n): {\n enabled: boolean;\n onError: \"fail\" | \"remove\";\n} => {\n if (optimisticUserMessage === true) {\n return { enabled: true, onError: \"fail\" };\n }\n if (optimisticUserMessage === false) {\n return { enabled: false, onError: \"fail\" };\n }\n if (!optimisticUserMessage) {\n return { enabled: true, onError: \"fail\" };\n }\n return {\n enabled: optimisticUserMessage.enabled ?? true,\n onError: optimisticUserMessage.onError ?? \"fail\",\n };\n};\n\n/** Deep-merges model option objects. Arrays are replaced, not merged. */\nexport const mergeModelOptions = (\n ...parts: Array<Record<string, unknown> | undefined>\n): Record<string, unknown> => {\n const merged: Record<string, unknown> = {};\n\n const mergeInto = (target: Record<string, unknown>, source: Record<string, unknown>) => {\n for (const [key, value] of Object.entries(source)) {\n const existing = target[key];\n if (\n existing !== null &&\n typeof existing === \"object\" &&\n !Array.isArray(existing) &&\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n target[key] = mergeInto(\n { ...(existing as Record<string, unknown>) },\n value as Record<string, unknown>,\n );\n } else {\n target[key] = value;\n }\n }\n\n return target;\n };\n\n for (const part of parts) {\n if (part) mergeInto(merged, part);\n }\n\n return merged;\n};\n","import type { Event as EventTypes, Role } from \"@better-agent/core/events\";\nimport type { GenerativeModelInputItem } from \"@better-agent/core/providers\";\nimport type { ToolCallPart, ToolResultPart, UIMessage } from \"../types/ui\";\nimport { fromModelMessages } from \"./utils\";\n\n/** Message array plus a local-id index. */\nexport interface MessageState {\n /** Messages in order. */\n messages: UIMessage[];\n /** Local message id to message index. */\n byLocalId: Map<string, number>;\n}\n\nexport interface ApplyEventOptions {\n /** Rebuilds the user turn from replayed `RUN_STARTED`. */\n synthesizeReplayUserMessage?: boolean;\n}\n\n/** Applies one core event to the current message state. */\nexport const applyEvent = (\n state: MessageState,\n event: EventTypes,\n options?: ApplyEventOptions,\n): MessageState => {\n switch (event.type) {\n case \"RUN_STARTED\": {\n if (!options?.synthesizeReplayUserMessage) {\n return state;\n }\n\n return maybeInsertReplayUserMessage(state, event.runInput, event.runId);\n }\n\n // Message parts.\n case \"TEXT_MESSAGE_START\": {\n const role = event.role ?? \"assistant\";\n return ensureMessage(state, event.messageId, role);\n }\n case \"TEXT_MESSAGE_CONTENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n appendText(msg, event.delta),\n );\n }\n case \"TEXT_MESSAGE_END\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n markLatestPartComplete(msg, \"text\"),\n );\n }\n case \"AUDIO_MESSAGE_START\": {\n const role = event.role ?? \"assistant\";\n return ensureMessage(state, event.messageId, role);\n }\n case \"AUDIO_MESSAGE_CONTENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n appendAudio(msg, event.delta),\n );\n }\n case \"AUDIO_MESSAGE_END\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n markLatestPartComplete(msg, \"audio\"),\n );\n }\n case \"IMAGE_MESSAGE_START\": {\n const role = event.role ?? \"assistant\";\n return ensureMessage(state, event.messageId, role);\n }\n case \"IMAGE_MESSAGE_CONTENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n appendImage(msg, event.delta),\n );\n }\n case \"IMAGE_MESSAGE_END\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n markLatestPartComplete(msg, \"image\"),\n );\n }\n case \"VIDEO_MESSAGE_START\": {\n const role = event.role ?? \"assistant\";\n return ensureMessage(state, event.messageId, role);\n }\n case \"VIDEO_MESSAGE_CONTENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n appendVideo(msg, event.delta),\n );\n }\n case \"VIDEO_MESSAGE_END\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n markLatestPartComplete(msg, \"video\"),\n );\n }\n case \"EMBEDDING_MESSAGE_START\": {\n const role = event.role ?? \"assistant\";\n return ensureMessage(state, event.messageId, role);\n }\n case \"EMBEDDING_MESSAGE_CONTENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n appendEmbedding(msg, event.delta),\n );\n }\n case \"EMBEDDING_MESSAGE_END\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n markLatestPartComplete(msg, \"embedding\"),\n );\n }\n\n // Streamed transcript/reasoning parts.\n case \"TRANSCRIPT_MESSAGE_START\": {\n const role = event.role ?? \"assistant\";\n return ensureMessage(state, event.messageId, role);\n }\n case \"TRANSCRIPT_MESSAGE_CONTENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n appendTranscriptText(msg, event.delta),\n );\n }\n case \"TRANSCRIPT_MESSAGE_SEGMENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n upsertTranscriptSegment(msg, event.segment),\n );\n }\n case \"TRANSCRIPT_MESSAGE_END\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n markLatestPartComplete(msg, \"transcript\"),\n );\n }\n case \"REASONING_MESSAGE_START\": {\n const role = event.role ?? \"assistant\";\n return ensureAndUpdateMessage(state, event.messageId, role, (msg) =>\n appendReasoningText(msg, \"\", event.visibility),\n );\n }\n case \"REASONING_MESSAGE_CONTENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n appendReasoningText(msg, event.delta, event.visibility),\n );\n }\n case \"REASONING_MESSAGE_END\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n markLatestPartComplete(msg, \"reasoning\"),\n );\n }\n\n // Tool lifecycle on the current assistant turn.\n case \"TOOL_CALL_START\": {\n return updateResolvedToolMessage(\n state,\n event.parentMessageId,\n event.toolCallId,\n (msg) =>\n isToolCallCompleted(msg, event.toolCallId)\n ? msg\n : upsertToolPart(msg, \"tool-call\", event.toolCallId, {\n name: event.toolCallName,\n ...(event.toolTarget !== undefined\n ? { toolTarget: event.toolTarget }\n : {}),\n status: \"pending\",\n state: \"awaiting-input\",\n }),\n );\n }\n case \"TOOL_CALL_ARGS\": {\n return updateResolvedToolMessage(\n state,\n event.parentMessageId,\n event.toolCallId,\n (msg) =>\n isToolCallCompleted(msg, event.toolCallId)\n ? msg\n : upsertToolPart(\n msg,\n \"tool-call\",\n event.toolCallId,\n {\n name: event.toolCallName,\n ...(event.toolTarget !== undefined\n ? { toolTarget: event.toolTarget }\n : {}),\n status: \"pending\",\n state: \"input-streaming\",\n },\n (part) =>\n part.type === \"tool-call\"\n ? { ...part, args: (part.args ?? \"\") + event.delta }\n : part,\n ),\n );\n }\n case \"TOOL_CALL_END\": {\n return updateResolvedToolMessage(\n state,\n event.parentMessageId,\n event.toolCallId,\n (msg) => {\n if (isToolCallCompleted(msg, event.toolCallId)) {\n return msg;\n }\n\n const existing = findToolCallPart(msg, event.toolCallId);\n if (isApprovalLifecycleState(existing?.state)) {\n return msg;\n }\n\n return upsertToolPart(msg, \"tool-call\", event.toolCallId, {\n name: event.toolCallName,\n ...(event.toolTarget !== undefined ? { toolTarget: event.toolTarget } : {}),\n status: \"pending\",\n state: \"input-complete\",\n });\n },\n );\n }\n case \"TOOL_CALL_RESULT\": {\n return updateResolvedToolMessage(\n state,\n event.parentMessageId,\n event.toolCallId,\n (msg) => {\n const status = event.isError ? \"error\" : \"success\";\n const withResult = upsertToolPart(msg, \"tool-result\", event.toolCallId, {\n result: event.result,\n status,\n });\n return upsertToolPart(withResult, \"tool-call\", event.toolCallId, {\n name: event.toolCallName,\n ...(event.toolTarget !== undefined ? { toolTarget: event.toolTarget } : {}),\n status,\n state: \"completed\",\n });\n },\n );\n }\n\n // Approval updates extend the tool call.\n case \"TOOL_APPROVAL_REQUIRED\": {\n return updateResolvedToolMessage(\n state,\n event.parentMessageId,\n event.toolCallId,\n (msg) => {\n const withState = upsertToolPart(msg, \"tool-call\", event.toolCallId, {\n name: event.toolCallName,\n ...(event.toolTarget !== undefined ? { toolTarget: event.toolTarget } : {}),\n status: \"pending\",\n state: \"approval-requested\",\n });\n return updateToolApprovalMeta(withState, event.toolCallId, {\n input: event.toolInput,\n ...(event.meta !== undefined ? { meta: event.meta } : {}),\n });\n },\n );\n }\n case \"TOOL_APPROVAL_UPDATED\": {\n return updateResolvedToolMessage(\n state,\n event.parentMessageId,\n event.toolCallId,\n (msg) => {\n const withState = upsertToolPart(msg, \"tool-call\", event.toolCallId, {\n name: event.toolCallName,\n ...(event.toolTarget !== undefined ? { toolTarget: event.toolTarget } : {}),\n status: getApprovalStatus(event.state),\n state: getApprovalPartState(event.state),\n });\n return updateToolApprovalMeta(withState, event.toolCallId, {\n ...(event.toolInput !== undefined ? { input: event.toolInput } : {}),\n ...(event.meta !== undefined ? { meta: event.meta } : {}),\n ...(event.note !== undefined ? { note: event.note } : {}),\n ...(event.actorId !== undefined ? { actorId: event.actorId } : {}),\n });\n },\n );\n }\n default:\n return state;\n }\n};\n\n/** Creates message state from UI messages. */\nexport const createMessageState = (initial: UIMessage[] = []): MessageState => {\n const byLocalId = new Map<string, number>();\n initial.forEach((m, i) => byLocalId.set(m.localId, i));\n return { messages: initial, byLocalId };\n};\n\n// Replay helpers.\n\nconst findMessageLocalIdByToolCallId = (\n state: MessageState,\n toolCallId: string,\n): string | undefined => {\n for (let i = state.messages.length - 1; i >= 0; i -= 1) {\n const message = state.messages[i];\n if (!message) continue;\n const hasToolPart = message.parts.some(\n (part) =>\n (part.type === \"tool-call\" || part.type === \"tool-result\") &&\n part.callId === toolCallId,\n );\n if (hasToolPart) return message.localId;\n }\n return undefined;\n};\n\nconst findLatestAssistantMessageLocalId = (state: MessageState): string | undefined => {\n for (let i = state.messages.length - 1; i >= 0; i -= 1) {\n const message = state.messages[i];\n if (message?.role === \"assistant\") return message.localId;\n }\n return undefined;\n};\n\nconst resolveCurrentTurnAssistantLocalId = (state: MessageState): string | undefined => {\n for (let i = state.messages.length - 1; i >= 0; i -= 1) {\n const message = state.messages[i];\n if (message?.role !== \"user\") continue;\n const userLocalId = message.localId;\n let latestAssistantAfterUser: string | undefined;\n for (let j = i + 1; j < state.messages.length; j += 1) {\n const candidate = state.messages[j];\n if (candidate?.role === \"assistant\") latestAssistantAfterUser = candidate.localId;\n }\n\n return latestAssistantAfterUser ?? `assistant_turn:${userLocalId}`;\n }\n return undefined;\n};\n\n// Resolve tool state to the best assistant message.\nconst resolveToolMessageLocalId = (\n state: MessageState,\n parentMessageId: string | undefined,\n toolCallId: string,\n): string | undefined => {\n if (parentMessageId) {\n if (state.byLocalId.has(parentMessageId)) return parentMessageId;\n }\n return (\n findMessageLocalIdByToolCallId(state, toolCallId) ??\n resolveCurrentTurnAssistantLocalId(state) ??\n findLatestAssistantMessageLocalId(state)\n );\n};\n\nconst maybeInsertReplayUserMessage = (\n state: MessageState,\n runInput: Record<string, unknown>,\n runId: string,\n): MessageState => {\n const synthesized = toReplayUserMessage(runInput, runId);\n if (!synthesized) {\n return state;\n }\n\n // Dedupe by replay id, not text.\n if (state.byLocalId.has(synthesized.localId)) {\n return state;\n }\n\n const latestUserMessage = findLatestUserMessage(state);\n if (latestUserMessage && latestUserMessage.localId === synthesized.localId) {\n return state;\n }\n\n return {\n ...state,\n messages: [...state.messages, synthesized],\n byLocalId: new Map(state.byLocalId).set(synthesized.localId, state.messages.length),\n };\n};\n\nconst toReplayUserMessage = (\n runInput: Record<string, unknown>,\n runId: string,\n): UIMessage | undefined => {\n const input = runInput.input;\n\n if (typeof input === \"string\") {\n return {\n localId: `user_run:${runId}`,\n id: `user_run:${runId}`,\n role: \"user\",\n parts: [{ type: \"text\", text: input, state: \"complete\" }],\n status: \"sent\",\n };\n }\n\n if (isReplayInputArray(input)) {\n return toLatestReplayUserMessage(input, runId);\n }\n\n if (isSingleReplayMessageItem(input)) {\n return toLatestReplayUserMessage([input as GenerativeModelInputItem], runId);\n }\n\n return undefined;\n};\n\nconst toLatestReplayUserMessage = (\n input: GenerativeModelInputItem[],\n runId: string,\n): UIMessage | undefined => {\n const replayMessages = fromModelMessages(input, {\n generateId: (() => {\n let index = 0;\n return () => `user_run:${runId}:${(index++).toString(36)}`;\n })(),\n });\n const latestUserMessage = [...replayMessages]\n .reverse()\n .find((message) => message.role === \"user\");\n\n if (!latestUserMessage) {\n return undefined;\n }\n\n return {\n ...latestUserMessage,\n status: \"sent\",\n };\n};\n\nconst findLatestUserMessage = (state: MessageState): UIMessage | undefined =>\n [...state.messages].reverse().find((message) => message.role === \"user\");\n\nconst isSingleReplayMessageItem = (\n input: unknown,\n): input is {\n type: \"message\";\n role?: string;\n content: string | unknown[];\n} => {\n if (typeof input !== \"object\" || input === null) {\n return false;\n }\n\n const record = input as {\n type?: unknown;\n role?: unknown;\n content?: unknown;\n };\n\n return (\n record.type === \"message\" &&\n (record.role === undefined || typeof record.role === \"string\") &&\n (typeof record.content === \"string\" || Array.isArray(record.content))\n );\n};\n\nconst isReplayInputArray = (input: unknown): input is GenerativeModelInputItem[] =>\n Array.isArray(input);\n\n// Message mutation helpers.\nconst ensureMessage = (state: MessageState, localId: string, role: Role): MessageState => {\n if (state.byLocalId.has(localId)) return state;\n\n const next: UIMessage = {\n localId,\n id: localId,\n role,\n parts: [],\n };\n\n return {\n ...state,\n messages: [...state.messages, next],\n byLocalId: new Map(state.byLocalId).set(localId, state.messages.length),\n };\n};\n\nconst updateMessage = (\n state: MessageState,\n localId: string,\n updater: (msg: UIMessage) => UIMessage,\n): MessageState => {\n const idx = state.byLocalId.get(localId);\n if (idx === undefined) return state;\n\n const nextMessages = state.messages.slice();\n const current = nextMessages[idx];\n if (!current) return state;\n nextMessages[idx] = updater(current);\n\n return { ...state, messages: nextMessages };\n};\n\nconst ensureAndUpdateMessage = (\n state: MessageState,\n localId: string,\n role: Role,\n updater: (msg: UIMessage) => UIMessage,\n): MessageState => updateMessage(ensureMessage(state, localId, role), localId, updater);\n\nconst appendText = (msg: UIMessage, delta: string): UIMessage => {\n // Extend the last open text part when possible.\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (last && last.type === \"text\" && last.state !== \"complete\") {\n parts[parts.length - 1] = { ...last, text: last.text + delta };\n } else {\n parts.push({ type: \"text\", text: delta });\n }\n return { ...msg, parts };\n};\n\nconst appendAudio = (\n msg: UIMessage,\n delta: {\n kind: \"base64\";\n data: string;\n mimeType: string;\n },\n): UIMessage => {\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (last?.type === \"audio\" && last.source.kind === \"base64\" && last.state !== \"complete\") {\n parts[parts.length - 1] = {\n ...last,\n source: {\n kind: \"base64\",\n data: `${last.source.data}${delta.data}`,\n mimeType: delta.mimeType,\n },\n };\n } else {\n parts.push({\n type: \"audio\",\n source: {\n kind: \"base64\",\n data: delta.data,\n mimeType: delta.mimeType,\n },\n });\n }\n return { ...msg, parts };\n};\n\nconst appendImage = (\n msg: UIMessage,\n delta:\n | {\n kind: \"url\";\n url: string;\n }\n | {\n kind: \"base64\";\n data: string;\n mimeType: string;\n },\n): UIMessage => {\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (\n delta.kind === \"base64\" &&\n last?.type === \"image\" &&\n last.source.kind === \"base64\" &&\n last.state !== \"complete\"\n ) {\n parts[parts.length - 1] = {\n ...last,\n source: {\n kind: \"base64\",\n data: `${last.source.data}${delta.data}`,\n mimeType: delta.mimeType,\n },\n };\n } else if (delta.kind === \"url\") {\n parts.push({\n type: \"image\",\n source: {\n kind: \"url\",\n url: delta.url,\n },\n });\n } else {\n parts.push({\n type: \"image\",\n source: {\n kind: \"base64\",\n data: delta.data,\n mimeType: delta.mimeType,\n },\n });\n }\n return { ...msg, parts };\n};\n\nconst appendVideo = (\n msg: UIMessage,\n delta:\n | {\n kind: \"url\";\n url: string;\n }\n | {\n kind: \"base64\";\n data: string;\n mimeType: string;\n },\n): UIMessage => {\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (\n delta.kind === \"base64\" &&\n last?.type === \"video\" &&\n last.source.kind === \"base64\" &&\n last.state !== \"complete\"\n ) {\n parts[parts.length - 1] = {\n ...last,\n source: {\n kind: \"base64\",\n data: `${last.source.data}${delta.data}`,\n mimeType: delta.mimeType,\n },\n };\n } else if (delta.kind === \"url\") {\n parts.push({\n type: \"video\",\n source: {\n kind: \"url\",\n url: delta.url,\n },\n });\n } else {\n parts.push({\n type: \"video\",\n source: {\n kind: \"base64\",\n data: delta.data,\n mimeType: delta.mimeType,\n },\n });\n }\n return { ...msg, parts };\n};\n\nconst appendEmbedding = (msg: UIMessage, delta: number[]): UIMessage => {\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (last?.type === \"embedding\" && last.state !== \"complete\") {\n parts[parts.length - 1] = {\n ...last,\n embedding: [...last.embedding, ...delta],\n };\n } else {\n parts.push({\n type: \"embedding\",\n embedding: delta,\n });\n }\n return { ...msg, parts };\n};\n\nconst appendTranscriptText = (msg: UIMessage, delta: string): UIMessage => {\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (last?.type === \"transcript\" && last.state !== \"complete\") {\n parts[parts.length - 1] = { ...last, text: last.text + delta };\n } else {\n parts.push({\n type: \"transcript\",\n text: delta,\n });\n }\n return { ...msg, parts };\n};\n\nconst appendReasoningText = (\n msg: UIMessage,\n delta: string,\n visibility: \"summary\" | \"full\",\n provider?: string,\n): UIMessage => {\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (\n last?.type === \"reasoning\" &&\n last.state !== \"complete\" &&\n last.visibility === visibility &&\n (last.provider ?? undefined) === (provider ?? undefined)\n ) {\n parts[parts.length - 1] = { ...last, text: last.text + delta };\n } else {\n parts.push({\n type: \"reasoning\",\n text: delta,\n visibility,\n ...(provider !== undefined ? { provider } : {}),\n });\n }\n return { ...msg, parts };\n};\n\nconst upsertTranscriptSegment = (\n msg: UIMessage,\n segment: {\n id: string;\n start: number;\n end: number;\n text: string;\n speaker?: string;\n },\n): UIMessage => {\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (last?.type === \"transcript\" && last.state !== \"complete\") {\n const segments = last.segments ? [...last.segments] : [];\n const idx = segments.findIndex((item) => item.id === segment.id);\n if (idx === -1) {\n segments.push(segment);\n } else {\n segments[idx] = segment;\n }\n parts[parts.length - 1] = { ...last, segments };\n } else {\n parts.push({\n type: \"transcript\",\n text: \"\",\n segments: [segment],\n });\n }\n return { ...msg, parts };\n};\n\nconst markLatestPartComplete = (\n msg: UIMessage,\n partType: \"text\" | \"audio\" | \"image\" | \"video\" | \"embedding\" | \"transcript\" | \"reasoning\",\n): UIMessage => {\n const parts = msg.parts.slice();\n for (let i = parts.length - 1; i >= 0; i -= 1) {\n const part = parts[i];\n if (!part || part.type !== partType) continue;\n parts[i] = { ...part, state: \"complete\" };\n return { ...msg, parts };\n }\n return msg;\n};\n\n// Tool helpers.\nconst isApprovalLifecycleState = (state: ToolCallPart[\"state\"] | undefined): boolean =>\n state === \"approval-requested\" ||\n state === \"approval-approved\" ||\n state === \"approval-denied\" ||\n state === \"approval-expired\";\n\nconst getApprovalPartState = (\n state: \"requested\" | \"approved\" | \"denied\" | \"expired\",\n): NonNullable<ToolCallPart[\"state\"]> =>\n state === \"requested\"\n ? \"approval-requested\"\n : state === \"approved\"\n ? \"approval-approved\"\n : state === \"denied\"\n ? \"approval-denied\"\n : \"approval-expired\";\n\nconst getApprovalStatus = (\n state: \"requested\" | \"approved\" | \"denied\" | \"expired\",\n): ToolCallPart[\"status\"] => (state === \"denied\" || state === \"expired\" ? \"error\" : \"pending\");\n\nconst updateToolApprovalMeta = (\n msg: UIMessage,\n toolCallId: string,\n patch: {\n input?: unknown;\n meta?: Record<string, unknown>;\n note?: string;\n actorId?: string;\n },\n): UIMessage =>\n upsertToolPart(msg, \"tool-call\", toolCallId, {}, (part) =>\n part.type === \"tool-call\"\n ? {\n ...part,\n approval: {\n ...(part.approval ?? {}),\n ...(patch.input !== undefined ? { input: patch.input } : {}),\n ...(patch.meta !== undefined ? { meta: patch.meta } : {}),\n ...(patch.note !== undefined ? { note: patch.note } : {}),\n ...(patch.actorId !== undefined ? { actorId: patch.actorId } : {}),\n },\n }\n : part,\n );\n\nconst isToolCallCompleted = (msg: UIMessage, toolCallId: string): boolean =>\n msg.parts.some(\n (part) =>\n part.type === \"tool-call\" &&\n part.callId === toolCallId &&\n (part.status === \"success\" ||\n part.state === \"completed\" ||\n part.state === \"approval-denied\" ||\n part.state === \"approval-expired\"),\n );\n\nconst findToolCallPart = (msg: UIMessage, toolCallId: string): ToolCallPart | undefined =>\n msg.parts.find(\n (part): part is ToolCallPart => part.type === \"tool-call\" && part.callId === toolCallId,\n );\n\nconst upsertToolPart = (\n msg: UIMessage,\n kind: \"tool-call\" | \"tool-result\",\n toolCallId: string,\n patch: Partial<ToolCallPart> | Partial<ToolResultPart>,\n updater?: (part: ToolCallPart | ToolResultPart) => ToolCallPart | ToolResultPart,\n): UIMessage => {\n // Reuse the same tool part instead of duplicating it.\n const parts = msg.parts.slice();\n const idx = parts.findIndex((p) => p.type === kind && \"callId\" in p && p.callId === toolCallId);\n\n if (idx === -1) {\n if (kind === \"tool-call\") {\n parts.push({\n type: \"tool-call\",\n callId: toolCallId,\n status: \"pending\",\n ...(patch as Partial<ToolCallPart>),\n });\n } else {\n parts.push({\n type: \"tool-result\",\n callId: toolCallId,\n status: \"pending\",\n ...(patch as Partial<ToolResultPart>),\n });\n }\n return { ...msg, parts };\n }\n\n const existing = parts[idx];\n if (!existing) return { ...msg, parts };\n if (kind === \"tool-call\" && existing.type === \"tool-call\") {\n const merged: ToolCallPart = {\n ...existing,\n ...(patch as Partial<ToolCallPart>),\n type: \"tool-call\",\n };\n parts[idx] = updater ? (updater(merged) as ToolCallPart) : merged;\n } else if (kind === \"tool-result\" && existing.type === \"tool-result\") {\n const merged: ToolResultPart = {\n ...existing,\n ...(patch as Partial<ToolResultPart>),\n type: \"tool-result\",\n };\n parts[idx] = updater ? (updater(merged) as ToolResultPart) : merged;\n }\n\n return { ...msg, parts };\n};\n\nconst updateAssistantMessage = (\n state: MessageState,\n messageId: string,\n updater: (msg: UIMessage) => UIMessage,\n): MessageState => ensureAndUpdateMessage(state, messageId, \"assistant\", updater);\n\nconst updateResolvedToolMessage = (\n state: MessageState,\n parentMessageId: string | undefined,\n toolCallId: string,\n updater: (msg: UIMessage) => UIMessage,\n): MessageState => {\n const targetMessageLocalId = resolveToolMessageLocalId(state, parentMessageId, toolCallId);\n if (!targetMessageLocalId) {\n return state;\n }\n\n return ensureAndUpdateMessage(state, targetMessageLocalId, \"assistant\", updater);\n};\n","import type {\n GenerativeModelOutputItem,\n GenerativeModelResponse,\n} from \"@better-agent/core/providers\";\nimport type { UIMessage, UIMessagePart } from \"../types/ui\";\nimport { contentPartToUIPart } from \"./utils\";\n\n/** Builds a deterministic local id for messages synthesized from model output. */\nconst makeResponseLocalId = (prefix: string, index: number) => `${prefix}_${index.toString(36)}`;\n\n/** Converts one model output item into a UI message. */\nconst createMessageFromOutputItem = (\n item: GenerativeModelOutputItem,\n index: number,\n): UIMessage | null => {\n if (item.type === \"message\") {\n const parts =\n typeof item.content === \"string\"\n ? [{ type: \"text\", text: item.content, state: \"complete\" } satisfies UIMessagePart]\n : item.content\n .map((part) => contentPartToUIPart(part))\n .filter((part: UIMessagePart | null): part is UIMessagePart => part !== null);\n\n if (parts.length === 0) {\n return null;\n }\n\n return {\n localId: makeResponseLocalId(\"response_message\", index),\n role: item.role,\n parts,\n };\n }\n\n if (item.type === \"tool-call\") {\n return {\n localId: makeResponseLocalId(\"response_tool_call\", index),\n role: \"assistant\",\n parts: [\n {\n type: \"tool-call\",\n callId: item.callId,\n name: item.name,\n args: item.arguments,\n status: \"pending\",\n state: \"input-complete\",\n },\n ],\n };\n }\n\n if (item.type !== \"provider-tool-result\") {\n return null;\n }\n\n const status = item.isError ? \"error\" : \"success\";\n return {\n localId: makeResponseLocalId(\"response_tool_result\", index),\n role: \"assistant\",\n parts: [\n {\n type: \"tool-call\",\n callId: item.callId,\n name: item.name,\n status,\n state: \"completed\",\n },\n {\n type: \"tool-result\",\n callId: item.callId,\n result: item.result,\n status,\n },\n ],\n };\n};\n\n/** Attaches a provider tool result to the latest matching assistant message. */\nconst attachToolResultToMatchingMessage = (\n messages: UIMessage[],\n item: Extract<GenerativeModelOutputItem, { type: \"provider-tool-result\" }>,\n): boolean => {\n let messageIndex = -1;\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (!message || message.role !== \"assistant\") {\n continue;\n }\n\n const hasMatchingToolCall = message.parts.some(\n (part) => part.type === \"tool-call\" && part.callId === item.callId,\n );\n if (hasMatchingToolCall) {\n messageIndex = index;\n break;\n }\n }\n\n if (messageIndex < 0) {\n return false;\n }\n\n const message = messages[messageIndex];\n if (!message || message.role !== \"assistant\") {\n return false;\n }\n\n const nextMessages = messages.slice();\n const status = item.isError ? \"error\" : \"success\";\n nextMessages[messageIndex] = {\n ...message,\n parts: message.parts.flatMap((part) =>\n part.type === \"tool-call\" && part.callId === item.callId\n ? [\n {\n ...part,\n status,\n state: \"completed\",\n },\n {\n type: \"tool-result\" as const,\n callId: item.callId,\n result: item.result,\n status,\n },\n ]\n : [part],\n ),\n };\n messages.splice(0, messages.length, ...nextMessages);\n return true;\n};\n\n/**\n * Converts model response output into UI messages.\n */\nexport const getMessagesFromResponse = (response?: GenerativeModelResponse): UIMessage[] => {\n const messages: UIMessage[] = [];\n\n for (const [index, item] of (response?.output ?? []).entries()) {\n // Prefer attaching tool results to an existing tool call.\n if (\n item.type === \"provider-tool-result\" &&\n attachToolResultToMatchingMessage(messages, item)\n ) {\n continue;\n }\n\n const message = createMessageFromOutputItem(item, index);\n if (message) {\n messages.push(message);\n }\n }\n\n return messages;\n};\n","import type {\n GenerativeModelInputItem,\n GenerativeModelResponse,\n} from \"@better-agent/core/providers\";\nimport type { BetterAgentClient, ClientEvent } from \"../types/client\";\nimport type {\n AgentNameFromApp,\n DefaultStructuredOutputForAgent,\n} from \"../types/client-type-helpers\";\nimport type {\n AgentChatControllerOptions,\n AgentChatSnapshot,\n AgentStatus,\n ApproveToolCallParams,\n ControllerRunInput,\n InternalSubmitOptions,\n OnFinishParams,\n PreparedRequestInput,\n RetryResult,\n SendMessageOptions,\n SendResult,\n SetMessagesInput,\n StreamConsumptionResult,\n StreamTerminalState,\n SubmissionContext,\n UIMessageInput,\n} from \"../types/controller\";\nimport type { ResumeOption } from \"../types/controller\";\nimport type { PendingToolApproval, UIMessage } from \"../types/ui\";\nimport { ensureBrowserTeardownTracking, isBrowserPageTearingDown } from \"./browser-lifecycle\";\nimport type { AgentClientError } from \"./error\";\nimport { StreamDisconnectError, getEventErrorMessage, toAgentClientError } from \"./error\";\nimport { type MessageState, applyEvent, createMessageState } from \"./reducer\";\nimport { getMessagesFromResponse } from \"./response\";\nimport {\n fromConversationItems,\n fromModelMessages,\n makeLocalMessageId,\n mergeModelOptions,\n normalizeOptimisticUserMessageConfig,\n toModelMessages,\n} from \"./utils\";\n\n/**\n * Framework-agnostic controller for one agent conversation.\n */\nexport class AgentChatController<\n TApp = unknown,\n TAgentName extends AgentNameFromApp<TApp> = AgentNameFromApp<TApp>,\n> {\n // Private state.\n private readonly id: string;\n private state: MessageState;\n private status: AgentStatus = \"ready\";\n private error: AgentClientError | undefined = undefined;\n private lastStreamId: string | undefined;\n private lastRunId: string | undefined;\n private lastResponse: GenerativeModelResponse | undefined;\n private lastStructured: DefaultStructuredOutputForAgent<TApp, TAgentName> | undefined;\n private lastAppliedSeq = -1;\n private lastAppliedSeqByStream: Map<string, number> = new Map();\n private initialMessages: UIMessage[];\n private listeners: Set<() => void> = new Set();\n private destroyed = false;\n private initialized = false;\n private warnedHistoryCombo = false;\n private options: AgentChatControllerOptions<TApp, TAgentName>;\n private activeAbortController: AbortController | null = null;\n\n // Constructor.\n constructor(\n private client: BetterAgentClient<TApp>,\n options: AgentChatControllerOptions<TApp, TAgentName>,\n ) {\n this.options = options;\n this.id = options.id ?? makeLocalMessageId();\n const normalized = this.normalizeMessages(options.initialMessages ?? []);\n this.state = createMessageState(normalized);\n this.initialMessages = normalized;\n this.lastStreamId = this.getConfiguredInitialStreamId(options);\n }\n\n // Public state.\n\n /** Returns the current messages. */\n getMessages(): UIMessage[] {\n return this.state.messages;\n }\n\n /** Returns the current status. */\n getStatus(): AgentStatus {\n return this.status;\n }\n\n /** Returns the latest client error. */\n getError(): AgentClientError | undefined {\n return this.error;\n }\n\n /** Returns the latest stream id. */\n getStreamId(): string | undefined {\n return this.lastStreamId;\n }\n\n /** Returns the latest run id. */\n getRunId(): string | undefined {\n return this.lastRunId;\n }\n\n /** True while a request is active. */\n get isLoading(): boolean {\n return (\n this.status === \"hydrating\" ||\n this.status === \"submitted\" ||\n this.status === \"streaming\"\n );\n }\n\n /** True while stream events are being consumed. */\n get isStreaming(): boolean {\n return this.status === \"streaming\";\n }\n\n /** Returns pending tool approvals. */\n getPendingToolApprovals(): PendingToolApproval[] {\n const seen = new Set<string>();\n const pending: PendingToolApproval[] = [];\n\n for (const message of this.state.messages) {\n for (const part of message.parts) {\n if (\n part.type === \"tool-call\" &&\n part.state === \"approval-requested\" &&\n !seen.has(part.callId)\n ) {\n pending.push({\n toolCallId: part.callId,\n toolName: part.name,\n args: part.args,\n toolTarget: part.toolTarget,\n input: part.approval?.input,\n meta: part.approval?.meta,\n note: part.approval?.note,\n actorId: part.approval?.actorId,\n });\n seen.add(part.callId);\n }\n }\n }\n return pending;\n }\n\n /** Returns an immutable snapshot. */\n getSnapshot(): AgentChatSnapshot {\n return {\n id: this.id,\n conversationId: this.options.conversationId,\n messages: this.state.messages,\n status: this.status,\n error: this.error,\n streamId: this.lastStreamId,\n runId: this.lastRunId,\n isLoading: this.isLoading,\n isStreaming: this.isStreaming,\n pendingToolApprovals: this.getPendingToolApprovals(),\n };\n }\n\n // Public lifecycle.\n\n /** Stops the active run or stream. */\n stop(): void {\n if (this.destroyed) return;\n this.cancelActiveWork();\n this.setStatus(\"ready\");\n }\n\n /** Replaces the transport client. */\n updateClient(client: BetterAgentClient<TApp>): void {\n this.client = client;\n }\n\n /**\n * Subscribes to state updates.\n */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /** Calls each subscribed listener after controller state changes. */\n private notify(): void {\n if (this.destroyed) return;\n for (const listener of this.listeners) {\n listener();\n }\n }\n\n /** Stores run and stream ids from response headers. */\n private updateResponseIds(response: Response): void {\n const runId = response.headers.get(\"x-run-id\");\n if (runId && runId !== this.lastRunId) {\n this.lastRunId = runId;\n }\n\n const streamId = response.headers.get(\"x-stream-id\");\n if (streamId && streamId !== this.lastStreamId) {\n this.lastStreamId = streamId;\n }\n }\n\n // Public requests.\n\n /** Starts hydration or resume behavior. */\n init(): void {\n if (this.initialized) return;\n this.initialized = true;\n ensureBrowserTeardownTracking();\n\n if (this.options.hydrateFromServer && this.options.conversationId) {\n void this.hydrateFromServer();\n return;\n }\n\n this.initResume();\n }\n\n /** Starts resume behavior, even with messages when allowed. */\n private initResume(options?: { allowWithMessages?: boolean }): void {\n const resume = this.options.resume;\n if (!resume) return;\n\n const hasMessages = this.state.messages.length > 0;\n const explicitStreamId =\n typeof resume === \"object\" && resume !== null && typeof resume.streamId === \"string\"\n ? resume.streamId\n : undefined;\n const explicitAfterSeq =\n typeof resume === \"object\" && resume !== null ? resume.afterSeq : undefined;\n // Prefer an explicit cursor, otherwise reuse the stream cursor.\n const streamAfterSeq =\n explicitAfterSeq ??\n (explicitStreamId ? this.lastAppliedSeqByStream.get(explicitStreamId) : undefined);\n\n // Skip implicit resume when messages already exist.\n if (\n hasMessages &&\n explicitStreamId === undefined &&\n explicitAfterSeq === undefined &&\n !options?.allowWithMessages\n ) {\n return;\n }\n\n if (explicitStreamId) {\n void this.resumeStream({\n streamId: explicitStreamId,\n ...(streamAfterSeq !== undefined ? { afterSeq: streamAfterSeq } : {}),\n });\n return;\n }\n\n if (!this.options.conversationId) {\n console.warn(\n \"[better-agent] `resume` requires `conversationId` unless an explicit `streamId` is provided.\",\n );\n return;\n }\n\n // Use the caller cursor when present, otherwise let the server decide.\n if (explicitAfterSeq !== undefined) {\n void this.resumeConversation({ afterSeq: explicitAfterSeq });\n return;\n }\n\n void this.resumeConversation();\n }\n\n /** Hydrates from server history before resuming. */\n private async hydrateFromServer(): Promise<void> {\n const conversationId = this.options.conversationId;\n if (!conversationId) {\n this.initResume();\n return;\n }\n\n const loadConversation = this.client.loadConversation;\n if (typeof loadConversation !== \"function\") {\n // Skip hydration when loading is unavailable.\n this.initResume();\n return;\n }\n\n const { signal, controller } = this.startOperation();\n this.setStatus(\"hydrating\");\n let hydrationCompleted = false;\n this.setError(undefined);\n\n try {\n const result = await loadConversation.call(\n this.client,\n this.options.agent,\n conversationId,\n { signal },\n );\n this.throwIfAborted(signal);\n\n if (result) {\n // Replace local state with the server snapshot.\n const uiMessages = fromConversationItems(result.items);\n this.initialMessages = uiMessages;\n this.state = createMessageState(uiMessages);\n this.notify();\n }\n\n this.setStatus(\"ready\");\n hydrationCompleted = true;\n } catch (e) {\n if (this.isAbortError(e, signal)) {\n return;\n }\n\n const err = this.toError(e, \"Hydration failed\");\n this.options.onError?.(err);\n this.setStatus(\"ready\");\n hydrationCompleted = true;\n } finally {\n this.finishOperation(controller);\n if (hydrationCompleted) {\n // Allow resume after hydration.\n this.initResume({ allowWithMessages: true });\n }\n }\n }\n\n /** Sends one message. */\n async sendMessage(\n input: ControllerRunInput,\n options?: SendMessageOptions,\n ): Promise<SendResult> {\n return this.submitWithInternalOptions(\n input,\n options?.signal ? { signal: options.signal } : undefined,\n );\n }\n\n /** Retries a user message by local id. */\n async retryMessage(localId: string): Promise<RetryResult> {\n const message = this.getMessageByLocalId(localId);\n if (!message) {\n throw new Error(`Message '${localId}' was not found.`);\n }\n if (message.role !== \"user\") {\n throw new Error(\"Only user messages can be retried.\");\n }\n\n const idx = this.state.byLocalId.get(localId);\n if (idx === undefined) {\n throw new Error(`Message '${localId}' was not found.`);\n }\n\n const retryMessages = this.state.messages\n .slice(0, idx + 1)\n .map((candidate) =>\n candidate.localId === localId\n ? (this.createPendingUserMessage(candidate) ?? candidate)\n : candidate,\n );\n\n return this.submitWithInternalOptions(\n {\n input: toModelMessages(retryMessages),\n sendClientHistory: true,\n },\n {\n replaceLocalId: localId,\n replaceMessage: this.createPendingUserMessage(message),\n serializedHistoryInput: true,\n },\n );\n }\n\n /** Resumes an existing stream. */\n async resumeStream(options: { streamId: string; afterSeq?: number }): Promise<void> {\n const { streamId } = options;\n const { signal, controller } = this.startOperation();\n this.setStatus(\"submitted\");\n this.setError(undefined);\n\n try {\n const events = this.client.resumeStream(\n this.options.agent,\n {\n streamId,\n afterSeq: options.afterSeq ?? this.lastAppliedSeqByStream.get(streamId) ?? -1,\n },\n {\n signal,\n onResponse: (response) => {\n this.updateResponseIds(response);\n },\n },\n );\n\n const result = await this.consumeStreamUntilTerminal(events, {\n signal,\n replay: true,\n disconnectMessage: \"Resume stream disconnected.\",\n });\n if (!result.receivedEvent) {\n this.setStatus(\"ready\");\n return;\n }\n if (!result.terminalState) {\n throw this.toStreamDisconnectError(\n undefined,\n \"Stream ended before terminal run event.\",\n );\n }\n if (result.terminalState === \"error\") {\n throw result.terminalError ?? new Error(\"Resume failed.\");\n }\n\n this.setStatus(\"ready\");\n if (result.receivedEvent && result.terminalState) {\n this.emitFinish({ streamId, isAbort: result.terminalState === \"aborted\" });\n }\n } catch (e) {\n if (\n this.destroyed ||\n this.isAbortError(e, signal) ||\n (this.isStreamDisconnectError(e) && this.isPageTeardownLike())\n ) {\n this.setStatus(\"ready\");\n return;\n }\n\n const err = toAgentClientError(e, \"Resume failed.\");\n this.setError(err);\n this.setStatus(\"error\");\n if (this.isStreamDisconnectError(e)) {\n this.options.onDisconnect?.({\n error: err,\n runId: this.lastRunId,\n streamId,\n });\n }\n this.options.onError?.(err);\n } finally {\n this.finishOperation(controller);\n }\n }\n\n /** Resumes the active stream for the current conversation. */\n async resumeConversation(options?: { afterSeq?: number }): Promise<void> {\n const conversationId = this.options.conversationId;\n if (!conversationId) {\n console.warn(\"[better-agent] `resumeConversation()` requires `conversationId`.\");\n return;\n }\n\n const { signal, controller } = this.startOperation();\n this.setStatus(\"submitted\");\n this.setError(undefined);\n\n try {\n const events = this.client.resumeConversation(\n this.options.agent,\n {\n conversationId,\n ...(options?.afterSeq !== undefined ? { afterSeq: options.afterSeq } : {}),\n },\n {\n signal,\n onResponse: (response) => {\n this.updateResponseIds(response);\n },\n },\n );\n\n const result = await this.consumeStreamUntilTerminal(events, {\n signal,\n replay: true,\n disconnectMessage: \"Resume stream disconnected.\",\n });\n if (!result.receivedEvent) {\n this.setStatus(\"ready\");\n return;\n }\n if (!result.terminalState) {\n throw this.toStreamDisconnectError(\n undefined,\n \"Stream ended before terminal run event.\",\n );\n }\n if (result.terminalState === \"error\") {\n throw result.terminalError ?? new Error(\"Resume failed.\");\n }\n\n this.setStatus(\"ready\");\n if (result.receivedEvent && result.terminalState) {\n this.emitFinish({\n conversationId,\n isAbort: result.terminalState === \"aborted\",\n });\n }\n } catch (e) {\n if (\n this.destroyed ||\n this.isAbortError(e, signal) ||\n (this.isStreamDisconnectError(e) && this.isPageTeardownLike())\n ) {\n this.setStatus(\"ready\");\n return;\n }\n\n const err = toAgentClientError(e, \"Resume failed.\");\n this.setError(err);\n this.setStatus(\"error\");\n if (this.isStreamDisconnectError(e)) {\n this.options.onDisconnect?.({\n error: err,\n runId: this.lastRunId,\n streamId: this.lastStreamId,\n });\n }\n this.options.onError?.(err);\n } finally {\n this.finishOperation(controller);\n }\n }\n\n // Public mutations.\n\n /** Submits a tool approval decision. */\n async approveToolCall(params: ApproveToolCallParams): Promise<void> {\n const runId = params.runId ?? this.lastRunId;\n if (!runId) {\n throw new Error(\"Cannot submit tool approval response without a runId.\");\n }\n\n await this.client.submitToolApproval({\n agent: this.options.agent,\n runId,\n toolCallId: params.toolCallId,\n decision: params.decision,\n ...(params.note !== undefined ? { note: params.note } : {}),\n ...(params.actorId !== undefined ? { actorId: params.actorId } : {}),\n });\n }\n\n /** Clears the current error. */\n clearError(): void {\n this.setError(undefined);\n this.setStatus(\"ready\");\n }\n\n /** Resets local state to the initial snapshot. */\n reset(): void {\n this.cancelActiveWork();\n this.state = createMessageState(this.initialMessages);\n this.lastResponse = undefined;\n this.lastStructured = undefined;\n this.lastRunId = undefined;\n this.lastStreamId = this.getConfiguredInitialStreamId(this.options);\n this.error = undefined;\n this.status = \"ready\";\n this.lastAppliedSeq = -1;\n this.lastAppliedSeqByStream.clear();\n this.notify();\n }\n\n /** Replaces local messages. */\n setMessages(value: SetMessagesInput): void {\n const current = this.state.messages;\n const nextRaw = typeof value === \"function\" ? value(current) : value;\n const next = this.normalizeMessages(nextRaw);\n this.state = createMessageState(next);\n this.notify();\n }\n\n /** Merges new options into the controller configuration. */\n updateOptions(partial: Partial<AgentChatControllerOptions<TApp, TAgentName>>): void {\n const nextOptions = {\n ...this.options,\n ...partial,\n ...(partial.resume !== undefined &&\n typeof partial.resume === \"object\" &&\n partial.resume !== null\n ? {\n resume: {\n ...(typeof this.options.resume === \"object\" &&\n this.options.resume !== null\n ? this.options.resume\n : {}),\n ...partial.resume,\n },\n }\n : {}),\n ...(partial.optimisticUserMessage &&\n typeof partial.optimisticUserMessage === \"object\" &&\n !Array.isArray(partial.optimisticUserMessage)\n ? {\n optimisticUserMessage: {\n ...(typeof this.options.optimisticUserMessage === \"object\" &&\n this.options.optimisticUserMessage !== null &&\n !Array.isArray(this.options.optimisticUserMessage)\n ? this.options.optimisticUserMessage\n : {}),\n ...partial.optimisticUserMessage,\n },\n }\n : {}),\n };\n\n const shouldResetSession = this.hasSessionConfigurationChanged(this.options, nextOptions);\n this.options = nextOptions;\n\n if (shouldResetSession) {\n this.resetForSessionChange();\n }\n }\n\n /** Destroys the controller. */\n destroy(): void {\n this.cancelActiveWork();\n this.destroyed = true;\n this.listeners.clear();\n }\n\n // Event handling.\n\n /** Applies one streamed event to local state. */\n private applyEvent(ev: ClientEvent, options?: { replay?: boolean }): void {\n this.options.onEvent?.(ev);\n\n // Deduplicates replayed cursors.\n const streamKey =\n typeof ev.streamId === \"string\" && ev.streamId.length > 0\n ? ev.streamId\n : typeof ev.runId === \"string\" && ev.runId.length > 0\n ? ev.runId\n : undefined;\n\n if (typeof ev.seq === \"number\") {\n if (streamKey) {\n const prev = this.lastAppliedSeqByStream.get(streamKey) ?? -1;\n if (ev.seq <= prev) return;\n this.lastAppliedSeqByStream.set(streamKey, ev.seq);\n } else {\n if (ev.seq <= this.lastAppliedSeq) return;\n this.lastAppliedSeq = ev.seq;\n }\n }\n\n // Tracks run and stream ids.\n if (typeof ev.runId === \"string\" && ev.runId.length > 0 && ev.runId !== this.lastRunId) {\n this.lastRunId = ev.runId;\n }\n\n if (ev.type === \"RUN_FINISHED\") {\n const result = (\n ev as unknown as {\n result?: {\n response?: GenerativeModelResponse;\n structured?: DefaultStructuredOutputForAgent<TApp, TAgentName>;\n };\n }\n ).result;\n this.lastResponse = result?.response;\n this.lastStructured = result?.structured;\n }\n\n if (ev.type === \"DATA_PART\") {\n const payload = {\n data: (ev as unknown as { data: unknown }).data,\n ...((ev as unknown as { id?: string }).id\n ? { id: (ev as unknown as { id: string }).id }\n : {}),\n };\n this.options.onData?.(payload);\n }\n\n if (ev.streamId && ev.streamId !== this.lastStreamId) {\n this.lastStreamId = ev.streamId;\n }\n\n if (options?.replay && ev.type === \"RUN_STARTED\") {\n this.reconcileReplayUserMessage(ev.runInput, ev.runId);\n }\n\n // Applies the event to message state.\n this.state = applyEvent(this.state, ev, {\n synthesizeReplayUserMessage: Boolean(options?.replay),\n });\n\n this.notify();\n }\n\n /** Reads streamed events until the stream finishes or a terminal event appears. */\n private async consumeStreamUntilTerminal(\n events: AsyncIterable<ClientEvent>,\n options: { signal: AbortSignal; replay?: boolean; disconnectMessage?: string },\n ): Promise<StreamConsumptionResult> {\n const result: StreamConsumptionResult = {\n receivedEvent: false,\n };\n\n try {\n for await (const event of events) {\n this.throwIfAborted(options.signal);\n result.receivedEvent = true;\n\n if (this.status !== \"streaming\") {\n this.setStatus(\"streaming\");\n }\n\n const terminal = this.getTerminalStateFromEvent(event);\n if (terminal) {\n result.terminalState = terminal.state;\n result.terminalError = terminal.error;\n }\n\n this.applyEvent(event, { replay: options.replay });\n }\n } catch (error) {\n if (this.isAbortError(error, options.signal)) {\n throw error;\n }\n throw this.toStreamDisconnectError(error, options.disconnectMessage);\n }\n\n this.throwIfAborted(options.signal);\n return result;\n }\n\n /** Reads terminal state from one streamed event. */\n private getTerminalStateFromEvent(\n event: ClientEvent,\n ): { state: StreamTerminalState; error?: AgentClientError } | undefined {\n if (event.type === \"RUN_FINISHED\") {\n return { state: \"finished\" };\n }\n if (event.type === \"RUN_ABORTED\") {\n return { state: \"aborted\" };\n }\n if (event.type === \"RUN_ERROR\") {\n return {\n state: \"error\",\n error: toAgentClientError(\n (event as unknown as { error: unknown }).error,\n getEventErrorMessage((event as unknown as { error: unknown }).error),\n ),\n };\n }\n\n return undefined;\n }\n\n // Submission flow.\n\n /** Sends one request through final or stream delivery. */\n private async submitWithInternalOptions(\n runInput: ControllerRunInput,\n internalOptions?: InternalSubmitOptions,\n ): Promise<SendResult> {\n const { signal, controller } = this.startOperation(internalOptions?.signal);\n this.setStatus(\"submitted\");\n this.setError(undefined);\n const context = this.createSubmissionContext(runInput, internalOptions, signal);\n\n try {\n this.warnIfClientHistoryReplacesConversation(context);\n this.applyLocalSubmissionState(context);\n\n const requestInput = this.buildRequestInput(context);\n if (context.useFinalDelivery) {\n return await this.runFinalDelivery(context, requestInput);\n }\n\n return await this.runStreamDelivery(context, requestInput);\n } catch (e) {\n return this.handleSubmissionFailure(e, context);\n } finally {\n this.finishOperation(controller);\n }\n }\n\n /** Builds the mutable context for one submission. */\n private createSubmissionContext(\n runInput: ControllerRunInput,\n internalOptions: InternalSubmitOptions | undefined,\n signal: AbortSignal,\n ): SubmissionContext {\n return {\n signal,\n conversationId:\n typeof runInput.conversationId === \"string\"\n ? runInput.conversationId\n : this.options.conversationId,\n inputValue: runInput.input,\n sendClientHistory:\n typeof runInput.sendClientHistory === \"boolean\"\n ? runInput.sendClientHistory\n : Boolean(this.options.sendClientHistory),\n optimisticLocalId: internalOptions?.reuseOptimisticLocalId,\n optimisticMessageMarkedSent: false,\n optimisticConfig: normalizeOptimisticUserMessageConfig(\n this.options.optimisticUserMessage,\n ),\n preSubmitState: this.state,\n useFinalDelivery: Boolean(internalOptions?.forceRun) || !this.shouldUseStreamDelivery(),\n runInput,\n internalOptions,\n };\n }\n\n /** Warns when client history will replace stored server history. */\n private warnIfClientHistoryReplacesConversation(context: SubmissionContext): void {\n if (\n !context.sendClientHistory ||\n !context.conversationId ||\n context.internalOptions?.replaceLocalId ||\n this.warnedHistoryCombo\n ) {\n return;\n }\n\n this.warnedHistoryCombo = true;\n console.warn(\n \"[better-agent] Using sendClientHistory with conversationId. Client history will replace server-stored history on each request. For server-managed history, remove sendClientHistory.\",\n );\n }\n\n /** Applies retry replacement or optimistic user insertion. */\n private applyLocalSubmissionState(context: SubmissionContext): void {\n const replaceLocalId = context.internalOptions?.replaceLocalId;\n if (replaceLocalId) {\n this.replaceRetryMessage(\n replaceLocalId,\n context.internalOptions?.replaceMessage ?? context.inputValue,\n );\n context.optimisticLocalId = replaceLocalId;\n return;\n }\n\n if (context.optimisticLocalId || !context.optimisticConfig.enabled) {\n return;\n }\n\n const shouldInsertOptimisticMessage =\n (!context.sendClientHistory &&\n this.canOptimisticallyRenderUserTurn(context.inputValue)) ||\n (context.sendClientHistory &&\n this.canOmitSubmittedInputFromSerializedHistory(context.inputValue));\n if (!shouldInsertOptimisticMessage) {\n return;\n }\n\n const optimisticMessage = this.createPendingUserMessage(context.inputValue);\n if (!optimisticMessage) {\n return;\n }\n\n const optimisticLocalId = this.generateMessageId();\n context.optimisticLocalId = optimisticLocalId;\n this.state = createMessageState([\n ...this.state.messages,\n {\n ...optimisticMessage,\n localId: optimisticLocalId,\n },\n ]);\n this.notify();\n }\n\n /** Builds the request input for the next transport call. */\n private buildRequestInput(context: SubmissionContext): PreparedRequestInput {\n return this.prepareInputForRequest(context.inputValue, this.state.messages, {\n sendClientHistory: context.sendClientHistory,\n optimisticLocalId: context.optimisticLocalId,\n serializedHistoryInput: Boolean(context.internalOptions?.serializedHistoryInput),\n });\n }\n\n /** Runs one request through final delivery. */\n private async runFinalDelivery(\n context: SubmissionContext,\n requestInput: PreparedRequestInput,\n ): Promise<SendResult> {\n const result = await this.client.run(\n this.options.agent,\n this.createRunPayload(\n context.runInput,\n requestInput.inputToSend,\n requestInput.serializedClientHistory,\n ) as never,\n {\n onResponse: this.options.onResponse,\n signal: context.signal,\n },\n );\n const normalized = this.normalizeFinalRunResult(result);\n\n this.captureNormalizedRunResult(normalized);\n this.markOptimisticMessageSent(context);\n this.setStatus(\"ready\");\n this.emitFinish({\n isAbort: false,\n conversationId: context.conversationId,\n });\n\n return {\n runId: normalized.runId,\n streamId: this.lastStreamId,\n };\n }\n\n /** Runs one request through streamed delivery. */\n private async runStreamDelivery(\n context: SubmissionContext,\n requestInput: PreparedRequestInput,\n ): Promise<SendResult> {\n const requestOptions = this.buildStreamRequestOptions(\n context.optimisticLocalId,\n () => {\n context.optimisticMessageMarkedSent = true;\n },\n context.signal,\n );\n const stream = this.client.stream(\n this.options.agent,\n this.createRunPayload(\n context.runInput,\n requestInput.inputToSend,\n requestInput.serializedClientHistory,\n ) as never,\n requestOptions,\n );\n const result = await this.consumeStreamUntilTerminal(stream, {\n signal: context.signal,\n disconnectMessage: \"Stream disconnected.\",\n });\n\n if (!result.terminalState) {\n throw this.toStreamDisconnectError(\n undefined,\n \"Stream ended before terminal run event.\",\n );\n }\n if (result.terminalState === \"error\") {\n throw result.terminalError ?? new Error(\"Run failed.\");\n }\n\n this.setStatus(\"ready\");\n this.emitFinish({\n isAbort: result.terminalState === \"aborted\",\n conversationId: context.conversationId,\n });\n return { streamId: this.lastStreamId };\n }\n\n /** Handles aborts, fallback-to-run, and terminal submission errors. */\n private async handleSubmissionFailure(\n error: unknown,\n context: SubmissionContext,\n ): Promise<SendResult> {\n if (\n this.destroyed ||\n this.isAbortError(error, context.signal) ||\n (this.isStreamDisconnectError(error) && this.isPageTeardownLike())\n ) {\n if (this.state !== context.preSubmitState && !context.optimisticMessageMarkedSent) {\n this.state = context.preSubmitState;\n this.notify();\n }\n if (!this.destroyed) {\n this.setStatus(\"ready\");\n }\n return { streamId: this.lastStreamId };\n }\n\n let err = toAgentClientError(error, \"Run failed.\");\n if (!context.internalOptions?.forceRun && this.shouldFallbackToRun(err)) {\n try {\n return await this.submitWithInternalOptions(context.runInput, {\n ...context.internalOptions,\n forceRun: true,\n reuseOptimisticLocalId: context.optimisticLocalId,\n });\n } catch (fallbackError) {\n err = toAgentClientError(fallbackError, \"Run failed.\");\n }\n }\n\n this.applyOptimisticFailure(context, err);\n this.setError(err);\n this.setStatus(\"error\");\n if (this.isStreamDisconnectError(error)) {\n this.options.onDisconnect?.({\n error: err,\n ...(this.lastRunId ? { runId: this.lastRunId } : {}),\n ...(this.lastStreamId ? { streamId: this.lastStreamId } : {}),\n });\n }\n this.options.onError?.(err);\n return this.lastStreamId ? { streamId: this.lastStreamId } : {};\n }\n\n /** Marks the optimistic user message as sent after a successful request. */\n private markOptimisticMessageSent(context: SubmissionContext): void {\n if (!context.optimisticLocalId || context.optimisticMessageMarkedSent) {\n return;\n }\n\n this.updateMessageByLocalId(context.optimisticLocalId, (msg) => {\n const { error: _error, ...rest } = msg;\n return { ...rest, status: \"sent\" };\n });\n context.optimisticMessageMarkedSent = true;\n }\n\n /** Applies optimistic-message failure handling. */\n private applyOptimisticFailure(context: SubmissionContext, err: AgentClientError): void {\n if (!context.optimisticLocalId) {\n return;\n }\n\n if (context.optimisticConfig.onError === \"remove\") {\n this.removeMessageByLocalId(context.optimisticLocalId);\n return;\n }\n\n const failed = this.updateMessageByLocalId(context.optimisticLocalId, (msg) => ({\n ...msg,\n status: \"failed\",\n error: err.message,\n }));\n if (failed) {\n this.options.onOptimisticUserMessageError?.({\n message: failed,\n error: err,\n });\n }\n }\n\n /** Stores the latest run result from final delivery. */\n private captureNormalizedRunResult(result: {\n runId?: string;\n response?: GenerativeModelResponse;\n structured?: unknown;\n }): void {\n if (result.runId) {\n this.lastRunId = result.runId;\n }\n if (result.response) {\n this.lastResponse = result.response;\n this.appendResponseMessages(result.response);\n }\n this.lastStructured = result.structured as\n | DefaultStructuredOutputForAgent<TApp, TAgentName>\n | undefined;\n }\n\n // Operation state.\n private setStatus(status: AgentStatus): void {\n if (this.status === status) return;\n this.status = status;\n this.notify();\n }\n\n /** Stores the latest controller error without notifying listeners. */\n private setError(error: AgentClientError | undefined): void {\n this.error = error;\n }\n\n /** Normalizes unknown failures into an `Error` with a fallback message. */\n private toError(error: unknown, fallback: string): Error {\n return error instanceof Error ? error : new Error(fallback);\n }\n\n /** Starts one controller operation. */\n private startOperation(externalSignal?: AbortSignal): {\n signal: AbortSignal;\n controller: AbortController;\n } {\n this.throwIfDestroyed();\n this.cancelActiveWork();\n const controller = new AbortController();\n this.activeAbortController = controller;\n return {\n controller,\n signal: this.mergeSignals(controller.signal, externalSignal),\n };\n }\n\n /** Clears the tracked active operation if it matches the provided controller. */\n private finishOperation(controller: AbortController): void {\n if (this.activeAbortController === controller) {\n this.activeAbortController = null;\n }\n }\n\n /** Aborts and forgets any in-flight controller operation. */\n private cancelActiveWork(): void {\n this.activeAbortController?.abort();\n this.activeAbortController = null;\n }\n\n /** Merges the controller abort signal with an optional external signal. */\n private mergeSignals(primary: AbortSignal, externalSignal?: AbortSignal): AbortSignal {\n if (!externalSignal) {\n return primary;\n }\n\n const controller = new AbortController();\n const abortFrom = (source: AbortSignal) => {\n if (!controller.signal.aborted) {\n controller.abort(source.reason);\n }\n };\n\n if (primary.aborted) {\n abortFrom(primary);\n } else {\n primary.addEventListener(\"abort\", () => abortFrom(primary), { once: true });\n }\n\n if (externalSignal.aborted) {\n abortFrom(externalSignal);\n } else {\n externalSignal.addEventListener(\"abort\", () => abortFrom(externalSignal), {\n once: true,\n });\n }\n\n return controller.signal;\n }\n\n /** Throws an abort-shaped error when the given signal has already aborted. */\n private throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw this.toAbortError(signal.reason);\n }\n }\n\n /** Rejects work after the controller has been destroyed. */\n private throwIfDestroyed(): void {\n if (this.destroyed) {\n throw new Error(\"AgentChatController has been destroyed.\");\n }\n }\n\n /** Returns `true` when a failure should be treated as an abort. */\n private isAbortError(error: unknown, signal?: AbortSignal): boolean {\n return (\n (signal?.aborted ?? false) ||\n (error instanceof DOMException && error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n }\n\n /** Returns true when a failure came from stream disconnection. */\n private isStreamDisconnectError(error: unknown): error is StreamDisconnectError {\n return error instanceof StreamDisconnectError;\n }\n\n /** Returns true when the page is being torn down during navigation or refresh. */\n private isPageTeardownLike(): boolean {\n return (\n isBrowserPageTearingDown() ||\n (typeof document !== \"undefined\" && document.visibilityState === \"hidden\")\n );\n }\n\n /** Converts an abort reason into a standard `AbortError` instance. */\n private toAbortError(reason?: unknown): Error {\n if (reason instanceof Error) {\n return reason;\n }\n\n try {\n return new DOMException(\n typeof reason === \"string\" ? reason : \"The operation was aborted.\",\n \"AbortError\",\n );\n } catch {\n const error = new Error(\n typeof reason === \"string\" ? reason : \"The operation was aborted.\",\n );\n error.name = \"AbortError\";\n return error;\n }\n }\n\n /** Wraps one failure as a stream disconnect. */\n private toStreamDisconnectError(\n error: unknown,\n fallback = \"Stream disconnected.\",\n ): StreamDisconnectError {\n const base = this.toError(error, fallback);\n return new StreamDisconnectError(base.message, error);\n }\n\n // Message state.\n\n /** Binds an already-visible current user turn to the replay run identity. */\n private reconcileReplayUserMessage(runInput: Record<string, unknown>, runId: string): void {\n const latestMessage = this.state.messages.at(-1);\n if (!latestMessage || latestMessage.role !== \"user\") {\n return;\n }\n\n const replayMessage = this.toReplayUserMessage(runInput, runId);\n if (!replayMessage || this.state.byLocalId.has(replayMessage.localId)) {\n return;\n }\n\n if (!this.isSameUserTurn(latestMessage, replayMessage)) {\n return;\n }\n\n const nextMessages = this.state.messages.slice();\n nextMessages[nextMessages.length - 1] = {\n ...latestMessage,\n localId: replayMessage.localId,\n ...(replayMessage.id !== undefined ? { id: replayMessage.id } : {}),\n status: \"sent\",\n };\n this.state = createMessageState(nextMessages);\n }\n\n /** Reconstructs the replayed current user turn from one RUN_STARTED event. */\n private toReplayUserMessage(\n runInput: Record<string, unknown>,\n runId: string,\n ): UIMessage | undefined {\n const input = runInput.input;\n\n if (typeof input === \"string\") {\n return {\n localId: `user_run:${runId}`,\n id: `user_run:${runId}`,\n role: \"user\",\n parts: [{ type: \"text\", text: input, state: \"complete\" }],\n status: \"sent\",\n };\n }\n\n const replayInput = Array.isArray(input)\n ? input\n : this.isSingleReplayMessageInput(input)\n ? [input]\n : undefined;\n if (!replayInput) {\n return undefined;\n }\n\n let index = 0;\n const replayMessages = fromModelMessages(replayInput as GenerativeModelInputItem[], {\n generateId: () => `user_run:${runId}:${(index++).toString(36)}`,\n });\n const latestUserMessage = [...replayMessages]\n .reverse()\n .find((message) => message.role === \"user\");\n\n return latestUserMessage ? { ...latestUserMessage, status: \"sent\" } : undefined;\n }\n\n /** Detects one structured replay message item. */\n private isSingleReplayMessageInput(input: unknown): input is {\n type: \"message\";\n role?: string;\n content: string | unknown[];\n } {\n return (\n typeof input === \"object\" &&\n input !== null &&\n (input as { type?: unknown }).type === \"message\" &&\n (typeof (input as { content?: unknown }).content === \"string\" ||\n Array.isArray((input as { content?: unknown }).content))\n );\n }\n\n /** Matches one already-visible user turn to its replayed equivalent. */\n private isSameUserTurn(current: UIMessage, replayed: UIMessage): boolean {\n return JSON.stringify(current.parts) === JSON.stringify(replayed.parts);\n }\n\n /** Generates a local message id using the configured factory when present. */\n private generateMessageId(message?: Partial<UIMessageInput>): string {\n return this.options.generateMessageId?.(message) ?? makeLocalMessageId();\n }\n\n /** Ensures every incoming UI message has a stable local id. */\n private normalizeMessages(list: UIMessageInput[]): UIMessage[] {\n return list.map((message) => ({\n ...message,\n localId: message.localId ?? this.generateMessageId(message),\n }));\n }\n\n /** Detects option changes that require resetting conversation session state. */\n private hasSessionConfigurationChanged(\n prev: AgentChatControllerOptions<TApp, TAgentName>,\n next: AgentChatControllerOptions<TApp, TAgentName>,\n ): boolean {\n return (\n prev.agent !== next.agent ||\n prev.conversationId !== next.conversationId ||\n prev.hydrateFromServer !== next.hydrateFromServer ||\n Boolean(prev.resume) !== Boolean(next.resume) ||\n (typeof prev.resume === \"object\" ? prev.resume.streamId : undefined) !==\n (typeof next.resume === \"object\" ? next.resume.streamId : undefined) ||\n (typeof prev.resume === \"object\" ? prev.resume.afterSeq : undefined) !==\n (typeof next.resume === \"object\" ? next.resume.afterSeq : undefined)\n );\n }\n\n /** Resets controller state after a session-defining option changes. */\n private resetForSessionChange(): void {\n this.cancelActiveWork();\n const normalized = this.normalizeMessages(this.options.initialMessages ?? []);\n this.state = createMessageState(normalized);\n this.initialMessages = normalized;\n this.lastResponse = undefined;\n this.lastStructured = undefined;\n this.lastRunId = undefined;\n this.lastStreamId = this.getConfiguredInitialStreamId(this.options);\n this.error = undefined;\n this.status = \"ready\";\n this.lastAppliedSeq = -1;\n this.lastAppliedSeqByStream.clear();\n this.warnedHistoryCombo = false;\n this.initialized = false;\n this.notify();\n this.init();\n }\n\n /** Reads the initial resume stream id from controller options. */\n private getConfiguredInitialStreamId(options: { resume?: ResumeOption }): string | undefined {\n return typeof options.resume === \"object\" && options.resume !== null\n ? options.resume.streamId\n : undefined;\n }\n\n /** Returns one message by local id from the current message state. */\n private getMessageByLocalId(localId: string): UIMessage | undefined {\n const idx = this.state.byLocalId.get(localId);\n return idx === undefined ? undefined : this.state.messages[idx];\n }\n\n /** Updates one message by local id and notifies listeners when found. */\n private updateMessageByLocalId(\n localId: string,\n updater: (msg: UIMessage) => UIMessage,\n ): UIMessage | undefined {\n const idx = this.state.byLocalId.get(localId);\n if (idx === undefined) return undefined;\n const current = this.state.messages[idx];\n if (!current) return undefined;\n const next = this.state.messages.slice();\n next[idx] = updater(current);\n this.state = createMessageState(next);\n this.notify();\n return next[idx];\n }\n\n /** Removes one local message from state and notifies listeners. */\n private removeMessageByLocalId(localId: string): void {\n const idx = this.state.byLocalId.get(localId);\n if (idx === undefined) return;\n const next = this.state.messages.filter((msg) => msg.localId !== localId);\n this.state = createMessageState(next);\n this.notify();\n }\n\n // Request building.\n\n /** Resolves the effective delivery mode for the next submission. */\n private shouldUseStreamDelivery(): boolean {\n if (this.options.delivery === \"stream\") return true;\n if (this.options.delivery === \"final\") return false;\n return true; // `auto` defaults to streaming.\n }\n\n /** Detects stream capability errors that should retry through `run()`. */\n private shouldFallbackToRun(error: AgentClientError): boolean {\n if (this.options.delivery !== \"auto\") return false;\n const message = error.message.toLowerCase();\n return (\n message.includes(\"does not support streaming generation\") ||\n message.includes(\"streaming generation is not supported\") ||\n message.includes(\"streaming is not supported\")\n );\n }\n\n /** Appends model response messages to local state after final delivery. */\n private appendResponseMessages(response: GenerativeModelResponse): void {\n const responseMessages = getMessagesFromResponse(response).map((msg, i) => ({\n ...msg,\n localId: this.generateMessageId(msg),\n ...(msg.id ? {} : { id: `response_${i.toString(36)}` }),\n }));\n\n if (responseMessages.length === 0) return;\n const nextMessages = [...this.state.messages, ...responseMessages];\n this.state = createMessageState(nextMessages);\n this.notify();\n }\n\n /** Normalizes supported final-run response shapes into one controller shape. */\n private normalizeFinalRunResult(payload: unknown): {\n runId?: string;\n response?: GenerativeModelResponse;\n structured?: unknown;\n } {\n if (typeof payload !== \"object\" || payload === null) return {};\n\n const record = payload as Record<string, unknown>;\n const next: { runId?: string; response?: GenerativeModelResponse; structured?: unknown } =\n {};\n\n if (typeof record.runId === \"string\") next.runId = record.runId;\n\n const nestedResponse =\n typeof record.result === \"object\" &&\n record.result !== null &&\n typeof (record.result as { response?: unknown }).response === \"object\" &&\n (record.result as { response?: unknown }).response !== null\n ? ((record.result as { response: GenerativeModelResponse })\n .response as GenerativeModelResponse)\n : undefined;\n\n const maybeResponse =\n nestedResponse ??\n (typeof record.response === \"object\" && record.response !== null\n ? (record.response as GenerativeModelResponse)\n : \"output\" in record && Array.isArray(record.output)\n ? (record as unknown as GenerativeModelResponse)\n : undefined);\n\n if (maybeResponse) next.response = maybeResponse;\n if (\"structured\" in record) next.structured = record.structured;\n return next;\n }\n\n /** Builds the input payload, optionally serializing client history into it. */\n private prepareInputForRequest(\n inputValue: unknown,\n baseMessages: UIMessage[],\n options: {\n sendClientHistory: boolean;\n optimisticLocalId?: string;\n serializedHistoryInput: boolean;\n },\n ): {\n inputToSend: unknown;\n serializedClientHistory: boolean;\n } {\n if (!options.sendClientHistory) {\n return { inputToSend: inputValue, serializedClientHistory: false };\n }\n\n if (options.serializedHistoryInput) {\n return {\n inputToSend: inputValue,\n serializedClientHistory: true,\n };\n }\n\n const preparedMessages = this.options.prepareMessages?.({\n messages: baseMessages,\n input: inputValue,\n });\n if (preparedMessages) {\n return {\n inputToSend: preparedMessages,\n serializedClientHistory: true,\n };\n }\n\n const serializedMessages = toModelMessages(baseMessages);\n const inputItems = this.normalizeInputItems(inputValue);\n\n if (typeof inputValue === \"string\") {\n return {\n inputToSend: options.optimisticLocalId\n ? serializedMessages\n : [\n ...serializedMessages,\n { type: \"message\", role: \"user\", content: inputValue },\n ],\n serializedClientHistory: true,\n };\n }\n\n if (inputItems) {\n return {\n inputToSend:\n options.optimisticLocalId &&\n this.canOmitSubmittedInputFromSerializedHistory(inputValue)\n ? serializedMessages\n : [...serializedMessages, ...inputItems],\n serializedClientHistory: true,\n };\n }\n\n return {\n inputToSend: inputValue,\n serializedClientHistory: false,\n };\n }\n\n /** Builds the run payload for one request. */\n private createRunPayload(\n runInput: ControllerRunInput,\n inputToSend: unknown,\n serializedClientHistory: boolean,\n ): Record<string, unknown> {\n const conversationId =\n typeof runInput.conversationId === \"string\"\n ? runInput.conversationId\n : this.options.conversationId;\n const modelOptions = mergeModelOptions(\n this.options.modelOptions as Record<string, unknown> | undefined,\n runInput.modelOptions as Record<string, unknown> | undefined,\n );\n const { modelOptions: _modelOptions, ...restRunInput } = runInput;\n\n return {\n ...restRunInput,\n input: inputToSend,\n modelOptions: Object.keys(modelOptions).length > 0 ? modelOptions : undefined,\n conversationId,\n context:\n runInput.context !== undefined || this.options.context !== undefined\n ? (runInput.context ?? this.options.context)\n : undefined,\n replaceHistory: serializedClientHistory && Boolean(conversationId) ? true : undefined,\n };\n }\n\n // Input normalization.\n\n /** Builds stream request hooks for ids, callbacks, and optimistic updates. */\n private buildStreamRequestOptions(\n optimisticLocalId: string | undefined,\n onMarkedSent: () => void,\n signal?: AbortSignal,\n ): Record<string, unknown> | undefined {\n const hasCallbacks =\n this.options.onResponse || this.options.onToolCall || this.options.toolHandlers;\n if (!hasCallbacks && !optimisticLocalId && !signal) return undefined;\n\n return {\n signal,\n onResponse: (response: Response) => {\n this.updateResponseIds(response);\n this.options.onResponse?.(response);\n if (response.ok && optimisticLocalId) {\n this.updateMessageByLocalId(optimisticLocalId, (msg) => {\n const { error: _error, ...rest } = msg;\n return { ...rest, status: \"sent\" };\n });\n onMarkedSent();\n }\n },\n onToolCall: this.options.onToolCall,\n toolHandlers: this.options.toolHandlers,\n };\n }\n\n /** Replaces one user message slot with a pending retry version. */\n private replaceRetryMessage(replaceLocalId: string, inputValue: unknown): void {\n const current = this.state.messages;\n const idx = this.state.byLocalId.get(replaceLocalId);\n const nextMessage = this.createPendingUserMessage(inputValue) ?? {\n localId: replaceLocalId,\n role: \"user\",\n parts: [{ type: \"text\", text: String(inputValue ?? \"\") }],\n status: \"pending\",\n };\n\n let nextMessages = current;\n if (idx === undefined) {\n nextMessages = [...current, nextMessage];\n } else {\n const copy = current.slice(0, idx);\n copy.push(nextMessage);\n nextMessages = copy;\n }\n\n if (nextMessages !== current) {\n this.state = createMessageState(nextMessages);\n this.notify();\n }\n }\n\n /** Derives a pending user message from retry input when possible. */\n private createPendingUserMessage(inputValue: unknown): UIMessage | undefined {\n if (typeof inputValue === \"string\") {\n return {\n localId: this.generateMessageId(),\n role: \"user\",\n parts: [{ type: \"text\", text: inputValue }],\n status: \"pending\",\n };\n }\n\n if (typeof inputValue === \"object\" && inputValue !== null && \"localId\" in inputValue) {\n const message = inputValue as UIMessage;\n if (message.role === \"user\" && Array.isArray(message.parts)) {\n const { error: _error, ...rest } = message;\n return {\n ...rest,\n status: \"pending\",\n };\n }\n }\n\n const items = this.normalizeInputItems(inputValue);\n if (!items) {\n return undefined;\n }\n\n const messages = fromModelMessages(items);\n const latestUser = [...messages].reverse().find((message) => message.role === \"user\");\n if (!latestUser) {\n return undefined;\n }\n\n const { error: _error, ...rest } = latestUser;\n return {\n ...rest,\n status: \"pending\",\n };\n }\n\n /** Normalizes supported input shapes into input items when possible. */\n private normalizeInputItems(inputValue: unknown): GenerativeModelInputItem[] | undefined {\n if (Array.isArray(inputValue)) {\n return inputValue as GenerativeModelInputItem[];\n }\n\n if (\n typeof inputValue === \"object\" &&\n inputValue !== null &&\n typeof (inputValue as { type?: unknown }).type === \"string\"\n ) {\n return [inputValue as GenerativeModelInputItem];\n }\n\n return undefined;\n }\n\n /** Returns true when input is safely representable as one optimistic user turn. */\n private canOptimisticallyRenderUserTurn(inputValue: unknown): boolean {\n if (typeof inputValue === \"string\") {\n return true;\n }\n\n if (typeof inputValue === \"object\" && inputValue !== null && \"localId\" in inputValue) {\n const message = inputValue as UIMessage;\n return message.role === \"user\" && Array.isArray(message.parts);\n }\n\n const items = this.normalizeInputItems(inputValue);\n if (!items || items.length !== 1) {\n return false;\n }\n\n const [item] = items;\n return item?.type === \"message\" && (item.role === undefined || item.role === \"user\");\n }\n\n /** Returns true when serialized history can reuse the optimistic user turn. */\n private canOmitSubmittedInputFromSerializedHistory(inputValue: unknown): boolean {\n if (typeof inputValue === \"string\") {\n return true;\n }\n\n if (typeof inputValue === \"object\" && inputValue !== null && \"localId\" in inputValue) {\n const message = inputValue as UIMessage;\n return message.role === \"user\" && Array.isArray(message.parts);\n }\n\n const items = this.normalizeInputItems(inputValue);\n if (!items || items.length !== 1) {\n return false;\n }\n\n const [item] = items;\n return item?.type === \"message\" && item.role === \"user\";\n }\n\n // Callback emission.\n\n /** Calls `onFinish` with the latest completion data. */\n private emitFinish(overrides: {\n streamId?: string;\n conversationId?: string;\n isAbort: boolean;\n }): void {\n const response = this.lastResponse;\n const params = {\n messages: this.state.messages,\n isAbort: overrides.isAbort,\n } as OnFinishParams<TApp, TAgentName>;\n\n if (this.lastRunId) {\n params.runId = this.lastRunId;\n }\n\n const streamIdToUse = overrides.streamId ?? this.lastStreamId;\n if (streamIdToUse) {\n params.streamId = streamIdToUse;\n }\n\n const conversationId = overrides.conversationId ?? this.options.conversationId;\n if (conversationId) {\n params.conversationId = conversationId;\n }\n\n if (response) {\n params.response = response;\n params.finishReason = response.finishReason;\n params.usage = response.usage;\n }\n\n if (this.lastStructured !== undefined) {\n (params as OnFinishParams<TApp, TAgentName> & { structured: unknown }).structured =\n this.lastStructured;\n }\n\n this.options.onFinish?.(params);\n }\n}\n\n/**\n * Creates an `AgentChatController`.\n */\nexport function createAgentChatController<\n TApp,\n TAgentName extends AgentNameFromApp<TApp> = AgentNameFromApp<TApp>,\n>(\n client: BetterAgentClient<TApp>,\n options: AgentChatControllerOptions<TApp, TAgentName>,\n): AgentChatController<TApp, TAgentName> {\n return new AgentChatController<TApp, TAgentName>(client, options);\n}\n"],"mappings":";AAOA,MAAM,yBAAyB;AAC3B,KAAI,OAAO,WAAW,YAClB,QAAO,mBAAmB;;;AAKlC,MAAa,sCAA4C;AACrD,KAAI,OAAO,WAAW,YAClB;AAGJ,QAAO,qBAAqB;AAC5B,KAAI,OAAO,0BACP;AAGJ,QAAO,4BAA4B;AACnC,QAAO,iBAAiB,YAAY,iBAAiB;AACrD,QAAO,iBAAiB,gBAAgB,iBAAiB;;;AAI7D,MAAa,iCACT,OAAO,WAAW,eAAe,OAAO,qBAAqB;;;;;ACEjE,IAAa,wBAAb,cAA2C,MAAM;CAC7C;CAEA,YAAY,SAAiB,OAAiB;AAC1C,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,QAAQ;;;AAIrB,MAAM,YAAY,UACd,OAAO,UAAU,YAAY,UAAU;AAE3C,MAAM,sBAAsB,YACxB,QAAQ,QAAQ,oCAAoC,GAAG;AAE3D,MAAM,kBAAkB,UAAuC;AAC3D,KAAI,iBAAiB,SAAS,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,MAAM,CACnF,QAAO,mBAAmB,MAAM,QAAQ;AAE5C,KAAI,CAAC,SAAS,MAAM,CAAE,QAAO;CAE7B,MAAM,UACD,OAAO,MAAM,YAAY,YAAY,MAAM,WAC3C,OAAO,MAAM,WAAW,YAAY,MAAM,UAC1C,OAAO,MAAM,UAAU,YAAY,MAAM;AAE9C,QAAO,OAAO,YAAY,YAAY,QAAQ,MAAM,CAAC,SAAS,IACxD,mBAAmB,QAAQ,GAC3B;;;AAIV,MAAa,sBACT,OACA,kBAAkB,kBACC;AACnB,KAAI,iBAAiB,OAAO;EACxB,MAAM,WAAW;AACjB,WAAS,UAAU,mBAAmB,SAAS,QAAQ;AACvD,MAAI,OAAO,SAAS,WAAW,YAAY,SAAS,OAAO,SAAS,EAChE,UAAS,SAAS,mBAAmB,SAAS,OAAO;AAEzD,MAAI,SAAS,QAAQ,OAAW,UAAS,MAAM;AAC/C,SAAO;;CAGX,MAAM,UAAU,eAAe,MAAM,IAAI;CACzC,MAAM,OAAO,IAAI,MAAM,QAAQ;AAC/B,MAAK,MAAM;AAEX,KAAI,CAAC,SAAS,MAAM,CAAE,QAAO;AAE7B,KAAI,OAAO,MAAM,SAAS,SAAU,MAAK,OAAO,MAAM;AACtD,KAAI,OAAO,MAAM,WAAW,SAAU,MAAK,SAAS,MAAM;AAC1D,KAAI,OAAO,MAAM,cAAc,UAAW,MAAK,YAAY,MAAM;AACjE,KAAI,OAAO,MAAM,UAAU,SAAU,MAAK,QAAQ,MAAM;AACxD,KAAI,OAAO,MAAM,WAAW,SAAU,MAAK,SAAS,mBAAmB,MAAM,OAAO;AACpF,KAAI,OAAO,MAAM,YAAY,SAAU,MAAK,UAAU,MAAM;AAC5D,KAAI,MAAM,QAAQ,MAAM,OAAO,CAAE,MAAK,SAAS,MAAM;AACrD,KAAI,SAAS,MAAM,QAAQ,CAAE,MAAK,UAAU,MAAM;AAClD,KAAI,MAAM,QAAQ,MAAM,MAAM,CAAE,MAAK,QAAQ,MAAM;AAEnD,QAAO;;;;;AAMX,MAAa,wBAAwB,UAA2B,mBAAmB,MAAM,CAAC;;;;AC7F1F,MAAM,wBAAwB,SAC1B,KAAK,qBAAqB,UAC1B,OAAO,KAAK,qBAAqB,YACjC,KAAK,qBAAqB,OACpB,EAAE,kBAAkB,KAAK,kBAA6C,GACtE,EAAE;;AAGZ,MAAa,uBAAuB,SAAwC;AACxE,KACI,OAAO,SAAS,YAChB,SAAS,QACT,OAAQ,KAA4B,SAAS,SAE7C,QAAO;CAGX,MAAM,SAAS;AAUf,SAAQ,OAAO,MAAf;EACI,KAAK,OACD,QAAO,OAAO,OAAO,SAAS,WACxB;GACI,MAAM;GACN,MAAM,OAAO;GACb,GAAG,qBAAqB,OAAO;GAC/B,OAAO;GACV,GACD;EACV,KAAK,QACD,QAAO;GACH,MAAM;GACN,QAAQ,OAAO;GACf,GAAG,qBAAqB,OAAO;GAC/B,OAAO;GACV;EACL,KAAK,OACD,QAAO;GACH,MAAM;GACN,QAAQ,OAAO;GACf,GAAG,qBAAqB,OAAO;GAC/B,OAAO;GACV;EACL,KAAK,QACD,QAAO;GACH,MAAM;GACN,QAAQ,OAAO;GACf,GAAG,qBAAqB,OAAO;GAC/B,OAAO;GACV;EACL,KAAK,QACD,QAAO;GACH,MAAM;GACN,QAAQ,OAAO;GACf,GAAG,qBAAqB,OAAO;GAC/B,OAAO;GACV;EACL,KAAK,YACD,QAAO,MAAM,QAAQ,OAAO,UAAU,IAClC,OAAO,UAAU,OAAO,UAAU,OAAO,UAAU,SAAS,GAC1D;GACI,MAAM;GACN,WAAW,OAAO;GAClB,GAAG,qBAAqB,OAAO;GAC/B,OAAO;GACV,GACD;EACV,KAAK,aACD,QAAO,OAAO,OAAO,SAAS,WACxB;GACI,MAAM;GACN,MAAM,OAAO;GACb,GAAI,MAAM,QAAQ,OAAO,SAAS,GAC5B,EACI,UAAU,OAAO,UAIpB,GACD,EAAE;GACR,GAAG,qBAAqB,OAAO;GAC/B,OAAO;GACV,GACD;EACV,KAAK,YACD,QAAO,OAAO,OAAO,SAAS,aACzB,OAAO,eAAe,aAAa,OAAO,eAAe,UACxD;GACI,MAAM;GACN,MAAM,OAAO;GACb,YAAY,OAAO;GACnB,GAAI,OAAO,OAAO,aAAa,WAAW,EAAE,UAAU,OAAO,UAAU,GAAG,EAAE;GAC5E,GAAG,qBAAqB,OAAO;GAC/B,OAAO;GACV,GACD;EACV,QACI,QAAO;;;AAMnB,MAAM,qBACF,YAYC;CACD,MAAM,MAWF,EAAE;AACN,MAAK,MAAM,QAAQ,QAAQ,OAAO;EAC9B,MAAM,mBAAmB,sBAAsB,OAAO,KAAK,mBAAmB;AAE9E,MAAI,KAAK,SAAS,QAAQ;AACtB,OAAI,KAAK;IACL,MAAM;IACN,MAAM,KAAK;IACX,GAAI,qBAAqB,SAAY,EAAE,kBAAkB,GAAG,EAAE;IACjE,CAAC;AACF;;AAEJ,MAAI,KAAK,SAAS,SAAS;AACvB,OAAI,KAAK,OAAO,SAAS,OAAO;AAC5B,QAAI,KAAK;KACL,MAAM;KACN,QAAQ;MACJ,MAAM;MACN,KAAK,KAAK,OAAO;MACpB;KACD,GAAI,qBAAqB,SAAY,EAAE,kBAAkB,GAAG,EAAE;KACjE,CAAC;AACF;;AAEJ,OAAI,KAAK;IACL,MAAM;IACN,QAAQ;KACJ,MAAM;KACN,MAAM,KAAK,OAAO;KAClB,UAAU,KAAK,OAAO,YAAY;KACrC;IACD,GAAI,qBAAqB,SAAY,EAAE,kBAAkB,GAAG,EAAE;IACjE,CAAC;AACF;;AAEJ,MAAI,KAAK,SAAS,SAAS;AACvB,OAAI,KAAK,OAAO,SAAS,OAAO;AAC5B,QAAI,KAAK;KACL,MAAM;KACN,QAAQ;MACJ,MAAM;MACN,KAAK,KAAK,OAAO;MACpB;KACD,GAAI,qBAAqB,SAAY,EAAE,kBAAkB,GAAG,EAAE;KACjE,CAAC;AACF;;AAEJ,OAAI,KAAK;IACL,MAAM;IACN,QAAQ;KACJ,MAAM;KACN,MAAM,KAAK,OAAO;KAClB,UAAU,KAAK,OAAO,YAAY;KACrC;IACD,GAAI,qBAAqB,SAAY,EAAE,kBAAkB,GAAG,EAAE;IACjE,CAAC;AACF;;AAEJ,MAAI,KAAK,SAAS,QAAQ;AACtB,OAAI,KAAK,OAAO,SAAS,OAAO;AAC5B,QAAI,KAAK;KACL,MAAM;KACN,QAAQ;MACJ,MAAM;MACN,KAAK,KAAK,OAAO;MACjB,GAAI,KAAK,OAAO,WAAW,EAAE,UAAU,KAAK,OAAO,UAAU,GAAG,EAAE;MAClE,GAAI,KAAK,OAAO,WAAW,EAAE,UAAU,KAAK,OAAO,UAAU,GAAG,EAAE;MACrE;KACD,GAAI,qBAAqB,SAAY,EAAE,kBAAkB,GAAG,EAAE;KACjE,CAAC;AACF;;AAEJ,OAAI,KAAK,OAAO,SAAS,iBAAiB;AACtC,QAAI,KAAK;KACL,MAAM;KACN,QAAQ;MACJ,MAAM;MACN,KAAK,KAAK,OAAO;MACjB,GAAI,KAAK,OAAO,WAAW,EAAE,UAAU,KAAK,OAAO,UAAU,GAAG,EAAE;MAClE,GAAI,KAAK,OAAO,WAAW,EAAE,UAAU,KAAK,OAAO,UAAU,GAAG,EAAE;MACrE;KACD,GAAI,qBAAqB,SAAY,EAAE,kBAAkB,GAAG,EAAE;KACjE,CAAC;AACF;;AAEJ,OAAI,KAAK;IACL,MAAM;IACN,QAAQ;KACJ,MAAM;KACN,MAAM,KAAK,OAAO;KAClB,UAAU,KAAK,OAAO;KACtB,GAAI,KAAK,OAAO,WAAW,EAAE,UAAU,KAAK,OAAO,UAAU,GAAG,EAAE;KACrE;IACD,GAAI,qBAAqB,SAAY,EAAE,kBAAkB,GAAG,EAAE;IACjE,CAAC;AACF;;AAEJ,MAAI,KAAK,SAAS,SAAS;AACvB,OAAI,KAAK,OAAO,SAAS,OAAO;AAC5B,QAAI,KAAK;KACL,MAAM;KACN,QAAQ;MACJ,MAAM;MACN,KAAK,KAAK,OAAO;MACpB;KACD,GAAI,qBAAqB,SAAY,EAAE,kBAAkB,GAAG,EAAE;KACjE,CAAC;AACF;;AAEJ,OAAI,KAAK;IACL,MAAM;IACN,QAAQ;KACJ,MAAM;KACN,MAAM,KAAK,OAAO;KAClB,UAAU,KAAK,OAAO,YAAY;KACrC;IACD,GAAI,qBAAqB,SAAY,EAAE,kBAAkB,GAAG,EAAE;IACjE,CAAC;AACF;;AAEJ,MAAI,KAAK,SAAS,aAAa;AAC3B,OAAI,KAAK;IACL,MAAM;IACN,WAAW,KAAK;IAChB,GAAI,qBAAqB,SAAY,EAAE,kBAAkB,GAAG,EAAE;IACjE,CAAC;AACF;;AAEJ,MAAI,KAAK,SAAS,cAAc;AAC5B,OAAI,KAAK;IACL,MAAM;IACN,MAAM,KAAK;IACX,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,UAAU,GAAG,EAAE;IACpD,GAAI,qBAAqB,SAAY,EAAE,kBAAkB,GAAG,EAAE;IACjE,CAAC;AACF;;AAEJ,MAAI,KAAK,SAAS,YACd,KAAI,KAAK;GACL,MAAM;GACN,MAAM,KAAK;GACX,YAAY,KAAK;GACjB,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,UAAU,GAAG,EAAE;GACpD,GAAI,qBAAqB,SAAY,EAAE,kBAAkB,GAAG,EAAE;GACjE,CAAC;;AAGV,QAAO;;;AAIX,MAAa,mBACT,SAaA,KAAK,SAAS,YAAY;CACtB,MAAM,QAAQ,kBAAkB,QAAQ;CACxC,MAAM,QAWF,EAAE;AAEN,KAAI,MAAM,SAAS,GAAG;EAClB,MAAM,aAAa,MAAM,MAAM,SAAS,KAAK,SAAS,OAAO;AAC7D,QAAM,KAAK;GACP,MAAM;GACN,MAAM,QAAQ;GACd,SACI,cAAc,MAAM,WAAW,KAAK,MAAM,IAAI,SAAS,SACjD,QACA,MAAM,GAAG;GACtB,CAAC;;CAGN,MAAM,iCAAiB,IAAI,KAAqB;AAChD,MAAK,MAAM,QAAQ,QAAQ,OAAO;AAC9B,MAAI,KAAK,SAAS,YACd;EAGJ,MAAM,WAAW,KAAK;AAMtB,MAJI,aACC,KAAK,WAAW,aACb,KAAK,WAAW,WAChB,KAAK,UAAU,aAEnB,gBAAe,IAAI,KAAK,QAAQ,SAAS;;AAIjD,MAAK,MAAM,QAAQ,QAAQ,OAAO;AAC9B,MAAI,KAAK,SAAS,cACd;EAGJ,MAAM,WAAW,eAAe,IAAI,KAAK,OAAO;AAChD,MAAI,CAAC,YAAa,KAAK,WAAW,aAAa,KAAK,WAAW,QAC3D;AAGJ,QAAM,KAAK;GACP,MAAM;GACN,MAAM;GACN,QAAQ,KAAK;GACb,QAAQ,KAAK;GACb,GAAI,KAAK,WAAW,UAAU,EAAE,SAAS,MAAM,GAAG,EAAE;GACvD,CAAC;;AAGN,QAAO;EACT;AAIN,MAAM,oBAAoB,YAAiD;AACvE,KAAI,OAAO,YAAY,SACnB,QAAO,CAAC;EAAE,MAAM;EAAQ,MAAM;EAAS,OAAO;EAAY,CAAC;AAG/D,QAAO,QACF,KAAK,SAAS,oBAAoB,KAAK,CAAC,CACxC,QAAQ,SAAgC,SAAS,KAAK;;AAG/D,MAAM,gCACF,SAEA,KAAK,SAAS,0BACb,KAAK,SAAS,eAAe,OAAO,UAAU,eAAe,KAAK,MAAM,SAAS;;AAGtF,MAAa,qBACT,UACA,YACc;CACd,MAAM,aAAa,SAAS,cAAc;CAC1C,MAAM,SAAsB,EAAE;CAC9B,IAAI;AAEJ,MAAK,MAAM,QAAQ,UAAU;AACzB,MAAI,KAAK,SAAS,WAAW;GACzB,MAAM,QAAQ,iBAAiB,KAAK,QAAQ;AAE5C,OAAI,MAAM,WAAW,EACjB;AAGJ,UAAO,KAAK;IACR,SAAS,YAAY;IACrB,MAAM,KAAK,QAAQ;IACnB;IACH,CAAC;AACF,kCACK,KAAK,QAAQ,YAAY,cAAc,OAAO,SAAS,IAAI;AAChE;;EAGJ,MAAM,SAAS,KAAK,UAAU,UAAU;EACxC,MAAM,YAA6B,CAC/B;GACI,MAAM;GACN,QAAQ,KAAK;GACb,MAAM,KAAK;GACX;GACA,OAAO;GACV,EACD;GACI,MAAM;GACN,QAAQ,KAAK;GACb,QAAQ,KAAK;GACb;GACH,CACJ;AAED,MAAI,gCAAgC,QAAW;GAC3C,MAAM,UAAU,OAAO;AACvB,OAAI,SAAS,SAAS,aAAa;AAC/B,WAAO,+BAA+B;KAClC,GAAG;KACH,OAAO,CAAC,GAAG,QAAQ,OAAO,GAAG,UAAU;KAC1C;AACD;;;AAIR,SAAO,KAAK;GACR,SAAS,YAAY;GACrB,MAAM;GACN,OAAO;GACV,CAAC;AACF,gCAA8B,OAAO,SAAS;;AAGlD,QAAO;;;AAIX,MAAa,yBACT,OACA,YACc;CACd,MAAM,aAAa,SAAS,cAAc;CAC1C,MAAM,SAAsB,EAAE;CAC9B,IAAI;AAEJ,MAAK,MAAM,QAAQ,OAAO;AACtB,MAAI,KAAK,SAAS,WAAW;GACzB,MAAM,QAAQ,iBAAiB,KAAK,QAAQ;AAC5C,OAAI,MAAM,WAAW,EACjB;AAGJ,UAAO,KAAK;IACR,SAAS,YAAY;IACrB,MAAM,KAAK,QAAQ;IACnB;IACH,CAAC;AACF,kCACK,KAAK,QAAQ,YAAY,cAAc,OAAO,SAAS,IAAI;AAChE;;AAGJ,MAAI,KAAK,SAAS,eAAe,CAAC,6BAA6B,KAAK,EAAE;GAClE,MAAM,OAAsB;IACxB,MAAM;IACN,QAAQ,KAAK;IACb,MAAM,KAAK;IACX,MAAM,KAAK;IACX,QAAQ;IACR,OAAO;IACV;AAED,OAAI,gCAAgC,QAAW;IAC3C,MAAM,UAAU,OAAO;AACvB,QAAI,SAAS,SAAS,aAAa;AAC/B,YAAO,+BAA+B;MAClC,GAAG;MACH,OAAO,CAAC,GAAG,QAAQ,OAAO,KAAK;MAClC;AACD;;;AAIR,UAAO,KAAK;IACR,SAAS,YAAY;IACrB,MAAM;IACN,OAAO,CAAC,KAAK;IAChB,CAAC;AACF,iCAA8B,OAAO,SAAS;AAC9C;;EAGJ,IAAI,4BAA4B;AAChC,OAAK,IAAI,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;GACxD,MAAM,UAAU,OAAO;AACvB,OAAI,CAAC,WAAW,QAAQ,SAAS,YAC7B;GAGJ,MAAM,YAAY,QAAQ,MAAM,WAC3B,SAAS,KAAK,SAAS,eAAe,KAAK,WAAW,KAAK,OAC/D;AACD,OAAI,YAAY,EACZ;GAGJ,MAAM,eAAe,QAAQ,MAAM;AACnC,OAAI,CAAC,gBAAgB,aAAa,SAAS,YACvC;GAGJ,MAAM,SAAS,KAAK,UAAU,UAAU;GACxC,MAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,SAAM,aAAa;IACf,GAAG;IACH,GAAI,aAAa,SAAS,SAAY,EAAE,MAAM,KAAK,MAAM,GAAG,EAAE;IAC9D;IACA,OAAO;IACV;AACD,SAAM,OAAO,YAAY,GAAG,GAAG;IAC3B,MAAM;IACN,QAAQ,KAAK;IACb,QAAQ,KAAK;IACb;IACH,CAAC;AACF,UAAO,SAAS;IAAE,GAAG;IAAS;IAAO;AACrC,+BAA4B;AAC5B;;AAGJ,MAAI,0BACA;EAGJ,MAAM,SAAS,KAAK,UAAU,UAAU;EACxC,MAAM,YAA6B,CAC/B;GACI,MAAM;GACN,QAAQ,KAAK;GACb,MAAM,KAAK;GACX;GACA,OAAO;GACV,EACD;GACI,MAAM;GACN,QAAQ,KAAK;GACb,QAAQ,KAAK;GACb;GACH,CACJ;AAED,MAAI,gCAAgC,QAAW;GAC3C,MAAM,UAAU,OAAO;AACvB,OAAI,SAAS,SAAS,aAAa;AAC/B,WAAO,+BAA+B;KAClC,GAAG;KACH,OAAO,CAAC,GAAG,QAAQ,OAAO,GAAG,UAAU;KAC1C;AACD;;;AAIR,SAAO,KAAK;GACR,SAAS,YAAY;GACrB,MAAM;GACN,OAAO;GACV,CAAC;AACF,gCAA8B,OAAO,SAAS;;AAGlD,QAAO;;;AAIX,MAAa,2BACT,WAAW,QAAQ,cAAc,IACjC,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE;;AAG/D,MAAa,wCACT,0BAUC;AACD,KAAI,0BAA0B,KAC1B,QAAO;EAAE,SAAS;EAAM,SAAS;EAAQ;AAE7C,KAAI,0BAA0B,MAC1B,QAAO;EAAE,SAAS;EAAO,SAAS;EAAQ;AAE9C,KAAI,CAAC,sBACD,QAAO;EAAE,SAAS;EAAM,SAAS;EAAQ;AAE7C,QAAO;EACH,SAAS,sBAAsB,WAAW;EAC1C,SAAS,sBAAsB,WAAW;EAC7C;;;AAIL,MAAa,qBACT,GAAG,UACuB;CAC1B,MAAM,SAAkC,EAAE;CAE1C,MAAM,aAAa,QAAiC,WAAoC;AACpF,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,EAAE;GAC/C,MAAM,WAAW,OAAO;AACxB,OACI,aAAa,QACb,OAAO,aAAa,YACpB,CAAC,MAAM,QAAQ,SAAS,IACxB,UAAU,QACV,OAAO,UAAU,YACjB,CAAC,MAAM,QAAQ,MAAM,CAErB,QAAO,OAAO,UACV,EAAE,GAAI,UAAsC,EAC5C,MACH;OAED,QAAO,OAAO;;AAItB,SAAO;;AAGX,MAAK,MAAM,QAAQ,MACf,KAAI,KAAM,WAAU,QAAQ,KAAK;AAGrC,QAAO;;;;;;ACpoBX,MAAa,cACT,OACA,OACA,YACe;AACf,SAAQ,MAAM,MAAd;EACI,KAAK;AACD,OAAI,CAAC,SAAS,4BACV,QAAO;AAGX,UAAO,6BAA6B,OAAO,MAAM,UAAU,MAAM,MAAM;EAI3E,KAAK,sBAAsB;GACvB,MAAM,OAAO,MAAM,QAAQ;AAC3B,UAAO,cAAc,OAAO,MAAM,WAAW,KAAK;;EAEtD,KAAK,uBACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,WAAW,KAAK,MAAM,MAAM,CAC/B;EAEL,KAAK,mBACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,uBAAuB,KAAK,OAAO,CACtC;EAEL,KAAK,uBAAuB;GACxB,MAAM,OAAO,MAAM,QAAQ;AAC3B,UAAO,cAAc,OAAO,MAAM,WAAW,KAAK;;EAEtD,KAAK,wBACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,YAAY,KAAK,MAAM,MAAM,CAChC;EAEL,KAAK,oBACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,uBAAuB,KAAK,QAAQ,CACvC;EAEL,KAAK,uBAAuB;GACxB,MAAM,OAAO,MAAM,QAAQ;AAC3B,UAAO,cAAc,OAAO,MAAM,WAAW,KAAK;;EAEtD,KAAK,wBACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,YAAY,KAAK,MAAM,MAAM,CAChC;EAEL,KAAK,oBACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,uBAAuB,KAAK,QAAQ,CACvC;EAEL,KAAK,uBAAuB;GACxB,MAAM,OAAO,MAAM,QAAQ;AAC3B,UAAO,cAAc,OAAO,MAAM,WAAW,KAAK;;EAEtD,KAAK,wBACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,YAAY,KAAK,MAAM,MAAM,CAChC;EAEL,KAAK,oBACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,uBAAuB,KAAK,QAAQ,CACvC;EAEL,KAAK,2BAA2B;GAC5B,MAAM,OAAO,MAAM,QAAQ;AAC3B,UAAO,cAAc,OAAO,MAAM,WAAW,KAAK;;EAEtD,KAAK,4BACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,gBAAgB,KAAK,MAAM,MAAM,CACpC;EAEL,KAAK,wBACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,uBAAuB,KAAK,YAAY,CAC3C;EAIL,KAAK,4BAA4B;GAC7B,MAAM,OAAO,MAAM,QAAQ;AAC3B,UAAO,cAAc,OAAO,MAAM,WAAW,KAAK;;EAEtD,KAAK,6BACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,qBAAqB,KAAK,MAAM,MAAM,CACzC;EAEL,KAAK,6BACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,wBAAwB,KAAK,MAAM,QAAQ,CAC9C;EAEL,KAAK,yBACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,uBAAuB,KAAK,aAAa,CAC5C;EAEL,KAAK,2BAA2B;GAC5B,MAAM,OAAO,MAAM,QAAQ;AAC3B,UAAO,uBAAuB,OAAO,MAAM,WAAW,OAAO,QACzD,oBAAoB,KAAK,IAAI,MAAM,WAAW,CACjD;;EAEL,KAAK,4BACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,oBAAoB,KAAK,MAAM,OAAO,MAAM,WAAW,CAC1D;EAEL,KAAK,wBACD,QAAO,uBAAuB,OAAO,MAAM,YAAY,QACnD,uBAAuB,KAAK,YAAY,CAC3C;EAIL,KAAK,kBACD,QAAO,0BACH,OACA,MAAM,iBACN,MAAM,aACL,QACG,oBAAoB,KAAK,MAAM,WAAW,GACpC,MACA,eAAe,KAAK,aAAa,MAAM,YAAY;GAC/C,MAAM,MAAM;GACZ,GAAI,MAAM,eAAe,SACnB,EAAE,YAAY,MAAM,YAAY,GAChC,EAAE;GACR,QAAQ;GACR,OAAO;GACV,CAAC,CACf;EAEL,KAAK,iBACD,QAAO,0BACH,OACA,MAAM,iBACN,MAAM,aACL,QACG,oBAAoB,KAAK,MAAM,WAAW,GACpC,MACA,eACI,KACA,aACA,MAAM,YACN;GACI,MAAM,MAAM;GACZ,GAAI,MAAM,eAAe,SACnB,EAAE,YAAY,MAAM,YAAY,GAChC,EAAE;GACR,QAAQ;GACR,OAAO;GACV,GACA,SACG,KAAK,SAAS,cACR;GAAE,GAAG;GAAM,OAAO,KAAK,QAAQ,MAAM,MAAM;GAAO,GAClD,KACb,CACd;EAEL,KAAK,gBACD,QAAO,0BACH,OACA,MAAM,iBACN,MAAM,aACL,QAAQ;AACL,OAAI,oBAAoB,KAAK,MAAM,WAAW,CAC1C,QAAO;AAIX,OAAI,yBADa,iBAAiB,KAAK,MAAM,WAAW,EACjB,MAAM,CACzC,QAAO;AAGX,UAAO,eAAe,KAAK,aAAa,MAAM,YAAY;IACtD,MAAM,MAAM;IACZ,GAAI,MAAM,eAAe,SAAY,EAAE,YAAY,MAAM,YAAY,GAAG,EAAE;IAC1E,QAAQ;IACR,OAAO;IACV,CAAC;IAET;EAEL,KAAK,mBACD,QAAO,0BACH,OACA,MAAM,iBACN,MAAM,aACL,QAAQ;GACL,MAAM,SAAS,MAAM,UAAU,UAAU;AAKzC,UAAO,eAJY,eAAe,KAAK,eAAe,MAAM,YAAY;IACpE,QAAQ,MAAM;IACd;IACH,CAAC,EACgC,aAAa,MAAM,YAAY;IAC7D,MAAM,MAAM;IACZ,GAAI,MAAM,eAAe,SAAY,EAAE,YAAY,MAAM,YAAY,GAAG,EAAE;IAC1E;IACA,OAAO;IACV,CAAC;IAET;EAIL,KAAK,yBACD,QAAO,0BACH,OACA,MAAM,iBACN,MAAM,aACL,QAAQ;AAOL,UAAO,uBANW,eAAe,KAAK,aAAa,MAAM,YAAY;IACjE,MAAM,MAAM;IACZ,GAAI,MAAM,eAAe,SAAY,EAAE,YAAY,MAAM,YAAY,GAAG,EAAE;IAC1E,QAAQ;IACR,OAAO;IACV,CAAC,EACuC,MAAM,YAAY;IACvD,OAAO,MAAM;IACb,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,MAAM,MAAM,GAAG,EAAE;IAC3D,CAAC;IAET;EAEL,KAAK,wBACD,QAAO,0BACH,OACA,MAAM,iBACN,MAAM,aACL,QAAQ;AAOL,UAAO,uBANW,eAAe,KAAK,aAAa,MAAM,YAAY;IACjE,MAAM,MAAM;IACZ,GAAI,MAAM,eAAe,SAAY,EAAE,YAAY,MAAM,YAAY,GAAG,EAAE;IAC1E,QAAQ,kBAAkB,MAAM,MAAM;IACtC,OAAO,qBAAqB,MAAM,MAAM;IAC3C,CAAC,EACuC,MAAM,YAAY;IACvD,GAAI,MAAM,cAAc,SAAY,EAAE,OAAO,MAAM,WAAW,GAAG,EAAE;IACnE,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,MAAM,MAAM,GAAG,EAAE;IACxD,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,MAAM,MAAM,GAAG,EAAE;IACxD,GAAI,MAAM,YAAY,SAAY,EAAE,SAAS,MAAM,SAAS,GAAG,EAAE;IACpE,CAAC;IAET;EAEL,QACI,QAAO;;;;AAKnB,MAAa,sBAAsB,UAAuB,EAAE,KAAmB;CAC3E,MAAM,4BAAY,IAAI,KAAqB;AAC3C,SAAQ,SAAS,GAAG,MAAM,UAAU,IAAI,EAAE,SAAS,EAAE,CAAC;AACtD,QAAO;EAAE,UAAU;EAAS;EAAW;;AAK3C,MAAM,kCACF,OACA,eACqB;AACrB,MAAK,IAAI,IAAI,MAAM,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;EACpD,MAAM,UAAU,MAAM,SAAS;AAC/B,MAAI,CAAC,QAAS;AAMd,MALoB,QAAQ,MAAM,MAC7B,UACI,KAAK,SAAS,eAAe,KAAK,SAAS,kBAC5C,KAAK,WAAW,WACvB,CACgB,QAAO,QAAQ;;;AAKxC,MAAM,qCAAqC,UAA4C;AACnF,MAAK,IAAI,IAAI,MAAM,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;EACpD,MAAM,UAAU,MAAM,SAAS;AAC/B,MAAI,SAAS,SAAS,YAAa,QAAO,QAAQ;;;AAK1D,MAAM,sCAAsC,UAA4C;AACpF,MAAK,IAAI,IAAI,MAAM,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;EACpD,MAAM,UAAU,MAAM,SAAS;AAC/B,MAAI,SAAS,SAAS,OAAQ;EAC9B,MAAM,cAAc,QAAQ;EAC5B,IAAI;AACJ,OAAK,IAAI,IAAI,IAAI,GAAG,IAAI,MAAM,SAAS,QAAQ,KAAK,GAAG;GACnD,MAAM,YAAY,MAAM,SAAS;AACjC,OAAI,WAAW,SAAS,YAAa,4BAA2B,UAAU;;AAG9E,SAAO,4BAA4B,kBAAkB;;;AAM7D,MAAM,6BACF,OACA,iBACA,eACqB;AACrB,KAAI,iBACA;MAAI,MAAM,UAAU,IAAI,gBAAgB,CAAE,QAAO;;AAErD,QACI,+BAA+B,OAAO,WAAW,IACjD,mCAAmC,MAAM,IACzC,kCAAkC,MAAM;;AAIhD,MAAM,gCACF,OACA,UACA,UACe;CACf,MAAM,cAAc,oBAAoB,UAAU,MAAM;AACxD,KAAI,CAAC,YACD,QAAO;AAIX,KAAI,MAAM,UAAU,IAAI,YAAY,QAAQ,CACxC,QAAO;CAGX,MAAM,oBAAoB,sBAAsB,MAAM;AACtD,KAAI,qBAAqB,kBAAkB,YAAY,YAAY,QAC/D,QAAO;AAGX,QAAO;EACH,GAAG;EACH,UAAU,CAAC,GAAG,MAAM,UAAU,YAAY;EAC1C,WAAW,IAAI,IAAI,MAAM,UAAU,CAAC,IAAI,YAAY,SAAS,MAAM,SAAS,OAAO;EACtF;;AAGL,MAAM,uBACF,UACA,UACwB;CACxB,MAAM,QAAQ,SAAS;AAEvB,KAAI,OAAO,UAAU,SACjB,QAAO;EACH,SAAS,YAAY;EACrB,IAAI,YAAY;EAChB,MAAM;EACN,OAAO,CAAC;GAAE,MAAM;GAAQ,MAAM;GAAO,OAAO;GAAY,CAAC;EACzD,QAAQ;EACX;AAGL,KAAI,mBAAmB,MAAM,CACzB,QAAO,0BAA0B,OAAO,MAAM;AAGlD,KAAI,0BAA0B,MAAM,CAChC,QAAO,0BAA0B,CAAC,MAAkC,EAAE,MAAM;;AAMpF,MAAM,6BACF,OACA,UACwB;CAOxB,MAAM,oBAAoB,CAAC,GANJ,kBAAkB,OAAO,EAC5C,mBAAmB;EACf,IAAI,QAAQ;AACZ,eAAa,YAAY,MAAM,IAAI,SAAS,SAAS,GAAG;KACxD,EACP,CAAC,CAC2C,CACxC,SAAS,CACT,MAAM,YAAY,QAAQ,SAAS,OAAO;AAE/C,KAAI,CAAC,kBACD;AAGJ,QAAO;EACH,GAAG;EACH,QAAQ;EACX;;AAGL,MAAM,yBAAyB,UAC3B,CAAC,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,MAAM,YAAY,QAAQ,SAAS,OAAO;AAE5E,MAAM,6BACF,UAKC;AACD,KAAI,OAAO,UAAU,YAAY,UAAU,KACvC,QAAO;CAGX,MAAM,SAAS;AAMf,QACI,OAAO,SAAS,cACf,OAAO,SAAS,UAAa,OAAO,OAAO,SAAS,cACpD,OAAO,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,QAAQ;;AAI5E,MAAM,sBAAsB,UACxB,MAAM,QAAQ,MAAM;AAGxB,MAAM,iBAAiB,OAAqB,SAAiB,SAA6B;AACtF,KAAI,MAAM,UAAU,IAAI,QAAQ,CAAE,QAAO;CAEzC,MAAM,OAAkB;EACpB;EACA,IAAI;EACJ;EACA,OAAO,EAAE;EACZ;AAED,QAAO;EACH,GAAG;EACH,UAAU,CAAC,GAAG,MAAM,UAAU,KAAK;EACnC,WAAW,IAAI,IAAI,MAAM,UAAU,CAAC,IAAI,SAAS,MAAM,SAAS,OAAO;EAC1E;;AAGL,MAAM,iBACF,OACA,SACA,YACe;CACf,MAAM,MAAM,MAAM,UAAU,IAAI,QAAQ;AACxC,KAAI,QAAQ,OAAW,QAAO;CAE9B,MAAM,eAAe,MAAM,SAAS,OAAO;CAC3C,MAAM,UAAU,aAAa;AAC7B,KAAI,CAAC,QAAS,QAAO;AACrB,cAAa,OAAO,QAAQ,QAAQ;AAEpC,QAAO;EAAE,GAAG;EAAO,UAAU;EAAc;;AAG/C,MAAM,0BACF,OACA,SACA,MACA,YACe,cAAc,cAAc,OAAO,SAAS,KAAK,EAAE,SAAS,QAAQ;AAEvF,MAAM,cAAc,KAAgB,UAA6B;CAE7D,MAAM,QAAQ,IAAI,MAAM,OAAO;CAC/B,MAAM,OAAO,MAAM,MAAM,SAAS;AAClC,KAAI,QAAQ,KAAK,SAAS,UAAU,KAAK,UAAU,WAC/C,OAAM,MAAM,SAAS,KAAK;EAAE,GAAG;EAAM,MAAM,KAAK,OAAO;EAAO;KAE9D,OAAM,KAAK;EAAE,MAAM;EAAQ,MAAM;EAAO,CAAC;AAE7C,QAAO;EAAE,GAAG;EAAK;EAAO;;AAG5B,MAAM,eACF,KACA,UAKY;CACZ,MAAM,QAAQ,IAAI,MAAM,OAAO;CAC/B,MAAM,OAAO,MAAM,MAAM,SAAS;AAClC,KAAI,MAAM,SAAS,WAAW,KAAK,OAAO,SAAS,YAAY,KAAK,UAAU,WAC1E,OAAM,MAAM,SAAS,KAAK;EACtB,GAAG;EACH,QAAQ;GACJ,MAAM;GACN,MAAM,GAAG,KAAK,OAAO,OAAO,MAAM;GAClC,UAAU,MAAM;GACnB;EACJ;KAED,OAAM,KAAK;EACP,MAAM;EACN,QAAQ;GACJ,MAAM;GACN,MAAM,MAAM;GACZ,UAAU,MAAM;GACnB;EACJ,CAAC;AAEN,QAAO;EAAE,GAAG;EAAK;EAAO;;AAG5B,MAAM,eACF,KACA,UAUY;CACZ,MAAM,QAAQ,IAAI,MAAM,OAAO;CAC/B,MAAM,OAAO,MAAM,MAAM,SAAS;AAClC,KACI,MAAM,SAAS,YACf,MAAM,SAAS,WACf,KAAK,OAAO,SAAS,YACrB,KAAK,UAAU,WAEf,OAAM,MAAM,SAAS,KAAK;EACtB,GAAG;EACH,QAAQ;GACJ,MAAM;GACN,MAAM,GAAG,KAAK,OAAO,OAAO,MAAM;GAClC,UAAU,MAAM;GACnB;EACJ;UACM,MAAM,SAAS,MACtB,OAAM,KAAK;EACP,MAAM;EACN,QAAQ;GACJ,MAAM;GACN,KAAK,MAAM;GACd;EACJ,CAAC;KAEF,OAAM,KAAK;EACP,MAAM;EACN,QAAQ;GACJ,MAAM;GACN,MAAM,MAAM;GACZ,UAAU,MAAM;GACnB;EACJ,CAAC;AAEN,QAAO;EAAE,GAAG;EAAK;EAAO;;AAG5B,MAAM,eACF,KACA,UAUY;CACZ,MAAM,QAAQ,IAAI,MAAM,OAAO;CAC/B,MAAM,OAAO,MAAM,MAAM,SAAS;AAClC,KACI,MAAM,SAAS,YACf,MAAM,SAAS,WACf,KAAK,OAAO,SAAS,YACrB,KAAK,UAAU,WAEf,OAAM,MAAM,SAAS,KAAK;EACtB,GAAG;EACH,QAAQ;GACJ,MAAM;GACN,MAAM,GAAG,KAAK,OAAO,OAAO,MAAM;GAClC,UAAU,MAAM;GACnB;EACJ;UACM,MAAM,SAAS,MACtB,OAAM,KAAK;EACP,MAAM;EACN,QAAQ;GACJ,MAAM;GACN,KAAK,MAAM;GACd;EACJ,CAAC;KAEF,OAAM,KAAK;EACP,MAAM;EACN,QAAQ;GACJ,MAAM;GACN,MAAM,MAAM;GACZ,UAAU,MAAM;GACnB;EACJ,CAAC;AAEN,QAAO;EAAE,GAAG;EAAK;EAAO;;AAG5B,MAAM,mBAAmB,KAAgB,UAA+B;CACpE,MAAM,QAAQ,IAAI,MAAM,OAAO;CAC/B,MAAM,OAAO,MAAM,MAAM,SAAS;AAClC,KAAI,MAAM,SAAS,eAAe,KAAK,UAAU,WAC7C,OAAM,MAAM,SAAS,KAAK;EACtB,GAAG;EACH,WAAW,CAAC,GAAG,KAAK,WAAW,GAAG,MAAM;EAC3C;KAED,OAAM,KAAK;EACP,MAAM;EACN,WAAW;EACd,CAAC;AAEN,QAAO;EAAE,GAAG;EAAK;EAAO;;AAG5B,MAAM,wBAAwB,KAAgB,UAA6B;CACvE,MAAM,QAAQ,IAAI,MAAM,OAAO;CAC/B,MAAM,OAAO,MAAM,MAAM,SAAS;AAClC,KAAI,MAAM,SAAS,gBAAgB,KAAK,UAAU,WAC9C,OAAM,MAAM,SAAS,KAAK;EAAE,GAAG;EAAM,MAAM,KAAK,OAAO;EAAO;KAE9D,OAAM,KAAK;EACP,MAAM;EACN,MAAM;EACT,CAAC;AAEN,QAAO;EAAE,GAAG;EAAK;EAAO;;AAG5B,MAAM,uBACF,KACA,OACA,YACA,aACY;CACZ,MAAM,QAAQ,IAAI,MAAM,OAAO;CAC/B,MAAM,OAAO,MAAM,MAAM,SAAS;AAClC,KACI,MAAM,SAAS,eACf,KAAK,UAAU,cACf,KAAK,eAAe,eACnB,KAAK,YAAY,aAAgB,YAAY,QAE9C,OAAM,MAAM,SAAS,KAAK;EAAE,GAAG;EAAM,MAAM,KAAK,OAAO;EAAO;KAE9D,OAAM,KAAK;EACP,MAAM;EACN,MAAM;EACN;EACA,GAAI,aAAa,SAAY,EAAE,UAAU,GAAG,EAAE;EACjD,CAAC;AAEN,QAAO;EAAE,GAAG;EAAK;EAAO;;AAG5B,MAAM,2BACF,KACA,YAOY;CACZ,MAAM,QAAQ,IAAI,MAAM,OAAO;CAC/B,MAAM,OAAO,MAAM,MAAM,SAAS;AAClC,KAAI,MAAM,SAAS,gBAAgB,KAAK,UAAU,YAAY;EAC1D,MAAM,WAAW,KAAK,WAAW,CAAC,GAAG,KAAK,SAAS,GAAG,EAAE;EACxD,MAAM,MAAM,SAAS,WAAW,SAAS,KAAK,OAAO,QAAQ,GAAG;AAChE,MAAI,QAAQ,GACR,UAAS,KAAK,QAAQ;MAEtB,UAAS,OAAO;AAEpB,QAAM,MAAM,SAAS,KAAK;GAAE,GAAG;GAAM;GAAU;OAE/C,OAAM,KAAK;EACP,MAAM;EACN,MAAM;EACN,UAAU,CAAC,QAAQ;EACtB,CAAC;AAEN,QAAO;EAAE,GAAG;EAAK;EAAO;;AAG5B,MAAM,0BACF,KACA,aACY;CACZ,MAAM,QAAQ,IAAI,MAAM,OAAO;AAC/B,MAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;EAC3C,MAAM,OAAO,MAAM;AACnB,MAAI,CAAC,QAAQ,KAAK,SAAS,SAAU;AACrC,QAAM,KAAK;GAAE,GAAG;GAAM,OAAO;GAAY;AACzC,SAAO;GAAE,GAAG;GAAK;GAAO;;AAE5B,QAAO;;AAIX,MAAM,4BAA4B,UAC9B,UAAU,wBACV,UAAU,uBACV,UAAU,qBACV,UAAU;AAEd,MAAM,wBACF,UAEA,UAAU,cACJ,uBACA,UAAU,aACR,sBACA,UAAU,WACR,oBACA;AAEd,MAAM,qBACF,UAC0B,UAAU,YAAY,UAAU,YAAY,UAAU;AAEpF,MAAM,0BACF,KACA,YACA,UAOA,eAAe,KAAK,aAAa,YAAY,EAAE,GAAG,SAC9C,KAAK,SAAS,cACR;CACI,GAAG;CACH,UAAU;EACN,GAAI,KAAK,YAAY,EAAE;EACvB,GAAI,MAAM,UAAU,SAAY,EAAE,OAAO,MAAM,OAAO,GAAG,EAAE;EAC3D,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,MAAM,MAAM,GAAG,EAAE;EACxD,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,MAAM,MAAM,GAAG,EAAE;EACxD,GAAI,MAAM,YAAY,SAAY,EAAE,SAAS,MAAM,SAAS,GAAG,EAAE;EACpE;CACJ,GACD,KACT;AAEL,MAAM,uBAAuB,KAAgB,eACzC,IAAI,MAAM,MACL,SACG,KAAK,SAAS,eACd,KAAK,WAAW,eACf,KAAK,WAAW,aACb,KAAK,UAAU,eACf,KAAK,UAAU,qBACf,KAAK,UAAU,oBAC1B;AAEL,MAAM,oBAAoB,KAAgB,eACtC,IAAI,MAAM,MACL,SAA+B,KAAK,SAAS,eAAe,KAAK,WAAW,WAChF;AAEL,MAAM,kBACF,KACA,MACA,YACA,OACA,YACY;CAEZ,MAAM,QAAQ,IAAI,MAAM,OAAO;CAC/B,MAAM,MAAM,MAAM,WAAW,MAAM,EAAE,SAAS,QAAQ,YAAY,KAAK,EAAE,WAAW,WAAW;AAE/F,KAAI,QAAQ,IAAI;AACZ,MAAI,SAAS,YACT,OAAM,KAAK;GACP,MAAM;GACN,QAAQ;GACR,QAAQ;GACR,GAAI;GACP,CAAC;MAEF,OAAM,KAAK;GACP,MAAM;GACN,QAAQ;GACR,QAAQ;GACR,GAAI;GACP,CAAC;AAEN,SAAO;GAAE,GAAG;GAAK;GAAO;;CAG5B,MAAM,WAAW,MAAM;AACvB,KAAI,CAAC,SAAU,QAAO;EAAE,GAAG;EAAK;EAAO;AACvC,KAAI,SAAS,eAAe,SAAS,SAAS,aAAa;EACvD,MAAM,SAAuB;GACzB,GAAG;GACH,GAAI;GACJ,MAAM;GACT;AACD,QAAM,OAAO,UAAW,QAAQ,OAAO,GAAoB;YACpD,SAAS,iBAAiB,SAAS,SAAS,eAAe;EAClE,MAAM,SAAyB;GAC3B,GAAG;GACH,GAAI;GACJ,MAAM;GACT;AACD,QAAM,OAAO,UAAW,QAAQ,OAAO,GAAsB;;AAGjE,QAAO;EAAE,GAAG;EAAK;EAAO;;AAG5B,MAAM,0BACF,OACA,WACA,YACe,uBAAuB,OAAO,WAAW,aAAa,QAAQ;AAEjF,MAAM,6BACF,OACA,iBACA,YACA,YACe;CACf,MAAM,uBAAuB,0BAA0B,OAAO,iBAAiB,WAAW;AAC1F,KAAI,CAAC,qBACD,QAAO;AAGX,QAAO,uBAAuB,OAAO,sBAAsB,aAAa,QAAQ;;;;;;AC/1BpF,MAAM,uBAAuB,QAAgB,UAAkB,GAAG,OAAO,GAAG,MAAM,SAAS,GAAG;;AAG9F,MAAM,+BACF,MACA,UACmB;AACnB,KAAI,KAAK,SAAS,WAAW;EACzB,MAAM,QACF,OAAO,KAAK,YAAY,WAClB,CAAC;GAAE,MAAM;GAAQ,MAAM,KAAK;GAAS,OAAO;GAAY,CAAyB,GACjF,KAAK,QACA,KAAK,SAAS,oBAAoB,KAAK,CAAC,CACxC,QAAQ,SAAsD,SAAS,KAAK;AAE3F,MAAI,MAAM,WAAW,EACjB,QAAO;AAGX,SAAO;GACH,SAAS,oBAAoB,oBAAoB,MAAM;GACvD,MAAM,KAAK;GACX;GACH;;AAGL,KAAI,KAAK,SAAS,YACd,QAAO;EACH,SAAS,oBAAoB,sBAAsB,MAAM;EACzD,MAAM;EACN,OAAO,CACH;GACI,MAAM;GACN,QAAQ,KAAK;GACb,MAAM,KAAK;GACX,MAAM,KAAK;GACX,QAAQ;GACR,OAAO;GACV,CACJ;EACJ;AAGL,KAAI,KAAK,SAAS,uBACd,QAAO;CAGX,MAAM,SAAS,KAAK,UAAU,UAAU;AACxC,QAAO;EACH,SAAS,oBAAoB,wBAAwB,MAAM;EAC3D,MAAM;EACN,OAAO,CACH;GACI,MAAM;GACN,QAAQ,KAAK;GACb,MAAM,KAAK;GACX;GACA,OAAO;GACV,EACD;GACI,MAAM;GACN,QAAQ,KAAK;GACb,QAAQ,KAAK;GACb;GACH,CACJ;EACJ;;;AAIL,MAAM,qCACF,UACA,SACU;CACV,IAAI,eAAe;AACnB,MAAK,IAAI,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;EAC1D,MAAM,UAAU,SAAS;AACzB,MAAI,CAAC,WAAW,QAAQ,SAAS,YAC7B;AAMJ,MAH4B,QAAQ,MAAM,MACrC,SAAS,KAAK,SAAS,eAAe,KAAK,WAAW,KAAK,OAC/D,EACwB;AACrB,kBAAe;AACf;;;AAIR,KAAI,eAAe,EACf,QAAO;CAGX,MAAM,UAAU,SAAS;AACzB,KAAI,CAAC,WAAW,QAAQ,SAAS,YAC7B,QAAO;CAGX,MAAM,eAAe,SAAS,OAAO;CACrC,MAAM,SAAS,KAAK,UAAU,UAAU;AACxC,cAAa,gBAAgB;EACzB,GAAG;EACH,OAAO,QAAQ,MAAM,SAAS,SAC1B,KAAK,SAAS,eAAe,KAAK,WAAW,KAAK,SAC5C,CACI;GACI,GAAG;GACH;GACA,OAAO;GACV,EACD;GACI,MAAM;GACN,QAAQ,KAAK;GACb,QAAQ,KAAK;GACb;GACH,CACJ,GACD,CAAC,KAAK,CACf;EACJ;AACD,UAAS,OAAO,GAAG,SAAS,QAAQ,GAAG,aAAa;AACpD,QAAO;;;;;AAMX,MAAa,2BAA2B,aAAoD;CACxF,MAAM,WAAwB,EAAE;AAEhC,MAAK,MAAM,CAAC,OAAO,UAAU,UAAU,UAAU,EAAE,EAAE,SAAS,EAAE;AAE5D,MACI,KAAK,SAAS,0BACd,kCAAkC,UAAU,KAAK,CAEjD;EAGJ,MAAM,UAAU,4BAA4B,MAAM,MAAM;AACxD,MAAI,QACA,UAAS,KAAK,QAAQ;;AAI9B,QAAO;;;;;;;;AC5GX,IAAa,sBAAb,MAGE;CAEE,AAAiB;CACjB,AAAQ;CACR,AAAQ,SAAsB;CAC9B,AAAQ,QAAsC;CAC9C,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ,iBAAiB;CACzB,AAAQ,yCAA8C,IAAI,KAAK;CAC/D,AAAQ;CACR,AAAQ,4BAA6B,IAAI,KAAK;CAC9C,AAAQ,YAAY;CACpB,AAAQ,cAAc;CACtB,AAAQ,qBAAqB;CAC7B,AAAQ;CACR,AAAQ,wBAAgD;CAGxD,YACI,AAAQ,QACR,SACF;EAFU;AAGR,OAAK,UAAU;AACf,OAAK,KAAK,QAAQ,MAAM,oBAAoB;EAC5C,MAAM,aAAa,KAAK,kBAAkB,QAAQ,mBAAmB,EAAE,CAAC;AACxE,OAAK,QAAQ,mBAAmB,WAAW;AAC3C,OAAK,kBAAkB;AACvB,OAAK,eAAe,KAAK,6BAA6B,QAAQ;;;CAMlE,cAA2B;AACvB,SAAO,KAAK,MAAM;;;CAItB,YAAyB;AACrB,SAAO,KAAK;;;CAIhB,WAAyC;AACrC,SAAO,KAAK;;;CAIhB,cAAkC;AAC9B,SAAO,KAAK;;;CAIhB,WAA+B;AAC3B,SAAO,KAAK;;;CAIhB,IAAI,YAAqB;AACrB,SACI,KAAK,WAAW,eAChB,KAAK,WAAW,eAChB,KAAK,WAAW;;;CAKxB,IAAI,cAAuB;AACvB,SAAO,KAAK,WAAW;;;CAI3B,0BAAiD;EAC7C,MAAM,uBAAO,IAAI,KAAa;EAC9B,MAAM,UAAiC,EAAE;AAEzC,OAAK,MAAM,WAAW,KAAK,MAAM,SAC7B,MAAK,MAAM,QAAQ,QAAQ,MACvB,KACI,KAAK,SAAS,eACd,KAAK,UAAU,wBACf,CAAC,KAAK,IAAI,KAAK,OAAO,EACxB;AACE,WAAQ,KAAK;IACT,YAAY,KAAK;IACjB,UAAU,KAAK;IACf,MAAM,KAAK;IACX,YAAY,KAAK;IACjB,OAAO,KAAK,UAAU;IACtB,MAAM,KAAK,UAAU;IACrB,MAAM,KAAK,UAAU;IACrB,SAAS,KAAK,UAAU;IAC3B,CAAC;AACF,QAAK,IAAI,KAAK,OAAO;;AAIjC,SAAO;;;CAIX,cAAiC;AAC7B,SAAO;GACH,IAAI,KAAK;GACT,gBAAgB,KAAK,QAAQ;GAC7B,UAAU,KAAK,MAAM;GACrB,QAAQ,KAAK;GACb,OAAO,KAAK;GACZ,UAAU,KAAK;GACf,OAAO,KAAK;GACZ,WAAW,KAAK;GAChB,aAAa,KAAK;GAClB,sBAAsB,KAAK,yBAAyB;GACvD;;;CAML,OAAa;AACT,MAAI,KAAK,UAAW;AACpB,OAAK,kBAAkB;AACvB,OAAK,UAAU,QAAQ;;;CAI3B,aAAa,QAAuC;AAChD,OAAK,SAAS;;;;;CAMlB,UAAU,UAAkC;AACxC,OAAK,UAAU,IAAI,SAAS;AAC5B,eAAa;AACT,QAAK,UAAU,OAAO,SAAS;;;;CAKvC,AAAQ,SAAe;AACnB,MAAI,KAAK,UAAW;AACpB,OAAK,MAAM,YAAY,KAAK,UACxB,WAAU;;;CAKlB,AAAQ,kBAAkB,UAA0B;EAChD,MAAM,QAAQ,SAAS,QAAQ,IAAI,WAAW;AAC9C,MAAI,SAAS,UAAU,KAAK,UACxB,MAAK,YAAY;EAGrB,MAAM,WAAW,SAAS,QAAQ,IAAI,cAAc;AACpD,MAAI,YAAY,aAAa,KAAK,aAC9B,MAAK,eAAe;;;CAO5B,OAAa;AACT,MAAI,KAAK,YAAa;AACtB,OAAK,cAAc;AACnB,iCAA+B;AAE/B,MAAI,KAAK,QAAQ,qBAAqB,KAAK,QAAQ,gBAAgB;AAC/D,GAAK,KAAK,mBAAmB;AAC7B;;AAGJ,OAAK,YAAY;;;CAIrB,AAAQ,WAAW,SAAiD;EAChE,MAAM,SAAS,KAAK,QAAQ;AAC5B,MAAI,CAAC,OAAQ;EAEb,MAAM,cAAc,KAAK,MAAM,SAAS,SAAS;EACjD,MAAM,mBACF,OAAO,WAAW,YAAY,WAAW,QAAQ,OAAO,OAAO,aAAa,WACtE,OAAO,WACP;EACV,MAAM,mBACF,OAAO,WAAW,YAAY,WAAW,OAAO,OAAO,WAAW;EAEtE,MAAM,iBACF,qBACC,mBAAmB,KAAK,uBAAuB,IAAI,iBAAiB,GAAG;AAG5E,MACI,eACA,qBAAqB,UACrB,qBAAqB,UACrB,CAAC,SAAS,kBAEV;AAGJ,MAAI,kBAAkB;AAClB,GAAK,KAAK,aAAa;IACnB,UAAU;IACV,GAAI,mBAAmB,SAAY,EAAE,UAAU,gBAAgB,GAAG,EAAE;IACvE,CAAC;AACF;;AAGJ,MAAI,CAAC,KAAK,QAAQ,gBAAgB;AAC9B,WAAQ,KACJ,+FACH;AACD;;AAIJ,MAAI,qBAAqB,QAAW;AAChC,GAAK,KAAK,mBAAmB,EAAE,UAAU,kBAAkB,CAAC;AAC5D;;AAGJ,EAAK,KAAK,oBAAoB;;;CAIlC,MAAc,oBAAmC;EAC7C,MAAM,iBAAiB,KAAK,QAAQ;AACpC,MAAI,CAAC,gBAAgB;AACjB,QAAK,YAAY;AACjB;;EAGJ,MAAM,mBAAmB,KAAK,OAAO;AACrC,MAAI,OAAO,qBAAqB,YAAY;AAExC,QAAK,YAAY;AACjB;;EAGJ,MAAM,EAAE,QAAQ,eAAe,KAAK,gBAAgB;AACpD,OAAK,UAAU,YAAY;EAC3B,IAAI,qBAAqB;AACzB,OAAK,SAAS,OAAU;AAExB,MAAI;GACA,MAAM,SAAS,MAAM,iBAAiB,KAClC,KAAK,QACL,KAAK,QAAQ,OACb,gBACA,EAAE,QAAQ,CACb;AACD,QAAK,eAAe,OAAO;AAE3B,OAAI,QAAQ;IAER,MAAM,aAAa,sBAAsB,OAAO,MAAM;AACtD,SAAK,kBAAkB;AACvB,SAAK,QAAQ,mBAAmB,WAAW;AAC3C,SAAK,QAAQ;;AAGjB,QAAK,UAAU,QAAQ;AACvB,wBAAqB;WAChB,GAAG;AACR,OAAI,KAAK,aAAa,GAAG,OAAO,CAC5B;GAGJ,MAAM,MAAM,KAAK,QAAQ,GAAG,mBAAmB;AAC/C,QAAK,QAAQ,UAAU,IAAI;AAC3B,QAAK,UAAU,QAAQ;AACvB,wBAAqB;YACf;AACN,QAAK,gBAAgB,WAAW;AAChC,OAAI,mBAEA,MAAK,WAAW,EAAE,mBAAmB,MAAM,CAAC;;;;CAMxD,MAAM,YACF,OACA,SACmB;AACnB,SAAO,KAAK,0BACR,OACA,SAAS,SAAS,EAAE,QAAQ,QAAQ,QAAQ,GAAG,OAClD;;;CAIL,MAAM,aAAa,SAAuC;EACtD,MAAM,UAAU,KAAK,oBAAoB,QAAQ;AACjD,MAAI,CAAC,QACD,OAAM,IAAI,MAAM,YAAY,QAAQ,kBAAkB;AAE1D,MAAI,QAAQ,SAAS,OACjB,OAAM,IAAI,MAAM,qCAAqC;EAGzD,MAAM,MAAM,KAAK,MAAM,UAAU,IAAI,QAAQ;AAC7C,MAAI,QAAQ,OACR,OAAM,IAAI,MAAM,YAAY,QAAQ,kBAAkB;EAG1D,MAAM,gBAAgB,KAAK,MAAM,SAC5B,MAAM,GAAG,MAAM,EAAE,CACjB,KAAK,cACF,UAAU,YAAY,UACf,KAAK,yBAAyB,UAAU,IAAI,YAC7C,UACT;AAEL,SAAO,KAAK,0BACR;GACI,OAAO,gBAAgB,cAAc;GACrC,mBAAmB;GACtB,EACD;GACI,gBAAgB;GAChB,gBAAgB,KAAK,yBAAyB,QAAQ;GACtD,wBAAwB;GAC3B,CACJ;;;CAIL,MAAM,aAAa,SAAiE;EAChF,MAAM,EAAE,aAAa;EACrB,MAAM,EAAE,QAAQ,eAAe,KAAK,gBAAgB;AACpD,OAAK,UAAU,YAAY;AAC3B,OAAK,SAAS,OAAU;AAExB,MAAI;GACA,MAAM,SAAS,KAAK,OAAO,aACvB,KAAK,QAAQ,OACb;IACI;IACA,UAAU,QAAQ,YAAY,KAAK,uBAAuB,IAAI,SAAS,IAAI;IAC9E,EACD;IACI;IACA,aAAa,aAAa;AACtB,UAAK,kBAAkB,SAAS;;IAEvC,CACJ;GAED,MAAM,SAAS,MAAM,KAAK,2BAA2B,QAAQ;IACzD;IACA,QAAQ;IACR,mBAAmB;IACtB,CAAC;AACF,OAAI,CAAC,OAAO,eAAe;AACvB,SAAK,UAAU,QAAQ;AACvB;;AAEJ,OAAI,CAAC,OAAO,cACR,OAAM,KAAK,wBACP,QACA,0CACH;AAEL,OAAI,OAAO,kBAAkB,QACzB,OAAM,OAAO,iCAAiB,IAAI,MAAM,iBAAiB;AAG7D,QAAK,UAAU,QAAQ;AACvB,OAAI,OAAO,iBAAiB,OAAO,cAC/B,MAAK,WAAW;IAAE;IAAU,SAAS,OAAO,kBAAkB;IAAW,CAAC;WAEzE,GAAG;AACR,OACI,KAAK,aACL,KAAK,aAAa,GAAG,OAAO,IAC3B,KAAK,wBAAwB,EAAE,IAAI,KAAK,oBAAoB,EAC/D;AACE,SAAK,UAAU,QAAQ;AACvB;;GAGJ,MAAM,MAAM,mBAAmB,GAAG,iBAAiB;AACnD,QAAK,SAAS,IAAI;AAClB,QAAK,UAAU,QAAQ;AACvB,OAAI,KAAK,wBAAwB,EAAE,CAC/B,MAAK,QAAQ,eAAe;IACxB,OAAO;IACP,OAAO,KAAK;IACZ;IACH,CAAC;AAEN,QAAK,QAAQ,UAAU,IAAI;YACrB;AACN,QAAK,gBAAgB,WAAW;;;;CAKxC,MAAM,mBAAmB,SAAgD;EACrE,MAAM,iBAAiB,KAAK,QAAQ;AACpC,MAAI,CAAC,gBAAgB;AACjB,WAAQ,KAAK,mEAAmE;AAChF;;EAGJ,MAAM,EAAE,QAAQ,eAAe,KAAK,gBAAgB;AACpD,OAAK,UAAU,YAAY;AAC3B,OAAK,SAAS,OAAU;AAExB,MAAI;GACA,MAAM,SAAS,KAAK,OAAO,mBACvB,KAAK,QAAQ,OACb;IACI;IACA,GAAI,SAAS,aAAa,SAAY,EAAE,UAAU,QAAQ,UAAU,GAAG,EAAE;IAC5E,EACD;IACI;IACA,aAAa,aAAa;AACtB,UAAK,kBAAkB,SAAS;;IAEvC,CACJ;GAED,MAAM,SAAS,MAAM,KAAK,2BAA2B,QAAQ;IACzD;IACA,QAAQ;IACR,mBAAmB;IACtB,CAAC;AACF,OAAI,CAAC,OAAO,eAAe;AACvB,SAAK,UAAU,QAAQ;AACvB;;AAEJ,OAAI,CAAC,OAAO,cACR,OAAM,KAAK,wBACP,QACA,0CACH;AAEL,OAAI,OAAO,kBAAkB,QACzB,OAAM,OAAO,iCAAiB,IAAI,MAAM,iBAAiB;AAG7D,QAAK,UAAU,QAAQ;AACvB,OAAI,OAAO,iBAAiB,OAAO,cAC/B,MAAK,WAAW;IACZ;IACA,SAAS,OAAO,kBAAkB;IACrC,CAAC;WAED,GAAG;AACR,OACI,KAAK,aACL,KAAK,aAAa,GAAG,OAAO,IAC3B,KAAK,wBAAwB,EAAE,IAAI,KAAK,oBAAoB,EAC/D;AACE,SAAK,UAAU,QAAQ;AACvB;;GAGJ,MAAM,MAAM,mBAAmB,GAAG,iBAAiB;AACnD,QAAK,SAAS,IAAI;AAClB,QAAK,UAAU,QAAQ;AACvB,OAAI,KAAK,wBAAwB,EAAE,CAC/B,MAAK,QAAQ,eAAe;IACxB,OAAO;IACP,OAAO,KAAK;IACZ,UAAU,KAAK;IAClB,CAAC;AAEN,QAAK,QAAQ,UAAU,IAAI;YACrB;AACN,QAAK,gBAAgB,WAAW;;;;CAOxC,MAAM,gBAAgB,QAA8C;EAChE,MAAM,QAAQ,OAAO,SAAS,KAAK;AACnC,MAAI,CAAC,MACD,OAAM,IAAI,MAAM,wDAAwD;AAG5E,QAAM,KAAK,OAAO,mBAAmB;GACjC,OAAO,KAAK,QAAQ;GACpB;GACA,YAAY,OAAO;GACnB,UAAU,OAAO;GACjB,GAAI,OAAO,SAAS,SAAY,EAAE,MAAM,OAAO,MAAM,GAAG,EAAE;GAC1D,GAAI,OAAO,YAAY,SAAY,EAAE,SAAS,OAAO,SAAS,GAAG,EAAE;GACtE,CAAC;;;CAIN,aAAmB;AACf,OAAK,SAAS,OAAU;AACxB,OAAK,UAAU,QAAQ;;;CAI3B,QAAc;AACV,OAAK,kBAAkB;AACvB,OAAK,QAAQ,mBAAmB,KAAK,gBAAgB;AACrD,OAAK,eAAe;AACpB,OAAK,iBAAiB;AACtB,OAAK,YAAY;AACjB,OAAK,eAAe,KAAK,6BAA6B,KAAK,QAAQ;AACnE,OAAK,QAAQ;AACb,OAAK,SAAS;AACd,OAAK,iBAAiB;AACtB,OAAK,uBAAuB,OAAO;AACnC,OAAK,QAAQ;;;CAIjB,YAAY,OAA+B;EACvC,MAAM,UAAU,KAAK,MAAM;EAC3B,MAAM,UAAU,OAAO,UAAU,aAAa,MAAM,QAAQ,GAAG;AAE/D,OAAK,QAAQ,mBADA,KAAK,kBAAkB,QAAQ,CACP;AACrC,OAAK,QAAQ;;;CAIjB,cAAc,SAAsE;EAChF,MAAM,cAAc;GAChB,GAAG,KAAK;GACR,GAAG;GACH,GAAI,QAAQ,WAAW,UACvB,OAAO,QAAQ,WAAW,YAC1B,QAAQ,WAAW,OACb,EACI,QAAQ;IACJ,GAAI,OAAO,KAAK,QAAQ,WAAW,YACnC,KAAK,QAAQ,WAAW,OAClB,KAAK,QAAQ,SACb,EAAE;IACR,GAAG,QAAQ;IACd,EACJ,GACD,EAAE;GACR,GAAI,QAAQ,yBACZ,OAAO,QAAQ,0BAA0B,YACzC,CAAC,MAAM,QAAQ,QAAQ,sBAAsB,GACvC,EACI,uBAAuB;IACnB,GAAI,OAAO,KAAK,QAAQ,0BAA0B,YAClD,KAAK,QAAQ,0BAA0B,QACvC,CAAC,MAAM,QAAQ,KAAK,QAAQ,sBAAsB,GAC5C,KAAK,QAAQ,wBACb,EAAE;IACR,GAAG,QAAQ;IACd,EACJ,GACD,EAAE;GACX;EAED,MAAM,qBAAqB,KAAK,+BAA+B,KAAK,SAAS,YAAY;AACzF,OAAK,UAAU;AAEf,MAAI,mBACA,MAAK,uBAAuB;;;CAKpC,UAAgB;AACZ,OAAK,kBAAkB;AACvB,OAAK,YAAY;AACjB,OAAK,UAAU,OAAO;;;CAM1B,AAAQ,WAAW,IAAiB,SAAsC;AACtE,OAAK,QAAQ,UAAU,GAAG;EAG1B,MAAM,YACF,OAAO,GAAG,aAAa,YAAY,GAAG,SAAS,SAAS,IAClD,GAAG,WACH,OAAO,GAAG,UAAU,YAAY,GAAG,MAAM,SAAS,IAChD,GAAG,QACH;AAEZ,MAAI,OAAO,GAAG,QAAQ,SAClB,KAAI,WAAW;GACX,MAAM,OAAO,KAAK,uBAAuB,IAAI,UAAU,IAAI;AAC3D,OAAI,GAAG,OAAO,KAAM;AACpB,QAAK,uBAAuB,IAAI,WAAW,GAAG,IAAI;SAC/C;AACH,OAAI,GAAG,OAAO,KAAK,eAAgB;AACnC,QAAK,iBAAiB,GAAG;;AAKjC,MAAI,OAAO,GAAG,UAAU,YAAY,GAAG,MAAM,SAAS,KAAK,GAAG,UAAU,KAAK,UACzE,MAAK,YAAY,GAAG;AAGxB,MAAI,GAAG,SAAS,gBAAgB;GAC5B,MAAM,SACF,GAMF;AACF,QAAK,eAAe,QAAQ;AAC5B,QAAK,iBAAiB,QAAQ;;AAGlC,MAAI,GAAG,SAAS,aAAa;GACzB,MAAM,UAAU;IACZ,MAAO,GAAoC;IAC3C,GAAK,GAAkC,KACjC,EAAE,IAAK,GAAiC,IAAI,GAC5C,EAAE;IACX;AACD,QAAK,QAAQ,SAAS,QAAQ;;AAGlC,MAAI,GAAG,YAAY,GAAG,aAAa,KAAK,aACpC,MAAK,eAAe,GAAG;AAG3B,MAAI,SAAS,UAAU,GAAG,SAAS,cAC/B,MAAK,2BAA2B,GAAG,UAAU,GAAG,MAAM;AAI1D,OAAK,QAAQ,WAAW,KAAK,OAAO,IAAI,EACpC,6BAA6B,QAAQ,SAAS,OAAO,EACxD,CAAC;AAEF,OAAK,QAAQ;;;CAIjB,MAAc,2BACV,QACA,SACgC;EAChC,MAAM,SAAkC,EACpC,eAAe,OAClB;AAED,MAAI;AACA,cAAW,MAAM,SAAS,QAAQ;AAC9B,SAAK,eAAe,QAAQ,OAAO;AACnC,WAAO,gBAAgB;AAEvB,QAAI,KAAK,WAAW,YAChB,MAAK,UAAU,YAAY;IAG/B,MAAM,WAAW,KAAK,0BAA0B,MAAM;AACtD,QAAI,UAAU;AACV,YAAO,gBAAgB,SAAS;AAChC,YAAO,gBAAgB,SAAS;;AAGpC,SAAK,WAAW,OAAO,EAAE,QAAQ,QAAQ,QAAQ,CAAC;;WAEjD,OAAO;AACZ,OAAI,KAAK,aAAa,OAAO,QAAQ,OAAO,CACxC,OAAM;AAEV,SAAM,KAAK,wBAAwB,OAAO,QAAQ,kBAAkB;;AAGxE,OAAK,eAAe,QAAQ,OAAO;AACnC,SAAO;;;CAIX,AAAQ,0BACJ,OACoE;AACpE,MAAI,MAAM,SAAS,eACf,QAAO,EAAE,OAAO,YAAY;AAEhC,MAAI,MAAM,SAAS,cACf,QAAO,EAAE,OAAO,WAAW;AAE/B,MAAI,MAAM,SAAS,YACf,QAAO;GACH,OAAO;GACP,OAAO,mBACF,MAAwC,OACzC,qBAAsB,MAAwC,MAAM,CACvE;GACJ;;;CAST,MAAc,0BACV,UACA,iBACmB;EACnB,MAAM,EAAE,QAAQ,eAAe,KAAK,eAAe,iBAAiB,OAAO;AAC3E,OAAK,UAAU,YAAY;AAC3B,OAAK,SAAS,OAAU;EACxB,MAAM,UAAU,KAAK,wBAAwB,UAAU,iBAAiB,OAAO;AAE/E,MAAI;AACA,QAAK,wCAAwC,QAAQ;AACrD,QAAK,0BAA0B,QAAQ;GAEvC,MAAM,eAAe,KAAK,kBAAkB,QAAQ;AACpD,OAAI,QAAQ,iBACR,QAAO,MAAM,KAAK,iBAAiB,SAAS,aAAa;AAG7D,UAAO,MAAM,KAAK,kBAAkB,SAAS,aAAa;WACrD,GAAG;AACR,UAAO,KAAK,wBAAwB,GAAG,QAAQ;YACzC;AACN,QAAK,gBAAgB,WAAW;;;;CAKxC,AAAQ,wBACJ,UACA,iBACA,QACiB;AACjB,SAAO;GACH;GACA,gBACI,OAAO,SAAS,mBAAmB,WAC7B,SAAS,iBACT,KAAK,QAAQ;GACvB,YAAY,SAAS;GACrB,mBACI,OAAO,SAAS,sBAAsB,YAChC,SAAS,oBACT,QAAQ,KAAK,QAAQ,kBAAkB;GACjD,mBAAmB,iBAAiB;GACpC,6BAA6B;GAC7B,kBAAkB,qCACd,KAAK,QAAQ,sBAChB;GACD,gBAAgB,KAAK;GACrB,kBAAkB,QAAQ,iBAAiB,SAAS,IAAI,CAAC,KAAK,yBAAyB;GACvF;GACA;GACH;;;CAIL,AAAQ,wCAAwC,SAAkC;AAC9E,MACI,CAAC,QAAQ,qBACT,CAAC,QAAQ,kBACT,QAAQ,iBAAiB,kBACzB,KAAK,mBAEL;AAGJ,OAAK,qBAAqB;AAC1B,UAAQ,KACJ,uLACH;;;CAIL,AAAQ,0BAA0B,SAAkC;EAChE,MAAM,iBAAiB,QAAQ,iBAAiB;AAChD,MAAI,gBAAgB;AAChB,QAAK,oBACD,gBACA,QAAQ,iBAAiB,kBAAkB,QAAQ,WACtD;AACD,WAAQ,oBAAoB;AAC5B;;AAGJ,MAAI,QAAQ,qBAAqB,CAAC,QAAQ,iBAAiB,QACvD;AAQJ,MAAI,EAJC,CAAC,QAAQ,qBACN,KAAK,gCAAgC,QAAQ,WAAW,IAC3D,QAAQ,qBACL,KAAK,2CAA2C,QAAQ,WAAW,EAEvE;EAGJ,MAAM,oBAAoB,KAAK,yBAAyB,QAAQ,WAAW;AAC3E,MAAI,CAAC,kBACD;EAGJ,MAAM,oBAAoB,KAAK,mBAAmB;AAClD,UAAQ,oBAAoB;AAC5B,OAAK,QAAQ,mBAAmB,CAC5B,GAAG,KAAK,MAAM,UACd;GACI,GAAG;GACH,SAAS;GACZ,CACJ,CAAC;AACF,OAAK,QAAQ;;;CAIjB,AAAQ,kBAAkB,SAAkD;AACxE,SAAO,KAAK,uBAAuB,QAAQ,YAAY,KAAK,MAAM,UAAU;GACxE,mBAAmB,QAAQ;GAC3B,mBAAmB,QAAQ;GAC3B,wBAAwB,QAAQ,QAAQ,iBAAiB,uBAAuB;GACnF,CAAC;;;CAIN,MAAc,iBACV,SACA,cACmB;EACnB,MAAM,SAAS,MAAM,KAAK,OAAO,IAC7B,KAAK,QAAQ,OACb,KAAK,iBACD,QAAQ,UACR,aAAa,aACb,aAAa,wBAChB,EACD;GACI,YAAY,KAAK,QAAQ;GACzB,QAAQ,QAAQ;GACnB,CACJ;EACD,MAAM,aAAa,KAAK,wBAAwB,OAAO;AAEvD,OAAK,2BAA2B,WAAW;AAC3C,OAAK,0BAA0B,QAAQ;AACvC,OAAK,UAAU,QAAQ;AACvB,OAAK,WAAW;GACZ,SAAS;GACT,gBAAgB,QAAQ;GAC3B,CAAC;AAEF,SAAO;GACH,OAAO,WAAW;GAClB,UAAU,KAAK;GAClB;;;CAIL,MAAc,kBACV,SACA,cACmB;EACnB,MAAM,iBAAiB,KAAK,0BACxB,QAAQ,yBACF;AACF,WAAQ,8BAA8B;KAE1C,QAAQ,OACX;EACD,MAAM,SAAS,KAAK,OAAO,OACvB,KAAK,QAAQ,OACb,KAAK,iBACD,QAAQ,UACR,aAAa,aACb,aAAa,wBAChB,EACD,eACH;EACD,MAAM,SAAS,MAAM,KAAK,2BAA2B,QAAQ;GACzD,QAAQ,QAAQ;GAChB,mBAAmB;GACtB,CAAC;AAEF,MAAI,CAAC,OAAO,cACR,OAAM,KAAK,wBACP,QACA,0CACH;AAEL,MAAI,OAAO,kBAAkB,QACzB,OAAM,OAAO,iCAAiB,IAAI,MAAM,cAAc;AAG1D,OAAK,UAAU,QAAQ;AACvB,OAAK,WAAW;GACZ,SAAS,OAAO,kBAAkB;GAClC,gBAAgB,QAAQ;GAC3B,CAAC;AACF,SAAO,EAAE,UAAU,KAAK,cAAc;;;CAI1C,MAAc,wBACV,OACA,SACmB;AACnB,MACI,KAAK,aACL,KAAK,aAAa,OAAO,QAAQ,OAAO,IACvC,KAAK,wBAAwB,MAAM,IAAI,KAAK,oBAAoB,EACnE;AACE,OAAI,KAAK,UAAU,QAAQ,kBAAkB,CAAC,QAAQ,6BAA6B;AAC/E,SAAK,QAAQ,QAAQ;AACrB,SAAK,QAAQ;;AAEjB,OAAI,CAAC,KAAK,UACN,MAAK,UAAU,QAAQ;AAE3B,UAAO,EAAE,UAAU,KAAK,cAAc;;EAG1C,IAAI,MAAM,mBAAmB,OAAO,cAAc;AAClD,MAAI,CAAC,QAAQ,iBAAiB,YAAY,KAAK,oBAAoB,IAAI,CACnE,KAAI;AACA,UAAO,MAAM,KAAK,0BAA0B,QAAQ,UAAU;IAC1D,GAAG,QAAQ;IACX,UAAU;IACV,wBAAwB,QAAQ;IACnC,CAAC;WACG,eAAe;AACpB,SAAM,mBAAmB,eAAe,cAAc;;AAI9D,OAAK,uBAAuB,SAAS,IAAI;AACzC,OAAK,SAAS,IAAI;AAClB,OAAK,UAAU,QAAQ;AACvB,MAAI,KAAK,wBAAwB,MAAM,CACnC,MAAK,QAAQ,eAAe;GACxB,OAAO;GACP,GAAI,KAAK,YAAY,EAAE,OAAO,KAAK,WAAW,GAAG,EAAE;GACnD,GAAI,KAAK,eAAe,EAAE,UAAU,KAAK,cAAc,GAAG,EAAE;GAC/D,CAAC;AAEN,OAAK,QAAQ,UAAU,IAAI;AAC3B,SAAO,KAAK,eAAe,EAAE,UAAU,KAAK,cAAc,GAAG,EAAE;;;CAInE,AAAQ,0BAA0B,SAAkC;AAChE,MAAI,CAAC,QAAQ,qBAAqB,QAAQ,4BACtC;AAGJ,OAAK,uBAAuB,QAAQ,oBAAoB,QAAQ;GAC5D,MAAM,EAAE,OAAO,QAAQ,GAAG,SAAS;AACnC,UAAO;IAAE,GAAG;IAAM,QAAQ;IAAQ;IACpC;AACF,UAAQ,8BAA8B;;;CAI1C,AAAQ,uBAAuB,SAA4B,KAA6B;AACpF,MAAI,CAAC,QAAQ,kBACT;AAGJ,MAAI,QAAQ,iBAAiB,YAAY,UAAU;AAC/C,QAAK,uBAAuB,QAAQ,kBAAkB;AACtD;;EAGJ,MAAM,SAAS,KAAK,uBAAuB,QAAQ,oBAAoB,SAAS;GAC5E,GAAG;GACH,QAAQ;GACR,OAAO,IAAI;GACd,EAAE;AACH,MAAI,OACA,MAAK,QAAQ,+BAA+B;GACxC,SAAS;GACT,OAAO;GACV,CAAC;;;CAKV,AAAQ,2BAA2B,QAI1B;AACL,MAAI,OAAO,MACP,MAAK,YAAY,OAAO;AAE5B,MAAI,OAAO,UAAU;AACjB,QAAK,eAAe,OAAO;AAC3B,QAAK,uBAAuB,OAAO,SAAS;;AAEhD,OAAK,iBAAiB,OAAO;;CAMjC,AAAQ,UAAU,QAA2B;AACzC,MAAI,KAAK,WAAW,OAAQ;AAC5B,OAAK,SAAS;AACd,OAAK,QAAQ;;;CAIjB,AAAQ,SAAS,OAA2C;AACxD,OAAK,QAAQ;;;CAIjB,AAAQ,QAAQ,OAAgB,UAAyB;AACrD,SAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,SAAS;;;CAI/D,AAAQ,eAAe,gBAGrB;AACE,OAAK,kBAAkB;AACvB,OAAK,kBAAkB;EACvB,MAAM,aAAa,IAAI,iBAAiB;AACxC,OAAK,wBAAwB;AAC7B,SAAO;GACH;GACA,QAAQ,KAAK,aAAa,WAAW,QAAQ,eAAe;GAC/D;;;CAIL,AAAQ,gBAAgB,YAAmC;AACvD,MAAI,KAAK,0BAA0B,WAC/B,MAAK,wBAAwB;;;CAKrC,AAAQ,mBAAyB;AAC7B,OAAK,uBAAuB,OAAO;AACnC,OAAK,wBAAwB;;;CAIjC,AAAQ,aAAa,SAAsB,gBAA2C;AAClF,MAAI,CAAC,eACD,QAAO;EAGX,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,aAAa,WAAwB;AACvC,OAAI,CAAC,WAAW,OAAO,QACnB,YAAW,MAAM,OAAO,OAAO;;AAIvC,MAAI,QAAQ,QACR,WAAU,QAAQ;MAElB,SAAQ,iBAAiB,eAAe,UAAU,QAAQ,EAAE,EAAE,MAAM,MAAM,CAAC;AAG/E,MAAI,eAAe,QACf,WAAU,eAAe;MAEzB,gBAAe,iBAAiB,eAAe,UAAU,eAAe,EAAE,EACtE,MAAM,MACT,CAAC;AAGN,SAAO,WAAW;;;CAItB,AAAQ,eAAe,QAA2B;AAC9C,MAAI,OAAO,QACP,OAAM,KAAK,aAAa,OAAO,OAAO;;;CAK9C,AAAQ,mBAAyB;AAC7B,MAAI,KAAK,UACL,OAAM,IAAI,MAAM,0CAA0C;;;CAKlE,AAAQ,aAAa,OAAgB,QAA+B;AAChE,UACK,QAAQ,WAAW,UACnB,iBAAiB,gBAAgB,MAAM,SAAS,gBAChD,iBAAiB,SAAS,MAAM,SAAS;;;CAKlD,AAAQ,wBAAwB,OAAgD;AAC5E,SAAO,iBAAiB;;;CAI5B,AAAQ,qBAA8B;AAClC,SACI,0BAA0B,IACzB,OAAO,aAAa,eAAe,SAAS,oBAAoB;;;CAKzE,AAAQ,aAAa,QAAyB;AAC1C,MAAI,kBAAkB,MAClB,QAAO;AAGX,MAAI;AACA,UAAO,IAAI,aACP,OAAO,WAAW,WAAW,SAAS,8BACtC,aACH;UACG;GACJ,MAAM,QAAQ,IAAI,MACd,OAAO,WAAW,WAAW,SAAS,6BACzC;AACD,SAAM,OAAO;AACb,UAAO;;;;CAKf,AAAQ,wBACJ,OACA,WAAW,wBACU;AAErB,SAAO,IAAI,sBADE,KAAK,QAAQ,OAAO,SAAS,CACJ,SAAS,MAAM;;;CAMzD,AAAQ,2BAA2B,UAAmC,OAAqB;EACvF,MAAM,gBAAgB,KAAK,MAAM,SAAS,GAAG,GAAG;AAChD,MAAI,CAAC,iBAAiB,cAAc,SAAS,OACzC;EAGJ,MAAM,gBAAgB,KAAK,oBAAoB,UAAU,MAAM;AAC/D,MAAI,CAAC,iBAAiB,KAAK,MAAM,UAAU,IAAI,cAAc,QAAQ,CACjE;AAGJ,MAAI,CAAC,KAAK,eAAe,eAAe,cAAc,CAClD;EAGJ,MAAM,eAAe,KAAK,MAAM,SAAS,OAAO;AAChD,eAAa,aAAa,SAAS,KAAK;GACpC,GAAG;GACH,SAAS,cAAc;GACvB,GAAI,cAAc,OAAO,SAAY,EAAE,IAAI,cAAc,IAAI,GAAG,EAAE;GAClE,QAAQ;GACX;AACD,OAAK,QAAQ,mBAAmB,aAAa;;;CAIjD,AAAQ,oBACJ,UACA,OACqB;EACrB,MAAM,QAAQ,SAAS;AAEvB,MAAI,OAAO,UAAU,SACjB,QAAO;GACH,SAAS,YAAY;GACrB,IAAI,YAAY;GAChB,MAAM;GACN,OAAO,CAAC;IAAE,MAAM;IAAQ,MAAM;IAAO,OAAO;IAAY,CAAC;GACzD,QAAQ;GACX;EAGL,MAAM,cAAc,MAAM,QAAQ,MAAM,GAClC,QACA,KAAK,2BAA2B,MAAM,GACpC,CAAC,MAAM,GACP;AACR,MAAI,CAAC,YACD;EAGJ,IAAI,QAAQ;EAIZ,MAAM,oBAAoB,CAAC,GAHJ,kBAAkB,aAA2C,EAChF,kBAAkB,YAAY,MAAM,IAAI,SAAS,SAAS,GAAG,IAChE,CAAC,CAC2C,CACxC,SAAS,CACT,MAAM,YAAY,QAAQ,SAAS,OAAO;AAE/C,SAAO,oBAAoB;GAAE,GAAG;GAAmB,QAAQ;GAAQ,GAAG;;;CAI1E,AAAQ,2BAA2B,OAIjC;AACE,SACI,OAAO,UAAU,YACjB,UAAU,QACT,MAA6B,SAAS,cACtC,OAAQ,MAAgC,YAAY,YACjD,MAAM,QAAS,MAAgC,QAAQ;;;CAKnE,AAAQ,eAAe,SAAoB,UAA8B;AACrE,SAAO,KAAK,UAAU,QAAQ,MAAM,KAAK,KAAK,UAAU,SAAS,MAAM;;;CAI3E,AAAQ,kBAAkB,SAA2C;AACjE,SAAO,KAAK,QAAQ,oBAAoB,QAAQ,IAAI,oBAAoB;;;CAI5E,AAAQ,kBAAkB,MAAqC;AAC3D,SAAO,KAAK,KAAK,aAAa;GAC1B,GAAG;GACH,SAAS,QAAQ,WAAW,KAAK,kBAAkB,QAAQ;GAC9D,EAAE;;;CAIP,AAAQ,+BACJ,MACA,MACO;AACP,SACI,KAAK,UAAU,KAAK,SACpB,KAAK,mBAAmB,KAAK,kBAC7B,KAAK,sBAAsB,KAAK,qBAChC,QAAQ,KAAK,OAAO,KAAK,QAAQ,KAAK,OAAO,KAC5C,OAAO,KAAK,WAAW,WAAW,KAAK,OAAO,WAAW,aACrD,OAAO,KAAK,WAAW,WAAW,KAAK,OAAO,WAAW,YAC7D,OAAO,KAAK,WAAW,WAAW,KAAK,OAAO,WAAW,aACrD,OAAO,KAAK,WAAW,WAAW,KAAK,OAAO,WAAW;;;CAKtE,AAAQ,wBAA8B;AAClC,OAAK,kBAAkB;EACvB,MAAM,aAAa,KAAK,kBAAkB,KAAK,QAAQ,mBAAmB,EAAE,CAAC;AAC7E,OAAK,QAAQ,mBAAmB,WAAW;AAC3C,OAAK,kBAAkB;AACvB,OAAK,eAAe;AACpB,OAAK,iBAAiB;AACtB,OAAK,YAAY;AACjB,OAAK,eAAe,KAAK,6BAA6B,KAAK,QAAQ;AACnE,OAAK,QAAQ;AACb,OAAK,SAAS;AACd,OAAK,iBAAiB;AACtB,OAAK,uBAAuB,OAAO;AACnC,OAAK,qBAAqB;AAC1B,OAAK,cAAc;AACnB,OAAK,QAAQ;AACb,OAAK,MAAM;;;CAIf,AAAQ,6BAA6B,SAAwD;AACzF,SAAO,OAAO,QAAQ,WAAW,YAAY,QAAQ,WAAW,OAC1D,QAAQ,OAAO,WACf;;;CAIV,AAAQ,oBAAoB,SAAwC;EAChE,MAAM,MAAM,KAAK,MAAM,UAAU,IAAI,QAAQ;AAC7C,SAAO,QAAQ,SAAY,SAAY,KAAK,MAAM,SAAS;;;CAI/D,AAAQ,uBACJ,SACA,SACqB;EACrB,MAAM,MAAM,KAAK,MAAM,UAAU,IAAI,QAAQ;AAC7C,MAAI,QAAQ,OAAW,QAAO;EAC9B,MAAM,UAAU,KAAK,MAAM,SAAS;AACpC,MAAI,CAAC,QAAS,QAAO;EACrB,MAAM,OAAO,KAAK,MAAM,SAAS,OAAO;AACxC,OAAK,OAAO,QAAQ,QAAQ;AAC5B,OAAK,QAAQ,mBAAmB,KAAK;AACrC,OAAK,QAAQ;AACb,SAAO,KAAK;;;CAIhB,AAAQ,uBAAuB,SAAuB;AAElD,MADY,KAAK,MAAM,UAAU,IAAI,QAAQ,KACjC,OAAW;AAEvB,OAAK,QAAQ,mBADA,KAAK,MAAM,SAAS,QAAQ,QAAQ,IAAI,YAAY,QAAQ,CACpC;AACrC,OAAK,QAAQ;;;CAMjB,AAAQ,0BAAmC;AACvC,MAAI,KAAK,QAAQ,aAAa,SAAU,QAAO;AAC/C,MAAI,KAAK,QAAQ,aAAa,QAAS,QAAO;AAC9C,SAAO;;;CAIX,AAAQ,oBAAoB,OAAkC;AAC1D,MAAI,KAAK,QAAQ,aAAa,OAAQ,QAAO;EAC7C,MAAM,UAAU,MAAM,QAAQ,aAAa;AAC3C,SACI,QAAQ,SAAS,wCAAwC,IACzD,QAAQ,SAAS,wCAAwC,IACzD,QAAQ,SAAS,6BAA6B;;;CAKtD,AAAQ,uBAAuB,UAAyC;EACpE,MAAM,mBAAmB,wBAAwB,SAAS,CAAC,KAAK,KAAK,OAAO;GACxE,GAAG;GACH,SAAS,KAAK,kBAAkB,IAAI;GACpC,GAAI,IAAI,KAAK,EAAE,GAAG,EAAE,IAAI,YAAY,EAAE,SAAS,GAAG,IAAI;GACzD,EAAE;AAEH,MAAI,iBAAiB,WAAW,EAAG;AAEnC,OAAK,QAAQ,mBADQ,CAAC,GAAG,KAAK,MAAM,UAAU,GAAG,iBAAiB,CACrB;AAC7C,OAAK,QAAQ;;;CAIjB,AAAQ,wBAAwB,SAI9B;AACE,MAAI,OAAO,YAAY,YAAY,YAAY,KAAM,QAAO,EAAE;EAE9D,MAAM,SAAS;EACf,MAAM,OACF,EAAE;AAEN,MAAI,OAAO,OAAO,UAAU,SAAU,MAAK,QAAQ,OAAO;EAW1D,MAAM,iBARF,OAAO,OAAO,WAAW,YACzB,OAAO,WAAW,QAClB,OAAQ,OAAO,OAAkC,aAAa,YAC7D,OAAO,OAAkC,aAAa,OAC/C,OAAO,OACJ,WACL,YAIL,OAAO,OAAO,aAAa,YAAY,OAAO,aAAa,OACrD,OAAO,WACR,YAAY,UAAU,MAAM,QAAQ,OAAO,OAAO,GAC/C,SACD;AAEZ,MAAI,cAAe,MAAK,WAAW;AACnC,MAAI,gBAAgB,OAAQ,MAAK,aAAa,OAAO;AACrD,SAAO;;;CAIX,AAAQ,uBACJ,YACA,cACA,SAQF;AACE,MAAI,CAAC,QAAQ,kBACT,QAAO;GAAE,aAAa;GAAY,yBAAyB;GAAO;AAGtE,MAAI,QAAQ,uBACR,QAAO;GACH,aAAa;GACb,yBAAyB;GAC5B;EAGL,MAAM,mBAAmB,KAAK,QAAQ,kBAAkB;GACpD,UAAU;GACV,OAAO;GACV,CAAC;AACF,MAAI,iBACA,QAAO;GACH,aAAa;GACb,yBAAyB;GAC5B;EAGL,MAAM,qBAAqB,gBAAgB,aAAa;EACxD,MAAM,aAAa,KAAK,oBAAoB,WAAW;AAEvD,MAAI,OAAO,eAAe,SACtB,QAAO;GACH,aAAa,QAAQ,oBACf,qBACA,CACI,GAAG,oBACH;IAAE,MAAM;IAAW,MAAM;IAAQ,SAAS;IAAY,CACzD;GACP,yBAAyB;GAC5B;AAGL,MAAI,WACA,QAAO;GACH,aACI,QAAQ,qBACR,KAAK,2CAA2C,WAAW,GACrD,qBACA,CAAC,GAAG,oBAAoB,GAAG,WAAW;GAChD,yBAAyB;GAC5B;AAGL,SAAO;GACH,aAAa;GACb,yBAAyB;GAC5B;;;CAIL,AAAQ,iBACJ,UACA,aACA,yBACuB;EACvB,MAAM,iBACF,OAAO,SAAS,mBAAmB,WAC7B,SAAS,iBACT,KAAK,QAAQ;EACvB,MAAM,eAAe,kBACjB,KAAK,QAAQ,cACb,SAAS,aACZ;EACD,MAAM,EAAE,cAAc,eAAe,GAAG,iBAAiB;AAEzD,SAAO;GACH,GAAG;GACH,OAAO;GACP,cAAc,OAAO,KAAK,aAAa,CAAC,SAAS,IAAI,eAAe;GACpE;GACA,SACI,SAAS,YAAY,UAAa,KAAK,QAAQ,YAAY,SACpD,SAAS,WAAW,KAAK,QAAQ,UAClC;GACV,gBAAgB,2BAA2B,QAAQ,eAAe,GAAG,OAAO;GAC/E;;;CAML,AAAQ,0BACJ,mBACA,cACA,QACmC;AAGnC,MAAI,EADA,KAAK,QAAQ,cAAc,KAAK,QAAQ,cAAc,KAAK,QAAQ,iBAClD,CAAC,qBAAqB,CAAC,OAAQ,QAAO;AAE3D,SAAO;GACH;GACA,aAAa,aAAuB;AAChC,SAAK,kBAAkB,SAAS;AAChC,SAAK,QAAQ,aAAa,SAAS;AACnC,QAAI,SAAS,MAAM,mBAAmB;AAClC,UAAK,uBAAuB,oBAAoB,QAAQ;MACpD,MAAM,EAAE,OAAO,QAAQ,GAAG,SAAS;AACnC,aAAO;OAAE,GAAG;OAAM,QAAQ;OAAQ;OACpC;AACF,mBAAc;;;GAGtB,YAAY,KAAK,QAAQ;GACzB,cAAc,KAAK,QAAQ;GAC9B;;;CAIL,AAAQ,oBAAoB,gBAAwB,YAA2B;EAC3E,MAAM,UAAU,KAAK,MAAM;EAC3B,MAAM,MAAM,KAAK,MAAM,UAAU,IAAI,eAAe;EACpD,MAAM,cAAc,KAAK,yBAAyB,WAAW,IAAI;GAC7D,SAAS;GACT,MAAM;GACN,OAAO,CAAC;IAAE,MAAM;IAAQ,MAAM,OAAO,cAAc,GAAG;IAAE,CAAC;GACzD,QAAQ;GACX;EAED,IAAI,eAAe;AACnB,MAAI,QAAQ,OACR,gBAAe,CAAC,GAAG,SAAS,YAAY;OACrC;GACH,MAAM,OAAO,QAAQ,MAAM,GAAG,IAAI;AAClC,QAAK,KAAK,YAAY;AACtB,kBAAe;;AAGnB,MAAI,iBAAiB,SAAS;AAC1B,QAAK,QAAQ,mBAAmB,aAAa;AAC7C,QAAK,QAAQ;;;;CAKrB,AAAQ,yBAAyB,YAA4C;AACzE,MAAI,OAAO,eAAe,SACtB,QAAO;GACH,SAAS,KAAK,mBAAmB;GACjC,MAAM;GACN,OAAO,CAAC;IAAE,MAAM;IAAQ,MAAM;IAAY,CAAC;GAC3C,QAAQ;GACX;AAGL,MAAI,OAAO,eAAe,YAAY,eAAe,QAAQ,aAAa,YAAY;GAClF,MAAM,UAAU;AAChB,OAAI,QAAQ,SAAS,UAAU,MAAM,QAAQ,QAAQ,MAAM,EAAE;IACzD,MAAM,EAAE,OAAO,QAAQ,GAAG,SAAS;AACnC,WAAO;KACH,GAAG;KACH,QAAQ;KACX;;;EAIT,MAAM,QAAQ,KAAK,oBAAoB,WAAW;AAClD,MAAI,CAAC,MACD;EAIJ,MAAM,aAAa,CAAC,GADH,kBAAkB,MAAM,CACT,CAAC,SAAS,CAAC,MAAM,YAAY,QAAQ,SAAS,OAAO;AACrF,MAAI,CAAC,WACD;EAGJ,MAAM,EAAE,OAAO,QAAQ,GAAG,SAAS;AACnC,SAAO;GACH,GAAG;GACH,QAAQ;GACX;;;CAIL,AAAQ,oBAAoB,YAA6D;AACrF,MAAI,MAAM,QAAQ,WAAW,CACzB,QAAO;AAGX,MACI,OAAO,eAAe,YACtB,eAAe,QACf,OAAQ,WAAkC,SAAS,SAEnD,QAAO,CAAC,WAAuC;;;CAOvD,AAAQ,gCAAgC,YAA8B;AAClE,MAAI,OAAO,eAAe,SACtB,QAAO;AAGX,MAAI,OAAO,eAAe,YAAY,eAAe,QAAQ,aAAa,YAAY;GAClF,MAAM,UAAU;AAChB,UAAO,QAAQ,SAAS,UAAU,MAAM,QAAQ,QAAQ,MAAM;;EAGlE,MAAM,QAAQ,KAAK,oBAAoB,WAAW;AAClD,MAAI,CAAC,SAAS,MAAM,WAAW,EAC3B,QAAO;EAGX,MAAM,CAAC,QAAQ;AACf,SAAO,MAAM,SAAS,cAAc,KAAK,SAAS,UAAa,KAAK,SAAS;;;CAIjF,AAAQ,2CAA2C,YAA8B;AAC7E,MAAI,OAAO,eAAe,SACtB,QAAO;AAGX,MAAI,OAAO,eAAe,YAAY,eAAe,QAAQ,aAAa,YAAY;GAClF,MAAM,UAAU;AAChB,UAAO,QAAQ,SAAS,UAAU,MAAM,QAAQ,QAAQ,MAAM;;EAGlE,MAAM,QAAQ,KAAK,oBAAoB,WAAW;AAClD,MAAI,CAAC,SAAS,MAAM,WAAW,EAC3B,QAAO;EAGX,MAAM,CAAC,QAAQ;AACf,SAAO,MAAM,SAAS,aAAa,KAAK,SAAS;;;CAMrD,AAAQ,WAAW,WAIV;EACL,MAAM,WAAW,KAAK;EACtB,MAAM,SAAS;GACX,UAAU,KAAK,MAAM;GACrB,SAAS,UAAU;GACtB;AAED,MAAI,KAAK,UACL,QAAO,QAAQ,KAAK;EAGxB,MAAM,gBAAgB,UAAU,YAAY,KAAK;AACjD,MAAI,cACA,QAAO,WAAW;EAGtB,MAAM,iBAAiB,UAAU,kBAAkB,KAAK,QAAQ;AAChE,MAAI,eACA,QAAO,iBAAiB;AAG5B,MAAI,UAAU;AACV,UAAO,WAAW;AAClB,UAAO,eAAe,SAAS;AAC/B,UAAO,QAAQ,SAAS;;AAG5B,MAAI,KAAK,mBAAmB,OACxB,CAAC,OAAsE,aACnE,KAAK;AAGb,OAAK,QAAQ,WAAW,OAAO;;;;;;AAOvC,SAAgB,0BAIZ,QACA,SACqC;AACrC,QAAO,IAAI,oBAAsC,QAAQ,QAAQ"}
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/core/client/index.ts","../src/core/controller.ts","../src/core/utils.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/core/client/index.ts","../src/core/controller.ts","../src/core/utils.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as toModelMessages, i as fromModelMessages, n as createAgentChatController, o as getEventErrorMessage, r as fromConversationItems, s as toAgentClientError } from "./controller-
|
|
1
|
+
import { a as toModelMessages, i as fromModelMessages, n as createAgentChatController, o as getEventErrorMessage, r as fromConversationItems, s as toAgentClientError } from "./controller-BrBUfjhZ.mjs";
|
|
2
2
|
import { Events } from "@better-agent/core/events";
|
|
3
3
|
import { BetterAgentError } from "@better-agent/shared/errors";
|
|
4
4
|
import { pruneInputByCapabilities } from "@better-agent/core";
|
package/dist/preact/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as AgentChatController } from "../controller-
|
|
1
|
+
import { t as AgentChatController } from "../controller-BrBUfjhZ.mjs";
|
|
2
2
|
import { n as getLatestUserMessageId, r as normalizeSendInput, t as cloneControllerOptions } from "../utils-CiHUj_BW.mjs";
|
|
3
3
|
import { useEffect, useReducer, useRef } from "preact/hooks";
|
|
4
4
|
|
package/dist/react/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as AgentChatController } from "../controller-
|
|
1
|
+
import { t as AgentChatController } from "../controller-BrBUfjhZ.mjs";
|
|
2
2
|
import { n as getLatestUserMessageId, r as normalizeSendInput, t as cloneControllerOptions } from "../utils-CiHUj_BW.mjs";
|
|
3
3
|
import { useEffect, useReducer, useRef } from "react";
|
|
4
4
|
|
package/dist/solid/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as AgentChatController } from "../controller-
|
|
1
|
+
import { t as AgentChatController } from "../controller-BrBUfjhZ.mjs";
|
|
2
2
|
import { n as getLatestUserMessageId, r as normalizeSendInput, t as cloneControllerOptions } from "../utils-CiHUj_BW.mjs";
|
|
3
3
|
import { createRenderEffect, createSignal, onCleanup, onMount } from "solid-js";
|
|
4
4
|
|
package/dist/svelte/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as AgentChatController } from "../controller-
|
|
1
|
+
import { t as AgentChatController } from "../controller-BrBUfjhZ.mjs";
|
|
2
2
|
import { n as getLatestUserMessageId, r as normalizeSendInput, t as cloneControllerOptions } from "../utils-CiHUj_BW.mjs";
|
|
3
3
|
import { writable } from "svelte/store";
|
|
4
4
|
|
package/dist/vue/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as AgentChatController } from "../controller-
|
|
1
|
+
import { t as AgentChatController } from "../controller-BrBUfjhZ.mjs";
|
|
2
2
|
import { n as getLatestUserMessageId, r as normalizeSendInput, t as cloneControllerOptions } from "../utils-CiHUj_BW.mjs";
|
|
3
3
|
import { computed, onMounted, onUnmounted, ref, toValue, watchEffect } from "vue";
|
|
4
4
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@better-agent/client",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.3",
|
|
4
4
|
"description": "Better Agent client TypeScript library",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -97,8 +97,8 @@
|
|
|
97
97
|
}
|
|
98
98
|
},
|
|
99
99
|
"dependencies": {
|
|
100
|
-
"@better-agent/core": "0.1.0-
|
|
101
|
-
"@better-agent/shared": "0.1.0-
|
|
100
|
+
"@better-agent/core": "0.1.0-beta.3",
|
|
101
|
+
"@better-agent/shared": "0.1.0-beta.3"
|
|
102
102
|
},
|
|
103
103
|
"devDependencies": {
|
|
104
104
|
"@types/bun": "^1.2.18",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"controller-Cf_JhTdJ.mjs","names":[],"sources":["../src/core/browser-lifecycle.ts","../src/core/error.ts","../src/core/utils.ts","../src/core/reducer.ts","../src/core/response.ts","../src/core/controller.ts"],"sourcesContent":["declare global {\n interface Window {\n __baPageTeardown?: boolean;\n __baPageTeardownInstalled?: boolean;\n }\n}\n\nconst markPageTeardown = () => {\n if (typeof window !== \"undefined\") {\n window.__baPageTeardown = true;\n }\n};\n\n/** Installs one browser teardown tracker for refresh/navigation. */\nexport const ensureBrowserTeardownTracking = (): void => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n window.__baPageTeardown ??= false;\n if (window.__baPageTeardownInstalled) {\n return;\n }\n\n window.__baPageTeardownInstalled = true;\n window.addEventListener(\"pagehide\", markPageTeardown);\n window.addEventListener(\"beforeunload\", markPageTeardown);\n};\n\n/** Returns true while the current browser page is being torn down. */\nexport const isBrowserPageTearingDown = (): boolean =>\n typeof window !== \"undefined\" && window.__baPageTeardown === true;\n","/** One frame from a serialized Better Agent error trace. */\nexport interface AgentClientErrorTraceFrame {\n /** Trace step name. */\n at: string;\n /** Optional trace metadata. */\n data?: Record<string, unknown>;\n}\n\n/** Client-normalized Better Agent error shape. */\nexport interface AgentClientError extends Error {\n /** Stable error code. */\n code?: string;\n /** HTTP status when available. */\n status?: number;\n /** Whether the request may succeed on retry. */\n retryable?: boolean;\n /** Short human title. */\n title?: string;\n /** Detailed error message. */\n detail?: string;\n /** Validation or structured issues. */\n issues?: unknown[];\n /** Server trace id. */\n traceId?: string;\n /** Extra error context. */\n context?: Record<string, unknown>;\n /** Structured trace frames. */\n trace?: AgentClientErrorTraceFrame[];\n /** Original thrown value. */\n raw?: unknown;\n}\n\n/** Internal error used to mark broken stream transport. */\nexport class StreamDisconnectError extends Error {\n cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"StreamDisconnectError\";\n this.cause = cause;\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst stripSurfacePrefix = (message: string): string =>\n message.replace(/^(run failed|stream failed):\\s*/i, \"\");\n\nconst extractMessage = (error: unknown): string | undefined => {\n if (error instanceof Error && typeof error.message === \"string\" && error.message.trim()) {\n return stripSurfacePrefix(error.message);\n }\n if (!isRecord(error)) return undefined;\n\n const message =\n (typeof error.message === \"string\" && error.message) ||\n (typeof error.detail === \"string\" && error.detail) ||\n (typeof error.title === \"string\" && error.title);\n\n return typeof message === \"string\" && message.trim().length > 0\n ? stripSurfacePrefix(message)\n : undefined;\n};\n\n/** Normalizes unknown failures into `AgentClientError`. */\nexport const toAgentClientError = (\n error: unknown,\n fallbackMessage = \"Run failed.\",\n): AgentClientError => {\n if (error instanceof Error) {\n const enriched = error as AgentClientError;\n enriched.message = stripSurfacePrefix(enriched.message);\n if (typeof enriched.detail === \"string\" && enriched.detail.length > 0) {\n enriched.detail = stripSurfacePrefix(enriched.detail);\n }\n if (enriched.raw === undefined) enriched.raw = error;\n return enriched;\n }\n\n const message = extractMessage(error) ?? fallbackMessage;\n const next = new Error(message) as AgentClientError;\n next.raw = error;\n\n if (!isRecord(error)) return next;\n\n if (typeof error.code === \"string\") next.code = error.code;\n if (typeof error.status === \"number\") next.status = error.status;\n if (typeof error.retryable === \"boolean\") next.retryable = error.retryable;\n if (typeof error.title === \"string\") next.title = error.title;\n if (typeof error.detail === \"string\") next.detail = stripSurfacePrefix(error.detail);\n if (typeof error.traceId === \"string\") next.traceId = error.traceId;\n if (Array.isArray(error.issues)) next.issues = error.issues;\n if (isRecord(error.context)) next.context = error.context;\n if (Array.isArray(error.trace)) next.trace = error.trace as AgentClientErrorTraceFrame[];\n\n return next;\n};\n\n/**\n * Resolves a user-facing message from an event error payload.\n */\nexport const getEventErrorMessage = (error: unknown): string => toAgentClientError(error).message;\n","import type {\n ConversationItem,\n GenerativeModelInputItem,\n GenerativeModelInputMessagePart,\n} from \"@better-agent/core/providers\";\nimport type { UIMessage, UIMessagePart } from \"../types/ui\";\n\nconst withProviderMetadata = (part: { providerMetadata?: unknown }) =>\n part.providerMetadata !== undefined &&\n typeof part.providerMetadata === \"object\" &&\n part.providerMetadata !== null\n ? { providerMetadata: part.providerMetadata as Record<string, unknown> }\n : {};\n\n/** Converts one persisted part into a UI part. */\nexport const contentPartToUIPart = (part: unknown): UIMessagePart | null => {\n if (\n typeof part !== \"object\" ||\n part === null ||\n typeof (part as { type?: unknown }).type !== \"string\"\n ) {\n return null;\n }\n\n const record = part as {\n type: string;\n text?: unknown;\n source?: unknown;\n embedding?: unknown;\n segments?: unknown;\n visibility?: unknown;\n provider?: unknown;\n providerMetadata?: unknown;\n };\n switch (record.type) {\n case \"text\":\n return typeof record.text === \"string\"\n ? {\n type: \"text\",\n text: record.text,\n ...withProviderMetadata(record),\n state: \"complete\",\n }\n : null;\n case \"image\":\n return {\n type: \"image\",\n source: record.source as Extract<UIMessagePart, { type: \"image\" }>[\"source\"],\n ...withProviderMetadata(record),\n state: \"complete\",\n };\n case \"file\":\n return {\n type: \"file\",\n source: record.source as Extract<UIMessagePart, { type: \"file\" }>[\"source\"],\n ...withProviderMetadata(record),\n state: \"complete\",\n };\n case \"audio\":\n return {\n type: \"audio\",\n source: record.source as Extract<UIMessagePart, { type: \"audio\" }>[\"source\"],\n ...withProviderMetadata(record),\n state: \"complete\",\n };\n case \"video\":\n return {\n type: \"video\",\n source: record.source as Extract<UIMessagePart, { type: \"video\" }>[\"source\"],\n ...withProviderMetadata(record),\n state: \"complete\",\n };\n case \"embedding\":\n return Array.isArray(record.embedding) &&\n record.embedding.every((value) => typeof value === \"number\")\n ? {\n type: \"embedding\",\n embedding: record.embedding,\n ...withProviderMetadata(record),\n state: \"complete\",\n }\n : null;\n case \"transcript\":\n return typeof record.text === \"string\"\n ? {\n type: \"transcript\",\n text: record.text,\n ...(Array.isArray(record.segments)\n ? {\n segments: record.segments as Extract<\n UIMessagePart,\n { type: \"transcript\" }\n >[\"segments\"],\n }\n : {}),\n ...withProviderMetadata(record),\n state: \"complete\",\n }\n : null;\n case \"reasoning\":\n return typeof record.text === \"string\" &&\n (record.visibility === \"summary\" || record.visibility === \"full\")\n ? {\n type: \"reasoning\",\n text: record.text,\n visibility: record.visibility,\n ...(typeof record.provider === \"string\" ? { provider: record.provider } : {}),\n ...withProviderMetadata(record),\n state: \"complete\",\n }\n : null;\n default:\n return null;\n }\n};\n\n// UI to model.\n\nconst toModelInputParts = (\n message: UIMessage,\n): Array<\n GenerativeModelInputMessagePart<{\n inputModalities: {\n text: true;\n audio: true;\n image: true;\n file: true;\n video: true;\n };\n additionalSupportedRoles: readonly string[];\n }>\n> => {\n const out: Array<\n GenerativeModelInputMessagePart<{\n inputModalities: {\n text: true;\n audio: true;\n image: true;\n file: true;\n video: true;\n };\n additionalSupportedRoles: readonly string[];\n }>\n > = [];\n for (const part of message.parts) {\n const providerMetadata = \"providerMetadata\" in part ? part.providerMetadata : undefined;\n\n if (part.type === \"text\") {\n out.push({\n type: \"text\",\n text: part.text,\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.type === \"audio\") {\n if (part.source.kind === \"url\") {\n out.push({\n type: \"audio\",\n source: {\n kind: \"url\",\n url: part.source.url,\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n out.push({\n type: \"audio\",\n source: {\n kind: \"base64\",\n data: part.source.data,\n mimeType: part.source.mimeType ?? \"audio/wav\",\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.type === \"image\") {\n if (part.source.kind === \"url\") {\n out.push({\n type: \"image\",\n source: {\n kind: \"url\",\n url: part.source.url,\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n out.push({\n type: \"image\",\n source: {\n kind: \"base64\",\n data: part.source.data,\n mimeType: part.source.mimeType ?? \"image/png\",\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.type === \"file\") {\n if (part.source.kind === \"url\") {\n out.push({\n type: \"file\",\n source: {\n kind: \"url\",\n url: part.source.url,\n ...(part.source.mimeType ? { mimeType: part.source.mimeType } : {}),\n ...(part.source.filename ? { filename: part.source.filename } : {}),\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.source.kind === \"provider-file\") {\n out.push({\n type: \"file\",\n source: {\n kind: \"provider-file\",\n ref: part.source.ref,\n ...(part.source.mimeType ? { mimeType: part.source.mimeType } : {}),\n ...(part.source.filename ? { filename: part.source.filename } : {}),\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n out.push({\n type: \"file\",\n source: {\n kind: \"base64\",\n data: part.source.data,\n mimeType: part.source.mimeType,\n ...(part.source.filename ? { filename: part.source.filename } : {}),\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.type === \"video\") {\n if (part.source.kind === \"url\") {\n out.push({\n type: \"video\",\n source: {\n kind: \"url\",\n url: part.source.url,\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n out.push({\n type: \"video\",\n source: {\n kind: \"base64\",\n data: part.source.data,\n mimeType: part.source.mimeType ?? \"video/mp4\",\n },\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.type === \"embedding\") {\n out.push({\n type: \"embedding\",\n embedding: part.embedding,\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.type === \"transcript\") {\n out.push({\n type: \"transcript\",\n text: part.text,\n ...(part.segments ? { segments: part.segments } : {}),\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n continue;\n }\n if (part.type === \"reasoning\") {\n out.push({\n type: \"reasoning\",\n text: part.text,\n visibility: part.visibility,\n ...(part.provider ? { provider: part.provider } : {}),\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n });\n }\n }\n return out;\n};\n\n/** Converts UI messages into model input messages. */\nexport const toModelMessages = (\n msgs: UIMessage[],\n): Array<\n GenerativeModelInputItem<{\n inputModalities: {\n text: true;\n audio: true;\n image: true;\n file: true;\n video: true;\n };\n additionalSupportedRoles: readonly string[];\n }>\n> =>\n msgs.flatMap((message) => {\n const parts = toModelInputParts(message);\n const items: Array<\n GenerativeModelInputItem<{\n inputModalities: {\n text: true;\n audio: true;\n image: true;\n file: true;\n video: true;\n };\n additionalSupportedRoles: readonly string[];\n }>\n > = [];\n\n if (parts.length > 0) {\n const hasNonText = parts.some((part) => part.type !== \"text\");\n items.push({\n type: \"message\",\n role: message.role as never,\n content:\n hasNonText || parts.length !== 1 || parts[0]?.type !== \"text\"\n ? parts\n : parts[0].text,\n });\n }\n\n const completedCalls = new Map<string, string>();\n for (const part of message.parts) {\n if (part.type !== \"tool-call\") {\n continue;\n }\n\n const toolName = part.name;\n const isCompleted =\n toolName &&\n (part.status === \"success\" ||\n part.status === \"error\" ||\n part.state === \"completed\");\n if (isCompleted) {\n completedCalls.set(part.callId, toolName);\n }\n }\n\n for (const part of message.parts) {\n if (part.type !== \"tool-result\") {\n continue;\n }\n\n const toolName = completedCalls.get(part.callId);\n if (!toolName || (part.status !== \"success\" && part.status !== \"error\")) {\n continue;\n }\n\n items.push({\n type: \"tool-call\",\n name: toolName,\n callId: part.callId,\n result: part.result,\n ...(part.status === \"error\" ? { isError: true } : {}),\n });\n }\n\n return items;\n });\n\n// Model -> UI.\n\nconst contentToUIParts = (content: string | unknown[]): UIMessagePart[] => {\n if (typeof content === \"string\") {\n return [{ type: \"text\", text: content, state: \"complete\" }];\n }\n\n return content\n .map((part) => contentPartToUIPart(part))\n .filter((part): part is UIMessagePart => part !== null);\n};\n\n/** Converts model input messages back into UI messages. */\nexport const fromModelMessages = (\n messages: GenerativeModelInputItem[],\n options?: { generateId?: () => string },\n): UIMessage[] => {\n const generateId = options?.generateId ?? makeLocalMessageId;\n const result: UIMessage[] = [];\n let activeAssistantMessageIndex: number | undefined;\n\n for (const item of messages) {\n if (item.type === \"message\") {\n const parts = contentToUIParts(item.content);\n\n if (parts.length === 0) {\n continue;\n }\n\n result.push({\n localId: generateId(),\n role: item.role ?? \"user\",\n parts,\n });\n activeAssistantMessageIndex =\n (item.role ?? \"user\") === \"assistant\" ? result.length - 1 : undefined;\n continue;\n }\n\n const status = item.isError ? \"error\" : \"success\";\n const toolParts: UIMessagePart[] = [\n {\n type: \"tool-call\",\n callId: item.callId,\n name: item.name,\n status,\n state: \"completed\",\n },\n {\n type: \"tool-result\",\n callId: item.callId,\n result: item.result,\n status,\n },\n ];\n\n if (activeAssistantMessageIndex !== undefined) {\n const message = result[activeAssistantMessageIndex];\n if (message?.role === \"assistant\") {\n result[activeAssistantMessageIndex] = {\n ...message,\n parts: [...message.parts, ...toolParts],\n };\n continue;\n }\n }\n\n result.push({\n localId: generateId(),\n role: \"assistant\",\n parts: toolParts,\n });\n activeAssistantMessageIndex = result.length - 1;\n }\n\n return result;\n};\n\n/** Converts durable conversation items back into UI messages. */\nexport const fromConversationItems = (\n items: ConversationItem[],\n options?: { generateId?: () => string },\n): UIMessage[] => {\n const generateId = options?.generateId ?? makeLocalMessageId;\n const result: UIMessage[] = [];\n let activeAssistantMessageIndex: number | undefined;\n\n for (const item of items) {\n if (item.type === \"message\") {\n const parts = contentToUIParts(item.content);\n if (parts.length === 0) {\n continue;\n }\n\n result.push({\n localId: generateId(),\n role: item.role ?? \"user\",\n parts,\n });\n activeAssistantMessageIndex =\n (item.role ?? \"user\") === \"assistant\" ? result.length - 1 : undefined;\n continue;\n }\n\n if (\"arguments\" in item) {\n const part: UIMessagePart = {\n type: \"tool-call\",\n callId: item.callId,\n name: item.name,\n args: item.arguments,\n status: \"pending\",\n state: \"input-complete\",\n };\n\n if (activeAssistantMessageIndex !== undefined) {\n const message = result[activeAssistantMessageIndex];\n if (message?.role === \"assistant\") {\n result[activeAssistantMessageIndex] = {\n ...message,\n parts: [...message.parts, part],\n };\n continue;\n }\n }\n\n result.push({\n localId: generateId(),\n role: \"assistant\",\n parts: [part],\n });\n activeAssistantMessageIndex = result.length - 1;\n continue;\n }\n\n let appendedToExistingMessage = false;\n for (let index = result.length - 1; index >= 0; index -= 1) {\n const message = result[index];\n if (!message || message.role !== \"assistant\") {\n continue;\n }\n\n const partIndex = message.parts.findIndex(\n (part) => part.type === \"tool-call\" && part.callId === item.callId,\n );\n if (partIndex < 0) {\n continue;\n }\n\n const existingPart = message.parts[partIndex];\n if (!existingPart || existingPart.type !== \"tool-call\") {\n break;\n }\n\n const status = item.isError ? \"error\" : \"success\";\n const parts = message.parts.slice();\n parts[partIndex] = {\n ...existingPart,\n ...(existingPart.name === undefined ? { name: item.name } : {}),\n status,\n state: \"completed\",\n };\n parts.splice(partIndex + 1, 0, {\n type: \"tool-result\",\n callId: item.callId,\n result: item.result,\n status,\n });\n result[index] = { ...message, parts };\n appendedToExistingMessage = true;\n break;\n }\n\n if (appendedToExistingMessage) {\n continue;\n }\n\n const status = item.isError ? \"error\" : \"success\";\n const toolParts: UIMessagePart[] = [\n {\n type: \"tool-call\",\n callId: item.callId,\n name: item.name,\n status,\n state: \"completed\",\n },\n {\n type: \"tool-result\",\n callId: item.callId,\n result: item.result,\n status,\n },\n ];\n\n if (activeAssistantMessageIndex !== undefined) {\n const message = result[activeAssistantMessageIndex];\n if (message?.role === \"assistant\") {\n result[activeAssistantMessageIndex] = {\n ...message,\n parts: [...message.parts, ...toolParts],\n };\n continue;\n }\n }\n\n result.push({\n localId: generateId(),\n role: \"assistant\",\n parts: toolParts,\n });\n activeAssistantMessageIndex = result.length - 1;\n }\n\n return result;\n};\n\n/** Creates a local message id. */\nexport const makeLocalMessageId = () =>\n globalThis.crypto?.randomUUID?.() ??\n `msg_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n/** Normalizes optimistic message options. */\nexport const normalizeOptimisticUserMessageConfig = (\n optimisticUserMessage:\n | boolean\n | {\n enabled?: boolean;\n onError?: \"fail\" | \"remove\";\n }\n | undefined,\n): {\n enabled: boolean;\n onError: \"fail\" | \"remove\";\n} => {\n if (optimisticUserMessage === true) {\n return { enabled: true, onError: \"fail\" };\n }\n if (optimisticUserMessage === false) {\n return { enabled: false, onError: \"fail\" };\n }\n if (!optimisticUserMessage) {\n return { enabled: true, onError: \"fail\" };\n }\n return {\n enabled: optimisticUserMessage.enabled ?? true,\n onError: optimisticUserMessage.onError ?? \"fail\",\n };\n};\n\n/** Deep-merges model option objects. Arrays are replaced, not merged. */\nexport const mergeModelOptions = (\n ...parts: Array<Record<string, unknown> | undefined>\n): Record<string, unknown> => {\n const merged: Record<string, unknown> = {};\n\n const mergeInto = (target: Record<string, unknown>, source: Record<string, unknown>) => {\n for (const [key, value] of Object.entries(source)) {\n const existing = target[key];\n if (\n existing !== null &&\n typeof existing === \"object\" &&\n !Array.isArray(existing) &&\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n target[key] = mergeInto(\n { ...(existing as Record<string, unknown>) },\n value as Record<string, unknown>,\n );\n } else {\n target[key] = value;\n }\n }\n\n return target;\n };\n\n for (const part of parts) {\n if (part) mergeInto(merged, part);\n }\n\n return merged;\n};\n","import type { Event as EventTypes, Role } from \"@better-agent/core/events\";\nimport type { GenerativeModelInputItem } from \"@better-agent/core/providers\";\nimport type { ToolCallPart, ToolResultPart, UIMessage } from \"../types/ui\";\nimport { fromModelMessages } from \"./utils\";\n\n/** Message array plus a local-id index. */\nexport interface MessageState {\n /** Messages in order. */\n messages: UIMessage[];\n /** Local message id to message index. */\n byLocalId: Map<string, number>;\n}\n\nexport interface ApplyEventOptions {\n /** Rebuilds the user turn from replayed `RUN_STARTED`. */\n synthesizeReplayUserMessage?: boolean;\n}\n\n/** Applies one core event to the current message state. */\nexport const applyEvent = (\n state: MessageState,\n event: EventTypes,\n options?: ApplyEventOptions,\n): MessageState => {\n switch (event.type) {\n case \"RUN_STARTED\": {\n if (!options?.synthesizeReplayUserMessage) {\n return state;\n }\n\n return maybeInsertReplayUserMessage(state, event.runInput, event.runId);\n }\n\n // Message parts.\n case \"TEXT_MESSAGE_START\": {\n const role = event.role ?? \"assistant\";\n return ensureMessage(state, event.messageId, role);\n }\n case \"TEXT_MESSAGE_CONTENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n appendText(msg, event.delta),\n );\n }\n case \"TEXT_MESSAGE_END\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n markLatestPartComplete(msg, \"text\"),\n );\n }\n case \"AUDIO_MESSAGE_START\": {\n const role = event.role ?? \"assistant\";\n return ensureMessage(state, event.messageId, role);\n }\n case \"AUDIO_MESSAGE_CONTENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n appendAudio(msg, event.delta),\n );\n }\n case \"AUDIO_MESSAGE_END\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n markLatestPartComplete(msg, \"audio\"),\n );\n }\n case \"IMAGE_MESSAGE_START\": {\n const role = event.role ?? \"assistant\";\n return ensureMessage(state, event.messageId, role);\n }\n case \"IMAGE_MESSAGE_CONTENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n appendImage(msg, event.delta),\n );\n }\n case \"IMAGE_MESSAGE_END\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n markLatestPartComplete(msg, \"image\"),\n );\n }\n case \"VIDEO_MESSAGE_START\": {\n const role = event.role ?? \"assistant\";\n return ensureMessage(state, event.messageId, role);\n }\n case \"VIDEO_MESSAGE_CONTENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n appendVideo(msg, event.delta),\n );\n }\n case \"VIDEO_MESSAGE_END\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n markLatestPartComplete(msg, \"video\"),\n );\n }\n case \"EMBEDDING_MESSAGE_START\": {\n const role = event.role ?? \"assistant\";\n return ensureMessage(state, event.messageId, role);\n }\n case \"EMBEDDING_MESSAGE_CONTENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n appendEmbedding(msg, event.delta),\n );\n }\n case \"EMBEDDING_MESSAGE_END\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n markLatestPartComplete(msg, \"embedding\"),\n );\n }\n\n // Streamed transcript/reasoning parts.\n case \"TRANSCRIPT_MESSAGE_START\": {\n const role = event.role ?? \"assistant\";\n return ensureMessage(state, event.messageId, role);\n }\n case \"TRANSCRIPT_MESSAGE_CONTENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n appendTranscriptText(msg, event.delta),\n );\n }\n case \"TRANSCRIPT_MESSAGE_SEGMENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n upsertTranscriptSegment(msg, event.segment),\n );\n }\n case \"TRANSCRIPT_MESSAGE_END\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n markLatestPartComplete(msg, \"transcript\"),\n );\n }\n case \"REASONING_MESSAGE_START\": {\n const role = event.role ?? \"assistant\";\n return ensureAndUpdateMessage(state, event.messageId, role, (msg) =>\n appendReasoningText(msg, \"\", event.visibility),\n );\n }\n case \"REASONING_MESSAGE_CONTENT\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n appendReasoningText(msg, event.delta, event.visibility),\n );\n }\n case \"REASONING_MESSAGE_END\": {\n return updateAssistantMessage(state, event.messageId, (msg) =>\n markLatestPartComplete(msg, \"reasoning\"),\n );\n }\n\n // Tool lifecycle on the current assistant turn.\n case \"TOOL_CALL_START\": {\n return updateResolvedToolMessage(\n state,\n event.parentMessageId,\n event.toolCallId,\n (msg) =>\n isToolCallCompleted(msg, event.toolCallId)\n ? msg\n : upsertToolPart(msg, \"tool-call\", event.toolCallId, {\n name: event.toolCallName,\n ...(event.toolTarget !== undefined\n ? { toolTarget: event.toolTarget }\n : {}),\n status: \"pending\",\n state: \"awaiting-input\",\n }),\n );\n }\n case \"TOOL_CALL_ARGS\": {\n return updateResolvedToolMessage(\n state,\n event.parentMessageId,\n event.toolCallId,\n (msg) =>\n isToolCallCompleted(msg, event.toolCallId)\n ? msg\n : upsertToolPart(\n msg,\n \"tool-call\",\n event.toolCallId,\n {\n name: event.toolCallName,\n ...(event.toolTarget !== undefined\n ? { toolTarget: event.toolTarget }\n : {}),\n status: \"pending\",\n state: \"input-streaming\",\n },\n (part) =>\n part.type === \"tool-call\"\n ? { ...part, args: (part.args ?? \"\") + event.delta }\n : part,\n ),\n );\n }\n case \"TOOL_CALL_END\": {\n return updateResolvedToolMessage(\n state,\n event.parentMessageId,\n event.toolCallId,\n (msg) => {\n if (isToolCallCompleted(msg, event.toolCallId)) {\n return msg;\n }\n\n const existing = findToolCallPart(msg, event.toolCallId);\n if (isApprovalLifecycleState(existing?.state)) {\n return msg;\n }\n\n return upsertToolPart(msg, \"tool-call\", event.toolCallId, {\n name: event.toolCallName,\n ...(event.toolTarget !== undefined ? { toolTarget: event.toolTarget } : {}),\n status: \"pending\",\n state: \"input-complete\",\n });\n },\n );\n }\n case \"TOOL_CALL_RESULT\": {\n return updateResolvedToolMessage(\n state,\n event.parentMessageId,\n event.toolCallId,\n (msg) => {\n const status = event.isError ? \"error\" : \"success\";\n const withResult = upsertToolPart(msg, \"tool-result\", event.toolCallId, {\n result: event.result,\n status,\n });\n return upsertToolPart(withResult, \"tool-call\", event.toolCallId, {\n name: event.toolCallName,\n ...(event.toolTarget !== undefined ? { toolTarget: event.toolTarget } : {}),\n status,\n state: \"completed\",\n });\n },\n );\n }\n\n // Approval updates extend the tool call.\n case \"TOOL_APPROVAL_REQUIRED\": {\n return updateResolvedToolMessage(\n state,\n event.parentMessageId,\n event.toolCallId,\n (msg) => {\n const withState = upsertToolPart(msg, \"tool-call\", event.toolCallId, {\n name: event.toolCallName,\n ...(event.toolTarget !== undefined ? { toolTarget: event.toolTarget } : {}),\n status: \"pending\",\n state: \"approval-requested\",\n });\n return updateToolApprovalMeta(withState, event.toolCallId, {\n input: event.toolInput,\n ...(event.meta !== undefined ? { meta: event.meta } : {}),\n });\n },\n );\n }\n case \"TOOL_APPROVAL_UPDATED\": {\n return updateResolvedToolMessage(\n state,\n event.parentMessageId,\n event.toolCallId,\n (msg) => {\n const withState = upsertToolPart(msg, \"tool-call\", event.toolCallId, {\n name: event.toolCallName,\n ...(event.toolTarget !== undefined ? { toolTarget: event.toolTarget } : {}),\n status: getApprovalStatus(event.state),\n state: getApprovalPartState(event.state),\n });\n return updateToolApprovalMeta(withState, event.toolCallId, {\n ...(event.toolInput !== undefined ? { input: event.toolInput } : {}),\n ...(event.meta !== undefined ? { meta: event.meta } : {}),\n ...(event.note !== undefined ? { note: event.note } : {}),\n ...(event.actorId !== undefined ? { actorId: event.actorId } : {}),\n });\n },\n );\n }\n default:\n return state;\n }\n};\n\n/** Creates message state from UI messages. */\nexport const createMessageState = (initial: UIMessage[] = []): MessageState => {\n const byLocalId = new Map<string, number>();\n initial.forEach((m, i) => byLocalId.set(m.localId, i));\n return { messages: initial, byLocalId };\n};\n\n// Replay helpers.\n\nconst findMessageLocalIdByToolCallId = (\n state: MessageState,\n toolCallId: string,\n): string | undefined => {\n for (let i = state.messages.length - 1; i >= 0; i -= 1) {\n const message = state.messages[i];\n if (!message) continue;\n const hasToolPart = message.parts.some(\n (part) =>\n (part.type === \"tool-call\" || part.type === \"tool-result\") &&\n part.callId === toolCallId,\n );\n if (hasToolPart) return message.localId;\n }\n return undefined;\n};\n\nconst findLatestAssistantMessageLocalId = (state: MessageState): string | undefined => {\n for (let i = state.messages.length - 1; i >= 0; i -= 1) {\n const message = state.messages[i];\n if (message?.role === \"assistant\") return message.localId;\n }\n return undefined;\n};\n\nconst resolveCurrentTurnAssistantLocalId = (state: MessageState): string | undefined => {\n for (let i = state.messages.length - 1; i >= 0; i -= 1) {\n const message = state.messages[i];\n if (message?.role !== \"user\") continue;\n const userLocalId = message.localId;\n let latestAssistantAfterUser: string | undefined;\n for (let j = i + 1; j < state.messages.length; j += 1) {\n const candidate = state.messages[j];\n if (candidate?.role === \"assistant\") latestAssistantAfterUser = candidate.localId;\n }\n\n return latestAssistantAfterUser ?? `assistant_turn:${userLocalId}`;\n }\n return undefined;\n};\n\n// Resolve tool state to the best assistant message.\nconst resolveToolMessageLocalId = (\n state: MessageState,\n parentMessageId: string | undefined,\n toolCallId: string,\n): string | undefined => {\n if (parentMessageId) {\n if (state.byLocalId.has(parentMessageId)) return parentMessageId;\n }\n return (\n findMessageLocalIdByToolCallId(state, toolCallId) ??\n resolveCurrentTurnAssistantLocalId(state) ??\n findLatestAssistantMessageLocalId(state)\n );\n};\n\nconst maybeInsertReplayUserMessage = (\n state: MessageState,\n runInput: Record<string, unknown>,\n runId: string,\n): MessageState => {\n const synthesized = toReplayUserMessage(runInput, runId);\n if (!synthesized) {\n return state;\n }\n\n // Dedupe by replay id, not text.\n if (state.byLocalId.has(synthesized.localId)) {\n return state;\n }\n\n const latestUserMessage = findLatestUserMessage(state);\n if (latestUserMessage && latestUserMessage.localId === synthesized.localId) {\n return state;\n }\n\n return {\n ...state,\n messages: [...state.messages, synthesized],\n byLocalId: new Map(state.byLocalId).set(synthesized.localId, state.messages.length),\n };\n};\n\nconst toReplayUserMessage = (\n runInput: Record<string, unknown>,\n runId: string,\n): UIMessage | undefined => {\n const input = runInput.input;\n\n if (typeof input === \"string\") {\n return {\n localId: `user_run:${runId}`,\n id: `user_run:${runId}`,\n role: \"user\",\n parts: [{ type: \"text\", text: input, state: \"complete\" }],\n status: \"sent\",\n };\n }\n\n if (isReplayInputArray(input)) {\n return toLatestReplayUserMessage(input, runId);\n }\n\n if (isSingleReplayMessageItem(input)) {\n return toLatestReplayUserMessage([input as GenerativeModelInputItem], runId);\n }\n\n return undefined;\n};\n\nconst toLatestReplayUserMessage = (\n input: GenerativeModelInputItem[],\n runId: string,\n): UIMessage | undefined => {\n const replayMessages = fromModelMessages(input, {\n generateId: (() => {\n let index = 0;\n return () => `user_run:${runId}:${(index++).toString(36)}`;\n })(),\n });\n const latestUserMessage = [...replayMessages]\n .reverse()\n .find((message) => message.role === \"user\");\n\n if (!latestUserMessage) {\n return undefined;\n }\n\n return {\n ...latestUserMessage,\n status: \"sent\",\n };\n};\n\nconst findLatestUserMessage = (state: MessageState): UIMessage | undefined =>\n [...state.messages].reverse().find((message) => message.role === \"user\");\n\nconst isSingleReplayMessageItem = (\n input: unknown,\n): input is {\n type: \"message\";\n role?: string;\n content: string | unknown[];\n} => {\n if (typeof input !== \"object\" || input === null) {\n return false;\n }\n\n const record = input as {\n type?: unknown;\n role?: unknown;\n content?: unknown;\n };\n\n return (\n record.type === \"message\" &&\n (record.role === undefined || typeof record.role === \"string\") &&\n (typeof record.content === \"string\" || Array.isArray(record.content))\n );\n};\n\nconst isReplayInputArray = (input: unknown): input is GenerativeModelInputItem[] =>\n Array.isArray(input);\n\n// Message mutation helpers.\nconst ensureMessage = (state: MessageState, localId: string, role: Role): MessageState => {\n if (state.byLocalId.has(localId)) return state;\n\n const next: UIMessage = {\n localId,\n id: localId,\n role,\n parts: [],\n };\n\n return {\n ...state,\n messages: [...state.messages, next],\n byLocalId: new Map(state.byLocalId).set(localId, state.messages.length),\n };\n};\n\nconst updateMessage = (\n state: MessageState,\n localId: string,\n updater: (msg: UIMessage) => UIMessage,\n): MessageState => {\n const idx = state.byLocalId.get(localId);\n if (idx === undefined) return state;\n\n const nextMessages = state.messages.slice();\n const current = nextMessages[idx];\n if (!current) return state;\n nextMessages[idx] = updater(current);\n\n return { ...state, messages: nextMessages };\n};\n\nconst ensureAndUpdateMessage = (\n state: MessageState,\n localId: string,\n role: Role,\n updater: (msg: UIMessage) => UIMessage,\n): MessageState => updateMessage(ensureMessage(state, localId, role), localId, updater);\n\nconst appendText = (msg: UIMessage, delta: string): UIMessage => {\n // Extend the last open text part when possible.\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (last && last.type === \"text\" && last.state !== \"complete\") {\n parts[parts.length - 1] = { ...last, text: last.text + delta };\n } else {\n parts.push({ type: \"text\", text: delta });\n }\n return { ...msg, parts };\n};\n\nconst appendAudio = (\n msg: UIMessage,\n delta: {\n kind: \"base64\";\n data: string;\n mimeType: string;\n },\n): UIMessage => {\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (last?.type === \"audio\" && last.source.kind === \"base64\" && last.state !== \"complete\") {\n parts[parts.length - 1] = {\n ...last,\n source: {\n kind: \"base64\",\n data: `${last.source.data}${delta.data}`,\n mimeType: delta.mimeType,\n },\n };\n } else {\n parts.push({\n type: \"audio\",\n source: {\n kind: \"base64\",\n data: delta.data,\n mimeType: delta.mimeType,\n },\n });\n }\n return { ...msg, parts };\n};\n\nconst appendImage = (\n msg: UIMessage,\n delta:\n | {\n kind: \"url\";\n url: string;\n }\n | {\n kind: \"base64\";\n data: string;\n mimeType: string;\n },\n): UIMessage => {\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (\n delta.kind === \"base64\" &&\n last?.type === \"image\" &&\n last.source.kind === \"base64\" &&\n last.state !== \"complete\"\n ) {\n parts[parts.length - 1] = {\n ...last,\n source: {\n kind: \"base64\",\n data: `${last.source.data}${delta.data}`,\n mimeType: delta.mimeType,\n },\n };\n } else if (delta.kind === \"url\") {\n parts.push({\n type: \"image\",\n source: {\n kind: \"url\",\n url: delta.url,\n },\n });\n } else {\n parts.push({\n type: \"image\",\n source: {\n kind: \"base64\",\n data: delta.data,\n mimeType: delta.mimeType,\n },\n });\n }\n return { ...msg, parts };\n};\n\nconst appendVideo = (\n msg: UIMessage,\n delta:\n | {\n kind: \"url\";\n url: string;\n }\n | {\n kind: \"base64\";\n data: string;\n mimeType: string;\n },\n): UIMessage => {\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (\n delta.kind === \"base64\" &&\n last?.type === \"video\" &&\n last.source.kind === \"base64\" &&\n last.state !== \"complete\"\n ) {\n parts[parts.length - 1] = {\n ...last,\n source: {\n kind: \"base64\",\n data: `${last.source.data}${delta.data}`,\n mimeType: delta.mimeType,\n },\n };\n } else if (delta.kind === \"url\") {\n parts.push({\n type: \"video\",\n source: {\n kind: \"url\",\n url: delta.url,\n },\n });\n } else {\n parts.push({\n type: \"video\",\n source: {\n kind: \"base64\",\n data: delta.data,\n mimeType: delta.mimeType,\n },\n });\n }\n return { ...msg, parts };\n};\n\nconst appendEmbedding = (msg: UIMessage, delta: number[]): UIMessage => {\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (last?.type === \"embedding\" && last.state !== \"complete\") {\n parts[parts.length - 1] = {\n ...last,\n embedding: [...last.embedding, ...delta],\n };\n } else {\n parts.push({\n type: \"embedding\",\n embedding: delta,\n });\n }\n return { ...msg, parts };\n};\n\nconst appendTranscriptText = (msg: UIMessage, delta: string): UIMessage => {\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (last?.type === \"transcript\" && last.state !== \"complete\") {\n parts[parts.length - 1] = { ...last, text: last.text + delta };\n } else {\n parts.push({\n type: \"transcript\",\n text: delta,\n });\n }\n return { ...msg, parts };\n};\n\nconst appendReasoningText = (\n msg: UIMessage,\n delta: string,\n visibility: \"summary\" | \"full\",\n provider?: string,\n): UIMessage => {\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (\n last?.type === \"reasoning\" &&\n last.state !== \"complete\" &&\n last.visibility === visibility &&\n (last.provider ?? undefined) === (provider ?? undefined)\n ) {\n parts[parts.length - 1] = { ...last, text: last.text + delta };\n } else {\n parts.push({\n type: \"reasoning\",\n text: delta,\n visibility,\n ...(provider !== undefined ? { provider } : {}),\n });\n }\n return { ...msg, parts };\n};\n\nconst upsertTranscriptSegment = (\n msg: UIMessage,\n segment: {\n id: string;\n start: number;\n end: number;\n text: string;\n speaker?: string;\n },\n): UIMessage => {\n const parts = msg.parts.slice();\n const last = parts[parts.length - 1];\n if (last?.type === \"transcript\" && last.state !== \"complete\") {\n const segments = last.segments ? [...last.segments] : [];\n const idx = segments.findIndex((item) => item.id === segment.id);\n if (idx === -1) {\n segments.push(segment);\n } else {\n segments[idx] = segment;\n }\n parts[parts.length - 1] = { ...last, segments };\n } else {\n parts.push({\n type: \"transcript\",\n text: \"\",\n segments: [segment],\n });\n }\n return { ...msg, parts };\n};\n\nconst markLatestPartComplete = (\n msg: UIMessage,\n partType: \"text\" | \"audio\" | \"image\" | \"video\" | \"embedding\" | \"transcript\" | \"reasoning\",\n): UIMessage => {\n const parts = msg.parts.slice();\n for (let i = parts.length - 1; i >= 0; i -= 1) {\n const part = parts[i];\n if (!part || part.type !== partType) continue;\n parts[i] = { ...part, state: \"complete\" };\n return { ...msg, parts };\n }\n return msg;\n};\n\n// Tool helpers.\nconst isApprovalLifecycleState = (state: ToolCallPart[\"state\"] | undefined): boolean =>\n state === \"approval-requested\" ||\n state === \"approval-approved\" ||\n state === \"approval-denied\" ||\n state === \"approval-expired\";\n\nconst getApprovalPartState = (\n state: \"requested\" | \"approved\" | \"denied\" | \"expired\",\n): NonNullable<ToolCallPart[\"state\"]> =>\n state === \"requested\"\n ? \"approval-requested\"\n : state === \"approved\"\n ? \"approval-approved\"\n : state === \"denied\"\n ? \"approval-denied\"\n : \"approval-expired\";\n\nconst getApprovalStatus = (\n state: \"requested\" | \"approved\" | \"denied\" | \"expired\",\n): ToolCallPart[\"status\"] => (state === \"denied\" || state === \"expired\" ? \"error\" : \"pending\");\n\nconst updateToolApprovalMeta = (\n msg: UIMessage,\n toolCallId: string,\n patch: {\n input?: unknown;\n meta?: Record<string, unknown>;\n note?: string;\n actorId?: string;\n },\n): UIMessage =>\n upsertToolPart(msg, \"tool-call\", toolCallId, {}, (part) =>\n part.type === \"tool-call\"\n ? {\n ...part,\n approval: {\n ...(part.approval ?? {}),\n ...(patch.input !== undefined ? { input: patch.input } : {}),\n ...(patch.meta !== undefined ? { meta: patch.meta } : {}),\n ...(patch.note !== undefined ? { note: patch.note } : {}),\n ...(patch.actorId !== undefined ? { actorId: patch.actorId } : {}),\n },\n }\n : part,\n );\n\nconst isToolCallCompleted = (msg: UIMessage, toolCallId: string): boolean =>\n msg.parts.some(\n (part) =>\n part.type === \"tool-call\" &&\n part.callId === toolCallId &&\n (part.status === \"success\" ||\n part.state === \"completed\" ||\n part.state === \"approval-denied\" ||\n part.state === \"approval-expired\"),\n );\n\nconst findToolCallPart = (msg: UIMessage, toolCallId: string): ToolCallPart | undefined =>\n msg.parts.find(\n (part): part is ToolCallPart => part.type === \"tool-call\" && part.callId === toolCallId,\n );\n\nconst upsertToolPart = (\n msg: UIMessage,\n kind: \"tool-call\" | \"tool-result\",\n toolCallId: string,\n patch: Partial<ToolCallPart> | Partial<ToolResultPart>,\n updater?: (part: ToolCallPart | ToolResultPart) => ToolCallPart | ToolResultPart,\n): UIMessage => {\n // Reuse the same tool part instead of duplicating it.\n const parts = msg.parts.slice();\n const idx = parts.findIndex((p) => p.type === kind && \"callId\" in p && p.callId === toolCallId);\n\n if (idx === -1) {\n if (kind === \"tool-call\") {\n parts.push({\n type: \"tool-call\",\n callId: toolCallId,\n status: \"pending\",\n ...(patch as Partial<ToolCallPart>),\n });\n } else {\n parts.push({\n type: \"tool-result\",\n callId: toolCallId,\n status: \"pending\",\n ...(patch as Partial<ToolResultPart>),\n });\n }\n return { ...msg, parts };\n }\n\n const existing = parts[idx];\n if (!existing) return { ...msg, parts };\n if (kind === \"tool-call\" && existing.type === \"tool-call\") {\n const merged: ToolCallPart = {\n ...existing,\n ...(patch as Partial<ToolCallPart>),\n type: \"tool-call\",\n };\n parts[idx] = updater ? (updater(merged) as ToolCallPart) : merged;\n } else if (kind === \"tool-result\" && existing.type === \"tool-result\") {\n const merged: ToolResultPart = {\n ...existing,\n ...(patch as Partial<ToolResultPart>),\n type: \"tool-result\",\n };\n parts[idx] = updater ? (updater(merged) as ToolResultPart) : merged;\n }\n\n return { ...msg, parts };\n};\n\nconst updateAssistantMessage = (\n state: MessageState,\n messageId: string,\n updater: (msg: UIMessage) => UIMessage,\n): MessageState => ensureAndUpdateMessage(state, messageId, \"assistant\", updater);\n\nconst updateResolvedToolMessage = (\n state: MessageState,\n parentMessageId: string | undefined,\n toolCallId: string,\n updater: (msg: UIMessage) => UIMessage,\n): MessageState => {\n const targetMessageLocalId = resolveToolMessageLocalId(state, parentMessageId, toolCallId);\n if (!targetMessageLocalId) {\n return state;\n }\n\n return ensureAndUpdateMessage(state, targetMessageLocalId, \"assistant\", updater);\n};\n","import type {\n GenerativeModelOutputItem,\n GenerativeModelResponse,\n} from \"@better-agent/core/providers\";\nimport type { UIMessage, UIMessagePart } from \"../types/ui\";\nimport { contentPartToUIPart } from \"./utils\";\n\n/** Builds a deterministic local id for messages synthesized from model output. */\nconst makeResponseLocalId = (prefix: string, index: number) => `${prefix}_${index.toString(36)}`;\n\n/** Converts one model output item into a UI message. */\nconst createMessageFromOutputItem = (\n item: GenerativeModelOutputItem,\n index: number,\n): UIMessage | null => {\n if (item.type === \"message\") {\n const parts =\n typeof item.content === \"string\"\n ? [{ type: \"text\", text: item.content, state: \"complete\" } satisfies UIMessagePart]\n : item.content\n .map((part) => contentPartToUIPart(part))\n .filter((part: UIMessagePart | null): part is UIMessagePart => part !== null);\n\n if (parts.length === 0) {\n return null;\n }\n\n return {\n localId: makeResponseLocalId(\"response_message\", index),\n role: item.role,\n parts,\n };\n }\n\n if (item.type === \"tool-call\") {\n return {\n localId: makeResponseLocalId(\"response_tool_call\", index),\n role: \"assistant\",\n parts: [\n {\n type: \"tool-call\",\n callId: item.callId,\n name: item.name,\n args: item.arguments,\n status: \"pending\",\n state: \"input-complete\",\n },\n ],\n };\n }\n\n if (item.type !== \"provider-tool-result\") {\n return null;\n }\n\n const status = item.isError ? \"error\" : \"success\";\n return {\n localId: makeResponseLocalId(\"response_tool_result\", index),\n role: \"assistant\",\n parts: [\n {\n type: \"tool-call\",\n callId: item.callId,\n name: item.name,\n status,\n state: \"completed\",\n },\n {\n type: \"tool-result\",\n callId: item.callId,\n result: item.result,\n status,\n },\n ],\n };\n};\n\n/** Attaches a provider tool result to the latest matching assistant message. */\nconst attachToolResultToMatchingMessage = (\n messages: UIMessage[],\n item: Extract<GenerativeModelOutputItem, { type: \"provider-tool-result\" }>,\n): boolean => {\n let messageIndex = -1;\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (!message || message.role !== \"assistant\") {\n continue;\n }\n\n const hasMatchingToolCall = message.parts.some(\n (part) => part.type === \"tool-call\" && part.callId === item.callId,\n );\n if (hasMatchingToolCall) {\n messageIndex = index;\n break;\n }\n }\n\n if (messageIndex < 0) {\n return false;\n }\n\n const message = messages[messageIndex];\n if (!message || message.role !== \"assistant\") {\n return false;\n }\n\n const nextMessages = messages.slice();\n const status = item.isError ? \"error\" : \"success\";\n nextMessages[messageIndex] = {\n ...message,\n parts: message.parts.flatMap((part) =>\n part.type === \"tool-call\" && part.callId === item.callId\n ? [\n {\n ...part,\n status,\n state: \"completed\",\n },\n {\n type: \"tool-result\" as const,\n callId: item.callId,\n result: item.result,\n status,\n },\n ]\n : [part],\n ),\n };\n messages.splice(0, messages.length, ...nextMessages);\n return true;\n};\n\n/**\n * Converts model response output into UI messages.\n */\nexport const getMessagesFromResponse = (response?: GenerativeModelResponse): UIMessage[] => {\n const messages: UIMessage[] = [];\n\n for (const [index, item] of (response?.output ?? []).entries()) {\n // Prefer attaching tool results to an existing tool call.\n if (\n item.type === \"provider-tool-result\" &&\n attachToolResultToMatchingMessage(messages, item)\n ) {\n continue;\n }\n\n const message = createMessageFromOutputItem(item, index);\n if (message) {\n messages.push(message);\n }\n }\n\n return messages;\n};\n","import type {\n GenerativeModelInputItem,\n GenerativeModelResponse,\n} from \"@better-agent/core/providers\";\nimport type { BetterAgentClient, ClientEvent } from \"../types/client\";\nimport type {\n AgentNameFromApp,\n DefaultStructuredOutputForAgent,\n} from \"../types/client-type-helpers\";\nimport type {\n AgentChatControllerOptions,\n AgentChatSnapshot,\n AgentStatus,\n ApproveToolCallParams,\n ControllerRunInput,\n InternalSubmitOptions,\n OnFinishParams,\n PreparedRequestInput,\n RetryResult,\n SendMessageOptions,\n SendResult,\n SetMessagesInput,\n StreamConsumptionResult,\n StreamTerminalState,\n SubmissionContext,\n UIMessageInput,\n} from \"../types/controller\";\nimport type { ResumeOption } from \"../types/controller\";\nimport type { PendingToolApproval, UIMessage } from \"../types/ui\";\nimport { ensureBrowserTeardownTracking, isBrowserPageTearingDown } from \"./browser-lifecycle\";\nimport type { AgentClientError } from \"./error\";\nimport { StreamDisconnectError, getEventErrorMessage, toAgentClientError } from \"./error\";\nimport { type MessageState, applyEvent, createMessageState } from \"./reducer\";\nimport { getMessagesFromResponse } from \"./response\";\nimport {\n fromConversationItems,\n fromModelMessages,\n makeLocalMessageId,\n mergeModelOptions,\n normalizeOptimisticUserMessageConfig,\n toModelMessages,\n} from \"./utils\";\n\n/**\n * Framework-agnostic controller for one agent conversation.\n */\nexport class AgentChatController<\n TApp = unknown,\n TAgentName extends AgentNameFromApp<TApp> = AgentNameFromApp<TApp>,\n> {\n // Private state.\n private readonly id: string;\n private state: MessageState;\n private status: AgentStatus = \"ready\";\n private error: AgentClientError | undefined = undefined;\n private lastStreamId: string | undefined;\n private lastRunId: string | undefined;\n private lastResponse: GenerativeModelResponse | undefined;\n private lastStructured: DefaultStructuredOutputForAgent<TApp, TAgentName> | undefined;\n private lastAppliedSeq = -1;\n private lastAppliedSeqByStream: Map<string, number> = new Map();\n private initialMessages: UIMessage[];\n private listeners: Set<() => void> = new Set();\n private destroyed = false;\n private initialized = false;\n private warnedHistoryCombo = false;\n private options: AgentChatControllerOptions<TApp, TAgentName>;\n private activeAbortController: AbortController | null = null;\n\n // Constructor.\n constructor(\n private client: BetterAgentClient<TApp>,\n options: AgentChatControllerOptions<TApp, TAgentName>,\n ) {\n this.options = options;\n this.id = options.id ?? makeLocalMessageId();\n const normalized = this.normalizeMessages(options.initialMessages ?? []);\n this.state = createMessageState(normalized);\n this.initialMessages = normalized;\n this.lastStreamId = this.getConfiguredInitialStreamId(options);\n }\n\n // Public state.\n\n /** Returns the current messages. */\n getMessages(): UIMessage[] {\n return this.state.messages;\n }\n\n /** Returns the current status. */\n getStatus(): AgentStatus {\n return this.status;\n }\n\n /** Returns the latest client error. */\n getError(): AgentClientError | undefined {\n return this.error;\n }\n\n /** Returns the latest stream id. */\n getStreamId(): string | undefined {\n return this.lastStreamId;\n }\n\n /** Returns the latest run id. */\n getRunId(): string | undefined {\n return this.lastRunId;\n }\n\n /** True while a request is active. */\n get isLoading(): boolean {\n return (\n this.status === \"hydrating\" ||\n this.status === \"submitted\" ||\n this.status === \"streaming\"\n );\n }\n\n /** True while stream events are being consumed. */\n get isStreaming(): boolean {\n return this.status === \"streaming\";\n }\n\n /** Returns pending tool approvals. */\n getPendingToolApprovals(): PendingToolApproval[] {\n const seen = new Set<string>();\n const pending: PendingToolApproval[] = [];\n\n for (const message of this.state.messages) {\n for (const part of message.parts) {\n if (\n part.type === \"tool-call\" &&\n part.state === \"approval-requested\" &&\n !seen.has(part.callId)\n ) {\n pending.push({\n toolCallId: part.callId,\n toolName: part.name,\n args: part.args,\n toolTarget: part.toolTarget,\n input: part.approval?.input,\n meta: part.approval?.meta,\n note: part.approval?.note,\n actorId: part.approval?.actorId,\n });\n seen.add(part.callId);\n }\n }\n }\n return pending;\n }\n\n /** Returns an immutable snapshot. */\n getSnapshot(): AgentChatSnapshot {\n return {\n id: this.id,\n conversationId: this.options.conversationId,\n messages: this.state.messages,\n status: this.status,\n error: this.error,\n streamId: this.lastStreamId,\n runId: this.lastRunId,\n isLoading: this.isLoading,\n isStreaming: this.isStreaming,\n pendingToolApprovals: this.getPendingToolApprovals(),\n };\n }\n\n // Public lifecycle.\n\n /** Stops the active run or stream. */\n stop(): void {\n if (this.destroyed) return;\n this.cancelActiveWork();\n this.setStatus(\"ready\");\n }\n\n /** Replaces the transport client. */\n updateClient(client: BetterAgentClient<TApp>): void {\n this.client = client;\n }\n\n /**\n * Subscribes to state updates.\n */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /** Calls each subscribed listener after controller state changes. */\n private notify(): void {\n if (this.destroyed) return;\n for (const listener of this.listeners) {\n listener();\n }\n }\n\n /** Stores run and stream ids from response headers. */\n private updateResponseIds(response: Response): void {\n const runId = response.headers.get(\"x-run-id\");\n if (runId && runId !== this.lastRunId) {\n this.lastRunId = runId;\n }\n\n const streamId = response.headers.get(\"x-stream-id\");\n if (streamId && streamId !== this.lastStreamId) {\n this.lastStreamId = streamId;\n }\n }\n\n // Public requests.\n\n /** Starts hydration or resume behavior. */\n init(): void {\n if (this.initialized) return;\n this.initialized = true;\n ensureBrowserTeardownTracking();\n\n if (this.options.hydrateFromServer && this.options.conversationId) {\n void this.hydrateFromServer();\n return;\n }\n\n this.initResume();\n }\n\n /** Starts resume behavior, even with messages when allowed. */\n private initResume(options?: { allowWithMessages?: boolean }): void {\n const resume = this.options.resume;\n if (!resume) return;\n\n const hasMessages = this.state.messages.length > 0;\n const explicitStreamId =\n typeof resume === \"object\" && resume !== null && typeof resume.streamId === \"string\"\n ? resume.streamId\n : undefined;\n const explicitAfterSeq =\n typeof resume === \"object\" && resume !== null ? resume.afterSeq : undefined;\n // Prefer an explicit cursor, otherwise reuse the stream cursor.\n const streamAfterSeq =\n explicitAfterSeq ??\n (explicitStreamId ? this.lastAppliedSeqByStream.get(explicitStreamId) : undefined);\n\n // Skip implicit resume when messages already exist.\n if (\n hasMessages &&\n explicitStreamId === undefined &&\n explicitAfterSeq === undefined &&\n !options?.allowWithMessages\n ) {\n return;\n }\n\n if (explicitStreamId) {\n void this.resumeStream({\n streamId: explicitStreamId,\n ...(streamAfterSeq !== undefined ? { afterSeq: streamAfterSeq } : {}),\n });\n return;\n }\n\n if (!this.options.conversationId) {\n console.warn(\n \"[better-agent] `resume` requires `conversationId` unless an explicit `streamId` is provided.\",\n );\n return;\n }\n\n // Use the caller cursor when present, otherwise let the server decide.\n if (explicitAfterSeq !== undefined) {\n void this.resumeConversation({ afterSeq: explicitAfterSeq });\n return;\n }\n\n void this.resumeConversation();\n }\n\n /** Hydrates from server history before resuming. */\n private async hydrateFromServer(): Promise<void> {\n const conversationId = this.options.conversationId;\n if (!conversationId) {\n this.initResume();\n return;\n }\n\n const loadConversation = this.client.loadConversation;\n if (typeof loadConversation !== \"function\") {\n // Skip hydration when loading is unavailable.\n this.initResume();\n return;\n }\n\n const { signal, controller } = this.startOperation();\n this.setStatus(\"hydrating\");\n let hydrationCompleted = false;\n this.setError(undefined);\n\n try {\n const result = await loadConversation.call(\n this.client,\n this.options.agent,\n conversationId,\n { signal },\n );\n this.throwIfAborted(signal);\n\n if (result) {\n // Replace local state with the server snapshot.\n const uiMessages = fromConversationItems(result.items);\n this.initialMessages = uiMessages;\n this.state = createMessageState(uiMessages);\n this.notify();\n }\n\n this.setStatus(\"ready\");\n hydrationCompleted = true;\n } catch (e) {\n if (this.isAbortError(e, signal)) {\n return;\n }\n\n const err = this.toError(e, \"Hydration failed\");\n this.options.onError?.(err);\n this.setStatus(\"ready\");\n hydrationCompleted = true;\n } finally {\n this.finishOperation(controller);\n if (hydrationCompleted) {\n // Allow resume after hydration.\n this.initResume({ allowWithMessages: true });\n }\n }\n }\n\n /** Sends one message. */\n async sendMessage(\n input: ControllerRunInput,\n options?: SendMessageOptions,\n ): Promise<SendResult> {\n return this.submitWithInternalOptions(\n input,\n options?.signal ? { signal: options.signal } : undefined,\n );\n }\n\n /** Retries a user message by local id. */\n async retryMessage(localId: string): Promise<RetryResult> {\n const message = this.getMessageByLocalId(localId);\n if (!message) {\n throw new Error(`Message '${localId}' was not found.`);\n }\n if (message.role !== \"user\") {\n throw new Error(\"Only user messages can be retried.\");\n }\n\n const idx = this.state.byLocalId.get(localId);\n if (idx === undefined) {\n throw new Error(`Message '${localId}' was not found.`);\n }\n\n const retryMessages = this.state.messages\n .slice(0, idx + 1)\n .map((candidate) =>\n candidate.localId === localId\n ? (this.createPendingUserMessage(candidate) ?? candidate)\n : candidate,\n );\n\n return this.submitWithInternalOptions(\n {\n input: toModelMessages(retryMessages),\n sendClientHistory: true,\n },\n {\n replaceLocalId: localId,\n replaceMessage: this.createPendingUserMessage(message),\n serializedHistoryInput: true,\n },\n );\n }\n\n /** Resumes an existing stream. */\n async resumeStream(options: { streamId: string; afterSeq?: number }): Promise<void> {\n const { streamId } = options;\n const { signal, controller } = this.startOperation();\n this.setStatus(\"submitted\");\n this.setError(undefined);\n\n try {\n const events = this.client.resumeStream(\n this.options.agent,\n {\n streamId,\n afterSeq: options.afterSeq ?? this.lastAppliedSeqByStream.get(streamId) ?? -1,\n },\n {\n signal,\n onResponse: (response) => {\n this.updateResponseIds(response);\n },\n },\n );\n\n const result = await this.consumeStreamUntilTerminal(events, {\n signal,\n replay: true,\n disconnectMessage: \"Resume stream disconnected.\",\n });\n if (!result.receivedEvent) {\n this.setStatus(\"ready\");\n return;\n }\n if (!result.terminalState) {\n throw this.toStreamDisconnectError(\n undefined,\n \"Stream ended before terminal run event.\",\n );\n }\n if (result.terminalState === \"error\") {\n throw result.terminalError ?? new Error(\"Resume failed.\");\n }\n\n this.setStatus(\"ready\");\n if (result.receivedEvent && result.terminalState) {\n this.emitFinish({ streamId, isAbort: result.terminalState === \"aborted\" });\n }\n } catch (e) {\n if (\n this.destroyed ||\n this.isAbortError(e, signal) ||\n (this.isStreamDisconnectError(e) && this.isPageTeardownLike())\n ) {\n this.setStatus(\"ready\");\n return;\n }\n\n const err = toAgentClientError(e, \"Resume failed.\");\n this.setError(err);\n this.setStatus(\"error\");\n if (this.isStreamDisconnectError(e)) {\n this.options.onDisconnect?.({\n error: err,\n runId: this.lastRunId,\n streamId,\n });\n }\n this.options.onError?.(err);\n } finally {\n this.finishOperation(controller);\n }\n }\n\n /** Resumes the active stream for the current conversation. */\n async resumeConversation(options?: { afterSeq?: number }): Promise<void> {\n const conversationId = this.options.conversationId;\n if (!conversationId) {\n console.warn(\"[better-agent] `resumeConversation()` requires `conversationId`.\");\n return;\n }\n\n const { signal, controller } = this.startOperation();\n this.setStatus(\"submitted\");\n this.setError(undefined);\n\n try {\n const events = this.client.resumeConversation(\n this.options.agent,\n {\n conversationId,\n ...(options?.afterSeq !== undefined ? { afterSeq: options.afterSeq } : {}),\n },\n {\n signal,\n onResponse: (response) => {\n this.updateResponseIds(response);\n },\n },\n );\n\n const result = await this.consumeStreamUntilTerminal(events, {\n signal,\n replay: true,\n disconnectMessage: \"Resume stream disconnected.\",\n });\n if (!result.receivedEvent) {\n this.setStatus(\"ready\");\n return;\n }\n if (!result.terminalState) {\n throw this.toStreamDisconnectError(\n undefined,\n \"Stream ended before terminal run event.\",\n );\n }\n if (result.terminalState === \"error\") {\n throw result.terminalError ?? new Error(\"Resume failed.\");\n }\n\n this.setStatus(\"ready\");\n if (result.receivedEvent && result.terminalState) {\n this.emitFinish({\n conversationId,\n isAbort: result.terminalState === \"aborted\",\n });\n }\n } catch (e) {\n if (\n this.destroyed ||\n this.isAbortError(e, signal) ||\n (this.isStreamDisconnectError(e) && this.isPageTeardownLike())\n ) {\n this.setStatus(\"ready\");\n return;\n }\n\n const err = toAgentClientError(e, \"Resume failed.\");\n this.setError(err);\n this.setStatus(\"error\");\n if (this.isStreamDisconnectError(e)) {\n this.options.onDisconnect?.({\n error: err,\n runId: this.lastRunId,\n streamId: this.lastStreamId,\n });\n }\n this.options.onError?.(err);\n } finally {\n this.finishOperation(controller);\n }\n }\n\n // Public mutations.\n\n /** Submits a tool approval decision. */\n async approveToolCall(params: ApproveToolCallParams): Promise<void> {\n const runId = params.runId ?? this.lastRunId;\n if (!runId) {\n throw new Error(\"Cannot submit tool approval response without a runId.\");\n }\n\n await this.client.submitToolApproval({\n agent: this.options.agent,\n runId,\n toolCallId: params.toolCallId,\n decision: params.decision,\n ...(params.note !== undefined ? { note: params.note } : {}),\n ...(params.actorId !== undefined ? { actorId: params.actorId } : {}),\n });\n }\n\n /** Clears the current error. */\n clearError(): void {\n this.setError(undefined);\n this.setStatus(\"ready\");\n }\n\n /** Resets local state to the initial snapshot. */\n reset(): void {\n this.cancelActiveWork();\n this.state = createMessageState(this.initialMessages);\n this.lastResponse = undefined;\n this.lastStructured = undefined;\n this.lastRunId = undefined;\n this.lastStreamId = this.getConfiguredInitialStreamId(this.options);\n this.error = undefined;\n this.status = \"ready\";\n this.lastAppliedSeq = -1;\n this.lastAppliedSeqByStream.clear();\n this.notify();\n }\n\n /** Replaces local messages. */\n setMessages(value: SetMessagesInput): void {\n const current = this.state.messages;\n const nextRaw = typeof value === \"function\" ? value(current) : value;\n const next = this.normalizeMessages(nextRaw);\n this.state = createMessageState(next);\n this.notify();\n }\n\n /** Merges new options into the controller configuration. */\n updateOptions(partial: Partial<AgentChatControllerOptions<TApp, TAgentName>>): void {\n const nextOptions = {\n ...this.options,\n ...partial,\n ...(partial.resume !== undefined &&\n typeof partial.resume === \"object\" &&\n partial.resume !== null\n ? {\n resume: {\n ...(typeof this.options.resume === \"object\" &&\n this.options.resume !== null\n ? this.options.resume\n : {}),\n ...partial.resume,\n },\n }\n : {}),\n ...(partial.optimisticUserMessage &&\n typeof partial.optimisticUserMessage === \"object\" &&\n !Array.isArray(partial.optimisticUserMessage)\n ? {\n optimisticUserMessage: {\n ...(typeof this.options.optimisticUserMessage === \"object\" &&\n this.options.optimisticUserMessage !== null &&\n !Array.isArray(this.options.optimisticUserMessage)\n ? this.options.optimisticUserMessage\n : {}),\n ...partial.optimisticUserMessage,\n },\n }\n : {}),\n };\n\n const shouldResetSession = this.hasSessionConfigurationChanged(this.options, nextOptions);\n this.options = nextOptions;\n\n if (shouldResetSession) {\n this.resetForSessionChange();\n }\n }\n\n /** Destroys the controller. */\n destroy(): void {\n this.cancelActiveWork();\n this.destroyed = true;\n this.listeners.clear();\n }\n\n // Event handling.\n\n /** Applies one streamed event to local state. */\n private applyEvent(ev: ClientEvent, options?: { replay?: boolean }): void {\n this.options.onEvent?.(ev);\n\n // Deduplicates replayed cursors.\n const streamKey =\n typeof ev.streamId === \"string\" && ev.streamId.length > 0\n ? ev.streamId\n : typeof ev.runId === \"string\" && ev.runId.length > 0\n ? ev.runId\n : undefined;\n\n if (typeof ev.seq === \"number\") {\n if (streamKey) {\n const prev = this.lastAppliedSeqByStream.get(streamKey) ?? -1;\n if (ev.seq <= prev) return;\n this.lastAppliedSeqByStream.set(streamKey, ev.seq);\n } else {\n if (ev.seq <= this.lastAppliedSeq) return;\n this.lastAppliedSeq = ev.seq;\n }\n }\n\n // Tracks run and stream ids.\n if (typeof ev.runId === \"string\" && ev.runId.length > 0 && ev.runId !== this.lastRunId) {\n this.lastRunId = ev.runId;\n }\n\n if (ev.type === \"RUN_FINISHED\") {\n const result = (\n ev as unknown as {\n result?: {\n response?: GenerativeModelResponse;\n structured?: DefaultStructuredOutputForAgent<TApp, TAgentName>;\n };\n }\n ).result;\n this.lastResponse = result?.response;\n this.lastStructured = result?.structured;\n }\n\n if (ev.type === \"DATA_PART\") {\n const payload = {\n data: (ev as unknown as { data: unknown }).data,\n ...((ev as unknown as { id?: string }).id\n ? { id: (ev as unknown as { id: string }).id }\n : {}),\n };\n this.options.onData?.(payload);\n }\n\n if (ev.streamId && ev.streamId !== this.lastStreamId) {\n this.lastStreamId = ev.streamId;\n }\n\n if (options?.replay && ev.type === \"RUN_STARTED\") {\n this.reconcileReplayUserMessage(ev.runInput, ev.runId);\n }\n\n // Applies the event to message state.\n this.state = applyEvent(this.state, ev, {\n synthesizeReplayUserMessage: Boolean(options?.replay),\n });\n\n this.notify();\n }\n\n /** Reads streamed events until the stream finishes or a terminal event appears. */\n private async consumeStreamUntilTerminal(\n events: AsyncIterable<ClientEvent>,\n options: { signal: AbortSignal; replay?: boolean; disconnectMessage?: string },\n ): Promise<StreamConsumptionResult> {\n const result: StreamConsumptionResult = {\n receivedEvent: false,\n };\n\n try {\n for await (const event of events) {\n this.throwIfAborted(options.signal);\n result.receivedEvent = true;\n\n if (this.status !== \"streaming\") {\n this.setStatus(\"streaming\");\n }\n\n const terminal = this.getTerminalStateFromEvent(event);\n if (terminal) {\n result.terminalState = terminal.state;\n result.terminalError = terminal.error;\n }\n\n this.applyEvent(event, { replay: options.replay });\n }\n } catch (error) {\n if (this.isAbortError(error, options.signal)) {\n throw error;\n }\n throw this.toStreamDisconnectError(error, options.disconnectMessage);\n }\n\n this.throwIfAborted(options.signal);\n return result;\n }\n\n /** Reads terminal state from one streamed event. */\n private getTerminalStateFromEvent(\n event: ClientEvent,\n ): { state: StreamTerminalState; error?: AgentClientError } | undefined {\n if (event.type === \"RUN_FINISHED\") {\n return { state: \"finished\" };\n }\n if (event.type === \"RUN_ABORTED\") {\n return { state: \"aborted\" };\n }\n if (event.type === \"RUN_ERROR\") {\n return {\n state: \"error\",\n error: toAgentClientError(\n (event as unknown as { error: unknown }).error,\n getEventErrorMessage((event as unknown as { error: unknown }).error),\n ),\n };\n }\n\n return undefined;\n }\n\n // Submission flow.\n\n /** Sends one request through final or stream delivery. */\n private async submitWithInternalOptions(\n runInput: ControllerRunInput,\n internalOptions?: InternalSubmitOptions,\n ): Promise<SendResult> {\n const { signal, controller } = this.startOperation(internalOptions?.signal);\n this.setStatus(\"submitted\");\n this.setError(undefined);\n const context = this.createSubmissionContext(runInput, internalOptions, signal);\n\n try {\n this.warnIfClientHistoryReplacesConversation(context);\n this.applyLocalSubmissionState(context);\n\n const requestInput = this.buildRequestInput(context);\n if (context.useFinalDelivery) {\n return await this.runFinalDelivery(context, requestInput);\n }\n\n return await this.runStreamDelivery(context, requestInput);\n } catch (e) {\n return this.handleSubmissionFailure(e, context);\n } finally {\n this.finishOperation(controller);\n }\n }\n\n /** Builds the mutable context for one submission. */\n private createSubmissionContext(\n runInput: ControllerRunInput,\n internalOptions: InternalSubmitOptions | undefined,\n signal: AbortSignal,\n ): SubmissionContext {\n return {\n signal,\n conversationId:\n typeof runInput.conversationId === \"string\"\n ? runInput.conversationId\n : this.options.conversationId,\n inputValue: runInput.input,\n sendClientHistory:\n typeof runInput.sendClientHistory === \"boolean\"\n ? runInput.sendClientHistory\n : Boolean(this.options.sendClientHistory),\n optimisticLocalId: internalOptions?.reuseOptimisticLocalId,\n optimisticMessageMarkedSent: false,\n optimisticConfig: normalizeOptimisticUserMessageConfig(\n this.options.optimisticUserMessage,\n ),\n preSubmitState: this.state,\n useFinalDelivery: Boolean(internalOptions?.forceRun) || !this.shouldUseStreamDelivery(),\n runInput,\n internalOptions,\n };\n }\n\n /** Warns when client history will replace stored server history. */\n private warnIfClientHistoryReplacesConversation(context: SubmissionContext): void {\n if (\n !context.sendClientHistory ||\n !context.conversationId ||\n context.internalOptions?.replaceLocalId ||\n this.warnedHistoryCombo\n ) {\n return;\n }\n\n this.warnedHistoryCombo = true;\n console.warn(\n \"[better-agent] Using sendClientHistory with conversationId. Client history will replace server-stored history on each request. For server-managed history, remove sendClientHistory.\",\n );\n }\n\n /** Applies retry replacement or optimistic user insertion. */\n private applyLocalSubmissionState(context: SubmissionContext): void {\n const replaceLocalId = context.internalOptions?.replaceLocalId;\n if (replaceLocalId) {\n this.replaceRetryMessage(\n replaceLocalId,\n context.internalOptions?.replaceMessage ?? context.inputValue,\n );\n context.optimisticLocalId = replaceLocalId;\n return;\n }\n\n if (context.optimisticLocalId || !context.optimisticConfig.enabled) {\n return;\n }\n\n const shouldInsertOptimisticMessage =\n (!context.sendClientHistory &&\n this.canOptimisticallyRenderUserTurn(context.inputValue)) ||\n (context.sendClientHistory &&\n this.canOmitSubmittedInputFromSerializedHistory(context.inputValue));\n if (!shouldInsertOptimisticMessage) {\n return;\n }\n\n const optimisticMessage = this.createPendingUserMessage(context.inputValue);\n if (!optimisticMessage) {\n return;\n }\n\n const optimisticLocalId = this.generateMessageId();\n context.optimisticLocalId = optimisticLocalId;\n this.state = createMessageState([\n ...this.state.messages,\n {\n ...optimisticMessage,\n localId: optimisticLocalId,\n },\n ]);\n this.notify();\n }\n\n /** Builds the request input for the next transport call. */\n private buildRequestInput(context: SubmissionContext): PreparedRequestInput {\n return this.prepareInputForRequest(context.inputValue, this.state.messages, {\n sendClientHistory: context.sendClientHistory,\n optimisticLocalId: context.optimisticLocalId,\n serializedHistoryInput: Boolean(context.internalOptions?.serializedHistoryInput),\n });\n }\n\n /** Runs one request through final delivery. */\n private async runFinalDelivery(\n context: SubmissionContext,\n requestInput: PreparedRequestInput,\n ): Promise<SendResult> {\n const result = await this.client.run(\n this.options.agent,\n this.createRunPayload(\n context.runInput,\n requestInput.inputToSend,\n requestInput.serializedClientHistory,\n ) as never,\n {\n onResponse: this.options.onResponse,\n signal: context.signal,\n },\n );\n const normalized = this.normalizeFinalRunResult(result);\n\n this.captureNormalizedRunResult(normalized);\n this.markOptimisticMessageSent(context);\n this.setStatus(\"ready\");\n this.emitFinish({\n isAbort: false,\n conversationId: context.conversationId,\n });\n\n return {\n runId: normalized.runId,\n streamId: this.lastStreamId,\n };\n }\n\n /** Runs one request through streamed delivery. */\n private async runStreamDelivery(\n context: SubmissionContext,\n requestInput: PreparedRequestInput,\n ): Promise<SendResult> {\n const requestOptions = this.buildStreamRequestOptions(\n context.optimisticLocalId,\n () => {\n context.optimisticMessageMarkedSent = true;\n },\n context.signal,\n );\n const stream = this.client.stream(\n this.options.agent,\n this.createRunPayload(\n context.runInput,\n requestInput.inputToSend,\n requestInput.serializedClientHistory,\n ) as never,\n requestOptions,\n );\n const result = await this.consumeStreamUntilTerminal(stream, {\n signal: context.signal,\n disconnectMessage: \"Stream disconnected.\",\n });\n\n if (!result.terminalState) {\n throw this.toStreamDisconnectError(\n undefined,\n \"Stream ended before terminal run event.\",\n );\n }\n if (result.terminalState === \"error\") {\n throw result.terminalError ?? new Error(\"Run failed.\");\n }\n\n this.setStatus(\"ready\");\n this.emitFinish({\n isAbort: result.terminalState === \"aborted\",\n conversationId: context.conversationId,\n });\n return { streamId: this.lastStreamId };\n }\n\n /** Handles aborts, fallback-to-run, and terminal submission errors. */\n private async handleSubmissionFailure(\n error: unknown,\n context: SubmissionContext,\n ): Promise<SendResult> {\n if (\n this.destroyed ||\n this.isAbortError(error, context.signal) ||\n (this.isStreamDisconnectError(error) && this.isPageTeardownLike())\n ) {\n if (this.state !== context.preSubmitState && !context.optimisticMessageMarkedSent) {\n this.state = context.preSubmitState;\n this.notify();\n }\n if (!this.destroyed) {\n this.setStatus(\"ready\");\n }\n return { streamId: this.lastStreamId };\n }\n\n let err = toAgentClientError(error, \"Run failed.\");\n if (!context.internalOptions?.forceRun && this.shouldFallbackToRun(err)) {\n try {\n return await this.submitWithInternalOptions(context.runInput, {\n ...context.internalOptions,\n forceRun: true,\n reuseOptimisticLocalId: context.optimisticLocalId,\n });\n } catch (fallbackError) {\n err = toAgentClientError(fallbackError, \"Run failed.\");\n }\n }\n\n this.applyOptimisticFailure(context, err);\n this.setError(err);\n this.setStatus(\"error\");\n if (this.isStreamDisconnectError(error)) {\n this.options.onDisconnect?.({\n error: err,\n ...(this.lastRunId ? { runId: this.lastRunId } : {}),\n ...(this.lastStreamId ? { streamId: this.lastStreamId } : {}),\n });\n }\n this.options.onError?.(err);\n return this.lastStreamId ? { streamId: this.lastStreamId } : {};\n }\n\n /** Marks the optimistic user message as sent after a successful request. */\n private markOptimisticMessageSent(context: SubmissionContext): void {\n if (!context.optimisticLocalId || context.optimisticMessageMarkedSent) {\n return;\n }\n\n this.updateMessageByLocalId(context.optimisticLocalId, (msg) => {\n const { error: _error, ...rest } = msg;\n return { ...rest, status: \"sent\" };\n });\n context.optimisticMessageMarkedSent = true;\n }\n\n /** Applies optimistic-message failure handling. */\n private applyOptimisticFailure(context: SubmissionContext, err: AgentClientError): void {\n if (!context.optimisticLocalId) {\n return;\n }\n\n if (context.optimisticConfig.onError === \"remove\") {\n this.removeMessageByLocalId(context.optimisticLocalId);\n return;\n }\n\n const failed = this.updateMessageByLocalId(context.optimisticLocalId, (msg) => ({\n ...msg,\n status: \"failed\",\n error: err.message,\n }));\n if (failed) {\n this.options.onOptimisticUserMessageError?.({\n message: failed,\n error: err,\n });\n }\n }\n\n /** Stores the latest run result from final delivery. */\n private captureNormalizedRunResult(result: {\n runId?: string;\n response?: GenerativeModelResponse;\n structured?: unknown;\n }): void {\n if (result.runId) {\n this.lastRunId = result.runId;\n }\n if (result.response) {\n this.lastResponse = result.response;\n this.appendResponseMessages(result.response);\n }\n this.lastStructured = result.structured as\n | DefaultStructuredOutputForAgent<TApp, TAgentName>\n | undefined;\n }\n\n // Operation state.\n private setStatus(status: AgentStatus): void {\n if (this.status === status) return;\n this.status = status;\n this.notify();\n }\n\n /** Stores the latest controller error without notifying listeners. */\n private setError(error: AgentClientError | undefined): void {\n this.error = error;\n }\n\n /** Normalizes unknown failures into an `Error` with a fallback message. */\n private toError(error: unknown, fallback: string): Error {\n return error instanceof Error ? error : new Error(fallback);\n }\n\n /** Starts one controller operation. */\n private startOperation(externalSignal?: AbortSignal): {\n signal: AbortSignal;\n controller: AbortController;\n } {\n this.throwIfDestroyed();\n this.cancelActiveWork();\n const controller = new AbortController();\n this.activeAbortController = controller;\n return {\n controller,\n signal: this.mergeSignals(controller.signal, externalSignal),\n };\n }\n\n /** Clears the tracked active operation if it matches the provided controller. */\n private finishOperation(controller: AbortController): void {\n if (this.activeAbortController === controller) {\n this.activeAbortController = null;\n }\n }\n\n /** Aborts and forgets any in-flight controller operation. */\n private cancelActiveWork(): void {\n this.activeAbortController?.abort();\n this.activeAbortController = null;\n }\n\n /** Merges the controller abort signal with an optional external signal. */\n private mergeSignals(primary: AbortSignal, externalSignal?: AbortSignal): AbortSignal {\n if (!externalSignal) {\n return primary;\n }\n\n const controller = new AbortController();\n const abortFrom = (source: AbortSignal) => {\n if (!controller.signal.aborted) {\n controller.abort(source.reason);\n }\n };\n\n if (primary.aborted) {\n abortFrom(primary);\n } else {\n primary.addEventListener(\"abort\", () => abortFrom(primary), { once: true });\n }\n\n if (externalSignal.aborted) {\n abortFrom(externalSignal);\n } else {\n externalSignal.addEventListener(\"abort\", () => abortFrom(externalSignal), {\n once: true,\n });\n }\n\n return controller.signal;\n }\n\n /** Throws an abort-shaped error when the given signal has already aborted. */\n private throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw this.toAbortError(signal.reason);\n }\n }\n\n /** Rejects work after the controller has been destroyed. */\n private throwIfDestroyed(): void {\n if (this.destroyed) {\n throw new Error(\"AgentChatController has been destroyed.\");\n }\n }\n\n /** Returns `true` when a failure should be treated as an abort. */\n private isAbortError(error: unknown, signal?: AbortSignal): boolean {\n return (\n (signal?.aborted ?? false) ||\n (error instanceof DOMException && error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n }\n\n /** Returns true when a failure came from stream disconnection. */\n private isStreamDisconnectError(error: unknown): error is StreamDisconnectError {\n return error instanceof StreamDisconnectError;\n }\n\n /** Returns true when the page is being torn down during navigation or refresh. */\n private isPageTeardownLike(): boolean {\n return (\n isBrowserPageTearingDown() ||\n (typeof document !== \"undefined\" && document.visibilityState === \"hidden\")\n );\n }\n\n /** Converts an abort reason into a standard `AbortError` instance. */\n private toAbortError(reason?: unknown): Error {\n if (reason instanceof Error) {\n return reason;\n }\n\n try {\n return new DOMException(\n typeof reason === \"string\" ? reason : \"The operation was aborted.\",\n \"AbortError\",\n );\n } catch {\n const error = new Error(\n typeof reason === \"string\" ? reason : \"The operation was aborted.\",\n );\n error.name = \"AbortError\";\n return error;\n }\n }\n\n /** Wraps one failure as a stream disconnect. */\n private toStreamDisconnectError(\n error: unknown,\n fallback = \"Stream disconnected.\",\n ): StreamDisconnectError {\n const base = this.toError(error, fallback);\n return new StreamDisconnectError(base.message, error);\n }\n\n // Message state.\n\n /** Binds an already-visible current user turn to the replay run identity. */\n private reconcileReplayUserMessage(runInput: Record<string, unknown>, runId: string): void {\n const latestMessage = this.state.messages.at(-1);\n if (!latestMessage || latestMessage.role !== \"user\") {\n return;\n }\n\n const replayMessage = this.toReplayUserMessage(runInput, runId);\n if (!replayMessage || this.state.byLocalId.has(replayMessage.localId)) {\n return;\n }\n\n if (!this.isSameUserTurn(latestMessage, replayMessage)) {\n return;\n }\n\n const nextMessages = this.state.messages.slice();\n nextMessages[nextMessages.length - 1] = {\n ...latestMessage,\n localId: replayMessage.localId,\n ...(replayMessage.id !== undefined ? { id: replayMessage.id } : {}),\n status: \"sent\",\n };\n this.state = createMessageState(nextMessages);\n }\n\n /** Reconstructs the replayed current user turn from one RUN_STARTED event. */\n private toReplayUserMessage(\n runInput: Record<string, unknown>,\n runId: string,\n ): UIMessage | undefined {\n const input = runInput.input;\n\n if (typeof input === \"string\") {\n return {\n localId: `user_run:${runId}`,\n id: `user_run:${runId}`,\n role: \"user\",\n parts: [{ type: \"text\", text: input, state: \"complete\" }],\n status: \"sent\",\n };\n }\n\n const replayInput = Array.isArray(input)\n ? input\n : this.isSingleReplayMessageInput(input)\n ? [input]\n : undefined;\n if (!replayInput) {\n return undefined;\n }\n\n let index = 0;\n const replayMessages = fromModelMessages(replayInput as GenerativeModelInputItem[], {\n generateId: () => `user_run:${runId}:${(index++).toString(36)}`,\n });\n const latestUserMessage = [...replayMessages]\n .reverse()\n .find((message) => message.role === \"user\");\n\n return latestUserMessage ? { ...latestUserMessage, status: \"sent\" } : undefined;\n }\n\n /** Detects one structured replay message item. */\n private isSingleReplayMessageInput(input: unknown): input is {\n type: \"message\";\n role?: string;\n content: string | unknown[];\n } {\n return (\n typeof input === \"object\" &&\n input !== null &&\n (input as { type?: unknown }).type === \"message\" &&\n (typeof (input as { content?: unknown }).content === \"string\" ||\n Array.isArray((input as { content?: unknown }).content))\n );\n }\n\n /** Matches one already-visible user turn to its replayed equivalent. */\n private isSameUserTurn(current: UIMessage, replayed: UIMessage): boolean {\n return JSON.stringify(current.parts) === JSON.stringify(replayed.parts);\n }\n\n /** Generates a local message id using the configured factory when present. */\n private generateMessageId(message?: Partial<UIMessageInput>): string {\n return this.options.generateMessageId?.(message) ?? makeLocalMessageId();\n }\n\n /** Ensures every incoming UI message has a stable local id. */\n private normalizeMessages(list: UIMessageInput[]): UIMessage[] {\n return list.map((message) => ({\n ...message,\n localId: message.localId ?? this.generateMessageId(message),\n }));\n }\n\n /** Detects option changes that require resetting conversation session state. */\n private hasSessionConfigurationChanged(\n prev: AgentChatControllerOptions<TApp, TAgentName>,\n next: AgentChatControllerOptions<TApp, TAgentName>,\n ): boolean {\n return (\n prev.agent !== next.agent ||\n prev.conversationId !== next.conversationId ||\n prev.hydrateFromServer !== next.hydrateFromServer ||\n Boolean(prev.resume) !== Boolean(next.resume) ||\n (typeof prev.resume === \"object\" ? prev.resume.streamId : undefined) !==\n (typeof next.resume === \"object\" ? next.resume.streamId : undefined) ||\n (typeof prev.resume === \"object\" ? prev.resume.afterSeq : undefined) !==\n (typeof next.resume === \"object\" ? next.resume.afterSeq : undefined)\n );\n }\n\n /** Resets controller state after a session-defining option changes. */\n private resetForSessionChange(): void {\n this.cancelActiveWork();\n const normalized = this.normalizeMessages(this.options.initialMessages ?? []);\n this.state = createMessageState(normalized);\n this.initialMessages = normalized;\n this.lastResponse = undefined;\n this.lastStructured = undefined;\n this.lastRunId = undefined;\n this.lastStreamId = this.getConfiguredInitialStreamId(this.options);\n this.error = undefined;\n this.status = \"ready\";\n this.lastAppliedSeq = -1;\n this.lastAppliedSeqByStream.clear();\n this.warnedHistoryCombo = false;\n this.initialized = false;\n this.notify();\n this.init();\n }\n\n /** Reads the initial resume stream id from controller options. */\n private getConfiguredInitialStreamId(options: { resume?: ResumeOption }): string | undefined {\n return typeof options.resume === \"object\" && options.resume !== null\n ? options.resume.streamId\n : undefined;\n }\n\n /** Returns one message by local id from the current message state. */\n private getMessageByLocalId(localId: string): UIMessage | undefined {\n const idx = this.state.byLocalId.get(localId);\n return idx === undefined ? undefined : this.state.messages[idx];\n }\n\n /** Updates one message by local id and notifies listeners when found. */\n private updateMessageByLocalId(\n localId: string,\n updater: (msg: UIMessage) => UIMessage,\n ): UIMessage | undefined {\n const idx = this.state.byLocalId.get(localId);\n if (idx === undefined) return undefined;\n const current = this.state.messages[idx];\n if (!current) return undefined;\n const next = this.state.messages.slice();\n next[idx] = updater(current);\n this.state = createMessageState(next);\n this.notify();\n return next[idx];\n }\n\n /** Removes one local message from state and notifies listeners. */\n private removeMessageByLocalId(localId: string): void {\n const idx = this.state.byLocalId.get(localId);\n if (idx === undefined) return;\n const next = this.state.messages.filter((msg) => msg.localId !== localId);\n this.state = createMessageState(next);\n this.notify();\n }\n\n // Request building.\n\n /** Resolves the effective delivery mode for the next submission. */\n private shouldUseStreamDelivery(): boolean {\n if (this.options.delivery === \"stream\") return true;\n if (this.options.delivery === \"final\") return false;\n return true; // `auto` defaults to streaming.\n }\n\n /** Detects stream capability errors that should retry through `run()`. */\n private shouldFallbackToRun(error: AgentClientError): boolean {\n if (this.options.delivery !== \"auto\") return false;\n const message = error.message.toLowerCase();\n return (\n message.includes(\"does not support streaming generation\") ||\n message.includes(\"streaming generation is not supported\") ||\n message.includes(\"streaming is not supported\")\n );\n }\n\n /** Appends model response messages to local state after final delivery. */\n private appendResponseMessages(response: GenerativeModelResponse): void {\n const responseMessages = getMessagesFromResponse(response).map((msg, i) => ({\n ...msg,\n localId: this.generateMessageId(msg),\n ...(msg.id ? {} : { id: `response_${i.toString(36)}` }),\n }));\n\n if (responseMessages.length === 0) return;\n const nextMessages = [...this.state.messages, ...responseMessages];\n this.state = createMessageState(nextMessages);\n this.notify();\n }\n\n /** Normalizes supported final-run response shapes into one controller shape. */\n private normalizeFinalRunResult(payload: unknown): {\n runId?: string;\n response?: GenerativeModelResponse;\n structured?: unknown;\n } {\n if (typeof payload !== \"object\" || payload === null) return {};\n\n const record = payload as Record<string, unknown>;\n const next: { runId?: string; response?: GenerativeModelResponse; structured?: unknown } =\n {};\n\n if (typeof record.runId === \"string\") next.runId = record.runId;\n\n const nestedResponse =\n typeof record.result === \"object\" &&\n record.result !== null &&\n typeof (record.result as { response?: unknown }).response === \"object\" &&\n (record.result as { response?: unknown }).response !== null\n ? ((record.result as { response: GenerativeModelResponse })\n .response as GenerativeModelResponse)\n : undefined;\n\n const maybeResponse =\n nestedResponse ??\n (typeof record.response === \"object\" && record.response !== null\n ? (record.response as GenerativeModelResponse)\n : \"output\" in record && Array.isArray(record.output)\n ? (record as unknown as GenerativeModelResponse)\n : undefined);\n\n if (maybeResponse) next.response = maybeResponse;\n if (\"structured\" in record) next.structured = record.structured;\n return next;\n }\n\n /** Builds the input payload, optionally serializing client history into it. */\n private prepareInputForRequest(\n inputValue: unknown,\n baseMessages: UIMessage[],\n options: {\n sendClientHistory: boolean;\n optimisticLocalId?: string;\n serializedHistoryInput: boolean;\n },\n ): {\n inputToSend: unknown;\n serializedClientHistory: boolean;\n } {\n if (!options.sendClientHistory) {\n return { inputToSend: inputValue, serializedClientHistory: false };\n }\n\n if (options.serializedHistoryInput) {\n return {\n inputToSend: inputValue,\n serializedClientHistory: true,\n };\n }\n\n const preparedMessages = this.options.prepareMessages?.({\n messages: baseMessages,\n input: inputValue,\n });\n if (preparedMessages) {\n return {\n inputToSend: preparedMessages,\n serializedClientHistory: true,\n };\n }\n\n const serializedMessages = toModelMessages(baseMessages);\n const inputItems = this.normalizeInputItems(inputValue);\n\n if (typeof inputValue === \"string\") {\n return {\n inputToSend: options.optimisticLocalId\n ? serializedMessages\n : [\n ...serializedMessages,\n { type: \"message\", role: \"user\", content: inputValue },\n ],\n serializedClientHistory: true,\n };\n }\n\n if (inputItems) {\n return {\n inputToSend:\n options.optimisticLocalId &&\n this.canOmitSubmittedInputFromSerializedHistory(inputValue)\n ? serializedMessages\n : [...serializedMessages, ...inputItems],\n serializedClientHistory: true,\n };\n }\n\n return {\n inputToSend: inputValue,\n serializedClientHistory: false,\n };\n }\n\n /** Builds the run payload for one request. */\n private createRunPayload(\n runInput: ControllerRunInput,\n inputToSend: unknown,\n serializedClientHistory: boolean,\n ): Record<string, unknown> {\n const conversationId =\n typeof runInput.conversationId === \"string\"\n ? runInput.conversationId\n : this.options.conversationId;\n const modelOptions = mergeModelOptions(\n this.options.modelOptions as Record<string, unknown> | undefined,\n runInput.modelOptions as Record<string, unknown> | undefined,\n );\n const { modelOptions: _modelOptions, ...restRunInput } = runInput;\n\n return {\n ...restRunInput,\n input: inputToSend,\n modelOptions: Object.keys(modelOptions).length > 0 ? modelOptions : undefined,\n conversationId,\n context:\n runInput.context !== undefined || this.options.context !== undefined\n ? (runInput.context ?? this.options.context)\n : undefined,\n replaceHistory: serializedClientHistory && Boolean(conversationId) ? true : undefined,\n };\n }\n\n // Input normalization.\n\n /** Builds stream request hooks for ids, callbacks, and optimistic updates. */\n private buildStreamRequestOptions(\n optimisticLocalId: string | undefined,\n onMarkedSent: () => void,\n signal?: AbortSignal,\n ): Record<string, unknown> | undefined {\n const hasCallbacks =\n this.options.onResponse || this.options.onToolCall || this.options.toolHandlers;\n if (!hasCallbacks && !optimisticLocalId && !signal) return undefined;\n\n return {\n signal,\n onResponse: (response: Response) => {\n this.updateResponseIds(response);\n this.options.onResponse?.(response);\n if (response.ok && optimisticLocalId) {\n this.updateMessageByLocalId(optimisticLocalId, (msg) => {\n const { error: _error, ...rest } = msg;\n return { ...rest, status: \"sent\" };\n });\n onMarkedSent();\n }\n },\n onToolCall: this.options.onToolCall,\n toolHandlers: this.options.toolHandlers,\n };\n }\n\n /** Replaces one user message slot with a pending retry version. */\n private replaceRetryMessage(replaceLocalId: string, inputValue: unknown): void {\n const current = this.state.messages;\n const idx = this.state.byLocalId.get(replaceLocalId);\n const nextMessage = this.createPendingUserMessage(inputValue) ?? {\n localId: replaceLocalId,\n role: \"user\",\n parts: [{ type: \"text\", text: String(inputValue ?? \"\") }],\n status: \"pending\",\n };\n\n let nextMessages = current;\n if (idx === undefined) {\n nextMessages = [...current, nextMessage];\n } else {\n const copy = current.slice(0, idx);\n copy.push(nextMessage);\n nextMessages = copy;\n }\n\n if (nextMessages !== current) {\n this.state = createMessageState(nextMessages);\n this.notify();\n }\n }\n\n /** Derives a pending user message from retry input when possible. */\n private createPendingUserMessage(inputValue: unknown): UIMessage | undefined {\n if (typeof inputValue === \"string\") {\n return {\n localId: this.generateMessageId(),\n role: \"user\",\n parts: [{ type: \"text\", text: inputValue }],\n status: \"pending\",\n };\n }\n\n if (typeof inputValue === \"object\" && inputValue !== null && \"localId\" in inputValue) {\n const message = inputValue as UIMessage;\n if (message.role === \"user\" && Array.isArray(message.parts)) {\n const { error: _error, ...rest } = message;\n return {\n ...rest,\n status: \"pending\",\n };\n }\n }\n\n const items = this.normalizeInputItems(inputValue);\n if (!items) {\n return undefined;\n }\n\n const messages = fromModelMessages(items);\n const latestUser = [...messages].reverse().find((message) => message.role === \"user\");\n if (!latestUser) {\n return undefined;\n }\n\n const { error: _error, ...rest } = latestUser;\n return {\n ...rest,\n status: \"pending\",\n };\n }\n\n /** Normalizes supported input shapes into input items when possible. */\n private normalizeInputItems(inputValue: unknown): GenerativeModelInputItem[] | undefined {\n if (Array.isArray(inputValue)) {\n return inputValue as GenerativeModelInputItem[];\n }\n\n if (\n typeof inputValue === \"object\" &&\n inputValue !== null &&\n typeof (inputValue as { type?: unknown }).type === \"string\"\n ) {\n return [inputValue as GenerativeModelInputItem];\n }\n\n return undefined;\n }\n\n /** Returns true when input is safely representable as one optimistic user turn. */\n private canOptimisticallyRenderUserTurn(inputValue: unknown): boolean {\n if (typeof inputValue === \"string\") {\n return true;\n }\n\n if (typeof inputValue === \"object\" && inputValue !== null && \"localId\" in inputValue) {\n const message = inputValue as UIMessage;\n return message.role === \"user\" && Array.isArray(message.parts);\n }\n\n const items = this.normalizeInputItems(inputValue);\n if (!items || items.length !== 1) {\n return false;\n }\n\n const [item] = items;\n return item?.type === \"message\" && (item.role === undefined || item.role === \"user\");\n }\n\n /** Returns true when serialized history can reuse the optimistic user turn. */\n private canOmitSubmittedInputFromSerializedHistory(inputValue: unknown): boolean {\n if (typeof inputValue === \"string\") {\n return true;\n }\n\n if (typeof inputValue === \"object\" && inputValue !== null && \"localId\" in inputValue) {\n const message = inputValue as UIMessage;\n return message.role === \"user\" && Array.isArray(message.parts);\n }\n\n const items = this.normalizeInputItems(inputValue);\n if (!items || items.length !== 1) {\n return false;\n }\n\n const [item] = items;\n return item?.type === \"message\" && item.role === \"user\";\n }\n\n // Callback emission.\n\n /** Calls `onFinish` with the latest completion data. */\n private emitFinish(overrides: {\n streamId?: string;\n conversationId?: string;\n isAbort: boolean;\n }): void {\n const response = this.lastResponse;\n const params = {\n messages: this.state.messages,\n isAbort: overrides.isAbort,\n } as OnFinishParams<TApp, TAgentName>;\n\n if (this.lastRunId) {\n params.runId = this.lastRunId;\n }\n\n const streamIdToUse = overrides.streamId ?? this.lastStreamId;\n if (streamIdToUse) {\n params.streamId = streamIdToUse;\n }\n\n const conversationId = overrides.conversationId ?? this.options.conversationId;\n if (conversationId) {\n params.conversationId = conversationId;\n }\n\n if (response) {\n params.response = response;\n params.finishReason = response.finishReason;\n params.usage = response.usage;\n }\n\n if (this.lastStructured !== undefined) {\n (params as OnFinishParams<TApp, TAgentName> & { structured: unknown }).structured =\n this.lastStructured;\n }\n\n this.options.onFinish?.(params);\n }\n}\n\n/**\n * Creates an `AgentChatController`.\n */\nexport function createAgentChatController<\n TApp,\n TAgentName extends AgentNameFromApp<TApp> = AgentNameFromApp<TApp>,\n>(\n client: BetterAgentClient<TApp>,\n options: AgentChatControllerOptions<TApp, TAgentName>,\n): AgentChatController<TApp, TAgentName> {\n return new AgentChatController<TApp, TAgentName>(client, options);\n}\n"],"mappings":"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"}
|