@opencx/widget-react-headless 4.0.62 → 5.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +23 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4739 -180
- package/dist/index.js.map +1 -1
- package/dist/package.json.d.ts +53 -0
- package/dist/src/WidgetProvider.d.ts +9 -2
- package/dist/src/WidgetProvider.d.ts.map +1 -1
- package/dist/src/__tests__/WidgetProvider.initialization.spec.d.ts +2 -0
- package/dist/src/__tests__/WidgetProvider.initialization.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/AgentChatContext.d.ts +58 -0
- package/dist/src/agent-chat/AgentChatContext.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/WidgetProvider.agent-chat.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/WidgetProvider.agent-chat.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/agent-chat-queue.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/agent-chat-queue.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/agent-chat-stream.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/agent-chat-stream.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/agent-chat-transport.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/agent-chat-transport.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/agent-turn-sources.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/agent-turn-sources.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/ask-questions.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/ask-questions.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/pending-clarification.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/pending-clarification.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/stop-agent-chat-turn.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/stop-agent-chat-turn.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.client-context.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.client-context.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.drain-order.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.drain-order.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.failed-turn.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.failed-turn.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.feature-narrowing.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.feature-narrowing.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.send-features.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.send-features.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.steer.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.steer.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.stop-partial.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.stop-partial.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.stream-handoff.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.stream-handoff.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.turn-retention.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/use-agent-chat.turn-retention.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/__tests__/use-chat-post-finish-data-part.spec.d.ts +2 -0
- package/dist/src/agent-chat/__tests__/use-chat-post-finish-data-part.spec.d.ts.map +1 -0
- package/dist/src/agent-chat/agent-chat-queue.d.ts +29 -0
- package/dist/src/agent-chat/agent-chat-queue.d.ts.map +1 -0
- package/dist/src/agent-chat/agent-chat-stream.d.ts +74 -0
- package/dist/src/agent-chat/agent-chat-stream.d.ts.map +1 -0
- package/dist/src/agent-chat/agent-chat-transport.d.ts +29 -0
- package/dist/src/agent-chat/agent-chat-transport.d.ts.map +1 -0
- package/dist/src/agent-chat/agent-turn-sources.d.ts +23 -0
- package/dist/src/agent-chat/agent-turn-sources.d.ts.map +1 -0
- package/dist/src/agent-chat/ask-questions.d.ts +51 -0
- package/dist/src/agent-chat/ask-questions.d.ts.map +1 -0
- package/dist/src/agent-chat/pending-clarification.d.ts +27 -0
- package/dist/src/agent-chat/pending-clarification.d.ts.map +1 -0
- package/dist/src/agent-chat/steer-into-live-turn.d.ts +35 -0
- package/dist/src/agent-chat/steer-into-live-turn.d.ts.map +1 -0
- package/dist/src/agent-chat/stop-agent-chat-turn.d.ts +12 -0
- package/dist/src/agent-chat/stop-agent-chat-turn.d.ts.map +1 -0
- package/dist/src/agent-chat/useAgentChat.d.ts +54 -0
- package/dist/src/agent-chat/useAgentChat.d.ts.map +1 -0
- package/dist/src/hooks/__tests__/use-display-mode.spec.d.ts +2 -0
- package/dist/src/hooks/__tests__/use-display-mode.spec.d.ts.map +1 -0
- package/dist/src/hooks/__tests__/use-widget-layout.spec.d.ts +2 -0
- package/dist/src/hooks/__tests__/use-widget-layout.spec.d.ts.map +1 -0
- package/dist/src/hooks/__tests__/useHostLocation.spec.d.ts +2 -0
- package/dist/src/hooks/__tests__/useHostLocation.spec.d.ts.map +1 -0
- package/dist/src/hooks/useBot.d.ts +8 -0
- package/dist/src/hooks/useBot.d.ts.map +1 -0
- package/dist/src/hooks/useCsat.d.ts +1 -1
- package/dist/src/hooks/useCsat.d.ts.map +1 -1
- package/dist/src/hooks/useDictation.d.ts +22 -0
- package/dist/src/hooks/useDictation.d.ts.map +1 -0
- package/dist/src/hooks/useDisplayMode.d.ts +7 -0
- package/dist/src/hooks/useDisplayMode.d.ts.map +1 -0
- package/dist/src/hooks/useHostLocation.d.ts +17 -0
- package/dist/src/hooks/useHostLocation.d.ts.map +1 -0
- package/dist/src/hooks/useIsAwaitingBotReply.d.ts.map +1 -1
- package/dist/src/hooks/useMessages.d.ts +3 -6
- package/dist/src/hooks/useMessages.d.ts.map +1 -1
- package/dist/src/hooks/useModes.d.ts +5 -12
- package/dist/src/hooks/useModes.d.ts.map +1 -1
- package/dist/src/hooks/useSessions.d.ts.map +1 -1
- package/dist/src/hooks/useUploadFiles.d.ts +1 -1
- package/dist/src/hooks/useWidgetLayout.d.ts +60 -0
- package/dist/src/hooks/useWidgetLayout.d.ts.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.d.ts.map +1 -1
- package/package.json +11 -5
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/ComponentRegistry.ts","../src/WidgetProvider.tsx","../src/hooks/useConfig.ts","../src/hooks/usePrimitiveState.ts","../src/hooks/useContact.ts","../src/hooks/useDocumentDir.ts","../src/hooks/useMessages.ts","../src/hooks/useSessions.ts","../src/hooks/useIsAwaitingBotReply.ts","../src/hooks/useWidgetRouter.ts","../src/hooks/useUploadFiles.ts","../src/hooks/useWidgetTrigger.tsx","../src/hooks/useModes.ts","../src/hooks/useCsat.ts"],"sourcesContent":["import type { WidgetComponentKey } from '@opencx/widget-core';\nimport type { WidgetComponentType } from './types/components';\n\nexport class ComponentRegistry {\n components: WidgetComponentType[] = [];\n\n constructor(opts: { components?: WidgetComponentType[] }) {\n const { components } = opts;\n\n if (components) {\n components.forEach((c) => this.register(c));\n }\n\n if (this.components.length === 0) {\n throw new Error('No components registered');\n }\n if (!this.get('fallback')) {\n throw new Error('No fallback component registered');\n }\n }\n\n // TODO test that this registers or replaces the component\n register(component: WidgetComponentType) {\n // Replace the key if it already exists\n const index = this.components.findIndex((c) => c.key === component.key);\n if (index !== -1) {\n this.components[index] = component;\n } else {\n this.components.push(component);\n }\n return this;\n }\n\n private get(key: WidgetComponentKey) {\n const c = this.components.find(\n (c) => c.key.toUpperCase() === key.toUpperCase(),\n );\n if (c) return c;\n return null;\n }\n\n public getComponent(key: string) {\n return this.get(key)?.component;\n }\n}\n","import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { version } from '../package.json';\nimport {\n type ExternalStorage,\n type WidgetConfig,\n WidgetCtx,\n} from '@opencx/widget-core';\nimport { ComponentRegistry } from './ComponentRegistry';\nimport type { WidgetComponentType } from './types/components';\n\ninterface WidgetProviderValue {\n widgetCtx: WidgetCtx;\n config: WidgetConfig;\n components?: WidgetComponentType[];\n componentStore: ComponentRegistry;\n version: string;\n contentIframeRef?: React.MutableRefObject<HTMLIFrameElement | null>;\n}\n\nconst context = createContext<WidgetProviderValue | null>(null);\n\nexport function WidgetProvider({\n options: config,\n children,\n components,\n storage,\n loadingComponent,\n}: {\n options: WidgetConfig;\n children: React.ReactNode;\n components?: WidgetComponentType[];\n storage?: ExternalStorage;\n /**\n * Custom loading component while the widget is initializing\n * Not to be confused with the `loading` custom component which renders when the bot's reply is pending\n */\n loadingComponent?: React.ReactNode;\n}) {\n const contentIframeRef = useRef<HTMLIFrameElement | null>(null);\n\n const didInitialize = useRef(false);\n const [widgetCtx, setWidgetCtx] = useState<WidgetCtx | null>(null);\n\n const componentStore = useMemo(\n () =>\n new ComponentRegistry({\n components: components,\n }),\n [components],\n );\n\n useEffect(() => {\n if (didInitialize.current) return;\n didInitialize.current = true;\n\n WidgetCtx.initialize({ config, storage })\n .then(setWidgetCtx)\n .catch(console.error);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!widgetCtx) {\n return loadingComponent || null;\n }\n\n return (\n <context.Provider\n value={{\n widgetCtx,\n config,\n components,\n componentStore,\n version,\n contentIframeRef,\n }}\n >\n {children}\n </context.Provider>\n );\n}\n\nexport function useWidget() {\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error('useWidget must be used within a WidgetProvider');\n }\n return ctx;\n}\n","import { useWidget } from '../WidgetProvider';\n\nexport function useConfig() {\n const { config } = useWidget();\n\n return config;\n}\n","import { useSyncExternalStore } from 'react';\nimport type { PrimitiveState } from '@opencx/widget-core';\n\nexport function usePrimitiveState<T>(p: PrimitiveState<T>) {\n return useSyncExternalStore(p.subscribe, p.get, p.get);\n}\n","import { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\n\nexport function useContact() {\n const { widgetCtx } = useWidget();\n const contactState = usePrimitiveState(widgetCtx.contactCtx.state);\n\n return {\n contactState,\n createUnverifiedContact: widgetCtx.contactCtx.createUnverifiedContact,\n };\n}\n","import { useEffect, useState } from 'react';\nimport type { StringOrLiteral } from '@opencx/widget-core';\n\nexport function useDocumentDir() {\n const [dir, setDir] = useState<StringOrLiteral<'ltr' | 'rtl'>>('ltr');\n\n useEffect(() => {\n const updateDir = () => {\n if (typeof document === 'undefined') return;\n setDir(\n window.getComputedStyle((window.top || window).document.body).direction,\n );\n };\n\n // Set initial direction\n updateDir();\n\n // Watch for direction changes on both document and documentElement\n const observer = new MutationObserver(updateDir);\n\n // Observe both document and documentElement\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir'],\n });\n\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: ['dir'],\n });\n\n // Add event listener for dynamic changes\n window.addEventListener('languagechange', updateDir);\n\n return () => {\n observer.disconnect();\n window.removeEventListener('languagechange', updateDir);\n };\n }, []);\n\n return { dir };\n}\n","import { usePrimitiveState } from './usePrimitiveState';\nimport { useWidget } from '../WidgetProvider';\n\nexport function useMessages() {\n const { widgetCtx } = useWidget();\n const messagesState = usePrimitiveState(widgetCtx.messageCtx.state);\n\n return { messagesState, sendMessage: widgetCtx.messageCtx.sendMessage };\n}\n","import { useMemo } from 'react';\nimport { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\nimport { useConfig } from './useConfig';\n\nexport function useSessions() {\n const { widgetCtx } = useWidget();\n const { oneOpenSessionAllowed } = useConfig();\n const sessionState = usePrimitiveState(widgetCtx.sessionCtx.sessionState);\n const sessionsState = usePrimitiveState(widgetCtx.sessionCtx.sessionsState);\n\n const { openSessions, closedSessions } = useMemo(() => {\n return {\n openSessions: sessionsState.data.filter((s) => s.isOpened === true),\n closedSessions: sessionsState.data.filter((s) => s.isOpened === false),\n };\n }, [sessionsState.data]);\n\n const canCreateNewSession = useMemo(() => {\n if (oneOpenSessionAllowed) {\n return openSessions.length === 0;\n }\n return true;\n }, [oneOpenSessionAllowed, openSessions.length]);\n\n return {\n sessionState,\n sessionsState,\n loadMoreSessions: widgetCtx.sessionCtx.loadMoreSessions,\n resolveSession: widgetCtx.sessionCtx.resolveSession,\n createStateCheckpoint: widgetCtx.sessionCtx.createStateCheckpoint,\n openSessions,\n closedSessions,\n canCreateNewSession,\n };\n}\n","import { useMemo } from 'react';\nimport { useMessages } from './useMessages';\nimport { useSessions } from './useSessions';\n\nexport function useIsAwaitingBotReply() {\n const { sessionState } = useSessions();\n const { messagesState } = useMessages();\n\n const isSessionAssignedToAI = sessionState.session?.assignee.kind === 'ai';\n // This check is useful in cases where the user might navigate in and out of a chat, and `isSendingMessage` is reset back to its default value\n const isLastMessageAUserMessage =\n messagesState.messages?.at(-1)?.type === 'USER';\n\n const isAwaitingBotReply = (() => {\n if (messagesState.isSendingMessageToAI) return true;\n if (\n (isSessionAssignedToAI || sessionState.isCreatingSession) &&\n (messagesState.isSendingMessage || isLastMessageAUserMessage)\n ) {\n return true;\n }\n return false;\n })();\n\n return { isAwaitingBotReply };\n}\n","import { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\n\nexport function useWidgetRouter() {\n const { widgetCtx } = useWidget();\n\n const routerState = usePrimitiveState(widgetCtx.routerCtx.state);\n\n return {\n routerState,\n toSessionsScreen: widgetCtx.routerCtx.toSessionsScreen,\n toChatScreen: widgetCtx.routerCtx.toChatScreen,\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { useWidget } from '../WidgetProvider';\nimport { v4 } from 'uuid';\n\nconst uploadAbortControllers: Map<string, AbortController> = new Map();\n\ninterface FileWithProgress {\n status: 'pending' | 'uploading' | 'success' | 'error';\n id: string;\n file: File;\n fileUrl?: string;\n progress: number;\n error?: string;\n}\n\nfunction useUploadFiles() {\n const [files, setFiles] = useState<FileWithProgress[]>([]);\n const {\n widgetCtx: { api },\n } = useWidget();\n function appendFiles(files: File[]) {\n const newFiles = files.map((file) => ({\n file,\n id: v4(),\n status: 'pending' as const,\n progress: 0,\n }));\n\n setFiles((prev) => [...prev, ...newFiles]);\n newFiles.forEach(uploadFile);\n }\n\n function updateFileById(id: string, update: Partial<FileWithProgress>) {\n setFiles((prev) =>\n prev.map((f) => (f.id === id ? { ...f, ...update } : f)),\n );\n }\n\n function removeFileById(id: string) {\n setFiles((prev) => prev.filter((f) => f.id !== id));\n }\n\n const uploadFile = async (fileItem: FileWithProgress) => {\n const controller = new AbortController();\n uploadAbortControllers.set(fileItem.id, controller);\n\n try {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === fileItem.id ? { ...f, status: 'uploading', progress: 0 } : f,\n ),\n );\n\n const response = await api.uploadFile({\n file: fileItem.file,\n abortSignal: controller.signal,\n onProgress: (percentage) => {\n updateFileById(fileItem.id, { progress: percentage });\n },\n });\n\n updateFileById(fileItem.id, {\n status: 'success',\n fileUrl: response.fileUrl,\n progress: 100,\n });\n } catch (error) {\n if (!controller.signal.aborted) {\n updateFileById(fileItem.id, {\n status: 'error',\n error: error instanceof Error ? error.message : 'Upload failed',\n progress: 0,\n });\n }\n } finally {\n uploadAbortControllers.delete(fileItem.id);\n }\n };\n\n const handleCancelUpload = (fileId: string) => {\n const controller = uploadAbortControllers.get(fileId);\n if (controller) {\n controller.abort();\n uploadAbortControllers.delete(fileId);\n }\n removeFileById(fileId);\n };\n\n const successFiles = useMemo(() => {\n return files.filter((f) => f.status === 'success' && f.fileUrl);\n }, [files]);\n\n function emptyTheFiles() {\n uploadAbortControllers.forEach((controller) => controller.abort());\n uploadAbortControllers.clear();\n setFiles([]);\n }\n\n useEffect(() => {\n return () => {\n uploadAbortControllers.forEach((controller) => controller.abort());\n uploadAbortControllers.clear();\n };\n }, []);\n\n return {\n allFiles: files,\n appendFiles,\n handleCancelUpload,\n successFiles,\n emptyTheFiles,\n getFileById: (id: string) => files.find((f) => f.id === id),\n getUploadProgress: (id: string) =>\n files.find((f) => f.id === id)?.progress ?? 0,\n getUploadStatus: (id: string) => files.find((f) => f.id === id)?.status,\n hasErrors: files.some((f) => f.status === 'error'),\n isUploading: files.some((f) => f.status === 'uploading'),\n };\n}\n\nexport { useUploadFiles, type FileWithProgress };\n","import React, {\n createContext,\n useContext,\n useEffect,\n useState,\n type Dispatch,\n type ReactNode,\n type SetStateAction,\n} from 'react';\nimport { useConfig } from './useConfig';\n\ntype WidgetTriggerCtx = {\n isOpen: boolean;\n setIsOpen: Dispatch<SetStateAction<boolean>>;\n};\n\nconst context = createContext<WidgetTriggerCtx | null>(null);\n\nexport function WidgetTriggerProvider({ children }: { children: ReactNode }) {\n const config = useConfig();\n const [isOpen, setIsOpen] = useState(() => {\n if (config.inline) return true;\n return config.isOpen ?? false;\n });\n\n useEffect(() => {\n setIsOpen((prev) => config.isOpen ?? prev);\n }, [config.isOpen]);\n\n useEffect(() => {\n const openAfterNSeconds = config.openAfterNSeconds;\n if (typeof openAfterNSeconds !== 'number' || isNaN(openAfterNSeconds))\n return;\n\n const timeout = setTimeout(() => setIsOpen(true), openAfterNSeconds * 1000);\n\n return () => clearTimeout(timeout);\n }, [config.openAfterNSeconds]);\n\n return (\n <context.Provider value={{ isOpen, setIsOpen }}>\n {children}\n </context.Provider>\n );\n}\n\nexport function useWidgetTrigger() {\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error(\n 'useWidgetTrigger must be used within a WidgetTriggerProvider',\n );\n }\n return ctx;\n}\n","import { useWidget } from '../WidgetProvider';\nimport { useConfig } from './useConfig';\nimport { useSessions } from './useSessions';\n\nexport function useModes() {\n const { widgetCtx } = useWidget();\n const { modesComponents } = useConfig();\n const { sessionState } = useSessions();\n\n const modes = widgetCtx.modes;\n const activeModeId = sessionState.session?.modeId;\n const activeMode = modes.find((mode) => mode.id === activeModeId);\n\n const Component = modesComponents?.find((modeComponent) =>\n [\n activeMode?.id || '',\n activeMode?.name?.toLowerCase() || '',\n activeMode?.slug?.toLowerCase() || '',\n ].includes(modeComponent.key.toLowerCase()),\n )?.component;\n\n return {\n modes,\n modesComponents,\n activeModeId,\n activeMode,\n Component,\n };\n}\n","import type {\n WidgetSystemMessage__CsatRequested,\n WidgetSystemMessage__CsatSubmitted,\n} from '@opencx/widget-core';\nimport { useMemo } from 'react';\nimport { useMessages } from './useMessages';\nimport { useWidget } from '../WidgetProvider';\n\nexport function useCsat() {\n const { widgetCtx } = useWidget();\n const {\n messagesState: { messages },\n } = useMessages();\n\n const {\n csatRequestedMessage,\n isCsatRequested,\n csatSubmittedMessage,\n isCsatSubmitted,\n submittedScore,\n submittedFeedback,\n } = useMemo(() => {\n const csatRequestedMessage = messages.find(\n (message): message is WidgetSystemMessage__CsatRequested =>\n message.type === 'SYSTEM' && message.subtype === 'csat_requested',\n );\n const csatSubmittedMessage = messages.findLast(\n (message): message is WidgetSystemMessage__CsatSubmitted =>\n message.type === 'SYSTEM' && message.subtype === 'csat_submitted',\n );\n\n return {\n csatRequestedMessage,\n isCsatRequested: !!csatRequestedMessage && !csatSubmittedMessage,\n csatSubmittedMessage,\n isCsatSubmitted: !!csatSubmittedMessage,\n submittedScore: csatSubmittedMessage?.data.payload.score,\n submittedFeedback: csatSubmittedMessage?.data.payload.feedback,\n };\n }, [messages]);\n\n return {\n submitCsat: widgetCtx.csatCtx.submitCsat,\n csatRequestedMessage,\n isCsatRequested,\n csatSubmittedMessage,\n isCsatSubmitted,\n submittedScore,\n submittedFeedback,\n };\n}\n"],"names":["ComponentRegistry","opts","components","c","component","index","key","_a","context","createContext","WidgetProvider","config","children","storage","loadingComponent","contentIframeRef","useRef","didInitialize","widgetCtx","setWidgetCtx","useState","componentStore","useMemo","useEffect","WidgetCtx","React","version","useWidget","ctx","useContext","useConfig","usePrimitiveState","p","useSyncExternalStore","useContact","useDocumentDir","dir","setDir","updateDir","observer","useMessages","useSessions","oneOpenSessionAllowed","sessionState","sessionsState","openSessions","closedSessions","s","canCreateNewSession","useIsAwaitingBotReply","messagesState","isSessionAssignedToAI","isLastMessageAUserMessage","_c","_b","useWidgetRouter","uploadAbortControllers","useUploadFiles","files","setFiles","api","appendFiles","newFiles","file","v4","prev","uploadFile","updateFileById","id","update","f","removeFileById","fileItem","controller","response","percentage","error","handleCancelUpload","fileId","successFiles","emptyTheFiles","WidgetTriggerProvider","isOpen","setIsOpen","openAfterNSeconds","timeout","useWidgetTrigger","useModes","modesComponents","modes","activeModeId","activeMode","mode","Component","modeComponent","useCsat","messages","csatRequestedMessage","isCsatRequested","csatSubmittedMessage","isCsatSubmitted","submittedScore","submittedFeedback","message"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/ComponentRegistry.ts","../src/hooks/usePrimitiveState.ts","../src/agent-chat/pending-clarification.ts","../../../node_modules/.pnpm/@ai-sdk+provider@4.0.3/node_modules/@ai-sdk/provider/dist/index.js","../../../node_modules/.pnpm/eventsource-parser@3.1.0/node_modules/eventsource-parser/dist/index.js","../../../node_modules/.pnpm/eventsource-parser@3.1.0/node_modules/eventsource-parser/dist/stream.js","../../../node_modules/.pnpm/@ai-sdk+provider-utils@5.0.11_zod@4.5.4/node_modules/@ai-sdk/provider-utils/dist/index.js","../../../node_modules/.pnpm/ai@7.0.31_zod@4.5.4/node_modules/ai/dist/index.js","../../../node_modules/.pnpm/throttleit@2.1.0/node_modules/throttleit/index.js","../../../node_modules/.pnpm/@ai-sdk+react@4.0.34_react@19.2.8_zod@4.5.4/node_modules/@ai-sdk/react/dist/index.js","../src/agent-chat/agent-chat-queue.ts","../src/agent-chat/ask-questions.ts","../src/agent-chat/agent-chat-stream.ts","../src/agent-chat/agent-chat-transport.ts","../src/agent-chat/agent-turn-sources.ts","../src/agent-chat/steer-into-live-turn.ts","../src/agent-chat/stop-agent-chat-turn.ts","../src/agent-chat/useAgentChat.ts","../src/agent-chat/AgentChatContext.tsx","../src/WidgetProvider.tsx","../src/hooks/useBot.ts","../src/hooks/useConfig.ts","../src/hooks/useDisplayMode.ts","../src/hooks/useContact.ts","../src/hooks/useDocumentDir.ts","../src/hooks/useHostLocation.ts","../src/hooks/useMessages.ts","../src/hooks/useSessions.ts","../src/hooks/useIsAwaitingBotReply.ts","../src/hooks/useWidgetRouter.ts","../src/hooks/useUploadFiles.ts","../src/hooks/useWidgetTrigger.tsx","../src/hooks/useWidgetLayout.tsx","../src/hooks/useModes.ts","../src/hooks/useCsat.ts","../src/hooks/useDictation.ts"],"sourcesContent":["import type { WidgetComponentKey } from '@opencx/widget-core';\nimport type { WidgetComponentType } from './types/components';\n\nexport class ComponentRegistry {\n components: WidgetComponentType[] = [];\n\n constructor(opts: { components?: WidgetComponentType[] }) {\n const { components } = opts;\n\n if (components) {\n components.forEach((c) => this.register(c));\n }\n\n if (this.components.length === 0) {\n throw new Error('No components registered');\n }\n if (!this.get('fallback')) {\n throw new Error('No fallback component registered');\n }\n }\n\n // TODO test that this registers or replaces the component\n register(component: WidgetComponentType) {\n // Replace the key if it already exists\n const index = this.components.findIndex((c) => c.key === component.key);\n if (index !== -1) {\n this.components[index] = component;\n } else {\n this.components.push(component);\n }\n return this;\n }\n\n private get(key: WidgetComponentKey) {\n const c = this.components.find(\n (c) => c.key.toUpperCase() === key.toUpperCase(),\n );\n if (c) return c;\n return null;\n }\n\n public getComponent(key: string) {\n return this.get(key)?.component;\n }\n}\n","import { useSyncExternalStore } from 'react';\nimport type { PrimitiveState } from '@opencx/widget-core';\n\nexport function usePrimitiveState<T>(p: PrimitiveState<T>) {\n return useSyncExternalStore(p.subscribe, p.get, p.get);\n}\n","import type { StreamingTurnItem } from './agent-chat-stream';\nimport type { AskQuestionsRequest } from './ask-questions';\nimport type { TurnRenderSource } from './agent-turn-sources';\n\n/**\n * The clarification the agent is currently WAITING on, or `null`.\n *\n * A pending clarification replaces the composer, so this answers \"should the\n * customer be picking an option instead of typing?\" — not merely \"was a\n * question asked at some point\". Three rules decide it, and each one exists\n * because of how the answer is delivered (as an ordinary user message):\n *\n * - Nothing while the turn is still streaming. The agent may yet ask again,\n * and chips rendered mid-stream look clickable while the answer they would\n * send is about to be superseded.\n * - The NEWEST questionnaire wins — the live turn's over any settled turn's,\n * and the last of several within one turn.\n * - Nothing once the customer has spoken since. Their reply IS the answer, so\n * a questionnaire still on screen after it would collect a second one.\n */\nexport function pendingClarification({\n turnSources,\n liveItems,\n isStreaming,\n lastMessageIsFromUser,\n}: {\n turnSources: ReadonlyArray<Pick<TurnRenderSource, 'items'>>;\n liveItems: ReadonlyArray<StreamingTurnItem>;\n isStreaming: boolean;\n /** The transcript's last row is the customer's — they have already answered. */\n lastMessageIsFromUser: boolean;\n}): AskQuestionsRequest | null {\n if (isStreaming || lastMessageIsFromUser) return null;\n\n // Only the NEWEST turn can hold a pending question. Once a later turn\n // exists — settled or in flight — the earlier questionnaire was answered or\n // abandoned, and leaving it in the composer would collect an answer to a\n // question the conversation has moved past.\n const newest = liveItems.length > 0 ? liveItems : turnSources.at(-1)?.items;\n return newest ? lastQuestions(newest) : null;\n}\n\nfunction lastQuestions(\n items: ReadonlyArray<StreamingTurnItem>,\n): AskQuestionsRequest | null {\n for (let index = items.length - 1; index >= 0; index--) {\n const item = items[index];\n if (item?.kind === 'questions') return item.request;\n }\n return null;\n}\n","// src/errors/ai-sdk-error.ts\nvar marker = \"vercel.ai.error\";\nvar symbol = Symbol.for(marker);\nvar _a, _b;\nvar AISDKError = class _AISDKError extends (_b = Error, _a = symbol, _b) {\n /**\n * Creates an AI SDK Error.\n *\n * @param {Object} params - The parameters for creating the error.\n * @param {string} params.name - The name of the error.\n * @param {string} params.message - The error message.\n * @param {unknown} [params.cause] - The underlying cause of the error.\n */\n constructor({\n name: name15,\n message,\n cause\n }) {\n super(message);\n this[_a] = true;\n this.name = name15;\n this.cause = cause;\n }\n /**\n * Checks if the given error is an AI SDK Error.\n * @param {unknown} error - The error to check.\n * @returns {boolean} True if the error is an AI SDK Error, false otherwise.\n */\n static isInstance(error) {\n return _AISDKError.hasMarker(error, marker);\n }\n static hasMarker(error, marker16) {\n const markerSymbol = Symbol.for(marker16);\n return error != null && typeof error === \"object\" && markerSymbol in error && typeof error[markerSymbol] === \"boolean\" && error[markerSymbol] === true;\n }\n};\n\n// src/errors/api-call-error.ts\nvar name = \"AI_APICallError\";\nvar marker2 = `vercel.ai.error.${name}`;\nvar symbol2 = Symbol.for(marker2);\nvar _a2, _b2;\nvar APICallError = class extends (_b2 = AISDKError, _a2 = symbol2, _b2) {\n constructor({\n message,\n url,\n requestBodyValues,\n statusCode,\n responseHeaders,\n responseBody,\n cause,\n isRetryable = statusCode != null && (statusCode === 408 || // request timeout\n statusCode === 409 || // conflict\n statusCode === 429 || // too many requests\n statusCode >= 500),\n // server error\n data\n }) {\n super({ name, message, cause });\n this[_a2] = true;\n this.url = url;\n this.requestBodyValues = requestBodyValues;\n this.statusCode = statusCode;\n this.responseHeaders = responseHeaders;\n this.responseBody = responseBody;\n this.isRetryable = isRetryable;\n this.data = data;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker2);\n }\n};\n\n// src/errors/empty-response-body-error.ts\nvar name2 = \"AI_EmptyResponseBodyError\";\nvar marker3 = `vercel.ai.error.${name2}`;\nvar symbol3 = Symbol.for(marker3);\nvar _a3, _b3;\nvar EmptyResponseBodyError = class extends (_b3 = AISDKError, _a3 = symbol3, _b3) {\n // used in isInstance\n constructor({ message = \"Empty response body\" } = {}) {\n super({ name: name2, message });\n this[_a3] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker3);\n }\n};\n\n// src/errors/get-error-message.ts\nfunction getErrorMessage(error) {\n if (error == null) {\n return \"unknown error\";\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error instanceof Error) {\n return error.toString();\n }\n return JSON.stringify(error);\n}\n\n// src/errors/invalid-argument-error.ts\nvar name3 = \"AI_InvalidArgumentError\";\nvar marker4 = `vercel.ai.error.${name3}`;\nvar symbol4 = Symbol.for(marker4);\nvar _a4, _b4;\nvar InvalidArgumentError = class extends (_b4 = AISDKError, _a4 = symbol4, _b4) {\n constructor({\n message,\n cause,\n argument\n }) {\n super({ name: name3, message, cause });\n this[_a4] = true;\n this.argument = argument;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker4);\n }\n};\n\n// src/errors/invalid-prompt-error.ts\nvar name4 = \"AI_InvalidPromptError\";\nvar marker5 = `vercel.ai.error.${name4}`;\nvar symbol5 = Symbol.for(marker5);\nvar _a5, _b5;\nvar InvalidPromptError = class extends (_b5 = AISDKError, _a5 = symbol5, _b5) {\n constructor({\n prompt,\n message,\n cause\n }) {\n super({ name: name4, message: `Invalid prompt: ${message}`, cause });\n this[_a5] = true;\n this.prompt = prompt;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker5);\n }\n};\n\n// src/errors/invalid-response-data-error.ts\nvar name5 = \"AI_InvalidResponseDataError\";\nvar marker6 = `vercel.ai.error.${name5}`;\nvar symbol6 = Symbol.for(marker6);\nvar _a6, _b6;\nvar InvalidResponseDataError = class extends (_b6 = AISDKError, _a6 = symbol6, _b6) {\n constructor({\n data,\n message = `Invalid response data: ${JSON.stringify(data)}.`\n }) {\n super({ name: name5, message });\n this[_a6] = true;\n this.data = data;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker6);\n }\n};\n\n// src/errors/json-parse-error.ts\nvar name6 = \"AI_JSONParseError\";\nvar marker7 = `vercel.ai.error.${name6}`;\nvar symbol7 = Symbol.for(marker7);\nvar _a7, _b7;\nvar JSONParseError = class extends (_b7 = AISDKError, _a7 = symbol7, _b7) {\n constructor({ text, cause }) {\n super({\n name: name6,\n message: `JSON parsing failed: Text: ${text}.\nError message: ${getErrorMessage(cause)}`,\n cause\n });\n this[_a7] = true;\n this.text = text;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker7);\n }\n};\n\n// src/errors/load-api-key-error.ts\nvar name7 = \"AI_LoadAPIKeyError\";\nvar marker8 = `vercel.ai.error.${name7}`;\nvar symbol8 = Symbol.for(marker8);\nvar _a8, _b8;\nvar LoadAPIKeyError = class extends (_b8 = AISDKError, _a8 = symbol8, _b8) {\n // used in isInstance\n constructor({ message }) {\n super({ name: name7, message });\n this[_a8] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker8);\n }\n};\n\n// src/errors/load-setting-error.ts\nvar name8 = \"AI_LoadSettingError\";\nvar marker9 = `vercel.ai.error.${name8}`;\nvar symbol9 = Symbol.for(marker9);\nvar _a9, _b9;\nvar LoadSettingError = class extends (_b9 = AISDKError, _a9 = symbol9, _b9) {\n // used in isInstance\n constructor({ message }) {\n super({ name: name8, message });\n this[_a9] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker9);\n }\n};\n\n// src/errors/no-content-generated-error.ts\nvar name9 = \"AI_NoContentGeneratedError\";\nvar marker10 = `vercel.ai.error.${name9}`;\nvar symbol10 = Symbol.for(marker10);\nvar _a10, _b10;\nvar NoContentGeneratedError = class extends (_b10 = AISDKError, _a10 = symbol10, _b10) {\n // used in isInstance\n constructor({\n message = \"No content generated.\"\n } = {}) {\n super({ name: name9, message });\n this[_a10] = true;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker10);\n }\n};\n\n// src/errors/no-such-model-error.ts\nvar name10 = \"AI_NoSuchModelError\";\nvar marker11 = `vercel.ai.error.${name10}`;\nvar symbol11 = Symbol.for(marker11);\nvar _a11, _b11;\nvar NoSuchModelError = class extends (_b11 = AISDKError, _a11 = symbol11, _b11) {\n constructor({\n errorName = name10,\n modelId,\n modelType,\n message = `No such ${modelType}: ${modelId}`\n }) {\n super({ name: errorName, message });\n this[_a11] = true;\n this.modelId = modelId;\n this.modelType = modelType;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker11);\n }\n};\n\n// src/errors/no-such-provider-reference-error.ts\nvar name11 = \"AI_NoSuchProviderReferenceError\";\nvar marker12 = `vercel.ai.error.${name11}`;\nvar symbol12 = Symbol.for(marker12);\nvar _a12, _b12;\nvar NoSuchProviderReferenceError = class extends (_b12 = AISDKError, _a12 = symbol12, _b12) {\n constructor({\n provider,\n reference,\n message = `No provider reference found for provider '${provider}'. Available providers: ${Object.keys(reference).join(\", \")}`\n }) {\n super({ name: name11, message });\n this[_a12] = true;\n this.provider = provider;\n this.reference = reference;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker12);\n }\n};\n\n// src/errors/too-many-embedding-values-for-call-error.ts\nvar name12 = \"AI_TooManyEmbeddingValuesForCallError\";\nvar marker13 = `vercel.ai.error.${name12}`;\nvar symbol13 = Symbol.for(marker13);\nvar _a13, _b13;\nvar TooManyEmbeddingValuesForCallError = class extends (_b13 = AISDKError, _a13 = symbol13, _b13) {\n constructor(options) {\n super({\n name: name12,\n message: `Too many values for a single embedding call. The ${options.provider} model \"${options.modelId}\" can only embed up to ${options.maxEmbeddingsPerCall} values per call, but ${options.values.length} values were provided.`\n });\n this[_a13] = true;\n this.provider = options.provider;\n this.modelId = options.modelId;\n this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall;\n this.values = options.values;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker13);\n }\n};\n\n// src/errors/type-validation-error.ts\nvar name13 = \"AI_TypeValidationError\";\nvar marker14 = `vercel.ai.error.${name13}`;\nvar symbol14 = Symbol.for(marker14);\nvar _a14, _b14;\nvar TypeValidationError = class _TypeValidationError extends (_b14 = AISDKError, _a14 = symbol14, _b14) {\n constructor({\n value,\n cause,\n context\n }) {\n let contextPrefix = \"Type validation failed\";\n if (context == null ? void 0 : context.field) {\n contextPrefix += ` for ${context.field}`;\n }\n if ((context == null ? void 0 : context.entityName) || (context == null ? void 0 : context.entityId)) {\n contextPrefix += \" (\";\n const parts = [];\n if (context.entityName) {\n parts.push(context.entityName);\n }\n if (context.entityId) {\n parts.push(`id: \"${context.entityId}\"`);\n }\n contextPrefix += parts.join(\", \");\n contextPrefix += \")\";\n }\n super({\n name: name13,\n message: `${contextPrefix}: Value: ${JSON.stringify(value)}.\nError message: ${getErrorMessage(cause)}`,\n cause\n });\n this[_a14] = true;\n this.value = value;\n this.context = context;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker14);\n }\n /**\n * Wraps an error into a TypeValidationError.\n * If the cause is already a TypeValidationError with the same value and context, it returns the cause.\n * Otherwise, it creates a new TypeValidationError.\n *\n * @param {Object} params - The parameters for wrapping the error.\n * @param {unknown} params.value - The value that failed validation.\n * @param {unknown} params.cause - The original error or cause of the validation failure.\n * @param {TypeValidationContext} params.context - Optional context about what is being validated.\n * @returns {TypeValidationError} A TypeValidationError instance.\n */\n static wrap({\n value,\n cause,\n context\n }) {\n var _a16, _b16, _c;\n if (_TypeValidationError.isInstance(cause) && cause.value === value && ((_a16 = cause.context) == null ? void 0 : _a16.field) === (context == null ? void 0 : context.field) && ((_b16 = cause.context) == null ? void 0 : _b16.entityName) === (context == null ? void 0 : context.entityName) && ((_c = cause.context) == null ? void 0 : _c.entityId) === (context == null ? void 0 : context.entityId)) {\n return cause;\n }\n return new _TypeValidationError({ value, cause, context });\n }\n};\n\n// src/errors/unsupported-functionality-error.ts\nvar name14 = \"AI_UnsupportedFunctionalityError\";\nvar marker15 = `vercel.ai.error.${name14}`;\nvar symbol15 = Symbol.for(marker15);\nvar _a15, _b15;\nvar UnsupportedFunctionalityError = class extends (_b15 = AISDKError, _a15 = symbol15, _b15) {\n constructor({\n functionality,\n message = `'${functionality}' functionality not supported.`\n }) {\n super({ name: name14, message });\n this[_a15] = true;\n this.functionality = functionality;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker15);\n }\n};\n\n// src/json-value/is-json.ts\nfunction isJSONValue(value) {\n if (value === null || typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isJSONValue);\n }\n if (typeof value === \"object\") {\n return Object.entries(value).every(\n ([key, val]) => typeof key === \"string\" && (val === void 0 || isJSONValue(val))\n );\n }\n return false;\n}\nfunction isJSONArray(value) {\n return Array.isArray(value) && value.every(isJSONValue);\n}\nfunction isJSONObject(value) {\n return value != null && typeof value === \"object\" && Object.entries(value).every(\n ([key, val]) => typeof key === \"string\" && (val === void 0 || isJSONValue(val))\n );\n}\nexport {\n AISDKError,\n APICallError,\n EmptyResponseBodyError,\n InvalidArgumentError,\n InvalidPromptError,\n InvalidResponseDataError,\n JSONParseError,\n LoadAPIKeyError,\n LoadSettingError,\n NoContentGeneratedError,\n NoSuchModelError,\n NoSuchProviderReferenceError,\n TooManyEmbeddingValuesForCallError,\n TypeValidationError,\n UnsupportedFunctionalityError,\n getErrorMessage,\n isJSONArray,\n isJSONObject,\n isJSONValue\n};\n//# sourceMappingURL=index.js.map","class ParseError extends Error {\n constructor(message, options) {\n super(message), this.name = \"ParseError\", this.type = options.type, this.field = options.field, this.value = options.value, this.line = options.line;\n }\n}\nconst LF = 10, CR = 13, SPACE = 32;\nfunction noop(_arg) {\n}\nfunction createParser(config) {\n if (typeof config == \"function\")\n throw new TypeError(\n \"`config` must be an object, got a function instead. Did you mean `createParser({onEvent: fn})`?\"\n );\n const { onEvent = noop, onError = noop, onRetry = noop, onComment, maxBufferSize } = config, pendingFragments = [];\n let pendingFragmentsLength = 0, isFirstChunk = !0, id, data = \"\", dataLines = 0, eventType, terminated = !1;\n function feed(chunk) {\n if (terminated)\n throw new Error(\n \"Cannot feed parser: it was terminated after exceeding the configured max buffer size. Call `reset()` to resume parsing.\"\n );\n if (isFirstChunk && (isFirstChunk = !1, chunk.charCodeAt(0) === 239 && chunk.charCodeAt(1) === 187 && chunk.charCodeAt(2) === 191 && (chunk = chunk.slice(3))), pendingFragments.length === 0) {\n const trailing2 = processLines(chunk);\n trailing2 !== \"\" && (pendingFragments.push(trailing2), pendingFragmentsLength = trailing2.length), checkBufferSize();\n return;\n }\n if (chunk.indexOf(`\n`) === -1 && chunk.indexOf(\"\\r\") === -1) {\n pendingFragments.push(chunk), pendingFragmentsLength += chunk.length, checkBufferSize();\n return;\n }\n pendingFragments.push(chunk);\n const input = pendingFragments.join(\"\");\n pendingFragments.length = 0, pendingFragmentsLength = 0;\n const trailing = processLines(input);\n trailing !== \"\" && (pendingFragments.push(trailing), pendingFragmentsLength = trailing.length), checkBufferSize();\n }\n function checkBufferSize() {\n maxBufferSize !== void 0 && (pendingFragmentsLength + data.length <= maxBufferSize || (terminated = !0, pendingFragments.length = 0, pendingFragmentsLength = 0, id = void 0, data = \"\", dataLines = 0, eventType = void 0, onError(\n new ParseError(`Buffered data exceeded max buffer size of ${maxBufferSize} characters`, {\n type: \"max-buffer-size-exceeded\"\n })\n )));\n }\n function processLines(chunk) {\n let searchIndex = 0;\n if (chunk.indexOf(\"\\r\") === -1) {\n let lfIndex = chunk.indexOf(`\n`, searchIndex);\n for (; lfIndex !== -1; ) {\n if (searchIndex === lfIndex) {\n dataLines > 0 && onEvent({ id, event: eventType, data }), id = void 0, data = \"\", dataLines = 0, eventType = void 0, searchIndex = lfIndex + 1, lfIndex = chunk.indexOf(`\n`, searchIndex);\n continue;\n }\n const firstCharCode = chunk.charCodeAt(searchIndex);\n if (isDataPrefix(chunk, searchIndex, firstCharCode)) {\n const valueStart = chunk.charCodeAt(searchIndex + 5) === SPACE ? searchIndex + 6 : searchIndex + 5, value = chunk.slice(valueStart, lfIndex);\n if (dataLines === 0 && chunk.charCodeAt(lfIndex + 1) === LF) {\n onEvent({ id, event: eventType, data: value }), id = void 0, data = \"\", eventType = void 0, searchIndex = lfIndex + 2, lfIndex = chunk.indexOf(`\n`, searchIndex);\n continue;\n }\n data = dataLines === 0 ? value : `${data}\n${value}`, dataLines++;\n } else isEventPrefix(chunk, searchIndex, firstCharCode) ? eventType = chunk.slice(\n chunk.charCodeAt(searchIndex + 6) === SPACE ? searchIndex + 7 : searchIndex + 6,\n lfIndex\n ) || void 0 : parseLine(chunk, searchIndex, lfIndex);\n searchIndex = lfIndex + 1, lfIndex = chunk.indexOf(`\n`, searchIndex);\n }\n return chunk.slice(searchIndex);\n }\n for (; searchIndex < chunk.length; ) {\n const crIndex = chunk.indexOf(\"\\r\", searchIndex), lfIndex = chunk.indexOf(`\n`, searchIndex);\n let lineEnd = -1;\n if (crIndex !== -1 && lfIndex !== -1 ? lineEnd = crIndex < lfIndex ? crIndex : lfIndex : crIndex !== -1 ? crIndex === chunk.length - 1 ? lineEnd = -1 : lineEnd = crIndex : lfIndex !== -1 && (lineEnd = lfIndex), lineEnd === -1)\n break;\n parseLine(chunk, searchIndex, lineEnd), searchIndex = lineEnd + 1, chunk.charCodeAt(searchIndex - 1) === CR && chunk.charCodeAt(searchIndex) === LF && searchIndex++;\n }\n return chunk.slice(searchIndex);\n }\n function parseLine(chunk, start, end) {\n if (start === end) {\n dispatchEvent();\n return;\n }\n const firstCharCode = chunk.charCodeAt(start);\n if (isDataPrefix(chunk, start, firstCharCode)) {\n const valueStart = chunk.charCodeAt(start + 5) === SPACE ? start + 6 : start + 5, value2 = chunk.slice(valueStart, end);\n data = dataLines === 0 ? value2 : `${data}\n${value2}`, dataLines++;\n return;\n }\n if (isEventPrefix(chunk, start, firstCharCode)) {\n eventType = chunk.slice(chunk.charCodeAt(start + 6) === SPACE ? start + 7 : start + 6, end) || void 0;\n return;\n }\n if (firstCharCode === 105 && chunk.charCodeAt(start + 1) === 100 && chunk.charCodeAt(start + 2) === 58) {\n const value2 = chunk.slice(chunk.charCodeAt(start + 3) === SPACE ? start + 4 : start + 3, end);\n id = value2.includes(\"\\0\") ? void 0 : value2;\n return;\n }\n if (firstCharCode === 58) {\n if (onComment) {\n const line2 = chunk.slice(start, end);\n onComment(line2.slice(chunk.charCodeAt(start + 1) === SPACE ? 2 : 1));\n }\n return;\n }\n const line = chunk.slice(start, end), fieldSeparatorIndex = line.indexOf(\":\");\n if (fieldSeparatorIndex === -1) {\n processField(line, \"\", line);\n return;\n }\n const field = line.slice(0, fieldSeparatorIndex), offset = line.charCodeAt(fieldSeparatorIndex + 1) === SPACE ? 2 : 1, value = line.slice(fieldSeparatorIndex + offset);\n processField(field, value, line);\n }\n function processField(field, value, line) {\n switch (field) {\n case \"event\":\n eventType = value || void 0;\n break;\n case \"data\":\n data = dataLines === 0 ? value : `${data}\n${value}`, dataLines++;\n break;\n case \"id\":\n id = value.includes(\"\\0\") ? void 0 : value;\n break;\n case \"retry\":\n /^\\d+$/.test(value) ? onRetry(parseInt(value, 10)) : onError(\n new ParseError(`Invalid \\`retry\\` value: \"${value}\"`, {\n type: \"invalid-retry\",\n value,\n line\n })\n );\n break;\n default:\n onError(\n new ParseError(\n `Unknown field \"${field.length > 20 ? `${field.slice(0, 20)}\\u2026` : field}\"`,\n { type: \"unknown-field\", field, value, line }\n )\n );\n break;\n }\n }\n function dispatchEvent() {\n dataLines > 0 && onEvent({\n id,\n event: eventType,\n data\n }), id = void 0, data = \"\", dataLines = 0, eventType = void 0;\n }\n function reset(options = {}) {\n if (options.consume && pendingFragments.length > 0) {\n const incompleteLine = pendingFragments.join(\"\");\n parseLine(incompleteLine, 0, incompleteLine.length);\n }\n isFirstChunk = !0, id = void 0, data = \"\", dataLines = 0, eventType = void 0, pendingFragments.length = 0, pendingFragmentsLength = 0, terminated = !1;\n }\n return { feed, reset };\n}\nfunction isDataPrefix(chunk, i, firstCharCode) {\n return firstCharCode === 100 && chunk.charCodeAt(i + 1) === 97 && chunk.charCodeAt(i + 2) === 116 && chunk.charCodeAt(i + 3) === 97 && chunk.charCodeAt(i + 4) === 58;\n}\nfunction isEventPrefix(chunk, i, firstCharCode) {\n return firstCharCode === 101 && chunk.charCodeAt(i + 1) === 118 && chunk.charCodeAt(i + 2) === 101 && chunk.charCodeAt(i + 3) === 110 && chunk.charCodeAt(i + 4) === 116 && chunk.charCodeAt(i + 5) === 58;\n}\nexport {\n ParseError,\n createParser\n};\n//# sourceMappingURL=index.js.map\n","import { createParser } from \"./index.js\";\nimport { ParseError } from \"./index.js\";\nclass EventSourceParserStream extends TransformStream {\n constructor({ onError, onRetry, onComment, maxBufferSize } = {}) {\n let parser;\n super({\n start(controller) {\n parser = createParser({\n onEvent: (event) => {\n controller.enqueue(event);\n },\n onError(error) {\n typeof onError == \"function\" && onError(error), (onError === \"terminate\" || error.type === \"max-buffer-size-exceeded\") && controller.error(error);\n },\n onRetry,\n onComment,\n maxBufferSize\n });\n },\n transform(chunk) {\n parser.feed(chunk);\n }\n });\n }\n}\nexport {\n EventSourceParserStream,\n ParseError\n};\n//# sourceMappingURL=stream.js.map\n","// src/as-array.ts\nfunction asArray(value) {\n return value === void 0 ? [] : Array.isArray(value) ? value : [value];\n}\n\n// src/combine-headers.ts\nfunction combineHeaders(...headers) {\n return headers.reduce(\n (combinedHeaders, currentHeaders) => ({\n ...combinedHeaders,\n ...currentHeaders != null ? currentHeaders : {}\n }),\n {}\n );\n}\n\n// src/remove-undefined-entries.ts\nfunction removeUndefinedEntries(record) {\n return Object.fromEntries(\n Object.entries(record).filter(([_key, value]) => value != null)\n );\n}\n\n// src/delay.ts\nasync function delay(delayInMs, options) {\n if (delayInMs == null) {\n return Promise.resolve();\n }\n const signal = options == null ? void 0 : options.abortSignal;\n return new Promise((resolve2, reject) => {\n if (signal == null ? void 0 : signal.aborted) {\n reject(createAbortError());\n return;\n }\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve2();\n }, delayInMs);\n const cleanup = () => {\n clearTimeout(timeoutId);\n signal == null ? void 0 : signal.removeEventListener(\"abort\", onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(createAbortError());\n };\n signal == null ? void 0 : signal.addEventListener(\"abort\", onAbort);\n });\n}\nfunction createAbortError() {\n return new DOMException(\"Delay was aborted\", \"AbortError\");\n}\n\n// src/websocket.ts\nfunction getWebSocketConstructor(webSocket) {\n const WebSocketConstructor = webSocket != null ? webSocket : globalThis.WebSocket;\n if (WebSocketConstructor == null) {\n throw new Error(\"No WebSocket implementation available.\");\n }\n return WebSocketConstructor;\n}\nfunction toWebSocketUrl(url) {\n const wsUrl = new URL(url);\n if (wsUrl.protocol === \"http:\") {\n wsUrl.protocol = \"ws:\";\n } else if (wsUrl.protocol === \"https:\") {\n wsUrl.protocol = \"wss:\";\n }\n return wsUrl;\n}\nvar textDecoder = new TextDecoder();\nasync function readWebSocketMessageText(data) {\n if (typeof data === \"string\") return data;\n if (data instanceof ArrayBuffer) return textDecoder.decode(data);\n if (ArrayBuffer.isView(data)) {\n return textDecoder.decode(data);\n }\n if (typeof Blob !== \"undefined\" && data instanceof Blob) {\n return data.text();\n }\n return String(data);\n}\nvar WEBSOCKET_OPEN_STATE = 1;\nasync function waitForWebSocketBufferDrain(socket, {\n highWaterMark = 1024 * 1024,\n pollIntervalMs = 20,\n abortSignal\n} = {}) {\n var _a2;\n while (socket.readyState === WEBSOCKET_OPEN_STATE && ((_a2 = socket.bufferedAmount) != null ? _a2 : 0) > highWaterMark) {\n if ((abortSignal == null ? void 0 : abortSignal.aborted) === true) {\n return;\n }\n await delay(pollIntervalMs);\n }\n}\n\n// src/connect-to-websocket.ts\nfunction connectToWebSocket({\n url,\n protocols,\n headers,\n webSocket,\n abortSignal,\n onOpen,\n onMessageText,\n onProcessingError,\n onSocketError,\n onClose,\n onAbort\n}) {\n var _a2;\n let socket;\n let abortListener;\n const close = (code) => {\n if (abortListener != null) {\n abortSignal == null ? void 0 : abortSignal.removeEventListener(\"abort\", abortListener);\n abortListener = void 0;\n }\n try {\n socket == null ? void 0 : socket.close(code);\n } catch (e) {\n }\n };\n if (abortSignal == null ? void 0 : abortSignal.aborted) {\n onAbort == null ? void 0 : onAbort((_a2 = abortSignal.reason) != null ? _a2 : new Error(\"Aborted\"));\n return { socket: void 0, close };\n }\n try {\n const WebSocketConstructor = getWebSocketConstructor(webSocket);\n socket = new WebSocketConstructor(url, protocols, {\n headers: removeUndefinedEntries(headers != null ? headers : {})\n });\n } catch (error) {\n onProcessingError(error);\n return { socket: void 0, close };\n }\n if (abortSignal != null && onAbort != null) {\n abortListener = () => {\n var _a3;\n return onAbort((_a3 = abortSignal.reason) != null ? _a3 : new Error(\"Aborted\"));\n };\n abortSignal.addEventListener(\"abort\", abortListener, { once: true });\n }\n const openedSocket = socket;\n socket.onopen = () => {\n try {\n onOpen == null ? void 0 : onOpen(openedSocket);\n } catch (error) {\n onProcessingError(error);\n }\n };\n let tail = Promise.resolve();\n socket.onmessage = (event) => {\n tail = tail.then(() => readWebSocketMessageText(event.data)).then((text) => onMessageText(text)).catch(onProcessingError);\n };\n socket.onerror = () => {\n tail = tail.then(() => onSocketError == null ? void 0 : onSocketError()).catch(onProcessingError);\n };\n socket.onclose = () => {\n tail = tail.then(() => onClose == null ? void 0 : onClose()).catch(onProcessingError);\n };\n return { socket, close };\n}\n\n// src/convert-async-iterator-to-readable-stream.ts\nfunction convertAsyncIteratorToReadableStream(iterator) {\n let cancelled = false;\n return new ReadableStream({\n /**\n * Called when the consumer wants to pull more data from the stream.\n *\n * @param {ReadableStreamDefaultController<T>} controller - The controller to enqueue data into the stream.\n * @returns {Promise<void>}\n */\n async pull(controller) {\n if (cancelled) return;\n try {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n } catch (error) {\n controller.error(error);\n }\n },\n /**\n * Called when the consumer cancels the stream.\n */\n async cancel(reason) {\n cancelled = true;\n if (iterator.return) {\n try {\n await iterator.return(reason);\n } catch (e) {\n }\n }\n }\n });\n}\n\n// src/uint8-utils.ts\nvar { btoa, atob } = globalThis;\nfunction convertBase64ToUint8Array(base64String) {\n const base64Url = base64String.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const latin1string = atob(base64Url);\n return Uint8Array.from(latin1string, (byte) => byte.codePointAt(0));\n}\nfunction convertUint8ArrayToBase64(array) {\n let latin1string = \"\";\n for (let i = 0; i < array.length; i++) {\n latin1string += String.fromCodePoint(array[i]);\n }\n return btoa(latin1string);\n}\nfunction convertToBase64(value) {\n return value instanceof Uint8Array ? convertUint8ArrayToBase64(value) : value;\n}\n\n// src/convert-inline-file-data-to-uint8-array.ts\nfunction convertInlineFileDataToUint8Array(data) {\n if (data.type === \"text\") {\n return new TextEncoder().encode(data.text);\n }\n if (data.data instanceof Uint8Array) {\n return data.data;\n }\n if (data.data instanceof ArrayBuffer) {\n return new Uint8Array(data.data);\n }\n return convertBase64ToUint8Array(data.data);\n}\n\n// src/convert-image-model-file-to-data-uri.ts\nfunction convertImageModelFileToDataUri(file) {\n if (file.type === \"url\") return file.url;\n return `data:${file.mediaType};base64,${typeof file.data === \"string\" ? file.data : convertUint8ArrayToBase64(file.data)}`;\n}\n\n// src/convert-to-form-data.ts\nfunction convertToFormData(input, options = {}) {\n const { useArrayBrackets = true } = options;\n const formData = new FormData();\n for (const [key, value] of Object.entries(input)) {\n if (value == null) {\n continue;\n }\n if (Array.isArray(value)) {\n if (value.length === 1) {\n formData.append(key, value[0]);\n continue;\n }\n const arrayKey = useArrayBrackets ? `${key}[]` : key;\n for (const item of value) {\n formData.append(arrayKey, item);\n }\n continue;\n }\n formData.append(key, value);\n }\n return formData;\n}\n\n// src/create-tool-name-mapping.ts\nfunction createToolNameMapping({\n tools = [],\n providerToolNames\n}) {\n const customToolNameToProviderToolName = {};\n const providerToolNameToCustomToolName = {};\n for (const tool2 of tools) {\n if (tool2.type === \"provider\" && tool2.id in providerToolNames) {\n const providerToolName = providerToolNames[tool2.id];\n customToolNameToProviderToolName[tool2.name] = providerToolName;\n providerToolNameToCustomToolName[providerToolName] = tool2.name;\n }\n }\n return {\n toProviderToolName: (customToolName) => {\n var _a2;\n return (_a2 = customToolNameToProviderToolName[customToolName]) != null ? _a2 : customToolName;\n },\n toCustomToolName: (providerToolName) => {\n var _a2;\n return (_a2 = providerToolNameToCustomToolName[providerToolName]) != null ? _a2 : providerToolName;\n }\n };\n}\n\n// src/delayed-promise.ts\nvar DelayedPromise = class {\n constructor() {\n this.status = { type: \"pending\" };\n this._resolve = void 0;\n this._reject = void 0;\n }\n get promise() {\n if (this._promise) {\n return this._promise;\n }\n this._promise = new Promise((resolve2, reject) => {\n if (this.status.type === \"resolved\") {\n resolve2(this.status.value);\n } else if (this.status.type === \"rejected\") {\n reject(this.status.error);\n }\n this._resolve = resolve2;\n this._reject = reject;\n });\n return this._promise;\n }\n resolve(value) {\n var _a2;\n this.status = { type: \"resolved\", value };\n if (this._promise) {\n (_a2 = this._resolve) == null ? void 0 : _a2.call(this, value);\n }\n }\n reject(error) {\n var _a2;\n this.status = { type: \"rejected\", error };\n if (this._promise) {\n (_a2 = this._reject) == null ? void 0 : _a2.call(this, error);\n }\n }\n isResolved() {\n return this.status.type === \"resolved\";\n }\n isRejected() {\n return this.status.type === \"rejected\";\n }\n isPending() {\n return this.status.type === \"pending\";\n }\n};\n\n// src/detect-media-type.ts\nvar imageMediaTypeSignatures = [\n {\n mediaType: \"image/gif\",\n bytesPrefix: [71, 73, 70]\n // GIF\n },\n {\n mediaType: \"image/png\",\n bytesPrefix: [137, 80, 78, 71]\n // PNG\n },\n {\n mediaType: \"image/jpeg\",\n bytesPrefix: [255, 216]\n // JPEG\n },\n {\n mediaType: \"image/webp\",\n bytesPrefix: [\n 82,\n 73,\n 70,\n 70,\n // \"RIFF\"\n null,\n null,\n null,\n null,\n // file size (variable)\n 87,\n 69,\n 66,\n 80\n // \"WEBP\"\n ]\n },\n {\n mediaType: \"image/bmp\",\n bytesPrefix: [66, 77]\n },\n {\n mediaType: \"image/tiff\",\n bytesPrefix: [73, 73, 42, 0]\n },\n {\n mediaType: \"image/tiff\",\n bytesPrefix: [77, 77, 0, 42]\n },\n {\n mediaType: \"image/avif\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 32,\n 102,\n 116,\n 121,\n 112,\n 97,\n 118,\n 105,\n 102\n ]\n },\n {\n mediaType: \"image/heic\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 32,\n 102,\n 116,\n 121,\n 112,\n 104,\n 101,\n 105,\n 99\n ]\n }\n];\nvar documentMediaTypeSignatures = [\n {\n mediaType: \"application/pdf\",\n bytesPrefix: [37, 80, 68, 70]\n // %PDF\n }\n];\nvar audioMediaTypeSignatures = [\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 251]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 250]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 243]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 242]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 227]\n },\n {\n mediaType: \"audio/mpeg\",\n bytesPrefix: [255, 226]\n },\n {\n mediaType: \"audio/wav\",\n bytesPrefix: [\n 82,\n // R\n 73,\n // I\n 70,\n // F\n 70,\n // F\n null,\n null,\n null,\n null,\n 87,\n // W\n 65,\n // A\n 86,\n // V\n 69\n // E\n ]\n },\n {\n mediaType: \"audio/ogg\",\n bytesPrefix: [79, 103, 103, 83]\n },\n {\n mediaType: \"audio/flac\",\n bytesPrefix: [102, 76, 97, 67]\n },\n {\n mediaType: \"audio/aac\",\n bytesPrefix: [64, 21, 0, 0]\n },\n {\n mediaType: \"audio/mp4\",\n bytesPrefix: [102, 116, 121, 112]\n },\n {\n mediaType: \"audio/webm\",\n bytesPrefix: [26, 69, 223, 163]\n }\n];\nvar videoMediaTypeSignatures = [\n {\n mediaType: \"video/mp4\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n null,\n 102,\n 116,\n 121,\n 112\n // ftyp\n ]\n },\n {\n mediaType: \"video/webm\",\n bytesPrefix: [26, 69, 223, 163]\n // EBML\n },\n {\n mediaType: \"video/quicktime\",\n bytesPrefix: [\n 0,\n 0,\n 0,\n 20,\n 102,\n 116,\n 121,\n 112,\n 113,\n 116\n // ftypqt\n ]\n },\n {\n mediaType: \"video/x-msvideo\",\n bytesPrefix: [82, 73, 70, 70]\n // RIFF (AVI)\n }\n];\nvar stripID3 = (data) => {\n const bytes = typeof data === \"string\" ? convertBase64ToUint8Array(data) : data;\n const id3Size = (bytes[6] & 127) << 21 | (bytes[7] & 127) << 14 | (bytes[8] & 127) << 7 | bytes[9] & 127;\n return bytes.slice(id3Size + 10);\n};\nfunction stripID3TagsIfPresent(data) {\n const hasId3 = typeof data === \"string\" && data.startsWith(\"SUQz\") || typeof data !== \"string\" && data.length > 10 && data[0] === 73 && // 'I'\n data[1] === 68 && // 'D'\n data[2] === 51;\n return hasId3 ? stripID3(data) : data;\n}\nfunction detectMediaTypeBySignatures({\n data,\n signatures\n}) {\n const processedData = stripID3TagsIfPresent(data);\n const bytes = typeof processedData === \"string\" ? convertBase64ToUint8Array(\n processedData.substring(0, Math.min(processedData.length, 24))\n ) : processedData;\n for (const signature of signatures) {\n if (bytes.length >= signature.bytesPrefix.length && signature.bytesPrefix.every(\n (byte, index) => byte === null || bytes[index] === byte\n )) {\n return signature.mediaType;\n }\n }\n return void 0;\n}\nvar topLevelSignatureTables = {\n image: imageMediaTypeSignatures,\n audio: audioMediaTypeSignatures,\n video: videoMediaTypeSignatures,\n application: documentMediaTypeSignatures\n};\nfunction detectMediaType({\n data,\n topLevelType\n}) {\n if (topLevelType === void 0) {\n return detectMediaTypeBySignatures({\n data,\n signatures: [\n ...imageMediaTypeSignatures,\n ...documentMediaTypeSignatures,\n ...audioMediaTypeSignatures,\n ...videoMediaTypeSignatures\n ]\n });\n }\n const signatures = topLevelSignatureTables[topLevelType];\n if (signatures === void 0) {\n return void 0;\n }\n return detectMediaTypeBySignatures({ data, signatures });\n}\nfunction getTopLevelMediaType(mediaType) {\n const slashIndex = mediaType.indexOf(\"/\");\n return slashIndex === -1 ? mediaType : mediaType.substring(0, slashIndex);\n}\nfunction isFullMediaType(mediaType) {\n const slashIndex = mediaType.indexOf(\"/\");\n if (slashIndex === -1) {\n return false;\n }\n const subtype = mediaType.substring(slashIndex + 1);\n return subtype.length > 0 && subtype !== \"*\";\n}\n\n// src/cancel-response-body.ts\nasync function cancelResponseBody(response) {\n var _a2;\n try {\n await ((_a2 = response.body) == null ? void 0 : _a2.cancel());\n } catch (e) {\n }\n}\n\n// src/download-error.ts\nimport { AISDKError } from \"@ai-sdk/provider\";\nvar name = \"AI_DownloadError\";\nvar marker = `vercel.ai.error.${name}`;\nvar symbol = Symbol.for(marker);\nvar _a, _b;\nvar DownloadError = class extends (_b = AISDKError, _a = symbol, _b) {\n constructor({\n url,\n statusCode,\n statusText,\n cause,\n message = cause == null ? `Failed to download ${url}: ${statusCode} ${statusText}` : `Failed to download ${url}: ${cause}`\n }) {\n super({ name, message, cause });\n this[_a] = true;\n this.url = url;\n this.statusCode = statusCode;\n this.statusText = statusText;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker);\n }\n};\n\n// src/is-browser-runtime.ts\nfunction isBrowserRuntime(globalThisAny = globalThis) {\n return globalThisAny.window != null;\n}\n\n// src/is-same-origin.ts\nfunction isSameOrigin(url, baseUrl) {\n try {\n return new URL(url).origin === new URL(baseUrl).origin;\n } catch (e) {\n return false;\n }\n}\n\n// src/sanitize-request-headers.ts\nvar BLOCKED_REQUEST_HEADERS = [\n // Hop-by-hop / transport (RFC 7230 §6.1)\n \"connection\",\n \"keep-alive\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\",\n // Host / virtual-host routing\n \"host\",\n // Proxy / origin spoofing\n \"forwarded\",\n \"proxy-authorization\",\n \"via\",\n \"x-forwarded-for\",\n \"x-forwarded-host\",\n \"x-forwarded-proto\",\n \"x-real-ip\",\n // Cloud metadata (GCP, AWS IMDSv1/v2, Azure, Alibaba, DigitalOcean)\n \"metadata\",\n \"metadata-flavor\",\n \"x-aws-ec2-metadata-token\",\n \"x-metadata-token\",\n // Session / cookie\n \"cookie\",\n \"set-cookie\"\n];\nfunction sanitizeRequestHeaders(input) {\n const headers = new Headers(input);\n for (const name2 of BLOCKED_REQUEST_HEADERS) {\n headers.delete(name2);\n }\n return headers;\n}\n\n// src/validate-download-url.ts\nfunction validateDownloadUrl(url) {\n let parsed;\n try {\n parsed = new URL(url);\n } catch (e) {\n throw new DownloadError({\n url,\n message: `Invalid URL: ${url}`\n });\n }\n if (parsed.protocol === \"data:\") {\n return;\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new DownloadError({\n url,\n message: `URL scheme must be http, https, or data, got ${parsed.protocol}`\n });\n }\n const hostname = parsed.hostname.toLowerCase().replace(/\\.+$/, \"\");\n if (!hostname) {\n throw new DownloadError({\n url,\n message: `URL must have a hostname`\n });\n }\n if (hostname === \"localhost\" || hostname.endsWith(\".local\") || hostname.endsWith(\".localhost\")) {\n throw new DownloadError({\n url,\n message: `URL with hostname ${hostname} is not allowed`\n });\n }\n if (hostname.startsWith(\"[\") && hostname.endsWith(\"]\")) {\n const ipv6 = hostname.slice(1, -1);\n if (isPrivateIPv6(ipv6)) {\n throw new DownloadError({\n url,\n message: `URL with IPv6 address ${hostname} is not allowed`\n });\n }\n return;\n }\n if (isIPv4(hostname)) {\n if (isPrivateIPv4(hostname)) {\n throw new DownloadError({\n url,\n message: `URL with IP address ${hostname} is not allowed`\n });\n }\n return;\n }\n}\nfunction isIPv4(hostname) {\n const parts = hostname.split(\".\");\n if (parts.length !== 4) return false;\n return parts.every((part) => {\n const num = Number(part);\n return Number.isInteger(num) && num >= 0 && num <= 255 && String(num) === part;\n });\n}\nfunction isPrivateIPv4(ip) {\n const parts = ip.split(\".\").map(Number);\n const [a, b, c] = parts;\n if (a === 0) return true;\n if (a === 10) return true;\n if (a === 100 && b >= 64 && b <= 127) return true;\n if (a === 127) return true;\n if (a === 169 && b === 254) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 0 && c === 0) return true;\n if (a === 192 && b === 0 && c === 2) return true;\n if (a === 192 && b === 168) return true;\n if (a === 198 && (b === 18 || b === 19)) return true;\n if (a === 198 && b === 51 && c === 100) return true;\n if (a === 203 && b === 0 && c === 113) return true;\n if (a >= 224) return true;\n return false;\n}\nfunction parseIPv6(ip) {\n let address = ip.toLowerCase();\n const zoneIndex = address.indexOf(\"%\");\n if (zoneIndex !== -1) {\n address = address.slice(0, zoneIndex);\n }\n const halves = address.split(\"::\");\n if (halves.length > 2) return null;\n const toGroups = (segment) => {\n if (segment === \"\") return [];\n const groups = [];\n const parts = segment.split(\":\");\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part.includes(\".\")) {\n if (i !== parts.length - 1 || !isIPv4(part)) return null;\n const [a, b, c, d] = part.split(\".\").map(Number);\n groups.push(a << 8 | b, c << 8 | d);\n continue;\n }\n if (!/^[0-9a-f]{1,4}$/.test(part)) return null;\n groups.push(parseInt(part, 16));\n }\n return groups;\n };\n const head = toGroups(halves[0]);\n if (head === null) return null;\n if (halves.length === 2) {\n const tail = toGroups(halves[1]);\n if (tail === null) return null;\n const fill = 8 - head.length - tail.length;\n if (fill < 0) return null;\n return [...head, ...new Array(fill).fill(0), ...tail];\n }\n return head.length === 8 ? head : null;\n}\nfunction isPrivateIPv6(ip) {\n const groups = parseIPv6(ip);\n if (groups === null) return true;\n const topZero = (count) => groups.slice(0, count).every((group) => group === 0);\n if (topZero(7) && (groups[7] === 0 || groups[7] === 1)) return true;\n if ((groups[0] & 65024) === 64512) return true;\n if ((groups[0] & 65472) === 65152) return true;\n if ((groups[0] & 65472) === 65216) return true;\n if ((groups[0] & 65280) === 65280) return true;\n if (groups[0] === 8193 && groups[1] === 3512) return true;\n if (groups[0] === 16383 && (groups[1] & 61440) === 0) return true;\n const embedsIPv4 = (\n // ::/96 — IPv4-compatible (deprecated)\n topZero(6) || // ::ffff:0:0/96 — IPv4-mapped (ffff in group 5)\n topZero(5) && groups[5] === 65535 || // ::ffff:0:0/96 — IPv4-translated form (ffff in group 4, group 5 zero)\n topZero(4) && groups[4] === 65535 && groups[5] === 0 || // 64:ff9b::/96 — NAT64 well-known prefix\n groups[0] === 100 && groups[1] === 65435 && groups[2] === 0 && groups[3] === 0 && groups[4] === 0 && groups[5] === 0 || // 64:ff9b:1::/48 — NAT64 local-use prefix\n groups[0] === 100 && groups[1] === 65435 && groups[2] === 1\n );\n if (embedsIPv4) {\n const a = groups[6] >> 8 & 255;\n const b = groups[6] & 255;\n const c = groups[7] >> 8 & 255;\n const d = groups[7] & 255;\n return isPrivateIPv4(`${a}.${b}.${c}.${d}`);\n }\n return false;\n}\n\n// src/fetch-with-validated-redirects.ts\nvar MAX_DOWNLOAD_REDIRECTS = 10;\nvar REDIRECT_STATUS_CODES = /* @__PURE__ */ new Set([301, 302, 303, 307, 308]);\nasync function fetchWithValidatedRedirects({\n url,\n headers,\n abortSignal,\n maxRedirects = MAX_DOWNLOAD_REDIRECTS,\n fetch = globalThis.fetch,\n trustedOrigin\n}) {\n let currentHeaders = headers === void 0 ? void 0 : sanitizeRequestHeaders(headers);\n const perHopInit = (redirect) => {\n const init = { signal: abortSignal, redirect };\n if (currentHeaders !== void 0) {\n init.headers = new Headers(currentHeaders);\n }\n return init;\n };\n let currentUrl = url;\n for (let redirectCount = 0; redirectCount <= maxRedirects; redirectCount++) {\n if (trustedOrigin === void 0 || !isSameOrigin(currentUrl, trustedOrigin)) {\n validateDownloadUrl(currentUrl);\n }\n const response = await fetch(currentUrl, perHopInit(\"manual\"));\n if (response.type === \"opaqueredirect\") {\n if (!isBrowserRuntime()) {\n throw new DownloadError({\n url,\n message: `Redirect from ${currentUrl} could not be validated and was blocked`\n });\n }\n return await fetch(currentUrl, perHopInit(\"follow\"));\n }\n const location = response.headers.get(\"location\");\n if (REDIRECT_STATUS_CODES.has(response.status) && location) {\n await cancelResponseBody(response);\n const nextUrl = new URL(location, currentUrl).toString();\n if (currentHeaders !== void 0 && !isSameOrigin(nextUrl, currentUrl)) {\n const userAgent = currentHeaders.get(\"user-agent\");\n currentHeaders = new Headers(\n userAgent == null ? void 0 : { \"user-agent\": userAgent }\n );\n }\n currentUrl = nextUrl;\n continue;\n }\n return response;\n }\n throw new DownloadError({\n url,\n message: `Too many redirects (max ${maxRedirects})`\n });\n}\n\n// src/read-response-with-size-limit.ts\nvar DEFAULT_MAX_DOWNLOAD_SIZE = 2 * 1024 * 1024 * 1024;\nasync function readResponseWithSizeLimit({\n response,\n url,\n maxBytes = DEFAULT_MAX_DOWNLOAD_SIZE\n}) {\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength != null) {\n const length = parseInt(contentLength, 10);\n if (!isNaN(length) && length > maxBytes) {\n await cancelResponseBody(response);\n throw new DownloadError({\n url,\n message: `Download of ${url} exceeded maximum size of ${maxBytes} bytes (Content-Length: ${length}).`\n });\n }\n }\n const body = response.body;\n if (body == null) {\n return new Uint8Array(0);\n }\n const reader = body.getReader();\n const chunks = [];\n let totalBytes = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n totalBytes += value.length;\n if (totalBytes > maxBytes) {\n throw new DownloadError({\n url,\n message: `Download of ${url} exceeded maximum size of ${maxBytes} bytes.`\n });\n }\n chunks.push(value);\n }\n } finally {\n try {\n await reader.cancel();\n } finally {\n reader.releaseLock();\n }\n }\n const result = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n}\n\n// src/download-blob.ts\nasync function downloadBlob(url, options) {\n var _a2, _b2;\n try {\n const response = await fetchWithValidatedRedirects({\n url,\n abortSignal: options == null ? void 0 : options.abortSignal\n });\n if (!response.ok) {\n await cancelResponseBody(response);\n throw new DownloadError({\n url,\n statusCode: response.status,\n statusText: response.statusText\n });\n }\n const data = await readResponseWithSizeLimit({\n response,\n url,\n maxBytes: (_a2 = options == null ? void 0 : options.maxBytes) != null ? _a2 : DEFAULT_MAX_DOWNLOAD_SIZE\n });\n const contentType = (_b2 = response.headers.get(\"content-type\")) != null ? _b2 : void 0;\n return new Blob([data], contentType ? { type: contentType } : void 0);\n } catch (error) {\n if (DownloadError.isInstance(error)) {\n throw error;\n }\n throw new DownloadError({ url, cause: error });\n }\n}\n\n// src/extract-lines.ts\nfunction extractLines({\n text,\n startLine,\n endLine\n}) {\n if (startLine == null && endLine == null) return text;\n const lineEnding = text.includes(\"\\r\\n\") ? \"\\r\\n\" : text.includes(\"\\n\") ? \"\\n\" : text.includes(\"\\r\") ? \"\\r\" : \"\\n\";\n const lines = text.split(lineEnding);\n const start = Math.max(1, startLine != null ? startLine : 1) - 1;\n const end = Math.min(lines.length, endLine != null ? endLine : lines.length);\n return lines.slice(start, end).join(lineEnding);\n}\n\n// src/extract-response-headers.ts\nfunction extractResponseHeaders(response) {\n return Object.fromEntries([...response.headers]);\n}\n\n// src/filter-nullable.ts\nfunction filterNullable(...values) {\n return values.filter((value) => value != null);\n}\n\n// src/generate-id.ts\nimport { InvalidArgumentError } from \"@ai-sdk/provider\";\nvar createIdGenerator = ({\n prefix,\n size = 16,\n alphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n separator = \"-\"\n} = {}) => {\n const generator = () => {\n const alphabetLength = alphabet.length;\n const chars = new Array(size);\n for (let i = 0; i < size; i++) {\n chars[i] = alphabet[Math.random() * alphabetLength | 0];\n }\n return chars.join(\"\");\n };\n if (prefix == null) {\n return generator;\n }\n if (alphabet.includes(separator)) {\n throw new InvalidArgumentError({\n argument: \"separator\",\n message: `The separator \"${separator}\" must not be part of the alphabet \"${alphabet}\".`\n });\n }\n return () => `${prefix}${separator}${generator()}`;\n};\nvar generateId = createIdGenerator();\n\n// src/get-error-message.ts\nimport { getErrorMessage } from \"@ai-sdk/provider\";\n\n// src/get-from-api.ts\nimport { APICallError as APICallError2 } from \"@ai-sdk/provider\";\n\n// src/handle-fetch-error.ts\nimport { APICallError } from \"@ai-sdk/provider\";\n\n// src/is-abort-error.ts\nfunction isAbortError(error) {\n return (error instanceof Error || error instanceof DOMException) && (error.name === \"AbortError\" || error.name === \"ResponseAborted\" || // Next.js\n error.name === \"TimeoutError\");\n}\n\n// src/handle-fetch-error.ts\nvar FETCH_FAILED_ERROR_MESSAGES = [\"fetch failed\", \"failed to fetch\"];\nvar BUN_ERROR_CODES = [\n \"ConnectionRefused\",\n \"ConnectionClosed\",\n \"FailedToOpenSocket\",\n \"ECONNRESET\",\n \"ECONNREFUSED\",\n \"ETIMEDOUT\",\n \"EPIPE\"\n];\nfunction isBunNetworkError(error) {\n if (!(error instanceof Error)) {\n return false;\n }\n const code = error.code;\n if (typeof code === \"string\" && BUN_ERROR_CODES.includes(code)) {\n return true;\n }\n return false;\n}\nfunction handleFetchError({\n error,\n url,\n requestBodyValues\n}) {\n if (isAbortError(error)) {\n return error;\n }\n if (error instanceof TypeError && FETCH_FAILED_ERROR_MESSAGES.includes(error.message.toLowerCase())) {\n const cause = error.cause;\n if (cause != null) {\n return new APICallError({\n message: `Cannot connect to API: ${cause.message}`,\n cause,\n url,\n requestBodyValues,\n isRetryable: true\n // retry when network error\n });\n }\n }\n if (isBunNetworkError(error)) {\n return new APICallError({\n message: `Cannot connect to API: ${error.message}`,\n cause: error,\n url,\n requestBodyValues,\n isRetryable: true\n });\n }\n return error;\n}\n\n// src/get-runtime-environment-user-agent.ts\nfunction getRuntimeEnvironmentUserAgent(globalThisAny = globalThis) {\n var _a2, _b2, _c;\n if (globalThisAny.window) {\n return `runtime/browser`;\n }\n if ((_a2 = globalThisAny.navigator) == null ? void 0 : _a2.userAgent) {\n return `runtime/${globalThisAny.navigator.userAgent.toLowerCase()}`;\n }\n if ((_c = (_b2 = globalThisAny.process) == null ? void 0 : _b2.versions) == null ? void 0 : _c.node) {\n return `runtime/node.js/${globalThisAny.process.version.substring(0)}`;\n }\n if (globalThisAny.EdgeRuntime) {\n return `runtime/vercel-edge`;\n }\n return \"runtime/unknown\";\n}\n\n// src/normalize-headers.ts\nfunction normalizeHeaders(headers) {\n if (headers == null) {\n return {};\n }\n const normalized = {};\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n normalized[key.toLowerCase()] = value;\n });\n } else {\n if (!Array.isArray(headers)) {\n headers = Object.entries(headers);\n }\n for (const [key, value] of headers) {\n if (value != null) {\n normalized[key.toLowerCase()] = value;\n }\n }\n }\n return normalized;\n}\n\n// src/with-user-agent-suffix.ts\nfunction withUserAgentSuffix(headers, ...userAgentSuffixParts) {\n const normalizedHeaders = new Headers(normalizeHeaders(headers));\n const currentUserAgentHeader = normalizedHeaders.get(\"user-agent\") || \"\";\n normalizedHeaders.set(\n \"user-agent\",\n [currentUserAgentHeader, ...userAgentSuffixParts].filter(Boolean).join(\" \")\n );\n return Object.fromEntries(normalizedHeaders.entries());\n}\n\n// src/version.ts\nvar VERSION = true ? \"5.0.11\" : \"0.0.0-test\";\n\n// src/get-from-api.ts\nvar getOriginalFetch = () => globalThis.fetch;\nvar getFromApi = async ({\n url,\n headers = {},\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch = getOriginalFetch(),\n validateUrl,\n credentialedOrigin,\n trustedOrigin\n}) => {\n try {\n const outgoingHeaders = credentialedOrigin !== void 0 && !isSameOrigin(url, credentialedOrigin) ? {} : headers;\n const requestHeaders = withUserAgentSuffix(\n outgoingHeaders,\n `ai-sdk/provider-utils/${VERSION}`,\n getRuntimeEnvironmentUserAgent()\n );\n const response = validateUrl ? await fetchWithValidatedRedirects({\n url,\n headers: requestHeaders,\n abortSignal,\n fetch,\n trustedOrigin\n }) : await fetch(url, {\n method: \"GET\",\n headers: requestHeaders,\n signal: abortSignal\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!response.ok) {\n let errorInformation;\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: {}\n });\n } catch (error) {\n if (isAbortError(error) || APICallError2.isInstance(error)) {\n throw error;\n }\n throw new APICallError2({\n message: \"Failed to process error response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {}\n });\n }\n throw errorInformation.value;\n }\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: {}\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || APICallError2.isInstance(error)) {\n throw error;\n }\n }\n throw new APICallError2({\n message: \"Failed to process successful response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {}\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: {} });\n }\n};\n\n// src/inject-json-instruction.ts\nvar DEFAULT_SCHEMA_PREFIX = \"JSON schema:\";\nvar DEFAULT_SCHEMA_SUFFIX = \"You MUST answer with a JSON object that matches the JSON schema above.\";\nvar DEFAULT_GENERIC_SUFFIX = \"You MUST answer with JSON.\";\nfunction injectJsonInstruction({\n prompt,\n schema,\n schemaPrefix = schema != null ? DEFAULT_SCHEMA_PREFIX : void 0,\n schemaSuffix = schema != null ? DEFAULT_SCHEMA_SUFFIX : DEFAULT_GENERIC_SUFFIX\n}) {\n return [\n prompt != null && prompt.length > 0 ? prompt : void 0,\n prompt != null && prompt.length > 0 ? \"\" : void 0,\n // add a newline if prompt is not null\n schemaPrefix,\n schema != null ? JSON.stringify(schema) : void 0,\n schemaSuffix\n ].filter((line) => line != null).join(\"\\n\");\n}\nfunction injectJsonInstructionIntoMessages({\n messages,\n schema,\n schemaPrefix,\n schemaSuffix\n}) {\n var _a2, _b2;\n const systemMessage = ((_a2 = messages[0]) == null ? void 0 : _a2.role) === \"system\" ? { ...messages[0] } : { role: \"system\", content: \"\" };\n systemMessage.content = injectJsonInstruction({\n prompt: systemMessage.content,\n schema,\n schemaPrefix,\n schemaSuffix\n });\n return [\n systemMessage,\n ...((_b2 = messages[0]) == null ? void 0 : _b2.role) === \"system\" ? messages.slice(1) : messages\n ];\n}\n\n// src/is-buffer.ts\nfunction isBuffer(value) {\n var _a2, _b2;\n return (_b2 = (_a2 = globalThis.Buffer) == null ? void 0 : _a2.isBuffer(value)) != null ? _b2 : false;\n}\n\n// src/is-non-nullable.ts\nfunction isNonNullable(value) {\n return value != null;\n}\n\n// src/is-provider-reference.ts\nfunction isProviderReference(data) {\n return typeof data === \"object\" && data !== null && !(data instanceof Uint8Array) && !(data instanceof URL) && !(data instanceof ArrayBuffer) && !isBuffer(data) && !(\"type\" in data);\n}\n\n// src/is-url-supported.ts\nfunction isUrlSupported({\n mediaType,\n url,\n supportedUrls\n}) {\n url = url.toLowerCase();\n mediaType = mediaType.toLowerCase();\n const isTopLevelOnly = !mediaType.includes(\"/\");\n return Object.entries(supportedUrls).map(([key, value]) => {\n const mediaType2 = key.toLowerCase();\n return mediaType2 === \"*\" || mediaType2 === \"*/*\" ? { mediaTypePrefix: \"\", regexes: value } : { mediaTypePrefix: mediaType2.replace(/\\*/, \"\"), regexes: value };\n }).filter(({ mediaTypePrefix }) => {\n if (mediaTypePrefix === \"\") {\n return true;\n }\n if (isTopLevelOnly) {\n return `${mediaType}/` === mediaTypePrefix;\n }\n return mediaType.startsWith(mediaTypePrefix);\n }).flatMap(({ regexes }) => regexes).some((pattern) => pattern.test(url));\n}\n\n// src/load-api-key.ts\nimport { LoadAPIKeyError } from \"@ai-sdk/provider\";\nfunction loadApiKey({\n apiKey,\n environmentVariableName,\n apiKeyParameterName = \"apiKey\",\n description\n}) {\n if (typeof apiKey === \"string\") {\n return apiKey;\n }\n if (apiKey != null) {\n throw new LoadAPIKeyError({\n message: `${description} API key must be a string.`\n });\n }\n if (typeof process === \"undefined\") {\n throw new LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter. Environment variables are not supported in this environment.`\n });\n }\n apiKey = process.env[environmentVariableName];\n if (apiKey == null) {\n throw new LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter or the ${environmentVariableName} environment variable.`\n });\n }\n if (typeof apiKey !== \"string\") {\n throw new LoadAPIKeyError({\n message: `${description} API key must be a string. The value of the ${environmentVariableName} environment variable is not a string.`\n });\n }\n return apiKey;\n}\n\n// src/load-optional-setting.ts\nfunction loadOptionalSetting({\n settingValue,\n environmentVariableName\n}) {\n if (typeof settingValue === \"string\") {\n return settingValue;\n }\n if (settingValue != null || typeof process === \"undefined\") {\n return void 0;\n }\n settingValue = process.env[environmentVariableName];\n if (settingValue == null || typeof settingValue !== \"string\") {\n return void 0;\n }\n return settingValue;\n}\n\n// src/load-setting.ts\nimport { LoadSettingError } from \"@ai-sdk/provider\";\nfunction loadSetting({\n settingValue,\n environmentVariableName,\n settingName,\n description\n}) {\n if (typeof settingValue === \"string\") {\n return settingValue;\n }\n if (settingValue != null) {\n throw new LoadSettingError({\n message: `${description} setting must be a string.`\n });\n }\n if (typeof process === \"undefined\") {\n throw new LoadSettingError({\n message: `${description} setting is missing. Pass it using the '${settingName}' parameter. Environment variables are not supported in this environment.`\n });\n }\n settingValue = process.env[environmentVariableName];\n if (settingValue == null) {\n throw new LoadSettingError({\n message: `${description} setting is missing. Pass it using the '${settingName}' parameter or the ${environmentVariableName} environment variable.`\n });\n }\n if (typeof settingValue !== \"string\") {\n throw new LoadSettingError({\n message: `${description} setting must be a string. The value of the ${environmentVariableName} environment variable is not a string.`\n });\n }\n return settingValue;\n}\n\n// src/map-reasoning-to-provider.ts\nfunction isCustomReasoning(reasoning) {\n return reasoning !== void 0 && reasoning !== \"provider-default\";\n}\nfunction mapReasoningToProviderEffort({\n reasoning,\n effortMap,\n warnings\n}) {\n const mapped = effortMap[reasoning];\n if (mapped == null) {\n warnings.push({\n type: \"unsupported\",\n feature: \"reasoning\",\n details: `reasoning \"${reasoning}\" is not supported by this model.`\n });\n return void 0;\n }\n if (mapped !== reasoning) {\n warnings.push({\n type: \"compatibility\",\n feature: \"reasoning\",\n details: `reasoning \"${reasoning}\" is not directly supported by this model. mapped to effort \"${mapped}\".`\n });\n }\n return mapped;\n}\nvar DEFAULT_REASONING_BUDGET_PERCENTAGES = {\n minimal: 0.02,\n low: 0.1,\n medium: 0.3,\n high: 0.6,\n xhigh: 0.9\n};\nfunction mapReasoningToProviderBudget({\n reasoning,\n maxOutputTokens,\n maxReasoningBudget,\n minReasoningBudget = 1024,\n budgetPercentages = DEFAULT_REASONING_BUDGET_PERCENTAGES,\n warnings\n}) {\n const pct = budgetPercentages[reasoning];\n if (pct == null) {\n warnings.push({\n type: \"unsupported\",\n feature: \"reasoning\",\n details: `reasoning \"${reasoning}\" is not supported by this model.`\n });\n return void 0;\n }\n return Math.min(\n maxReasoningBudget,\n Math.max(minReasoningBudget, Math.round(maxOutputTokens * pct))\n );\n}\n\n// src/media-type-to-extension.ts\nfunction mediaTypeToExtension(mediaType) {\n var _a2;\n const [_type, subtype = \"\"] = mediaType.toLowerCase().split(\"/\");\n return (_a2 = {\n mpeg: \"mp3\",\n \"x-wav\": \"wav\",\n opus: \"ogg\",\n mp4: \"m4a\",\n \"x-m4a\": \"m4a\"\n }[subtype]) != null ? _a2 : subtype;\n}\n\n// src/parse-json.ts\nimport {\n JSONParseError,\n TypeValidationError as TypeValidationError3\n} from \"@ai-sdk/provider\";\n\n// src/secure-json-parse.ts\nvar suspectProtoRx = /\"(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])(?:p|\\\\u0070)(?:r|\\\\u0072)(?:o|\\\\u006[Ff])(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])\"\\s*:/;\nvar suspectConstructorRx = /\"(?:c|\\\\u0063)(?:o|\\\\u006[Ff])(?:n|\\\\u006[Ee])(?:s|\\\\u0073)(?:t|\\\\u0074)(?:r|\\\\u0072)(?:u|\\\\u0075)(?:c|\\\\u0063)(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:r|\\\\u0072)\"\\s*:/;\nfunction _parse(text) {\n const obj = JSON.parse(text);\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (suspectProtoRx.test(text) === false && suspectConstructorRx.test(text) === false) {\n return obj;\n }\n return filter(obj);\n}\nfunction filter(obj) {\n let next = [obj];\n while (next.length) {\n const nodes = next;\n next = [];\n for (const node of nodes) {\n if (Object.prototype.hasOwnProperty.call(node, \"__proto__\")) {\n throw new SyntaxError(\"Object contains forbidden prototype property\");\n }\n if (Object.prototype.hasOwnProperty.call(node, \"constructor\") && node.constructor !== null && typeof node.constructor === \"object\" && Object.prototype.hasOwnProperty.call(node.constructor, \"prototype\")) {\n throw new SyntaxError(\"Object contains forbidden prototype property\");\n }\n for (const key in node) {\n const value = node[key];\n if (value && typeof value === \"object\") {\n next.push(value);\n }\n }\n }\n }\n return obj;\n}\nfunction secureJsonParse(text) {\n const { stackTraceLimit } = Error;\n try {\n Error.stackTraceLimit = 0;\n } catch (e) {\n return _parse(text);\n }\n try {\n return _parse(text);\n } finally {\n Error.stackTraceLimit = stackTraceLimit;\n }\n}\n\n// src/validate-types.ts\nimport {\n TypeValidationError as TypeValidationError2\n} from \"@ai-sdk/provider\";\n\n// src/schema.ts\nimport { TypeValidationError } from \"@ai-sdk/provider\";\nimport * as z4 from \"zod/v4\";\n\n// src/add-additional-properties-to-json-schema.ts\nfunction addAdditionalPropertiesToJsonSchema(jsonSchema2) {\n if (jsonSchema2.type === \"object\" || Array.isArray(jsonSchema2.type) && jsonSchema2.type.includes(\"object\")) {\n jsonSchema2.additionalProperties = false;\n const { properties } = jsonSchema2;\n if (properties != null) {\n for (const key of Object.keys(properties)) {\n properties[key] = visit(properties[key]);\n }\n }\n }\n if (jsonSchema2.items != null) {\n jsonSchema2.items = Array.isArray(jsonSchema2.items) ? jsonSchema2.items.map(visit) : visit(jsonSchema2.items);\n }\n if (jsonSchema2.anyOf != null) {\n jsonSchema2.anyOf = jsonSchema2.anyOf.map(visit);\n }\n if (jsonSchema2.allOf != null) {\n jsonSchema2.allOf = jsonSchema2.allOf.map(visit);\n }\n if (jsonSchema2.oneOf != null) {\n jsonSchema2.oneOf = jsonSchema2.oneOf.map(visit);\n }\n const { definitions } = jsonSchema2;\n if (definitions != null) {\n for (const key of Object.keys(definitions)) {\n definitions[key] = visit(definitions[key]);\n }\n }\n return jsonSchema2;\n}\nfunction visit(def) {\n if (typeof def === \"boolean\") return def;\n return addAdditionalPropertiesToJsonSchema(def);\n}\n\n// src/to-json-schema/zod3-to-json-schema/options.ts\nvar ignoreOverride = /* @__PURE__ */ Symbol(\n \"Let zodToJsonSchema decide on which parser to use\"\n);\nvar defaultOptions = {\n name: void 0,\n $refStrategy: \"root\",\n basePath: [\"#\"],\n effectStrategy: \"input\",\n pipeStrategy: \"all\",\n dateStrategy: \"format:date-time\",\n mapStrategy: \"entries\",\n removeAdditionalStrategy: \"passthrough\",\n allowedAdditionalProperties: true,\n rejectedAdditionalProperties: false,\n definitionPath: \"definitions\",\n strictUnions: false,\n definitions: {},\n errorMessages: false,\n patternStrategy: \"escape\",\n applyRegexFlags: false,\n emailStrategy: \"format:email\",\n base64Strategy: \"contentEncoding:base64\",\n nameStrategy: \"ref\"\n};\nvar getDefaultOptions = (options) => typeof options === \"string\" ? {\n ...defaultOptions,\n name: options\n} : {\n ...defaultOptions,\n ...options\n};\n\n// src/to-json-schema/zod3-to-json-schema/select-parser.ts\nimport { ZodFirstPartyTypeKind as ZodFirstPartyTypeKind3 } from \"zod/v3\";\n\n// src/to-json-schema/zod3-to-json-schema/parsers/any.ts\nfunction parseAnyDef() {\n return {};\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/array.ts\nimport { ZodFirstPartyTypeKind } from \"zod/v3\";\nfunction parseArrayDef(def, refs) {\n var _a2, _b2, _c;\n const res = {\n type: \"array\"\n };\n if (((_a2 = def.type) == null ? void 0 : _a2._def) && ((_c = (_b2 = def.type) == null ? void 0 : _b2._def) == null ? void 0 : _c.typeName) !== ZodFirstPartyTypeKind.ZodAny) {\n res.items = parseDef(def.type._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\"]\n });\n }\n if (def.minLength) {\n res.minItems = def.minLength.value;\n }\n if (def.maxLength) {\n res.maxItems = def.maxLength.value;\n }\n if (def.exactLength) {\n res.minItems = def.exactLength.value;\n res.maxItems = def.exactLength.value;\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/bigint.ts\nfunction parseBigintDef(def) {\n const res = {\n type: \"integer\",\n format: \"int64\"\n };\n if (!def.checks) return res;\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n if (check.inclusive) {\n res.minimum = check.value;\n } else {\n res.exclusiveMinimum = check.value;\n }\n break;\n case \"max\":\n if (check.inclusive) {\n res.maximum = check.value;\n } else {\n res.exclusiveMaximum = check.value;\n }\n break;\n case \"multipleOf\":\n res.multipleOf = check.value;\n break;\n }\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/boolean.ts\nfunction parseBooleanDef() {\n return { type: \"boolean\" };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/branded.ts\nfunction parseBrandedDef(_def, refs) {\n return parseDef(_def.type._def, refs);\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/catch.ts\nvar parseCatchDef = (def, refs) => {\n return parseDef(def.innerType._def, refs);\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/date.ts\nfunction parseDateDef(def, refs, overrideDateStrategy) {\n const strategy = overrideDateStrategy != null ? overrideDateStrategy : refs.dateStrategy;\n if (Array.isArray(strategy)) {\n return {\n anyOf: strategy.map((item) => parseDateDef(def, refs, item))\n };\n }\n switch (strategy) {\n case \"string\":\n case \"format:date-time\":\n return {\n type: \"string\",\n format: \"date-time\"\n };\n case \"format:date\":\n return {\n type: \"string\",\n format: \"date\"\n };\n case \"integer\":\n return integerDateParser(def);\n }\n}\nvar integerDateParser = (def) => {\n const res = {\n type: \"integer\",\n format: \"unix-time\"\n };\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n res.minimum = check.value;\n break;\n case \"max\":\n res.maximum = check.value;\n break;\n }\n }\n return res;\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/default.ts\nfunction parseDefaultDef(_def, refs) {\n return {\n ...parseDef(_def.innerType._def, refs),\n default: _def.defaultValue()\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/effects.ts\nfunction parseEffectsDef(_def, refs) {\n return refs.effectStrategy === \"input\" ? parseDef(_def.schema._def, refs) : parseAnyDef();\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/enum.ts\nfunction parseEnumDef(def) {\n return {\n type: \"string\",\n enum: Array.from(def.values)\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/intersection.ts\nvar isJsonSchema7AllOfType = (type) => {\n if (\"type\" in type && type.type === \"string\") return false;\n return \"allOf\" in type;\n};\nfunction parseIntersectionDef(def, refs) {\n const allOf = [\n parseDef(def.left._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"0\"]\n }),\n parseDef(def.right._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"1\"]\n })\n ].filter((x) => !!x);\n const mergedAllOf = [];\n allOf.forEach((schema) => {\n if (isJsonSchema7AllOfType(schema)) {\n mergedAllOf.push(...schema.allOf);\n } else {\n let nestedSchema = schema;\n if (\"additionalProperties\" in schema && schema.additionalProperties === false) {\n const { additionalProperties: _additionalProperties, ...rest } = schema;\n nestedSchema = rest;\n }\n mergedAllOf.push(nestedSchema);\n }\n });\n return mergedAllOf.length ? { allOf: mergedAllOf } : void 0;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/literal.ts\nfunction parseLiteralDef(def) {\n const parsedType = typeof def.value;\n if (parsedType !== \"bigint\" && parsedType !== \"number\" && parsedType !== \"boolean\" && parsedType !== \"string\") {\n return {\n type: Array.isArray(def.value) ? \"array\" : \"object\"\n };\n }\n return {\n type: parsedType === \"bigint\" ? \"integer\" : parsedType,\n const: def.value\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/record.ts\nimport {\n ZodFirstPartyTypeKind as ZodFirstPartyTypeKind2\n} from \"zod/v3\";\n\n// src/to-json-schema/zod3-to-json-schema/parsers/string.ts\nvar emojiRegex = void 0;\nvar zodPatterns = {\n /**\n * `c` was changed to `[cC]` to replicate /i flag\n */\n cuid: /^[cC][^\\s-]{8,}$/,\n cuid2: /^[0-9a-z]+$/,\n ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,\n /**\n * `a-z` was added to replicate /i flag\n */\n email: /^(?!\\.)(?!.*\\.\\.)([a-zA-Z0-9_'+\\-\\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\\-]*\\.)+[a-zA-Z]{2,}$/,\n /**\n * Constructed a valid Unicode RegExp\n *\n * Lazily instantiate since this type of regex isn't supported\n * in all envs (e.g. React Native).\n *\n * See:\n * https://github.com/colinhacks/zod/issues/2433\n * Fix in Zod:\n * https://github.com/colinhacks/zod/commit/9340fd51e48576a75adc919bff65dbc4a5d4c99b\n */\n emoji: () => {\n if (emojiRegex === void 0) {\n emojiRegex = RegExp(\n \"^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$\",\n \"u\"\n );\n }\n return emojiRegex;\n },\n /**\n * Unused\n */\n uuid: /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/,\n /**\n * Unused\n */\n ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,\n ipv4Cidr: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/,\n /**\n * Unused\n */\n ipv6: /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,\n ipv6Cidr: /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,\n base64: /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,\n base64url: /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,\n nanoid: /^[a-zA-Z0-9_-]{21}$/,\n jwt: /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/\n};\nfunction parseStringDef(def, refs) {\n const res = {\n type: \"string\"\n };\n if (def.checks) {\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n res.minLength = typeof res.minLength === \"number\" ? Math.max(res.minLength, check.value) : check.value;\n break;\n case \"max\":\n res.maxLength = typeof res.maxLength === \"number\" ? Math.min(res.maxLength, check.value) : check.value;\n break;\n case \"email\":\n switch (refs.emailStrategy) {\n case \"format:email\":\n addFormat(res, \"email\", check.message, refs);\n break;\n case \"format:idn-email\":\n addFormat(res, \"idn-email\", check.message, refs);\n break;\n case \"pattern:zod\":\n addPattern(res, zodPatterns.email, check.message, refs);\n break;\n }\n break;\n case \"url\":\n addFormat(res, \"uri\", check.message, refs);\n break;\n case \"uuid\":\n addFormat(res, \"uuid\", check.message, refs);\n break;\n case \"regex\":\n addPattern(res, check.regex, check.message, refs);\n break;\n case \"cuid\":\n addPattern(res, zodPatterns.cuid, check.message, refs);\n break;\n case \"cuid2\":\n addPattern(res, zodPatterns.cuid2, check.message, refs);\n break;\n case \"startsWith\":\n addPattern(\n res,\n RegExp(`^${escapeLiteralCheckValue(check.value, refs)}`),\n check.message,\n refs\n );\n break;\n case \"endsWith\":\n addPattern(\n res,\n RegExp(`${escapeLiteralCheckValue(check.value, refs)}$`),\n check.message,\n refs\n );\n break;\n case \"datetime\":\n addFormat(res, \"date-time\", check.message, refs);\n break;\n case \"date\":\n addFormat(res, \"date\", check.message, refs);\n break;\n case \"time\":\n addFormat(res, \"time\", check.message, refs);\n break;\n case \"duration\":\n addFormat(res, \"duration\", check.message, refs);\n break;\n case \"length\":\n res.minLength = typeof res.minLength === \"number\" ? Math.max(res.minLength, check.value) : check.value;\n res.maxLength = typeof res.maxLength === \"number\" ? Math.min(res.maxLength, check.value) : check.value;\n break;\n case \"includes\": {\n addPattern(\n res,\n RegExp(escapeLiteralCheckValue(check.value, refs)),\n check.message,\n refs\n );\n break;\n }\n case \"ip\": {\n if (check.version !== \"v6\") {\n addFormat(res, \"ipv4\", check.message, refs);\n }\n if (check.version !== \"v4\") {\n addFormat(res, \"ipv6\", check.message, refs);\n }\n break;\n }\n case \"base64url\":\n addPattern(res, zodPatterns.base64url, check.message, refs);\n break;\n case \"jwt\":\n addPattern(res, zodPatterns.jwt, check.message, refs);\n break;\n case \"cidr\": {\n if (check.version !== \"v6\") {\n addPattern(res, zodPatterns.ipv4Cidr, check.message, refs);\n }\n if (check.version !== \"v4\") {\n addPattern(res, zodPatterns.ipv6Cidr, check.message, refs);\n }\n break;\n }\n case \"emoji\":\n addPattern(res, zodPatterns.emoji(), check.message, refs);\n break;\n case \"ulid\": {\n addPattern(res, zodPatterns.ulid, check.message, refs);\n break;\n }\n case \"base64\": {\n switch (refs.base64Strategy) {\n case \"format:binary\": {\n addFormat(res, \"binary\", check.message, refs);\n break;\n }\n case \"contentEncoding:base64\": {\n res.contentEncoding = \"base64\";\n break;\n }\n case \"pattern:zod\": {\n addPattern(res, zodPatterns.base64, check.message, refs);\n break;\n }\n }\n break;\n }\n case \"nanoid\": {\n addPattern(res, zodPatterns.nanoid, check.message, refs);\n }\n case \"toLowerCase\":\n case \"toUpperCase\":\n case \"trim\":\n break;\n default:\n /* @__PURE__ */ ((_) => {\n })(check);\n }\n }\n }\n return res;\n}\nfunction escapeLiteralCheckValue(literal, refs) {\n return refs.patternStrategy === \"escape\" ? escapeNonAlphaNumeric(literal) : literal;\n}\nvar ALPHA_NUMERIC = new Set(\n \"ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789\"\n);\nfunction escapeNonAlphaNumeric(source) {\n let result = \"\";\n for (let i = 0; i < source.length; i++) {\n if (!ALPHA_NUMERIC.has(source[i])) {\n result += \"\\\\\";\n }\n result += source[i];\n }\n return result;\n}\nfunction addFormat(schema, value, message, refs) {\n var _a2;\n if (schema.format || ((_a2 = schema.anyOf) == null ? void 0 : _a2.some((x) => x.format))) {\n if (!schema.anyOf) {\n schema.anyOf = [];\n }\n if (schema.format) {\n schema.anyOf.push({\n format: schema.format\n });\n delete schema.format;\n }\n schema.anyOf.push({\n format: value,\n ...message && refs.errorMessages && { errorMessage: { format: message } }\n });\n } else {\n schema.format = value;\n }\n}\nfunction addPattern(schema, regex, message, refs) {\n var _a2;\n if (schema.pattern || ((_a2 = schema.allOf) == null ? void 0 : _a2.some((x) => x.pattern))) {\n if (!schema.allOf) {\n schema.allOf = [];\n }\n if (schema.pattern) {\n schema.allOf.push({\n pattern: schema.pattern\n });\n delete schema.pattern;\n }\n schema.allOf.push({\n pattern: stringifyRegExpWithFlags(regex, refs),\n ...message && refs.errorMessages && { errorMessage: { pattern: message } }\n });\n } else {\n schema.pattern = stringifyRegExpWithFlags(regex, refs);\n }\n}\nfunction stringifyRegExpWithFlags(regex, refs) {\n var _a2;\n if (!refs.applyRegexFlags || !regex.flags) {\n return regex.source;\n }\n const flags = {\n i: regex.flags.includes(\"i\"),\n // Case-insensitive\n m: regex.flags.includes(\"m\"),\n // `^` and `$` matches adjacent to newline characters\n s: regex.flags.includes(\"s\")\n // `.` matches newlines\n };\n const source = flags.i ? regex.source.toLowerCase() : regex.source;\n let pattern = \"\";\n let isEscaped = false;\n let inCharGroup = false;\n let inCharRange = false;\n for (let i = 0; i < source.length; i++) {\n if (isEscaped) {\n pattern += source[i];\n isEscaped = false;\n continue;\n }\n if (flags.i) {\n if (inCharGroup) {\n if (source[i].match(/[a-z]/)) {\n if (inCharRange) {\n pattern += source[i];\n pattern += `${source[i - 2]}-${source[i]}`.toUpperCase();\n inCharRange = false;\n } else if (source[i + 1] === \"-\" && ((_a2 = source[i + 2]) == null ? void 0 : _a2.match(/[a-z]/))) {\n pattern += source[i];\n inCharRange = true;\n } else {\n pattern += `${source[i]}${source[i].toUpperCase()}`;\n }\n continue;\n }\n } else if (source[i].match(/[a-z]/)) {\n pattern += `[${source[i]}${source[i].toUpperCase()}]`;\n continue;\n }\n }\n if (flags.m) {\n if (source[i] === \"^\") {\n pattern += `(^|(?<=[\\r\n]))`;\n continue;\n } else if (source[i] === \"$\") {\n pattern += `($|(?=[\\r\n]))`;\n continue;\n }\n }\n if (flags.s && source[i] === \".\") {\n pattern += inCharGroup ? `${source[i]}\\r\n` : `[${source[i]}\\r\n]`;\n continue;\n }\n pattern += source[i];\n if (source[i] === \"\\\\\") {\n isEscaped = true;\n } else if (inCharGroup && source[i] === \"]\") {\n inCharGroup = false;\n } else if (!inCharGroup && source[i] === \"[\") {\n inCharGroup = true;\n }\n }\n try {\n new RegExp(pattern);\n } catch (e) {\n console.warn(\n `Could not convert regex pattern at ${refs.currentPath.join(\n \"/\"\n )} to a flag-independent form! Falling back to the flag-ignorant source`\n );\n return regex.source;\n }\n return pattern;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/record.ts\nfunction parseRecordDef(def, refs) {\n var _a2, _b2, _c, _d, _e, _f;\n const schema = {\n type: \"object\",\n additionalProperties: (_a2 = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalProperties\"]\n })) != null ? _a2 : refs.allowedAdditionalProperties\n };\n if (((_b2 = def.keyType) == null ? void 0 : _b2._def.typeName) === ZodFirstPartyTypeKind2.ZodString && ((_c = def.keyType._def.checks) == null ? void 0 : _c.length)) {\n const { type: _type, ...keyType } = parseStringDef(def.keyType._def, refs);\n return {\n ...schema,\n propertyNames: keyType\n };\n } else if (((_d = def.keyType) == null ? void 0 : _d._def.typeName) === ZodFirstPartyTypeKind2.ZodEnum) {\n return {\n ...schema,\n propertyNames: {\n enum: def.keyType._def.values\n }\n };\n } else if (((_e = def.keyType) == null ? void 0 : _e._def.typeName) === ZodFirstPartyTypeKind2.ZodBranded && def.keyType._def.type._def.typeName === ZodFirstPartyTypeKind2.ZodString && ((_f = def.keyType._def.type._def.checks) == null ? void 0 : _f.length)) {\n const { type: _type, ...keyType } = parseBrandedDef(\n def.keyType._def,\n refs\n );\n return {\n ...schema,\n propertyNames: keyType\n };\n }\n return schema;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/map.ts\nfunction parseMapDef(def, refs) {\n if (refs.mapStrategy === \"record\") {\n return parseRecordDef(def, refs);\n }\n const keys = parseDef(def.keyType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", \"items\", \"0\"]\n }) || parseAnyDef();\n const values = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", \"items\", \"1\"]\n }) || parseAnyDef();\n return {\n type: \"array\",\n maxItems: 125,\n items: {\n type: \"array\",\n items: [keys, values],\n minItems: 2,\n maxItems: 2\n }\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/native-enum.ts\nfunction parseNativeEnumDef(def) {\n const object = def.values;\n const actualKeys = Object.keys(def.values).filter((key) => {\n return typeof object[object[key]] !== \"number\";\n });\n const actualValues = actualKeys.map((key) => object[key]);\n const parsedTypes = Array.from(\n new Set(actualValues.map((values) => typeof values))\n );\n return {\n type: parsedTypes.length === 1 ? parsedTypes[0] === \"string\" ? \"string\" : \"number\" : [\"string\", \"number\"],\n enum: actualValues\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/never.ts\nfunction parseNeverDef() {\n return { not: parseAnyDef() };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/null.ts\nfunction parseNullDef() {\n return {\n type: \"null\"\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/union.ts\nvar primitiveMappings = {\n ZodString: \"string\",\n ZodNumber: \"number\",\n ZodBigInt: \"integer\",\n ZodBoolean: \"boolean\",\n ZodNull: \"null\"\n};\nfunction parseUnionDef(def, refs) {\n const options = def.options instanceof Map ? Array.from(def.options.values()) : def.options;\n if (options.every(\n (x) => x._def.typeName in primitiveMappings && (!x._def.checks || !x._def.checks.length)\n )) {\n const types = options.reduce((types2, x) => {\n const type = primitiveMappings[x._def.typeName];\n return type && !types2.includes(type) ? [...types2, type] : types2;\n }, []);\n return {\n type: types.length > 1 ? types : types[0]\n };\n } else if (options.every((x) => x._def.typeName === \"ZodLiteral\" && !x.description)) {\n const types = options.reduce(\n (acc, x) => {\n const type = typeof x._def.value;\n switch (type) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return [...acc, type];\n case \"bigint\":\n return [...acc, \"integer\"];\n case \"object\":\n if (x._def.value === null) return [...acc, \"null\"];\n case \"symbol\":\n case \"undefined\":\n case \"function\":\n default:\n return acc;\n }\n },\n []\n );\n if (types.length === options.length) {\n const uniqueTypes = types.filter((x, i, a) => a.indexOf(x) === i);\n return {\n type: uniqueTypes.length > 1 ? uniqueTypes : uniqueTypes[0],\n enum: options.reduce(\n (acc, x) => {\n return acc.includes(x._def.value) ? acc : [...acc, x._def.value];\n },\n []\n )\n };\n }\n } else if (options.every((x) => x._def.typeName === \"ZodEnum\")) {\n return {\n type: \"string\",\n enum: options.reduce(\n (acc, x) => [\n ...acc,\n ...x._def.values.filter((x2) => !acc.includes(x2))\n ],\n []\n )\n };\n }\n return asAnyOf(def, refs);\n}\nvar asAnyOf = (def, refs) => {\n const anyOf = (def.options instanceof Map ? Array.from(def.options.values()) : def.options).map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", `${i}`]\n })\n ).filter(\n (x) => !!x && (!refs.strictUnions || typeof x === \"object\" && Object.keys(x).length > 0)\n );\n return anyOf.length ? { anyOf } : void 0;\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/nullable.ts\nfunction parseNullableDef(def, refs) {\n if ([\"ZodString\", \"ZodNumber\", \"ZodBigInt\", \"ZodBoolean\", \"ZodNull\"].includes(\n def.innerType._def.typeName\n ) && (!def.innerType._def.checks || !def.innerType._def.checks.length)) {\n return {\n type: [\n primitiveMappings[def.innerType._def.typeName],\n \"null\"\n ]\n };\n }\n const base = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", \"0\"]\n });\n return base && { anyOf: [base, { type: \"null\" }] };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/number.ts\nfunction parseNumberDef(def) {\n const res = {\n type: \"number\"\n };\n if (!def.checks) return res;\n for (const check of def.checks) {\n switch (check.kind) {\n case \"int\":\n res.type = \"integer\";\n break;\n case \"min\":\n if (check.inclusive) {\n res.minimum = check.value;\n } else {\n res.exclusiveMinimum = check.value;\n }\n break;\n case \"max\":\n if (check.inclusive) {\n res.maximum = check.value;\n } else {\n res.exclusiveMaximum = check.value;\n }\n break;\n case \"multipleOf\":\n res.multipleOf = check.value;\n break;\n }\n }\n return res;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/object.ts\nfunction parseObjectDef(def, refs) {\n const result = {\n type: \"object\",\n properties: {}\n };\n const required = [];\n const shape = def.shape();\n for (const propName in shape) {\n let propDef = shape[propName];\n if (propDef === void 0 || propDef._def === void 0) {\n continue;\n }\n const propOptional = safeIsOptional(propDef);\n const parsedDef = parseDef(propDef._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"properties\", propName],\n propertyPath: [...refs.currentPath, \"properties\", propName]\n });\n if (parsedDef === void 0) {\n continue;\n }\n result.properties[propName] = parsedDef;\n if (!propOptional) {\n required.push(propName);\n }\n }\n if (required.length) {\n result.required = required;\n }\n const additionalProperties = decideAdditionalProperties(def, refs);\n if (additionalProperties !== void 0) {\n result.additionalProperties = additionalProperties;\n }\n return result;\n}\nfunction decideAdditionalProperties(def, refs) {\n if (def.catchall._def.typeName !== \"ZodNever\") {\n return parseDef(def.catchall._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalProperties\"]\n });\n }\n switch (def.unknownKeys) {\n case \"passthrough\":\n return refs.allowedAdditionalProperties;\n case \"strict\":\n return refs.rejectedAdditionalProperties;\n case \"strip\":\n return refs.removeAdditionalStrategy === \"strict\" ? refs.allowedAdditionalProperties : refs.rejectedAdditionalProperties;\n }\n}\nfunction safeIsOptional(schema) {\n try {\n return schema.isOptional();\n } catch (e) {\n return true;\n }\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/optional.ts\nvar parseOptionalDef = (def, refs) => {\n var _a2;\n if (refs.currentPath.toString() === ((_a2 = refs.propertyPath) == null ? void 0 : _a2.toString())) {\n return parseDef(def.innerType._def, refs);\n }\n const innerSchema = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", \"1\"]\n });\n return innerSchema ? { anyOf: [{ not: parseAnyDef() }, innerSchema] } : parseAnyDef();\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/pipeline.ts\nvar parsePipelineDef = (def, refs) => {\n if (refs.pipeStrategy === \"input\") {\n return parseDef(def.in._def, refs);\n } else if (refs.pipeStrategy === \"output\") {\n return parseDef(def.out._def, refs);\n }\n const inputSchema = parseDef(def.in._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"0\"]\n });\n const outputSchema = parseDef(def.out._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", inputSchema ? \"1\" : \"0\"]\n });\n return {\n allOf: [inputSchema, outputSchema].filter(\n (schema) => schema !== void 0\n )\n };\n};\n\n// src/to-json-schema/zod3-to-json-schema/parsers/promise.ts\nfunction parsePromiseDef(def, refs) {\n return parseDef(def.type._def, refs);\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/set.ts\nfunction parseSetDef(def, refs) {\n const items = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\"]\n });\n const schema = {\n type: \"array\",\n uniqueItems: true,\n items\n };\n if (def.minSize) {\n schema.minItems = def.minSize.value;\n }\n if (def.maxSize) {\n schema.maxItems = def.maxSize.value;\n }\n return schema;\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/tuple.ts\nfunction parseTupleDef(def, refs) {\n if (def.rest) {\n return {\n type: \"array\",\n minItems: def.items.length,\n items: def.items.map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", `${i}`]\n })\n ).reduce(\n (acc, x) => x === void 0 ? acc : [...acc, x],\n []\n ),\n additionalItems: parseDef(def.rest._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalItems\"]\n })\n };\n } else {\n return {\n type: \"array\",\n minItems: def.items.length,\n maxItems: def.items.length,\n items: def.items.map(\n (x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", `${i}`]\n })\n ).reduce(\n (acc, x) => x === void 0 ? acc : [...acc, x],\n []\n )\n };\n }\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/undefined.ts\nfunction parseUndefinedDef() {\n return {\n not: parseAnyDef()\n };\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/unknown.ts\nfunction parseUnknownDef() {\n return parseAnyDef();\n}\n\n// src/to-json-schema/zod3-to-json-schema/parsers/readonly.ts\nvar parseReadonlyDef = (def, refs) => {\n return parseDef(def.innerType._def, refs);\n};\n\n// src/to-json-schema/zod3-to-json-schema/select-parser.ts\nvar selectParser = (def, typeName, refs) => {\n switch (typeName) {\n case ZodFirstPartyTypeKind3.ZodString:\n return parseStringDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodNumber:\n return parseNumberDef(def);\n case ZodFirstPartyTypeKind3.ZodObject:\n return parseObjectDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodBigInt:\n return parseBigintDef(def);\n case ZodFirstPartyTypeKind3.ZodBoolean:\n return parseBooleanDef();\n case ZodFirstPartyTypeKind3.ZodDate:\n return parseDateDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodUndefined:\n return parseUndefinedDef();\n case ZodFirstPartyTypeKind3.ZodNull:\n return parseNullDef();\n case ZodFirstPartyTypeKind3.ZodArray:\n return parseArrayDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodUnion:\n case ZodFirstPartyTypeKind3.ZodDiscriminatedUnion:\n return parseUnionDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodIntersection:\n return parseIntersectionDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodTuple:\n return parseTupleDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodRecord:\n return parseRecordDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodLiteral:\n return parseLiteralDef(def);\n case ZodFirstPartyTypeKind3.ZodEnum:\n return parseEnumDef(def);\n case ZodFirstPartyTypeKind3.ZodNativeEnum:\n return parseNativeEnumDef(def);\n case ZodFirstPartyTypeKind3.ZodNullable:\n return parseNullableDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodOptional:\n return parseOptionalDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodMap:\n return parseMapDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodSet:\n return parseSetDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodLazy:\n return () => def.getter()._def;\n case ZodFirstPartyTypeKind3.ZodPromise:\n return parsePromiseDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodNaN:\n case ZodFirstPartyTypeKind3.ZodNever:\n return parseNeverDef();\n case ZodFirstPartyTypeKind3.ZodEffects:\n return parseEffectsDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodAny:\n return parseAnyDef();\n case ZodFirstPartyTypeKind3.ZodUnknown:\n return parseUnknownDef();\n case ZodFirstPartyTypeKind3.ZodDefault:\n return parseDefaultDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodBranded:\n return parseBrandedDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodReadonly:\n return parseReadonlyDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodCatch:\n return parseCatchDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodPipeline:\n return parsePipelineDef(def, refs);\n case ZodFirstPartyTypeKind3.ZodFunction:\n case ZodFirstPartyTypeKind3.ZodVoid:\n case ZodFirstPartyTypeKind3.ZodSymbol:\n return void 0;\n default:\n return /* @__PURE__ */ ((_) => void 0)(typeName);\n }\n};\n\n// src/to-json-schema/zod3-to-json-schema/get-relative-path.ts\nvar getRelativePath = (pathA, pathB) => {\n let i = 0;\n for (; i < pathA.length && i < pathB.length; i++) {\n if (pathA[i] !== pathB[i]) break;\n }\n return [(pathA.length - i).toString(), ...pathB.slice(i)].join(\"/\");\n};\n\n// src/to-json-schema/zod3-to-json-schema/parse-def.ts\nfunction parseDef(def, refs, forceResolution = false) {\n var _a2;\n const seenItem = refs.seen.get(def);\n if (refs.override) {\n const overrideResult = (_a2 = refs.override) == null ? void 0 : _a2.call(\n refs,\n def,\n refs,\n seenItem,\n forceResolution\n );\n if (overrideResult !== ignoreOverride) {\n return overrideResult;\n }\n }\n if (seenItem && !forceResolution) {\n const seenSchema = get$ref(seenItem, refs);\n if (seenSchema !== void 0) {\n return seenSchema;\n }\n }\n const newItem = { def, path: refs.currentPath, jsonSchema: void 0 };\n refs.seen.set(def, newItem);\n const jsonSchemaOrGetter = selectParser(def, def.typeName, refs);\n const jsonSchema2 = typeof jsonSchemaOrGetter === \"function\" ? parseDef(jsonSchemaOrGetter(), refs) : jsonSchemaOrGetter;\n if (jsonSchema2) {\n addMeta(def, refs, jsonSchema2);\n }\n if (refs.postProcess) {\n const postProcessResult = refs.postProcess(jsonSchema2, def, refs);\n newItem.jsonSchema = jsonSchema2;\n return postProcessResult;\n }\n newItem.jsonSchema = jsonSchema2;\n return jsonSchema2;\n}\nvar get$ref = (item, refs) => {\n switch (refs.$refStrategy) {\n case \"root\":\n return { $ref: item.path.join(\"/\") };\n case \"relative\":\n return { $ref: getRelativePath(refs.currentPath, item.path) };\n case \"none\":\n case \"seen\": {\n if (item.path.length < refs.currentPath.length && item.path.every((value, index) => refs.currentPath[index] === value)) {\n console.warn(\n `Recursive reference detected at ${refs.currentPath.join(\n \"/\"\n )}! Defaulting to any`\n );\n return parseAnyDef();\n }\n return refs.$refStrategy === \"seen\" ? parseAnyDef() : void 0;\n }\n }\n};\nvar addMeta = (def, refs, jsonSchema2) => {\n if (def.description) {\n jsonSchema2.description = def.description;\n }\n return jsonSchema2;\n};\n\n// src/to-json-schema/zod3-to-json-schema/refs.ts\nvar getRefs = (options) => {\n const _options = getDefaultOptions(options);\n const currentPath = _options.name !== void 0 ? [..._options.basePath, _options.definitionPath, _options.name] : _options.basePath;\n return {\n ..._options,\n currentPath,\n propertyPath: void 0,\n seen: new Map(\n Object.entries(_options.definitions).map(([name2, def]) => [\n def._def,\n {\n def: def._def,\n path: [..._options.basePath, _options.definitionPath, name2],\n // Resolution of references will be forced even though seen, so it's ok that the schema is undefined here for now.\n jsonSchema: void 0\n }\n ])\n )\n };\n};\n\n// src/to-json-schema/zod3-to-json-schema/zod3-to-json-schema.ts\nvar zod3ToJsonSchema = (schema, options) => {\n var _a2;\n const refs = getRefs(options);\n let definitions = typeof options === \"object\" && options.definitions ? Object.entries(options.definitions).reduce(\n (acc, [name3, schema2]) => {\n var _a3;\n return {\n ...acc,\n [name3]: (_a3 = parseDef(\n schema2._def,\n {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name3]\n },\n true\n )) != null ? _a3 : parseAnyDef()\n };\n },\n {}\n ) : void 0;\n const name2 = typeof options === \"string\" ? options : (options == null ? void 0 : options.nameStrategy) === \"title\" ? void 0 : options == null ? void 0 : options.name;\n const main = (_a2 = parseDef(\n schema._def,\n name2 === void 0 ? refs : {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name2]\n },\n false\n )) != null ? _a2 : parseAnyDef();\n const title = typeof options === \"object\" && options.name !== void 0 && options.nameStrategy === \"title\" ? options.name : void 0;\n if (title !== void 0) {\n main.title = title;\n }\n const combined = name2 === void 0 ? definitions ? {\n ...main,\n [refs.definitionPath]: definitions\n } : main : {\n $ref: [\n ...refs.$refStrategy === \"relative\" ? [] : refs.basePath,\n refs.definitionPath,\n name2\n ].join(\"/\"),\n [refs.definitionPath]: {\n ...definitions,\n [name2]: main\n }\n };\n combined.$schema = \"http://json-schema.org/draft-07/schema#\";\n return combined;\n};\n\n// src/schema.ts\nvar schemaSymbol = /* @__PURE__ */ Symbol.for(\"vercel.ai.schema\");\nfunction lazySchema(createSchema) {\n let schema;\n return () => {\n if (schema == null) {\n schema = createSchema();\n }\n return schema;\n };\n}\nfunction jsonSchema(jsonSchema2, {\n validate\n} = {}) {\n return {\n [schemaSymbol]: true,\n _type: void 0,\n // should never be used directly\n get jsonSchema() {\n if (typeof jsonSchema2 === \"function\") {\n jsonSchema2 = jsonSchema2();\n }\n return jsonSchema2;\n },\n validate\n };\n}\nfunction isSchema(value) {\n return typeof value === \"object\" && value !== null && schemaSymbol in value && value[schemaSymbol] === true && \"jsonSchema\" in value && \"validate\" in value;\n}\nfunction asSchema(schema) {\n return schema == null ? jsonSchema({\n type: \"object\",\n properties: {},\n additionalProperties: false\n }) : isSchema(schema) ? schema : \"~standard\" in schema ? schema[\"~standard\"].vendor === \"zod\" ? zodSchema(schema) : standardSchema(schema) : schema();\n}\nfunction standardSchema(standardSchema2) {\n return jsonSchema(\n () => {\n if (!hasStandardJsonSchema(standardSchema2)) {\n throw new Error(\n `Standard schema vendor '${standardSchema2[\"~standard\"].vendor}' does not support JSON Schema conversion.`\n );\n }\n return addAdditionalPropertiesToJsonSchema(\n standardSchema2[\"~standard\"].jsonSchema.input({\n target: \"draft-07\"\n })\n );\n },\n {\n validate: async (value) => {\n const result = await standardSchema2[\"~standard\"].validate(value);\n return \"value\" in result ? { success: true, value: result.value } : {\n success: false,\n error: new TypeValidationError({\n value,\n cause: result.issues\n })\n };\n }\n }\n );\n}\nfunction hasStandardJsonSchema(schema) {\n return schema[\"~standard\"].jsonSchema != null;\n}\nfunction zod3Schema(zodSchema2, options) {\n var _a2;\n const useReferences = (_a2 = options == null ? void 0 : options.useReferences) != null ? _a2 : false;\n return jsonSchema(\n // defer json schema creation to avoid unnecessary computation when only validation is needed\n () => zod3ToJsonSchema(zodSchema2, {\n $refStrategy: useReferences ? \"root\" : \"none\"\n }),\n {\n validate: async (value) => {\n const result = await zodSchema2.safeParseAsync(value);\n return result.success ? { success: true, value: result.data } : { success: false, error: result.error };\n }\n }\n );\n}\nfunction zod4Schema(zodSchema2, options) {\n var _a2;\n const useReferences = (_a2 = options == null ? void 0 : options.useReferences) != null ? _a2 : false;\n return jsonSchema(\n // defer json schema creation to avoid unnecessary computation when only validation is needed\n () => addAdditionalPropertiesToJsonSchema(\n z4.toJSONSchema(zodSchema2, {\n target: \"draft-7\",\n io: \"input\",\n reused: useReferences ? \"ref\" : \"inline\"\n })\n ),\n {\n validate: async (value) => {\n const result = await z4.safeParseAsync(zodSchema2, value);\n return result.success ? { success: true, value: result.data } : { success: false, error: result.error };\n }\n }\n );\n}\nfunction isZod4Schema(zodSchema2) {\n return \"_zod\" in zodSchema2;\n}\nfunction zodSchema(zodSchema2, options) {\n if (isZod4Schema(zodSchema2)) {\n return zod4Schema(zodSchema2, options);\n } else {\n return zod3Schema(zodSchema2, options);\n }\n}\n\n// src/validate-types.ts\nasync function validateTypes({\n value,\n schema,\n context\n}) {\n const result = await safeValidateTypes({ value, schema, context });\n if (!result.success) {\n throw TypeValidationError2.wrap({ value, cause: result.error, context });\n }\n return result.value;\n}\nasync function safeValidateTypes({\n value,\n schema,\n context\n}) {\n const actualSchema = asSchema(schema);\n try {\n if (actualSchema.validate == null) {\n return { success: true, value, rawValue: value };\n }\n const result = await actualSchema.validate(value);\n if (result.success) {\n return { success: true, value: result.value, rawValue: value };\n }\n return {\n success: false,\n error: TypeValidationError2.wrap({ value, cause: result.error, context }),\n rawValue: value\n };\n } catch (error) {\n return {\n success: false,\n error: TypeValidationError2.wrap({ value, cause: error, context }),\n rawValue: value\n };\n }\n}\n\n// src/parse-json.ts\nasync function parseJSON({\n text,\n schema\n}) {\n try {\n const value = secureJsonParse(text);\n if (schema == null) {\n return value;\n }\n return await validateTypes({ value, schema });\n } catch (error) {\n if (JSONParseError.isInstance(error) || TypeValidationError3.isInstance(error)) {\n throw error;\n }\n throw new JSONParseError({ text, cause: error });\n }\n}\nasync function safeParseJSON({\n text,\n schema\n}) {\n try {\n const value = secureJsonParse(text);\n if (schema == null) {\n return { success: true, value, rawValue: value };\n }\n return await safeValidateTypes({ value, schema });\n } catch (error) {\n return {\n success: false,\n error: JSONParseError.isInstance(error) ? error : new JSONParseError({ text, cause: error }),\n rawValue: void 0\n };\n }\n}\nfunction isParsableJson(input) {\n try {\n secureJsonParse(input);\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// src/parse-json-event-stream.ts\nimport {\n EventSourceParserStream\n} from \"eventsource-parser/stream\";\nfunction parseJsonEventStream({\n stream,\n schema\n}) {\n return stream.pipeThrough(new TextDecoderStream()).pipeThrough(new EventSourceParserStream()).pipeThrough(\n new TransformStream({\n async transform({ data }, controller) {\n if (data === \"[DONE]\") {\n return;\n }\n controller.enqueue(await safeParseJSON({ text: data, schema }));\n }\n })\n );\n}\n\n// src/parse-provider-options.ts\nimport { InvalidArgumentError as InvalidArgumentError2 } from \"@ai-sdk/provider\";\nasync function parseProviderOptions({\n provider,\n providerOptions,\n schema\n}) {\n if ((providerOptions == null ? void 0 : providerOptions[provider]) == null) {\n return void 0;\n }\n const parsedProviderOptions = await safeValidateTypes({\n value: providerOptions[provider],\n schema\n });\n if (!parsedProviderOptions.success) {\n throw new InvalidArgumentError2({\n argument: \"providerOptions\",\n message: `invalid ${provider} provider options`,\n cause: parsedProviderOptions.error\n });\n }\n return parsedProviderOptions.value;\n}\n\n// src/post-to-api.ts\nimport { APICallError as APICallError3 } from \"@ai-sdk/provider\";\nvar getOriginalFetch2 = () => globalThis.fetch;\nvar postJsonToApi = async ({\n url,\n headers,\n body,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch\n}) => await postToApi({\n url,\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n body: {\n content: JSON.stringify(body),\n values: body\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch\n});\nvar postFormDataToApi = async ({\n url,\n headers,\n formData,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch\n}) => await postToApi({\n url,\n headers,\n body: {\n content: formData,\n values: Object.fromEntries(formData.entries())\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch\n});\nvar postToApi = async ({\n url,\n headers = {},\n body,\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch = getOriginalFetch2()\n}) => {\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: withUserAgentSuffix(\n headers,\n `ai-sdk/provider-utils/${VERSION}`,\n getRuntimeEnvironmentUserAgent()\n ),\n body: body.content,\n signal: abortSignal\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!response.ok) {\n let errorInformation;\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: body.values\n });\n } catch (error) {\n if (isAbortError(error) || APICallError3.isInstance(error)) {\n throw error;\n }\n throw new APICallError3({\n message: \"Failed to process error response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values\n });\n }\n throw errorInformation.value;\n }\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: body.values\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || APICallError3.isInstance(error)) {\n throw error;\n }\n }\n throw new APICallError3({\n message: \"Failed to process successful response\",\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: body.values });\n }\n};\n\n// src/types/tool.ts\nfunction tool(tool2) {\n return tool2;\n}\nfunction dynamicTool(tool2) {\n return { ...tool2, type: \"dynamic\" };\n}\n\n// src/provider-defined-tool-factory.ts\nfunction createProviderDefinedToolFactory({\n id,\n inputSchema\n}) {\n return ({\n execute,\n outputSchema,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }) => tool({\n type: \"provider\",\n isProviderExecuted: false,\n id,\n args,\n inputSchema,\n outputSchema,\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable\n });\n}\nfunction createProviderDefinedToolFactoryWithOutputSchema({\n id,\n inputSchema,\n outputSchema\n}) {\n return ({\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }) => tool({\n type: \"provider\",\n isProviderExecuted: false,\n id,\n args,\n inputSchema,\n outputSchema,\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable\n });\n}\n\n// src/provider-executed-tool-factory.ts\nfunction createProviderExecutedToolFactory({\n id,\n inputSchema,\n outputSchema,\n supportsDeferredResults\n}) {\n return ({\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }) => tool({\n type: \"provider\",\n isProviderExecuted: true,\n id,\n args,\n inputSchema,\n outputSchema,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n supportsDeferredResults\n });\n}\n\n// src/resolve.ts\nasync function resolve(value) {\n if (typeof value === \"function\") {\n value = value();\n }\n return Promise.resolve(value);\n}\n\n// src/resolve-full-media-type.ts\nimport {\n UnsupportedFunctionalityError\n} from \"@ai-sdk/provider\";\nfunction resolveFullMediaType({\n part\n}) {\n if (isFullMediaType(part.mediaType)) {\n return part.mediaType;\n }\n if (part.data.type === \"data\") {\n const detected = detectMediaType({\n data: part.data.data,\n topLevelType: getTopLevelMediaType(part.mediaType)\n });\n if (detected) {\n return detected;\n }\n throw new UnsupportedFunctionalityError({\n functionality: `file of media type \"${part.mediaType}\" must specify subtype since it could not be auto-detected`\n });\n }\n throw new UnsupportedFunctionalityError({\n functionality: `file of media type \"${part.mediaType}\" must specify subtype since it is not passed as inline bytes`\n });\n}\n\n// src/resolve-provider-reference.ts\nimport {\n NoSuchProviderReferenceError\n} from \"@ai-sdk/provider\";\nfunction resolveProviderReference({\n reference,\n provider\n}) {\n const id = reference[provider];\n if (id != null) {\n return id;\n }\n throw new NoSuchProviderReferenceError({\n provider,\n reference\n });\n}\n\n// src/retry-with-exponential-backoff.ts\nvar retryWithExponentialBackoff = ({\n maxRetries = 2,\n initialDelayInMs = 2e3,\n backoffFactor = 2,\n abortSignal,\n shouldRetry,\n getDelayInMs = ({ exponentialBackoffDelay }) => exponentialBackoffDelay,\n createRetryError = ({ message }) => new Error(message)\n}) => async (f) => retryWithExponentialBackoffInternal(f, {\n maxRetries,\n delayInMs: initialDelayInMs,\n backoffFactor,\n abortSignal,\n shouldRetry,\n getDelayInMs,\n createRetryError\n});\nasync function retryWithExponentialBackoffInternal(f, {\n maxRetries,\n delayInMs,\n backoffFactor,\n abortSignal,\n shouldRetry,\n getDelayInMs,\n createRetryError\n}, errors = []) {\n try {\n return await f();\n } catch (error) {\n if (isAbortError(error)) {\n throw error;\n }\n if (maxRetries === 0) {\n throw error;\n }\n const errorMessage = getErrorMessage(error);\n const newErrors = [...errors, error];\n const tryNumber = newErrors.length;\n if (tryNumber > maxRetries) {\n throw createRetryError({\n message: `Failed after ${tryNumber} attempts. Last error: ${errorMessage}`,\n reason: \"maxRetriesExceeded\",\n errors: newErrors\n });\n }\n if (await shouldRetry(error) && tryNumber <= maxRetries) {\n await delay(\n getDelayInMs({\n error,\n exponentialBackoffDelay: delayInMs\n }),\n { abortSignal }\n );\n return retryWithExponentialBackoffInternal(\n f,\n {\n maxRetries,\n delayInMs: backoffFactor * delayInMs,\n backoffFactor,\n abortSignal,\n shouldRetry,\n getDelayInMs,\n createRetryError\n },\n newErrors\n );\n }\n if (tryNumber === 1) {\n throw error;\n }\n throw createRetryError({\n message: `Failed after ${tryNumber} attempts with non-retryable error: '${errorMessage}'`,\n reason: \"errorNotRetryable\",\n errors: newErrors\n });\n }\n}\n\n// src/response-handler.ts\nimport { APICallError as APICallError4, EmptyResponseBodyError } from \"@ai-sdk/provider\";\nvar textDecoder2 = new TextDecoder();\nasync function readResponseBodyAsText({\n response,\n url\n}) {\n return textDecoder2.decode(\n await readResponseWithSizeLimit({\n response,\n url\n })\n );\n}\nvar createJsonErrorResponseHandler = ({\n errorSchema,\n errorToMessage,\n isRetryable\n}) => async ({ response, url, requestBodyValues }) => {\n const responseBody = await readResponseBodyAsText({ response, url });\n const responseHeaders = extractResponseHeaders(response);\n if (responseBody.trim() === \"\") {\n return {\n responseHeaders,\n value: new APICallError4({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response)\n })\n };\n }\n try {\n const parsedError = await parseJSON({\n text: responseBody,\n schema: errorSchema\n });\n return {\n responseHeaders,\n value: new APICallError4({\n message: errorToMessage(parsedError),\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n data: parsedError,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response, parsedError)\n })\n };\n } catch (e) {\n return {\n responseHeaders,\n value: new APICallError4({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable == null ? void 0 : isRetryable(response)\n })\n };\n }\n};\nvar createEventSourceResponseHandler = (chunkSchema) => async ({ response }) => {\n const responseHeaders = extractResponseHeaders(response);\n if (response.body == null) {\n throw new EmptyResponseBodyError({});\n }\n return {\n responseHeaders,\n value: parseJsonEventStream({\n stream: response.body,\n schema: chunkSchema\n })\n };\n};\nvar createJsonResponseHandler = (responseSchema) => async ({ response, url, requestBodyValues }) => {\n const responseBody = await readResponseBodyAsText({ response, url });\n const parsedResult = await safeParseJSON({\n text: responseBody,\n schema: responseSchema\n });\n const responseHeaders = extractResponseHeaders(response);\n if (!parsedResult.success) {\n throw new APICallError4({\n message: \"Invalid JSON response\",\n cause: parsedResult.error,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n url,\n requestBodyValues\n });\n }\n return {\n responseHeaders,\n value: parsedResult.value,\n rawValue: parsedResult.rawValue\n };\n};\nvar createBinaryResponseHandler = () => async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n if (!response.body) {\n throw new APICallError4({\n message: \"Response body is empty\",\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: void 0\n });\n }\n try {\n const buffer = await response.arrayBuffer();\n return {\n responseHeaders,\n value: new Uint8Array(buffer)\n };\n } catch (error) {\n throw new APICallError4({\n message: \"Failed to read response as array buffer\",\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: void 0,\n cause: error\n });\n }\n};\nvar createStatusCodeErrorResponseHandler = () => async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n const responseBody = await readResponseBodyAsText({ response, url });\n return {\n responseHeaders,\n value: new APICallError4({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody\n })\n };\n};\n\n// src/is-json-serializable.ts\nfunction isJSONSerializable(value) {\n if (value === null || value === void 0) return true;\n const type = typeof value;\n if (type === \"string\" || type === \"number\" || type === \"boolean\") return true;\n if (type === \"function\" || type === \"symbol\" || type === \"bigint\")\n return false;\n if (Array.isArray(value)) {\n return value.every(isJSONSerializable);\n }\n if (Object.getPrototypeOf(value) === Object.prototype) {\n return Object.values(value).every(\n isJSONSerializable\n );\n }\n return false;\n}\n\n// src/serialize-model-options.ts\nfunction serializeModelOptions(options) {\n const serializableConfig = {};\n for (const [key, value] of Object.entries(options.config)) {\n if (key === \"headers\") {\n const resolvedHeaders = resolveSync(value);\n if (isJSONSerializable(resolvedHeaders)) {\n serializableConfig[key] = resolvedHeaders;\n }\n } else if (isJSONSerializable(value)) {\n serializableConfig[key] = value;\n }\n }\n return { modelId: options.modelId, config: serializableConfig };\n}\nfunction resolveSync(value) {\n let next = value;\n if (typeof value === \"function\") {\n next = value();\n }\n if (next instanceof Promise) {\n throw new Error(\"Promise returned from resolveSync\");\n }\n return next;\n}\n\n// src/streaming-tool-call-tracker.ts\nimport {\n InvalidResponseDataError\n} from \"@ai-sdk/provider\";\nvar StreamingToolCallTracker = class {\n constructor(controller, options = {}) {\n this.toolCalls = [];\n var _a2, _b2;\n this.controller = controller;\n this._generateId = (_a2 = options.generateId) != null ? _a2 : generateId;\n this.typeValidation = (_b2 = options.typeValidation) != null ? _b2 : \"none\";\n this.extractMetadata = options.extractMetadata;\n this.buildToolCallProviderMetadata = options.buildToolCallProviderMetadata;\n }\n /**\n * Process a tool call delta from a streaming response chunk.\n * Emits tool-input-start, tool-input-delta, tool-input-end, and tool-call\n * events as appropriate.\n */\n processDelta(toolCallDelta) {\n var _a2;\n const index = (_a2 = toolCallDelta.index) != null ? _a2 : this.toolCalls.length;\n if (this.toolCalls[index] == null) {\n this.processNewToolCall(index, toolCallDelta);\n } else {\n this.processExistingToolCall(index, toolCallDelta);\n }\n }\n /**\n * Finalize any unfinished tool calls. Should be called during the stream's\n * flush handler to ensure all tool calls are properly completed.\n */\n flush() {\n for (const toolCall of this.toolCalls) {\n if (!toolCall.hasFinished) {\n this.finishToolCall(toolCall);\n }\n }\n }\n processNewToolCall(index, toolCallDelta) {\n var _a2, _b2, _c;\n if (this.typeValidation === \"required\") {\n if (toolCallDelta.type !== \"function\") {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function' type.`\n });\n }\n } else if (this.typeValidation === \"if-present\") {\n if (toolCallDelta.type != null && toolCallDelta.type !== \"function\") {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function' type.`\n });\n }\n }\n if (toolCallDelta.id == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'id' to be a string.`\n });\n }\n if (((_a2 = toolCallDelta.function) == null ? void 0 : _a2.name) == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function.name' to be a string.`\n });\n }\n this.controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallDelta.id,\n toolName: toolCallDelta.function.name\n });\n const metadata = (_b2 = this.extractMetadata) == null ? void 0 : _b2.call(this, toolCallDelta);\n this.toolCalls[index] = {\n id: toolCallDelta.id,\n type: \"function\",\n function: {\n name: toolCallDelta.function.name,\n arguments: (_c = toolCallDelta.function.arguments) != null ? _c : \"\"\n },\n hasFinished: false,\n metadata\n };\n const toolCall = this.toolCalls[index];\n if (toolCall.function.arguments.length > 0) {\n this.controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.id,\n delta: toolCall.function.arguments\n });\n }\n }\n processExistingToolCall(index, toolCallDelta) {\n var _a2;\n const toolCall = this.toolCalls[index];\n if (toolCall.hasFinished) {\n return;\n }\n if (((_a2 = toolCallDelta.function) == null ? void 0 : _a2.arguments) != null) {\n toolCall.function.arguments += toolCallDelta.function.arguments;\n this.controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.id,\n delta: toolCallDelta.function.arguments\n });\n }\n }\n finishToolCall(toolCall) {\n var _a2, _b2;\n this.controller.enqueue({\n type: \"tool-input-end\",\n id: toolCall.id\n });\n const providerMetadata = (_a2 = this.buildToolCallProviderMetadata) == null ? void 0 : _a2.call(\n this,\n toolCall.metadata\n );\n this.controller.enqueue({\n type: \"tool-call\",\n toolCallId: (_b2 = toolCall.id) != null ? _b2 : this._generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments,\n ...providerMetadata ? { providerMetadata } : {}\n });\n toolCall.hasFinished = true;\n }\n};\n\n// src/strip-file-extension.ts\nfunction stripFileExtension(filename) {\n const firstDotIndex = filename.indexOf(\".\");\n return firstDotIndex === -1 ? filename : filename.slice(0, firstDotIndex);\n}\n\n// src/transcription-stream-envelope.ts\nvar TRANSCRIPTION_STREAM_START_FRAME_TYPE = \"transcription-stream.start\";\nvar TRANSCRIPTION_STREAM_AUDIO_DONE_FRAME_TYPE = \"transcription-stream.audio-done\";\nfunction parseTranscriptionStreamClientFrame(text) {\n let value;\n try {\n value = secureJsonParse(text);\n } catch (e) {\n return { type: \"invalid\", message: \"malformed JSON\" };\n }\n if (value == null || typeof value !== \"object\" || Array.isArray(value)) {\n return { type: \"invalid\", message: \"frame must be a JSON object\" };\n }\n const frame = value;\n if (typeof frame.type !== \"string\") {\n return { type: \"invalid\", message: \"frame type must be a string\" };\n }\n switch (frame.type) {\n case TRANSCRIPTION_STREAM_START_FRAME_TYPE: {\n const inputAudioFormat = frame.inputAudioFormat;\n if (inputAudioFormat == null || typeof inputAudioFormat !== \"object\" || Array.isArray(inputAudioFormat) || typeof inputAudioFormat.type !== \"string\") {\n return {\n type: \"invalid\",\n message: \"start frame must have an inputAudioFormat object with a string type\"\n };\n }\n if (inputAudioFormat.rate !== void 0 && typeof inputAudioFormat.rate !== \"number\") {\n return {\n type: \"invalid\",\n message: \"inputAudioFormat.rate must be a number when present\"\n };\n }\n if (frame.providerOptions !== void 0 && (frame.providerOptions == null || typeof frame.providerOptions !== \"object\" || Array.isArray(frame.providerOptions))) {\n return {\n type: \"invalid\",\n message: \"providerOptions must be an object when present\"\n };\n }\n if (frame.includeRawChunks !== void 0 && typeof frame.includeRawChunks !== \"boolean\") {\n return {\n type: \"invalid\",\n message: \"includeRawChunks must be a boolean when present\"\n };\n }\n return {\n type: \"start\",\n frame\n };\n }\n case TRANSCRIPTION_STREAM_AUDIO_DONE_FRAME_TYPE:\n return { type: \"audio-done\" };\n default:\n return { type: \"unknown\" };\n }\n}\nfunction serializeTranscriptionStreamPart(part) {\n try {\n if (part.type === \"error\" && isError(part.error)) {\n return JSON.stringify({\n ...part,\n error: { name: part.error.name, message: part.error.message }\n });\n }\n return JSON.stringify(part);\n } catch (e) {\n return void 0;\n }\n}\nfunction isError(value) {\n return value instanceof Error || Object.prototype.toString.call(value) === \"[object Error]\";\n}\nfunction parseTranscriptionStreamPart(text) {\n let value;\n try {\n value = secureJsonParse(text);\n } catch (e) {\n return void 0;\n }\n if (value == null || typeof value !== \"object\" || Array.isArray(value)) {\n return void 0;\n }\n const part = value;\n switch (part.type) {\n case \"stream-start\":\n return Array.isArray(part.warnings) && part.warnings.every(isWarning) ? part : void 0;\n case \"transcript-delta\":\n return isString(part.delta) && isOptional(part.id, isString) && isOptional(part.providerMetadata, isPlainObject) ? part : void 0;\n case \"transcript-partial\":\n return isString(part.text) && isOptional(part.id, isString) && isOptional(part.startSecond, isNumber) && isOptional(part.durationInSeconds, isNumber) && isOptional(part.channelIndex, isNumber) && isOptional(part.providerMetadata, isPlainObject) ? part : void 0;\n case \"transcript-final\":\n return isString(part.text) && isOptional(part.id, isString) && isOptional(part.startSecond, isNumber) && isOptional(part.endSecond, isNumber) && isOptional(part.channelIndex, isNumber) && isOptional(part.providerMetadata, isPlainObject) ? part : void 0;\n case \"finish\":\n return isString(part.text) && Array.isArray(part.segments) && part.segments.every(isSegment) && isOptional(part.language, isString) && isOptional(part.durationInSeconds, isNumber) && isOptional(part.providerMetadata, isPlainObject) ? part : void 0;\n case \"response-metadata\": {\n if (!(isOptional(part.modelId, isString) && isOptional(part.headers, isPlainObject))) {\n return void 0;\n }\n const timestamp = part.timestamp;\n if (timestamp == null) {\n return { ...part, timestamp: void 0 };\n }\n if (typeof timestamp !== \"string\") {\n return void 0;\n }\n const revived = new Date(timestamp);\n return Number.isNaN(revived.getTime()) ? void 0 : { ...part, timestamp: revived };\n }\n case \"raw\":\n return \"rawValue\" in part ? part : void 0;\n case \"error\":\n return \"error\" in part ? part : void 0;\n default:\n return void 0;\n }\n}\nfunction isString(value) {\n return typeof value === \"string\";\n}\nfunction isNumber(value) {\n return typeof value === \"number\";\n}\nfunction isOptional(value, check) {\n return value === void 0 || check(value);\n}\nfunction isPlainObject(value) {\n return typeof value === \"object\" && value != null && !Array.isArray(value);\n}\nfunction isWarning(value) {\n return isPlainObject(value) && isString(value.type);\n}\nfunction isSegment(value) {\n return isPlainObject(value) && isString(value.text) && isNumber(value.startSecond) && isNumber(value.endSecond);\n}\n\n// src/validate-base-url.ts\nimport { InvalidArgumentError as InvalidArgumentError3 } from \"@ai-sdk/provider\";\nfunction validateBaseURL(baseURL) {\n if ((baseURL == null ? void 0 : baseURL.trim()) === \"\") {\n throw new InvalidArgumentError3({\n argument: \"baseURL\",\n message: \"baseURL must be a non-empty string.\"\n });\n }\n return baseURL;\n}\n\n// src/without-trailing-slash.ts\nfunction withoutTrailingSlash(url) {\n return url == null ? void 0 : url.replace(/\\/$/, \"\");\n}\n\n// src/types/executable-tool.ts\nfunction isExecutableTool(tool2) {\n return tool2 != null && typeof tool2.execute === \"function\";\n}\n\n// src/is-async-iterable.ts\nfunction isAsyncIterable(obj) {\n return obj != null && typeof obj[Symbol.asyncIterator] === \"function\";\n}\n\n// src/types/execute-tool.ts\nasync function* executeTool({\n tool: tool2,\n input,\n options\n}) {\n const result = tool2.execute(input, options);\n if (isAsyncIterable(result)) {\n let lastOutput;\n for await (const output of result) {\n lastOutput = output;\n yield { type: \"preliminary\", output };\n }\n yield { type: \"final\", output: lastOutput };\n } else {\n yield { type: \"final\", output: await result };\n }\n}\n\n// src/index.ts\nimport { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport {\n EventSourceParserStream as EventSourceParserStream2\n} from \"eventsource-parser/stream\";\nexport {\n DEFAULT_MAX_DOWNLOAD_SIZE,\n DelayedPromise,\n DownloadError,\n TRANSCRIPTION_STREAM_AUDIO_DONE_FRAME_TYPE as EXPERIMENTAL_TRANSCRIPTION_STREAM_AUDIO_DONE_FRAME_TYPE,\n TRANSCRIPTION_STREAM_START_FRAME_TYPE as EXPERIMENTAL_TRANSCRIPTION_STREAM_START_FRAME_TYPE,\n EventSourceParserStream2 as EventSourceParserStream,\n StreamingToolCallTracker,\n VERSION,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\n asArray,\n asSchema,\n cancelResponseBody,\n combineHeaders,\n connectToWebSocket,\n convertAsyncIteratorToReadableStream,\n convertBase64ToUint8Array,\n convertImageModelFileToDataUri,\n convertInlineFileDataToUint8Array,\n convertToBase64,\n convertToFormData,\n convertUint8ArrayToBase64,\n createBinaryResponseHandler,\n createEventSourceResponseHandler,\n createIdGenerator,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n createProviderDefinedToolFactory,\n createProviderDefinedToolFactoryWithOutputSchema,\n createProviderExecutedToolFactory,\n createStatusCodeErrorResponseHandler,\n createToolNameMapping,\n delay,\n detectMediaType,\n downloadBlob,\n dynamicTool,\n executeTool,\n parseTranscriptionStreamClientFrame as experimental_parseTranscriptionStreamClientFrame,\n parseTranscriptionStreamPart as experimental_parseTranscriptionStreamPart,\n serializeTranscriptionStreamPart as experimental_serializeTranscriptionStreamPart,\n extractLines,\n extractResponseHeaders,\n fetchWithValidatedRedirects,\n filterNullable,\n generateId,\n getErrorMessage,\n getFromApi,\n getRuntimeEnvironmentUserAgent,\n getTopLevelMediaType,\n getWebSocketConstructor,\n injectJsonInstructionIntoMessages,\n isAbortError,\n isBrowserRuntime,\n isBuffer,\n isCustomReasoning,\n isExecutableTool,\n isFullMediaType,\n isNonNullable,\n isParsableJson,\n isProviderReference,\n isSameOrigin,\n isUrlSupported,\n jsonSchema,\n lazySchema,\n loadApiKey,\n loadOptionalSetting,\n loadSetting,\n mapReasoningToProviderBudget,\n mapReasoningToProviderEffort,\n mediaTypeToExtension,\n normalizeHeaders,\n parseJSON,\n parseJsonEventStream,\n parseProviderOptions,\n postFormDataToApi,\n postJsonToApi,\n postToApi,\n readResponseWithSizeLimit,\n readWebSocketMessageText,\n removeUndefinedEntries,\n resolve,\n resolveFullMediaType,\n resolveProviderReference,\n retryWithExponentialBackoff,\n safeParseJSON,\n safeValidateTypes,\n secureJsonParse,\n serializeModelOptions,\n stripFileExtension,\n toWebSocketUrl,\n tool,\n validateBaseURL,\n validateDownloadUrl,\n validateTypes,\n waitForWebSocketBufferDrain,\n withUserAgentSuffix,\n withoutTrailingSlash,\n zodSchema\n};\n//# sourceMappingURL=index.js.map","var __defProp = Object.defineProperty;\nvar __export = (target, all) => {\n for (var name22 in all)\n __defProp(target, name22, { get: all[name22], enumerable: true });\n};\n\n// src/index.ts\nimport { createGateway, gateway as gateway2 } from \"@ai-sdk/gateway\";\nimport {\n asSchema as asSchema8,\n createIdGenerator as createIdGenerator9,\n dynamicTool,\n generateId,\n jsonSchema,\n parseJsonEventStream as parseJsonEventStream3,\n tool,\n zodSchema as zodSchema3\n} from \"@ai-sdk/provider-utils\";\n\n// src/agent/tool-loop-agent.ts\nimport {\n validateTypes as validateTypes3,\n withUserAgentSuffix as withUserAgentSuffix3\n} from \"@ai-sdk/provider-utils\";\n\n// src/generate-text/generate-text.ts\nimport {\n asArray as asArray5,\n createIdGenerator,\n getErrorMessage as getErrorMessage4,\n withUserAgentSuffix as withUserAgentSuffix2\n} from \"@ai-sdk/provider-utils\";\n\n// src/error/index.ts\nimport {\n AISDKError as AISDKError22,\n APICallError,\n EmptyResponseBodyError,\n InvalidPromptError,\n InvalidResponseDataError,\n JSONParseError,\n LoadAPIKeyError,\n LoadSettingError,\n NoContentGeneratedError,\n NoSuchModelError,\n NoSuchProviderReferenceError,\n TooManyEmbeddingValuesForCallError,\n TypeValidationError,\n UnsupportedFunctionalityError\n} from \"@ai-sdk/provider\";\n\n// src/error/invalid-argument-error.ts\nimport { AISDKError } from \"@ai-sdk/provider\";\nvar name = \"AI_InvalidArgumentError\";\nvar marker = `vercel.ai.error.${name}`;\nvar symbol = Symbol.for(marker);\nvar _a;\nvar InvalidArgumentError = class extends AISDKError {\n constructor({\n parameter,\n value,\n message\n }) {\n super({\n name,\n message: `Invalid argument for parameter ${parameter}: ${message}`\n });\n this[_a] = true;\n this.parameter = parameter;\n this.value = value;\n }\n static isInstance(error) {\n return AISDKError.hasMarker(error, marker);\n }\n};\n_a = symbol;\n\n// src/error/invalid-stream-part-error.ts\nimport { AISDKError as AISDKError2 } from \"@ai-sdk/provider\";\nvar name2 = \"AI_InvalidStreamPartError\";\nvar marker2 = `vercel.ai.error.${name2}`;\nvar symbol2 = Symbol.for(marker2);\nvar _a2;\nvar InvalidStreamPartError = class extends AISDKError2 {\n constructor({\n chunk,\n message\n }) {\n super({ name: name2, message });\n this[_a2] = true;\n this.chunk = chunk;\n }\n static isInstance(error) {\n return AISDKError2.hasMarker(error, marker2);\n }\n};\n_a2 = symbol2;\n\n// src/error/invalid-tool-approval-error.ts\nimport { AISDKError as AISDKError3 } from \"@ai-sdk/provider\";\nvar name3 = \"AI_InvalidToolApprovalError\";\nvar marker3 = `vercel.ai.error.${name3}`;\nvar symbol3 = Symbol.for(marker3);\nvar _a3;\nvar InvalidToolApprovalError = class extends AISDKError3 {\n constructor({ approvalId }) {\n super({\n name: name3,\n message: `Tool approval response references unknown approvalId: \"${approvalId}\". No matching tool-approval-request found in message history.`\n });\n this[_a3] = true;\n this.approvalId = approvalId;\n }\n static isInstance(error) {\n return AISDKError3.hasMarker(error, marker3);\n }\n};\n_a3 = symbol3;\n\n// src/error/invalid-tool-approval-signature-error.ts\nimport { AISDKError as AISDKError4 } from \"@ai-sdk/provider\";\nvar name4 = \"AI_InvalidToolApprovalSignatureError\";\nvar marker4 = `vercel.ai.error.${name4}`;\nvar symbol4 = Symbol.for(marker4);\nvar _a4;\nvar InvalidToolApprovalSignatureError = class extends AISDKError4 {\n constructor({\n approvalId,\n toolCallId,\n reason\n }) {\n super({\n name: name4,\n message: `Tool approval signature verification failed for approval \"${approvalId}\" (tool call \"${toolCallId}\"): ${reason}`\n });\n this[_a4] = true;\n this.approvalId = approvalId;\n this.toolCallId = toolCallId;\n }\n static isInstance(error) {\n return AISDKError4.hasMarker(error, marker4);\n }\n};\n_a4 = symbol4;\n\n// src/error/invalid-tool-input-error.ts\nimport { AISDKError as AISDKError5, getErrorMessage } from \"@ai-sdk/provider\";\nvar name5 = \"AI_InvalidToolInputError\";\nvar marker5 = `vercel.ai.error.${name5}`;\nvar symbol5 = Symbol.for(marker5);\nvar _a5;\nvar InvalidToolInputError = class extends AISDKError5 {\n constructor({\n toolInput,\n toolName,\n cause,\n message = `Invalid input for tool ${toolName}: ${getErrorMessage(cause)}`\n }) {\n super({ name: name5, message, cause });\n this[_a5] = true;\n this.toolInput = toolInput;\n this.toolName = toolName;\n }\n static isInstance(error) {\n return AISDKError5.hasMarker(error, marker5);\n }\n};\n_a5 = symbol5;\n\n// src/error/tool-call-not-found-for-approval-error.ts\nimport { AISDKError as AISDKError6 } from \"@ai-sdk/provider\";\nvar name6 = \"AI_ToolCallNotFoundForApprovalError\";\nvar marker6 = `vercel.ai.error.${name6}`;\nvar symbol6 = Symbol.for(marker6);\nvar _a6;\nvar ToolCallNotFoundForApprovalError = class extends AISDKError6 {\n constructor({\n toolCallId,\n approvalId\n }) {\n super({\n name: name6,\n message: `Tool call \"${toolCallId}\" not found for approval request \"${approvalId}\".`\n });\n this[_a6] = true;\n this.toolCallId = toolCallId;\n this.approvalId = approvalId;\n }\n static isInstance(error) {\n return AISDKError6.hasMarker(error, marker6);\n }\n};\n_a6 = symbol6;\n\n// src/error/missing-tool-result-error.ts\nimport { AISDKError as AISDKError7 } from \"@ai-sdk/provider\";\nvar name7 = \"AI_MissingToolResultsError\";\nvar marker7 = `vercel.ai.error.${name7}`;\nvar symbol7 = Symbol.for(marker7);\nvar _a7;\nvar MissingToolResultsError = class extends AISDKError7 {\n constructor({ toolCallIds }) {\n super({\n name: name7,\n message: `Tool result${toolCallIds.length > 1 ? \"s are\" : \" is\"} missing for tool call${toolCallIds.length > 1 ? \"s\" : \"\"} ${toolCallIds.join(\n \", \"\n )}.`\n });\n this[_a7] = true;\n this.toolCallIds = toolCallIds;\n }\n static isInstance(error) {\n return AISDKError7.hasMarker(error, marker7);\n }\n};\n_a7 = symbol7;\n\n// src/error/no-image-generated-error.ts\nimport { AISDKError as AISDKError8 } from \"@ai-sdk/provider\";\nvar name8 = \"AI_NoImageGeneratedError\";\nvar marker8 = `vercel.ai.error.${name8}`;\nvar symbol8 = Symbol.for(marker8);\nvar _a8;\nvar NoImageGeneratedError = class extends AISDKError8 {\n constructor({\n message = \"No image generated.\",\n cause,\n responses\n }) {\n super({ name: name8, message, cause });\n this[_a8] = true;\n this.responses = responses;\n }\n static isInstance(error) {\n return AISDKError8.hasMarker(error, marker8);\n }\n};\n_a8 = symbol8;\n\n// src/error/no-object-generated-error.ts\nimport { AISDKError as AISDKError9 } from \"@ai-sdk/provider\";\nvar name9 = \"AI_NoObjectGeneratedError\";\nvar marker9 = `vercel.ai.error.${name9}`;\nvar symbol9 = Symbol.for(marker9);\nvar _a9;\nvar NoObjectGeneratedError = class extends AISDKError9 {\n constructor({\n message = \"No object generated.\",\n cause,\n text: text2,\n response,\n usage,\n finishReason\n }) {\n super({ name: name9, message, cause });\n this[_a9] = true;\n this.text = text2;\n this.response = response;\n this.usage = usage;\n this.finishReason = finishReason;\n }\n static isInstance(error) {\n return AISDKError9.hasMarker(error, marker9);\n }\n};\n_a9 = symbol9;\n\n// src/error/no-output-generated-error.ts\nimport { AISDKError as AISDKError10 } from \"@ai-sdk/provider\";\nvar name10 = \"AI_NoOutputGeneratedError\";\nvar marker10 = `vercel.ai.error.${name10}`;\nvar symbol10 = Symbol.for(marker10);\nvar _a10;\nvar NoOutputGeneratedError = class extends AISDKError10 {\n // used in isInstance\n constructor({\n message = \"No output generated.\",\n cause\n } = {}) {\n super({ name: name10, message, cause });\n this[_a10] = true;\n }\n static isInstance(error) {\n return AISDKError10.hasMarker(error, marker10);\n }\n};\n_a10 = symbol10;\n\n// src/error/no-speech-generated-error.ts\nimport { AISDKError as AISDKError11 } from \"@ai-sdk/provider\";\nvar name11 = \"AI_NoSpeechGeneratedError\";\nvar marker11 = `vercel.ai.error.${name11}`;\nvar symbol11 = Symbol.for(marker11);\nvar _a11;\nvar NoSpeechGeneratedError = class extends AISDKError11 {\n constructor(options) {\n super({\n name: name11,\n message: \"No speech audio generated.\"\n });\n this[_a11] = true;\n this.responses = options.responses;\n }\n static isInstance(error) {\n return AISDKError11.hasMarker(error, marker11);\n }\n};\n_a11 = symbol11;\n\n// src/error/no-transcript-generated-error.ts\nimport { AISDKError as AISDKError12 } from \"@ai-sdk/provider\";\nvar name12 = \"AI_NoTranscriptGeneratedError\";\nvar marker12 = `vercel.ai.error.${name12}`;\nvar symbol12 = Symbol.for(marker12);\nvar _a12;\nvar NoTranscriptGeneratedError = class extends AISDKError12 {\n constructor(options) {\n super({\n name: name12,\n message: \"No transcript generated.\"\n });\n this[_a12] = true;\n this.responses = options.responses;\n }\n static isInstance(error) {\n return AISDKError12.hasMarker(error, marker12);\n }\n};\n_a12 = symbol12;\n\n// src/error/no-video-generated-error.ts\nimport { AISDKError as AISDKError13 } from \"@ai-sdk/provider\";\nvar name13 = \"AI_NoVideoGeneratedError\";\nvar marker13 = `vercel.ai.error.${name13}`;\nvar symbol13 = Symbol.for(marker13);\nvar _a13;\nvar NoVideoGeneratedError = class extends AISDKError13 {\n constructor({\n message = \"No video generated.\",\n cause,\n responses\n }) {\n super({ name: name13, message, cause });\n this[_a13] = true;\n this.responses = responses;\n }\n static isInstance(error) {\n return AISDKError13.hasMarker(error, marker13);\n }\n /**\n * @deprecated use `isInstance` instead\n */\n static isNoVideoGeneratedError(error) {\n return error instanceof Error && error.name === name13 && typeof error.responses !== \"undefined\" ? true : false;\n }\n /**\n * @deprecated Do not use this method. It will be removed in the next major version.\n */\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n cause: this.cause,\n responses: this.responses\n };\n }\n};\n_a13 = symbol13;\n\n// src/error/no-such-tool-error.ts\nimport { AISDKError as AISDKError14 } from \"@ai-sdk/provider\";\nvar name14 = \"AI_NoSuchToolError\";\nvar marker14 = `vercel.ai.error.${name14}`;\nvar symbol14 = Symbol.for(marker14);\nvar _a14;\nvar NoSuchToolError = class extends AISDKError14 {\n constructor({\n toolName,\n availableTools = void 0,\n message = `Model tried to call unavailable tool '${toolName}'. ${availableTools === void 0 ? \"No tools are available.\" : `Available tools: ${availableTools.join(\", \")}.`}`\n }) {\n super({ name: name14, message });\n this[_a14] = true;\n this.toolName = toolName;\n this.availableTools = availableTools;\n }\n static isInstance(error) {\n return AISDKError14.hasMarker(error, marker14);\n }\n};\n_a14 = symbol14;\n\n// src/error/tool-call-repair-error.ts\nimport { AISDKError as AISDKError15, getErrorMessage as getErrorMessage2 } from \"@ai-sdk/provider\";\nvar name15 = \"AI_ToolCallRepairError\";\nvar marker15 = `vercel.ai.error.${name15}`;\nvar symbol15 = Symbol.for(marker15);\nvar _a15;\nvar ToolCallRepairError = class extends AISDKError15 {\n constructor({\n cause,\n originalError,\n message = `Error repairing tool call: ${getErrorMessage2(cause)}`\n }) {\n super({ name: name15, message, cause });\n this[_a15] = true;\n this.originalError = originalError;\n }\n static isInstance(error) {\n return AISDKError15.hasMarker(error, marker15);\n }\n};\n_a15 = symbol15;\n\n// src/error/unsupported-model-version-error.ts\nimport { AISDKError as AISDKError16 } from \"@ai-sdk/provider\";\nvar UnsupportedModelVersionError = class extends AISDKError16 {\n constructor(options) {\n super({\n name: \"AI_UnsupportedModelVersionError\",\n message: `Unsupported model version ${options.version} for provider \"${options.provider}\" and model \"${options.modelId}\". AI SDK 5 only supports models that implement specification version \"v2\".`\n });\n this.version = options.version;\n this.provider = options.provider;\n this.modelId = options.modelId;\n }\n};\n\n// src/error/ui-message-stream-error.ts\nimport { AISDKError as AISDKError17 } from \"@ai-sdk/provider\";\nvar name16 = \"AI_UIMessageStreamError\";\nvar marker16 = `vercel.ai.error.${name16}`;\nvar symbol16 = Symbol.for(marker16);\nvar _a16;\nvar UIMessageStreamError = class extends AISDKError17 {\n constructor({\n chunkType,\n chunkId,\n message\n }) {\n super({ name: name16, message });\n this[_a16] = true;\n this.chunkType = chunkType;\n this.chunkId = chunkId;\n }\n static isInstance(error) {\n return AISDKError17.hasMarker(error, marker16);\n }\n};\n_a16 = symbol16;\n\n// src/prompt/invalid-data-content-error.ts\nimport { AISDKError as AISDKError18 } from \"@ai-sdk/provider\";\nvar name17 = \"AI_InvalidDataContentError\";\nvar marker17 = `vercel.ai.error.${name17}`;\nvar symbol17 = Symbol.for(marker17);\nvar _a17;\nvar InvalidDataContentError = class extends AISDKError18 {\n constructor({\n content,\n cause,\n message = `Invalid data content. Expected a base64 string, Uint8Array, ArrayBuffer, or Buffer, but got ${typeof content}.`\n }) {\n super({ name: name17, message, cause });\n this[_a17] = true;\n this.content = content;\n }\n static isInstance(error) {\n return AISDKError18.hasMarker(error, marker17);\n }\n};\n_a17 = symbol17;\n\n// src/prompt/invalid-message-role-error.ts\nimport { AISDKError as AISDKError19 } from \"@ai-sdk/provider\";\nvar name18 = \"AI_InvalidMessageRoleError\";\nvar marker18 = `vercel.ai.error.${name18}`;\nvar symbol18 = Symbol.for(marker18);\nvar _a18;\nvar InvalidMessageRoleError = class extends AISDKError19 {\n constructor({\n role,\n message = `Invalid message role: '${role}'. Must be one of: \"system\", \"user\", \"assistant\", \"tool\".`\n }) {\n super({ name: name18, message });\n this[_a18] = true;\n this.role = role;\n }\n static isInstance(error) {\n return AISDKError19.hasMarker(error, marker18);\n }\n};\n_a18 = symbol18;\n\n// src/prompt/message-conversion-error.ts\nimport { AISDKError as AISDKError20 } from \"@ai-sdk/provider\";\nvar name19 = \"AI_MessageConversionError\";\nvar marker19 = `vercel.ai.error.${name19}`;\nvar symbol19 = Symbol.for(marker19);\nvar _a19;\nvar MessageConversionError = class extends AISDKError20 {\n constructor({\n originalMessage,\n message\n }) {\n super({ name: name19, message });\n this[_a19] = true;\n this.originalMessage = originalMessage;\n }\n static isInstance(error) {\n return AISDKError20.hasMarker(error, marker19);\n }\n};\n_a19 = symbol19;\n\n// src/error/index.ts\nimport { DownloadError } from \"@ai-sdk/provider-utils\";\n\n// src/util/retry-error.ts\nimport { AISDKError as AISDKError21 } from \"@ai-sdk/provider\";\nvar name20 = \"AI_RetryError\";\nvar marker20 = `vercel.ai.error.${name20}`;\nvar symbol20 = Symbol.for(marker20);\nvar _a20;\nvar RetryError = class extends AISDKError21 {\n constructor({\n message,\n reason,\n errors\n }) {\n super({ name: name20, message });\n this[_a20] = true;\n this.reason = reason;\n this.errors = errors;\n this.lastError = errors[errors.length - 1];\n }\n static isInstance(error) {\n return AISDKError21.hasMarker(error, marker20);\n }\n};\n_a20 = symbol20;\n\n// src/logger/log-warnings.ts\nfunction formatWarning({\n warning,\n provider,\n model\n}) {\n const scope = provider != null && model != null ? ` (${provider} / ${model})` : \"\";\n const prefix = `AI SDK Warning${scope}:`;\n switch (warning.type) {\n case \"unsupported\": {\n let message = `${prefix} The feature \"${warning.feature}\" is not supported.`;\n if (warning.details) {\n message += ` ${warning.details}`;\n }\n return message;\n }\n case \"compatibility\": {\n let message = `${prefix} The feature \"${warning.feature}\" is used in a compatibility mode.`;\n if (warning.details) {\n message += ` ${warning.details}`;\n }\n return message;\n }\n case \"deprecated\": {\n return `${prefix} Deprecated: \"${warning.setting}\". ${warning.message}`;\n }\n case \"other\": {\n return `${prefix} ${warning.message}`;\n }\n default: {\n return `${prefix} ${JSON.stringify(warning, null, 2)}`;\n }\n }\n}\nvar FIRST_WARNING_INFO_MESSAGE = \"AI SDK Warning System: To turn off warning logging, set the AI_SDK_LOG_WARNINGS global to false.\";\nvar hasLoggedBefore = false;\nvar logWarnings = (options) => {\n if (options.warnings.length === 0) {\n return;\n }\n const logger = globalThis.AI_SDK_LOG_WARNINGS;\n if (logger === false) {\n return;\n }\n if (typeof logger === \"function\") {\n logger(options);\n return;\n }\n if (!hasLoggedBefore) {\n hasLoggedBefore = true;\n console.info(FIRST_WARNING_INFO_MESSAGE);\n }\n for (const warning of options.warnings) {\n const message = formatWarning({\n warning,\n provider: options.provider,\n model: options.model\n });\n if (typeof process !== \"undefined\" && typeof process.emitWarning === \"function\") {\n process.emitWarning(message, {\n type: warning.type === \"deprecated\" ? \"DeprecationWarning\" : \"Warning\"\n });\n } else {\n console.warn(message);\n }\n }\n};\n\n// src/model/resolve-model.ts\nimport { gateway } from \"@ai-sdk/gateway\";\n\n// src/util/log-v2-compatibility-warning.ts\nfunction logV2CompatibilityWarning({\n provider,\n modelId\n}) {\n logWarnings({\n warnings: [\n {\n type: \"compatibility\",\n feature: \"specificationVersion\",\n details: `Using v2 specification compatibility mode. Some features may not be available.`\n }\n ],\n provider,\n model: modelId\n });\n}\n\n// src/model/as-embedding-model-v3.ts\nfunction asEmbeddingModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-embedding-model-v4.ts\nfunction asEmbeddingModelV4(model) {\n if (model.specificationVersion === \"v4\") {\n return model;\n }\n const v3Model = model.specificationVersion === \"v2\" ? asEmbeddingModelV3(model) : model;\n return new Proxy(v3Model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v4\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-image-model-v3.ts\nfunction asImageModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-image-model-v4.ts\nfunction asImageModelV4(model) {\n if (model.specificationVersion === \"v4\") {\n return model;\n }\n const v3Model = model.specificationVersion === \"v2\" ? asImageModelV3(model) : model;\n return new Proxy(v3Model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v4\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-language-model-v3.ts\nfunction asLanguageModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n switch (prop) {\n case \"specificationVersion\":\n return \"v3\";\n case \"doGenerate\":\n return async (...args) => {\n const result = await target.doGenerate(...args);\n return {\n ...result,\n finishReason: convertV2FinishReasonToV3(result.finishReason),\n usage: convertV2UsageToV3(result.usage)\n };\n };\n case \"doStream\":\n return async (...args) => {\n const result = await target.doStream(...args);\n return {\n ...result,\n stream: convertV2StreamToV3(result.stream)\n };\n };\n default:\n return target[prop];\n }\n }\n });\n}\nfunction convertV2StreamToV3(stream) {\n return stream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"finish\":\n controller.enqueue({\n ...chunk,\n finishReason: convertV2FinishReasonToV3(chunk.finishReason),\n usage: convertV2UsageToV3(chunk.usage)\n });\n break;\n default:\n controller.enqueue(chunk);\n break;\n }\n }\n })\n );\n}\nfunction convertV2FinishReasonToV3(finishReason) {\n return {\n unified: finishReason === \"unknown\" ? \"other\" : finishReason,\n raw: void 0\n };\n}\nfunction convertV2UsageToV3(usage) {\n return {\n inputTokens: {\n total: usage.inputTokens,\n noCache: void 0,\n cacheRead: usage.cachedInputTokens,\n cacheWrite: void 0\n },\n outputTokens: {\n total: usage.outputTokens,\n text: void 0,\n reasoning: usage.reasoningTokens\n }\n };\n}\n\n// src/model/as-language-model-v4.ts\nfunction asLanguageModelV4(model) {\n if (model.specificationVersion === \"v4\") {\n return model;\n }\n const v3Model = model.specificationVersion === \"v2\" ? asLanguageModelV3(model) : model;\n return new Proxy(v3Model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v4\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-reranking-model-v4.ts\nfunction asRerankingModelV4(model) {\n if (model.specificationVersion === \"v4\") {\n return model;\n }\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v4\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-speech-model-v3.ts\nfunction asSpeechModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-speech-model-v4.ts\nfunction asSpeechModelV4(model) {\n if (model.specificationVersion === \"v4\") {\n return model;\n }\n const v3Model = model.specificationVersion === \"v2\" ? asSpeechModelV3(model) : model;\n return new Proxy(v3Model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v4\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-transcription-model-v3.ts\nfunction asTranscriptionModelV3(model) {\n if (model.specificationVersion === \"v3\") {\n return model;\n }\n logV2CompatibilityWarning({\n provider: model.provider,\n modelId: model.modelId\n });\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v3\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-transcription-model-v4.ts\nfunction asTranscriptionModelV4(model) {\n if (model.specificationVersion === \"v4\") {\n return model;\n }\n const v3Model = model.specificationVersion === \"v2\" ? asTranscriptionModelV3(model) : model;\n return new Proxy(v3Model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v4\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-video-model-v4.ts\nfunction asVideoModelV4(model) {\n if (model.specificationVersion === \"v4\") {\n return model;\n }\n return new Proxy(model, {\n get(target, prop) {\n if (prop === \"specificationVersion\")\n return \"v4\";\n return target[prop];\n }\n });\n}\n\n// src/model/as-provider-v3.ts\nfunction asProviderV3(provider) {\n if (\"specificationVersion\" in provider && provider.specificationVersion === \"v3\") {\n return provider;\n }\n const v2Provider = provider;\n return {\n specificationVersion: \"v3\",\n languageModel: (modelId) => asLanguageModelV3(v2Provider.languageModel(modelId)),\n embeddingModel: (modelId) => asEmbeddingModelV3(v2Provider.textEmbeddingModel(modelId)),\n imageModel: (modelId) => asImageModelV3(v2Provider.imageModel(modelId)),\n transcriptionModel: v2Provider.transcriptionModel ? (modelId) => asTranscriptionModelV3(v2Provider.transcriptionModel(modelId)) : void 0,\n speechModel: v2Provider.speechModel ? (modelId) => asSpeechModelV3(v2Provider.speechModel(modelId)) : void 0,\n rerankingModel: void 0\n // v2 providers don't have reranking models\n };\n}\n\n// src/model/as-provider-v4.ts\nfunction asProviderV4(provider) {\n if (\"specificationVersion\" in provider && provider.specificationVersion === \"v4\") {\n return provider;\n }\n const v3Provider = !(\"specificationVersion\" in provider) || provider.specificationVersion !== \"v3\" ? asProviderV3(provider) : provider;\n return {\n specificationVersion: \"v4\",\n languageModel: (modelId) => asLanguageModelV4(v3Provider.languageModel(modelId)),\n embeddingModel: (modelId) => asEmbeddingModelV4(v3Provider.embeddingModel(modelId)),\n imageModel: (modelId) => asImageModelV4(v3Provider.imageModel(modelId)),\n transcriptionModel: v3Provider.transcriptionModel ? (modelId) => asTranscriptionModelV4(v3Provider.transcriptionModel(modelId)) : void 0,\n speechModel: v3Provider.speechModel ? (modelId) => asSpeechModelV4(v3Provider.speechModel(modelId)) : void 0,\n rerankingModel: v3Provider.rerankingModel ? (modelId) => asRerankingModelV4(v3Provider.rerankingModel(modelId)) : void 0\n };\n}\n\n// src/model/resolve-model.ts\nfunction resolveLanguageModel(model) {\n if (typeof model === \"string\") {\n return getGlobalProvider().languageModel(model);\n }\n if (![\"v4\", \"v3\", \"v2\"].includes(model.specificationVersion)) {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asLanguageModelV4(model);\n}\nfunction resolveEmbeddingModel(model) {\n if (typeof model === \"string\") {\n return getGlobalProvider().embeddingModel(model);\n }\n if (![\"v4\", \"v3\", \"v2\"].includes(model.specificationVersion)) {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asEmbeddingModelV4(model);\n}\nfunction resolveTranscriptionModel(model) {\n var _a22, _b;\n if (typeof model === \"string\") {\n return (_b = (_a22 = getGlobalProvider()).transcriptionModel) == null ? void 0 : _b.call(_a22, model);\n }\n if (![\"v4\", \"v3\", \"v2\"].includes(model.specificationVersion)) {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asTranscriptionModelV4(model);\n}\nfunction resolveSpeechModel(model) {\n var _a22, _b;\n if (typeof model === \"string\") {\n return (_b = (_a22 = getGlobalProvider()).speechModel) == null ? void 0 : _b.call(_a22, model);\n }\n if (![\"v4\", \"v3\", \"v2\"].includes(model.specificationVersion)) {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asSpeechModelV4(model);\n}\nfunction resolveImageModel(model) {\n if (typeof model === \"string\") {\n return getGlobalProvider().imageModel(model);\n }\n if (![\"v4\", \"v3\", \"v2\"].includes(model.specificationVersion)) {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asImageModelV4(model);\n}\nfunction resolveVideoModel(model) {\n var _a22;\n if (typeof model === \"string\") {\n const provider = (_a22 = globalThis.AI_SDK_DEFAULT_PROVIDER) != null ? _a22 : gateway;\n const videoModel = provider.videoModel;\n if (!videoModel) {\n throw new Error(\n 'The default provider does not support video models. Please use a Experimental_VideoModelV4 object from a provider (e.g., vertex.video(\"model-id\")).'\n );\n }\n return videoModel(model);\n }\n if (![\"v4\", \"v3\"].includes(model.specificationVersion)) {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asVideoModelV4(model);\n}\nfunction resolveRerankingModel(model) {\n if (typeof model === \"string\") {\n const provider = getGlobalProvider();\n const rerankingModel = provider.rerankingModel;\n if (!rerankingModel) {\n throw new Error(\n 'The default provider does not support reranking models. Please use a RerankingModel object from a provider (e.g., gateway.rerankingModel(\"model-id\")).'\n );\n }\n return rerankingModel(model);\n }\n if (model.specificationVersion !== \"v4\" && model.specificationVersion !== \"v3\") {\n const unsupportedModel = model;\n throw new UnsupportedModelVersionError({\n version: unsupportedModel.specificationVersion,\n provider: unsupportedModel.provider,\n modelId: unsupportedModel.modelId\n });\n }\n return asRerankingModelV4(model);\n}\nfunction getGlobalProvider() {\n var _a22;\n const provider = (_a22 = globalThis.AI_SDK_DEFAULT_PROVIDER) != null ? _a22 : gateway;\n return asProviderV4(provider);\n}\n\n// src/prompt/clone-model-message.ts\nfunction cloneModelMessages(messages) {\n return messages.map((message) => cloneValue(message));\n}\nfunction cloneValue(value) {\n if (value instanceof URL) {\n return new URL(value.href);\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneValue(item));\n }\n if (value instanceof Uint8Array) {\n return new Uint8Array(value);\n }\n if (value instanceof ArrayBuffer) {\n return value.slice(0);\n }\n if (value instanceof Date) {\n return new Date(value);\n }\n if (value != null && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value).map(([key, value2]) => [key, cloneValue(value2)])\n );\n }\n return value;\n}\n\n// src/prompt/convert-to-language-model-prompt.ts\nimport {\n asArray,\n detectMediaType,\n isFullMediaType,\n isUrlSupported\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/download/download.ts\nimport {\n cancelResponseBody,\n DownloadError as DownloadError2,\n readResponseWithSizeLimit,\n DEFAULT_MAX_DOWNLOAD_SIZE,\n fetchWithValidatedRedirects,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent\n} from \"@ai-sdk/provider-utils\";\n\n// src/version.ts\nvar VERSION = true ? \"7.0.31\" : \"0.0.0-test\";\n\n// src/util/download/download.ts\nvar download = async ({\n url,\n maxBytes,\n abortSignal\n}) => {\n var _a22;\n const urlText = url.toString();\n try {\n const headers = withUserAgentSuffix(\n {},\n `ai-sdk/${VERSION}`,\n getRuntimeEnvironmentUserAgent()\n );\n const response = await fetchWithValidatedRedirects({\n url: urlText,\n headers,\n abortSignal\n });\n if (!response.ok) {\n await cancelResponseBody(response);\n throw new DownloadError2({\n url: urlText,\n statusCode: response.status,\n statusText: response.statusText\n });\n }\n const data = await readResponseWithSizeLimit({\n response,\n url: urlText,\n maxBytes: maxBytes != null ? maxBytes : DEFAULT_MAX_DOWNLOAD_SIZE\n });\n return {\n data,\n mediaType: (_a22 = response.headers.get(\"content-type\")) != null ? _a22 : void 0\n };\n } catch (error) {\n if (DownloadError2.isInstance(error)) {\n throw error;\n }\n throw new DownloadError2({ url: urlText, cause: error });\n }\n};\n\n// src/util/download/download-function.ts\nvar createDefaultDownloadFunction = (download2 = download) => (requestedDownloads) => Promise.all(\n requestedDownloads.map(\n async (requestedDownload) => requestedDownload.isUrlSupportedByModel ? null : await download2(requestedDownload)\n )\n);\n\n// src/prompt/file-part-data.ts\nimport {\n isBuffer,\n isProviderReference\n} from \"@ai-sdk/provider-utils\";\n\n// src/prompt/split-data-url.ts\nfunction splitDataUrl(dataUrl) {\n try {\n const [header, base64Content] = dataUrl.split(\",\");\n return {\n mediaType: header.split(\";\")[0].split(\":\")[1],\n base64Content\n };\n } catch (e) {\n return {\n mediaType: void 0,\n base64Content: void 0\n };\n }\n}\n\n// src/prompt/file-part-data.ts\nfunction isTaggedFileData(value) {\n if (typeof value !== \"object\" || value === null)\n return false;\n const type = value.type;\n return type === \"data\" || type === \"url\" || type === \"reference\" || type === \"text\";\n}\nfunction convertUrlToFilePartData(url) {\n if (url.protocol === \"data:\") {\n const { mediaType, base64Content } = splitDataUrl(url.toString());\n if (mediaType == null || base64Content == null) {\n throw new InvalidDataContentError({\n content: url,\n message: `Invalid data URL format in content ${url.toString()}`\n });\n }\n return { data: { type: \"data\", data: base64Content }, mediaType };\n }\n return { data: { type: \"url\", url }, mediaType: void 0 };\n}\nfunction convertInlineDataToFilePartData(content) {\n if (content instanceof Uint8Array) {\n return { data: { type: \"data\", data: content }, mediaType: void 0 };\n }\n if (content instanceof ArrayBuffer) {\n return {\n data: { type: \"data\", data: new Uint8Array(content) },\n mediaType: void 0\n };\n }\n if (isBuffer(content)) {\n return {\n data: { type: \"data\", data: new Uint8Array(content) },\n mediaType: void 0\n };\n }\n return {\n data: { type: \"data\", data: content },\n mediaType: void 0\n };\n}\nfunction convertToLanguageModelV4FilePart(content) {\n if (isTaggedFileData(content)) {\n switch (content.type) {\n case \"data\":\n if (typeof content.data === \"string\" && content.data.startsWith(\"data:\")) {\n throw new InvalidDataContentError({\n content: content.data,\n message: 'Data URLs are not valid inline data. Pass them as { type: \"url\", url } instead.'\n });\n }\n return convertInlineDataToFilePartData(content.data);\n case \"url\":\n return convertUrlToFilePartData(content.url);\n case \"reference\":\n return {\n data: { type: \"reference\", reference: content.reference },\n mediaType: void 0\n };\n case \"text\":\n return {\n data: { type: \"text\", text: content.text },\n mediaType: void 0\n };\n }\n }\n if (content instanceof URL) {\n return convertUrlToFilePartData(content);\n }\n if (typeof content === \"string\") {\n try {\n return convertUrlToFilePartData(new URL(content));\n } catch (e) {\n return convertInlineDataToFilePartData(content);\n }\n }\n if (isProviderReference(content)) {\n return {\n data: { type: \"reference\", reference: content },\n mediaType: void 0\n };\n }\n return convertInlineDataToFilePartData(content);\n}\n\n// src/prompt/convert-to-language-model-prompt.ts\nasync function convertToLanguageModelPrompt({\n prompt,\n supportedUrls,\n download: download2 = createDefaultDownloadFunction(),\n // `provider` is only needed here to convert legacy tool output types via `mapToolResultOutput`.\n // TODO: remove in v8 when \"file-id\" and \"image-file-id\" types are removed\n provider\n}) {\n const downloadedAssets = await downloadAssets(\n prompt.messages,\n download2,\n supportedUrls\n );\n const approvalIdToToolCallId = /* @__PURE__ */ new Map();\n for (const message of prompt.messages) {\n if (message.role === \"assistant\" && Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type === \"tool-approval-request\" && \"approvalId\" in part && \"toolCallId\" in part) {\n approvalIdToToolCallId.set(\n part.approvalId,\n part.toolCallId\n );\n }\n }\n }\n }\n const approvedToolCallIds = /* @__PURE__ */ new Set();\n for (const message of prompt.messages) {\n if (message.role === \"tool\") {\n for (const part of message.content) {\n if (part.type === \"tool-approval-response\") {\n const toolCallId = approvalIdToToolCallId.get(part.approvalId);\n if (toolCallId) {\n approvedToolCallIds.add(toolCallId);\n }\n }\n }\n }\n }\n const messages = [\n ...prompt.instructions != null ? typeof prompt.instructions === \"string\" ? [{ role: \"system\", content: prompt.instructions }] : asArray(prompt.instructions).map((message) => ({\n role: \"system\",\n content: message.content,\n providerOptions: message.providerOptions\n })) : [],\n ...prompt.messages.map(\n (message) => convertToLanguageModelMessage({ message, downloadedAssets, provider })\n )\n ];\n const combinedMessages = [];\n for (const message of messages) {\n if (message.role !== \"tool\") {\n combinedMessages.push(message);\n continue;\n }\n const lastCombinedMessage = combinedMessages.at(-1);\n if ((lastCombinedMessage == null ? void 0 : lastCombinedMessage.role) === \"tool\") {\n lastCombinedMessage.content.push(...message.content);\n } else {\n combinedMessages.push(message);\n }\n }\n const toolCallIds = /* @__PURE__ */ new Set();\n for (const message of combinedMessages) {\n switch (message.role) {\n case \"assistant\": {\n for (const content of message.content) {\n if (content.type === \"tool-call\" && !content.providerExecuted) {\n toolCallIds.add(content.toolCallId);\n }\n }\n break;\n }\n case \"tool\": {\n for (const content of message.content) {\n if (content.type === \"tool-result\") {\n toolCallIds.delete(content.toolCallId);\n }\n }\n break;\n }\n case \"user\":\n case \"system\":\n for (const id of approvedToolCallIds) {\n toolCallIds.delete(id);\n }\n if (toolCallIds.size > 0) {\n throw new MissingToolResultsError({\n toolCallIds: Array.from(toolCallIds)\n });\n }\n break;\n }\n }\n for (const id of approvedToolCallIds) {\n toolCallIds.delete(id);\n }\n if (toolCallIds.size > 0) {\n throw new MissingToolResultsError({ toolCallIds: Array.from(toolCallIds) });\n }\n return combinedMessages.filter(\n // Filter out empty tool messages (e.g. if they only contained\n // tool-approval-response parts that were removed).\n // This prevents sending invalid empty messages to the provider.\n // Note: provider-executed tool-approval-response parts are preserved.\n (message) => message.role !== \"tool\" || message.content.length > 0\n );\n}\nfunction convertToLanguageModelMessage({\n message,\n downloadedAssets,\n // `provider` is only needed here to convert legacy tool output types via `mapToolResultOutput`.\n // TODO: remove in v8 when \"file-id\" and \"image-file-id\" types are removed\n provider\n}) {\n const warnings = [];\n const role = message.role;\n switch (role) {\n case \"system\": {\n return {\n role: \"system\",\n content: message.content,\n providerOptions: message.providerOptions\n };\n }\n case \"user\": {\n if (typeof message.content === \"string\") {\n return {\n role: \"user\",\n content: [{ type: \"text\", text: message.content }],\n providerOptions: message.providerOptions\n };\n }\n const converted = {\n role: \"user\",\n content: message.content.map((part) => {\n if (part.type === \"image\") {\n warnings.push({\n type: \"deprecated\",\n setting: '\"image\" content part',\n message: `The \"image\" content part type is deprecated. Use a \"file\" part with mediaType: 'image' (or a more specific image/* subtype) instead.`\n });\n }\n return convertImagePartToFilePart(part);\n }).map((part) => convertPartToLanguageModelPart(part, downloadedAssets)).filter((part) => part.type !== \"text\" || part.text !== \"\"),\n providerOptions: message.providerOptions\n };\n if (warnings.length > 0) {\n logWarnings({ warnings });\n }\n return converted;\n }\n case \"assistant\": {\n if (typeof message.content === \"string\") {\n return {\n role: \"assistant\",\n content: [{ type: \"text\", text: message.content }],\n providerOptions: message.providerOptions\n };\n }\n const converted = {\n role: \"assistant\",\n content: message.content.filter(\n // remove empty text parts (no text, and no provider options):\n (part) => part.type !== \"text\" || part.text !== \"\" || part.providerOptions != null\n ).filter(\n (part) => part.type !== \"tool-approval-request\"\n ).map((part) => {\n const providerOptions = part.providerOptions;\n switch (part.type) {\n case \"custom\": {\n return {\n type: \"custom\",\n kind: part.kind,\n providerOptions\n };\n }\n case \"file\": {\n const { data, mediaType } = convertToLanguageModelV4FilePart(\n part.data\n );\n return {\n type: \"file\",\n data,\n filename: part.filename,\n mediaType: mediaType != null ? mediaType : part.mediaType,\n providerOptions\n };\n }\n case \"reasoning\": {\n return {\n type: \"reasoning\",\n text: part.text,\n providerOptions\n };\n }\n case \"reasoning-file\": {\n const { data, mediaType } = convertToLanguageModelV4FilePart(\n part.data\n );\n if (data.type !== \"data\" && data.type !== \"url\") {\n throw new Error(\n `Unsupported reasoning-file data type: ${data.type}`\n );\n }\n return {\n type: \"reasoning-file\",\n data,\n mediaType: mediaType != null ? mediaType : part.mediaType,\n providerOptions\n };\n }\n case \"text\": {\n return {\n type: \"text\",\n text: part.text,\n providerOptions\n };\n }\n case \"tool-call\": {\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n providerExecuted: part.providerExecuted,\n providerOptions\n };\n }\n case \"tool-result\": {\n return {\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: mapToolResultOutput({\n output: part.output,\n provider,\n warnings,\n downloadedAssets\n }),\n providerOptions\n };\n }\n }\n }),\n providerOptions: message.providerOptions\n };\n if (warnings.length > 0) {\n logWarnings({ warnings });\n }\n return converted;\n }\n case \"tool\": {\n const converted = {\n role: \"tool\",\n content: message.content.filter(\n // Only include tool-approval-response for provider-executed tools\n (part) => part.type !== \"tool-approval-response\" || part.providerExecuted\n ).map((part) => {\n switch (part.type) {\n case \"tool-result\": {\n return {\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: mapToolResultOutput({\n output: part.output,\n provider,\n warnings,\n downloadedAssets\n }),\n providerOptions: part.providerOptions\n };\n }\n case \"tool-approval-response\": {\n return {\n type: \"tool-approval-response\",\n approvalId: part.approvalId,\n approved: part.approved,\n reason: part.reason\n };\n }\n }\n }),\n providerOptions: message.providerOptions\n };\n if (warnings.length > 0) {\n logWarnings({ warnings });\n }\n return converted;\n }\n default: {\n const _exhaustiveCheck = role;\n throw new InvalidMessageRoleError({ role: _exhaustiveCheck });\n }\n }\n}\nfunction convertImagePartToFilePart(part) {\n var _a22;\n if (part.type !== \"image\") {\n return part;\n }\n return {\n type: \"file\",\n data: part.image,\n mediaType: (_a22 = part.mediaType) != null ? _a22 : \"image\",\n providerOptions: part.providerOptions\n };\n}\nasync function downloadAssets(messages, download2, supportedUrls) {\n const downloadableFiles = [];\n for (const message of messages) {\n if (message.role === \"user\" && Array.isArray(message.content)) {\n for (const part of message.content) {\n const filePart = convertImagePartToFilePart(part);\n if (filePart.type === \"file\") {\n downloadableFiles.push(filePart);\n }\n }\n }\n if (message.role === \"tool\") {\n for (const part of message.content) {\n if (part.type !== \"tool-result\") {\n continue;\n }\n if (part.output.type !== \"content\") {\n continue;\n }\n for (const contentPart of part.output.value) {\n if (contentPart.type === \"file\") {\n downloadableFiles.push(contentPart);\n }\n }\n }\n }\n if (message.role === \"assistant\" && Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type !== \"tool-result\") {\n continue;\n }\n if (part.output.type !== \"content\") {\n continue;\n }\n for (const contentPart of part.output.value) {\n if (contentPart.type === \"file\") {\n downloadableFiles.push(contentPart);\n }\n }\n }\n }\n }\n const plannedDownloads = downloadableFiles.map((part) => {\n const mediaType = part.mediaType;\n const { data } = convertToLanguageModelV4FilePart(part.data);\n return { mediaType, data };\n }).filter((part) => part.data.type === \"url\").map((part) => ({\n url: part.data.url,\n isUrlSupportedByModel: part.mediaType != null && isUrlSupported({\n url: part.data.url.toString(),\n mediaType: part.mediaType,\n supportedUrls\n })\n }));\n const downloadedFiles = await download2(plannedDownloads);\n return Object.fromEntries(\n downloadedFiles.map(\n (file, index) => file == null ? null : [\n plannedDownloads[index].url.toString(),\n { data: file.data, mediaType: file.mediaType }\n ]\n ).filter((file) => file != null)\n );\n}\nfunction convertPartToLanguageModelPart(part, downloadedAssets) {\n if (part.type === \"text\") {\n return {\n type: \"text\",\n text: part.text,\n providerOptions: part.providerOptions\n };\n }\n const { data: normalizedData, mediaType: dataUrlMediaType } = convertToLanguageModelV4FilePart(part.data);\n let mediaType = dataUrlMediaType != null ? dataUrlMediaType : part.mediaType;\n let data = normalizedData;\n if (data.type === \"url\") {\n const downloadedFile = downloadedAssets[data.url.toString()];\n if (downloadedFile) {\n data = { type: \"data\", data: downloadedFile.data };\n if (downloadedFile.mediaType != null && (mediaType == null || !isFullMediaType(mediaType))) {\n mediaType = downloadedFile.mediaType;\n }\n }\n }\n if (data.type === \"data\" && (data.data instanceof Uint8Array || typeof data.data === \"string\")) {\n const imageMediaType = detectMediaType({\n data: data.data,\n topLevelType: \"image\"\n });\n if (imageMediaType != null) {\n mediaType = imageMediaType;\n }\n }\n if (mediaType == null) {\n throw new Error(`Media type is missing for file part`);\n }\n return {\n type: \"file\",\n mediaType,\n filename: part.filename,\n data,\n providerOptions: part.providerOptions\n };\n}\nfunction mapToolResultOutput({\n output,\n // `provider` is only needed here to convert legacy \"file-id\" and \"image-file-id\" types to provider references, in case they are using string ID values.\n // TODO: remove in v8 when \"file-id\" and \"image-file-id\" types are removed\n provider,\n warnings = [],\n downloadedAssets\n}) {\n if (output.type !== \"content\") {\n return output;\n }\n return {\n type: \"content\",\n value: output.value.map((item) => {\n var _a22;\n switch (item.type) {\n case \"file\": {\n const convertedPart = convertPartToLanguageModelPart(\n item,\n downloadedAssets\n );\n if (convertedPart.type !== \"file\") {\n throw new Error(\n \"Expected tool result file content to convert to file.\"\n );\n }\n return convertedPart;\n }\n case \"file-data\": {\n warnings.push({\n type: \"deprecated\",\n setting: '\"tool-result\" content of type \"file-data\"',\n message: `The \"file-data\" type for tool result content is deprecated. Use the \"file\" type with mediaType and { type: 'data', data } instead.`\n });\n return {\n type: \"file\",\n data: { type: \"data\", data: item.data },\n filename: item.filename,\n mediaType: item.mediaType,\n providerOptions: item.providerOptions\n };\n }\n case \"file-url\": {\n const mediaType = (_a22 = item.mediaType) != null ? _a22 : getMediaTypeFromUrl(item.url);\n let message = `The \"file-url\" type for tool result content is deprecated. Use the \"file\" type with mediaType and { type: 'url', url } instead.`;\n if (!item.mediaType) {\n const inferenceSuffix = mediaType === \"application/octet-stream\" ? `Unable to infer media type from URL. Defaulting to 'application/octet-stream'.` : `Inferred media type '${mediaType}' from URL.`;\n message = `The \"file-url\" tool result content part with URL \"${item.url}\" is missing a \"mediaType\". ${inferenceSuffix} ${message}`;\n }\n warnings.push({\n type: \"deprecated\",\n setting: '\"tool-result\" content of type \"file-url\"',\n message\n });\n return {\n type: \"file\",\n data: { type: \"url\", url: new URL(item.url) },\n mediaType,\n providerOptions: item.providerOptions\n };\n }\n case \"file-id\": {\n warnings.push({\n type: \"deprecated\",\n setting: '\"tool-result\" content of type \"file-id\"',\n message: `The \"file-id\" type for tool result content is deprecated. Use the \"file\" type with mediaType and { type: 'reference', reference } instead.`\n });\n return {\n type: \"file\",\n data: {\n type: \"reference\",\n reference: convertFileIdToProviderReference({\n fileId: item.fileId,\n provider\n })\n },\n mediaType: \"application\",\n providerOptions: item.providerOptions\n };\n }\n case \"file-reference\": {\n warnings.push({\n type: \"deprecated\",\n setting: '\"tool-result\" content of type \"file-reference\"',\n message: `The \"file-reference\" type for tool result content is deprecated. Use the \"file\" type with mediaType and { type: 'reference', reference } instead.`\n });\n return {\n type: \"file\",\n data: {\n type: \"reference\",\n reference: item.providerReference\n },\n mediaType: \"application\",\n providerOptions: item.providerOptions\n };\n }\n case \"image-data\": {\n warnings.push({\n type: \"deprecated\",\n setting: '\"tool-result\" content of type \"image-data\"',\n message: `The \"image-data\" type for tool result content is deprecated. Use the \"file\" type with mediaType and { type: 'data', data } instead.`\n });\n return {\n type: \"file\",\n data: { type: \"data\", data: item.data },\n mediaType: item.mediaType,\n providerOptions: item.providerOptions\n };\n }\n case \"image-url\": {\n warnings.push({\n type: \"deprecated\",\n setting: '\"tool-result\" content of type \"image-url\"',\n message: `The \"image-url\" type for tool result content is deprecated. Use the \"file\" type with mediaType 'image' (or a specific image/* subtype) and { type: 'url', url } instead.`\n });\n return {\n type: \"file\",\n data: { type: \"url\", url: new URL(item.url) },\n mediaType: \"image\",\n providerOptions: item.providerOptions\n };\n }\n case \"image-file-id\": {\n warnings.push({\n type: \"deprecated\",\n setting: '\"tool-result\" content of type \"image-file-id\"',\n message: `The \"image-file-id\" type for tool result content is deprecated. Use the \"file\" type with mediaType and { type: 'reference', reference } instead.`\n });\n return {\n type: \"file\",\n data: {\n type: \"reference\",\n reference: convertFileIdToProviderReference({\n fileId: item.fileId,\n provider\n })\n },\n mediaType: \"image\",\n providerOptions: item.providerOptions\n };\n }\n case \"image-file-reference\": {\n warnings.push({\n type: \"deprecated\",\n setting: '\"tool-result\" content of type \"image-file-reference\"',\n message: `The \"image-file-reference\" type for tool result content is deprecated. Use the \"file\" type with mediaType and { type: 'reference', reference } instead.`\n });\n return {\n type: \"file\",\n data: {\n type: \"reference\",\n reference: item.providerReference\n },\n mediaType: \"image\",\n providerOptions: item.providerOptions\n };\n }\n default:\n return item;\n }\n })\n };\n}\nfunction convertFileIdToProviderReference({\n fileId,\n provider\n}) {\n if (typeof fileId === \"object\") {\n return fileId;\n }\n if (provider == null) {\n throw new Error(\n \"Cannot convert string fileId to provider reference without a provider ID. Use a Record<string, string> fileId or switch to the file-reference type.\"\n );\n }\n return { [provider]: fileId };\n}\nvar URL_EXTENSION_TO_MEDIA_TYPE = {\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n avif: \"image/avif\",\n heic: \"image/heic\",\n bmp: \"image/bmp\",\n tiff: \"image/tiff\",\n tif: \"image/tiff\",\n pdf: \"application/pdf\",\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n ogg: \"audio/ogg\"\n};\nfunction getMediaTypeFromUrl(url, fallbackMediaType = \"application/octet-stream\") {\n var _a22;\n try {\n const pathname = new URL(url).pathname;\n const fileExtension = (_a22 = pathname.split(\".\").pop()) == null ? void 0 : _a22.toLowerCase();\n if (fileExtension && Object.hasOwn(URL_EXTENSION_TO_MEDIA_TYPE, fileExtension)) {\n return URL_EXTENSION_TO_MEDIA_TYPE[fileExtension];\n }\n } catch (e) {\n }\n return fallbackMediaType;\n}\n\n// src/prompt/create-tool-model-output.ts\nimport { getErrorMessage as getErrorMessage3 } from \"@ai-sdk/provider\";\nasync function createToolModelOutput({\n toolCallId,\n input,\n output,\n tool: tool2,\n errorMode\n}) {\n if (errorMode === \"text\") {\n return { type: \"error-text\", value: getErrorMessage3(output) };\n } else if (errorMode === \"json\") {\n return { type: \"error-json\", value: toJSONValue(output) };\n }\n if (tool2 == null ? void 0 : tool2.toModelOutput) {\n return await tool2.toModelOutput({ toolCallId, input, output });\n }\n return typeof output === \"string\" ? { type: \"text\", value: output } : { type: \"json\", value: toJSONValue(output) };\n}\nfunction toJSONValue(value) {\n return value === void 0 ? null : value;\n}\n\n// src/prompt/prepare-language-model-call-options.ts\nfunction prepareLanguageModelCallOptions({\n maxOutputTokens,\n temperature,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n seed,\n stopSequences,\n reasoning\n}) {\n if (maxOutputTokens != null) {\n if (!Number.isInteger(maxOutputTokens)) {\n throw new InvalidArgumentError({\n parameter: \"maxOutputTokens\",\n value: maxOutputTokens,\n message: \"maxOutputTokens must be an integer\"\n });\n }\n if (maxOutputTokens < 1) {\n throw new InvalidArgumentError({\n parameter: \"maxOutputTokens\",\n value: maxOutputTokens,\n message: \"maxOutputTokens must be >= 1\"\n });\n }\n }\n if (temperature != null) {\n if (typeof temperature !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"temperature\",\n value: temperature,\n message: \"temperature must be a number\"\n });\n }\n }\n if (topP != null) {\n if (typeof topP !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"topP\",\n value: topP,\n message: \"topP must be a number\"\n });\n }\n }\n if (topK != null) {\n if (typeof topK !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"topK\",\n value: topK,\n message: \"topK must be a number\"\n });\n }\n }\n if (presencePenalty != null) {\n if (typeof presencePenalty !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"presencePenalty\",\n value: presencePenalty,\n message: \"presencePenalty must be a number\"\n });\n }\n }\n if (frequencyPenalty != null) {\n if (typeof frequencyPenalty !== \"number\") {\n throw new InvalidArgumentError({\n parameter: \"frequencyPenalty\",\n value: frequencyPenalty,\n message: \"frequencyPenalty must be a number\"\n });\n }\n }\n if (seed != null) {\n if (!Number.isInteger(seed)) {\n throw new InvalidArgumentError({\n parameter: \"seed\",\n value: seed,\n message: \"seed must be an integer\"\n });\n }\n }\n return {\n maxOutputTokens,\n temperature,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n stopSequences,\n seed,\n reasoning\n };\n}\n\n// src/prompt/prepare-tool-choice.ts\nfunction prepareToolChoice({\n toolChoice\n}) {\n return toolChoice == null ? { type: \"auto\" } : typeof toolChoice === \"string\" ? { type: toolChoice } : { type: \"tool\", toolName: toolChoice.toolName };\n}\n\n// src/prompt/prepare-tools.ts\nimport {\n asSchema\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/is-non-empty-object.ts\nfunction isNonEmptyObject(object2) {\n return object2 != null && Object.keys(object2).length > 0;\n}\n\n// src/prompt/prepare-tools.ts\nasync function prepareTools({\n tools,\n toolOrder,\n toolsContext = {},\n experimental_sandbox: sandbox\n}) {\n if (!isNonEmptyObject(tools)) {\n return void 0;\n }\n const languageModelTools = [];\n for (const [name22, tool2] of orderToolEntries({ tools, toolOrder })) {\n const toolType = tool2.type;\n switch (toolType) {\n case void 0:\n case \"dynamic\":\n case \"function\": {\n const description = resolveToolDescription({\n tool: tool2,\n toolName: name22,\n toolsContext,\n experimental_sandbox: sandbox\n });\n const providerOptions = tool2.providerOptions;\n const inputExamples = tool2.inputExamples;\n const strict = tool2.strict;\n languageModelTools.push({\n type: \"function\",\n name: name22,\n inputSchema: await asSchema(tool2.inputSchema).jsonSchema,\n ...description != null ? { description } : {},\n ...inputExamples != null ? { inputExamples } : {},\n ...providerOptions != null ? { providerOptions } : {},\n ...strict != null ? { strict } : {}\n });\n break;\n }\n case \"provider\": {\n languageModelTools.push({\n type: \"provider\",\n name: name22,\n id: tool2.id,\n args: tool2.args\n });\n break;\n }\n default: {\n const exhaustiveCheck = toolType;\n throw new Error(`Unsupported tool type: ${exhaustiveCheck}`);\n }\n }\n }\n return languageModelTools;\n}\nfunction orderToolEntries({\n tools,\n toolOrder\n}) {\n if (toolOrder == null) {\n return Object.entries(tools);\n }\n const toolEntries = Object.entries(tools);\n const orderedTools = toolEntries.filter(([name22]) => toolOrder.includes(name22)).sort(\n ([nameA], [nameB]) => toolOrder.indexOf(nameA) - toolOrder.indexOf(nameB)\n );\n const unorderedTools = toolEntries.filter(([name22]) => !toolOrder.includes(name22)).sort(([nameA], [nameB]) => nameA < nameB ? -1 : nameA > nameB ? 1 : 0);\n return [...orderedTools, ...unorderedTools];\n}\nfunction resolveToolDescription({\n tool: tool2,\n toolName,\n toolsContext,\n experimental_sandbox: sandbox\n}) {\n return tool2.description === void 0 ? void 0 : typeof tool2.description === \"string\" ? tool2.description : tool2.description({\n context: toolsContext[toolName],\n experimental_sandbox: sandbox\n });\n}\n\n// src/prompt/request-options.ts\nfunction getTotalTimeoutMs(timeout) {\n if (timeout == null) {\n return void 0;\n }\n if (typeof timeout === \"number\") {\n return timeout;\n }\n return timeout.totalMs;\n}\nfunction getStepTimeoutMs(timeout) {\n if (timeout == null || typeof timeout === \"number\") {\n return void 0;\n }\n return timeout.stepMs;\n}\nfunction getChunkTimeoutMs(timeout) {\n if (timeout == null || typeof timeout === \"number\") {\n return void 0;\n }\n return timeout.chunkMs;\n}\nfunction getToolTimeoutMs(timeout, toolName) {\n var _a22, _b;\n if (timeout == null || typeof timeout === \"number\") {\n return void 0;\n }\n return (_b = (_a22 = timeout.tools) == null ? void 0 : _a22[`${toolName}Ms`]) != null ? _b : timeout.toolMs;\n}\n\n// src/prompt/standardize-prompt.ts\nimport { InvalidPromptError as InvalidPromptError2 } from \"@ai-sdk/provider\";\nimport {\n asArray as asArray2,\n safeValidateTypes\n} from \"@ai-sdk/provider-utils\";\nimport { z as z5 } from \"zod/v4\";\n\n// src/prompt/message.ts\nimport { z as z4 } from \"zod/v4\";\n\n// src/types/provider-metadata.ts\nimport { z as z2 } from \"zod/v4\";\n\n// src/types/json-value.ts\nimport { z } from \"zod/v4\";\nvar jsonValueSchema = z.lazy(\n () => z.union([\n z.null(),\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.string(), jsonValueSchema.optional()),\n z.array(jsonValueSchema)\n ])\n);\n\n// src/types/provider-metadata.ts\nvar providerMetadataSchema = z2.record(\n z2.string(),\n z2.record(z2.string(), jsonValueSchema.optional())\n);\n\n// src/prompt/content-part.ts\nimport {\n isBuffer as isBuffer2\n} from \"@ai-sdk/provider-utils\";\nimport { z as z3 } from \"zod/v4\";\nvar fileInlineDataSchema = z3.union([\n z3.string(),\n z3.instanceof(Uint8Array),\n z3.instanceof(ArrayBuffer),\n z3.custom(isBuffer2, { message: \"Must be a Buffer\" })\n]);\nvar providerReferenceSchema = z3.record(z3.string(), z3.string());\nvar textPartSchema = z3.object({\n type: z3.literal(\"text\"),\n text: z3.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar imagePartSchema = z3.object({\n type: z3.literal(\"image\"),\n image: z3.union([\n fileInlineDataSchema,\n z3.instanceof(URL),\n providerReferenceSchema\n ]),\n mediaType: z3.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar taggedFileDataSchema = z3.discriminatedUnion(\"type\", [\n z3.object({ type: z3.literal(\"data\"), data: fileInlineDataSchema }),\n z3.object({ type: z3.literal(\"url\"), url: z3.instanceof(URL) }),\n z3.object({\n type: z3.literal(\"reference\"),\n reference: providerReferenceSchema\n }),\n z3.object({ type: z3.literal(\"text\"), text: z3.string() })\n]);\nvar taggedReasoningFileDataSchema = z3.discriminatedUnion(\"type\", [\n z3.object({ type: z3.literal(\"data\"), data: fileInlineDataSchema }),\n z3.object({ type: z3.literal(\"url\"), url: z3.instanceof(URL) })\n]);\nvar filePartSchema = z3.object({\n type: z3.literal(\"file\"),\n data: z3.union([\n taggedFileDataSchema,\n fileInlineDataSchema,\n z3.instanceof(URL),\n providerReferenceSchema\n ]),\n filename: z3.string().optional(),\n mediaType: z3.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar reasoningPartSchema = z3.object({\n type: z3.literal(\"reasoning\"),\n text: z3.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar customPartSchema = z3.object({\n type: z3.literal(\"custom\"),\n kind: z3.string().transform((value) => value),\n providerOptions: providerMetadataSchema.optional()\n});\nvar reasoningFilePartSchema = z3.object({\n type: z3.literal(\"reasoning-file\"),\n data: z3.union([\n taggedReasoningFileDataSchema,\n fileInlineDataSchema,\n z3.instanceof(URL)\n ]),\n mediaType: z3.string(),\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolCallPartSchema = z3.object({\n type: z3.literal(\"tool-call\"),\n toolCallId: z3.string(),\n toolName: z3.string(),\n input: z3.unknown(),\n providerOptions: providerMetadataSchema.optional(),\n providerExecuted: z3.boolean().optional()\n});\nvar outputSchema = z3.discriminatedUnion(\n \"type\",\n [\n z3.object({\n type: z3.literal(\"text\"),\n value: z3.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n type: z3.literal(\"json\"),\n value: jsonValueSchema,\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n type: z3.literal(\"execution-denied\"),\n reason: z3.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n type: z3.literal(\"error-text\"),\n value: z3.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n type: z3.literal(\"error-json\"),\n value: jsonValueSchema,\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n type: z3.literal(\"content\"),\n value: z3.array(\n z3.union([\n z3.object({\n type: z3.literal(\"text\"),\n text: z3.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n type: z3.literal(\"file\"),\n data: taggedFileDataSchema,\n mediaType: z3.string(),\n filename: z3.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n // Deprecated.\n type: z3.literal(\"file-data\"),\n data: z3.string(),\n mediaType: z3.string(),\n filename: z3.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n // Deprecated.\n type: z3.literal(\"file-url\"),\n url: z3.string(),\n mediaType: z3.string().optional(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n // Deprecated.\n type: z3.literal(\"file-id\"),\n fileId: z3.union([z3.string(), z3.record(z3.string(), z3.string())]),\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n // Deprecated.\n type: z3.literal(\"file-reference\"),\n providerReference: z3.record(z3.string(), z3.string()),\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n // Deprecated.\n type: z3.literal(\"image-data\"),\n data: z3.string(),\n mediaType: z3.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n // Deprecated.\n type: z3.literal(\"image-url\"),\n url: z3.string(),\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n // Deprecated.\n type: z3.literal(\"image-file-id\"),\n fileId: z3.union([z3.string(), z3.record(z3.string(), z3.string())]),\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n // Deprecated.\n type: z3.literal(\"image-file-reference\"),\n providerReference: z3.record(z3.string(), z3.string()),\n providerOptions: providerMetadataSchema.optional()\n }),\n z3.object({\n type: z3.literal(\"custom\"),\n providerOptions: providerMetadataSchema.optional()\n })\n ])\n )\n })\n ]\n);\nvar toolResultPartSchema = z3.object({\n type: z3.literal(\"tool-result\"),\n toolCallId: z3.string(),\n toolName: z3.string(),\n output: outputSchema,\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolApprovalRequestSchema = z3.object({\n type: z3.literal(\"tool-approval-request\"),\n approvalId: z3.string(),\n toolCallId: z3.string()\n});\nvar toolApprovalResponseSchema = z3.object({\n type: z3.literal(\"tool-approval-response\"),\n approvalId: z3.string(),\n approved: z3.boolean(),\n reason: z3.string().optional()\n});\n\n// src/prompt/message.ts\nvar systemModelMessageSchema = z4.object(\n {\n role: z4.literal(\"system\"),\n content: z4.string(),\n providerOptions: providerMetadataSchema.optional()\n }\n);\nvar userModelMessageSchema = z4.object({\n role: z4.literal(\"user\"),\n content: z4.union([\n z4.string(),\n z4.array(z4.union([textPartSchema, imagePartSchema, filePartSchema]))\n ]),\n providerOptions: providerMetadataSchema.optional()\n});\nvar assistantModelMessageSchema = z4.object({\n role: z4.literal(\"assistant\"),\n content: z4.union([\n z4.string(),\n z4.array(\n z4.union([\n textPartSchema,\n customPartSchema,\n filePartSchema,\n reasoningPartSchema,\n reasoningFilePartSchema,\n toolCallPartSchema,\n toolResultPartSchema,\n toolApprovalRequestSchema\n ])\n )\n ]),\n providerOptions: providerMetadataSchema.optional()\n});\nvar toolModelMessageSchema = z4.object({\n role: z4.literal(\"tool\"),\n content: z4.array(z4.union([toolResultPartSchema, toolApprovalResponseSchema])),\n providerOptions: providerMetadataSchema.optional()\n});\nvar modelMessageSchema = z4.union([\n systemModelMessageSchema,\n userModelMessageSchema,\n assistantModelMessageSchema,\n toolModelMessageSchema\n]);\n\n// src/prompt/standardize-prompt.ts\nasync function standardizePrompt({\n allowSystemInMessages = false,\n system,\n instructions = system,\n prompt,\n messages\n}) {\n if (prompt == null && messages == null) {\n throw new InvalidPromptError2({\n prompt,\n message: \"prompt or messages must be defined\"\n });\n }\n if (prompt != null && messages != null) {\n throw new InvalidPromptError2({\n prompt,\n message: \"prompt and messages cannot be defined at the same time\"\n });\n }\n if (typeof instructions !== \"string\" && !asArray2(instructions).every((message) => message.role === \"system\")) {\n throw new InvalidPromptError2({\n prompt,\n message: \"instructions must be a string, SystemModelMessage, or array of SystemModelMessage\"\n });\n }\n if (prompt != null && typeof prompt === \"string\") {\n messages = [{ role: \"user\", content: prompt }];\n } else if (prompt != null && Array.isArray(prompt)) {\n messages = prompt;\n } else if (messages == null) {\n throw new InvalidPromptError2({\n prompt,\n message: \"prompt or messages must be defined\"\n });\n }\n if (messages.length === 0) {\n throw new InvalidPromptError2({\n prompt,\n message: \"messages must not be empty\"\n });\n }\n if (!allowSystemInMessages && messages.some((message) => message.role === \"system\")) {\n throw new InvalidPromptError2({\n prompt,\n message: \"System messages are not allowed in the prompt or messages fields. Use the instructions option instead.\"\n });\n }\n const validationResult = await safeValidateTypes({\n value: messages,\n schema: z5.array(modelMessageSchema)\n });\n if (!validationResult.success) {\n throw new InvalidPromptError2({\n prompt,\n message: \"The messages do not match the ModelMessage[] schema.\",\n cause: validationResult.error\n });\n }\n return { messages, instructions };\n}\n\n// src/prompt/wrap-gateway-error.ts\nimport { GatewayAuthenticationError } from \"@ai-sdk/gateway\";\nimport { AISDKError as AISDKError23 } from \"@ai-sdk/provider\";\nfunction wrapGatewayError(error) {\n if (!GatewayAuthenticationError.isInstance(error))\n return error;\n const isProductionEnv = (process == null ? void 0 : process.env.NODE_ENV) === \"production\";\n const moreInfoURL = \"https://ai-sdk.dev/unauthenticated-ai-gateway\";\n if (isProductionEnv) {\n return new AISDKError23({\n name: \"GatewayError\",\n message: `Unauthenticated. Configure AI_GATEWAY_API_KEY or use a provider module. Learn more: ${moreInfoURL}`\n });\n }\n return Object.assign(\n new Error(`\\x1B[1m\\x1B[31mUnauthenticated request to AI Gateway.\\x1B[0m\n\nTo authenticate, set the \\x1B[33mAI_GATEWAY_API_KEY\\x1B[0m environment variable with your API key.\n\nAlternatively, you can use a provider module instead of the AI Gateway.\n\nLearn more: \\x1B[34m${moreInfoURL}\\x1B[0m\n\n`),\n { name: \"GatewayAuthenticationError\" }\n );\n}\n\n// src/types/usage.ts\nfunction asLanguageModelUsage(usage) {\n return {\n inputTokens: usage.inputTokens.total,\n inputTokenDetails: {\n noCacheTokens: usage.inputTokens.noCache,\n cacheReadTokens: usage.inputTokens.cacheRead,\n cacheWriteTokens: usage.inputTokens.cacheWrite\n },\n outputTokens: usage.outputTokens.total,\n outputTokenDetails: {\n textTokens: usage.outputTokens.text,\n reasoningTokens: usage.outputTokens.reasoning\n },\n totalTokens: addTokenCounts(\n usage.inputTokens.total,\n usage.outputTokens.total\n ),\n raw: usage.raw\n };\n}\nfunction createNullLanguageModelUsage() {\n return {\n inputTokens: void 0,\n inputTokenDetails: {\n noCacheTokens: void 0,\n cacheReadTokens: void 0,\n cacheWriteTokens: void 0\n },\n outputTokens: void 0,\n outputTokenDetails: {\n textTokens: void 0,\n reasoningTokens: void 0\n },\n totalTokens: void 0,\n raw: void 0\n };\n}\nfunction addLanguageModelUsage(usage1, usage2) {\n var _a22, _b, _c, _d, _e, _f, _g, _h, _i, _j;\n return {\n inputTokens: addTokenCounts(usage1.inputTokens, usage2.inputTokens),\n inputTokenDetails: {\n noCacheTokens: addTokenCounts(\n (_a22 = usage1.inputTokenDetails) == null ? void 0 : _a22.noCacheTokens,\n (_b = usage2.inputTokenDetails) == null ? void 0 : _b.noCacheTokens\n ),\n cacheReadTokens: addTokenCounts(\n (_c = usage1.inputTokenDetails) == null ? void 0 : _c.cacheReadTokens,\n (_d = usage2.inputTokenDetails) == null ? void 0 : _d.cacheReadTokens\n ),\n cacheWriteTokens: addTokenCounts(\n (_e = usage1.inputTokenDetails) == null ? void 0 : _e.cacheWriteTokens,\n (_f = usage2.inputTokenDetails) == null ? void 0 : _f.cacheWriteTokens\n )\n },\n outputTokens: addTokenCounts(usage1.outputTokens, usage2.outputTokens),\n outputTokenDetails: {\n textTokens: addTokenCounts(\n (_g = usage1.outputTokenDetails) == null ? void 0 : _g.textTokens,\n (_h = usage2.outputTokenDetails) == null ? void 0 : _h.textTokens\n ),\n reasoningTokens: addTokenCounts(\n (_i = usage1.outputTokenDetails) == null ? void 0 : _i.reasoningTokens,\n (_j = usage2.outputTokenDetails) == null ? void 0 : _j.reasoningTokens\n )\n },\n totalTokens: addTokenCounts(usage1.totalTokens, usage2.totalTokens)\n };\n}\nfunction addTokenCounts(tokenCount1, tokenCount2) {\n return tokenCount1 == null && tokenCount2 == null ? void 0 : (tokenCount1 != null ? tokenCount1 : 0) + (tokenCount2 != null ? tokenCount2 : 0);\n}\nfunction addImageModelUsage(usage1, usage2) {\n return {\n inputTokens: addTokenCounts(usage1.inputTokens, usage2.inputTokens),\n outputTokens: addTokenCounts(usage1.outputTokens, usage2.outputTokens),\n totalTokens: addTokenCounts(usage1.totalTokens, usage2.totalTokens)\n };\n}\n\n// src/util/get-own.ts\nfunction getOwn(obj, key) {\n return obj != null && Object.hasOwn(obj, key) ? obj[key] : void 0;\n}\n\n// src/util/merge-abort-signals.ts\nimport { filterNullable } from \"@ai-sdk/provider-utils\";\nfunction mergeAbortSignals(...signals) {\n const validSignals = filterNullable(...signals).map(\n (signal) => signal instanceof AbortSignal ? signal : AbortSignal.timeout(signal)\n );\n return validSignals.length === 0 ? void 0 : validSignals.length === 1 ? validSignals[0] : AbortSignal.any(validSignals);\n}\n\n// src/util/merge-objects.ts\nfunction mergeObjects(base, overrides) {\n if (base === void 0 && overrides === void 0) {\n return void 0;\n }\n if (base === void 0) {\n return overrides;\n }\n if (overrides === void 0) {\n return base;\n }\n const result = { ...base };\n for (const key in overrides) {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n continue;\n }\n if (Object.prototype.hasOwnProperty.call(overrides, key)) {\n const overridesValue = overrides[key];\n if (overridesValue === void 0)\n continue;\n const baseValue = key in base ? base[key] : void 0;\n const isSourceObject = overridesValue !== null && typeof overridesValue === \"object\" && !Array.isArray(overridesValue) && !(overridesValue instanceof Date) && !(overridesValue instanceof RegExp);\n const isTargetObject = baseValue !== null && baseValue !== void 0 && typeof baseValue === \"object\" && !Array.isArray(baseValue) && !(baseValue instanceof Date) && !(baseValue instanceof RegExp);\n if (isSourceObject && isTargetObject) {\n result[key] = mergeObjects(\n baseValue,\n overridesValue\n );\n } else {\n result[key] = overridesValue;\n }\n }\n }\n return result;\n}\n\n// src/util/now.ts\nfunction now() {\n var _a22, _b;\n return (_b = (_a22 = globalThis == null ? void 0 : globalThis.performance) == null ? void 0 : _a22.now()) != null ? _b : Date.now();\n}\n\n// src/util/notify.ts\nimport { asArray as asArray3 } from \"@ai-sdk/provider-utils\";\nasync function notify(options) {\n await Promise.all(\n asArray3(options.callbacks).map(async (callback) => {\n try {\n await (callback == null ? void 0 : callback(options.event));\n } catch (e) {\n }\n })\n );\n}\n\n// src/util/retry-with-exponential-backoff.ts\nimport { APICallError as APICallError2 } from \"@ai-sdk/provider\";\nimport { GatewayError } from \"@ai-sdk/gateway\";\nimport {\n retryWithExponentialBackoff\n} from \"@ai-sdk/provider-utils\";\nfunction getRetryDelayInMs({\n error,\n exponentialBackoffDelay\n}) {\n const headers = APICallError2.isInstance(error) ? error.responseHeaders : APICallError2.isInstance(error.cause) ? error.cause.responseHeaders : void 0;\n if (!headers)\n return exponentialBackoffDelay;\n let ms;\n const retryAfterMs = headers[\"retry-after-ms\"];\n if (retryAfterMs) {\n const timeoutMs = parseFloat(retryAfterMs);\n if (!Number.isNaN(timeoutMs)) {\n ms = timeoutMs;\n }\n }\n const retryAfter = headers[\"retry-after\"];\n if (retryAfter && ms === void 0) {\n const timeoutSeconds = parseFloat(retryAfter);\n if (!Number.isNaN(timeoutSeconds)) {\n ms = timeoutSeconds * 1e3;\n } else {\n ms = Date.parse(retryAfter) - Date.now();\n }\n }\n if (ms != null && !Number.isNaN(ms) && 0 <= ms && (ms < 60 * 1e3 || ms < exponentialBackoffDelay)) {\n return ms;\n }\n return exponentialBackoffDelay;\n}\nvar retryWithExponentialBackoffRespectingRetryHeaders = ({\n maxRetries = 2,\n initialDelayInMs = 2e3,\n backoffFactor = 2,\n abortSignal\n} = {}) => retryWithExponentialBackoff({\n maxRetries,\n initialDelayInMs,\n backoffFactor,\n abortSignal,\n shouldRetry: (error) => error instanceof Error && (APICallError2.isInstance(error) && error.isRetryable === true || GatewayError.isInstance(error) && error.isRetryable === true),\n getDelayInMs: ({ error, exponentialBackoffDelay }) => getRetryDelayInMs({\n error,\n exponentialBackoffDelay\n }),\n createRetryError: ({ message, reason, errors }) => new RetryError({ message, reason, errors })\n});\n\n// src/util/prepare-retries.ts\nfunction prepareRetries({\n maxRetries,\n abortSignal\n}) {\n if (maxRetries != null) {\n if (!Number.isInteger(maxRetries)) {\n throw new InvalidArgumentError({\n parameter: \"maxRetries\",\n value: maxRetries,\n message: \"maxRetries must be an integer\"\n });\n }\n if (maxRetries < 0) {\n throw new InvalidArgumentError({\n parameter: \"maxRetries\",\n value: maxRetries,\n message: \"maxRetries must be >= 0\"\n });\n }\n }\n const maxRetriesResult = maxRetries != null ? maxRetries : 2;\n return {\n maxRetries: maxRetriesResult,\n retry: retryWithExponentialBackoffRespectingRetryHeaders({\n maxRetries: maxRetriesResult,\n abortSignal\n })\n };\n}\n\n// src/util/set-abort-timeout.ts\nfunction setAbortTimeout({\n abortController,\n label,\n timeoutMs\n}) {\n if (abortController == null || timeoutMs == null) {\n return void 0;\n }\n return setTimeout(\n () => abortController.abort(\n new DOMException(\n `${label} timeout of ${timeoutMs}ms exceeded`,\n \"TimeoutError\"\n )\n ),\n timeoutMs\n );\n}\n\n// src/generate-text/calculate-tokens-per-second.ts\nfunction calculateTokensPerSecond({\n tokens,\n durationMs\n}) {\n const tokenRate = 1e3 * (tokens != null ? tokens : 0) / (durationMs != null ? durationMs : 0);\n return Number.isFinite(tokenRate) ? tokenRate : 0;\n}\n\n// src/generate-text/collect-tool-approvals.ts\nfunction collectToolApprovals({\n messages\n}) {\n const lastMessage = messages.at(-1);\n if ((lastMessage == null ? void 0 : lastMessage.role) != \"tool\") {\n return {\n approvedToolApprovals: [],\n deniedToolApprovals: []\n };\n }\n const toolCallsByToolCallId = /* @__PURE__ */ Object.create(null);\n for (const message of messages) {\n if (message.role === \"assistant\" && typeof message.content !== \"string\") {\n const content = message.content;\n for (const part of content) {\n if (part.type === \"tool-call\") {\n toolCallsByToolCallId[part.toolCallId] = part;\n }\n }\n }\n }\n const toolApprovalRequestsByApprovalId = /* @__PURE__ */ Object.create(null);\n for (const message of messages) {\n if (message.role === \"assistant\" && typeof message.content !== \"string\") {\n const content = message.content;\n for (const part of content) {\n if (part.type === \"tool-approval-request\") {\n toolApprovalRequestsByApprovalId[part.approvalId] = part;\n }\n }\n }\n }\n const toolResults = /* @__PURE__ */ Object.create(null);\n for (const part of lastMessage.content) {\n if (part.type === \"tool-result\") {\n toolResults[part.toolCallId] = part;\n }\n }\n const approvedToolApprovals = [];\n const deniedToolApprovals = [];\n const approvalResponses = lastMessage.content.filter(\n (part) => part.type === \"tool-approval-response\"\n );\n for (const approvalResponse of approvalResponses) {\n const approvalRequest = toolApprovalRequestsByApprovalId[approvalResponse.approvalId];\n if (approvalRequest == null) {\n throw new InvalidToolApprovalError({\n approvalId: approvalResponse.approvalId\n });\n }\n const existingToolResult = toolResults[approvalRequest.toolCallId];\n if (existingToolResult != null && (approvalResponse.approved || existingToolResult.output.type !== \"execution-denied\")) {\n continue;\n }\n const toolCall = toolCallsByToolCallId[approvalRequest.toolCallId];\n if (toolCall == null) {\n throw new ToolCallNotFoundForApprovalError({\n toolCallId: approvalRequest.toolCallId,\n approvalId: approvalRequest.approvalId\n });\n }\n const approval = {\n approvalRequest,\n approvalResponse,\n toolCall,\n ...existingToolResult != null ? { existingToolResult } : {}\n };\n if (approvalResponse.approved) {\n approvedToolApprovals.push(approval);\n } else {\n deniedToolApprovals.push(approval);\n }\n }\n return { approvedToolApprovals, deniedToolApprovals };\n}\n\n// src/generate-text/execute-tool-call.ts\nimport {\n executeTool,\n isExecutableTool\n} from \"@ai-sdk/provider-utils\";\n\n// src/generate-text/validate-tool-context.ts\nimport { validateTypes } from \"@ai-sdk/provider-utils\";\nasync function validateToolContext({\n toolName,\n context,\n contextSchema\n}) {\n if (contextSchema == null) {\n return context;\n }\n return await validateTypes({\n value: context,\n schema: contextSchema,\n context: {\n field: \"tool context\",\n entityName: toolName\n }\n });\n}\n\n// src/generate-text/execute-tool-call.ts\nasync function executeToolCall({\n toolCall,\n tools,\n toolsContext,\n callId,\n messages,\n abortSignal,\n timeout,\n experimental_sandbox: sandbox,\n onPreliminaryToolResult,\n onToolExecutionStart,\n onToolExecutionEnd,\n executeToolInTelemetryContext = async ({ execute }) => await execute(),\n runInTracingChannelSpan = async ({ execute }) => await execute()\n}) {\n const { toolName, toolCallId, input } = toolCall;\n const tool2 = getOwn(tools, toolName);\n if (!isExecutableTool(tool2)) {\n return void 0;\n }\n const context = await validateToolContext({\n toolName,\n context: getOwn(toolsContext, toolName),\n contextSchema: tool2.contextSchema\n });\n const toolExecutionContext = {\n toolCall,\n messages,\n toolContext: context\n };\n const baseCallbackEvent = {\n callId,\n ...toolExecutionContext\n };\n return await runInTracingChannelSpan({\n type: \"executeTool\",\n event: baseCallbackEvent,\n execute: async () => {\n let output;\n await notify({\n event: baseCallbackEvent,\n callbacks: onToolExecutionStart\n });\n const toolTimeoutMs = getToolTimeoutMs(timeout, toolName);\n const toolAbortSignal = mergeAbortSignals(abortSignal, toolTimeoutMs);\n let toolExecutionMs = 0;\n try {\n await executeToolInTelemetryContext({\n callId,\n toolCallId,\n ...toolExecutionContext,\n execute: async () => {\n const startTime = now();\n try {\n const stream = executeTool({\n tool: tool2,\n input,\n options: {\n toolCallId,\n messages,\n abortSignal: toolAbortSignal,\n context,\n experimental_sandbox: sandbox\n }\n });\n for await (const part of stream) {\n if (part.type === \"preliminary\") {\n onPreliminaryToolResult == null ? void 0 : onPreliminaryToolResult({\n ...toolCall,\n type: \"tool-result\",\n output: part.output,\n preliminary: true\n });\n } else {\n output = part.output;\n }\n }\n } finally {\n toolExecutionMs = now() - startTime;\n }\n }\n });\n } catch (error) {\n const toolError = {\n type: \"tool-error\",\n toolCallId,\n toolName,\n input,\n error,\n dynamic: tool2.type === \"dynamic\",\n ...toolCall.providerMetadata != null ? { providerMetadata: toolCall.providerMetadata } : {},\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n };\n await notify({\n event: {\n ...baseCallbackEvent,\n toolOutput: toolError,\n toolExecutionMs\n },\n callbacks: onToolExecutionEnd\n });\n return {\n output: toolError,\n toolExecutionMs\n };\n }\n const toolResult = {\n type: \"tool-result\",\n toolCallId,\n toolName,\n input,\n output,\n dynamic: tool2.type === \"dynamic\",\n ...toolCall.providerMetadata != null ? { providerMetadata: toolCall.providerMetadata } : {},\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n };\n await notify({\n event: {\n ...baseCallbackEvent,\n toolOutput: toolResult,\n toolExecutionMs\n },\n callbacks: onToolExecutionEnd\n });\n return {\n output: toolResult,\n toolExecutionMs\n };\n }\n });\n}\n\n// src/generate-text/filter-active-tools.ts\nfunction filterActiveTools({\n tools,\n activeTools\n}) {\n if (tools == null || activeTools == null) {\n return tools;\n }\n return Object.fromEntries(\n Object.entries(tools).filter(([name22]) => activeTools.includes(name22))\n );\n}\n\n// src/generate-text/generated-file.ts\nimport {\n convertBase64ToUint8Array,\n convertUint8ArrayToBase64\n} from \"@ai-sdk/provider-utils\";\nvar DefaultGeneratedFile = class {\n constructor({\n data,\n mediaType\n }) {\n const isUint8Array = data instanceof Uint8Array;\n this.base64Data = isUint8Array ? void 0 : data;\n this.uint8ArrayData = isUint8Array ? data : void 0;\n this.mediaType = mediaType;\n }\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get base64() {\n if (this.base64Data == null) {\n this.base64Data = convertUint8ArrayToBase64(this.uint8ArrayData);\n }\n return this.base64Data;\n }\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get uint8Array() {\n if (this.uint8ArrayData == null) {\n this.uint8ArrayData = convertBase64ToUint8Array(this.base64Data);\n }\n return this.uint8ArrayData;\n }\n};\nvar DefaultGeneratedFileWithType = class extends DefaultGeneratedFile {\n constructor(options) {\n super(options);\n this.type = \"file\";\n }\n};\n\n// src/generate-text/output.ts\nvar output_exports = {};\n__export(output_exports, {\n array: () => array,\n choice: () => choice,\n json: () => json,\n object: () => object,\n text: () => text\n});\nimport {\n TypeValidationError as TypeValidationError2\n} from \"@ai-sdk/provider\";\nimport {\n asSchema as asSchema2,\n resolve,\n safeParseJSON as safeParseJSON2,\n safeValidateTypes as safeValidateTypes2\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/parse-partial-json.ts\nimport { safeParseJSON } from \"@ai-sdk/provider-utils\";\n\n// src/util/fix-json.ts\nfunction fixJson(input) {\n const stack = [\"ROOT\"];\n let lastValidIndex = -1;\n let literalStart = null;\n let unicodeEscapeDigits = 0;\n function isHexDigit(char) {\n return char >= \"0\" && char <= \"9\" || char >= \"A\" && char <= \"F\" || char >= \"a\" && char <= \"f\";\n }\n function processValueStart(char, i, swapState) {\n {\n switch (char) {\n case '\"': {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_STRING\");\n break;\n }\n case \"f\":\n case \"t\":\n case \"n\": {\n lastValidIndex = i;\n literalStart = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_LITERAL\");\n break;\n }\n case \"-\": {\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_NUMBER\");\n break;\n }\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_NUMBER\");\n break;\n }\n case \"{\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_OBJECT_START\");\n break;\n }\n case \"[\": {\n lastValidIndex = i;\n stack.pop();\n stack.push(swapState);\n stack.push(\"INSIDE_ARRAY_START\");\n break;\n }\n }\n }\n }\n function processAfterObjectValue(char, i) {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_AFTER_COMMA\");\n break;\n }\n case \"}\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n }\n function processAfterArrayValue(char, i) {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_ARRAY_AFTER_COMMA\");\n break;\n }\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n }\n for (let i = 0; i < input.length; i++) {\n const char = input[i];\n const currentState = stack[stack.length - 1];\n switch (currentState) {\n case \"ROOT\":\n processValueStart(char, i, \"FINISH\");\n break;\n case \"INSIDE_OBJECT_START\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_KEY\");\n break;\n }\n case \"}\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_AFTER_COMMA\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_KEY\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_KEY\": {\n switch (char) {\n case '\"': {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_AFTER_KEY\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_AFTER_KEY\": {\n switch (char) {\n case \":\": {\n stack.pop();\n stack.push(\"INSIDE_OBJECT_BEFORE_VALUE\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_OBJECT_BEFORE_VALUE\": {\n processValueStart(char, i, \"INSIDE_OBJECT_AFTER_VALUE\");\n break;\n }\n case \"INSIDE_OBJECT_AFTER_VALUE\": {\n processAfterObjectValue(char, i);\n break;\n }\n case \"INSIDE_STRING\": {\n switch (char) {\n case '\"': {\n stack.pop();\n lastValidIndex = i;\n break;\n }\n case \"\\\\\": {\n stack.push(\"INSIDE_STRING_ESCAPE\");\n break;\n }\n default: {\n lastValidIndex = i;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_START\": {\n switch (char) {\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n default: {\n lastValidIndex = i;\n processValueStart(char, i, \"INSIDE_ARRAY_AFTER_VALUE\");\n break;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_AFTER_VALUE\": {\n switch (char) {\n case \",\": {\n stack.pop();\n stack.push(\"INSIDE_ARRAY_AFTER_COMMA\");\n break;\n }\n case \"]\": {\n lastValidIndex = i;\n stack.pop();\n break;\n }\n default: {\n lastValidIndex = i;\n break;\n }\n }\n break;\n }\n case \"INSIDE_ARRAY_AFTER_COMMA\": {\n processValueStart(char, i, \"INSIDE_ARRAY_AFTER_VALUE\");\n break;\n }\n case \"INSIDE_STRING_ESCAPE\": {\n stack.pop();\n if (char === \"u\") {\n unicodeEscapeDigits = 0;\n stack.push(\"INSIDE_STRING_UNICODE_ESCAPE\");\n } else {\n lastValidIndex = i;\n }\n break;\n }\n case \"INSIDE_STRING_UNICODE_ESCAPE\": {\n if (isHexDigit(char)) {\n unicodeEscapeDigits++;\n if (unicodeEscapeDigits === 4) {\n stack.pop();\n lastValidIndex = i;\n }\n }\n break;\n }\n case \"INSIDE_NUMBER\": {\n switch (char) {\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\": {\n lastValidIndex = i;\n break;\n }\n case \"e\":\n case \"E\":\n case \"-\":\n case \".\": {\n break;\n }\n case \",\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n }\n break;\n }\n case \"}\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n }\n break;\n }\n case \"]\": {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n break;\n }\n default: {\n stack.pop();\n break;\n }\n }\n break;\n }\n case \"INSIDE_LITERAL\": {\n const partialLiteral = input.substring(literalStart, i + 1);\n if (!\"false\".startsWith(partialLiteral) && !\"true\".startsWith(partialLiteral) && !\"null\".startsWith(partialLiteral)) {\n stack.pop();\n if (stack[stack.length - 1] === \"INSIDE_OBJECT_AFTER_VALUE\") {\n processAfterObjectValue(char, i);\n } else if (stack[stack.length - 1] === \"INSIDE_ARRAY_AFTER_VALUE\") {\n processAfterArrayValue(char, i);\n }\n } else {\n lastValidIndex = i;\n }\n break;\n }\n }\n }\n let result = input.slice(0, lastValidIndex + 1);\n for (let i = stack.length - 1; i >= 0; i--) {\n const state = stack[i];\n switch (state) {\n case \"INSIDE_STRING\": {\n result += '\"';\n break;\n }\n case \"INSIDE_OBJECT_KEY\":\n case \"INSIDE_OBJECT_AFTER_KEY\":\n case \"INSIDE_OBJECT_AFTER_COMMA\":\n case \"INSIDE_OBJECT_START\":\n case \"INSIDE_OBJECT_BEFORE_VALUE\":\n case \"INSIDE_OBJECT_AFTER_VALUE\": {\n result += \"}\";\n break;\n }\n case \"INSIDE_ARRAY_START\":\n case \"INSIDE_ARRAY_AFTER_COMMA\":\n case \"INSIDE_ARRAY_AFTER_VALUE\": {\n result += \"]\";\n break;\n }\n case \"INSIDE_LITERAL\": {\n const partialLiteral = input.substring(literalStart, input.length);\n if (\"true\".startsWith(partialLiteral)) {\n result += \"true\".slice(partialLiteral.length);\n } else if (\"false\".startsWith(partialLiteral)) {\n result += \"false\".slice(partialLiteral.length);\n } else if (\"null\".startsWith(partialLiteral)) {\n result += \"null\".slice(partialLiteral.length);\n }\n }\n }\n }\n return result;\n}\n\n// src/util/parse-partial-json.ts\nasync function parsePartialJson(jsonText) {\n if (jsonText === void 0) {\n return { value: void 0, state: \"undefined-input\" };\n }\n let result = await safeParseJSON({ text: jsonText });\n if (result.success) {\n return { value: result.value, state: \"successful-parse\" };\n }\n result = await safeParseJSON({ text: fixJson(jsonText) });\n if (result.success) {\n return { value: result.value, state: \"repaired-parse\" };\n }\n return { value: void 0, state: \"failed-parse\" };\n}\n\n// src/generate-text/output.ts\nvar text = () => ({\n name: \"text\",\n responseFormat: Promise.resolve({ type: \"text\" }),\n async parseCompleteOutput({ text: text2 }) {\n return text2;\n },\n async parsePartialOutput({ text: text2 }) {\n return { partial: text2 };\n },\n createElementStreamTransform() {\n return void 0;\n }\n});\nvar object = ({\n schema: inputSchema,\n name: name22,\n description\n}) => {\n const schema = asSchema2(inputSchema);\n return {\n name: \"object\",\n responseFormat: resolve(schema.jsonSchema).then((jsonSchema2) => ({\n type: \"json\",\n schema: jsonSchema2,\n ...name22 != null && { name: name22 },\n ...description != null && { description }\n })),\n async parseCompleteOutput({ text: text2 }, context) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason\n });\n }\n const validationResult = await safeValidateTypes2({\n value: parseResult.value,\n schema\n });\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: text2,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason\n });\n }\n return validationResult.value;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n return {\n // Note: currently no validation of partial results:\n partial: result.value\n };\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\nvar array = ({\n element: inputElementSchema,\n name: name22,\n description\n}) => {\n const elementSchema = asSchema2(inputElementSchema);\n return {\n name: \"array\",\n // JSON schema that describes an array of elements:\n responseFormat: resolve(elementSchema.jsonSchema).then((jsonSchema2) => {\n const { $schema: _$schema, ...itemSchema } = jsonSchema2;\n return {\n type: \"json\",\n schema: {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n elements: { type: \"array\", items: itemSchema }\n },\n required: [\"elements\"],\n additionalProperties: false\n },\n ...name22 != null && { name: name22 },\n ...description != null && { description }\n };\n }),\n async parseCompleteOutput({ text: text2 }, context) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason\n });\n }\n const outerValue = parseResult.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"elements\" in outerValue) || !Array.isArray(outerValue.elements)) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: new TypeValidationError2({\n value: outerValue,\n cause: \"response must be an object with an elements array\"\n }),\n text: text2,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason\n });\n }\n const validatedElements = [];\n for (const element of outerValue.elements) {\n const validationResult = await safeValidateTypes2({\n value: element,\n schema: elementSchema\n });\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: text2,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason\n });\n }\n validatedElements.push(validationResult.value);\n }\n return validatedElements;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n const outerValue = result.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"elements\" in outerValue) || !Array.isArray(outerValue.elements)) {\n return void 0;\n }\n const rawElements = result.state === \"repaired-parse\" && outerValue.elements.length > 0 ? outerValue.elements.slice(0, -1) : outerValue.elements;\n const parsedElements = [];\n for (const rawElement of rawElements) {\n const validationResult = await safeValidateTypes2({\n value: rawElement,\n schema: elementSchema\n });\n if (validationResult.success) {\n parsedElements.push(validationResult.value);\n }\n }\n return { partial: parsedElements };\n }\n }\n },\n createElementStreamTransform() {\n let publishedElements = 0;\n return new TransformStream({\n transform({ partialOutput }, controller) {\n if (partialOutput != null) {\n for (; publishedElements < partialOutput.length; publishedElements++) {\n controller.enqueue(partialOutput[publishedElements]);\n }\n }\n }\n });\n }\n };\n};\nvar choice = ({\n options: choiceOptions,\n name: name22,\n description\n}) => {\n return {\n name: \"choice\",\n // JSON schema that describes an enumeration:\n responseFormat: Promise.resolve({\n type: \"json\",\n schema: {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n result: { type: \"string\", enum: choiceOptions }\n },\n required: [\"result\"],\n additionalProperties: false\n },\n ...name22 != null && { name: name22 },\n ...description != null && { description }\n }),\n async parseCompleteOutput({ text: text2 }, context) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason\n });\n }\n const outerValue = parseResult.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"result\" in outerValue) || typeof outerValue.result !== \"string\" || !choiceOptions.includes(outerValue.result)) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: new TypeValidationError2({\n value: outerValue,\n cause: \"response must be an object that contains a choice value.\"\n }),\n text: text2,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason\n });\n }\n return outerValue.result;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n const outerValue = result.value;\n if (outerValue == null || typeof outerValue !== \"object\" || !(\"result\" in outerValue) || typeof outerValue.result !== \"string\") {\n return void 0;\n }\n const potentialMatches = choiceOptions.filter(\n (choiceOption) => choiceOption.startsWith(outerValue.result)\n );\n if (result.state === \"successful-parse\") {\n return potentialMatches.includes(outerValue.result) ? { partial: outerValue.result } : void 0;\n } else {\n return potentialMatches.length === 1 ? { partial: potentialMatches[0] } : void 0;\n }\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\nvar json = ({\n name: name22,\n description\n} = {}) => {\n return {\n name: \"json\",\n responseFormat: Promise.resolve({\n type: \"json\",\n ...name22 != null && { name: name22 },\n ...description != null && { description }\n }),\n async parseCompleteOutput({ text: text2 }, context) {\n const parseResult = await safeParseJSON2({ text: text2 });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: text2,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason\n });\n }\n return parseResult.value;\n },\n async parsePartialOutput({ text: text2 }) {\n const result = await parsePartialJson(text2);\n switch (result.state) {\n case \"failed-parse\":\n case \"undefined-input\": {\n return void 0;\n }\n case \"repaired-parse\":\n case \"successful-parse\": {\n return result.value === void 0 ? void 0 : { partial: result.value };\n }\n }\n },\n createElementStreamTransform() {\n return void 0;\n }\n };\n};\n\n// src/generate-text/parse-tool-call.ts\nimport {\n asSchema as asSchema3,\n safeParseJSON as safeParseJSON3,\n safeValidateTypes as safeValidateTypes3\n} from \"@ai-sdk/provider-utils\";\nasync function parseToolCall({\n toolCall,\n tools,\n repairToolCall,\n refineToolInput,\n messages,\n instructions\n}) {\n try {\n if (tools == null) {\n if (toolCall.providerExecuted && toolCall.dynamic) {\n return await refineParsedToolCallInput({\n toolCall: await parseProviderExecutedDynamicToolCall(toolCall),\n refineToolInput\n });\n }\n throw new NoSuchToolError({ toolName: toolCall.toolName });\n }\n try {\n return await refineParsedToolCallInput({\n toolCall: await doParseToolCall({ toolCall, tools }),\n refineToolInput\n });\n } catch (error) {\n if (repairToolCall == null || !(NoSuchToolError.isInstance(error) || InvalidToolInputError.isInstance(error))) {\n throw error;\n }\n let repairedToolCall = null;\n try {\n repairedToolCall = await repairToolCall({\n toolCall,\n tools,\n inputSchema: async ({ toolName }) => {\n var _a22;\n const inputSchema = (_a22 = getOwn(tools, toolName)) == null ? void 0 : _a22.inputSchema;\n return await asSchema3(inputSchema).jsonSchema;\n },\n instructions,\n system: instructions,\n messages,\n error\n });\n } catch (repairError) {\n throw new ToolCallRepairError({\n cause: repairError,\n originalError: error\n });\n }\n if (repairedToolCall == null) {\n throw error;\n }\n return await refineParsedToolCallInput({\n toolCall: await doParseToolCall({ toolCall: repairedToolCall, tools }),\n refineToolInput\n });\n }\n } catch (error) {\n const parsedInput = await safeParseJSON3({ text: toolCall.input });\n const input = parsedInput.success ? parsedInput.value : toolCall.input;\n const tool2 = getOwn(tools, toolCall.toolName);\n return {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input,\n dynamic: true,\n invalid: true,\n error,\n title: tool2 == null ? void 0 : tool2.title,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n ...(tool2 == null ? void 0 : tool2.metadata) != null ? { toolMetadata: tool2.metadata } : {}\n };\n }\n}\nasync function refineParsedToolCallInput({\n toolCall,\n refineToolInput\n}) {\n const refine = getOwn(refineToolInput, toolCall.toolName);\n if (refine == null) {\n return toolCall;\n }\n return {\n ...toolCall,\n input: await refine(toolCall.input)\n };\n}\nasync function parseProviderExecutedDynamicToolCall(toolCall) {\n const parseResult = toolCall.input.trim() === \"\" ? { success: true, value: {} } : await safeParseJSON3({ text: toolCall.input });\n if (parseResult.success === false) {\n throw new InvalidToolInputError({\n toolName: toolCall.toolName,\n toolInput: toolCall.input,\n cause: parseResult.error\n });\n }\n return {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: parseResult.value,\n providerExecuted: true,\n dynamic: true,\n providerMetadata: toolCall.providerMetadata\n };\n}\nasync function doParseToolCall({\n toolCall,\n tools\n}) {\n const toolName = toolCall.toolName;\n const tool2 = getOwn(tools, toolName);\n if (tool2 == null) {\n if (toolCall.providerExecuted && toolCall.dynamic) {\n return await parseProviderExecutedDynamicToolCall(toolCall);\n }\n throw new NoSuchToolError({\n toolName: toolCall.toolName,\n availableTools: Object.keys(tools)\n });\n }\n const schema = asSchema3(tool2.inputSchema);\n const parseResult = toolCall.input.trim() === \"\" ? await safeValidateTypes3({ value: {}, schema }) : await safeParseJSON3({ text: toolCall.input, schema });\n if (parseResult.success === false) {\n throw new InvalidToolInputError({\n toolName,\n toolInput: toolCall.input,\n cause: parseResult.error\n });\n }\n return tool2.type === \"dynamic\" ? {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: parseResult.value,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n ...tool2.metadata != null ? { toolMetadata: tool2.metadata } : {},\n dynamic: true,\n title: tool2.title\n } : {\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName,\n input: parseResult.value,\n providerExecuted: toolCall.providerExecuted,\n providerMetadata: toolCall.providerMetadata,\n ...tool2.metadata != null ? { toolMetadata: tool2.metadata } : {},\n title: tool2.title\n };\n}\n\n// src/generate-text/reasoning-output.ts\nfunction unwrapReasoningFileData(data) {\n if (typeof data === \"object\" && data !== null && \"type\" in data) {\n return data.type === \"data\" ? data.data : data.url;\n }\n return data;\n}\nfunction convertFromReasoningOutputs(parts) {\n return parts.map((part) => {\n if (part.type === \"reasoning\") {\n return {\n type: \"reasoning\",\n text: part.text,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n };\n }\n return {\n type: \"reasoning-file\",\n data: part.file.base64,\n mediaType: part.file.mediaType,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n };\n });\n}\nfunction convertToReasoningOutputs(parts) {\n return parts.map((part) => {\n if (part.type === \"reasoning\") {\n return {\n type: \"reasoning\",\n text: part.text,\n ...part.providerOptions != null ? { providerMetadata: part.providerOptions } : {}\n };\n }\n const rawData = unwrapReasoningFileData(part.data);\n const fileData = rawData instanceof ArrayBuffer ? new Uint8Array(rawData) : rawData instanceof URL ? rawData.toString() : rawData;\n return {\n type: \"reasoning-file\",\n file: new DefaultGeneratedFile({\n data: fileData,\n mediaType: part.mediaType\n }),\n ...part.providerOptions != null ? { providerMetadata: part.providerOptions } : {}\n };\n });\n}\n\n// src/generate-text/resolve-tool-approval.ts\nasync function resolveToolApproval({\n tools,\n toolCall,\n toolApproval,\n messages,\n toolsContext,\n runtimeContext\n}) {\n if (toolApproval != null && typeof toolApproval === \"function\") {\n return normalizeToolApprovalStatus(\n await toolApproval({\n toolCall,\n tools,\n toolsContext,\n messages,\n runtimeContext\n })\n );\n }\n const toolName = toolCall.toolName;\n const tool2 = getOwn(tools, toolName);\n const input = toolCall.input;\n const userDefinedToolApprovalStatus = getOwn(toolApproval, toolName);\n if (userDefinedToolApprovalStatus != null) {\n const approvalStatus = typeof userDefinedToolApprovalStatus === \"function\" ? await userDefinedToolApprovalStatus(input, {\n toolCallId: toolCall.toolCallId,\n messages,\n toolContext: await validateToolContext({\n toolName,\n context: getOwn(toolsContext, toolName),\n contextSchema: tool2 == null ? void 0 : tool2.contextSchema\n }),\n runtimeContext\n }) : userDefinedToolApprovalStatus;\n return normalizeToolApprovalStatus(approvalStatus);\n }\n if ((tool2 == null ? void 0 : tool2.needsApproval) == null) {\n return { type: \"not-applicable\" };\n }\n const needsApproval = typeof tool2.needsApproval === \"function\" ? await tool2.needsApproval(input, {\n toolCallId: toolCall.toolCallId,\n messages,\n context: await validateToolContext({\n toolName,\n context: getOwn(toolsContext, toolName),\n contextSchema: tool2 == null ? void 0 : tool2.contextSchema\n })\n }) : tool2.needsApproval;\n return needsApproval ? { type: \"user-approval\" } : { type: \"not-applicable\" };\n}\nfunction normalizeToolApprovalStatus(status) {\n return status === void 0 ? { type: \"not-applicable\" } : typeof status === \"string\" ? { type: status } : status;\n}\n\n// src/telemetry/create-telemetry-dispatcher.ts\nimport { asArray as asArray4 } from \"@ai-sdk/provider-utils\";\n\n// src/util/merge-callbacks.ts\nfunction mergeCallbacks(...callbacks) {\n return async (event) => {\n await Promise.allSettled(\n callbacks.map(async (callback) => {\n await (callback == null ? void 0 : callback(event));\n })\n );\n };\n}\n\n// src/telemetry/tracing-channel.ts\nvar AI_SDK_TELEMETRY_TRACING_CHANNEL = \"ai:telemetry\";\n\n// src/util/is-node-runtime.ts\nfunction isNodeRuntime() {\n var _a22;\n return typeof process !== \"undefined\" && ((_a22 = process.release) == null ? void 0 : _a22.name) === \"node\";\n}\n\n// src/telemetry/tracing-channel-publisher.ts\nvar diagnosticsChannelPromise;\nasync function loadDiagnosticsChannel() {\n if (!isNodeRuntime()) {\n return void 0;\n }\n if (diagnosticsChannelPromise == null) {\n diagnosticsChannelPromise = Promise.resolve(\n loadBuiltinModule(\"node:diagnostics_channel\")\n );\n }\n return diagnosticsChannelPromise;\n}\nfunction loadBuiltinModule(id) {\n var _a22;\n const processWithBuiltins = globalThis.process;\n try {\n return (_a22 = processWithBuiltins == null ? void 0 : processWithBuiltins.getBuiltinModule) == null ? void 0 : _a22.call(processWithBuiltins, id);\n } catch (e) {\n return void 0;\n }\n}\nasync function runWithTracingChannelSpan(message, execute) {\n var _a22;\n const diagnosticsChannel = await loadDiagnosticsChannel();\n const tracingChannel = (_a22 = diagnosticsChannel == null ? void 0 : diagnosticsChannel.tracingChannel) == null ? void 0 : _a22.call(\n diagnosticsChannel,\n AI_SDK_TELEMETRY_TRACING_CHANNEL\n );\n if (tracingChannel == null || tracingChannel.hasSubscribers === false) {\n return await execute();\n }\n let executePromise;\n let executionResult;\n let executionError;\n let hasExecutionResult = false;\n let hasExecutionError = false;\n const tracedExecute = () => {\n try {\n executePromise = Promise.resolve(execute());\n } catch (error) {\n executePromise = Promise.reject(error);\n }\n executePromise = executePromise.then(\n (result) => {\n executionResult = result;\n hasExecutionResult = true;\n return result;\n },\n (error) => {\n executionError = error;\n hasExecutionError = true;\n throw error;\n }\n );\n return executePromise;\n };\n try {\n return await tracingChannel.tracePromise(tracedExecute, message);\n } catch (e) {\n if (hasExecutionError) {\n throw executionError;\n }\n if (hasExecutionResult) {\n return executionResult;\n }\n if (executePromise != null) {\n return await executePromise;\n }\n return await execute();\n }\n}\nfunction openTelemetryChannelSpanContext({\n message,\n completion\n}) {\n var _a22;\n if (!isNodeRuntime()) {\n return void 0;\n }\n const diagnosticsChannel = loadBuiltinModule(\n \"node:diagnostics_channel\"\n );\n const asyncHooks = loadBuiltinModule(\"node:async_hooks\");\n const tracingChannel = (_a22 = diagnosticsChannel == null ? void 0 : diagnosticsChannel.tracingChannel) == null ? void 0 : _a22.call(\n diagnosticsChannel,\n AI_SDK_TELEMETRY_TRACING_CHANNEL\n );\n if (tracingChannel == null || tracingChannel.hasSubscribers === false || asyncHooks == null) {\n Promise.resolve(completion).catch(() => {\n });\n return void 0;\n }\n const context = message;\n let asyncResource;\n let asyncEndPublished = false;\n const safePublish = (publish) => {\n try {\n publish();\n } catch (e) {\n }\n };\n const publishAsyncEnd = ({\n result,\n error\n }) => {\n if (asyncEndPublished) {\n return;\n }\n asyncEndPublished = true;\n if (error !== void 0) {\n context.error = error;\n safePublish(() => tracingChannel.error.publish(context));\n }\n if (result !== void 0) {\n context.result = result;\n }\n safePublish(() => tracingChannel.asyncEnd.publish(context));\n };\n safePublish(() => {\n tracingChannel.start.runStores(context, () => {\n asyncResource = new asyncHooks.AsyncResource(\"ai.telemetry\");\n });\n });\n safePublish(() => tracingChannel.end.publish(context));\n void Promise.resolve(completion).then(\n (result) => publishAsyncEnd({ result }),\n (error) => publishAsyncEnd({ error })\n );\n return {\n run: (execute) => asyncResource == null ? execute() : asyncResource.runInAsyncScope(execute)\n };\n}\n\n// src/telemetry/telemetry-registry.ts\nfunction registerTelemetry(...integrations) {\n if (!globalThis.AI_SDK_TELEMETRY_INTEGRATIONS) {\n globalThis.AI_SDK_TELEMETRY_INTEGRATIONS = [];\n }\n globalThis.AI_SDK_TELEMETRY_INTEGRATIONS.push(...integrations);\n}\nfunction getGlobalTelemetryIntegrations() {\n var _a22;\n return (_a22 = globalThis.AI_SDK_TELEMETRY_INTEGRATIONS) != null ? _a22 : [];\n}\n\n// src/telemetry/create-telemetry-dispatcher.ts\nfunction augmentEvent(event, telemetry) {\n return Object.assign(\n Object.create(Object.getPrototypeOf(event)),\n event,\n telemetry\n );\n}\nfunction createTelemetryDispatcher({\n telemetry\n}) {\n if ((telemetry == null ? void 0 : telemetry.isEnabled) === false) {\n return {};\n }\n const localIntegrations = telemetry == null ? void 0 : telemetry.integrations;\n const integrations = localIntegrations != null ? asArray4(localIntegrations) : getGlobalTelemetryIntegrations();\n const telemetryMetadata = {\n recordInputs: telemetry == null ? void 0 : telemetry.recordInputs,\n recordOutputs: telemetry == null ? void 0 : telemetry.recordOutputs,\n functionId: telemetry == null ? void 0 : telemetry.functionId\n };\n const mergeTelemetryCallback = (key) => {\n const integrationCallbacks = integrations.map((integration) => {\n var _a22;\n return (_a22 = integration[key]) == null ? void 0 : _a22.bind(integration);\n }).filter(Boolean).map(\n (callback) => (event) => callback(augmentEvent(event, telemetryMetadata))\n );\n const mergedIntegrationCallback = mergeCallbacks(...integrationCallbacks);\n return async (event) => {\n await mergedIntegrationCallback(event);\n };\n };\n const executeLanguageModelCallWrappers = integrations.map((integration) => {\n var _a22;\n return (_a22 = integration.executeLanguageModelCall) == null ? void 0 : _a22.bind(integration);\n }).filter(Boolean);\n const executeToolWrappers = integrations.map((integration) => {\n var _a22;\n return (_a22 = integration.executeTool) == null ? void 0 : _a22.bind(integration);\n }).filter(Boolean);\n return {\n runInTracingChannelSpan: async ({ type, event, execute }) => await runWithTracingChannelSpan(\n {\n type,\n event: augmentEvent(event, telemetryMetadata)\n },\n execute\n ),\n startTracingChannelContext: ({ type, event, completion }) => openTelemetryChannelSpanContext({\n message: {\n type,\n event: augmentEvent(event, telemetryMetadata)\n },\n completion\n }),\n onStart: mergeTelemetryCallback(\"onStart\"),\n onStepStart: mergeTelemetryCallback(\"onStepStart\"),\n onLanguageModelCallStart: mergeTelemetryCallback(\n \"onLanguageModelCallStart\"\n ),\n onLanguageModelCallEnd: mergeTelemetryCallback(\"onLanguageModelCallEnd\"),\n onToolExecutionStart: mergeTelemetryCallback(\"onToolExecutionStart\"),\n onToolExecutionEnd: mergeTelemetryCallback(\"onToolExecutionEnd\"),\n // Fan out step-end events to both the new `onStepEnd` callback and the\n // deprecated `onStepFinish` callback so integrations that still implement\n // only `onStepFinish` keep receiving step-end events during the deprecation\n // window.\n onStepEnd: mergeCallbacks(\n mergeTelemetryCallback(\"onStepEnd\"),\n mergeTelemetryCallback(\"onStepFinish\")\n ),\n onObjectStepStart: mergeTelemetryCallback(\"onObjectStepStart\"),\n onObjectStepEnd: mergeTelemetryCallback(\"onObjectStepEnd\"),\n onEmbedStart: mergeTelemetryCallback(\"onEmbedStart\"),\n onEmbedEnd: mergeTelemetryCallback(\"onEmbedEnd\"),\n onRerankStart: mergeTelemetryCallback(\"onRerankStart\"),\n onRerankEnd: mergeTelemetryCallback(\"onRerankEnd\"),\n onEnd: mergeTelemetryCallback(\"onEnd\"),\n onAbort: mergeTelemetryCallback(\"onAbort\"),\n onError: mergeTelemetryCallback(\"onError\"),\n /**\n * Runs provider calls inside integration-specific context so\n * auto-instrumented provider requests can be associated with model work.\n */\n executeLanguageModelCall: async ({ execute, ...event }) => {\n const augmentedEvent = augmentEvent(event, telemetryMetadata);\n let wrappedExecute = execute;\n for (const executeWrapper of executeLanguageModelCallWrappers) {\n const innerExecute = wrappedExecute;\n wrappedExecute = () => executeWrapper({ ...augmentedEvent, execute: innerExecute });\n }\n return await runWithTracingChannelSpan(\n { type: \"languageModelCall\", event: augmentedEvent },\n wrappedExecute\n );\n },\n /**\n * Composes all `executeTool` wrappers around the original tool execution.\n * Each wrapper receives an `execute` function that calls the next wrapper in\n * the chain, so integrations can establish nested telemetry context before\n * delegating to the underlying tool.\n */\n executeTool: async ({ execute, ...event }) => {\n const augmentedEvent = augmentEvent(event, telemetryMetadata);\n let wrappedExecute = execute;\n for (const executeWrapper of executeToolWrappers) {\n const innerExecute = wrappedExecute;\n wrappedExecute = () => executeWrapper({ ...augmentedEvent, execute: innerExecute });\n }\n return await wrappedExecute();\n }\n };\n}\n\n// src/generate-text/reasoning.ts\nfunction asReasoningText(reasoningParts) {\n const reasoningText = reasoningParts.map((part) => \"text\" in part ? part.text : \"\").join(\"\");\n return reasoningText.length > 0 ? reasoningText : void 0;\n}\n\n// src/generate-text/step-result.ts\nvar DefaultStepResult = class {\n constructor({\n callId,\n stepNumber,\n provider,\n modelId,\n runtimeContext,\n toolsContext,\n content,\n finishReason,\n rawFinishReason,\n usage,\n performance,\n warnings,\n request,\n response,\n providerMetadata\n }) {\n this.callId = callId;\n this.stepNumber = stepNumber;\n this.model = { provider, modelId };\n this.runtimeContext = runtimeContext;\n this.toolsContext = toolsContext;\n this.content = content;\n this.finishReason = finishReason;\n this.rawFinishReason = rawFinishReason;\n this.usage = usage;\n this.performance = performance;\n this.warnings = warnings;\n this.request = request;\n this.response = response;\n this.providerMetadata = providerMetadata;\n }\n get text() {\n return this.content.filter((part) => part.type === \"text\").map((part) => part.text).join(\"\");\n }\n get reasoning() {\n return convertFromReasoningOutputs(\n this.content.filter(\n (part) => part.type === \"reasoning\" || part.type === \"reasoning-file\"\n )\n );\n }\n get reasoningText() {\n return asReasoningText(this.reasoning);\n }\n get files() {\n return this.content.filter((part) => part.type === \"file\").map((part) => part.file);\n }\n get sources() {\n return this.content.filter((part) => part.type === \"source\");\n }\n get toolCalls() {\n return this.content.filter((part) => part.type === \"tool-call\");\n }\n get staticToolCalls() {\n return this.toolCalls.filter(\n (toolCall) => toolCall.dynamic !== true\n );\n }\n get dynamicToolCalls() {\n return this.toolCalls.filter(\n (toolCall) => toolCall.dynamic === true\n );\n }\n get toolResults() {\n return this.content.filter((part) => part.type === \"tool-result\");\n }\n get staticToolResults() {\n return this.toolResults.filter(\n (toolResult) => toolResult.dynamic !== true\n );\n }\n get dynamicToolResults() {\n return this.toolResults.filter(\n (toolResult) => toolResult.dynamic === true\n );\n }\n};\n\n// src/generate-text/restricted-telemetry-dispatcher.ts\nfunction filterIncludedContext({\n context,\n includeContext\n}) {\n if (context == null) {\n return {};\n }\n return Object.fromEntries(\n Object.entries(context).filter(\n ([key]) => (includeContext == null ? void 0 : includeContext[key]) === true\n )\n );\n}\nfunction restrictStepResult({\n step,\n includeRuntimeContext,\n includeToolsContext\n}) {\n return new DefaultStepResult({\n callId: step.callId,\n stepNumber: step.stepNumber,\n provider: step.model.provider,\n modelId: step.model.modelId,\n runtimeContext: filterIncludedContext({\n context: step.runtimeContext,\n includeContext: includeRuntimeContext\n }),\n toolsContext: filterToolsContext({\n toolsContext: step.toolsContext,\n includeToolsContext\n }),\n content: step.content,\n finishReason: step.finishReason,\n rawFinishReason: step.rawFinishReason,\n usage: step.usage,\n performance: step.performance,\n warnings: step.warnings,\n request: step.request,\n response: step.response,\n providerMetadata: step.providerMetadata\n });\n}\nfunction filterToolsContext({\n toolsContext,\n includeToolsContext\n}) {\n if (includeToolsContext == null) {\n return {};\n }\n return Object.fromEntries(\n Object.entries(toolsContext).map(([toolName, toolContext]) => [\n toolName,\n filterToolContext({\n toolName,\n toolContext,\n includeToolsContext\n })\n ])\n );\n}\nfunction filterToolContext({\n toolName,\n toolContext,\n includeToolsContext\n}) {\n const includeToolContext = includeToolsContext == null ? void 0 : includeToolsContext[toolName];\n return filterIncludedContext({\n context: toolContext,\n includeContext: includeToolContext\n });\n}\nfunction createRestrictedTelemetryDispatcher({\n telemetry,\n includeRuntimeContext,\n includeToolsContext\n}) {\n const telemetryDispatcher = createTelemetryDispatcher({ telemetry });\n return {\n ...telemetryDispatcher,\n onStart: (event) => {\n var _a22;\n return (_a22 = telemetryDispatcher.onStart) == null ? void 0 : _a22.call(telemetryDispatcher, {\n ...event,\n runtimeContext: filterIncludedContext({\n context: event.runtimeContext,\n includeContext: includeRuntimeContext\n }),\n toolsContext: filterToolsContext({\n toolsContext: event.toolsContext,\n includeToolsContext\n })\n });\n },\n onStepStart: (event) => {\n var _a22;\n return (_a22 = telemetryDispatcher.onStepStart) == null ? void 0 : _a22.call(telemetryDispatcher, {\n ...event,\n runtimeContext: filterIncludedContext({\n context: event.runtimeContext,\n includeContext: includeRuntimeContext\n }),\n steps: event.steps.map(\n (step) => restrictStepResult({\n step,\n includeRuntimeContext,\n includeToolsContext\n })\n ),\n toolsContext: filterToolsContext({\n toolsContext: event.toolsContext,\n includeToolsContext\n })\n });\n },\n onStepEnd: (event) => {\n var _a22;\n return (_a22 = telemetryDispatcher.onStepEnd) == null ? void 0 : _a22.call(\n telemetryDispatcher,\n restrictStepResult({\n step: event,\n includeRuntimeContext,\n includeToolsContext\n })\n );\n },\n onStepFinish: (event) => {\n var _a22;\n return (_a22 = telemetryDispatcher.onStepEnd) == null ? void 0 : _a22.call(\n telemetryDispatcher,\n restrictStepResult({\n step: event,\n includeRuntimeContext,\n includeToolsContext\n })\n );\n },\n onEnd: (event) => {\n var _a22;\n return (_a22 = telemetryDispatcher.onEnd) == null ? void 0 : _a22.call(\n telemetryDispatcher,\n ((restrictedSteps) => {\n return {\n ...event,\n runtimeContext: filterIncludedContext({\n context: event.runtimeContext,\n includeContext: includeRuntimeContext\n }),\n steps: restrictedSteps,\n finalStep: restrictedSteps.at(-1),\n toolsContext: filterToolsContext({\n toolsContext: event.toolsContext,\n includeToolsContext\n })\n };\n })(\n event.steps.map(\n (step) => restrictStepResult({\n step,\n includeRuntimeContext,\n includeToolsContext\n })\n )\n )\n );\n },\n onAbort: (event) => {\n var _a22;\n return (_a22 = telemetryDispatcher.onAbort) == null ? void 0 : _a22.call(telemetryDispatcher, {\n ...event,\n steps: event.steps.map(\n (step) => restrictStepResult({\n step,\n includeRuntimeContext,\n includeToolsContext\n })\n )\n });\n },\n onToolExecutionStart: (event) => {\n var _a22;\n return (_a22 = telemetryDispatcher.onToolExecutionStart) == null ? void 0 : _a22.call(telemetryDispatcher, {\n ...event,\n toolContext: filterToolContext({\n toolName: event.toolCall.toolName,\n toolContext: event.toolContext,\n includeToolsContext\n })\n });\n },\n onToolExecutionEnd: (event) => {\n var _a22;\n return (_a22 = telemetryDispatcher.onToolExecutionEnd) == null ? void 0 : _a22.call(telemetryDispatcher, {\n ...event,\n toolContext: filterToolContext({\n toolName: event.toolCall.toolName,\n toolContext: event.toolContext,\n includeToolsContext\n })\n });\n }\n };\n}\n\n// src/generate-text/stop-condition.ts\nfunction isStepCount(stepCount) {\n return ({ steps }) => steps.length === stepCount;\n}\nfunction isLoopFinished() {\n return () => false;\n}\nfunction hasToolCall(...toolName) {\n return ({ steps }) => {\n var _a22, _b, _c;\n return (_c = (_b = (_a22 = steps[steps.length - 1]) == null ? void 0 : _a22.toolCalls) == null ? void 0 : _b.some(\n (toolCall) => toolName.includes(toolCall.toolName)\n )) != null ? _c : false;\n };\n}\nasync function isStopConditionMet({\n stopConditions,\n steps\n}) {\n return (await Promise.all(stopConditions.map((condition) => condition({ steps })))).some((result) => result);\n}\n\n// src/generate-text/sum-token-counts.ts\nfunction sumTokenCounts(tokenCount1, tokenCount2) {\n return tokenCount1 == null && tokenCount2 == null ? void 0 : (tokenCount1 != null ? tokenCount1 : 0) + (tokenCount2 != null ? tokenCount2 : 0);\n}\n\n// src/generate-text/to-response-messages.ts\nasync function toResponseMessages({\n content: inputContent,\n tools\n}) {\n const responseMessages = [];\n const toolCallOrder = /* @__PURE__ */ new Map();\n const content = [];\n for (const part of inputContent) {\n if (part.type === \"source\") {\n continue;\n }\n if ((part.type === \"tool-result\" || part.type === \"tool-error\") && !part.providerExecuted) {\n continue;\n }\n if (part.type === \"text\" && part.text.length === 0) {\n continue;\n }\n switch (part.type) {\n case \"text\":\n content.push({\n type: \"text\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n break;\n case \"custom\":\n content.push({\n type: \"custom\",\n kind: part.kind,\n providerOptions: part.providerMetadata\n });\n break;\n case \"reasoning\":\n content.push({\n type: \"reasoning\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n break;\n case \"file\":\n content.push({\n type: \"file\",\n data: part.file.base64,\n mediaType: part.file.mediaType,\n providerOptions: part.providerMetadata\n });\n break;\n case \"reasoning-file\":\n content.push({\n type: \"reasoning-file\",\n data: part.file.base64,\n mediaType: part.file.mediaType,\n providerOptions: part.providerMetadata\n });\n break;\n case \"tool-call\":\n if (!toolCallOrder.has(part.toolCallId)) {\n toolCallOrder.set(part.toolCallId, toolCallOrder.size);\n }\n content.push({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.invalid && typeof part.input !== \"object\" ? {} : part.input,\n providerExecuted: part.providerExecuted,\n providerOptions: part.providerMetadata\n });\n break;\n case \"tool-result\": {\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: getOwn(tools, part.toolName),\n output: part.output,\n errorMode: \"none\"\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n providerOptions: part.providerMetadata\n });\n break;\n }\n case \"tool-error\": {\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: getOwn(tools, part.toolName),\n output: part.error,\n errorMode: \"json\"\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n providerOptions: part.providerMetadata\n });\n break;\n }\n case \"tool-approval-request\":\n content.push({\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCallId: part.toolCall.toolCallId,\n isAutomatic: part.isAutomatic,\n ...part.signature != null ? { signature: part.signature } : {}\n });\n break;\n }\n }\n if (content.length > 0) {\n responseMessages.push({\n role: \"assistant\",\n content\n });\n }\n const toolResultContent = [];\n for (const part of inputContent) {\n if (part.type !== \"tool-approval-response\" && part.type !== \"tool-result\" && part.type !== \"tool-error\") {\n continue;\n }\n if (part.type === \"tool-approval-response\") {\n toolResultContent.push({\n type: \"tool-approval-response\",\n approvalId: part.approvalId,\n approved: part.approved,\n reason: part.reason,\n providerExecuted: part.providerExecuted\n });\n if (part.approved === false) {\n toolResultContent.push({\n type: \"tool-result\",\n toolCallId: part.toolCall.toolCallId,\n toolName: part.toolCall.toolName,\n output: {\n type: \"execution-denied\",\n reason: part.reason\n }\n });\n }\n continue;\n }\n if (part.providerExecuted) {\n continue;\n }\n const output = await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n tool: getOwn(tools, part.toolName),\n output: part.type === \"tool-result\" ? part.output : part.error,\n errorMode: part.type === \"tool-error\" ? \"text\" : \"none\"\n });\n toolResultContent.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n }\n if (toolResultContent.length > 0) {\n responseMessages.push({\n role: \"tool\",\n content: sortToolResultContentByToolCallOrder({\n toolResultContent,\n toolCallOrder\n })\n });\n }\n return responseMessages;\n}\nfunction sortToolResultContentByToolCallOrder({\n toolResultContent,\n toolCallOrder\n}) {\n const sortedToolResults = toolResultContent.filter((part) => part.type === \"tool-result\").map((part, index) => ({ part, index })).sort((a, b) => {\n const aOrder = toolCallOrder.get(a.part.toolCallId);\n const bOrder = toolCallOrder.get(b.part.toolCallId);\n if (aOrder == null && bOrder == null) {\n return a.index - b.index;\n }\n if (aOrder == null) {\n return 1;\n }\n if (bOrder == null) {\n return -1;\n }\n return aOrder - bOrder || a.index - b.index;\n }).map(({ part }) => part);\n let toolResultIndex = 0;\n return toolResultContent.map(\n (part) => part.type === \"tool-result\" ? sortedToolResults[toolResultIndex++] : part\n );\n}\n\n// src/generate-text/tool-approval-signature.ts\nimport { convertBase64ToUint8Array as convertBase64ToUint8Array2 } from \"@ai-sdk/provider-utils\";\n\n// src/util/canonical-hash.ts\nimport { convertUint8ArrayToBase64 as convertUint8ArrayToBase642 } from \"@ai-sdk/provider-utils\";\nvar encoder = new TextEncoder();\nfunction canonicalJSON(value) {\n if (value === null || value === void 0) {\n return JSON.stringify(value);\n }\n if (typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map(canonicalJSON).join(\",\")}]`;\n }\n const keys = Object.keys(value).sort();\n const entries = keys.map(\n (k) => `${JSON.stringify(k)}:${canonicalJSON(value[k])}`\n );\n return `{${entries.join(\",\")}}`;\n}\nfunction toBase64url(bytes) {\n return convertUint8ArrayToBase642(bytes).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n}\nasync function hashCanonical(value) {\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n encoder.encode(canonicalJSON(value))\n );\n return toBase64url(new Uint8Array(digest));\n}\n\n// src/generate-text/tool-approval-signature.ts\nvar encoder2 = new TextEncoder();\nfunction fromBase64url(str) {\n return convertBase64ToUint8Array2(str);\n}\nasync function importKey(secret) {\n const keyData = typeof secret === \"string\" ? encoder2.encode(secret) : secret;\n return crypto.subtle.importKey(\n \"raw\",\n keyData,\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\", \"verify\"]\n );\n}\nfunction buildPayload(approvalId, toolCallId, toolName, inputDigest) {\n return encoder2.encode(\n `${approvalId}\n${toolCallId}\n${toolName}\n${inputDigest}`\n );\n}\nasync function signToolApproval({\n secret,\n approvalId,\n toolCallId,\n toolName,\n input\n}) {\n const key = await importKey(secret);\n const inputDigest = await hashCanonical(input);\n const payload = buildPayload(approvalId, toolCallId, toolName, inputDigest);\n const sig = await crypto.subtle.sign(\"HMAC\", key, payload);\n return toBase64url(new Uint8Array(sig));\n}\nasync function verifyToolApprovalSignature({\n secret,\n signature,\n approvalId,\n toolCallId,\n toolName,\n input\n}) {\n const key = await importKey(secret);\n const inputDigest = await hashCanonical(input);\n const payload = buildPayload(approvalId, toolCallId, toolName, inputDigest);\n const sigBytes = fromBase64url(signature);\n return crypto.subtle.verify(\"HMAC\", key, sigBytes, payload);\n}\nasync function maybeSignApproval({\n secret,\n approvalId,\n toolCallId,\n toolName,\n input\n}) {\n if (secret == null)\n return void 0;\n return signToolApproval({ secret, approvalId, toolCallId, toolName, input });\n}\n\n// src/generate-text/validate-tool-approvals.ts\nimport {\n asSchema as asSchema4,\n isExecutableTool as isExecutableTool2,\n safeValidateTypes as safeValidateTypes4\n} from \"@ai-sdk/provider-utils\";\nasync function validateApprovedToolApprovals({\n approvedToolApprovals,\n tools,\n toolApproval,\n messages,\n toolsContext,\n runtimeContext,\n toolApprovalSecret\n}) {\n var _a22;\n const approved = [];\n const denied = [];\n for (const approval of approvedToolApprovals) {\n const { toolCall, approvalRequest } = approval;\n const tool2 = getOwn(tools, toolCall.toolName);\n if (toolApprovalSecret != null) {\n if (approvalRequest.signature == null) {\n throw new InvalidToolApprovalSignatureError({\n approvalId: approvalRequest.approvalId,\n toolCallId: toolCall.toolCallId,\n reason: \"missing signature\"\n });\n }\n const valid = await verifyToolApprovalSignature({\n secret: toolApprovalSecret,\n signature: approvalRequest.signature,\n approvalId: approvalRequest.approvalId,\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input\n });\n if (!valid) {\n throw new InvalidToolApprovalSignatureError({\n approvalId: approvalRequest.approvalId,\n toolCallId: toolCall.toolCallId,\n reason: \"invalid signature\"\n });\n }\n }\n if (isExecutableTool2(tool2) && tool2.inputSchema != null) {\n const validation = await safeValidateTypes4({\n value: toolCall.input,\n schema: asSchema4(tool2.inputSchema)\n });\n if (!validation.success) {\n throw new InvalidToolInputError({\n toolName: toolCall.toolName,\n toolInput: JSON.stringify(toolCall.input),\n cause: validation.error\n });\n }\n }\n const approvalStatus = await resolveToolApproval({\n tools,\n toolApproval,\n toolCall,\n messages,\n toolsContext,\n runtimeContext\n });\n if (approvalStatus.type === \"denied\") {\n denied.push({\n ...approval,\n approvalResponse: {\n ...approval.approvalResponse,\n approved: false,\n reason: (_a22 = approvalStatus.reason) != null ? _a22 : approval.approvalResponse.reason\n }\n });\n } else {\n approved.push(approval);\n }\n }\n return { approvedToolApprovals: approved, deniedToolApprovals: denied };\n}\n\n// src/generate-text/generate-text.ts\nvar originalGenerateId = createIdGenerator({\n prefix: \"aitxt\",\n size: 24\n});\nvar originalGenerateCallId = createIdGenerator({\n prefix: \"call\",\n size: 24\n});\nasync function generateText({\n model: modelArg,\n tools,\n toolChoice,\n instructions,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n maxRetries: maxRetriesArg,\n abortSignal,\n timeout,\n headers,\n stopWhen = isStepCount(1),\n experimental_sandbox: sandbox,\n output,\n toolApproval,\n experimental_toolApprovalSecret,\n experimental_telemetry,\n telemetry = experimental_telemetry,\n providerOptions,\n activeTools,\n toolOrder,\n prepareStep,\n experimental_repairToolCall,\n repairToolCall = experimental_repairToolCall,\n experimental_refineToolInput: refineToolInput,\n experimental_download: download2,\n runtimeContext = {},\n toolsContext = {},\n experimental_include,\n include = experimental_include,\n _internal: {\n generateId: generateId2 = originalGenerateId,\n generateCallId = originalGenerateCallId,\n now: now2 = now\n } = {},\n onStart,\n experimental_onStart,\n onStepStart,\n experimental_onStepStart,\n onLanguageModelCallStart,\n experimental_onLanguageModelCallStart,\n onLanguageModelCallEnd,\n experimental_onLanguageModelCallEnd,\n onToolExecutionStart,\n onToolExecutionEnd,\n experimental_onToolCallStart,\n experimental_onToolCallFinish,\n onStepEnd,\n onStepFinish,\n onFinish,\n onEnd = onFinish,\n ...settings\n}) {\n var _a22, _b, _c, _d;\n include = {\n requestBody: (_a22 = include == null ? void 0 : include.requestBody) != null ? _a22 : false,\n requestMessages: (_b = include == null ? void 0 : include.requestMessages) != null ? _b : false,\n responseBody: (_c = include == null ? void 0 : include.responseBody) != null ? _c : false\n };\n const model = resolveLanguageModel(modelArg);\n const stopConditions = asArray5(stopWhen);\n const resolvedOnStart = onStart != null ? onStart : experimental_onStart;\n const resolvedOnStepStart = onStepStart != null ? onStepStart : experimental_onStepStart;\n const resolvedOnLanguageModelCallStart = onLanguageModelCallStart != null ? onLanguageModelCallStart : experimental_onLanguageModelCallStart;\n const resolvedOnLanguageModelCallEnd = onLanguageModelCallEnd != null ? onLanguageModelCallEnd : experimental_onLanguageModelCallEnd;\n const resolvedOnToolExecutionStart = onToolExecutionStart != null ? onToolExecutionStart : experimental_onToolCallStart;\n const resolvedOnToolExecutionEnd = onToolExecutionEnd != null ? onToolExecutionEnd : experimental_onToolCallFinish;\n const resolvedOnStepEnd = onStepEnd != null ? onStepEnd : onStepFinish;\n const totalTimeoutMs = getTotalTimeoutMs(timeout);\n const stepTimeoutMs = getStepTimeoutMs(timeout);\n const stepAbortController = stepTimeoutMs != null ? new AbortController() : void 0;\n const mergedAbortSignal = mergeAbortSignals(\n abortSignal,\n totalTimeoutMs,\n stepAbortController == null ? void 0 : stepAbortController.signal\n );\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal: mergedAbortSignal\n });\n const callSettings = prepareLanguageModelCallOptions(settings);\n const headersWithUserAgent = withUserAgentSuffix2(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const initialPrompt = await standardizePrompt({\n instructions,\n system,\n prompt,\n messages,\n allowSystemInMessages\n });\n const callId = generateCallId();\n const telemetryDispatcher = createRestrictedTelemetryDispatcher({\n telemetry,\n includeRuntimeContext: telemetry == null ? void 0 : telemetry.includeRuntimeContext,\n includeToolsContext: telemetry == null ? void 0 : telemetry.includeToolsContext\n });\n const runInTracingChannelSpan = (_d = telemetryDispatcher.runInTracingChannelSpan) != null ? _d : async ({ execute }) => await execute();\n const generateTextStartEvent = {\n callId,\n operationId: \"ai.generateText\",\n provider: model.provider,\n modelId: model.modelId,\n instructions: initialPrompt.instructions,\n messages: initialPrompt.messages,\n tools,\n toolChoice,\n activeTools,\n toolOrder,\n maxOutputTokens: callSettings.maxOutputTokens,\n temperature: callSettings.temperature,\n topP: callSettings.topP,\n topK: callSettings.topK,\n presencePenalty: callSettings.presencePenalty,\n frequencyPenalty: callSettings.frequencyPenalty,\n stopSequences: callSettings.stopSequences,\n seed: callSettings.seed,\n reasoning: callSettings.reasoning,\n maxRetries,\n timeout,\n headers: headersWithUserAgent,\n providerOptions,\n output,\n runtimeContext,\n toolsContext\n };\n const executeGenerateText = async () => {\n var _a23;\n await notify({\n event: generateTextStartEvent,\n callbacks: [resolvedOnStart, telemetryDispatcher.onStart]\n });\n try {\n const initialMessages = initialPrompt.messages;\n const initialResponseMessages = [];\n const {\n approvedToolApprovals,\n deniedToolApprovals: collectedDeniedToolApprovals\n } = collectToolApprovals({ messages: initialMessages });\n const {\n approvedToolApprovals: localApprovedToolApprovals,\n deniedToolApprovals: revalidationDeniedToolApprovals\n } = await validateApprovedToolApprovals({\n approvedToolApprovals: approvedToolApprovals.filter(\n (toolApproval2) => !toolApproval2.toolCall.providerExecuted\n ),\n tools,\n toolApproval,\n messages: initialMessages,\n toolsContext,\n runtimeContext,\n toolApprovalSecret: experimental_toolApprovalSecret\n });\n const deniedToolApprovals = [\n ...collectedDeniedToolApprovals,\n ...revalidationDeniedToolApprovals\n ];\n const deniedToolApprovalsWithoutResults = deniedToolApprovals.filter(\n (toolApproval2) => toolApproval2.existingToolResult == null\n );\n if (deniedToolApprovalsWithoutResults.length > 0 || localApprovedToolApprovals.length > 0) {\n const toolResults2 = await executeTools({\n toolCalls: localApprovedToolApprovals.map(\n (toolApproval2) => toolApproval2.toolCall\n ),\n tools,\n callId,\n messages: initialMessages,\n abortSignal: mergedAbortSignal,\n timeout,\n experimental_sandbox: sandbox,\n toolsContext,\n onToolExecutionStart: (event) => notify({\n event,\n callbacks: [\n resolvedOnToolExecutionStart,\n telemetryDispatcher.onToolExecutionStart\n ]\n }),\n onToolExecutionEnd: (event) => notify({\n event,\n callbacks: [\n resolvedOnToolExecutionEnd,\n telemetryDispatcher.onToolExecutionEnd\n ]\n }),\n executeToolInTelemetryContext: telemetryDispatcher.executeTool,\n runInTracingChannelSpan\n });\n const toolContent = [];\n for (const result of toolResults2) {\n const output2 = result.output;\n const modelOutput = await createToolModelOutput({\n toolCallId: output2.toolCallId,\n input: output2.input,\n tool: getOwn(tools, output2.toolName),\n output: output2.type === \"tool-result\" ? output2.output : output2.error,\n errorMode: output2.type === \"tool-error\" ? \"text\" : \"none\"\n });\n toolContent.push({\n type: \"tool-result\",\n toolCallId: output2.toolCallId,\n toolName: output2.toolName,\n output: modelOutput\n });\n }\n for (const toolApproval2 of deniedToolApprovalsWithoutResults) {\n toolContent.push({\n type: \"tool-result\",\n toolCallId: toolApproval2.toolCall.toolCallId,\n toolName: toolApproval2.toolCall.toolName,\n output: {\n type: \"execution-denied\",\n reason: toolApproval2.approvalResponse.reason,\n // For provider-executed tools, include approvalId so provider can correlate\n ...toolApproval2.toolCall.providerExecuted && {\n providerOptions: {\n openai: {\n approvalId: toolApproval2.approvalResponse.approvalId\n }\n }\n }\n }\n });\n }\n initialResponseMessages.push({\n role: \"tool\",\n content: toolContent\n });\n }\n const callSettings2 = prepareLanguageModelCallOptions(settings);\n let currentModelResponse;\n let clientToolCalls = [];\n let clientToolOutputs = [];\n let toolApprovalResponses = [];\n let deniedToolApprovalResponses = [];\n const steps = [];\n let instructionsForNextStep = initialPrompt.instructions;\n let messagesForNextStep = [\n ...initialMessages,\n ...initialResponseMessages\n ];\n const pendingDeferredToolCalls = /* @__PURE__ */ new Map();\n do {\n const stepTimeoutId = setAbortTimeout({\n abortController: stepAbortController,\n label: \"Step\",\n timeoutMs: stepTimeoutMs\n });\n const stepNumber = steps.length;\n try {\n await runInTracingChannelSpan({\n type: \"step\",\n event: { callId, stepNumber },\n execute: async () => {\n var _a24, _b2, _c2, _d2, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;\n const accumulatedResponseMessages = [\n ...initialResponseMessages,\n ...steps.flatMap((step) => step.response.messages)\n ];\n const stepInputMessages = messagesForNextStep;\n const prepareStepResult = await (prepareStep == null ? void 0 : prepareStep({\n model,\n steps,\n stepNumber: steps.length,\n instructions: instructionsForNextStep,\n initialInstructions: initialPrompt.instructions,\n messages: stepInputMessages,\n initialMessages,\n responseMessages: accumulatedResponseMessages,\n runtimeContext,\n toolsContext,\n experimental_sandbox: sandbox\n }));\n const stepSandbox = (_a24 = prepareStepResult == null ? void 0 : prepareStepResult.experimental_sandbox) != null ? _a24 : sandbox;\n const stepModel = resolveLanguageModel(\n (_b2 = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _b2 : model\n );\n const stepInstructions = (_d2 = (_c2 = prepareStepResult == null ? void 0 : prepareStepResult.instructions) != null ? _c2 : prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _d2 : instructionsForNextStep;\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: {\n instructions: stepInstructions,\n messages: (_e = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _e : stepInputMessages\n },\n supportedUrls: await stepModel.supportedUrls,\n download: download2,\n provider: stepModel.provider.split(\".\")[0]\n });\n runtimeContext = (_f = prepareStepResult == null ? void 0 : prepareStepResult.runtimeContext) != null ? _f : runtimeContext;\n toolsContext = (_g = prepareStepResult == null ? void 0 : prepareStepResult.toolsContext) != null ? _g : toolsContext;\n const stepActiveTools = filterActiveTools({\n tools,\n activeTools: (_h = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _h : activeTools\n });\n const stepToolOrder = (_i = prepareStepResult == null ? void 0 : prepareStepResult.toolOrder) != null ? _i : toolOrder;\n const stepTools = await prepareTools({\n tools: stepActiveTools,\n toolOrder: stepToolOrder,\n // active tools context is a subset of the tools context, so we can cast to the unknown type\n toolsContext,\n experimental_sandbox: stepSandbox\n });\n const stepToolChoice = prepareToolChoice({\n toolChoice: (_j = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _j : toolChoice\n });\n const stepMessages = (_k = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _k : stepInputMessages;\n const stepProviderOptions = mergeObjects(\n providerOptions,\n prepareStepResult == null ? void 0 : prepareStepResult.providerOptions\n );\n await notify({\n event: {\n callId,\n provider: stepModel.provider,\n modelId: stepModel.modelId,\n stepNumber,\n instructions: stepInstructions,\n messages: stepMessages,\n tools,\n toolChoice: (_l = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _l : toolChoice,\n activeTools: (_m = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _m : activeTools,\n toolOrder: stepToolOrder,\n steps: [...steps],\n providerOptions: stepProviderOptions,\n output,\n runtimeContext,\n promptMessages,\n stepTools,\n stepToolChoice,\n toolsContext\n },\n callbacks: [\n resolvedOnStepStart,\n telemetryDispatcher.onStepStart\n ]\n });\n const languageModelCallContext = {\n provider: stepModel.provider,\n modelId: stepModel.modelId,\n instructions: stepInstructions,\n messages: stepMessages,\n tools: stepTools,\n ...callSettings2\n };\n const languageModelCallStartEvent = {\n callId,\n ...languageModelCallContext\n };\n const stepStartTimestampMs = now2();\n await notify({\n event: languageModelCallStartEvent,\n callbacks: [\n resolvedOnLanguageModelCallStart,\n telemetryDispatcher.onLanguageModelCallStart\n ]\n });\n const executeLanguageModelCallInTelemetryContext = (_n = telemetryDispatcher.executeLanguageModelCall) != null ? _n : async ({ execute }) => await execute();\n currentModelResponse = await retry(async () => {\n var _a25, _b3, _c3, _d3, _e2, _f2, _g2, _h2;\n const result = await executeLanguageModelCallInTelemetryContext(\n {\n ...languageModelCallStartEvent,\n execute: async () => await stepModel.doGenerate({\n ...callSettings2,\n tools: stepTools,\n toolChoice: stepToolChoice,\n responseFormat: await (output == null ? void 0 : output.responseFormat),\n prompt: promptMessages,\n providerOptions: stepProviderOptions,\n abortSignal: mergedAbortSignal,\n headers: headersWithUserAgent\n })\n }\n );\n const responseData = {\n id: (_b3 = (_a25 = result.response) == null ? void 0 : _a25.id) != null ? _b3 : generateId2(),\n timestamp: (_d3 = (_c3 = result.response) == null ? void 0 : _c3.timestamp) != null ? _d3 : /* @__PURE__ */ new Date(),\n modelId: (_f2 = (_e2 = result.response) == null ? void 0 : _e2.modelId) != null ? _f2 : stepModel.modelId,\n headers: (_g2 = result.response) == null ? void 0 : _g2.headers,\n body: (_h2 = result.response) == null ? void 0 : _h2.body\n };\n return { ...result, response: responseData };\n });\n const responseTimeMs = now2() - stepStartTimestampMs;\n const stepUsage = asLanguageModelUsage(\n currentModelResponse.usage\n );\n const stepToolCalls = await Promise.all(\n currentModelResponse.content.filter(\n (part) => part.type === \"tool-call\"\n ).map(\n (toolCall) => parseToolCall({\n toolCall,\n tools,\n repairToolCall,\n refineToolInput,\n instructions: stepInstructions,\n messages: stepMessages\n })\n )\n );\n const toolApprovalRequests = {};\n const stepToolApprovalResponses = {};\n const blockedToolCallIds = /* @__PURE__ */ new Set();\n const modelCallContent = asContent({\n content: currentModelResponse.content,\n toolCalls: stepToolCalls,\n toolOutputs: [],\n toolApprovalRequests: [],\n toolApprovalResponses: [],\n tools\n });\n await notify({\n event: {\n callId,\n provider: stepModel.provider,\n modelId: stepModel.modelId,\n finishReason: currentModelResponse.finishReason.unified,\n usage: stepUsage,\n content: modelCallContent,\n responseId: currentModelResponse.response.id,\n performance: {\n responseTimeMs,\n effectiveOutputTokensPerSecond: calculateTokensPerSecond({\n tokens: stepUsage.outputTokens,\n durationMs: responseTimeMs\n }),\n outputTokensPerSecond: void 0,\n inputTokensPerSecond: void 0,\n effectiveTotalTokensPerSecond: calculateTokensPerSecond({\n tokens: sumTokenCounts(\n stepUsage.inputTokens,\n stepUsage.outputTokens\n ),\n durationMs: responseTimeMs\n }),\n timeToFirstOutputMs: void 0\n }\n },\n callbacks: [\n resolvedOnLanguageModelCallEnd,\n telemetryDispatcher.onLanguageModelCallEnd\n ]\n });\n for (const toolCall of stepToolCalls) {\n if (toolCall.invalid) {\n continue;\n }\n const tool2 = getOwn(tools, toolCall.toolName);\n if (tool2 == null) {\n continue;\n }\n if (tool2.onInputStart != null) {\n await tool2.onInputStart({\n toolCallId: toolCall.toolCallId,\n messages: stepMessages,\n abortSignal: mergedAbortSignal,\n context: runtimeContext\n });\n }\n if ((tool2 == null ? void 0 : tool2.onInputAvailable) != null) {\n await tool2.onInputAvailable({\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n messages: stepMessages,\n abortSignal: mergedAbortSignal,\n context: runtimeContext\n });\n }\n const toolApprovalStatus = await resolveToolApproval({\n tools,\n toolApproval,\n toolCall,\n messages: stepMessages,\n toolsContext,\n runtimeContext\n });\n if (toolApprovalStatus.type === \"not-applicable\") {\n continue;\n }\n const approvalId = generateId2();\n const signature = await maybeSignApproval({\n secret: experimental_toolApprovalSecret,\n approvalId,\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input\n });\n switch (toolApprovalStatus.type) {\n case \"user-approval\": {\n toolApprovalRequests[toolCall.toolCallId] = {\n type: \"tool-approval-request\",\n approvalId,\n toolCall,\n ...signature != null ? { signature } : {}\n };\n blockedToolCallIds.add(toolCall.toolCallId);\n break;\n }\n case \"approved\": {\n toolApprovalRequests[toolCall.toolCallId] = {\n type: \"tool-approval-request\",\n approvalId,\n toolCall,\n isAutomatic: true,\n ...signature != null ? { signature } : {}\n };\n stepToolApprovalResponses[toolCall.toolCallId] = {\n type: \"tool-approval-response\",\n approvalId,\n toolCall,\n approved: true,\n reason: toolApprovalStatus.reason,\n providerExecuted: toolCall.providerExecuted\n };\n break;\n }\n case \"denied\": {\n toolApprovalRequests[toolCall.toolCallId] = {\n type: \"tool-approval-request\",\n approvalId,\n toolCall,\n isAutomatic: true,\n ...signature != null ? { signature } : {}\n };\n stepToolApprovalResponses[toolCall.toolCallId] = {\n type: \"tool-approval-response\",\n approvalId,\n toolCall,\n approved: false,\n reason: toolApprovalStatus.reason,\n providerExecuted: toolCall.providerExecuted\n };\n blockedToolCallIds.add(toolCall.toolCallId);\n break;\n }\n }\n }\n const invalidToolCalls = stepToolCalls.filter(\n (toolCall) => toolCall.invalid && toolCall.dynamic\n );\n clientToolOutputs = [];\n for (const toolCall of invalidToolCalls) {\n clientToolOutputs.push({\n type: \"tool-error\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n error: getErrorMessage4(toolCall.error),\n dynamic: true\n });\n }\n clientToolCalls = stepToolCalls.filter(\n (toolCall) => !toolCall.providerExecuted\n );\n toolApprovalResponses = Object.values(stepToolApprovalResponses);\n deniedToolApprovalResponses = toolApprovalResponses.filter(\n (toolApprovalResponse) => toolApprovalResponse.approved === false\n );\n const toolExecutionMs = {};\n if (tools != null) {\n const toolExecutionResults = await executeTools({\n toolCalls: clientToolCalls.filter(\n (toolCall) => !toolCall.invalid && !blockedToolCallIds.has(toolCall.toolCallId)\n ),\n tools,\n callId,\n messages: stepMessages,\n abortSignal: mergedAbortSignal,\n timeout,\n experimental_sandbox: stepSandbox,\n toolsContext,\n onToolExecutionStart: (event) => notify({\n event,\n callbacks: [\n resolvedOnToolExecutionStart,\n telemetryDispatcher.onToolExecutionStart\n ]\n }),\n onToolExecutionEnd: (event) => notify({\n event,\n callbacks: [\n resolvedOnToolExecutionEnd,\n telemetryDispatcher.onToolExecutionEnd\n ]\n }),\n executeToolInTelemetryContext: telemetryDispatcher.executeTool,\n runInTracingChannelSpan\n });\n for (const result of toolExecutionResults) {\n toolExecutionMs[result.output.toolCallId] = result.toolExecutionMs;\n clientToolOutputs.push(result.output);\n }\n }\n const stepTimeMs = now2() - stepStartTimestampMs;\n const stepPerformance = {\n effectiveOutputTokensPerSecond: calculateTokensPerSecond({\n tokens: stepUsage.outputTokens,\n durationMs: responseTimeMs\n }),\n outputTokensPerSecond: void 0,\n inputTokensPerSecond: void 0,\n effectiveTotalTokensPerSecond: calculateTokensPerSecond({\n tokens: sumTokenCounts(\n stepUsage.inputTokens,\n stepUsage.outputTokens\n ),\n durationMs: responseTimeMs\n }),\n stepTimeMs,\n responseTimeMs,\n toolExecutionMs,\n timeToFirstOutputMs: void 0\n };\n for (const toolCall of stepToolCalls) {\n if (!toolCall.providerExecuted)\n continue;\n const tool2 = getOwn(tools, toolCall.toolName);\n if ((tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults) {\n const hasResultInResponse = currentModelResponse.content.some(\n (part) => part.type === \"tool-result\" && part.toolCallId === toolCall.toolCallId\n );\n if (!hasResultInResponse) {\n pendingDeferredToolCalls.set(toolCall.toolCallId, {\n toolName: toolCall.toolName\n });\n }\n }\n }\n for (const part of currentModelResponse.content) {\n if (part.type === \"tool-result\") {\n pendingDeferredToolCalls.delete(part.toolCallId);\n }\n }\n const stepContent = asContent({\n content: currentModelResponse.content,\n toolCalls: stepToolCalls,\n toolOutputs: clientToolOutputs,\n toolApprovalRequests: Object.values(toolApprovalRequests),\n toolApprovalResponses,\n tools\n });\n const stepResponseMessages = await toResponseMessages({\n content: stepContent,\n tools\n });\n const stepRequest = {\n ...currentModelResponse.request,\n body: include.requestBody ? (_o = currentModelResponse.request) == null ? void 0 : _o.body : void 0,\n messages: include.requestMessages ? cloneModelMessages(stepMessages) : void 0\n };\n const stepResponse = {\n ...currentModelResponse.response,\n // deep clone msgs to avoid mutating step results in multi-step:\n messages: cloneModelMessages(stepResponseMessages),\n // Conditionally include response body:\n body: include.responseBody ? (_p = currentModelResponse.response) == null ? void 0 : _p.body : void 0\n };\n const currentStepResult = new DefaultStepResult({\n callId,\n stepNumber,\n provider: stepModel.provider,\n modelId: stepModel.modelId,\n runtimeContext,\n content: stepContent,\n finishReason: currentModelResponse.finishReason.unified,\n rawFinishReason: currentModelResponse.finishReason.raw,\n usage: stepUsage,\n performance: stepPerformance,\n warnings: currentModelResponse.warnings,\n providerMetadata: currentModelResponse.providerMetadata,\n request: stepRequest,\n response: stepResponse,\n toolsContext\n });\n logWarnings({\n warnings: (_q = currentModelResponse.warnings) != null ? _q : [],\n provider: stepModel.provider,\n model: stepModel.modelId\n });\n steps.push(currentStepResult);\n instructionsForNextStep = stepInstructions;\n messagesForNextStep = [...stepMessages, ...stepResponseMessages];\n await notify({\n event: currentStepResult,\n callbacks: [resolvedOnStepEnd, telemetryDispatcher.onStepEnd]\n });\n return currentStepResult;\n }\n });\n } finally {\n if (stepTimeoutId != null) {\n clearTimeout(stepTimeoutId);\n }\n }\n } while (\n // Continue if:\n // 1. There are client tool calls that have all been executed or denied, OR\n // 2. There are pending deferred results from provider-executed tools\n (clientToolCalls.length > 0 && clientToolOutputs.length + deniedToolApprovalResponses.length === clientToolCalls.length || pendingDeferredToolCalls.size > 0) && // continue until a stop condition is met:\n !await isStopConditionMet({ stopConditions, steps })\n );\n const lastStep = steps[steps.length - 1];\n const totalUsage = steps.reduce(\n (totalUsage2, step) => {\n return addLanguageModelUsage(totalUsage2, step.usage);\n },\n {\n inputTokens: void 0,\n inputTokenDetails: {\n noCacheTokens: void 0,\n cacheReadTokens: void 0,\n cacheWriteTokens: void 0\n },\n outputTokens: void 0,\n outputTokenDetails: {\n textTokens: void 0,\n reasoningTokens: void 0\n },\n totalTokens: void 0\n }\n );\n const files = steps.flatMap((step) => step.files);\n const sources = steps.flatMap((step) => step.sources);\n const toolCalls = steps.flatMap((step) => step.toolCalls);\n const staticToolCalls = steps.flatMap((step) => step.staticToolCalls);\n const dynamicToolCalls = steps.flatMap((step) => step.dynamicToolCalls);\n const toolResults = steps.flatMap((step) => step.toolResults);\n const staticToolResults = steps.flatMap((step) => step.staticToolResults);\n const dynamicToolResults = steps.flatMap((step) => step.dynamicToolResults);\n const warnings = steps.flatMap((step) => {\n var _a24;\n return (_a24 = step.warnings) != null ? _a24 : [];\n });\n const onEndEvent = {\n callId,\n stepNumber: lastStep.stepNumber,\n model: lastStep.model,\n runtimeContext: lastStep.runtimeContext,\n finishReason: lastStep.finishReason,\n rawFinishReason: lastStep.rawFinishReason,\n usage: totalUsage,\n totalUsage,\n content: steps.flatMap((step) => step.content),\n text: lastStep.text,\n reasoning: lastStep.reasoning,\n reasoningText: lastStep.reasoningText,\n files,\n sources,\n toolCalls,\n staticToolCalls,\n dynamicToolCalls,\n toolResults,\n staticToolResults,\n dynamicToolResults,\n responseMessages: [\n ...initialResponseMessages,\n ...steps.flatMap((step) => step.response.messages)\n ],\n warnings,\n request: lastStep.request,\n response: lastStep.response,\n providerMetadata: lastStep.providerMetadata,\n steps,\n finalStep: lastStep,\n toolsContext\n };\n await notify({\n event: onEndEvent,\n callbacks: [onEnd, telemetryDispatcher.onEnd]\n });\n let resolvedOutput;\n if (lastStep.finishReason === \"stop\") {\n const outputSpecification = output != null ? output : text();\n resolvedOutput = await outputSpecification.parseCompleteOutput(\n { text: lastStep.text },\n {\n response: lastStep.response,\n usage: lastStep.usage,\n finishReason: lastStep.finishReason\n }\n );\n }\n return new DefaultGenerateTextResult({\n initialResponseMessages,\n steps,\n totalUsage,\n output: resolvedOutput\n });\n } catch (error) {\n await ((_a23 = telemetryDispatcher.onError) == null ? void 0 : _a23.call(telemetryDispatcher, { callId, error }));\n throw wrapGatewayError(error);\n }\n };\n return await runInTracingChannelSpan({\n type: \"generateText\",\n event: generateTextStartEvent,\n execute: executeGenerateText\n });\n}\nasync function executeTools({\n toolCalls,\n tools,\n callId,\n messages,\n abortSignal,\n timeout,\n experimental_sandbox: sandbox,\n toolsContext,\n onToolExecutionStart,\n onToolExecutionEnd,\n executeToolInTelemetryContext,\n runInTracingChannelSpan\n}) {\n const toolResults = await Promise.all(\n toolCalls.map(\n async (toolCall) => await executeToolCall({\n toolCall,\n tools,\n callId,\n messages,\n abortSignal,\n timeout,\n experimental_sandbox: sandbox,\n toolsContext,\n onToolExecutionStart,\n onToolExecutionEnd,\n executeToolInTelemetryContext,\n runInTracingChannelSpan\n })\n )\n );\n return toolResults.filter(\n (result) => result != null\n );\n}\nvar DefaultGenerateTextResult = class {\n constructor(options) {\n this.initialResponseMessages = options.initialResponseMessages;\n this.steps = options.steps;\n this._output = options.output;\n this.totalUsage = options.totalUsage;\n }\n get finalStep() {\n return this.steps.at(-1);\n }\n get content() {\n return this.steps.flatMap((step) => step.content);\n }\n get text() {\n return this.finalStep.text;\n }\n get files() {\n return this.steps.flatMap((step) => step.files);\n }\n get reasoningText() {\n return this.finalStep.reasoningText;\n }\n get reasoning() {\n return convertToReasoningOutputs(this.finalStep.reasoning);\n }\n get toolCalls() {\n return this.steps.flatMap((step) => step.toolCalls);\n }\n get staticToolCalls() {\n return this.steps.flatMap((step) => step.staticToolCalls);\n }\n get dynamicToolCalls() {\n return this.steps.flatMap((step) => step.dynamicToolCalls);\n }\n get toolResults() {\n return this.steps.flatMap((step) => step.toolResults);\n }\n get staticToolResults() {\n return this.steps.flatMap((step) => step.staticToolResults);\n }\n get dynamicToolResults() {\n return this.steps.flatMap((step) => step.dynamicToolResults);\n }\n get sources() {\n return this.steps.flatMap((step) => step.sources);\n }\n get finishReason() {\n return this.finalStep.finishReason;\n }\n get rawFinishReason() {\n return this.finalStep.rawFinishReason;\n }\n get warnings() {\n return this.steps.flatMap((step) => {\n var _a22;\n return (_a22 = step.warnings) != null ? _a22 : [];\n });\n }\n get providerMetadata() {\n return this.finalStep.providerMetadata;\n }\n get response() {\n return this.finalStep.response;\n }\n get responseMessages() {\n return [\n ...this.initialResponseMessages,\n ...this.steps.flatMap((step) => step.response.messages)\n ];\n }\n get request() {\n return this.finalStep.request;\n }\n get usage() {\n return this.totalUsage;\n }\n get output() {\n if (this._output == null) {\n throw new NoOutputGeneratedError();\n }\n return this._output;\n }\n};\nfunction asContent({\n content,\n toolCalls,\n toolOutputs,\n toolApprovalRequests,\n toolApprovalResponses,\n tools\n}) {\n const contentParts = [];\n const toolOutputsWithApprovalResponses = [];\n const toolOutputsWithoutApprovalResponses = [];\n const toolCallIdsWithApprovalResponses = new Set(\n toolApprovalResponses.map(\n (toolApprovalResponse) => toolApprovalResponse.toolCall.toolCallId\n )\n );\n for (const part of content) {\n switch (part.type) {\n case \"text\":\n case \"reasoning\":\n case \"custom\":\n case \"source\":\n contentParts.push(part);\n break;\n case \"file\":\n case \"reasoning-file\": {\n contentParts.push({\n type: part.type,\n file: new DefaultGeneratedFile({\n data: part.data.type === \"data\" ? part.data.data : part.data.url.toString(),\n mediaType: part.mediaType\n }),\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n break;\n }\n case \"tool-call\": {\n contentParts.push(\n toolCalls.find((toolCall) => toolCall.toolCallId === part.toolCallId)\n );\n break;\n }\n case \"tool-result\": {\n const toolCall = toolCalls.find(\n (toolCall2) => toolCall2.toolCallId === part.toolCallId\n );\n if (toolCall == null) {\n const tool2 = getOwn(tools, part.toolName);\n const supportsDeferredResults = (tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults;\n if (!supportsDeferredResults) {\n throw new Error(`Tool call ${part.toolCallId} not found.`);\n }\n if (part.isError) {\n contentParts.push({\n type: \"tool-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: void 0,\n error: part.result,\n providerExecuted: true,\n dynamic: part.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...(tool2 == null ? void 0 : tool2.metadata) != null ? { toolMetadata: tool2.metadata } : {}\n });\n } else {\n contentParts.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: void 0,\n output: part.result,\n providerExecuted: true,\n dynamic: part.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...(tool2 == null ? void 0 : tool2.metadata) != null ? { toolMetadata: tool2.metadata } : {}\n });\n }\n break;\n }\n if (part.isError) {\n contentParts.push({\n type: \"tool-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: toolCall.input,\n error: part.result,\n providerExecuted: true,\n dynamic: toolCall.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n });\n } else {\n contentParts.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: toolCall.input,\n output: part.result,\n providerExecuted: true,\n dynamic: toolCall.dynamic,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n });\n }\n break;\n }\n case \"tool-approval-request\": {\n const toolCall = toolCalls.find(\n (toolCall2) => toolCall2.toolCallId === part.toolCallId\n );\n if (toolCall == null) {\n throw new ToolCallNotFoundForApprovalError({\n toolCallId: part.toolCallId,\n approvalId: part.approvalId\n });\n }\n contentParts.push({\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCall\n });\n break;\n }\n }\n }\n for (const toolOutput of toolOutputs) {\n if (toolCallIdsWithApprovalResponses.has(toolOutput.toolCallId)) {\n toolOutputsWithApprovalResponses.push(toolOutput);\n } else {\n toolOutputsWithoutApprovalResponses.push(toolOutput);\n }\n }\n return [\n ...contentParts,\n ...toolOutputsWithoutApprovalResponses,\n ...toolApprovalRequests,\n ...toolApprovalResponses,\n ...toolOutputsWithApprovalResponses\n ];\n}\n\n// src/generate-text/stream-text.ts\nimport {\n getErrorMessage as getErrorMessage6,\n UnsupportedFunctionalityError as UnsupportedFunctionalityError2\n} from \"@ai-sdk/provider\";\nimport {\n asArray as asArray6,\n createIdGenerator as createIdGenerator3,\n DelayedPromise,\n filterNullable as filterNullable2,\n isAbortError\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/prepare-headers.ts\nfunction prepareHeaders(headers, defaultHeaders) {\n const responseHeaders = new Headers(headers != null ? headers : {});\n for (const [key, value] of Object.entries(defaultHeaders)) {\n if (!responseHeaders.has(key)) {\n responseHeaders.set(key, value);\n }\n }\n return responseHeaders;\n}\n\n// src/text-stream/create-text-stream-response.ts\nfunction createTextStreamResponse({\n status,\n statusText,\n headers,\n stream\n}) {\n return new Response(stream.pipeThrough(new TextEncoderStream()), {\n status: status != null ? status : 200,\n statusText,\n headers: prepareHeaders(headers, {\n \"content-type\": \"text/plain; charset=utf-8\"\n })\n });\n}\n\n// src/util/write-to-server-response.ts\nfunction writeToServerResponse({\n response,\n status,\n statusText,\n headers,\n stream\n}) {\n const statusCode = status != null ? status : 200;\n if (statusText !== void 0) {\n response.writeHead(statusCode, statusText, headers);\n } else {\n response.writeHead(statusCode, headers);\n }\n const reader = stream.getReader();\n const read = async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done)\n break;\n const canContinue = response.write(value);\n const flush = response.flush;\n if (typeof flush === \"function\") {\n flush.call(response);\n }\n if (!canContinue) {\n await new Promise((resolve3) => {\n response.once(\"drain\", resolve3);\n });\n }\n }\n } catch (error) {\n throw error;\n } finally {\n response.end();\n }\n };\n read();\n}\n\n// src/text-stream/pipe-text-stream-to-response.ts\nfunction pipeTextStreamToResponse({\n response,\n status,\n statusText,\n headers,\n stream\n}) {\n writeToServerResponse({\n response,\n status,\n statusText,\n headers: Object.fromEntries(\n prepareHeaders(headers, {\n \"content-type\": \"text/plain; charset=utf-8\"\n }).entries()\n ),\n stream: stream.pipeThrough(new TextEncoderStream())\n });\n}\n\n// src/text-stream/to-text-stream.ts\nfunction toTextStream({\n stream\n}) {\n return stream.pipeThrough(\n new TransformStream({\n transform(part, controller) {\n if (part.type === \"text-delta\") {\n controller.enqueue(part.text);\n }\n }\n })\n );\n}\n\n// src/ui-message-stream/json-to-sse-transform-stream.ts\nvar JsonToSseTransformStream = class extends TransformStream {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\n\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n }\n });\n }\n};\n\n// src/ui-message-stream/ui-message-stream-headers.ts\nvar UI_MESSAGE_STREAM_HEADERS = {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-vercel-ai-ui-message-stream\": \"v1\",\n \"x-accel-buffering\": \"no\"\n // disable nginx buffering\n};\n\n// src/ui-message-stream/create-ui-message-stream-response.ts\nfunction createUIMessageStreamResponse({\n status,\n statusText,\n headers,\n stream,\n consumeSseStream\n}) {\n let sseStream = stream.pipeThrough(new JsonToSseTransformStream());\n if (consumeSseStream) {\n const [stream1, stream2] = sseStream.tee();\n sseStream = stream1;\n consumeSseStream({ stream: stream2 });\n }\n return new Response(sseStream.pipeThrough(new TextEncoderStream()), {\n status,\n statusText,\n headers: prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS)\n });\n}\n\n// src/ui-message-stream/pipe-ui-message-stream-to-response.ts\nfunction pipeUIMessageStreamToResponse({\n response,\n status,\n statusText,\n headers,\n stream,\n consumeSseStream\n}) {\n let sseStream = stream.pipeThrough(new JsonToSseTransformStream());\n if (consumeSseStream) {\n const [stream1, stream2] = sseStream.tee();\n sseStream = stream1;\n consumeSseStream({ stream: stream2 });\n }\n writeToServerResponse({\n response,\n status,\n statusText,\n headers: Object.fromEntries(\n prepareHeaders(headers, UI_MESSAGE_STREAM_HEADERS).entries()\n ),\n stream: sseStream.pipeThrough(new TextEncoderStream())\n });\n}\n\n// src/ui-message-stream/get-response-ui-message-id.ts\nfunction getResponseUIMessageId({\n originalMessages,\n responseMessageId\n}) {\n if (originalMessages == null) {\n return void 0;\n }\n const lastMessage = originalMessages[originalMessages.length - 1];\n return (lastMessage == null ? void 0 : lastMessage.role) === \"assistant\" ? lastMessage.id : typeof responseMessageId === \"function\" ? responseMessageId() : responseMessageId;\n}\n\n// src/ui/process-ui-message-stream.ts\nimport { validateTypes as validateTypes2 } from \"@ai-sdk/provider-utils\";\n\n// src/ui-message-stream/ui-message-chunks.ts\nimport { z as z6 } from \"zod/v4\";\nimport { lazySchema, zodSchema } from \"@ai-sdk/provider-utils\";\nvar toolMetadataSchema = z6.record(\n z6.string(),\n jsonValueSchema.optional()\n);\nvar uiMessageChunkSchema = lazySchema(\n () => zodSchema(\n z6.union([\n z6.strictObject({\n type: z6.literal(\"text-start\"),\n id: z6.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z6.strictObject({\n type: z6.literal(\"text-delta\"),\n id: z6.string(),\n delta: z6.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z6.strictObject({\n type: z6.literal(\"text-end\"),\n id: z6.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z6.strictObject({\n type: z6.literal(\"error\"),\n errorText: z6.string()\n }),\n z6.strictObject({\n type: z6.literal(\"tool-input-start\"),\n toolCallId: z6.string(),\n toolName: z6.string(),\n providerExecuted: z6.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z6.boolean().optional(),\n title: z6.string().optional()\n }),\n z6.strictObject({\n type: z6.literal(\"tool-input-delta\"),\n toolCallId: z6.string(),\n inputTextDelta: z6.string()\n }),\n z6.strictObject({\n type: z6.literal(\"tool-input-available\"),\n toolCallId: z6.string(),\n toolName: z6.string(),\n input: z6.unknown(),\n providerExecuted: z6.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z6.boolean().optional(),\n title: z6.string().optional()\n }),\n z6.strictObject({\n type: z6.literal(\"tool-input-error\"),\n toolCallId: z6.string(),\n toolName: z6.string(),\n input: z6.unknown(),\n providerExecuted: z6.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z6.boolean().optional(),\n errorText: z6.string(),\n title: z6.string().optional()\n }),\n z6.strictObject({\n type: z6.literal(\"tool-approval-request\"),\n approvalId: z6.string(),\n toolCallId: z6.string(),\n isAutomatic: z6.boolean().optional(),\n signature: z6.string().optional()\n }),\n z6.strictObject({\n type: z6.literal(\"tool-approval-response\"),\n approvalId: z6.string(),\n approved: z6.boolean(),\n reason: z6.string().optional(),\n providerExecuted: z6.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z6.strictObject({\n type: z6.literal(\"tool-output-available\"),\n toolCallId: z6.string(),\n output: z6.unknown(),\n providerExecuted: z6.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z6.boolean().optional(),\n preliminary: z6.boolean().optional()\n }),\n z6.strictObject({\n type: z6.literal(\"tool-output-error\"),\n toolCallId: z6.string(),\n errorText: z6.string(),\n providerExecuted: z6.boolean().optional(),\n providerMetadata: providerMetadataSchema.optional(),\n toolMetadata: toolMetadataSchema.optional(),\n dynamic: z6.boolean().optional()\n }),\n z6.strictObject({\n type: z6.literal(\"tool-output-denied\"),\n toolCallId: z6.string()\n }),\n z6.strictObject({\n type: z6.literal(\"reasoning-start\"),\n id: z6.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z6.strictObject({\n type: z6.literal(\"reasoning-delta\"),\n id: z6.string(),\n delta: z6.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z6.strictObject({\n type: z6.literal(\"reasoning-end\"),\n id: z6.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z6.strictObject({\n type: z6.literal(\"custom\"),\n kind: z6.string().transform((value) => value),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z6.strictObject({\n type: z6.literal(\"source-url\"),\n sourceId: z6.string(),\n url: z6.string(),\n title: z6.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z6.strictObject({\n type: z6.literal(\"source-document\"),\n sourceId: z6.string(),\n mediaType: z6.string(),\n title: z6.string(),\n filename: z6.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z6.strictObject({\n type: z6.literal(\"file\"),\n url: z6.string(),\n mediaType: z6.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z6.strictObject({\n type: z6.literal(\"reasoning-file\"),\n url: z6.string(),\n mediaType: z6.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z6.strictObject({\n type: z6.custom(\n (value) => typeof value === \"string\" && value.startsWith(\"data-\"),\n { message: 'Type must start with \"data-\"' }\n ),\n id: z6.string().optional(),\n data: z6.unknown(),\n transient: z6.boolean().optional()\n }),\n z6.strictObject({\n type: z6.literal(\"start-step\")\n }),\n z6.strictObject({\n type: z6.literal(\"finish-step\")\n }),\n z6.strictObject({\n type: z6.literal(\"start\"),\n messageId: z6.string().optional(),\n messageMetadata: z6.unknown().optional()\n }),\n z6.strictObject({\n type: z6.literal(\"finish\"),\n finishReason: z6.enum([\n \"stop\",\n \"length\",\n \"content-filter\",\n \"tool-calls\",\n \"error\",\n \"other\"\n ]).optional(),\n messageMetadata: z6.unknown().optional()\n }),\n z6.strictObject({\n type: z6.literal(\"abort\"),\n reason: z6.string().optional()\n }),\n z6.strictObject({\n type: z6.literal(\"message-metadata\"),\n messageMetadata: z6.unknown()\n })\n ])\n )\n);\nfunction isDataUIMessageChunk(chunk) {\n return chunk.type.startsWith(\"data-\");\n}\n\n// src/util/create-id-map.ts\nfunction createIdMap() {\n return /* @__PURE__ */ Object.create(null);\n}\n\n// src/ui/ui-messages.ts\nfunction isDataUIPart(part) {\n return part.type.startsWith(\"data-\");\n}\nfunction isTextUIPart(part) {\n return part.type === \"text\";\n}\nfunction isCustomContentUIPart(part) {\n return part.type === \"custom\";\n}\nfunction isFileUIPart(part) {\n return part.type === \"file\";\n}\nfunction isReasoningFileUIPart(part) {\n return part.type === \"reasoning-file\";\n}\nfunction isReasoningUIPart(part) {\n return part.type === \"reasoning\";\n}\nfunction isStaticToolUIPart(part) {\n return part.type.startsWith(\"tool-\");\n}\nfunction isDynamicToolUIPart(part) {\n return part.type === \"dynamic-tool\";\n}\nfunction isToolUIPart(part) {\n return isStaticToolUIPart(part) || isDynamicToolUIPart(part);\n}\nfunction getStaticToolName(part) {\n return part.type.split(\"-\").slice(1).join(\"-\");\n}\nfunction getToolName(part) {\n return isDynamicToolUIPart(part) ? part.toolName : getStaticToolName(part);\n}\nvar getToolOrDynamicToolName = getToolName;\n\n// src/ui/process-ui-message-stream.ts\nfunction createStreamingUIMessageState({\n lastMessage,\n messageId\n}) {\n return {\n message: (lastMessage == null ? void 0 : lastMessage.role) === \"assistant\" ? lastMessage : {\n id: messageId,\n metadata: void 0,\n role: \"assistant\",\n parts: []\n },\n activeTextParts: createIdMap(),\n activeReasoningParts: createIdMap(),\n partialToolCalls: createIdMap()\n };\n}\nfunction processUIMessageStream({\n stream,\n messageMetadataSchema,\n dataPartSchemas,\n runUpdateMessageJob,\n onError,\n onToolCall,\n onData\n}) {\n return stream.pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n await runUpdateMessageJob(async ({ state, write }) => {\n var _a22, _b, _c, _d;\n function getToolInvocation(toolCallId) {\n const toolInvocations = state.message.parts.filter(isToolUIPart);\n const toolInvocation = toolInvocations.find(\n (invocation) => invocation.toolCallId === toolCallId\n );\n if (toolInvocation == null) {\n throw new UIMessageStreamError({\n chunkType: \"tool-invocation\",\n chunkId: toolCallId,\n message: `No tool invocation found for tool call ID \"${toolCallId}\".`\n });\n }\n return toolInvocation;\n }\n function getToolInvocationByApprovalId(approvalId) {\n const toolInvocations = state.message.parts.filter(isToolUIPart);\n const toolInvocation = toolInvocations.find(\n (invocation) => {\n var _a23;\n return ((_a23 = invocation.approval) == null ? void 0 : _a23.id) === approvalId;\n }\n );\n if (toolInvocation == null) {\n throw new UIMessageStreamError({\n chunkType: \"tool-approval-response\",\n chunkId: approvalId,\n message: `No tool invocation found for approval ID \"${approvalId}\".`\n });\n }\n return toolInvocation;\n }\n function updateToolPart(options) {\n var _a23;\n const part = state.message.parts.find(\n (part2) => isStaticToolUIPart(part2) && part2.toolCallId === options.toolCallId\n );\n const anyOptions = options;\n const anyPart = part;\n if (part != null) {\n part.state = options.state;\n anyPart.input = anyOptions.input;\n anyPart.output = anyOptions.output;\n anyPart.errorText = anyOptions.errorText;\n anyPart.rawInput = anyOptions.rawInput;\n anyPart.preliminary = anyOptions.preliminary;\n if (options.title !== void 0) {\n anyPart.title = options.title;\n }\n if (options.toolMetadata !== void 0) {\n anyPart.toolMetadata = options.toolMetadata;\n }\n anyPart.providerExecuted = (_a23 = anyOptions.providerExecuted) != null ? _a23 : part.providerExecuted;\n const providerMetadata = anyOptions.providerMetadata;\n if (providerMetadata != null) {\n if (options.state === \"output-available\" || options.state === \"output-error\") {\n const resultPart = part;\n resultPart.resultProviderMetadata = providerMetadata;\n } else {\n part.callProviderMetadata = providerMetadata;\n }\n }\n } else {\n state.message.parts.push({\n type: `tool-${options.toolName}`,\n toolCallId: options.toolCallId,\n state: options.state,\n title: options.title,\n ...options.toolMetadata !== void 0 ? { toolMetadata: options.toolMetadata } : {},\n input: anyOptions.input,\n output: anyOptions.output,\n rawInput: anyOptions.rawInput,\n errorText: anyOptions.errorText,\n providerExecuted: anyOptions.providerExecuted,\n preliminary: anyOptions.preliminary,\n ...anyOptions.providerMetadata != null && (options.state === \"output-available\" || options.state === \"output-error\") ? { resultProviderMetadata: anyOptions.providerMetadata } : {},\n ...anyOptions.providerMetadata != null && !(options.state === \"output-available\" || options.state === \"output-error\") ? { callProviderMetadata: anyOptions.providerMetadata } : {}\n });\n }\n }\n function updateDynamicToolPart(options) {\n var _a23, _b2;\n const part = state.message.parts.find(\n (part2) => part2.type === \"dynamic-tool\" && part2.toolCallId === options.toolCallId\n );\n const anyOptions = options;\n const anyPart = part;\n if (part != null) {\n part.state = options.state;\n anyPart.toolName = options.toolName;\n anyPart.input = anyOptions.input;\n anyPart.output = anyOptions.output;\n anyPart.errorText = anyOptions.errorText;\n anyPart.rawInput = (_a23 = anyOptions.rawInput) != null ? _a23 : anyPart.rawInput;\n anyPart.preliminary = anyOptions.preliminary;\n if (options.title !== void 0) {\n anyPart.title = options.title;\n }\n if (options.toolMetadata !== void 0) {\n anyPart.toolMetadata = options.toolMetadata;\n }\n anyPart.providerExecuted = (_b2 = anyOptions.providerExecuted) != null ? _b2 : part.providerExecuted;\n const providerMetadata = anyOptions.providerMetadata;\n if (providerMetadata != null) {\n if (options.state === \"output-available\" || options.state === \"output-error\") {\n const resultPart = part;\n resultPart.resultProviderMetadata = providerMetadata;\n } else {\n part.callProviderMetadata = providerMetadata;\n }\n }\n } else {\n state.message.parts.push({\n type: \"dynamic-tool\",\n toolName: options.toolName,\n toolCallId: options.toolCallId,\n state: options.state,\n input: anyOptions.input,\n output: anyOptions.output,\n errorText: anyOptions.errorText,\n preliminary: anyOptions.preliminary,\n providerExecuted: anyOptions.providerExecuted,\n title: options.title,\n ...options.toolMetadata !== void 0 ? { toolMetadata: options.toolMetadata } : {},\n ...anyOptions.providerMetadata != null && (options.state === \"output-available\" || options.state === \"output-error\") ? { resultProviderMetadata: anyOptions.providerMetadata } : {},\n ...anyOptions.providerMetadata != null && !(options.state === \"output-available\" || options.state === \"output-error\") ? { callProviderMetadata: anyOptions.providerMetadata } : {}\n });\n }\n }\n async function updateMessageMetadata(metadata) {\n if (metadata != null) {\n const mergedMetadata = state.message.metadata != null ? mergeObjects(state.message.metadata, metadata) : metadata;\n if (messageMetadataSchema != null) {\n await validateTypes2({\n value: mergedMetadata,\n schema: messageMetadataSchema,\n context: {\n field: \"message.metadata\",\n entityId: state.message.id\n }\n });\n }\n state.message.metadata = mergedMetadata;\n }\n }\n switch (chunk.type) {\n case \"text-start\": {\n const textPart = {\n type: \"text\",\n text: \"\",\n providerMetadata: chunk.providerMetadata,\n state: \"streaming\"\n };\n state.activeTextParts[chunk.id] = textPart;\n state.message.parts.push(textPart);\n write();\n break;\n }\n case \"text-delta\": {\n const textPart = state.activeTextParts[chunk.id];\n if (textPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"text-delta\",\n chunkId: chunk.id,\n message: `Received text-delta for missing text part with ID \"${chunk.id}\". Ensure a \"text-start\" chunk is sent before any \"text-delta\" chunks.`\n });\n }\n textPart.text += chunk.delta;\n textPart.providerMetadata = (_a22 = chunk.providerMetadata) != null ? _a22 : textPart.providerMetadata;\n write();\n break;\n }\n case \"text-end\": {\n const textPart = state.activeTextParts[chunk.id];\n if (textPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"text-end\",\n chunkId: chunk.id,\n message: `Received text-end for missing text part with ID \"${chunk.id}\". Ensure a \"text-start\" chunk is sent before any \"text-end\" chunks.`\n });\n }\n textPart.state = \"done\";\n textPart.providerMetadata = (_b = chunk.providerMetadata) != null ? _b : textPart.providerMetadata;\n delete state.activeTextParts[chunk.id];\n write();\n break;\n }\n case \"custom\": {\n const customPart = {\n type: \"custom\",\n kind: chunk.kind,\n providerMetadata: chunk.providerMetadata\n };\n state.message.parts.push(customPart);\n write();\n break;\n }\n case \"reasoning-start\": {\n const reasoningPart = {\n type: \"reasoning\",\n text: \"\",\n providerMetadata: chunk.providerMetadata,\n state: \"streaming\"\n };\n state.activeReasoningParts[chunk.id] = reasoningPart;\n state.message.parts.push(reasoningPart);\n write();\n break;\n }\n case \"reasoning-delta\": {\n const reasoningPart = state.activeReasoningParts[chunk.id];\n if (reasoningPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"reasoning-delta\",\n chunkId: chunk.id,\n message: `Received reasoning-delta for missing reasoning part with ID \"${chunk.id}\". Ensure a \"reasoning-start\" chunk is sent before any \"reasoning-delta\" chunks.`\n });\n }\n reasoningPart.text += chunk.delta;\n reasoningPart.providerMetadata = (_c = chunk.providerMetadata) != null ? _c : reasoningPart.providerMetadata;\n write();\n break;\n }\n case \"reasoning-end\": {\n const reasoningPart = state.activeReasoningParts[chunk.id];\n if (reasoningPart == null) {\n throw new UIMessageStreamError({\n chunkType: \"reasoning-end\",\n chunkId: chunk.id,\n message: `Received reasoning-end for missing reasoning part with ID \"${chunk.id}\". Ensure a \"reasoning-start\" chunk is sent before any \"reasoning-end\" chunks.`\n });\n }\n reasoningPart.providerMetadata = (_d = chunk.providerMetadata) != null ? _d : reasoningPart.providerMetadata;\n reasoningPart.state = \"done\";\n delete state.activeReasoningParts[chunk.id];\n write();\n break;\n }\n case \"file\":\n case \"reasoning-file\": {\n state.message.parts.push({\n type: chunk.type,\n mediaType: chunk.mediaType,\n url: chunk.url,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}\n });\n write();\n break;\n }\n case \"source-url\": {\n state.message.parts.push({\n type: \"source-url\",\n sourceId: chunk.sourceId,\n url: chunk.url,\n title: chunk.title,\n providerMetadata: chunk.providerMetadata\n });\n write();\n break;\n }\n case \"source-document\": {\n state.message.parts.push({\n type: \"source-document\",\n sourceId: chunk.sourceId,\n mediaType: chunk.mediaType,\n title: chunk.title,\n filename: chunk.filename,\n providerMetadata: chunk.providerMetadata\n });\n write();\n break;\n }\n case \"tool-input-start\": {\n const toolInvocations = state.message.parts.filter(isStaticToolUIPart);\n state.partialToolCalls[chunk.toolCallId] = {\n text: \"\",\n toolName: chunk.toolName,\n index: toolInvocations.length,\n dynamic: chunk.dynamic,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata\n };\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-streaming\",\n input: void 0,\n providerExecuted: chunk.providerExecuted,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata,\n providerMetadata: chunk.providerMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-streaming\",\n input: void 0,\n providerExecuted: chunk.providerExecuted,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata,\n providerMetadata: chunk.providerMetadata\n });\n }\n write();\n break;\n }\n case \"tool-input-delta\": {\n const partialToolCall = state.partialToolCalls[chunk.toolCallId];\n if (partialToolCall == null) {\n throw new UIMessageStreamError({\n chunkType: \"tool-input-delta\",\n chunkId: chunk.toolCallId,\n message: `Received tool-input-delta for missing tool call with ID \"${chunk.toolCallId}\". Ensure a \"tool-input-start\" chunk is sent before any \"tool-input-delta\" chunks.`\n });\n }\n partialToolCall.text += chunk.inputTextDelta;\n const { value: partialArgs } = await parsePartialJson(\n partialToolCall.text\n );\n if (partialToolCall.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: partialToolCall.toolName,\n state: \"input-streaming\",\n input: partialArgs,\n title: partialToolCall.title,\n toolMetadata: partialToolCall.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: partialToolCall.toolName,\n state: \"input-streaming\",\n input: partialArgs,\n title: partialToolCall.title,\n toolMetadata: partialToolCall.toolMetadata\n });\n }\n write();\n break;\n }\n case \"tool-input-available\": {\n if (chunk.dynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-available\",\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-available\",\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: chunk.title,\n toolMetadata: chunk.toolMetadata\n });\n }\n write();\n if (onToolCall && !chunk.providerExecuted) {\n await onToolCall({\n toolCall: chunk\n });\n }\n break;\n }\n case \"tool-input-error\": {\n const existingPart = state.message.parts.filter(isToolUIPart).find((p) => p.toolCallId === chunk.toolCallId);\n const isDynamic = existingPart != null ? existingPart.type === \"dynamic-tool\" : !!chunk.dynamic;\n if (isDynamic) {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"output-error\",\n input: chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"output-error\",\n input: void 0,\n rawInput: chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata\n });\n }\n write();\n break;\n }\n case \"tool-approval-request\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n toolInvocation.state = \"approval-requested\";\n toolInvocation.approval = {\n id: chunk.approvalId,\n ...chunk.isAutomatic === true ? { isAutomatic: true } : {},\n ...chunk.signature != null ? { signature: chunk.signature } : {}\n };\n write();\n break;\n }\n case \"tool-approval-response\": {\n const toolInvocation = getToolInvocationByApprovalId(\n chunk.approvalId\n );\n const approval = toolInvocation.approval == null ? { id: chunk.approvalId } : toolInvocation.approval;\n toolInvocation.state = \"approval-responded\";\n toolInvocation.approval = {\n id: chunk.approvalId,\n approved: chunk.approved,\n ...chunk.reason != null ? { reason: chunk.reason } : {},\n ...approval.isAutomatic === true ? { isAutomatic: true } : {},\n ...approval.signature != null ? { signature: approval.signature } : {}\n };\n if (chunk.providerExecuted != null) {\n toolInvocation.providerExecuted = chunk.providerExecuted;\n }\n if (chunk.providerMetadata != null) {\n toolInvocation.callProviderMetadata = chunk.providerMetadata;\n }\n write();\n break;\n }\n case \"tool-output-denied\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n toolInvocation.state = \"output-denied\";\n write();\n break;\n }\n case \"tool-output-available\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n if (toolInvocation.type === \"dynamic-tool\") {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: toolInvocation.toolName,\n state: \"output-available\",\n input: toolInvocation.input,\n output: chunk.output,\n preliminary: chunk.preliminary,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title,\n toolMetadata: toolInvocation.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: getStaticToolName(toolInvocation),\n state: \"output-available\",\n input: toolInvocation.input,\n output: chunk.output,\n providerExecuted: chunk.providerExecuted,\n preliminary: chunk.preliminary,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title,\n toolMetadata: toolInvocation.toolMetadata\n });\n }\n write();\n break;\n }\n case \"tool-output-error\": {\n const toolInvocation = getToolInvocation(chunk.toolCallId);\n if (toolInvocation.type === \"dynamic-tool\") {\n updateDynamicToolPart({\n toolCallId: chunk.toolCallId,\n toolName: toolInvocation.toolName,\n state: \"output-error\",\n input: toolInvocation.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title,\n toolMetadata: toolInvocation.toolMetadata\n });\n } else {\n updateToolPart({\n toolCallId: chunk.toolCallId,\n toolName: getStaticToolName(toolInvocation),\n state: \"output-error\",\n input: toolInvocation.input,\n rawInput: toolInvocation.rawInput,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n title: toolInvocation.title,\n toolMetadata: toolInvocation.toolMetadata\n });\n }\n write();\n break;\n }\n case \"start-step\": {\n state.message.parts.push({ type: \"step-start\" });\n break;\n }\n case \"finish-step\": {\n state.activeTextParts = createIdMap();\n state.activeReasoningParts = createIdMap();\n break;\n }\n case \"start\": {\n if (chunk.messageId != null) {\n state.message.id = chunk.messageId;\n }\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageId != null || chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"finish\": {\n if (chunk.finishReason != null) {\n state.finishReason = chunk.finishReason;\n }\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"message-metadata\": {\n await updateMessageMetadata(chunk.messageMetadata);\n if (chunk.messageMetadata != null) {\n write();\n }\n break;\n }\n case \"error\": {\n onError == null ? void 0 : onError(new Error(chunk.errorText));\n break;\n }\n default: {\n if (isDataUIMessageChunk(chunk)) {\n if ((dataPartSchemas == null ? void 0 : dataPartSchemas[chunk.type]) != null) {\n const partIdx = state.message.parts.findIndex(\n (p) => \"id\" in p && \"data\" in p && p.id === chunk.id && p.type === chunk.type\n );\n const actualPartIdx = partIdx >= 0 ? partIdx : state.message.parts.length;\n await validateTypes2({\n value: chunk.data,\n schema: dataPartSchemas[chunk.type],\n context: {\n field: `message.parts[${actualPartIdx}].data`,\n entityName: chunk.type,\n entityId: chunk.id\n }\n });\n }\n const dataChunk = chunk;\n if (dataChunk.transient) {\n onData == null ? void 0 : onData(dataChunk);\n break;\n }\n const existingUIPart = dataChunk.id != null ? state.message.parts.find(\n (chunkArg) => dataChunk.type === chunkArg.type && dataChunk.id === chunkArg.id\n ) : void 0;\n if (existingUIPart != null) {\n existingUIPart.data = dataChunk.data;\n } else {\n state.message.parts.push(dataChunk);\n }\n onData == null ? void 0 : onData(dataChunk);\n write();\n }\n }\n }\n controller.enqueue(chunk);\n });\n }\n })\n );\n}\n\n// src/ui-message-stream/handle-ui-message-stream-finish.ts\nfunction handleUIMessageStreamFinish({\n messageId,\n originalMessages = [],\n onStepEnd,\n onStepFinish,\n onEnd,\n onFinish,\n onError,\n stream\n}) {\n let lastMessage = originalMessages == null ? void 0 : originalMessages[originalMessages.length - 1];\n if ((lastMessage == null ? void 0 : lastMessage.role) !== \"assistant\") {\n lastMessage = void 0;\n } else {\n messageId = lastMessage.id;\n }\n let isAborted = false;\n const idInjectedStream = stream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n if (chunk.type === \"start\") {\n const startChunk = chunk;\n if (startChunk.messageId == null && messageId != null) {\n startChunk.messageId = messageId;\n }\n }\n if (chunk.type === \"abort\") {\n isAborted = true;\n }\n controller.enqueue(chunk);\n }\n })\n );\n const resolvedOnStepEnd = onStepEnd != null ? onStepEnd : onStepFinish;\n const resolvedOnEnd = onEnd != null ? onEnd : onFinish;\n if (resolvedOnEnd == null && resolvedOnStepEnd == null) {\n return idInjectedStream;\n }\n const state = createStreamingUIMessageState({\n lastMessage: lastMessage ? structuredClone(lastMessage) : void 0,\n messageId: messageId != null ? messageId : \"\"\n // will be overridden by the stream\n });\n const runUpdateMessageJob = async (job) => {\n await job({ state, write: () => {\n } });\n };\n let finishCalled = false;\n const callOnEnd = async () => {\n if (finishCalled || !resolvedOnEnd) {\n return;\n }\n finishCalled = true;\n const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id);\n await resolvedOnEnd({\n isAborted,\n isContinuation,\n responseMessage: state.message,\n messages: [\n ...isContinuation ? originalMessages.slice(0, -1) : originalMessages,\n state.message\n ],\n finishReason: state.finishReason\n });\n };\n const callOnStepFinish = async () => {\n if (!resolvedOnStepEnd) {\n return;\n }\n const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id);\n try {\n await resolvedOnStepEnd({\n isContinuation,\n responseMessage: structuredClone(state.message),\n messages: [\n ...isContinuation ? originalMessages.slice(0, -1) : originalMessages,\n structuredClone(state.message)\n ]\n });\n } catch (error) {\n onError(error);\n }\n };\n return processUIMessageStream({\n stream: idInjectedStream,\n runUpdateMessageJob,\n onError\n }).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n if (chunk.type === \"finish-step\") {\n await callOnStepFinish();\n }\n controller.enqueue(chunk);\n },\n // @ts-expect-error cancel is still new and missing from types https://developer.mozilla.org/en-US/docs/Web/API/TransformStream#browser_compatibility\n async cancel() {\n await callOnEnd();\n },\n async flush() {\n await callOnEnd();\n }\n })\n );\n}\n\n// src/ui-message-stream/to-ui-message-chunk.ts\nfunction toUIMessageChunk(part, {\n tools,\n sendReasoning = true,\n sendSources = false,\n sendStart = true,\n sendFinish = true,\n onError = () => \"An error occurred.\",\n // prevent leaking server error details to the client by default\n messageMetadata,\n responseMessageId\n} = {}) {\n const isDynamic = (toolPart) => {\n const tool2 = tools == null ? void 0 : tools[toolPart.toolName];\n if (tool2 == null) {\n return toolPart.dynamic;\n }\n return (tool2 == null ? void 0 : tool2.type) === \"dynamic\" ? true : void 0;\n };\n const partType = part.type;\n switch (partType) {\n case \"text-start\": {\n return {\n type: \"text-start\",\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n };\n }\n case \"text-delta\": {\n return {\n type: \"text-delta\",\n id: part.id,\n delta: part.text,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n };\n }\n case \"text-end\": {\n return {\n type: \"text-end\",\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n };\n }\n case \"reasoning-start\":\n case \"reasoning-end\": {\n if (!sendReasoning) {\n return void 0;\n }\n return {\n type: partType,\n id: part.id,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n };\n }\n case \"reasoning-delta\": {\n if (!sendReasoning) {\n return void 0;\n }\n return {\n type: \"reasoning-delta\",\n id: part.id,\n delta: part.text,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n };\n }\n case \"file\":\n case \"reasoning-file\": {\n if (partType === \"reasoning-file\" && !sendReasoning) {\n return void 0;\n }\n return {\n type: part.type,\n mediaType: part.file.mediaType,\n url: `data:${part.file.mediaType};base64,${part.file.base64}`,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n };\n }\n case \"source\": {\n if (!sendSources) {\n return void 0;\n }\n if (part.sourceType === \"url\") {\n return {\n type: \"source-url\",\n sourceId: part.id,\n url: part.url,\n title: part.title,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n };\n }\n if (part.sourceType === \"document\") {\n return {\n type: \"source-document\",\n sourceId: part.id,\n mediaType: part.mediaType,\n title: part.title,\n filename: part.filename,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n };\n }\n return void 0;\n }\n case \"custom\": {\n return {\n type: \"custom\",\n kind: part.kind,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n };\n }\n case \"tool-input-start\": {\n const dynamic = isDynamic(part);\n return {\n type: \"tool-input-start\",\n toolCallId: part.id,\n toolName: part.toolName,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n ...part.title != null ? { title: part.title } : {}\n };\n }\n case \"tool-input-delta\": {\n return {\n type: \"tool-input-delta\",\n toolCallId: part.id,\n inputTextDelta: part.delta\n };\n }\n case \"tool-call\": {\n const dynamic = isDynamic(part);\n if (part.invalid) {\n return {\n type: \"tool-input-error\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n errorText: onError(part.error),\n ...part.title != null ? { title: part.title } : {}\n };\n }\n return {\n type: \"tool-input-available\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...dynamic != null ? { dynamic } : {},\n ...part.title != null ? { title: part.title } : {}\n };\n }\n case \"tool-approval-request\": {\n return {\n type: \"tool-approval-request\",\n approvalId: part.approvalId,\n toolCallId: part.toolCall.toolCallId,\n ...part.isAutomatic != null ? { isAutomatic: part.isAutomatic } : {},\n ...part.signature != null ? { signature: part.signature } : {}\n };\n }\n case \"tool-approval-response\": {\n return {\n type: \"tool-approval-response\",\n approvalId: part.approvalId,\n approved: part.approved,\n ...part.reason != null ? { reason: part.reason } : {},\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {}\n };\n }\n case \"tool-result\": {\n const dynamic = isDynamic(part);\n return {\n type: \"tool-output-available\",\n toolCallId: part.toolCallId,\n // UI stream chunks are serialized as JSON, which drops undefined\n // properties. Use null so tool outputs always keep the output field.\n output: part.output === void 0 ? null : part.output,\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...part.preliminary != null ? { preliminary: part.preliminary } : {},\n ...dynamic != null ? { dynamic } : {}\n };\n }\n case \"tool-error\": {\n const dynamic = isDynamic(part);\n return {\n type: \"tool-output-error\",\n toolCallId: part.toolCallId,\n errorText: part.providerExecuted ? typeof part.error === \"string\" ? part.error : JSON.stringify(part.error) : onError(part.error),\n ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},\n ...part.toolMetadata != null ? { toolMetadata: part.toolMetadata } : {},\n ...dynamic != null ? { dynamic } : {}\n };\n }\n case \"tool-output-denied\": {\n return {\n type: \"tool-output-denied\",\n toolCallId: part.toolCallId\n };\n }\n case \"error\": {\n return {\n type: \"error\",\n errorText: onError(part.error)\n };\n }\n case \"start-step\": {\n return { type: \"start-step\" };\n }\n case \"finish-step\": {\n return { type: \"finish-step\" };\n }\n case \"start\": {\n if (!sendStart) {\n return void 0;\n }\n return {\n type: \"start\",\n ...messageMetadata != null ? { messageMetadata } : {},\n ...responseMessageId != null ? { messageId: responseMessageId } : {}\n };\n }\n case \"finish\": {\n if (!sendFinish) {\n return void 0;\n }\n return {\n type: \"finish\",\n finishReason: part.finishReason,\n ...messageMetadata != null ? { messageMetadata } : {}\n };\n }\n case \"abort\": {\n return part;\n }\n case \"tool-input-end\":\n case \"raw\": {\n return void 0;\n }\n default: {\n const exhaustiveCheck = partType;\n throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);\n }\n }\n}\n\n// src/ui-message-stream/to-ui-message-stream.ts\nfunction toUIMessageStream({\n stream,\n tools,\n sendReasoning = true,\n sendSources = false,\n sendStart = true,\n sendFinish = true,\n onError = () => \"An error occurred.\",\n // prevent leaking server error details to the client by default\n messageMetadata,\n originalMessages,\n generateMessageId,\n onEnd,\n onFinish\n}) {\n const responseMessageId = generateMessageId != null ? getResponseUIMessageId({\n originalMessages,\n responseMessageId: generateMessageId\n }) : void 0;\n const uiMessageChunkStream = stream.pipeThrough(\n new TransformStream({\n transform: async (part, controller) => {\n const messageMetadataValue = messageMetadata == null ? void 0 : messageMetadata({ part });\n const uiMessageChunk = toUIMessageChunk(part, {\n tools,\n sendReasoning,\n sendSources,\n sendStart,\n sendFinish,\n onError,\n messageMetadata: messageMetadataValue,\n responseMessageId\n });\n if (uiMessageChunk != null) {\n controller.enqueue(uiMessageChunk);\n }\n if (messageMetadataValue != null && part.type !== \"start\" && part.type !== \"finish\") {\n controller.enqueue({\n type: \"message-metadata\",\n messageMetadata: messageMetadataValue\n });\n }\n }\n })\n );\n return handleUIMessageStreamFinish({\n stream: uiMessageChunkStream,\n messageId: responseMessageId != null ? responseMessageId : generateMessageId == null ? void 0 : generateMessageId(),\n originalMessages,\n onEnd: onEnd != null ? onEnd : onFinish,\n onError\n });\n}\n\n// src/util/async-iterable-stream.ts\nfunction createAsyncIterableStream(source) {\n return asAsyncIterableStream(source.pipeThrough(new TransformStream()));\n}\nfunction asAsyncIterableStream(stream) {\n stream[Symbol.asyncIterator] = function() {\n const reader = this.getReader();\n let finished = false;\n async function cleanup(cancelStream) {\n var _a22;\n if (finished)\n return;\n finished = true;\n try {\n if (cancelStream) {\n await ((_a22 = reader.cancel) == null ? void 0 : _a22.call(reader));\n }\n } finally {\n try {\n reader.releaseLock();\n } catch (e) {\n }\n }\n }\n return {\n /**\n * Reads the next chunk from the stream.\n * @returns A promise resolving to the next IteratorResult.\n */\n async next() {\n if (finished) {\n return { done: true, value: void 0 };\n }\n const { done, value } = await reader.read();\n if (done) {\n await cleanup(true);\n return { done: true, value: void 0 };\n }\n return { done: false, value };\n },\n /**\n * May be called on early exit (e.g., break from for-await) or after completion.\n * Ensures the stream is cancelled and resources are released.\n * @returns A promise resolving to a completed IteratorResult.\n */\n async return() {\n await cleanup(true);\n return { done: true, value: void 0 };\n },\n /**\n * Called on early exit with error.\n * Ensures the stream is cancelled and resources are released, then rethrows the error.\n * @param err The error to throw.\n * @returns A promise that rejects with the provided error.\n */\n async throw(err) {\n await cleanup(true);\n throw err;\n }\n };\n };\n return stream;\n}\n\n// src/util/consume-stream.ts\nasync function consumeStream({\n stream,\n onError\n}) {\n const reader = stream.getReader();\n try {\n while (true) {\n const { done } = await reader.read();\n if (done)\n break;\n }\n } catch (error) {\n onError == null ? void 0 : onError(error);\n } finally {\n reader.releaseLock();\n }\n}\n\n// src/util/create-resolvable-promise.ts\nfunction createResolvablePromise() {\n let resolve3;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve3 = res;\n reject = rej;\n });\n return {\n promise,\n resolve: resolve3,\n reject\n };\n}\n\n// src/util/create-stitchable-stream.ts\nfunction createStitchableStream() {\n let innerStreamReaders = [];\n let controller = null;\n let isClosed = false;\n let waitForNewStream = createResolvablePromise();\n const terminate = () => {\n isClosed = true;\n waitForNewStream.resolve();\n innerStreamReaders.forEach((reader) => reader.cancel());\n innerStreamReaders = [];\n controller == null ? void 0 : controller.close();\n };\n const processPull = async () => {\n if (isClosed && innerStreamReaders.length === 0) {\n controller == null ? void 0 : controller.close();\n return;\n }\n if (innerStreamReaders.length === 0) {\n waitForNewStream = createResolvablePromise();\n await waitForNewStream.promise;\n return await processPull();\n }\n try {\n const { value, done } = await innerStreamReaders[0].read();\n if (done) {\n innerStreamReaders.shift();\n if (innerStreamReaders.length === 0 && isClosed) {\n controller == null ? void 0 : controller.close();\n } else {\n await processPull();\n }\n } else {\n controller == null ? void 0 : controller.enqueue(value);\n }\n } catch (error) {\n controller == null ? void 0 : controller.error(error);\n innerStreamReaders.shift();\n terminate();\n }\n };\n return {\n stream: new ReadableStream({\n start(controllerParam) {\n controller = controllerParam;\n },\n pull: processPull,\n async cancel() {\n for (const reader of innerStreamReaders) {\n await reader.cancel();\n }\n innerStreamReaders = [];\n isClosed = true;\n }\n }),\n addStream: (innerStream) => {\n if (isClosed) {\n throw new Error(\"Cannot add inner stream: outer stream is closed\");\n }\n innerStreamReaders.push(innerStream.getReader());\n waitForNewStream.resolve();\n },\n /**\n * Gracefully close the outer stream. This will let the inner streams\n * finish processing and then close the outer stream.\n */\n close: () => {\n isClosed = true;\n waitForNewStream.resolve();\n if (innerStreamReaders.length === 0) {\n controller == null ? void 0 : controller.close();\n }\n },\n /**\n * Immediately close the outer stream. This will cancel all inner streams\n * and close the outer stream.\n */\n terminate\n };\n}\n\n// src/generate-text/execute-tools-from-stream.ts\nfunction executeToolsFromStream({\n stream,\n tools,\n callId,\n messages,\n abortSignal,\n timeout,\n experimental_sandbox: sandbox,\n toolsContext,\n toolApproval,\n runtimeContext,\n toolApprovalSecret,\n generateId: generateId2,\n onToolExecutionStart,\n onToolExecutionEnd,\n executeToolInTelemetryContext,\n runInTracingChannelSpan\n}) {\n const toolCallsToExecute = [];\n return stream.pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n controller.enqueue(chunk);\n const chunkType = chunk.type;\n switch (chunkType) {\n case \"tool-call\": {\n if (chunk.invalid) {\n return;\n }\n const tool2 = getOwn(tools, chunk.toolName);\n if (tool2 == null) {\n return;\n }\n const toolApprovalStatus = await resolveToolApproval({\n tools,\n toolCall: chunk,\n toolApproval,\n messages,\n toolsContext,\n runtimeContext\n });\n if (toolApprovalStatus.type === \"not-applicable\") {\n if (tool2.execute != null && chunk.providerExecuted !== true) {\n toolCallsToExecute.push(chunk);\n }\n return;\n }\n const approvalId = generateId2();\n const signature = await maybeSignApproval({\n secret: toolApprovalSecret,\n approvalId,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input\n });\n switch (toolApprovalStatus.type) {\n case \"user-approval\": {\n controller.enqueue({\n type: \"tool-approval-request\",\n approvalId,\n toolCall: chunk,\n ...signature != null ? { signature } : {}\n });\n return;\n }\n case \"denied\": {\n controller.enqueue({\n type: \"tool-approval-request\",\n approvalId,\n toolCall: chunk,\n isAutomatic: true,\n ...signature != null ? { signature } : {}\n });\n controller.enqueue({\n type: \"tool-approval-response\",\n approvalId,\n approved: false,\n toolCall: chunk,\n reason: toolApprovalStatus.reason,\n providerExecuted: chunk.providerExecuted\n });\n return;\n }\n case \"approved\": {\n controller.enqueue({\n type: \"tool-approval-request\",\n approvalId,\n toolCall: chunk,\n isAutomatic: true,\n ...signature != null ? { signature } : {}\n });\n controller.enqueue({\n type: \"tool-approval-response\",\n approvalId,\n approved: true,\n toolCall: chunk,\n reason: toolApprovalStatus.reason,\n providerExecuted: chunk.providerExecuted\n });\n break;\n }\n }\n if (tool2.execute != null && chunk.providerExecuted !== true) {\n toolCallsToExecute.push(chunk);\n }\n return;\n }\n case \"model-call-end\": {\n await Promise.all(\n toolCallsToExecute.map(async (toolCall) => {\n try {\n const result = await executeToolCall({\n toolCall,\n tools,\n callId,\n messages,\n abortSignal,\n timeout,\n experimental_sandbox: sandbox,\n toolsContext,\n onToolExecutionStart,\n onToolExecutionEnd,\n executeToolInTelemetryContext,\n runInTracingChannelSpan,\n onPreliminaryToolResult: (result2) => {\n controller.enqueue(result2);\n }\n });\n if (result != null) {\n controller.enqueue({\n type: \"tool-execution-end\",\n toolCallId: result.output.toolCallId,\n toolExecutionMs: result.toolExecutionMs\n });\n controller.enqueue(result.output);\n }\n } catch (error) {\n controller.enqueue({\n type: \"error\",\n error\n });\n }\n })\n );\n return;\n }\n }\n }\n })\n );\n}\n\n// src/generate-text/invoke-tool-callbacks-from-stream.ts\nfunction invokeToolCallbacksFromStream({\n stream,\n tools,\n stepInputMessages,\n abortSignal,\n runtimeContext\n}) {\n if (tools == null)\n return stream;\n const ongoingToolCallToolNames = createIdMap();\n return stream.pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n controller.enqueue(chunk);\n switch (chunk.type) {\n case \"tool-input-start\": {\n ongoingToolCallToolNames[chunk.id] = chunk.toolName;\n const tool2 = getOwn(tools, chunk.toolName);\n if ((tool2 == null ? void 0 : tool2.onInputStart) != null) {\n await tool2.onInputStart({\n toolCallId: chunk.id,\n messages: stepInputMessages,\n abortSignal,\n context: runtimeContext\n });\n }\n break;\n }\n case \"tool-input-delta\": {\n const toolName = ongoingToolCallToolNames[chunk.id];\n const tool2 = getOwn(tools, toolName);\n if ((tool2 == null ? void 0 : tool2.onInputDelta) != null) {\n await tool2.onInputDelta({\n inputTextDelta: chunk.delta,\n toolCallId: chunk.id,\n messages: stepInputMessages,\n abortSignal,\n context: runtimeContext\n });\n }\n break;\n }\n case \"tool-call\": {\n const toolName = ongoingToolCallToolNames[chunk.toolCallId];\n const tool2 = getOwn(tools, toolName);\n delete ongoingToolCallToolNames[chunk.toolCallId];\n if ((tool2 == null ? void 0 : tool2.onInputAvailable) != null) {\n await tool2.onInputAvailable({\n input: chunk.input,\n toolCallId: chunk.toolCallId,\n messages: stepInputMessages,\n abortSignal,\n context: runtimeContext\n });\n }\n }\n }\n }\n })\n );\n}\n\n// src/generate-text/stream-language-model-call.ts\nimport {\n getErrorMessage as getErrorMessage5\n} from \"@ai-sdk/provider\";\nimport {\n createIdGenerator as createIdGenerator2\n} from \"@ai-sdk/provider-utils\";\nvar originalGenerateId2 = createIdGenerator2({\n prefix: \"aitxt\",\n size: 24\n});\nvar originalGenerateCallId2 = createIdGenerator2({\n prefix: \"call\",\n size: 24\n});\nasync function streamLanguageModelCall({\n model,\n tools,\n toolOrder,\n output,\n toolChoice,\n prompt,\n system,\n instructions,\n messages,\n allowSystemInMessages,\n download: download2,\n abortSignal,\n headers,\n includeRawChunks,\n providerOptions,\n repairToolCall,\n refineToolInput,\n executeLanguageModelCallInTelemetryContext = async ({ execute }) => await execute(),\n callId,\n toolsContext,\n experimental_sandbox: sandbox,\n _internal: {\n generateId: generateId2 = originalGenerateId2,\n generateCallId = originalGenerateCallId2,\n now: now2 = now\n } = {},\n onStart,\n onLanguageModelCallStart,\n onLanguageModelCallEnd,\n ...callSettings\n}) {\n const resolvedModel = resolveLanguageModel(model);\n const effectiveCallId = callId != null ? callId : generateCallId();\n const standardizedPrompt = await standardizePrompt({\n instructions,\n system,\n prompt,\n messages,\n allowSystemInMessages\n });\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: {\n instructions: standardizedPrompt.instructions,\n messages: standardizedPrompt.messages\n },\n supportedUrls: await resolvedModel.supportedUrls,\n download: download2,\n provider: resolvedModel.provider.split(\".\")[0]\n });\n const stepTools = await prepareTools({\n tools,\n toolOrder,\n toolsContext,\n experimental_sandbox: sandbox\n });\n const stepToolChoice = prepareToolChoice({\n toolChoice\n });\n await notify({\n event: { promptMessages },\n callbacks: onStart\n });\n const languageModelCallContext = {\n provider: resolvedModel.provider,\n modelId: resolvedModel.modelId,\n instructions: standardizedPrompt.instructions,\n messages: standardizedPrompt.messages,\n tools: stepTools,\n ...callSettings\n };\n const languageModelCallStartEvent = {\n callId: effectiveCallId,\n ...languageModelCallContext\n };\n await notify({\n event: languageModelCallStartEvent,\n callbacks: onLanguageModelCallStart\n });\n const callStartTimestampMs = now2();\n const {\n stream: languageModelStream,\n response,\n request\n } = await executeLanguageModelCallInTelemetryContext({\n ...languageModelCallStartEvent,\n execute: async () => await resolvedModel.doStream({\n ...callSettings,\n tools: stepTools,\n toolChoice: stepToolChoice,\n responseFormat: await (output == null ? void 0 : output.responseFormat),\n prompt: promptMessages,\n providerOptions,\n abortSignal,\n headers,\n includeRawChunks\n })\n });\n const standardizedStream = languageModelStream.pipeThrough(\n createLanguageModelV4StreamPartToLanguageModelStreamPartTransform({\n tools,\n instructions: standardizedPrompt.instructions,\n messages: standardizedPrompt.messages,\n repairToolCall,\n refineToolInput,\n callId: effectiveCallId,\n provider: resolvedModel.provider,\n modelId: resolvedModel.modelId,\n generateId: generateId2,\n now: now2,\n callStartTimestampMs,\n onLanguageModelCallEnd\n })\n );\n return {\n stream: createAsyncIterableStream(standardizedStream),\n response,\n request\n };\n}\nfunction createLanguageModelV4StreamPartToLanguageModelStreamPartTransform({\n tools,\n instructions,\n messages,\n repairToolCall,\n refineToolInput,\n callId,\n provider,\n modelId,\n generateId: generateId2,\n now: now2,\n callStartTimestampMs,\n onLanguageModelCallEnd\n}) {\n const toolCallsByToolCallId = /* @__PURE__ */ new Map();\n const modelCallContent = [];\n const textPartIndexes = /* @__PURE__ */ new Map();\n const reasoningPartIndexes = /* @__PURE__ */ new Map();\n let responseId = generateId2();\n let timeToFirstOutputMs;\n let previousOutputChunkTimestampMs;\n const timeBetweenOutputChunksMs = [];\n return new TransformStream({\n async transform(chunk, controller) {\n var _a22, _b;\n if (isOutputChunk(chunk)) {\n const outputChunkTimestampMs = now2();\n if (timeToFirstOutputMs == null) {\n timeToFirstOutputMs = outputChunkTimestampMs - callStartTimestampMs;\n } else if (previousOutputChunkTimestampMs != null) {\n timeBetweenOutputChunksMs.push(\n outputChunkTimestampMs - previousOutputChunkTimestampMs\n );\n }\n previousOutputChunkTimestampMs = outputChunkTimestampMs;\n }\n switch (chunk.type) {\n case \"text-start\":\n upsertTextContentPart({\n content: modelCallContent,\n partIndexes: textPartIndexes,\n id: chunk.id,\n type: \"text\",\n providerMetadata: chunk.providerMetadata\n });\n controller.enqueue(chunk);\n break;\n case \"text-delta\":\n upsertTextContentPart({\n content: modelCallContent,\n partIndexes: textPartIndexes,\n id: chunk.id,\n type: \"text\",\n textDelta: chunk.delta,\n providerMetadata: chunk.providerMetadata\n });\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n text: chunk.delta,\n providerMetadata: chunk.providerMetadata\n });\n break;\n case \"text-end\":\n upsertTextContentPart({\n content: modelCallContent,\n partIndexes: textPartIndexes,\n id: chunk.id,\n type: \"text\",\n providerMetadata: chunk.providerMetadata\n });\n textPartIndexes.delete(chunk.id);\n controller.enqueue(chunk);\n break;\n case \"reasoning-start\":\n upsertTextContentPart({\n content: modelCallContent,\n partIndexes: reasoningPartIndexes,\n id: chunk.id,\n type: \"reasoning\",\n providerMetadata: chunk.providerMetadata\n });\n controller.enqueue(chunk);\n break;\n case \"reasoning-delta\":\n upsertTextContentPart({\n content: modelCallContent,\n partIndexes: reasoningPartIndexes,\n id: chunk.id,\n type: \"reasoning\",\n textDelta: chunk.delta,\n providerMetadata: chunk.providerMetadata\n });\n controller.enqueue({\n type: \"reasoning-delta\",\n id: chunk.id,\n text: chunk.delta,\n providerMetadata: chunk.providerMetadata\n });\n break;\n case \"reasoning-end\":\n upsertTextContentPart({\n content: modelCallContent,\n partIndexes: reasoningPartIndexes,\n id: chunk.id,\n type: \"reasoning\",\n providerMetadata: chunk.providerMetadata\n });\n reasoningPartIndexes.delete(chunk.id);\n controller.enqueue(chunk);\n break;\n case \"file\":\n case \"reasoning-file\": {\n const file = new DefaultGeneratedFileWithType({\n data: chunk.data.type === \"data\" ? chunk.data.data : chunk.data.url.toString(),\n mediaType: chunk.mediaType\n });\n modelCallContent.push({\n type: chunk.type,\n file,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {}\n });\n controller.enqueue({\n type: chunk.type,\n file,\n providerMetadata: chunk.providerMetadata\n });\n break;\n }\n case \"finish\": {\n const usage = asLanguageModelUsage(chunk.usage);\n const responseTimeMs = now2() - callStartTimestampMs;\n const performance = {\n responseTimeMs,\n effectiveOutputTokensPerSecond: calculateTokensPerSecond({\n tokens: usage.outputTokens,\n durationMs: responseTimeMs\n }),\n outputTokensPerSecond: timeToFirstOutputMs == null ? void 0 : calculateTokensPerSecond({\n tokens: usage.outputTokens,\n durationMs: responseTimeMs - timeToFirstOutputMs\n }),\n inputTokensPerSecond: timeToFirstOutputMs == null ? void 0 : calculateTokensPerSecond({\n tokens: usage.inputTokens,\n durationMs: timeToFirstOutputMs\n }),\n effectiveTotalTokensPerSecond: calculateTokensPerSecond({\n tokens: sumTokenCounts(usage.inputTokens, usage.outputTokens),\n durationMs: responseTimeMs\n }),\n timeToFirstOutputMs,\n timeBetweenOutputChunksMs: timeBetweenOutputChunksMs.length > 0 ? calculateOutputChunkTimingStats(timeBetweenOutputChunksMs) : void 0\n };\n await notify({\n event: {\n callId,\n provider,\n modelId,\n finishReason: chunk.finishReason.unified,\n usage,\n content: modelCallContent,\n responseId,\n performance\n },\n callbacks: onLanguageModelCallEnd\n });\n controller.enqueue({\n type: \"model-call-end\",\n finishReason: chunk.finishReason.unified,\n rawFinishReason: chunk.finishReason.raw,\n usage,\n providerMetadata: chunk.providerMetadata,\n performance\n });\n break;\n }\n case \"tool-call\": {\n try {\n const toolCall = await parseToolCall({\n toolCall: chunk,\n tools,\n repairToolCall,\n refineToolInput,\n instructions,\n messages\n });\n toolCallsByToolCallId.set(toolCall.toolCallId, toolCall);\n controller.enqueue(toolCall);\n modelCallContent.push(toolCall);\n if (toolCall.invalid) {\n controller.enqueue({\n type: \"tool-error\",\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n error: getErrorMessage5(toolCall.error),\n dynamic: true,\n title: toolCall.title,\n ...toolCall.toolMetadata != null ? { toolMetadata: toolCall.toolMetadata } : {}\n });\n break;\n }\n } catch (error) {\n controller.enqueue({ type: \"error\", error });\n }\n break;\n }\n case \"tool-approval-request\": {\n const toolCall = toolCallsByToolCallId.get(chunk.toolCallId);\n if (toolCall == null) {\n controller.enqueue({\n type: \"error\",\n error: new ToolCallNotFoundForApprovalError({\n toolCallId: chunk.toolCallId,\n approvalId: chunk.approvalId\n })\n });\n break;\n }\n const toolApprovalRequest = {\n type: \"tool-approval-request\",\n approvalId: chunk.approvalId,\n toolCall\n };\n controller.enqueue(toolApprovalRequest);\n modelCallContent.push(toolApprovalRequest);\n break;\n }\n case \"tool-result\": {\n const toolName = chunk.toolName;\n const toolCall = toolCallsByToolCallId.get(chunk.toolCallId);\n const toolResultPart = chunk.isError ? {\n type: \"tool-error\",\n toolCallId: chunk.toolCallId,\n toolName,\n input: toolCall == null ? void 0 : toolCall.input,\n providerExecuted: true,\n error: chunk.result,\n dynamic: chunk.dynamic,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {},\n ...(toolCall == null ? void 0 : toolCall.toolMetadata) != null ? { toolMetadata: toolCall.toolMetadata } : {}\n } : {\n type: \"tool-result\",\n toolCallId: chunk.toolCallId,\n toolName,\n input: toolCall == null ? void 0 : toolCall.input,\n output: chunk.result,\n providerExecuted: true,\n dynamic: chunk.dynamic,\n ...chunk.providerMetadata != null ? { providerMetadata: chunk.providerMetadata } : {},\n ...(toolCall == null ? void 0 : toolCall.toolMetadata) != null ? { toolMetadata: toolCall.toolMetadata } : {}\n };\n controller.enqueue(toolResultPart);\n modelCallContent.push(toolResultPart);\n break;\n }\n case \"tool-input-start\": {\n const tool2 = getOwn(tools, chunk.toolName);\n controller.enqueue({\n ...chunk,\n dynamic: (_a22 = chunk.dynamic) != null ? _a22 : (tool2 == null ? void 0 : tool2.type) === \"dynamic\",\n title: tool2 == null ? void 0 : tool2.title,\n ...(tool2 == null ? void 0 : tool2.metadata) != null ? { toolMetadata: tool2.metadata } : {}\n });\n break;\n }\n case \"stream-start\": {\n controller.enqueue({\n type: \"model-call-start\",\n warnings: chunk.warnings\n });\n break;\n }\n case \"response-metadata\": {\n responseId = (_b = chunk.id) != null ? _b : responseId;\n controller.enqueue({\n type: \"model-call-response-metadata\",\n id: chunk.id,\n timestamp: chunk.timestamp,\n modelId: chunk.modelId\n });\n break;\n }\n default:\n if (chunk.type === \"custom\" || chunk.type === \"source\") {\n modelCallContent.push(chunk);\n }\n controller.enqueue(chunk);\n break;\n }\n }\n });\n}\nfunction isOutputChunk(chunk) {\n return chunk.type === \"text-delta\" && chunk.delta.length > 0 || chunk.type === \"reasoning-delta\" && chunk.delta.length > 0 || chunk.type === \"tool-input-delta\" && chunk.delta.length > 0 || chunk.type === \"file\" || chunk.type === \"reasoning-file\" || chunk.type === \"tool-call\";\n}\nfunction calculateOutputChunkTimingStats(timingsMs) {\n const sortedTimingsMs = [...timingsMs].sort((a, b) => a - b);\n const sum = timingsMs.reduce((sum2, timingMs) => sum2 + timingMs, 0);\n return {\n min: sortedTimingsMs[0],\n p10: calculateNearestRankPercentile(sortedTimingsMs, 0.1),\n median: calculateNearestRankPercentile(sortedTimingsMs, 0.5),\n avg: sum / timingsMs.length,\n p90: calculateNearestRankPercentile(sortedTimingsMs, 0.9),\n max: sortedTimingsMs[sortedTimingsMs.length - 1]\n };\n}\nfunction calculateNearestRankPercentile(sortedValues, percentile) {\n return sortedValues[Math.ceil(percentile * sortedValues.length) - 1];\n}\nfunction upsertTextContentPart({\n content,\n partIndexes,\n id,\n type,\n textDelta,\n providerMetadata\n}) {\n let partIndex = partIndexes.get(id);\n if (partIndex == null) {\n partIndex = content.push({\n type,\n text: \"\",\n ...providerMetadata != null ? { providerMetadata } : {}\n }) - 1;\n partIndexes.set(id, partIndex);\n }\n const part = content[partIndex];\n if (textDelta != null) {\n part.text += textDelta;\n }\n if (providerMetadata != null) {\n part.providerMetadata = providerMetadata;\n }\n}\n\n// src/generate-text/stream-text.ts\nvar originalGenerateId3 = createIdGenerator3({\n prefix: \"aitxt\",\n size: 24\n});\nvar originalGenerateCallId3 = createIdGenerator3({\n prefix: \"call\",\n size: 24\n});\nvar isOutputChunkType = {\n file: true,\n custom: true,\n source: true,\n \"text-start\": true,\n \"text-end\": true,\n \"text-delta\": true,\n \"reasoning-start\": true,\n \"reasoning-end\": true,\n \"reasoning-delta\": true,\n \"reasoning-file\": true,\n \"tool-input-start\": true,\n \"tool-input-end\": true,\n \"tool-input-delta\": true,\n \"tool-approval-request\": true,\n \"tool-approval-response\": true,\n \"tool-call\": true,\n \"tool-result\": true,\n \"tool-error\": true,\n \"tool-execution-end\": false,\n \"model-call-start\": false,\n \"model-call-response-metadata\": false,\n \"model-call-end\": false,\n error: false,\n raw: false\n};\nfunction streamText({\n model,\n tools,\n toolChoice,\n instructions,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n maxRetries,\n abortSignal,\n timeout,\n headers,\n stopWhen = isStepCount(1),\n experimental_sandbox: sandbox,\n output,\n toolApproval,\n experimental_toolApprovalSecret,\n experimental_telemetry,\n telemetry = experimental_telemetry,\n prepareStep,\n providerOptions,\n activeTools,\n toolOrder,\n experimental_repairToolCall,\n repairToolCall = experimental_repairToolCall,\n experimental_refineToolInput: refineToolInput,\n experimental_transform: transform,\n experimental_download: download2,\n includeRawChunks,\n onChunk,\n onError = ({ error }) => {\n console.error(error);\n },\n onFinish,\n onEnd = onFinish,\n onAbort,\n onStepEnd,\n onStepFinish,\n onStart,\n experimental_onStart,\n onStepStart,\n experimental_onStepStart,\n onLanguageModelCallStart,\n experimental_onLanguageModelCallStart,\n onLanguageModelCallEnd,\n experimental_onLanguageModelCallEnd,\n onToolExecutionStart,\n onToolExecutionEnd,\n experimental_onToolCallStart,\n experimental_onToolCallFinish,\n runtimeContext = {},\n toolsContext = {},\n experimental_include,\n include = experimental_include,\n _internal: {\n now: now2 = now,\n generateId: generateId2 = originalGenerateId3,\n generateCallId = originalGenerateCallId3\n } = {},\n ...settings\n}) {\n var _a22, _b, _c, _d;\n const totalTimeoutMs = getTotalTimeoutMs(timeout);\n const stepTimeoutMs = getStepTimeoutMs(timeout);\n const chunkTimeoutMs = getChunkTimeoutMs(timeout);\n const stepAbortController = stepTimeoutMs != null ? new AbortController() : void 0;\n const chunkAbortController = chunkTimeoutMs != null ? new AbortController() : void 0;\n const resolvedOnStart = onStart != null ? onStart : experimental_onStart;\n const resolvedOnStepStart = onStepStart != null ? onStepStart : experimental_onStepStart;\n const resolvedOnLanguageModelCallStart = onLanguageModelCallStart != null ? onLanguageModelCallStart : experimental_onLanguageModelCallStart;\n const resolvedOnLanguageModelCallEnd = onLanguageModelCallEnd != null ? onLanguageModelCallEnd : experimental_onLanguageModelCallEnd;\n const resolvedOnToolExecutionStart = onToolExecutionStart != null ? onToolExecutionStart : experimental_onToolCallStart;\n const resolvedOnToolExecutionEnd = onToolExecutionEnd != null ? onToolExecutionEnd : experimental_onToolCallFinish;\n const resolvedOnStepEnd = onStepEnd != null ? onStepEnd : onStepFinish;\n return new DefaultStreamTextResult({\n model: resolveLanguageModel(model),\n telemetry,\n headers,\n settings,\n maxRetries,\n abortSignal: mergeAbortSignals(\n abortSignal,\n totalTimeoutMs,\n stepAbortController == null ? void 0 : stepAbortController.signal,\n chunkAbortController == null ? void 0 : chunkAbortController.signal\n ),\n stepTimeoutMs,\n stepAbortController,\n chunkTimeoutMs,\n chunkAbortController,\n instructions,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n experimental_sandbox: sandbox,\n tools,\n toolsContext,\n runtimeContext,\n toolChoice,\n transforms: asArray6(transform),\n activeTools,\n toolOrder,\n repairToolCall,\n refineToolInput,\n stopConditions: asArray6(stopWhen),\n output,\n toolApproval,\n experimental_toolApprovalSecret,\n providerOptions,\n prepareStep,\n timeout,\n onChunk,\n onError,\n onEnd,\n onAbort,\n onStepFinish: resolvedOnStepEnd,\n onStart: resolvedOnStart,\n onStepStart: resolvedOnStepStart,\n onLanguageModelCallStart: resolvedOnLanguageModelCallStart,\n onLanguageModelCallEnd: resolvedOnLanguageModelCallEnd,\n onToolExecutionStart: resolvedOnToolExecutionStart,\n onToolExecutionEnd: resolvedOnToolExecutionEnd,\n now: now2,\n generateId: generateId2,\n generateCallId,\n download: download2,\n // assign default values to include:\n include: {\n requestBody: (_a22 = include == null ? void 0 : include.requestBody) != null ? _a22 : false,\n requestMessages: (_b = include == null ? void 0 : include.requestMessages) != null ? _b : false,\n rawChunks: (_d = (_c = include == null ? void 0 : include.rawChunks) != null ? _c : includeRawChunks) != null ? _d : false\n }\n });\n}\nasync function markPromiseAsHandled(promise) {\n try {\n await promise;\n } catch (e) {\n }\n}\nfunction createOutputTransformStream(output) {\n let firstTextChunkId = void 0;\n let text2 = \"\";\n let textChunk = \"\";\n let textProviderMetadata = void 0;\n let lastPublishedValue = \"\";\n function publishTextChunk({\n controller,\n partialOutput = void 0\n }) {\n controller.enqueue({\n part: {\n type: \"text-delta\",\n id: firstTextChunkId,\n text: textChunk,\n providerMetadata: textProviderMetadata\n },\n partialOutput\n });\n textChunk = \"\";\n }\n return new TransformStream({\n async transform(chunk, controller) {\n var _a22;\n if (chunk.type === \"finish-step\" && textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n if (chunk.type !== \"text-delta\" && chunk.type !== \"text-start\" && chunk.type !== \"text-end\") {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (firstTextChunkId == null) {\n firstTextChunkId = chunk.id;\n } else if (chunk.id !== firstTextChunkId) {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (chunk.type === \"text-start\") {\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n if (chunk.type === \"text-end\") {\n if (textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n controller.enqueue({ part: chunk, partialOutput: void 0 });\n return;\n }\n text2 += chunk.text;\n textChunk += chunk.text;\n textProviderMetadata = (_a22 = chunk.providerMetadata) != null ? _a22 : textProviderMetadata;\n const result = await output.parsePartialOutput({ text: text2 });\n if (result !== void 0) {\n const currentValue = typeof result.partial === \"string\" ? result.partial : JSON.stringify(result.partial);\n if (currentValue !== lastPublishedValue) {\n publishTextChunk({ controller, partialOutput: result.partial });\n lastPublishedValue = currentValue;\n }\n }\n }\n });\n}\nvar DefaultStreamTextResult = class {\n constructor({\n model,\n telemetry,\n headers,\n settings,\n maxRetries: maxRetriesArg,\n abortSignal,\n stepTimeoutMs,\n stepAbortController,\n chunkTimeoutMs,\n chunkAbortController,\n instructions,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n experimental_sandbox: sandbox,\n tools,\n toolChoice,\n transforms,\n activeTools,\n toolOrder,\n repairToolCall,\n refineToolInput,\n stopConditions,\n output,\n toolApproval,\n experimental_toolApprovalSecret,\n providerOptions,\n prepareStep,\n now: now2,\n generateId: generateId2,\n generateCallId,\n timeout,\n onChunk,\n onError,\n onEnd,\n onAbort,\n onStepFinish,\n onStart,\n onStepStart,\n onLanguageModelCallStart,\n onLanguageModelCallEnd,\n onToolExecutionStart,\n onToolExecutionEnd,\n runtimeContext,\n toolsContext,\n download: download2,\n include\n }) {\n this._totalUsage = new DelayedPromise();\n this._finishReason = new DelayedPromise();\n this._rawFinishReason = new DelayedPromise();\n this._steps = new DelayedPromise();\n this._initialResponseMessages = new DelayedPromise();\n this.outputSpecification = output;\n this.tools = tools;\n const telemetryDispatcher = createRestrictedTelemetryDispatcher({\n telemetry,\n includeRuntimeContext: telemetry == null ? void 0 : telemetry.includeRuntimeContext,\n includeToolsContext: telemetry == null ? void 0 : telemetry.includeToolsContext\n });\n let stepFinish;\n let recordedContent = [];\n let recordedFinishReason = void 0;\n let recordedRawFinishReason = void 0;\n let recordedTotalUsage = void 0;\n let recordedRequest = {};\n let recordedRequestMessages = [];\n let recordedWarnings = [];\n const recordedSteps = [];\n const initialResponseMessages = [];\n let stepMessagesForNextStep;\n let currentStepMessages = [];\n const pendingDeferredToolCalls = /* @__PURE__ */ new Map();\n let activeTextContent = createIdMap();\n let activeReasoningContent = createIdMap();\n let recordedNoOutputError;\n const eventProcessor = new TransformStream({\n async transform(chunk, controller) {\n var _a22, _b, _c, _d;\n controller.enqueue(chunk);\n const { part } = chunk;\n await (onChunk == null ? void 0 : onChunk({ chunk: part }));\n if (part.type === \"error\") {\n const error = wrapGatewayError(part.error);\n if (NoOutputGeneratedError.isInstance(error)) {\n recordedNoOutputError = error;\n }\n await onError({ error });\n }\n if (part.type === \"custom\" || part.type === \"source\" || part.type === \"tool-call\" || part.type === \"tool-approval-request\" || part.type === \"tool-approval-response\" || part.type === \"tool-error\") {\n recordedContent.push(part);\n }\n if (part.type === \"text-start\") {\n activeTextContent[part.id] = {\n type: \"text\",\n text: \"\",\n providerMetadata: part.providerMetadata\n };\n recordedContent.push(activeTextContent[part.id]);\n }\n if (part.type === \"text-delta\") {\n const activeText = activeTextContent[part.id];\n if (activeText == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `text part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeText.text += part.text;\n activeText.providerMetadata = (_a22 = part.providerMetadata) != null ? _a22 : activeText.providerMetadata;\n }\n if (part.type === \"text-end\") {\n const activeText = activeTextContent[part.id];\n if (activeText == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `text part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeText.providerMetadata = (_b = part.providerMetadata) != null ? _b : activeText.providerMetadata;\n delete activeTextContent[part.id];\n }\n if (part.type === \"reasoning-start\") {\n activeReasoningContent[part.id] = {\n type: \"reasoning\",\n text: \"\",\n providerMetadata: part.providerMetadata\n };\n recordedContent.push(activeReasoningContent[part.id]);\n }\n if (part.type === \"reasoning-delta\") {\n const activeReasoning = activeReasoningContent[part.id];\n if (activeReasoning == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `reasoning part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeReasoning.text += part.text;\n activeReasoning.providerMetadata = (_c = part.providerMetadata) != null ? _c : activeReasoning.providerMetadata;\n }\n if (part.type === \"reasoning-end\") {\n const activeReasoning = activeReasoningContent[part.id];\n if (activeReasoning == null) {\n controller.enqueue({\n part: {\n type: \"error\",\n error: `reasoning part ${part.id} not found`\n },\n partialOutput: void 0\n });\n return;\n }\n activeReasoning.providerMetadata = (_d = part.providerMetadata) != null ? _d : activeReasoning.providerMetadata;\n delete activeReasoningContent[part.id];\n }\n if (part.type === \"file\" || part.type === \"reasoning-file\") {\n recordedContent.push({\n type: part.type,\n file: part.file,\n ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}\n });\n }\n if (part.type === \"tool-result\" && !part.preliminary) {\n recordedContent.push(part);\n }\n if (part.type === \"start-step\") {\n recordedContent = [];\n activeReasoningContent = createIdMap();\n activeTextContent = createIdMap();\n recordedRequest = part.request;\n recordedWarnings = part.warnings;\n }\n if (part.type === \"finish-step\") {\n const stepResponseMessages = await toResponseMessages({\n content: recordedContent,\n tools\n });\n const currentStepResult = new DefaultStepResult({\n callId,\n stepNumber: recordedSteps.length,\n provider: model.provider,\n modelId: model.modelId,\n runtimeContext,\n toolsContext,\n content: recordedContent,\n finishReason: part.finishReason,\n rawFinishReason: part.rawFinishReason,\n usage: part.usage,\n performance: part.performance,\n warnings: recordedWarnings,\n request: {\n ...recordedRequest,\n messages: include.requestMessages ? cloneModelMessages(recordedRequestMessages) : void 0\n },\n response: {\n ...part.response,\n messages: cloneModelMessages(stepResponseMessages)\n },\n providerMetadata: part.providerMetadata\n });\n await notify({\n event: currentStepResult,\n callbacks: [onStepFinish, telemetryDispatcher.onStepEnd]\n });\n logWarnings({\n warnings: recordedWarnings,\n provider: model.provider,\n model: model.modelId\n });\n recordedSteps.push(currentStepResult);\n stepMessagesForNextStep = [\n ...currentStepMessages,\n ...stepResponseMessages\n ];\n stepFinish.resolve();\n }\n if (part.type === \"finish\") {\n recordedTotalUsage = part.totalUsage;\n recordedFinishReason = part.finishReason;\n recordedRawFinishReason = part.rawFinishReason;\n }\n },\n async flush(controller) {\n try {\n if (recordedSteps.length === 0 || recordedNoOutputError != null) {\n const error = (abortSignal == null ? void 0 : abortSignal.aborted) ? abortSignal.reason : recordedNoOutputError != null ? recordedNoOutputError : new NoOutputGeneratedError({\n message: \"No output generated. Check the stream for errors.\"\n });\n self.rejectResultPromises(error);\n return;\n }\n const finishReason = recordedFinishReason != null ? recordedFinishReason : \"other\";\n const totalUsage = recordedTotalUsage != null ? recordedTotalUsage : createNullLanguageModelUsage();\n self._finishReason.resolve(finishReason);\n self._rawFinishReason.resolve(recordedRawFinishReason);\n self._totalUsage.resolve(totalUsage);\n self._steps.resolve(recordedSteps);\n const finalStep = recordedSteps[recordedSteps.length - 1];\n const content = recordedSteps.flatMap((step) => step.content);\n const files = recordedSteps.flatMap((step) => step.files);\n const sources = recordedSteps.flatMap((step) => step.sources);\n const toolCalls = recordedSteps.flatMap((step) => step.toolCalls);\n const staticToolCalls = recordedSteps.flatMap(\n (step) => step.staticToolCalls\n );\n const dynamicToolCalls = recordedSteps.flatMap(\n (step) => step.dynamicToolCalls\n );\n const toolResults = recordedSteps.flatMap((step) => step.toolResults);\n const staticToolResults = recordedSteps.flatMap(\n (step) => step.staticToolResults\n );\n const dynamicToolResults = recordedSteps.flatMap(\n (step) => step.dynamicToolResults\n );\n const warnings = recordedSteps.flatMap((step) => {\n var _a22;\n return (_a22 = step.warnings) != null ? _a22 : [];\n });\n await notify({\n event: {\n callId,\n toolsContext: finalStep.toolsContext,\n stepNumber: finalStep.stepNumber,\n model: finalStep.model,\n runtimeContext: finalStep.runtimeContext,\n finishReason: finalStep.finishReason,\n rawFinishReason: finalStep.rawFinishReason,\n usage: totalUsage,\n totalUsage,\n content,\n text: finalStep.text,\n reasoning: finalStep.reasoning,\n reasoningText: finalStep.reasoningText,\n files,\n sources,\n toolCalls,\n staticToolCalls,\n dynamicToolCalls,\n toolResults,\n staticToolResults,\n dynamicToolResults,\n responseMessages: [\n ...initialResponseMessages,\n ...recordedSteps.flatMap((step) => step.response.messages)\n ],\n warnings,\n request: finalStep.request,\n response: finalStep.response,\n providerMetadata: finalStep.providerMetadata,\n steps: recordedSteps,\n finalStep\n },\n callbacks: [onEnd, telemetryDispatcher.onEnd]\n });\n } catch (error) {\n controller.error(error);\n }\n }\n });\n const stitchableStream = createStitchableStream();\n this.addStream = stitchableStream.addStream;\n this.closeStream = stitchableStream.close;\n const reader = stitchableStream.stream.getReader();\n let stream = new ReadableStream({\n async start(controller) {\n controller.enqueue({ type: \"start\" });\n },\n async pull(controller) {\n async function abort() {\n await notify({\n event: {\n callId,\n steps: recordedSteps,\n ...(abortSignal == null ? void 0 : abortSignal.reason) !== void 0 ? { reason: abortSignal.reason } : {}\n },\n callbacks: [onAbort, telemetryDispatcher.onAbort]\n });\n controller.enqueue({\n type: \"abort\",\n // The `reason` is usually of type DOMException, but it can also be of any type,\n // so we use getErrorMessage for serialization because it is already designed to accept values of the unknown type.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/reason\n ...(abortSignal == null ? void 0 : abortSignal.reason) !== void 0 ? { reason: getErrorMessage6(abortSignal.reason) } : {}\n });\n controller.close();\n }\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n return;\n }\n if (abortSignal == null ? void 0 : abortSignal.aborted) {\n await abort();\n return;\n }\n controller.enqueue(value);\n } catch (error) {\n if (isAbortError(error) && (abortSignal == null ? void 0 : abortSignal.aborted)) {\n await abort();\n } else {\n controller.error(error);\n }\n }\n },\n cancel(reason) {\n return stitchableStream.stream.cancel(reason);\n }\n });\n let isRunning = true;\n stream = stream.pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n if (isRunning) {\n controller.enqueue(chunk);\n }\n }\n })\n );\n for (const transform of transforms) {\n stream = stream.pipeThrough(\n transform({\n tools,\n stopStream() {\n stitchableStream.terminate();\n isRunning = false;\n }\n })\n );\n }\n this.baseStream = stream.pipeThrough(createOutputTransformStream(output != null ? output : text())).pipeThrough(eventProcessor);\n const { maxRetries } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const callSettings = prepareLanguageModelCallOptions(settings);\n const self = this;\n const callId = generateCallId();\n (async () => {\n var _a22;\n const initialPrompt = await standardizePrompt({\n instructions,\n system,\n prompt,\n messages,\n allowSystemInMessages\n });\n const startEvent = {\n callId,\n operationId: \"ai.streamText\",\n provider: model.provider,\n modelId: model.modelId,\n instructions: initialPrompt.instructions,\n messages: initialPrompt.messages,\n tools,\n toolChoice,\n activeTools,\n toolOrder,\n maxOutputTokens: callSettings.maxOutputTokens,\n temperature: callSettings.temperature,\n topP: callSettings.topP,\n topK: callSettings.topK,\n presencePenalty: callSettings.presencePenalty,\n frequencyPenalty: callSettings.frequencyPenalty,\n stopSequences: callSettings.stopSequences,\n seed: callSettings.seed,\n reasoning: callSettings.reasoning,\n maxRetries,\n timeout,\n headers,\n providerOptions,\n output,\n runtimeContext,\n toolsContext\n };\n const streamTextTracingChannelContext = (_a22 = telemetryDispatcher.startTracingChannelContext) == null ? void 0 : _a22.call(telemetryDispatcher, {\n type: \"streamText\",\n event: startEvent,\n completion: self._totalUsage.promise.then(() => void 0)\n });\n const runInStreamTextTracingChannelContext = (execute) => {\n var _a23;\n return (_a23 = streamTextTracingChannelContext == null ? void 0 : streamTextTracingChannelContext.run(execute)) != null ? _a23 : execute();\n };\n const runInTracingChannelSpanInStreamText = telemetryDispatcher.runInTracingChannelSpan == null ? void 0 : (options) => runInStreamTextTracingChannelContext(\n () => telemetryDispatcher.runInTracingChannelSpan(options)\n );\n await notify({\n event: startEvent,\n callbacks: [onStart, telemetryDispatcher.onStart]\n });\n const initialMessages = initialPrompt.messages;\n let instructionsForNextStep = initialPrompt.instructions;\n const { approvedToolApprovals, deniedToolApprovals } = collectToolApprovals({ messages: initialMessages });\n if (deniedToolApprovals.length > 0 || approvedToolApprovals.length > 0) {\n const {\n approvedToolApprovals: localApprovedToolApprovals,\n deniedToolApprovals: revalidationDeniedToolApprovals\n } = await validateApprovedToolApprovals({\n approvedToolApprovals: approvedToolApprovals.filter(\n (toolApproval2) => !toolApproval2.toolCall.providerExecuted\n ),\n tools,\n toolApproval,\n messages: initialMessages,\n toolsContext,\n runtimeContext,\n toolApprovalSecret: experimental_toolApprovalSecret\n });\n const localDeniedToolApprovals = [\n ...deniedToolApprovals.filter(\n (toolApproval2) => !toolApproval2.toolCall.providerExecuted\n ),\n ...revalidationDeniedToolApprovals\n ];\n const localDeniedToolApprovalsWithoutResults = localDeniedToolApprovals.filter(\n (toolApproval2) => toolApproval2.existingToolResult == null\n );\n const deniedProviderExecutedToolApprovals = deniedToolApprovals.filter(\n (toolApproval2) => toolApproval2.toolCall.providerExecuted\n );\n let toolExecutionStepStreamController;\n const toolExecutionStepStream = new ReadableStream({\n start(controller) {\n toolExecutionStepStreamController = controller;\n }\n });\n self.addStream(toolExecutionStepStream);\n try {\n for (const toolApproval2 of [\n ...localDeniedToolApprovals,\n ...deniedProviderExecutedToolApprovals\n ]) {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue({\n type: \"tool-output-denied\",\n toolCallId: toolApproval2.toolCall.toolCallId,\n toolName: toolApproval2.toolCall.toolName\n });\n }\n const toolOutputs = [];\n await Promise.all(\n localApprovedToolApprovals.map(async (toolApproval2) => {\n const result = await executeToolCall({\n toolCall: toolApproval2.toolCall,\n tools,\n callId,\n messages: initialMessages,\n abortSignal,\n timeout,\n experimental_sandbox: sandbox,\n toolsContext,\n onToolExecutionStart: filterNullable2(\n onToolExecutionStart,\n telemetryDispatcher.onToolExecutionStart\n ),\n onToolExecutionEnd: filterNullable2(\n onToolExecutionEnd,\n telemetryDispatcher.onToolExecutionEnd\n ),\n executeToolInTelemetryContext: telemetryDispatcher.executeTool,\n runInTracingChannelSpan: runInTracingChannelSpanInStreamText,\n onPreliminaryToolResult: (result2) => {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue(result2);\n }\n });\n if (result != null) {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue(result.output);\n toolOutputs.push(result.output);\n }\n })\n );\n if (toolOutputs.length > 0 || localDeniedToolApprovalsWithoutResults.length > 0) {\n const localToolContent = [];\n for (const output2 of toolOutputs) {\n localToolContent.push({\n type: \"tool-result\",\n toolCallId: output2.toolCallId,\n toolName: output2.toolName,\n output: await createToolModelOutput({\n toolCallId: output2.toolCallId,\n input: output2.input,\n tool: getOwn(tools, output2.toolName),\n output: output2.type === \"tool-result\" ? output2.output : output2.error,\n errorMode: output2.type === \"tool-error\" ? \"text\" : \"none\"\n })\n });\n }\n for (const toolApproval2 of localDeniedToolApprovalsWithoutResults) {\n localToolContent.push({\n type: \"tool-result\",\n toolCallId: toolApproval2.toolCall.toolCallId,\n toolName: toolApproval2.toolCall.toolName,\n output: {\n type: \"execution-denied\",\n reason: toolApproval2.approvalResponse.reason\n }\n });\n }\n initialResponseMessages.push({\n role: \"tool\",\n content: localToolContent\n });\n }\n } finally {\n toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.close();\n }\n }\n self._initialResponseMessages.resolve(initialResponseMessages);\n async function streamStep({\n currentStep,\n usage\n }) {\n var _a23, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;\n const stepTimeoutId = setAbortTimeout({\n abortController: stepAbortController,\n label: \"Step\",\n timeoutMs: stepTimeoutMs\n });\n let chunkTimeoutId = void 0;\n function resetChunkTimeout() {\n if (chunkTimeoutId != null) {\n clearTimeout(chunkTimeoutId);\n }\n chunkTimeoutId = setAbortTimeout({\n abortController: chunkAbortController,\n label: \"Chunk\",\n timeoutMs: chunkTimeoutMs\n });\n }\n function clearChunkTimeout() {\n if (chunkTimeoutId != null) {\n clearTimeout(chunkTimeoutId);\n chunkTimeoutId = void 0;\n }\n }\n function clearStepTimeout() {\n if (stepTimeoutId != null) {\n clearTimeout(stepTimeoutId);\n }\n }\n abortSignal == null ? void 0 : abortSignal.addEventListener(\"abort\", clearStepTimeout);\n abortSignal == null ? void 0 : abortSignal.addEventListener(\"abort\", clearChunkTimeout);\n try {\n stepFinish = new DelayedPromise();\n const stepTracingChannelContext = (_a23 = telemetryDispatcher.startTracingChannelContext) == null ? void 0 : _a23.call(telemetryDispatcher, {\n type: \"step\",\n event: { callId, stepNumber: currentStep },\n completion: stepFinish.promise\n });\n const runInStepTracingChannelContext = (execute) => {\n var _a24;\n return (_a24 = stepTracingChannelContext == null ? void 0 : stepTracingChannelContext.run(execute)) != null ? _a24 : execute();\n };\n const responseMessagesFromPreviousSteps = recordedSteps.flatMap(\n (step) => step.response.messages\n );\n const accumulatedResponseMessages = [\n ...initialResponseMessages,\n ...responseMessagesFromPreviousSteps\n ];\n const stepInputMessages = stepMessagesForNextStep != null ? stepMessagesForNextStep : [\n ...initialMessages,\n ...initialResponseMessages\n ];\n const prepareStepResult = await (prepareStep == null ? void 0 : prepareStep({\n model,\n steps: recordedSteps,\n stepNumber: recordedSteps.length,\n instructions: instructionsForNextStep,\n initialInstructions: initialPrompt.instructions,\n messages: stepInputMessages,\n initialMessages,\n responseMessages: accumulatedResponseMessages,\n toolsContext,\n runtimeContext,\n experimental_sandbox: sandbox\n }));\n const stepSandbox = (_b = prepareStepResult == null ? void 0 : prepareStepResult.experimental_sandbox) != null ? _b : sandbox;\n runtimeContext = (_c = prepareStepResult == null ? void 0 : prepareStepResult.runtimeContext) != null ? _c : runtimeContext;\n toolsContext = (_d = prepareStepResult == null ? void 0 : prepareStepResult.toolsContext) != null ? _d : toolsContext;\n const stepModel = resolveLanguageModel(\n (_e = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _e : model\n );\n const stepActiveTools = filterActiveTools({\n tools,\n activeTools: (_f = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _f : activeTools\n });\n const stepToolOrder = (_g = prepareStepResult == null ? void 0 : prepareStepResult.toolOrder) != null ? _g : toolOrder;\n const stepTools = await prepareTools({\n tools: stepActiveTools,\n toolOrder: stepToolOrder,\n // active tools context is a subset of the tools context, so we can cast to the unknown type\n toolsContext,\n experimental_sandbox: stepSandbox\n });\n const stepToolChoice = prepareToolChoice({\n toolChoice: (_h = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _h : toolChoice\n });\n const stepMessages = (_i = prepareStepResult == null ? void 0 : prepareStepResult.messages) != null ? _i : stepInputMessages;\n currentStepMessages = stepMessages;\n const stepInstructions = (_k = (_j = prepareStepResult == null ? void 0 : prepareStepResult.instructions) != null ? _j : prepareStepResult == null ? void 0 : prepareStepResult.system) != null ? _k : instructionsForNextStep;\n instructionsForNextStep = stepInstructions;\n const stepProviderOptions = mergeObjects(\n providerOptions,\n prepareStepResult == null ? void 0 : prepareStepResult.providerOptions\n );\n const stepStartTimestampMs = now2();\n const { retry } = prepareRetries({ maxRetries, abortSignal });\n const {\n stream: languageModelStream,\n request,\n response\n } = await runInStepTracingChannelContext(\n () => retry(\n async () => {\n var _a24, _b2;\n return streamLanguageModelCall({\n model: (_a24 = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _a24 : model,\n tools: stepActiveTools,\n toolOrder: stepToolOrder,\n toolChoice: (_b2 = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _b2 : toolChoice,\n instructions: stepInstructions,\n messages: stepMessages,\n allowSystemInMessages,\n repairToolCall,\n refineToolInput,\n abortSignal,\n headers,\n includeRawChunks: include.rawChunks,\n providerOptions: stepProviderOptions,\n download: download2,\n output,\n callId,\n executeLanguageModelCallInTelemetryContext: telemetryDispatcher.executeLanguageModelCall,\n toolsContext,\n experimental_sandbox: stepSandbox,\n onLanguageModelCallStart: filterNullable2(\n onLanguageModelCallStart,\n telemetryDispatcher.onLanguageModelCallStart\n ),\n onLanguageModelCallEnd: filterNullable2(\n onLanguageModelCallEnd,\n telemetryDispatcher.onLanguageModelCallEnd\n ),\n onStart: async ({ promptMessages }) => {\n var _a25, _b3;\n await notify({\n event: {\n callId,\n provider: stepModel.provider,\n modelId: stepModel.modelId,\n stepNumber: recordedSteps.length,\n instructions: stepInstructions,\n messages: stepMessages,\n tools,\n toolChoice: (_a25 = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _a25 : toolChoice,\n activeTools: (_b3 = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _b3 : activeTools,\n toolOrder: stepToolOrder,\n steps: [...recordedSteps],\n providerOptions: stepProviderOptions,\n runtimeContext,\n toolsContext,\n output,\n promptMessages,\n stepTools,\n stepToolChoice\n },\n callbacks: [onStepStart, telemetryDispatcher.onStepStart]\n });\n },\n _internal: {\n now: now2\n },\n ...callSettings\n });\n }\n )\n );\n const streamAfterToolCallbackInvocation = invokeToolCallbacksFromStream({\n stream: languageModelStream,\n tools,\n stepInputMessages: stepMessages,\n abortSignal,\n runtimeContext\n });\n const runInTracingChannelSpanInStep = telemetryDispatcher.runInTracingChannelSpan == null ? void 0 : (options) => runInStepTracingChannelContext(\n () => telemetryDispatcher.runInTracingChannelSpan(options)\n );\n const streamWithToolResults = executeToolsFromStream({\n stream: streamAfterToolCallbackInvocation,\n tools,\n callId,\n messages: stepMessages,\n abortSignal,\n timeout,\n experimental_sandbox: stepSandbox,\n toolsContext,\n toolApproval,\n runtimeContext,\n toolApprovalSecret: experimental_toolApprovalSecret,\n generateId: generateId2,\n // the callbacks need to be passed down and handled by executeToolCall\n // to guarantee that the onToolExecutionStart callback is invoked before the tool execute function\n onToolExecutionStart: filterNullable2(\n onToolExecutionStart,\n telemetryDispatcher.onToolExecutionStart\n ),\n onToolExecutionEnd: filterNullable2(\n onToolExecutionEnd,\n telemetryDispatcher.onToolExecutionEnd\n ),\n executeToolInTelemetryContext: telemetryDispatcher.executeTool,\n runInTracingChannelSpan: runInTracingChannelSpanInStep\n });\n const stepRequest = {\n ...request,\n body: include.requestBody ? request == null ? void 0 : request.body : void 0,\n messages: include.requestMessages ? cloneModelMessages(stepMessages) : void 0\n };\n recordedRequestMessages = (_l = stepRequest.messages) != null ? _l : [];\n const stepToolCalls = [];\n const stepToolOutputs = [];\n const stepToolApprovalResponses = [];\n let warnings;\n let stepFinishReason = \"other\";\n let stepRawFinishReason = void 0;\n let hasReceivedTerminalChunk = false;\n let hasReceivedOutputChunk = false;\n let stepUsage = createNullLanguageModelUsage();\n let stepProviderMetadata;\n let stepFirstChunk = true;\n let modelCallPerformance = {\n responseTimeMs: 0,\n effectiveOutputTokensPerSecond: 0,\n outputTokensPerSecond: void 0,\n inputTokensPerSecond: void 0,\n effectiveTotalTokensPerSecond: 0,\n timeToFirstOutputMs: void 0,\n timeBetweenOutputChunksMs: void 0\n };\n const toolExecutionMs = {};\n let stepResponse = {\n id: generateId2(),\n timestamp: /* @__PURE__ */ new Date(),\n modelId: model.modelId\n };\n self.addStream(\n streamWithToolResults.pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n var _a24, _b2, _c2;\n resetChunkTimeout();\n if (chunk.type === \"model-call-start\") {\n warnings = chunk.warnings;\n return;\n }\n if (stepFirstChunk) {\n stepFirstChunk = false;\n controller.enqueue({\n type: \"start-step\",\n request: stepRequest,\n warnings: warnings != null ? warnings : []\n });\n }\n const chunkType = chunk.type;\n if (isOutputChunkType[chunkType]) {\n hasReceivedOutputChunk = true;\n }\n switch (chunkType) {\n case \"file\":\n case \"custom\":\n case \"source\":\n case \"text-start\":\n case \"text-end\":\n case \"reasoning-start\":\n case \"reasoning-end\":\n case \"reasoning-delta\":\n case \"reasoning-file\":\n case \"tool-input-start\":\n case \"tool-input-end\":\n case \"tool-input-delta\":\n case \"tool-approval-request\": {\n controller.enqueue(chunk);\n break;\n }\n case \"text-delta\": {\n if (chunk.text.length > 0) {\n controller.enqueue(chunk);\n }\n break;\n }\n case \"tool-call\": {\n controller.enqueue(chunk);\n stepToolCalls.push(chunk);\n break;\n }\n case \"tool-approval-response\": {\n controller.enqueue(chunk);\n stepToolApprovalResponses.push(chunk);\n break;\n }\n case \"tool-result\": {\n controller.enqueue(chunk);\n if (!chunk.preliminary) {\n stepToolOutputs.push(chunk);\n }\n break;\n }\n case \"tool-error\": {\n controller.enqueue(chunk);\n stepToolOutputs.push(chunk);\n break;\n }\n case \"tool-execution-end\": {\n toolExecutionMs[chunk.toolCallId] = chunk.toolExecutionMs;\n break;\n }\n case \"model-call-response-metadata\": {\n stepResponse = {\n id: (_a24 = chunk.id) != null ? _a24 : stepResponse.id,\n timestamp: (_b2 = chunk.timestamp) != null ? _b2 : stepResponse.timestamp,\n modelId: (_c2 = chunk.modelId) != null ? _c2 : stepResponse.modelId\n };\n break;\n }\n case \"model-call-end\": {\n hasReceivedTerminalChunk = true;\n stepUsage = chunk.usage;\n stepFinishReason = chunk.finishReason;\n stepRawFinishReason = chunk.rawFinishReason;\n stepProviderMetadata = chunk.providerMetadata;\n modelCallPerformance = chunk.performance;\n break;\n }\n case \"error\": {\n hasReceivedTerminalChunk = true;\n controller.enqueue(chunk);\n stepFinishReason = \"error\";\n break;\n }\n case \"raw\": {\n if (include.rawChunks) {\n controller.enqueue(chunk);\n }\n break;\n }\n default: {\n const exhaustiveCheck = chunkType;\n throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);\n }\n }\n },\n // invoke onEnd callback and resolve toolResults promise when the stream is about to close:\n async flush(controller) {\n if (!hasReceivedTerminalChunk && !hasReceivedOutputChunk) {\n controller.enqueue({\n type: \"error\",\n error: new NoOutputGeneratedError({\n message: \"No output generated. The model stream ended without a finish chunk.\"\n })\n });\n clearStepTimeout();\n clearChunkTimeout();\n self.closeStream();\n return;\n }\n const stepTimeMs = now2() - stepStartTimestampMs;\n const finishStepPart = {\n type: \"finish-step\",\n finishReason: stepFinishReason,\n rawFinishReason: stepRawFinishReason,\n usage: stepUsage,\n performance: {\n stepTimeMs,\n toolExecutionMs,\n ...modelCallPerformance\n },\n providerMetadata: stepProviderMetadata,\n response: {\n ...stepResponse,\n headers: response == null ? void 0 : response.headers\n }\n };\n controller.enqueue(finishStepPart);\n const combinedUsage = addLanguageModelUsage(usage, stepUsage);\n await stepFinish.promise;\n const clientToolCalls = stepToolCalls.filter(\n (toolCall) => toolCall.providerExecuted !== true\n );\n const clientToolOutputs = stepToolOutputs.filter(\n (toolOutput) => toolOutput.providerExecuted !== true\n );\n const deniedToolApprovalResponses = stepToolApprovalResponses.filter(\n (toolApprovalResponse) => toolApprovalResponse.approved === false\n );\n for (const toolCall of stepToolCalls) {\n if (toolCall.providerExecuted !== true)\n continue;\n const tool2 = getOwn(tools, toolCall.toolName);\n if ((tool2 == null ? void 0 : tool2.type) === \"provider\" && tool2.supportsDeferredResults) {\n const hasResultInStep = stepToolOutputs.some(\n (output2) => (output2.type === \"tool-result\" || output2.type === \"tool-error\") && output2.toolCallId === toolCall.toolCallId\n );\n if (!hasResultInStep) {\n pendingDeferredToolCalls.set(toolCall.toolCallId, {\n toolName: toolCall.toolName\n });\n }\n }\n }\n for (const output2 of stepToolOutputs) {\n if (output2.type === \"tool-result\" || output2.type === \"tool-error\") {\n pendingDeferredToolCalls.delete(output2.toolCallId);\n }\n }\n clearStepTimeout();\n clearChunkTimeout();\n if (\n // Continue if:\n // 1. There are client tool calls that have all been executed or denied, OR\n // 2. There are pending deferred results from provider-executed tools, OR\n (clientToolCalls.length > 0 && clientToolCalls.length === clientToolOutputs.length + deniedToolApprovalResponses.length || pendingDeferredToolCalls.size > 0) && // continue until a stop condition is met:\n !await isStopConditionMet({\n stopConditions,\n steps: recordedSteps\n })\n ) {\n try {\n await runInStreamTextTracingChannelContext(\n () => streamStep({\n currentStep: currentStep + 1,\n usage: combinedUsage\n })\n );\n } catch (error) {\n controller.enqueue({\n type: \"error\",\n error\n });\n self.closeStream();\n }\n } else {\n controller.enqueue({\n type: \"finish\",\n finishReason: stepFinishReason,\n rawFinishReason: stepRawFinishReason,\n totalUsage: combinedUsage\n });\n self.closeStream();\n }\n }\n })\n )\n );\n } catch (error) {\n clearStepTimeout();\n clearChunkTimeout();\n throw error;\n }\n }\n await runInStreamTextTracingChannelContext(\n () => (\n // add the initial stream to the stitchable stream\n streamStep({\n currentStep: 0,\n usage: createNullLanguageModelUsage()\n })\n )\n );\n })().catch(async (error) => {\n var _a22;\n await ((_a22 = telemetryDispatcher.onError) == null ? void 0 : _a22.call(telemetryDispatcher, { callId, error }));\n self._initialResponseMessages.reject(error);\n markPromiseAsHandled(self._initialResponseMessages.promise);\n self.addStream(\n new ReadableStream({\n start(controller) {\n controller.enqueue({ type: \"error\", error });\n controller.close();\n }\n })\n );\n self.closeStream();\n });\n }\n get steps() {\n this.consumeStream();\n return this._steps.promise;\n }\n get finalStep() {\n return this.steps.then((steps) => steps.at(-1));\n }\n get content() {\n return this.steps.then((steps) => steps.flatMap((step) => step.content));\n }\n get warnings() {\n return this.steps.then((steps) => steps.flatMap((step) => {\n var _a22;\n return (_a22 = step.warnings) != null ? _a22 : [];\n }));\n }\n get providerMetadata() {\n return this.finalStep.then((step) => step.providerMetadata);\n }\n get text() {\n return this.finalStep.then((step) => step.text);\n }\n get reasoningText() {\n return this.finalStep.then((step) => step.reasoningText);\n }\n get reasoning() {\n return this.finalStep.then(\n (step) => convertToReasoningOutputs(step.reasoning)\n );\n }\n get sources() {\n return this.steps.then((steps) => steps.flatMap((step) => step.sources));\n }\n get files() {\n return this.steps.then((steps) => steps.flatMap((step) => step.files));\n }\n get toolCalls() {\n return this.steps.then((steps) => steps.flatMap((step) => step.toolCalls));\n }\n get staticToolCalls() {\n return this.steps.then(\n (steps) => steps.flatMap((step) => step.staticToolCalls)\n );\n }\n get dynamicToolCalls() {\n return this.steps.then(\n (steps) => steps.flatMap((step) => step.dynamicToolCalls)\n );\n }\n get toolResults() {\n return this.steps.then((steps) => steps.flatMap((step) => step.toolResults));\n }\n get staticToolResults() {\n return this.steps.then(\n (steps) => steps.flatMap((step) => step.staticToolResults)\n );\n }\n get dynamicToolResults() {\n return this.steps.then(\n (steps) => steps.flatMap((step) => step.dynamicToolResults)\n );\n }\n get usage() {\n return this.totalUsage;\n }\n get request() {\n return this.finalStep.then((step) => step.request);\n }\n get response() {\n return this.finalStep.then((step) => step.response);\n }\n get responseMessages() {\n return Promise.all([\n this._initialResponseMessages.promise,\n this.steps\n ]).then(([initialResponseMessages, steps]) => [\n ...initialResponseMessages,\n ...steps.flatMap((step) => step.response.messages)\n ]);\n }\n get totalUsage() {\n this.consumeStream();\n return this._totalUsage.promise;\n }\n get finishReason() {\n this.consumeStream();\n return this._finishReason.promise;\n }\n get rawFinishReason() {\n this.consumeStream();\n return this._rawFinishReason.promise;\n }\n /**\n * Split out a new stream from the original stream.\n * The original stream is replaced to allow for further splitting,\n * since we do not know how many times the stream will be split.\n *\n * Note: this leads to buffering the stream content on the server.\n * However, the LLM results are expected to be small enough to not cause issues.\n */\n teeStream() {\n const [stream1, stream2] = this.baseStream.tee();\n this.baseStream = stream2;\n return stream1;\n }\n get textStream() {\n return createAsyncIterableStream(toTextStream({ stream: this.stream }));\n }\n get stream() {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream({\n transform({ part }, controller) {\n controller.enqueue(part);\n }\n })\n )\n );\n }\n get fullStream() {\n return this.stream;\n }\n rejectResultPromises(error) {\n this.rejectResultPromise({ delayedPromise: this._finishReason, error });\n this.rejectResultPromise({ delayedPromise: this._rawFinishReason, error });\n this.rejectResultPromise({ delayedPromise: this._totalUsage, error });\n this.rejectResultPromise({ delayedPromise: this._steps, error });\n this.rejectResultPromise({\n delayedPromise: this._initialResponseMessages,\n error\n });\n }\n rejectResultPromise({\n delayedPromise,\n error\n }) {\n if (delayedPromise.isPending()) {\n delayedPromise.reject(error);\n markPromiseAsHandled(delayedPromise.promise);\n }\n }\n async consumeStream(options) {\n var _a22;\n try {\n await consumeStream({\n stream: this.stream,\n onError: (error) => {\n var _a23;\n this.rejectResultPromises(error);\n (_a23 = options == null ? void 0 : options.onError) == null ? void 0 : _a23.call(options, error);\n }\n });\n } catch (error) {\n this.rejectResultPromises(error);\n (_a22 = options == null ? void 0 : options.onError) == null ? void 0 : _a22.call(options, error);\n }\n }\n get experimental_partialOutputStream() {\n return this.partialOutputStream;\n }\n get partialOutputStream() {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream({\n transform({ partialOutput }, controller) {\n if (partialOutput != null) {\n controller.enqueue(partialOutput);\n }\n }\n })\n )\n );\n }\n get elementStream() {\n var _a22, _b, _c;\n const transform = (_a22 = this.outputSpecification) == null ? void 0 : _a22.createElementStreamTransform();\n if (transform == null) {\n throw new UnsupportedFunctionalityError2({\n functionality: `element streams in ${(_c = (_b = this.outputSpecification) == null ? void 0 : _b.name) != null ? _c : \"text\"} mode`\n });\n }\n return createAsyncIterableStream(this.teeStream().pipeThrough(transform));\n }\n get output() {\n return this.finalStep.then((step) => {\n var _a22;\n const output = (_a22 = this.outputSpecification) != null ? _a22 : text();\n return output.parseCompleteOutput(\n { text: step.text },\n {\n response: step.response,\n usage: step.usage,\n finishReason: step.finishReason\n }\n );\n });\n }\n toUIMessageStream({\n originalMessages,\n generateMessageId,\n onEnd,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendStart,\n sendFinish,\n onError\n } = {}) {\n return createAsyncIterableStream(\n toUIMessageStream({\n stream: this.stream,\n tools: this.tools,\n originalMessages,\n generateMessageId,\n onEnd: onEnd != null ? onEnd : onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendStart,\n sendFinish,\n onError\n })\n );\n }\n pipeUIMessageStreamToResponse(response, {\n originalMessages,\n generateMessageId,\n onEnd,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n ...init\n } = {}) {\n pipeUIMessageStreamToResponse({\n response,\n stream: this.toUIMessageStream({\n originalMessages,\n generateMessageId,\n onEnd: onEnd != null ? onEnd : onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError\n }),\n ...init\n });\n }\n pipeTextStreamToResponse(response, init) {\n pipeTextStreamToResponse({\n response,\n stream: this.textStream,\n ...init\n });\n }\n toUIMessageStreamResponse({\n originalMessages,\n generateMessageId,\n onEnd,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError,\n ...init\n } = {}) {\n return createUIMessageStreamResponse({\n stream: this.toUIMessageStream({\n originalMessages,\n generateMessageId,\n onEnd: onEnd != null ? onEnd : onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendFinish,\n sendStart,\n onError\n }),\n ...init\n });\n }\n toTextStreamResponse(init) {\n return createTextStreamResponse({\n stream: this.textStream,\n ...init\n });\n }\n};\n\n// src/agent/tool-loop-agent.ts\nvar ToolLoopAgent = class {\n constructor(settings) {\n this.version = \"agent-v1\";\n const { onFinish, onEnd = onFinish } = settings;\n this.settings = { ...settings, onEnd };\n }\n /**\n * The id of the agent.\n */\n get id() {\n return this.settings.id;\n }\n /**\n * The tools that the agent can use.\n */\n get tools() {\n return this.settings.tools;\n }\n async prepareCall(options) {\n var _a22, _b, _c, _d;\n if (this.settings.callOptionsSchema != null && options.options !== void 0) {\n const validatedOptions = await validateTypes3({\n value: options.options,\n schema: this.settings.callOptionsSchema,\n context: { field: \"options\" }\n });\n options = { ...options, options: validatedOptions };\n }\n const {\n onStart: _settingsStableOnStart,\n experimental_onStart: _settingsExperimentalOnStart,\n onStepStart: _settingsStableOnStepStart,\n experimental_onStepStart: _settingsExperimentalOnStepStart,\n onToolExecutionStart: _settingsOnToolExecutionStart,\n onToolExecutionEnd: _settingsOnToolExecutionEnd,\n onStepEnd: _settingsOnStepEnd,\n onStepFinish: _settingsOnStepFinish,\n onFinish: _settingsOnFinish,\n onEnd: _settingsOnEnd,\n ...settingsWithoutCallbacks\n } = this.settings;\n const baseCallArgs = {\n ...settingsWithoutCallbacks,\n stopWhen: (_a22 = this.settings.stopWhen) != null ? _a22 : isStepCount(20),\n ...options\n };\n const preparedCallArgs = (_d = await ((_c = (_b = this.settings).prepareCall) == null ? void 0 : _c.call(\n _b,\n baseCallArgs\n ))) != null ? _d : baseCallArgs;\n const {\n instructions,\n allowSystemInMessages,\n messages,\n prompt,\n runtimeContext,\n ...callArgs\n } = preparedCallArgs;\n const promptArgs = {\n instructions,\n allowSystemInMessages,\n messages,\n prompt\n };\n if (runtimeContext === void 0) {\n return {\n ...callArgs,\n ...promptArgs\n };\n }\n return {\n ...callArgs,\n runtimeContext,\n ...promptArgs\n };\n }\n /**\n * Tags outgoing requests so usage can be attributed to ToolLoopAgent. Chains\n * with the `ai/<version>` and `ai-sdk/<provider>/<version>` suffixes added\n * downstream by generateText/streamText and the provider.\n */\n agentHeaders(preparedCall) {\n var _a22;\n return withUserAgentSuffix3(\n (_a22 = preparedCall.headers) != null ? _a22 : {},\n \"ai-sdk-agent/tool-loop\"\n );\n }\n /**\n * Generates an output from the agent (non-streaming).\n */\n async generate({\n abortSignal,\n timeout,\n experimental_sandbox: sandbox,\n onStart,\n experimental_onStart,\n onStepStart,\n experimental_onStepStart,\n onToolExecutionStart,\n onToolExecutionEnd,\n onStepEnd,\n onStepFinish,\n onFinish,\n onEnd = onFinish,\n ...options\n }) {\n var _a22, _b, _c;\n const generate = generateText;\n const preparedCall = await this.prepareCall({\n ...options,\n experimental_sandbox: sandbox\n });\n const callbackArgs = {\n abortSignal,\n timeout,\n experimental_sandbox: sandbox,\n onStart: mergeCallbacks(\n (_a22 = this.settings.onStart) != null ? _a22 : this.settings.experimental_onStart,\n onStart != null ? onStart : experimental_onStart\n ),\n onStepStart: mergeCallbacks(\n (_b = this.settings.onStepStart) != null ? _b : this.settings.experimental_onStepStart,\n onStepStart != null ? onStepStart : experimental_onStepStart\n ),\n onToolExecutionStart: mergeCallbacks(\n this.settings.onToolExecutionStart,\n onToolExecutionStart\n ),\n onToolExecutionEnd: mergeCallbacks(\n this.settings.onToolExecutionEnd,\n onToolExecutionEnd\n ),\n onStepEnd: mergeCallbacks(\n (_c = this.settings.onStepEnd) != null ? _c : this.settings.onStepFinish,\n onStepEnd != null ? onStepEnd : onStepFinish\n ),\n onEnd: mergeCallbacks(this.settings.onEnd, onEnd)\n };\n return await generate({\n ...preparedCall,\n ...callbackArgs,\n headers: this.agentHeaders(preparedCall)\n });\n }\n /**\n * Streams an output from the agent (streaming).\n */\n async stream({\n abortSignal,\n timeout,\n experimental_sandbox: sandbox,\n experimental_transform,\n onStart,\n experimental_onStart,\n onStepStart,\n experimental_onStepStart,\n onToolExecutionStart,\n onToolExecutionEnd,\n onStepEnd,\n onStepFinish,\n onFinish,\n onEnd = onFinish,\n ...options\n }) {\n var _a22, _b, _c;\n const stream = streamText;\n const preparedCall = await this.prepareCall({\n ...options,\n experimental_sandbox: sandbox\n });\n const callbackArgs = {\n abortSignal,\n timeout,\n experimental_sandbox: sandbox,\n experimental_transform,\n onStart: mergeCallbacks(\n (_a22 = this.settings.onStart) != null ? _a22 : this.settings.experimental_onStart,\n onStart != null ? onStart : experimental_onStart\n ),\n onStepStart: mergeCallbacks(\n (_b = this.settings.onStepStart) != null ? _b : this.settings.experimental_onStepStart,\n onStepStart != null ? onStepStart : experimental_onStepStart\n ),\n onToolExecutionStart: mergeCallbacks(\n this.settings.onToolExecutionStart,\n onToolExecutionStart\n ),\n onToolExecutionEnd: mergeCallbacks(\n this.settings.onToolExecutionEnd,\n onToolExecutionEnd\n ),\n onStepEnd: mergeCallbacks(\n (_c = this.settings.onStepEnd) != null ? _c : this.settings.onStepFinish,\n onStepEnd != null ? onStepEnd : onStepFinish\n ),\n onEnd: mergeCallbacks(this.settings.onEnd, onEnd)\n };\n return await stream({\n ...preparedCall,\n ...callbackArgs,\n headers: this.agentHeaders(preparedCall)\n });\n }\n};\n\n// src/ui-message-stream/create-ui-message-stream.ts\nimport {\n generateId as generateIdFunc\n} from \"@ai-sdk/provider-utils\";\nfunction createUIMessageStream({\n execute,\n onError = () => \"An error occurred.\",\n // prevent leaking server error details to the client by default\n originalMessages,\n onStepEnd,\n onStepFinish,\n onEnd,\n onFinish,\n generateId: generateId2 = generateIdFunc\n}) {\n let controller;\n const ongoingStreamPromises = [];\n const stream = new ReadableStream({\n start(controllerArg) {\n controller = controllerArg;\n }\n });\n function safeEnqueue(data) {\n try {\n controller.enqueue(data);\n } catch (e) {\n }\n }\n try {\n const result = execute({\n writer: {\n write(part) {\n safeEnqueue(part);\n },\n merge(streamArg) {\n ongoingStreamPromises.push(\n (async () => {\n const reader = streamArg.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done)\n break;\n safeEnqueue(value);\n }\n })().catch((error) => {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n })\n );\n },\n onError\n }\n });\n if (result) {\n ongoingStreamPromises.push(\n result.catch((error) => {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n })\n );\n }\n } catch (error) {\n safeEnqueue({\n type: \"error\",\n errorText: onError(error)\n });\n }\n const waitForStreams = new Promise(async (resolve3) => {\n while (ongoingStreamPromises.length > 0) {\n await ongoingStreamPromises.shift();\n }\n resolve3();\n });\n waitForStreams.finally(() => {\n try {\n controller.close();\n } catch (e) {\n }\n });\n return handleUIMessageStreamFinish({\n stream,\n messageId: generateId2(),\n originalMessages,\n onStepEnd: onStepEnd != null ? onStepEnd : onStepFinish,\n onEnd: onEnd != null ? onEnd : onFinish,\n onError\n });\n}\n\n// src/ui-message-stream/read-ui-message-stream.ts\nfunction readUIMessageStream({\n message,\n stream,\n onError,\n terminateOnError = false\n}) {\n var _a22;\n let controller;\n let hasErrored = false;\n const outputStream = new ReadableStream({\n start(controllerParam) {\n controller = controllerParam;\n }\n });\n const state = createStreamingUIMessageState({\n messageId: (_a22 = message == null ? void 0 : message.id) != null ? _a22 : \"\",\n lastMessage: message\n });\n const handleError = (error) => {\n onError == null ? void 0 : onError(error);\n if (!hasErrored && terminateOnError) {\n hasErrored = true;\n controller == null ? void 0 : controller.error(error);\n }\n };\n consumeStream({\n stream: processUIMessageStream({\n stream,\n runUpdateMessageJob(job) {\n return job({\n state,\n write: () => {\n controller == null ? void 0 : controller.enqueue(structuredClone(state.message));\n }\n });\n },\n onError: handleError\n }),\n onError: handleError\n }).finally(() => {\n if (!hasErrored) {\n controller == null ? void 0 : controller.close();\n }\n });\n return createAsyncIterableStream(outputStream);\n}\n\n// src/ui/convert-to-model-messages.ts\nimport {\n isNonNullable\n} from \"@ai-sdk/provider-utils\";\nasync function convertToModelMessages(messages, options) {\n const modelMessages = [];\n if (options == null ? void 0 : options.ignoreIncompleteToolCalls) {\n messages = messages.map((message) => ({\n ...message,\n parts: message.parts.filter(\n (part) => !isToolUIPart(part) || part.state !== \"input-streaming\" && part.state !== \"input-available\"\n )\n }));\n }\n for (const message of messages) {\n switch (message.role) {\n case \"system\": {\n const textParts = message.parts.filter(\n (part) => part.type === \"text\"\n );\n const providerMetadata = textParts.reduce((acc, part) => {\n if (part.providerMetadata != null) {\n return { ...acc, ...part.providerMetadata };\n }\n return acc;\n }, {});\n modelMessages.push({\n role: \"system\",\n content: textParts.map((part) => part.text).join(\"\"),\n ...Object.keys(providerMetadata).length > 0 ? { providerOptions: providerMetadata } : {}\n });\n break;\n }\n case \"user\": {\n modelMessages.push({\n role: \"user\",\n content: message.parts.map((part) => {\n var _a22;\n if (isTextUIPart(part)) {\n return {\n type: \"text\",\n text: part.text,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n };\n }\n if (isFileUIPart(part)) {\n return {\n type: \"file\",\n mediaType: part.mediaType,\n filename: part.filename,\n data: part.providerReference != null ? {\n type: \"reference\",\n reference: part.providerReference\n } : { type: \"url\", url: new URL(part.url) },\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n };\n }\n if (isDataUIPart(part)) {\n return (_a22 = options == null ? void 0 : options.convertDataPart) == null ? void 0 : _a22.call(\n options,\n part\n );\n }\n }).filter(isNonNullable)\n });\n break;\n }\n case \"assistant\": {\n if (message.parts != null) {\n let block = [];\n async function processBlock() {\n var _a22, _b, _c, _d, _e, _f, _g;\n if (block.length === 0) {\n return;\n }\n const content = [];\n for (const part of block) {\n if (isTextUIPart(part)) {\n content.push({\n type: \"text\",\n text: part.text,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n } else if (isCustomContentUIPart(part)) {\n content.push({\n type: \"custom\",\n kind: part.kind,\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n } else if (isFileUIPart(part)) {\n content.push({\n type: \"file\",\n mediaType: part.mediaType,\n filename: part.filename,\n data: part.providerReference != null ? {\n type: \"reference\",\n reference: part.providerReference\n } : { type: \"url\", url: new URL(part.url) },\n ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}\n });\n } else if (isReasoningFileUIPart(part)) {\n content.push({\n type: \"reasoning-file\",\n data: { type: \"url\", url: new URL(part.url) },\n mediaType: part.mediaType,\n providerOptions: part.providerMetadata\n });\n } else if (isReasoningUIPart(part)) {\n content.push({\n type: \"reasoning\",\n text: part.text,\n providerOptions: part.providerMetadata\n });\n } else if (isToolUIPart(part)) {\n const toolName = getToolName(part);\n if (part.state !== \"input-streaming\") {\n content.push({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName,\n input: part.state === \"output-error\" ? (_a22 = part.input) != null ? _a22 : \"rawInput\" in part ? part.rawInput : void 0 : part.input,\n providerExecuted: part.providerExecuted,\n ...part.callProviderMetadata != null ? { providerOptions: part.callProviderMetadata } : {}\n });\n if (part.approval != null) {\n content.push({\n type: \"tool-approval-request\",\n approvalId: part.approval.id,\n toolCallId: part.toolCallId,\n isAutomatic: part.approval.isAutomatic,\n ...part.approval.signature != null ? { signature: part.approval.signature } : {}\n });\n }\n if (part.providerExecuted === true && part.state !== \"approval-responded\" && (part.state === \"output-available\" || part.state === \"output-error\")) {\n const resultProviderMetadata = (_b = part.resultProviderMetadata) != null ? _b : part.callProviderMetadata;\n content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName,\n output: await createToolModelOutput({\n toolCallId: part.toolCallId,\n input: part.input,\n output: part.state === \"output-error\" ? part.errorText : part.output,\n tool: getOwn(options == null ? void 0 : options.tools, toolName),\n errorMode: part.state === \"output-error\" ? \"json\" : \"none\"\n }),\n ...resultProviderMetadata != null ? { providerOptions: resultProviderMetadata } : {}\n });\n }\n }\n } else if (isDataUIPart(part)) {\n const dataPart = (_c = options == null ? void 0 : options.convertDataPart) == null ? void 0 : _c.call(\n options,\n part\n );\n if (dataPart != null) {\n content.push(dataPart);\n }\n } else {\n const _exhaustiveCheck = part;\n throw new Error(`Unsupported part: ${_exhaustiveCheck}`);\n }\n }\n if (content.length > 0) {\n modelMessages.push({\n role: \"assistant\",\n content\n });\n }\n const toolParts = block.filter(\n (part) => {\n var _a23;\n return isToolUIPart(part) && (part.providerExecuted !== true || ((_a23 = part.approval) == null ? void 0 : _a23.approved) != null);\n }\n );\n if (toolParts.length > 0) {\n {\n const content2 = [];\n for (const toolPart of toolParts) {\n if (((_d = toolPart.approval) == null ? void 0 : _d.approved) != null) {\n content2.push({\n type: \"tool-approval-response\",\n approvalId: toolPart.approval.id,\n approved: toolPart.approval.approved,\n reason: toolPart.approval.reason,\n providerExecuted: toolPart.providerExecuted\n });\n }\n if (toolPart.state === \"approval-responded\" && ((_e = toolPart.approval) == null ? void 0 : _e.approved) === false) {\n content2.push({\n type: \"tool-result\",\n toolCallId: toolPart.toolCallId,\n toolName: getToolName(toolPart),\n output: {\n type: \"execution-denied\",\n reason: toolPart.approval.reason\n },\n ...toolPart.callProviderMetadata != null ? { providerOptions: toolPart.callProviderMetadata } : {}\n });\n }\n if (toolPart.providerExecuted === true) {\n continue;\n }\n switch (toolPart.state) {\n case \"output-denied\": {\n content2.push({\n type: \"tool-result\",\n toolCallId: toolPart.toolCallId,\n toolName: getToolName(toolPart),\n output: {\n type: \"error-text\",\n value: (_g = (_f = toolPart.approval) == null ? void 0 : _f.reason) != null ? _g : \"Tool call execution denied.\"\n },\n ...toolPart.callProviderMetadata != null ? { providerOptions: toolPart.callProviderMetadata } : {}\n });\n break;\n }\n case \"output-error\":\n case \"output-available\": {\n const toolName = getToolName(toolPart);\n content2.push({\n type: \"tool-result\",\n toolCallId: toolPart.toolCallId,\n toolName,\n output: await createToolModelOutput({\n toolCallId: toolPart.toolCallId,\n input: toolPart.input,\n output: toolPart.state === \"output-error\" ? toolPart.errorText : toolPart.output,\n tool: getOwn(options == null ? void 0 : options.tools, toolName),\n errorMode: toolPart.state === \"output-error\" ? \"text\" : \"none\"\n }),\n ...toolPart.callProviderMetadata != null ? { providerOptions: toolPart.callProviderMetadata } : {}\n });\n break;\n }\n }\n }\n if (content2.length > 0) {\n modelMessages.push({\n role: \"tool\",\n content: content2\n });\n }\n }\n }\n block = [];\n }\n for (const part of message.parts) {\n if (isCustomContentUIPart(part) || isTextUIPart(part) || isReasoningUIPart(part) || isReasoningFileUIPart(part) || isFileUIPart(part) || isToolUIPart(part) || isDataUIPart(part)) {\n block.push(part);\n } else if (part.type === \"step-start\") {\n await processBlock();\n }\n }\n await processBlock();\n break;\n }\n break;\n }\n default: {\n const _exhaustiveCheck = message.role;\n throw new MessageConversionError({\n originalMessage: message,\n message: `Unsupported role: ${_exhaustiveCheck}`\n });\n }\n }\n }\n return modelMessages;\n}\n\n// src/ui/validate-ui-messages.ts\nimport { TypeValidationError as TypeValidationError3 } from \"@ai-sdk/provider\";\nimport {\n lazySchema as lazySchema2,\n validateTypes as validateTypes4,\n zodSchema as zodSchema2\n} from \"@ai-sdk/provider-utils\";\nimport { z as z7 } from \"zod/v4\";\nvar toolMetadataSchema2 = z7.record(\n z7.string(),\n jsonValueSchema.optional()\n);\nvar providerReferenceSchema2 = z7.record(z7.string(), z7.string());\nvar uiMessagesSchema = lazySchema2(\n () => zodSchema2(\n z7.array(\n z7.object({\n id: z7.string(),\n role: z7.enum([\"system\", \"user\", \"assistant\"]),\n metadata: z7.unknown().optional(),\n parts: z7.array(\n z7.union([\n z7.object({\n type: z7.literal(\"text\"),\n text: z7.string(),\n state: z7.enum([\"streaming\", \"done\"]).optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.object({\n type: z7.literal(\"reasoning\"),\n text: z7.string(),\n state: z7.enum([\"streaming\", \"done\"]).optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.object({\n type: z7.literal(\"custom\"),\n kind: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.object({\n type: z7.literal(\"source-url\"),\n sourceId: z7.string(),\n url: z7.string(),\n title: z7.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.object({\n type: z7.literal(\"source-document\"),\n sourceId: z7.string(),\n mediaType: z7.string(),\n title: z7.string(),\n filename: z7.string().optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.object({\n type: z7.literal(\"file\"),\n mediaType: z7.string(),\n filename: z7.string().optional(),\n url: z7.string(),\n providerReference: providerReferenceSchema2.optional(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.object({\n type: z7.literal(\"reasoning-file\"),\n mediaType: z7.string(),\n url: z7.string(),\n providerMetadata: providerMetadataSchema.optional()\n }),\n z7.object({\n type: z7.literal(\"step-start\")\n }),\n z7.object({\n type: z7.string().startsWith(\"data-\"),\n id: z7.string().optional(),\n data: z7.unknown()\n }),\n z7.object({\n type: z7.literal(\"dynamic-tool\"),\n toolName: z7.string(),\n toolCallId: z7.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z7.literal(\"input-streaming\"),\n input: z7.unknown().optional(),\n providerExecuted: z7.boolean().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n output: z7.never().optional(),\n errorText: z7.never().optional(),\n approval: z7.never().optional()\n }),\n z7.object({\n type: z7.literal(\"dynamic-tool\"),\n toolName: z7.string(),\n toolCallId: z7.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z7.literal(\"input-available\"),\n input: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n output: z7.never().optional(),\n errorText: z7.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z7.never().optional()\n }),\n z7.object({\n type: z7.literal(\"dynamic-tool\"),\n toolName: z7.string(),\n toolCallId: z7.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z7.literal(\"approval-requested\"),\n input: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n output: z7.never().optional(),\n errorText: z7.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z7.object({\n id: z7.string(),\n approved: z7.never().optional(),\n reason: z7.never().optional(),\n isAutomatic: z7.boolean().optional(),\n signature: z7.string().optional()\n })\n }),\n z7.object({\n type: z7.literal(\"dynamic-tool\"),\n toolName: z7.string(),\n toolCallId: z7.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z7.literal(\"approval-responded\"),\n input: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n output: z7.never().optional(),\n errorText: z7.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z7.object({\n id: z7.string(),\n approved: z7.boolean(),\n reason: z7.string().optional(),\n isAutomatic: z7.boolean().optional(),\n signature: z7.string().optional()\n })\n }),\n z7.object({\n type: z7.literal(\"dynamic-tool\"),\n toolName: z7.string(),\n toolCallId: z7.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z7.literal(\"output-available\"),\n input: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n output: z7.unknown(),\n errorText: z7.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n preliminary: z7.boolean().optional(),\n approval: z7.object({\n id: z7.string(),\n approved: z7.literal(true),\n reason: z7.string().optional(),\n isAutomatic: z7.boolean().optional(),\n signature: z7.string().optional()\n }).optional()\n }),\n z7.object({\n type: z7.literal(\"dynamic-tool\"),\n toolName: z7.string(),\n toolCallId: z7.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z7.literal(\"output-error\"),\n input: z7.unknown().optional(),\n rawInput: z7.unknown().optional(),\n providerExecuted: z7.boolean().optional(),\n output: z7.never().optional(),\n errorText: z7.string(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n approval: z7.object({\n id: z7.string(),\n approved: z7.literal(true),\n reason: z7.string().optional(),\n isAutomatic: z7.boolean().optional(),\n signature: z7.string().optional()\n }).optional()\n }),\n z7.object({\n type: z7.literal(\"dynamic-tool\"),\n toolName: z7.string(),\n toolCallId: z7.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z7.literal(\"output-denied\"),\n input: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n output: z7.never().optional(),\n errorText: z7.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z7.object({\n id: z7.string(),\n approved: z7.literal(false),\n reason: z7.string().optional(),\n isAutomatic: z7.boolean().optional(),\n signature: z7.string().optional()\n })\n }),\n z7.object({\n type: z7.string().startsWith(\"tool-\"),\n toolCallId: z7.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z7.literal(\"input-streaming\"),\n providerExecuted: z7.boolean().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n input: z7.unknown().optional(),\n output: z7.never().optional(),\n errorText: z7.never().optional(),\n approval: z7.never().optional()\n }),\n z7.object({\n type: z7.string().startsWith(\"tool-\"),\n toolCallId: z7.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z7.literal(\"input-available\"),\n providerExecuted: z7.boolean().optional(),\n input: z7.unknown(),\n output: z7.never().optional(),\n errorText: z7.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z7.never().optional()\n }),\n z7.object({\n type: z7.string().startsWith(\"tool-\"),\n toolCallId: z7.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z7.literal(\"approval-requested\"),\n input: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n output: z7.never().optional(),\n errorText: z7.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z7.object({\n id: z7.string(),\n approved: z7.never().optional(),\n reason: z7.never().optional(),\n isAutomatic: z7.boolean().optional(),\n signature: z7.string().optional()\n })\n }),\n z7.object({\n type: z7.string().startsWith(\"tool-\"),\n toolCallId: z7.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z7.literal(\"approval-responded\"),\n input: z7.unknown(),\n providerExecuted: z7.boolean().optional(),\n output: z7.never().optional(),\n errorText: z7.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z7.object({\n id: z7.string(),\n approved: z7.boolean(),\n reason: z7.string().optional(),\n isAutomatic: z7.boolean().optional(),\n signature: z7.string().optional()\n })\n }),\n z7.object({\n type: z7.string().startsWith(\"tool-\"),\n toolCallId: z7.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z7.literal(\"output-available\"),\n providerExecuted: z7.boolean().optional(),\n input: z7.unknown(),\n output: z7.unknown(),\n errorText: z7.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n preliminary: z7.boolean().optional(),\n approval: z7.object({\n id: z7.string(),\n approved: z7.literal(true),\n reason: z7.string().optional(),\n isAutomatic: z7.boolean().optional(),\n signature: z7.string().optional()\n }).optional()\n }),\n z7.object({\n type: z7.string().startsWith(\"tool-\"),\n toolCallId: z7.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z7.literal(\"output-error\"),\n providerExecuted: z7.boolean().optional(),\n input: z7.unknown().optional(),\n rawInput: z7.unknown().optional(),\n output: z7.never().optional(),\n errorText: z7.string(),\n callProviderMetadata: providerMetadataSchema.optional(),\n resultProviderMetadata: providerMetadataSchema.optional(),\n approval: z7.object({\n id: z7.string(),\n approved: z7.literal(true),\n reason: z7.string().optional(),\n isAutomatic: z7.boolean().optional(),\n signature: z7.string().optional()\n }).optional()\n }),\n z7.object({\n type: z7.string().startsWith(\"tool-\"),\n toolCallId: z7.string(),\n toolMetadata: toolMetadataSchema2.optional(),\n state: z7.literal(\"output-denied\"),\n providerExecuted: z7.boolean().optional(),\n input: z7.unknown(),\n output: z7.never().optional(),\n errorText: z7.never().optional(),\n callProviderMetadata: providerMetadataSchema.optional(),\n approval: z7.object({\n id: z7.string(),\n approved: z7.literal(false),\n reason: z7.string().optional(),\n isAutomatic: z7.boolean().optional(),\n signature: z7.string().optional()\n })\n })\n ])\n )\n }).superRefine((message, context) => {\n if (message.role !== \"assistant\" && message.parts.length === 0) {\n context.addIssue({\n origin: \"array\",\n code: \"too_small\",\n minimum: 1,\n inclusive: true,\n input: message.parts,\n path: [\"parts\"],\n message: \"Message must contain at least one part\"\n });\n }\n })\n ).nonempty(\"Messages array must not be empty\")\n )\n);\nasync function safeValidateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n}) {\n try {\n if (messages == null) {\n return {\n success: false,\n error: new InvalidArgumentError({\n parameter: \"messages\",\n value: messages,\n message: \"messages parameter must be provided\"\n })\n };\n }\n const validatedMessages = await validateTypes4({\n value: messages,\n schema: uiMessagesSchema\n });\n if (metadataSchema) {\n for (const [msgIdx, message] of validatedMessages.entries()) {\n await validateTypes4({\n value: message.metadata,\n schema: metadataSchema,\n context: {\n field: `messages[${msgIdx}].metadata`,\n entityId: message.id\n }\n });\n }\n }\n if (dataSchemas || tools) {\n for (const [msgIdx, message] of validatedMessages.entries()) {\n for (const [partIdx, part] of message.parts.entries()) {\n if (dataSchemas && part.type.startsWith(\"data-\")) {\n const dataPart = part;\n const dataName = dataPart.type.slice(5);\n const dataSchema = dataSchemas[dataName];\n if (!dataSchema) {\n return {\n success: false,\n error: new TypeValidationError3({\n value: dataPart.data,\n cause: `No data schema found for data part ${dataName}`,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].data`,\n entityName: dataName,\n entityId: dataPart.id\n }\n })\n };\n }\n await validateTypes4({\n value: dataPart.data,\n schema: dataSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].data`,\n entityName: dataName,\n entityId: dataPart.id\n }\n });\n }\n if (tools && part.type.startsWith(\"tool-\")) {\n const toolPart = part;\n const toolName = toolPart.type.slice(5);\n const tool2 = getOwn(tools, toolName);\n if (!tool2 && (toolPart.state === \"output-available\" || toolPart.state === \"output-error\" || toolPart.state === \"output-denied\")) {\n continue;\n }\n if (!tool2) {\n return {\n success: false,\n error: new TypeValidationError3({\n value: toolPart.input,\n cause: `No tool schema found for tool part ${toolName}`,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].input`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n })\n };\n }\n if (toolPart.state === \"input-available\" || toolPart.state === \"output-available\") {\n await validateTypes4({\n value: toolPart.input,\n schema: tool2.inputSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].input`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n });\n }\n if (toolPart.state === \"output-available\" && tool2.outputSchema) {\n await validateTypes4({\n value: toolPart.output,\n schema: tool2.outputSchema,\n context: {\n field: `messages[${msgIdx}].parts[${partIdx}].output`,\n entityName: toolName,\n entityId: toolPart.toolCallId\n }\n });\n }\n }\n }\n }\n }\n return {\n success: true,\n data: validatedMessages\n };\n } catch (error) {\n const err = error;\n return {\n success: false,\n error: err\n };\n }\n}\nasync function validateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n}) {\n const response = await safeValidateUIMessages({\n messages,\n metadataSchema,\n dataSchemas,\n tools\n });\n if (!response.success)\n throw response.error;\n return response.data;\n}\n\n// src/agent/create-agent-ui-stream.ts\nasync function createAgentUIStream({\n agent,\n uiMessages,\n options,\n abortSignal,\n timeout,\n experimental_sandbox: sandbox,\n experimental_transform,\n onStepEnd,\n onStepFinish,\n ...uiMessageStreamOptions\n}) {\n var _a22;\n const validatedMessages = await validateUIMessages({\n messages: uiMessages,\n // tools are compatible; the casting is required because the context param is\n // not available in ui messages\n tools: agent.tools\n });\n const modelMessages = await convertToModelMessages(validatedMessages, {\n tools: agent.tools\n });\n const result = await agent.stream({\n prompt: modelMessages,\n options,\n abortSignal,\n timeout,\n experimental_sandbox: sandbox,\n experimental_transform,\n onStepEnd: onStepEnd != null ? onStepEnd : onStepFinish\n });\n const originalMessages = (_a22 = uiMessageStreamOptions.originalMessages) != null ? _a22 : validatedMessages;\n return createAsyncIterableStream(\n toUIMessageStream({\n ...uiMessageStreamOptions,\n originalMessages,\n stream: result.stream,\n tools: agent.tools\n })\n );\n}\n\n// src/agent/create-agent-ui-stream-response.ts\nasync function createAgentUIStreamResponse({\n headers,\n status,\n statusText,\n consumeSseStream,\n ...options\n}) {\n return createUIMessageStreamResponse({\n headers,\n status,\n statusText,\n consumeSseStream,\n stream: await createAgentUIStream(options)\n });\n}\n\n// src/agent/pipe-agent-ui-stream-to-response.ts\nasync function pipeAgentUIStreamToResponse({\n response,\n headers,\n status,\n statusText,\n consumeSseStream,\n ...options\n}) {\n pipeUIMessageStreamToResponse({\n response,\n headers,\n status,\n statusText,\n consumeSseStream,\n stream: await createAgentUIStream(options)\n });\n}\n\n// src/embed/embed.ts\nimport {\n createIdGenerator as createIdGenerator4,\n withUserAgentSuffix as withUserAgentSuffix4\n} from \"@ai-sdk/provider-utils\";\nvar originalGenerateCallId4 = createIdGenerator4({\n prefix: \"call\",\n size: 24\n});\nasync function embed({\n model: modelArg,\n value,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n experimental_telemetry,\n telemetry = experimental_telemetry,\n onStart,\n experimental_onStart,\n onEnd,\n experimental_onEnd,\n _internal: { generateCallId = originalGenerateCallId4 } = {}\n}) {\n var _a22;\n const model = resolveEmbeddingModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const resolvedOnStart = onStart != null ? onStart : experimental_onStart;\n const resolvedOnEnd = onEnd != null ? onEnd : experimental_onEnd;\n const headersWithUserAgent = withUserAgentSuffix4(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const callId = generateCallId();\n const telemetryDispatcher = createTelemetryDispatcher({\n telemetry\n });\n const runInTracingChannelSpan = (_a22 = telemetryDispatcher.runInTracingChannelSpan) != null ? _a22 : async ({ execute }) => await execute();\n const startEvent = {\n callId,\n operationId: \"ai.embed\",\n provider: model.provider,\n modelId: model.modelId,\n value,\n maxRetries,\n headers: headersWithUserAgent,\n providerOptions\n };\n return await runInTracingChannelSpan({\n type: \"embed\",\n event: startEvent,\n execute: async () => {\n var _a23;\n await notify({\n event: startEvent,\n callbacks: [resolvedOnStart, telemetryDispatcher.onStart]\n });\n try {\n const { embedding, usage, warnings, response, providerMetadata } = await retry(async () => {\n var _a24, _b;\n const embedCallId = generateCallId();\n await notify({\n event: {\n callId,\n embedCallId,\n operationId: \"ai.embed.doEmbed\",\n provider: model.provider,\n modelId: model.modelId,\n values: [value]\n },\n callbacks: [telemetryDispatcher.onEmbedStart]\n });\n const modelResponse = await model.doEmbed({\n values: [value],\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const embedding2 = modelResponse.embeddings[0];\n const usage2 = (_a24 = modelResponse.usage) != null ? _a24 : { tokens: NaN };\n await notify({\n event: {\n callId,\n embedCallId,\n operationId: \"ai.embed.doEmbed\",\n provider: model.provider,\n modelId: model.modelId,\n values: [value],\n embeddings: modelResponse.embeddings,\n usage: usage2\n },\n callbacks: [telemetryDispatcher.onEmbedEnd]\n });\n return {\n embedding: embedding2,\n usage: usage2,\n warnings: (_b = modelResponse.warnings) != null ? _b : [],\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n });\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n await notify({\n event: {\n callId,\n operationId: \"ai.embed\",\n provider: model.provider,\n modelId: model.modelId,\n value,\n embedding,\n usage,\n warnings,\n providerMetadata,\n response\n },\n callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd]\n });\n return new DefaultEmbedResult({\n value,\n embedding,\n usage,\n warnings,\n providerMetadata,\n response\n });\n } catch (error) {\n await ((_a23 = telemetryDispatcher.onError) == null ? void 0 : _a23.call(telemetryDispatcher, { callId, error }));\n throw error;\n }\n }\n });\n}\nvar DefaultEmbedResult = class {\n constructor(options) {\n this.value = options.value;\n this.embedding = options.embedding;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.response = options.response;\n }\n};\n\n// src/embed/embed-many.ts\nimport {\n createIdGenerator as createIdGenerator5,\n withUserAgentSuffix as withUserAgentSuffix5\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/split-array.ts\nfunction splitArray(array2, chunkSize) {\n if (chunkSize <= 0) {\n throw new Error(\"chunkSize must be greater than 0\");\n }\n const result = [];\n for (let i = 0; i < array2.length; i += chunkSize) {\n result.push(array2.slice(i, i + chunkSize));\n }\n return result;\n}\n\n// src/embed/embed-many.ts\nvar originalGenerateCallId5 = createIdGenerator5({\n prefix: \"call\",\n size: 24\n});\nasync function embedMany({\n model: modelArg,\n values,\n maxParallelCalls = Infinity,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n providerOptions,\n experimental_telemetry,\n telemetry = experimental_telemetry,\n onStart,\n experimental_onStart,\n onEnd,\n experimental_onEnd,\n _internal: { generateCallId = originalGenerateCallId5 } = {}\n}) {\n var _a22;\n const model = resolveEmbeddingModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const resolvedOnStart = onStart != null ? onStart : experimental_onStart;\n const resolvedOnEnd = onEnd != null ? onEnd : experimental_onEnd;\n const headersWithUserAgent = withUserAgentSuffix5(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const callId = generateCallId();\n const telemetryDispatcher = createTelemetryDispatcher({\n telemetry\n });\n const runInTracingChannelSpan = (_a22 = telemetryDispatcher.runInTracingChannelSpan) != null ? _a22 : async ({ execute }) => await execute();\n const startEvent = {\n callId,\n operationId: \"ai.embedMany\",\n provider: model.provider,\n modelId: model.modelId,\n value: values,\n maxRetries,\n headers: headersWithUserAgent,\n providerOptions\n };\n return await runInTracingChannelSpan({\n type: \"embedMany\",\n event: startEvent,\n execute: async () => {\n var _a23, _b;\n await notify({\n event: startEvent,\n callbacks: [resolvedOnStart, telemetryDispatcher.onStart]\n });\n try {\n const [maxEmbeddingsPerCall, supportsParallelCalls] = await Promise.all(\n [model.maxEmbeddingsPerCall, model.supportsParallelCalls]\n );\n if (maxEmbeddingsPerCall == null || maxEmbeddingsPerCall === Infinity) {\n const { embeddings: embeddings2, usage, warnings: warnings2, response, providerMetadata: providerMetadata2 } = await retry(async () => {\n var _a24, _b2;\n const embedCallId = generateCallId();\n await notify({\n event: {\n callId,\n embedCallId,\n operationId: \"ai.embedMany.doEmbed\",\n provider: model.provider,\n modelId: model.modelId,\n values\n },\n callbacks: [telemetryDispatcher.onEmbedStart]\n });\n const modelResponse = await model.doEmbed({\n values,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const embeddings3 = modelResponse.embeddings;\n const usage2 = (_a24 = modelResponse.usage) != null ? _a24 : { tokens: NaN };\n await notify({\n event: {\n callId,\n embedCallId,\n operationId: \"ai.embedMany.doEmbed\",\n provider: model.provider,\n modelId: model.modelId,\n values,\n embeddings: embeddings3,\n usage: usage2\n },\n callbacks: [telemetryDispatcher.onEmbedEnd]\n });\n return {\n embeddings: embeddings3,\n usage: usage2,\n warnings: (_b2 = modelResponse.warnings) != null ? _b2 : [],\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n });\n logWarnings({\n warnings: warnings2,\n provider: model.provider,\n model: model.modelId\n });\n await notify({\n event: {\n callId,\n operationId: \"ai.embedMany\",\n provider: model.provider,\n modelId: model.modelId,\n value: values,\n embedding: embeddings2,\n usage,\n warnings: warnings2,\n providerMetadata: providerMetadata2,\n response: [response]\n },\n callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd]\n });\n return new DefaultEmbedManyResult({\n values,\n embeddings: embeddings2,\n usage,\n warnings: warnings2,\n providerMetadata: providerMetadata2,\n responses: [response]\n });\n }\n const valueChunks = splitArray(values, maxEmbeddingsPerCall);\n const embeddings = [];\n const warnings = [];\n const responses = [];\n let tokens = 0;\n let providerMetadata;\n const parallelChunks = splitArray(\n valueChunks,\n supportsParallelCalls ? maxParallelCalls : 1\n );\n for (const parallelChunk of parallelChunks) {\n const results = await Promise.all(\n parallelChunk.map((chunk) => {\n return retry(async () => {\n var _a24, _b2;\n const embedCallId = generateCallId();\n await notify({\n event: {\n callId,\n embedCallId,\n operationId: \"ai.embedMany.doEmbed\",\n provider: model.provider,\n modelId: model.modelId,\n values: chunk\n },\n callbacks: [telemetryDispatcher.onEmbedStart]\n });\n const modelResponse = await model.doEmbed({\n values: chunk,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n });\n const chunkEmbeddings = modelResponse.embeddings;\n const usage = (_a24 = modelResponse.usage) != null ? _a24 : { tokens: NaN };\n await notify({\n event: {\n callId,\n embedCallId,\n operationId: \"ai.embedMany.doEmbed\",\n provider: model.provider,\n modelId: model.modelId,\n values: chunk,\n embeddings: chunkEmbeddings,\n usage\n },\n callbacks: [telemetryDispatcher.onEmbedEnd]\n });\n return {\n embeddings: chunkEmbeddings,\n usage,\n warnings: (_b2 = modelResponse.warnings) != null ? _b2 : [],\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response\n };\n });\n })\n );\n for (const result of results) {\n embeddings.push(...result.embeddings);\n warnings.push(...result.warnings);\n responses.push(result.response);\n tokens += result.usage.tokens;\n if (result.providerMetadata) {\n if (!providerMetadata) {\n providerMetadata = { ...result.providerMetadata };\n } else {\n for (const [providerName, metadata] of Object.entries(\n result.providerMetadata\n )) {\n providerMetadata[providerName] = {\n ...(_a23 = providerMetadata[providerName]) != null ? _a23 : {},\n ...metadata\n };\n }\n }\n }\n }\n }\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n await notify({\n event: {\n callId,\n operationId: \"ai.embedMany\",\n provider: model.provider,\n modelId: model.modelId,\n value: values,\n embedding: embeddings,\n usage: { tokens },\n warnings,\n providerMetadata,\n response: responses\n },\n callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd]\n });\n return new DefaultEmbedManyResult({\n values,\n embeddings,\n usage: { tokens },\n warnings,\n providerMetadata,\n responses\n });\n } catch (error) {\n await ((_b = telemetryDispatcher.onError) == null ? void 0 : _b.call(telemetryDispatcher, { callId, error }));\n throw error;\n }\n }\n });\n}\nvar DefaultEmbedManyResult = class {\n constructor(options) {\n this.values = options.values;\n this.embeddings = options.embeddings;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.responses = options.responses;\n }\n};\n\n// src/generate-image/generate-image.ts\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array4,\n detectMediaType as detectMediaType2,\n withUserAgentSuffix as withUserAgentSuffix6\n} from \"@ai-sdk/provider-utils\";\n\n// src/prompt/data-content.ts\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array3,\n convertUint8ArrayToBase64 as convertUint8ArrayToBase643\n} from \"@ai-sdk/provider-utils\";\nfunction convertDataContentToBase64String(content) {\n if (typeof content === \"string\") {\n return content;\n }\n if (content instanceof ArrayBuffer) {\n return convertUint8ArrayToBase643(new Uint8Array(content));\n }\n return convertUint8ArrayToBase643(content);\n}\nfunction convertDataContentToUint8Array(content) {\n if (content instanceof Uint8Array) {\n return content;\n }\n if (typeof content === \"string\") {\n try {\n return convertBase64ToUint8Array3(content);\n } catch (error) {\n throw new InvalidDataContentError({\n message: \"Invalid data content. Content string is not a base64-encoded media.\",\n content,\n cause: error\n });\n }\n }\n if (content instanceof ArrayBuffer) {\n return new Uint8Array(content);\n }\n throw new InvalidDataContentError({ content });\n}\n\n// src/generate-image/generate-image.ts\nasync function generateImage({\n model: modelArg,\n prompt: promptArg,\n n = 1,\n maxImagesPerCall,\n size,\n aspectRatio,\n seed,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers\n}) {\n var _a22, _b;\n const model = resolveImageModel(modelArg);\n const headersWithUserAgent = withUserAgentSuffix6(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const maxImagesPerCallWithDefault = (_a22 = maxImagesPerCall != null ? maxImagesPerCall : await invokeModelMaxImagesPerCall(model)) != null ? _a22 : 1;\n const callCount = Math.ceil(n / maxImagesPerCallWithDefault);\n const callImageCounts = Array.from({ length: callCount }, (_, i) => {\n if (i < callCount - 1) {\n return maxImagesPerCallWithDefault;\n }\n const remainder = n % maxImagesPerCallWithDefault;\n return remainder === 0 ? maxImagesPerCallWithDefault : remainder;\n });\n const results = await Promise.all(\n callImageCounts.map(\n async (callImageCount) => await retry(() => {\n const { prompt, files, mask } = normalizePrompt(promptArg);\n return model.doGenerate({\n prompt,\n files,\n mask,\n n: callImageCount,\n abortSignal,\n headers: headersWithUserAgent,\n size,\n aspectRatio,\n seed,\n providerOptions: providerOptions != null ? providerOptions : {}\n });\n })\n )\n );\n const images = [];\n const warnings = [];\n const responses = [];\n const providerMetadata = {};\n let totalUsage = {\n inputTokens: void 0,\n outputTokens: void 0,\n totalTokens: void 0\n };\n for (const result of results) {\n images.push(\n ...result.images.map(\n (image) => {\n var _a23;\n return new DefaultGeneratedFile({\n data: image,\n mediaType: (_a23 = detectMediaType2({\n data: image,\n topLevelType: \"image\"\n })) != null ? _a23 : \"image/png\"\n });\n }\n )\n );\n warnings.push(...result.warnings);\n if (result.usage != null) {\n totalUsage = addImageModelUsage(totalUsage, result.usage);\n }\n if (result.providerMetadata) {\n for (const [providerName, metadata] of Object.entries(result.providerMetadata)) {\n if (providerName === \"gateway\") {\n const currentEntry = providerMetadata[providerName];\n if (currentEntry != null && typeof currentEntry === \"object\") {\n providerMetadata[providerName] = {\n ...currentEntry,\n ...metadata\n };\n } else {\n providerMetadata[providerName] = metadata;\n }\n const imagesValue = providerMetadata[providerName].images;\n if (Array.isArray(imagesValue) && imagesValue.length === 0) {\n delete providerMetadata[providerName].images;\n }\n } else {\n (_b = providerMetadata[providerName]) != null ? _b : providerMetadata[providerName] = { images: [] };\n providerMetadata[providerName].images.push(\n ...result.providerMetadata[providerName].images\n );\n }\n }\n }\n responses.push(result.response);\n }\n logWarnings({ warnings, provider: model.provider, model: model.modelId });\n if (!images.length) {\n throw new NoImageGeneratedError({ responses });\n }\n return new DefaultGenerateImageResult({\n images,\n warnings,\n responses,\n providerMetadata,\n usage: totalUsage\n });\n}\nvar DefaultGenerateImageResult = class {\n constructor(options) {\n this.images = options.images;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = options.providerMetadata;\n this.usage = options.usage;\n }\n get image() {\n return this.images[0];\n }\n};\nasync function invokeModelMaxImagesPerCall(model) {\n const isFunction = model.maxImagesPerCall instanceof Function;\n if (!isFunction) {\n return model.maxImagesPerCall;\n }\n return model.maxImagesPerCall({\n modelId: model.modelId\n });\n}\nfunction normalizePrompt(prompt) {\n if (typeof prompt === \"string\") {\n return { prompt, files: void 0, mask: void 0 };\n }\n return {\n prompt: prompt.text,\n files: prompt.images.map(toImageModelV4File),\n mask: prompt.mask ? toImageModelV4File(prompt.mask) : void 0\n };\n}\nfunction toImageModelV4File(dataContent) {\n if (typeof dataContent === \"string\" && dataContent.startsWith(\"http\")) {\n return {\n type: \"url\",\n url: dataContent\n };\n }\n if (typeof dataContent === \"string\" && dataContent.startsWith(\"data:\")) {\n const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(dataContent);\n if (base64Content != null) {\n const uint8Data2 = convertBase64ToUint8Array4(base64Content);\n return {\n type: \"file\",\n data: uint8Data2,\n mediaType: dataUrlMediaType || detectMediaType2({\n data: uint8Data2,\n topLevelType: \"image\"\n }) || \"image/png\"\n };\n }\n }\n const uint8Data = convertDataContentToUint8Array(dataContent);\n return {\n type: \"file\",\n data: uint8Data,\n mediaType: detectMediaType2({\n data: uint8Data,\n topLevelType: \"image\"\n }) || \"image/png\"\n };\n}\n\n// src/generate-object/generate-object.ts\nimport {\n createIdGenerator as createIdGenerator6,\n withUserAgentSuffix as withUserAgentSuffix7\n} from \"@ai-sdk/provider-utils\";\n\n// src/generate-text/extract-reasoning-content.ts\nfunction extractReasoningContent(content) {\n const parts = content.filter(\n (content2) => content2.type === \"reasoning\"\n );\n return parts.length === 0 ? void 0 : parts.map((content2) => content2.text).join(\"\\n\");\n}\n\n// src/generate-text/extract-text-content.ts\nfunction extractTextContent(content) {\n const parts = content.filter(\n (content2) => content2.type === \"text\"\n );\n if (parts.length === 0) {\n return void 0;\n }\n return parts.map((content2) => content2.text).join(\"\");\n}\n\n// src/generate-object/output-strategy.ts\nimport {\n isJSONArray,\n isJSONObject,\n TypeValidationError as TypeValidationError4,\n UnsupportedFunctionalityError as UnsupportedFunctionalityError3\n} from \"@ai-sdk/provider\";\nimport {\n asSchema as asSchema5,\n safeValidateTypes as safeValidateTypes5\n} from \"@ai-sdk/provider-utils\";\nvar noSchemaOutputStrategy = {\n type: \"no-schema\",\n jsonSchema: async () => void 0,\n async validatePartialResult({ value, textDelta }) {\n return { success: true, value: { partial: value, textDelta } };\n },\n async validateFinalResult(value, context) {\n return value === void 0 ? {\n success: false,\n error: new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n text: context.text,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason\n })\n } : { success: true, value };\n },\n createElementStream() {\n throw new UnsupportedFunctionalityError3({\n functionality: \"element streams in no-schema mode\"\n });\n }\n};\nvar objectOutputStrategy = (schema) => ({\n type: \"object\",\n jsonSchema: async () => await schema.jsonSchema,\n async validatePartialResult({ value, textDelta }) {\n return {\n success: true,\n value: {\n // Note: currently no validation of partial results:\n partial: value,\n textDelta\n }\n };\n },\n async validateFinalResult(value) {\n return safeValidateTypes5({ value, schema });\n },\n createElementStream() {\n throw new UnsupportedFunctionalityError3({\n functionality: \"element streams in object mode\"\n });\n }\n});\nvar arrayOutputStrategy = (schema) => {\n return {\n type: \"array\",\n // wrap in object that contains array of elements, since most LLMs will not\n // be able to generate an array directly:\n // possible future optimization: use arrays directly when model supports grammar-guided generation\n jsonSchema: async () => {\n const { $schema: _$schema, ...itemSchema } = await schema.jsonSchema;\n return {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n elements: { type: \"array\", items: itemSchema }\n },\n required: [\"elements\"],\n additionalProperties: false\n };\n },\n async validatePartialResult({\n value,\n latestObject,\n isFirstDelta,\n isFinalDelta\n }) {\n var _a22;\n if (!isJSONObject(value) || !isJSONArray(value.elements)) {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be an object that contains an array of elements\"\n })\n };\n }\n const inputArray = value.elements;\n const resultArray = [];\n for (let i = 0; i < inputArray.length; i++) {\n const element = inputArray[i];\n const result = await safeValidateTypes5({ value: element, schema });\n if (i === inputArray.length - 1 && !isFinalDelta) {\n continue;\n }\n if (!result.success) {\n return result;\n }\n resultArray.push(result.value);\n }\n const publishedElementCount = (_a22 = latestObject == null ? void 0 : latestObject.length) != null ? _a22 : 0;\n let textDelta = \"\";\n if (isFirstDelta) {\n textDelta += \"[\";\n }\n if (publishedElementCount > 0) {\n textDelta += \",\";\n }\n textDelta += resultArray.slice(publishedElementCount).map((element) => JSON.stringify(element)).join(\",\");\n if (isFinalDelta) {\n textDelta += \"]\";\n }\n return {\n success: true,\n value: {\n partial: resultArray,\n textDelta\n }\n };\n },\n async validateFinalResult(value) {\n if (!isJSONObject(value) || !isJSONArray(value.elements)) {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be an object that contains an array of elements\"\n })\n };\n }\n const inputArray = value.elements;\n const resultArray = [];\n for (const element of inputArray) {\n const result = await safeValidateTypes5({ value: element, schema });\n if (!result.success) {\n return result;\n }\n resultArray.push(result.value);\n }\n return { success: true, value: resultArray };\n },\n createElementStream(originalStream) {\n let publishedElements = 0;\n return createAsyncIterableStream(\n originalStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"object\": {\n const array2 = chunk.object;\n for (; publishedElements < array2.length; publishedElements++) {\n controller.enqueue(array2[publishedElements]);\n }\n break;\n }\n case \"text-delta\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(\n `Unsupported chunk type: ${_exhaustiveCheck}`\n );\n }\n }\n }\n })\n )\n );\n }\n };\n};\nvar enumOutputStrategy = (enumValues) => {\n return {\n type: \"enum\",\n // wrap in object that contains result, since most LLMs will not\n // be able to generate an enum value directly:\n // possible future optimization: use enums directly when model supports top-level enums\n jsonSchema: async () => ({\n $schema: \"http://json-schema.org/draft-07/schema#\",\n type: \"object\",\n properties: {\n result: { type: \"string\", enum: enumValues }\n },\n required: [\"result\"],\n additionalProperties: false\n }),\n async validateFinalResult(value) {\n if (!isJSONObject(value) || typeof value.result !== \"string\") {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: 'value must be an object that contains a string in the \"result\" property.'\n })\n };\n }\n const result = value.result;\n return enumValues.includes(result) ? { success: true, value: result } : {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be a string in the enum\"\n })\n };\n },\n async validatePartialResult({ value, textDelta }) {\n if (!isJSONObject(value) || typeof value.result !== \"string\") {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: 'value must be an object that contains a string in the \"result\" property.'\n })\n };\n }\n const result = value.result;\n const possibleEnumValues = enumValues.filter(\n (enumValue) => enumValue.startsWith(result)\n );\n if (value.result.length === 0 || possibleEnumValues.length === 0) {\n return {\n success: false,\n error: new TypeValidationError4({\n value,\n cause: \"value must be a string in the enum\"\n })\n };\n }\n return {\n success: true,\n value: {\n partial: possibleEnumValues.length > 1 ? result : possibleEnumValues[0],\n textDelta\n }\n };\n },\n createElementStream() {\n throw new UnsupportedFunctionalityError3({\n functionality: \"element streams in enum mode\"\n });\n }\n };\n};\nfunction getOutputStrategy({\n output,\n schema,\n enumValues\n}) {\n switch (output) {\n case \"object\":\n return objectOutputStrategy(asSchema5(schema));\n case \"array\":\n return arrayOutputStrategy(asSchema5(schema));\n case \"enum\":\n return enumOutputStrategy(enumValues);\n case \"no-schema\":\n return noSchemaOutputStrategy;\n default: {\n const _exhaustiveCheck = output;\n throw new Error(`Unsupported output: ${_exhaustiveCheck}`);\n }\n }\n}\n\n// src/generate-object/parse-and-validate-object-result.ts\nimport { JSONParseError as JSONParseError2, TypeValidationError as TypeValidationError5 } from \"@ai-sdk/provider\";\nimport { safeParseJSON as safeParseJSON4 } from \"@ai-sdk/provider-utils\";\nasync function parseAndValidateObjectResult(result, outputStrategy, context) {\n const parseResult = await safeParseJSON4({ text: result });\n if (!parseResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: could not parse the response.\",\n cause: parseResult.error,\n text: result,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason\n });\n }\n const validationResult = await outputStrategy.validateFinalResult(\n parseResult.value,\n {\n text: result,\n response: context.response,\n usage: context.usage\n }\n );\n if (!validationResult.success) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: response did not match schema.\",\n cause: validationResult.error,\n text: result,\n response: context.response,\n usage: context.usage,\n finishReason: context.finishReason\n });\n }\n return validationResult.value;\n}\nasync function parseAndValidateObjectResultWithRepair(result, outputStrategy, repairText, context) {\n try {\n return await parseAndValidateObjectResult(result, outputStrategy, context);\n } catch (error) {\n if (repairText != null && NoObjectGeneratedError.isInstance(error) && (JSONParseError2.isInstance(error.cause) || TypeValidationError5.isInstance(error.cause))) {\n const repairedText = await repairText({\n text: result,\n error: error.cause\n });\n if (repairedText === null) {\n throw error;\n }\n return await parseAndValidateObjectResult(\n repairedText,\n outputStrategy,\n context\n );\n }\n throw error;\n }\n}\n\n// src/generate-object/validate-object-generation-input.ts\nfunction validateObjectGenerationInput({\n output,\n schema,\n schemaName,\n schemaDescription,\n enumValues\n}) {\n if (output != null && output !== \"object\" && output !== \"array\" && output !== \"enum\" && output !== \"no-schema\") {\n throw new InvalidArgumentError({\n parameter: \"output\",\n value: output,\n message: \"Invalid output type.\"\n });\n }\n if (output === \"no-schema\") {\n if (schema != null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is not supported for no-schema output.\"\n });\n }\n if (schemaDescription != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaDescription\",\n value: schemaDescription,\n message: \"Schema description is not supported for no-schema output.\"\n });\n }\n if (schemaName != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaName\",\n value: schemaName,\n message: \"Schema name is not supported for no-schema output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for no-schema output.\"\n });\n }\n }\n if (output === \"object\") {\n if (schema == null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is required for object output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for object output.\"\n });\n }\n }\n if (output === \"array\") {\n if (schema == null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Element schema is required for array output.\"\n });\n }\n if (enumValues != null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are not supported for array output.\"\n });\n }\n }\n if (output === \"enum\") {\n if (schema != null) {\n throw new InvalidArgumentError({\n parameter: \"schema\",\n value: schema,\n message: \"Schema is not supported for enum output.\"\n });\n }\n if (schemaDescription != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaDescription\",\n value: schemaDescription,\n message: \"Schema description is not supported for enum output.\"\n });\n }\n if (schemaName != null) {\n throw new InvalidArgumentError({\n parameter: \"schemaName\",\n value: schemaName,\n message: \"Schema name is not supported for enum output.\"\n });\n }\n if (enumValues == null) {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value: enumValues,\n message: \"Enum values are required for enum output.\"\n });\n }\n for (const value of enumValues) {\n if (typeof value !== \"string\") {\n throw new InvalidArgumentError({\n parameter: \"enumValues\",\n value,\n message: \"Enum values must be strings.\"\n });\n }\n }\n }\n}\n\n// src/generate-object/generate-object.ts\nvar originalGenerateId4 = createIdGenerator6({ prefix: \"aiobj\", size: 24 });\nasync function generateObject(options) {\n var _a22, _b, _c, _d, _e, _f, _g, _h, _i, _j;\n const {\n model: modelArg,\n output = \"object\",\n instructions,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n experimental_repairText: repairText,\n experimental_telemetry,\n telemetry = experimental_telemetry,\n experimental_download: download2,\n providerOptions,\n onStart,\n experimental_onStart,\n onStepStart,\n experimental_onStepStart,\n onStepEnd,\n onStepFinish,\n onFinish,\n _internal: {\n generateId: generateId2 = originalGenerateId4,\n currentDate = () => /* @__PURE__ */ new Date()\n } = {},\n ...settings\n } = options;\n const model = resolveLanguageModel(modelArg);\n const enumValues = \"enum\" in options ? options.enum : void 0;\n const {\n schema: inputSchema,\n schemaDescription,\n schemaName\n } = \"schema\" in options ? options : {};\n validateObjectGenerationInput({\n output,\n schema: inputSchema,\n schemaName,\n schemaDescription,\n enumValues\n });\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const outputStrategy = getOutputStrategy({\n output,\n schema: inputSchema,\n enumValues\n });\n const callSettings = prepareLanguageModelCallOptions(settings);\n const headersWithUserAgent = withUserAgentSuffix7(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const telemetryDispatcher = createTelemetryDispatcher({\n telemetry\n });\n const resolvedOnStart = onStart != null ? onStart : experimental_onStart;\n const resolvedOnStepStart = onStepStart != null ? onStepStart : experimental_onStepStart;\n const resolvedOnStepEnd = onStepEnd != null ? onStepEnd : onStepFinish;\n const jsonSchema2 = await outputStrategy.jsonSchema();\n const callId = generateId2();\n await notify({\n event: {\n callId,\n operationId: \"ai.generateObject\",\n provider: model.provider,\n modelId: model.modelId,\n system: instructions != null ? instructions : system,\n prompt,\n messages,\n maxOutputTokens: callSettings.maxOutputTokens,\n temperature: callSettings.temperature,\n topP: callSettings.topP,\n topK: callSettings.topK,\n presencePenalty: callSettings.presencePenalty,\n frequencyPenalty: callSettings.frequencyPenalty,\n seed: callSettings.seed,\n maxRetries,\n headers: headersWithUserAgent,\n providerOptions,\n output: outputStrategy.type,\n schema: jsonSchema2,\n schemaName,\n schemaDescription\n },\n callbacks: [resolvedOnStart, telemetryDispatcher.onStart]\n });\n try {\n const standardizedPrompt = await standardizePrompt({\n instructions,\n system,\n prompt,\n messages,\n allowSystemInMessages\n });\n const promptMessages = await convertToLanguageModelPrompt({\n prompt: standardizedPrompt,\n supportedUrls: await model.supportedUrls,\n download: download2,\n provider: model.provider.split(\".\")[0]\n });\n await notify({\n event: {\n callId,\n stepNumber: 0,\n provider: model.provider,\n modelId: model.modelId,\n providerOptions,\n headers: headersWithUserAgent,\n promptMessages\n },\n callbacks: [resolvedOnStepStart, telemetryDispatcher.onObjectStepStart]\n });\n const generateResult = await retry(\n () => model.doGenerate({\n responseFormat: {\n type: \"json\",\n schema: jsonSchema2,\n name: schemaName,\n description: schemaDescription\n },\n ...prepareLanguageModelCallOptions(settings),\n prompt: promptMessages,\n providerOptions,\n abortSignal,\n headers: headersWithUserAgent\n })\n );\n const responseData = {\n id: (_b = (_a22 = generateResult.response) == null ? void 0 : _a22.id) != null ? _b : generateId2(),\n timestamp: (_d = (_c = generateResult.response) == null ? void 0 : _c.timestamp) != null ? _d : currentDate(),\n modelId: (_f = (_e = generateResult.response) == null ? void 0 : _e.modelId) != null ? _f : model.modelId,\n headers: (_g = generateResult.response) == null ? void 0 : _g.headers,\n body: (_h = generateResult.response) == null ? void 0 : _h.body\n };\n const text2 = extractTextContent(generateResult.content);\n const reasoning = extractReasoningContent(generateResult.content);\n if (text2 === void 0) {\n throw new NoObjectGeneratedError({\n message: \"No object generated: the model did not return a response.\",\n response: responseData,\n usage: asLanguageModelUsage(generateResult.usage),\n finishReason: generateResult.finishReason.unified\n });\n }\n const finishReason = generateResult.finishReason.unified;\n const usage = asLanguageModelUsage(generateResult.usage);\n const warnings = generateResult.warnings;\n const resultProviderMetadata = generateResult.providerMetadata;\n const request = (_i = generateResult.request) != null ? _i : {};\n const response = responseData;\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n const stepFinishEvent = {\n callId,\n stepNumber: 0,\n provider: model.provider,\n modelId: model.modelId,\n finishReason,\n usage,\n objectText: text2,\n msToFirstChunk: void 0,\n reasoning,\n warnings,\n request,\n response,\n providerMetadata: resultProviderMetadata\n };\n await notify({\n event: stepFinishEvent,\n callbacks: [resolvedOnStepEnd, telemetryDispatcher.onObjectStepEnd]\n });\n const object2 = await parseAndValidateObjectResultWithRepair(\n text2,\n outputStrategy,\n repairText,\n {\n response,\n usage,\n finishReason\n }\n );\n await notify({\n event: {\n callId,\n object: object2,\n error: void 0,\n reasoning,\n finishReason,\n usage,\n warnings,\n request,\n response,\n providerMetadata: resultProviderMetadata\n },\n callbacks: [onFinish, telemetryDispatcher.onEnd]\n });\n return new DefaultGenerateObjectResult({\n object: object2,\n reasoning,\n finishReason,\n usage,\n warnings,\n request,\n response,\n providerMetadata: resultProviderMetadata\n });\n } catch (error) {\n await ((_j = telemetryDispatcher.onError) == null ? void 0 : _j.call(telemetryDispatcher, { callId, error }));\n throw wrapGatewayError(error);\n }\n}\nvar DefaultGenerateObjectResult = class {\n constructor(options) {\n this.object = options.object;\n this.finishReason = options.finishReason;\n this.usage = options.usage;\n this.warnings = options.warnings;\n this.providerMetadata = options.providerMetadata;\n this.response = options.response;\n this.request = options.request;\n this.reasoning = options.reasoning;\n }\n toJsonResponse(init) {\n var _a22;\n return new Response(JSON.stringify(this.object), {\n status: (_a22 = init == null ? void 0 : init.status) != null ? _a22 : 200,\n headers: prepareHeaders(init == null ? void 0 : init.headers, {\n \"content-type\": \"application/json; charset=utf-8\"\n })\n });\n }\n};\n\n// src/generate-object/stream-object.ts\nimport {\n createIdGenerator as createIdGenerator7,\n DelayedPromise as DelayedPromise2\n} from \"@ai-sdk/provider-utils\";\n\n// src/util/cosine-similarity.ts\nfunction cosineSimilarity(vector1, vector2) {\n if (vector1.length !== vector2.length) {\n throw new InvalidArgumentError({\n parameter: \"vector1,vector2\",\n value: { vector1Length: vector1.length, vector2Length: vector2.length },\n message: `Vectors must have the same length`\n });\n }\n const n = vector1.length;\n if (n === 0) {\n return 0;\n }\n let magnitudeSquared1 = 0;\n let magnitudeSquared2 = 0;\n let dotProduct = 0;\n for (let i = 0; i < n; i++) {\n const value1 = vector1[i];\n const value2 = vector2[i];\n magnitudeSquared1 += value1 * value1;\n magnitudeSquared2 += value2 * value2;\n dotProduct += value1 * value2;\n }\n return magnitudeSquared1 === 0 || magnitudeSquared2 === 0 ? 0 : dotProduct / (Math.sqrt(magnitudeSquared1) * Math.sqrt(magnitudeSquared2));\n}\n\n// src/util/download/create-download.ts\nfunction createDownload(options) {\n return ({ url, abortSignal }) => download({ url, maxBytes: options == null ? void 0 : options.maxBytes, abortSignal });\n}\n\n// src/util/data-url.ts\nfunction getTextFromDataUrl(dataUrl) {\n const [header, base64Content] = dataUrl.split(\",\");\n const mediaType = header.split(\";\")[0].split(\":\")[1];\n if (mediaType == null || base64Content == null) {\n throw new Error(\"Invalid data URL format\");\n }\n try {\n return window.atob(base64Content);\n } catch (e) {\n throw new Error(`Error decoding data URL`);\n }\n}\n\n// src/util/is-deep-equal-data.ts\nfunction isDeepEqualData(obj1, obj2) {\n if (obj1 === obj2)\n return true;\n if (obj1 == null || obj2 == null)\n return false;\n if (typeof obj1 !== \"object\" && typeof obj2 !== \"object\")\n return obj1 === obj2;\n if (obj1.constructor !== obj2.constructor)\n return false;\n if (obj1 instanceof Date && obj2 instanceof Date) {\n return obj1.getTime() === obj2.getTime();\n }\n if (Array.isArray(obj1)) {\n if (obj1.length !== obj2.length)\n return false;\n for (let i = 0; i < obj1.length; i++) {\n if (!isDeepEqualData(obj1[i], obj2[i]))\n return false;\n }\n return true;\n }\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length)\n return false;\n for (const key of keys1) {\n if (!keys2.includes(key))\n return false;\n if (!isDeepEqualData(obj1[key], obj2[key]))\n return false;\n }\n return true;\n}\n\n// src/util/serial-job-executor.ts\nvar SerialJobExecutor = class {\n constructor() {\n this.queue = [];\n this.isProcessing = false;\n }\n async processQueue() {\n if (this.isProcessing) {\n return;\n }\n this.isProcessing = true;\n while (this.queue.length > 0) {\n await this.queue[0]();\n this.queue.shift();\n }\n this.isProcessing = false;\n }\n async run(job) {\n return new Promise((resolve3, reject) => {\n this.queue.push(async () => {\n try {\n await job();\n resolve3();\n } catch (error) {\n reject(error);\n }\n });\n void this.processQueue();\n });\n }\n};\n\n// src/util/simulate-readable-stream.ts\nimport { delay as delayFunction } from \"@ai-sdk/provider-utils\";\nfunction simulateReadableStream({\n chunks,\n initialDelayInMs = 0,\n chunkDelayInMs = 0,\n _internal\n}) {\n var _a22;\n const delay = (_a22 = _internal == null ? void 0 : _internal.delay) != null ? _a22 : delayFunction;\n let index = 0;\n return new ReadableStream({\n async pull(controller) {\n if (index < chunks.length) {\n await delay(index === 0 ? initialDelayInMs : chunkDelayInMs);\n controller.enqueue(chunks[index++]);\n } else {\n controller.close();\n }\n }\n });\n}\n\n// src/generate-object/stream-object.ts\nvar originalGenerateId5 = createIdGenerator7({ prefix: \"aiobj\", size: 24 });\nfunction streamObject(options) {\n const {\n model,\n output = \"object\",\n instructions,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n maxRetries,\n abortSignal,\n headers,\n experimental_repairText: repairText,\n experimental_telemetry,\n telemetry = experimental_telemetry,\n experimental_download: download2,\n providerOptions,\n onStart,\n experimental_onStart,\n onStepStart,\n experimental_onStepStart,\n onStepEnd,\n onStepFinish,\n onError = ({ error }) => {\n console.error(error);\n },\n onFinish,\n _internal: {\n generateId: generateId2 = originalGenerateId5,\n currentDate = () => /* @__PURE__ */ new Date(),\n now: now2 = now\n } = {},\n ...settings\n } = options;\n const enumValues = \"enum\" in options && options.enum ? options.enum : void 0;\n const {\n schema: inputSchema,\n schemaDescription,\n schemaName\n } = \"schema\" in options ? options : {};\n validateObjectGenerationInput({\n output,\n schema: inputSchema,\n schemaName,\n schemaDescription,\n enumValues\n });\n const outputStrategy = getOutputStrategy({\n output,\n schema: inputSchema,\n enumValues\n });\n return new DefaultStreamObjectResult({\n model,\n telemetry,\n headers,\n settings,\n maxRetries,\n abortSignal,\n outputStrategy,\n instructions,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n schemaName,\n schemaDescription,\n providerOptions,\n repairText,\n onStart: onStart != null ? onStart : experimental_onStart,\n onStepStart: onStepStart != null ? onStepStart : experimental_onStepStart,\n onStepFinish: onStepEnd != null ? onStepEnd : onStepFinish,\n onError,\n onFinish,\n download: download2,\n generateId: generateId2,\n currentDate,\n now: now2\n });\n}\nvar DefaultStreamObjectResult = class {\n constructor({\n model: modelArg,\n headers,\n telemetry,\n settings,\n maxRetries: maxRetriesArg,\n abortSignal,\n outputStrategy,\n instructions,\n system,\n prompt,\n messages,\n allowSystemInMessages,\n schemaName,\n schemaDescription,\n providerOptions,\n repairText,\n onStart,\n onStepStart,\n onStepFinish,\n onError,\n onFinish,\n download: download2,\n generateId: generateId2,\n currentDate,\n now: now2\n }) {\n this._object = new DelayedPromise2();\n this._usage = new DelayedPromise2();\n this._providerMetadata = new DelayedPromise2();\n this._warnings = new DelayedPromise2();\n this._request = new DelayedPromise2();\n this._response = new DelayedPromise2();\n this._finishReason = new DelayedPromise2();\n const model = resolveLanguageModel(modelArg);\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const callSettings = prepareLanguageModelCallOptions(settings);\n const telemetryDispatcher = createTelemetryDispatcher({\n telemetry\n });\n const self = this;\n const stitchableStream = createStitchableStream();\n const eventProcessor = new TransformStream({\n transform(chunk, controller) {\n controller.enqueue(chunk);\n if (chunk.type === \"error\") {\n onError({ error: wrapGatewayError(chunk.error) });\n }\n }\n });\n this.baseStream = stitchableStream.stream.pipeThrough(eventProcessor);\n const callId = generateId2();\n (async () => {\n const jsonSchema2 = await outputStrategy.jsonSchema();\n await notify({\n event: {\n callId,\n operationId: \"ai.streamObject\",\n provider: model.provider,\n modelId: model.modelId,\n system: instructions != null ? instructions : system,\n prompt,\n messages,\n maxOutputTokens: callSettings.maxOutputTokens,\n temperature: callSettings.temperature,\n topP: callSettings.topP,\n topK: callSettings.topK,\n presencePenalty: callSettings.presencePenalty,\n frequencyPenalty: callSettings.frequencyPenalty,\n seed: callSettings.seed,\n maxRetries,\n headers,\n providerOptions,\n output: outputStrategy.type,\n schema: jsonSchema2,\n schemaName,\n schemaDescription\n },\n callbacks: [onStart, telemetryDispatcher.onStart]\n });\n const standardizedPrompt = await standardizePrompt({\n instructions,\n system,\n prompt,\n messages,\n allowSystemInMessages\n });\n const callOptions = {\n responseFormat: {\n type: \"json\",\n schema: jsonSchema2,\n name: schemaName,\n description: schemaDescription\n },\n ...prepareLanguageModelCallOptions(settings),\n prompt: await convertToLanguageModelPrompt({\n prompt: standardizedPrompt,\n supportedUrls: await model.supportedUrls,\n download: download2,\n provider: model.provider.split(\".\")[0]\n }),\n providerOptions,\n abortSignal,\n headers,\n includeRawChunks: false\n };\n await notify({\n event: {\n callId,\n stepNumber: 0,\n provider: model.provider,\n modelId: model.modelId,\n providerOptions,\n headers,\n promptMessages: callOptions.prompt\n },\n callbacks: [onStepStart, telemetryDispatcher.onObjectStepStart]\n });\n const transformer = {\n transform: (chunk, controller) => {\n switch (chunk.type) {\n case \"text-delta\":\n controller.enqueue(chunk.delta);\n break;\n case \"response-metadata\":\n case \"finish\":\n case \"error\":\n case \"stream-start\":\n controller.enqueue(chunk);\n break;\n }\n }\n };\n const startTimestampMs = now2();\n const { stream, response, request } = await retry(\n () => model.doStream(callOptions)\n );\n self._request.resolve(request != null ? request : {});\n let warnings;\n let usage = createNullLanguageModelUsage();\n let finishReason;\n let providerMetadata;\n let object2;\n let error;\n let msToFirstChunk = void 0;\n let accumulatedText = \"\";\n let textDelta = \"\";\n let fullResponse = {\n id: generateId2(),\n timestamp: currentDate(),\n modelId: model.modelId\n };\n let latestObjectJson = void 0;\n let latestObject = void 0;\n let isFirstChunk = true;\n let isFirstDelta = true;\n const transformedStream = stream.pipeThrough(new TransformStream(transformer)).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n var _a22, _b, _c;\n if (typeof chunk === \"object\" && chunk.type === \"stream-start\") {\n warnings = chunk.warnings;\n return;\n }\n if (isFirstChunk) {\n msToFirstChunk = now2() - startTimestampMs;\n isFirstChunk = false;\n }\n if (typeof chunk === \"string\") {\n accumulatedText += chunk;\n textDelta += chunk;\n const { value: currentObjectJson, state: parseState } = await parsePartialJson(accumulatedText);\n if (currentObjectJson !== void 0 && !isDeepEqualData(latestObjectJson, currentObjectJson)) {\n const validationResult = await outputStrategy.validatePartialResult({\n value: currentObjectJson,\n textDelta,\n latestObject,\n isFirstDelta,\n isFinalDelta: parseState === \"successful-parse\"\n });\n if (validationResult.success && !isDeepEqualData(\n latestObject,\n validationResult.value.partial\n )) {\n latestObjectJson = currentObjectJson;\n latestObject = validationResult.value.partial;\n controller.enqueue({\n type: \"object\",\n object: latestObject\n });\n controller.enqueue({\n type: \"text-delta\",\n textDelta: validationResult.value.textDelta\n });\n textDelta = \"\";\n isFirstDelta = false;\n }\n }\n return;\n }\n switch (chunk.type) {\n case \"response-metadata\": {\n fullResponse = {\n id: (_a22 = chunk.id) != null ? _a22 : fullResponse.id,\n timestamp: (_b = chunk.timestamp) != null ? _b : fullResponse.timestamp,\n modelId: (_c = chunk.modelId) != null ? _c : fullResponse.modelId\n };\n break;\n }\n case \"finish\": {\n if (textDelta !== \"\") {\n controller.enqueue({ type: \"text-delta\", textDelta });\n }\n finishReason = chunk.finishReason.unified;\n usage = asLanguageModelUsage(chunk.usage);\n providerMetadata = chunk.providerMetadata;\n controller.enqueue({\n ...chunk,\n finishReason: chunk.finishReason.unified,\n usage,\n response: fullResponse\n });\n logWarnings({\n warnings: warnings != null ? warnings : [],\n provider: model.provider,\n model: model.modelId\n });\n self._usage.resolve(usage);\n self._providerMetadata.resolve(providerMetadata);\n self._warnings.resolve(warnings);\n self._response.resolve({\n ...fullResponse,\n headers: response == null ? void 0 : response.headers\n });\n self._finishReason.resolve(finishReason != null ? finishReason : \"other\");\n try {\n object2 = await parseAndValidateObjectResultWithRepair(\n accumulatedText,\n outputStrategy,\n repairText,\n {\n response: fullResponse,\n usage,\n finishReason\n }\n );\n self._object.resolve(object2);\n } catch (e) {\n error = e;\n self._object.reject(e);\n }\n break;\n }\n default: {\n controller.enqueue(chunk);\n break;\n }\n }\n },\n async flush(controller) {\n try {\n const finalUsage = usage != null ? usage : {\n promptTokens: NaN,\n completionTokens: NaN,\n totalTokens: NaN\n };\n await notify({\n event: {\n callId,\n stepNumber: 0,\n provider: model.provider,\n modelId: model.modelId,\n finishReason: finishReason != null ? finishReason : \"other\",\n usage: finalUsage,\n objectText: accumulatedText,\n msToFirstChunk,\n reasoning: void 0,\n warnings,\n request: request != null ? request : {},\n response: {\n ...fullResponse,\n headers: response == null ? void 0 : response.headers\n },\n providerMetadata\n },\n callbacks: [\n onStepFinish,\n telemetryDispatcher.onObjectStepEnd\n ]\n });\n await notify({\n event: {\n callId,\n object: object2,\n error,\n reasoning: void 0,\n finishReason: finishReason != null ? finishReason : \"other\",\n usage: finalUsage,\n warnings,\n request: request != null ? request : {},\n response: {\n ...fullResponse,\n headers: response == null ? void 0 : response.headers\n },\n providerMetadata\n },\n callbacks: [onFinish, telemetryDispatcher.onEnd]\n });\n } catch (error2) {\n controller.enqueue({ type: \"error\", error: error2 });\n }\n }\n })\n );\n stitchableStream.addStream(transformedStream);\n })().catch(async (error) => {\n var _a22;\n await ((_a22 = telemetryDispatcher.onError) == null ? void 0 : _a22.call(telemetryDispatcher, { callId, error }));\n stitchableStream.addStream(\n new ReadableStream({\n start(controller) {\n controller.enqueue({ type: \"error\", error });\n controller.close();\n }\n })\n );\n }).finally(() => {\n stitchableStream.close();\n });\n this.outputStrategy = outputStrategy;\n }\n get object() {\n return this._object.promise;\n }\n get usage() {\n return this._usage.promise;\n }\n get providerMetadata() {\n return this._providerMetadata.promise;\n }\n get warnings() {\n return this._warnings.promise;\n }\n get request() {\n return this._request.promise;\n }\n get response() {\n return this._response.promise;\n }\n get finishReason() {\n return this._finishReason.promise;\n }\n get partialObjectStream() {\n return createAsyncIterableStream(\n this.baseStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"object\":\n controller.enqueue(chunk.object);\n break;\n case \"text-delta\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);\n }\n }\n }\n })\n )\n );\n }\n get elementStream() {\n return this.outputStrategy.createElementStream(this.baseStream);\n }\n get textStream() {\n return createAsyncIterableStream(\n this.baseStream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n switch (chunk.type) {\n case \"text-delta\":\n controller.enqueue(chunk.textDelta);\n break;\n case \"object\":\n case \"finish\":\n case \"error\":\n break;\n default: {\n const _exhaustiveCheck = chunk;\n throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);\n }\n }\n }\n })\n )\n );\n }\n get fullStream() {\n return createAsyncIterableStream(this.baseStream);\n }\n pipeTextStreamToResponse(response, init) {\n pipeTextStreamToResponse({\n response,\n stream: this.textStream,\n ...init\n });\n }\n toTextStreamResponse(init) {\n return createTextStreamResponse({\n stream: this.textStream,\n ...init\n });\n }\n};\n\n// src/generate-speech/generate-speech.ts\nimport {\n detectMediaType as detectMediaType3,\n withUserAgentSuffix as withUserAgentSuffix8\n} from \"@ai-sdk/provider-utils\";\n\n// src/generate-speech/generated-audio-file.ts\nvar DefaultGeneratedAudioFile = class extends DefaultGeneratedFile {\n constructor({\n data,\n mediaType\n }) {\n super({ data, mediaType });\n let format = \"mp3\";\n if (mediaType) {\n const mediaTypeParts = mediaType.split(\"/\");\n if (mediaTypeParts.length === 2) {\n if (mediaType !== \"audio/mpeg\") {\n format = mediaTypeParts[1];\n }\n }\n }\n if (!format) {\n throw new Error(\n \"Audio format must be provided or determinable from media type\"\n );\n }\n this.format = format;\n }\n};\n\n// src/generate-speech/generate-speech.ts\nasync function generateSpeech({\n model,\n text: text2,\n voice,\n outputFormat,\n instructions,\n speed,\n language,\n providerOptions = {},\n maxRetries: maxRetriesArg,\n abortSignal,\n headers\n}) {\n var _a22;\n const resolvedModel = resolveSpeechModel(model);\n if (!resolvedModel) {\n throw new Error(\"Model could not be resolved\");\n }\n const headersWithUserAgent = withUserAgentSuffix8(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const result = await retry(\n () => resolvedModel.doGenerate({\n text: text2,\n voice,\n outputFormat,\n instructions,\n speed,\n language,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions\n })\n );\n if (!result.audio || result.audio.length === 0) {\n throw new NoSpeechGeneratedError({ responses: [result.response] });\n }\n logWarnings({\n warnings: result.warnings,\n provider: resolvedModel.provider,\n model: resolvedModel.modelId\n });\n return new DefaultSpeechResult({\n audio: new DefaultGeneratedAudioFile({\n data: result.audio,\n mediaType: (_a22 = detectMediaType3({\n data: result.audio,\n topLevelType: \"audio\"\n })) != null ? _a22 : \"audio/mp3\"\n }),\n warnings: result.warnings,\n responses: [result.response],\n providerMetadata: result.providerMetadata\n });\n}\nvar DefaultSpeechResult = class {\n constructor(options) {\n var _a22;\n this.audio = options.audio;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = (_a22 = options.providerMetadata) != null ? _a22 : {};\n }\n};\n\n// src/generate-speech/index.ts\nvar experimental_generateSpeech = generateSpeech;\n\n// src/generate-text/prune-messages.ts\nfunction pruneMessages({\n messages,\n reasoning = \"none\",\n toolCalls = [],\n emptyMessages = \"remove\"\n}) {\n if (reasoning === \"all\" || reasoning === \"before-last-message\") {\n messages = messages.map((message, messageIndex) => {\n if (message.role !== \"assistant\" || typeof message.content === \"string\" || reasoning === \"before-last-message\" && messageIndex === messages.length - 1) {\n return message;\n }\n return {\n ...message,\n content: message.content.filter((part) => part.type !== \"reasoning\")\n };\n });\n }\n if (toolCalls === \"none\") {\n toolCalls = [];\n } else if (toolCalls === \"all\") {\n toolCalls = [{ type: \"all\" }];\n } else if (toolCalls === \"before-last-message\") {\n toolCalls = [{ type: \"before-last-message\" }];\n } else if (typeof toolCalls === \"string\") {\n toolCalls = [{ type: toolCalls }];\n }\n for (const toolCall of toolCalls) {\n const keepLastMessagesCount = toolCall.type === \"all\" ? void 0 : toolCall.type === \"before-last-message\" ? 1 : Number(\n toolCall.type.slice(\"before-last-\".length).slice(0, -\"-messages\".length)\n );\n const keptToolCallIds = /* @__PURE__ */ new Set();\n const keptApprovalIds = /* @__PURE__ */ new Set();\n if (keepLastMessagesCount != null) {\n for (const message of messages.slice(-keepLastMessagesCount)) {\n if ((message.role === \"assistant\" || message.role === \"tool\") && typeof message.content !== \"string\") {\n for (const part of message.content) {\n if (part.type === \"tool-call\" || part.type === \"tool-result\") {\n keptToolCallIds.add(part.toolCallId);\n } else if (part.type === \"tool-approval-request\" || part.type === \"tool-approval-response\") {\n keptApprovalIds.add(part.approvalId);\n }\n }\n }\n }\n }\n const toolCallIdToToolName = /* @__PURE__ */ new Map();\n for (const message of messages) {\n if ((message.role === \"assistant\" || message.role === \"tool\") && typeof message.content !== \"string\") {\n for (const part of message.content) {\n if (part.type === \"tool-call\" || part.type === \"tool-result\") {\n toolCallIdToToolName.set(part.toolCallId, part.toolName);\n }\n }\n }\n }\n const approvalIdToToolName = /* @__PURE__ */ new Map();\n for (const message of messages) {\n if ((message.role === \"assistant\" || message.role === \"tool\") && typeof message.content !== \"string\") {\n for (const part of message.content) {\n if (part.type === \"tool-approval-request\") {\n const toolName = toolCallIdToToolName.get(part.toolCallId);\n if (toolName != null) {\n approvalIdToToolName.set(part.approvalId, toolName);\n }\n }\n }\n }\n }\n messages = messages.map((message, messageIndex) => {\n if (message.role !== \"assistant\" && message.role !== \"tool\" || typeof message.content === \"string\" || keepLastMessagesCount && messageIndex >= messages.length - keepLastMessagesCount) {\n return message;\n }\n return {\n ...message,\n content: message.content.filter((part) => {\n if (part.type !== \"tool-call\" && part.type !== \"tool-result\" && part.type !== \"tool-approval-request\" && part.type !== \"tool-approval-response\") {\n return true;\n }\n if ((part.type === \"tool-call\" || part.type === \"tool-result\") && keptToolCallIds.has(part.toolCallId) || (part.type === \"tool-approval-request\" || part.type === \"tool-approval-response\") && keptApprovalIds.has(part.approvalId)) {\n return true;\n }\n const partToolName = part.type === \"tool-call\" || part.type === \"tool-result\" ? part.toolName : approvalIdToToolName.get(part.approvalId);\n return toolCall.tools != null && partToolName != null && !toolCall.tools.includes(partToolName);\n })\n };\n });\n }\n if (emptyMessages === \"remove\") {\n messages = messages.filter((message) => message.content.length > 0);\n }\n return messages;\n}\n\n// src/generate-text/smooth-stream.ts\nimport { delay as originalDelay } from \"@ai-sdk/provider-utils\";\nimport {\n InvalidArgumentError as InvalidArgumentError2\n} from \"@ai-sdk/provider\";\nvar CHUNKING_REGEXPS = {\n word: /\\S+\\s+/m,\n line: /\\n+/m\n};\nfunction smoothStream({\n delayInMs = 10,\n chunking = \"word\",\n _internal: { delay = originalDelay } = {}\n} = {}) {\n let detectChunk;\n if (chunking != null && typeof chunking === \"object\" && \"segment\" in chunking && typeof chunking.segment === \"function\") {\n const segmenter = chunking;\n detectChunk = (buffer) => {\n if (buffer.length === 0)\n return null;\n const iterator = segmenter.segment(buffer)[Symbol.iterator]();\n const first = iterator.next().value;\n return (first == null ? void 0 : first.segment) || null;\n };\n } else if (typeof chunking === \"function\") {\n detectChunk = (buffer) => {\n const match = chunking(buffer);\n if (match == null) {\n return null;\n }\n if (!match.length) {\n throw new Error(`Chunking function must return a non-empty string.`);\n }\n if (!buffer.startsWith(match)) {\n throw new Error(\n `Chunking function must return a match that is a prefix of the buffer. Received: \"${match}\" expected to start with \"${buffer}\"`\n );\n }\n return match;\n };\n } else {\n const chunkingRegex = typeof chunking === \"string\" ? CHUNKING_REGEXPS[chunking] : chunking instanceof RegExp ? chunking : void 0;\n if (chunkingRegex == null) {\n throw new InvalidArgumentError2({\n argument: \"chunking\",\n message: `Chunking must be \"word\", \"line\", a RegExp, an Intl.Segmenter, or a ChunkDetector function. Received: ${chunking}`\n });\n }\n detectChunk = (buffer) => {\n const match = chunkingRegex.exec(buffer);\n if (!match) {\n return null;\n }\n return buffer.slice(0, match.index) + (match == null ? void 0 : match[0]);\n };\n }\n return () => {\n let buffer = \"\";\n let id = \"\";\n let type = void 0;\n let providerMetadata = void 0;\n function flushBuffer(controller) {\n if (buffer.length > 0 && type !== void 0) {\n controller.enqueue({\n type,\n text: buffer,\n id,\n ...providerMetadata != null ? { providerMetadata } : {}\n });\n buffer = \"\";\n providerMetadata = void 0;\n }\n }\n return new TransformStream({\n async transform(chunk, controller) {\n if (chunk.type !== \"text-delta\" && chunk.type !== \"reasoning-delta\") {\n flushBuffer(controller);\n controller.enqueue(chunk);\n return;\n }\n if ((chunk.type !== type || chunk.id !== id) && buffer.length > 0) {\n flushBuffer(controller);\n }\n buffer += chunk.text;\n id = chunk.id;\n type = chunk.type;\n if (chunk.providerMetadata != null) {\n providerMetadata = chunk.providerMetadata;\n }\n let match;\n while ((match = detectChunk(buffer)) != null) {\n controller.enqueue({ type, text: match, id });\n buffer = buffer.slice(match.length);\n await delay(delayInMs);\n }\n }\n });\n };\n}\n\n// src/generate-text/tool-fingerprint.ts\nimport { asSchema as asSchema6 } from \"@ai-sdk/provider-utils\";\nfunction tagDescription(description) {\n if (typeof description === \"string\") {\n return { type: \"string\", value: description };\n }\n if (description == null) {\n return { type: \"none\" };\n }\n return { type: \"function\" };\n}\nasync function fingerprintTools(tools) {\n const entries = await Promise.all(\n Object.keys(tools).map(async (name22) => {\n const tool2 = tools[name22];\n const digest = await hashCanonical({\n description: tagDescription(tool2.description),\n inputSchema: await asSchema6(tool2.inputSchema).jsonSchema,\n title: tool2.title\n });\n return [name22, digest];\n })\n );\n return Object.fromEntries(entries);\n}\nfunction detectToolDrift(current, baseline) {\n const added = [];\n const removed = [];\n const changed = [];\n for (const name22 of Object.keys(current)) {\n if (!Object.hasOwn(baseline, name22)) {\n added.push(name22);\n } else if (current[name22] !== baseline[name22]) {\n changed.push(name22);\n }\n }\n for (const name22 of Object.keys(baseline)) {\n if (!Object.hasOwn(current, name22)) {\n removed.push(name22);\n }\n }\n return { added, removed, changed };\n}\n\n// src/generate-video/generate-video.ts\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array5,\n withUserAgentSuffix as withUserAgentSuffix9,\n detectMediaType as detectMediaType4\n} from \"@ai-sdk/provider-utils\";\nvar defaultDownload = createDownload();\nasync function experimental_generateVideo({\n model: modelArg,\n prompt: promptArg,\n n = 1,\n maxVideosPerCall,\n aspectRatio,\n resolution,\n duration,\n fps,\n seed,\n frameImages,\n inputReferences,\n generateAudio,\n providerOptions,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n download: downloadFn = defaultDownload\n}) {\n var _a22, _b;\n const model = resolveVideoModel(modelArg);\n const headersWithUserAgent = withUserAgentSuffix9(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const { prompt, image } = normalizePrompt2(promptArg);\n const normalizedFrameImages = frameImages == null ? void 0 : frameImages.flatMap((frame) => {\n const normalizedImage = normalizeImageData(frame.image);\n return normalizedImage != null ? [{ image: normalizedImage, frameType: frame.frameType }] : [];\n });\n const normalizedInputReferences = inputReferences == null ? void 0 : inputReferences.flatMap((reference) => {\n const normalized = normalizeReferenceData(reference);\n return normalized != null ? [normalized] : [];\n });\n const effectiveInputReferences = normalizedFrameImages != null && normalizedFrameImages.length > 0 ? void 0 : normalizedInputReferences;\n const warnings = [];\n if (normalizedFrameImages != null && normalizedFrameImages.length > 0 && normalizedInputReferences != null && normalizedInputReferences.length > 0) {\n warnings.push({\n type: \"other\",\n message: \"inputReferences were ignored because frameImages were provided; frameImages and inputReferences cannot be combined.\"\n });\n }\n const firstFrameImage = (_a22 = normalizedFrameImages == null ? void 0 : normalizedFrameImages.find(\n (frame) => frame.frameType === \"first_frame\"\n )) == null ? void 0 : _a22.image;\n if (image != null && firstFrameImage != null) {\n warnings.push({\n type: \"other\",\n message: \"prompt.image was ignored because a first_frame frameImage was provided; the first_frame frameImage takes precedence as the start image.\"\n });\n }\n const resolvedImage = firstFrameImage != null ? firstFrameImage : image;\n const maxVideosPerCallWithDefault = (_b = maxVideosPerCall != null ? maxVideosPerCall : await invokeModelMaxVideosPerCall(model)) != null ? _b : 1;\n const callCount = Math.ceil(n / maxVideosPerCallWithDefault);\n const callVideoCounts = Array.from({ length: callCount }, (_, index) => {\n const remaining = n - index * maxVideosPerCallWithDefault;\n return Math.min(remaining, maxVideosPerCallWithDefault);\n });\n const results = await Promise.all(\n callVideoCounts.map(\n async (callVideoCount) => await retry(\n () => model.doGenerate({\n prompt,\n n: callVideoCount,\n aspectRatio,\n resolution,\n duration,\n fps,\n seed,\n image: resolvedImage,\n frameImages: normalizedFrameImages,\n inputReferences: effectiveInputReferences,\n generateAudio,\n providerOptions: providerOptions != null ? providerOptions : {},\n headers: headersWithUserAgent,\n abortSignal\n })\n )\n )\n );\n const videos = [];\n const responses = [];\n const providerMetadata = {};\n for (const result of results) {\n for (const videoData of result.videos) {\n switch (videoData.type) {\n case \"url\": {\n const { data, mediaType: downloadedMediaType } = await downloadFn({\n url: new URL(videoData.url),\n abortSignal\n });\n const isUsableMediaType = (type) => !!type && type !== \"application/octet-stream\";\n const mediaType = isUsableMediaType(videoData.mediaType) && videoData.mediaType || isUsableMediaType(downloadedMediaType) && downloadedMediaType || detectMediaType4({\n data,\n topLevelType: \"video\"\n }) || \"video/mp4\";\n videos.push(\n new DefaultGeneratedFile({\n data,\n mediaType\n })\n );\n break;\n }\n case \"base64\": {\n videos.push(\n new DefaultGeneratedFile({\n data: videoData.data,\n mediaType: videoData.mediaType || \"video/mp4\"\n })\n );\n break;\n }\n case \"binary\": {\n const mediaType = videoData.mediaType || detectMediaType4({\n data: videoData.data,\n topLevelType: \"video\"\n }) || \"video/mp4\";\n videos.push(\n new DefaultGeneratedFile({\n data: videoData.data,\n mediaType\n })\n );\n break;\n }\n }\n }\n warnings.push(...result.warnings);\n responses.push({\n timestamp: result.response.timestamp,\n modelId: result.response.modelId,\n headers: result.response.headers,\n providerMetadata: result.providerMetadata\n });\n if (result.providerMetadata != null) {\n for (const [providerName, metadata] of Object.entries(\n result.providerMetadata\n )) {\n const existingMetadata = providerMetadata[providerName];\n if (existingMetadata != null && typeof existingMetadata === \"object\") {\n providerMetadata[providerName] = {\n ...existingMetadata,\n ...metadata\n };\n if (\"videos\" in existingMetadata && Array.isArray(existingMetadata.videos) && \"videos\" in metadata && Array.isArray(metadata.videos)) {\n providerMetadata[providerName].videos = [\n ...existingMetadata.videos,\n ...metadata.videos\n ];\n }\n } else {\n providerMetadata[providerName] = metadata;\n }\n }\n }\n }\n if (videos.length === 0) {\n throw new NoVideoGeneratedError({ responses });\n }\n if (warnings.length > 0) {\n logWarnings({\n warnings,\n provider: model.provider,\n model: model.modelId\n });\n }\n return {\n video: videos[0],\n videos,\n warnings,\n responses,\n providerMetadata\n };\n}\nfunction normalizePrompt2(promptArg) {\n if (typeof promptArg === \"string\") {\n return {\n prompt: promptArg,\n image: void 0\n };\n }\n return {\n prompt: promptArg.text,\n image: promptArg.image != null ? normalizeImageData(promptArg.image) : void 0\n };\n}\nfunction detectFileMediaType(data, restrictToImages) {\n const detected = restrictToImages ? detectMediaType4({ data, topLevelType: \"image\" }) : detectMediaType4({ data });\n return detected != null ? detected : \"image/png\";\n}\nfunction normalizeImageData(dataContent, { restrictToImages = true } = {}) {\n if (typeof dataContent === \"string\") {\n if (dataContent.startsWith(\"http://\") || dataContent.startsWith(\"https://\")) {\n return {\n type: \"url\",\n url: dataContent\n };\n }\n if (dataContent.startsWith(\"data:\")) {\n const { mediaType, base64Content } = splitDataUrl(dataContent);\n const data = convertBase64ToUint8Array5(base64Content != null ? base64Content : \"\");\n return {\n type: \"file\",\n mediaType: mediaType != null ? mediaType : detectFileMediaType(data, restrictToImages),\n data\n };\n }\n const bytes = convertBase64ToUint8Array5(dataContent);\n return {\n type: \"file\",\n mediaType: detectFileMediaType(bytes, restrictToImages),\n data: bytes\n };\n }\n if (dataContent instanceof Uint8Array || dataContent instanceof ArrayBuffer) {\n const bytes = dataContent instanceof Uint8Array ? dataContent : new Uint8Array(dataContent);\n return {\n type: \"file\",\n mediaType: detectFileMediaType(bytes, restrictToImages),\n data: bytes\n };\n }\n return void 0;\n}\nfunction normalizeReferenceData(reference) {\n const isObjectForm = typeof reference === \"object\" && reference != null && !(reference instanceof Uint8Array) && !(reference instanceof ArrayBuffer) && \"data\" in reference;\n if (!isObjectForm) {\n return normalizeImageData(reference, {\n restrictToImages: false\n });\n }\n const normalized = normalizeImageData(reference.data, {\n restrictToImages: false\n });\n if (normalized == null) {\n return normalized;\n }\n return {\n ...normalized,\n ...reference.mediaType != null ? { mediaType: reference.mediaType } : {}\n };\n}\nasync function invokeModelMaxVideosPerCall(model) {\n if (typeof model.maxVideosPerCall === \"function\") {\n return await model.maxVideosPerCall({ modelId: model.modelId });\n }\n return model.maxVideosPerCall;\n}\n\n// src/middleware/default-embedding-settings-middleware.ts\nfunction defaultEmbeddingSettingsMiddleware({\n settings\n}) {\n return {\n specificationVersion: \"v4\",\n transformParams: async ({ params }) => {\n return mergeObjects(settings, params);\n }\n };\n}\n\n// src/middleware/default-settings-middleware.ts\nfunction defaultSettingsMiddleware({\n settings\n}) {\n return {\n specificationVersion: \"v4\",\n transformParams: async ({ params }) => {\n return mergeObjects(settings, params);\n }\n };\n}\n\n// src/middleware/extract-json-middleware.ts\nfunction defaultTransform(text2) {\n return text2.replace(/^```(?:json)?\\s*\\n?/, \"\").replace(/\\n?```\\s*$/, \"\").trim();\n}\nfunction stripMarkdownCodeFenceSuffix(text2) {\n return text2.replace(/\\n?```\\s*$/, \"\").trimEnd();\n}\nfunction extractJsonMiddleware(options) {\n var _a22;\n const transform = (_a22 = options == null ? void 0 : options.transform) != null ? _a22 : defaultTransform;\n const hasCustomTransform = (options == null ? void 0 : options.transform) !== void 0;\n return {\n specificationVersion: \"v4\",\n wrapGenerate: async ({ doGenerate }) => {\n const { content, ...rest } = await doGenerate();\n const transformedContent = [];\n for (const part of content) {\n if (part.type !== \"text\") {\n transformedContent.push(part);\n continue;\n }\n transformedContent.push({\n ...part,\n text: transform(part.text)\n });\n }\n return { content: transformedContent, ...rest };\n },\n wrapStream: async ({ doStream }) => {\n const { stream, ...rest } = await doStream();\n const textBlocks = createIdMap();\n const SUFFIX_BUFFER_SIZE = 12;\n return {\n stream: stream.pipeThrough(\n new TransformStream({\n transform: (chunk, controller) => {\n if (chunk.type === \"text-start\") {\n textBlocks[chunk.id] = {\n startEvent: chunk,\n // Custom transforms need to buffer all content\n phase: hasCustomTransform ? \"buffering\" : \"prefix\",\n buffer: \"\",\n prefixStripped: false\n };\n return;\n }\n if (chunk.type === \"text-delta\") {\n const block = textBlocks[chunk.id];\n if (!block) {\n controller.enqueue(chunk);\n return;\n }\n block.buffer += chunk.delta;\n if (block.phase === \"buffering\") {\n return;\n }\n if (block.phase === \"prefix\") {\n if (block.buffer.length > 0 && !block.buffer.startsWith(\"`\")) {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n } else if (block.buffer.startsWith(\"```\")) {\n if (block.buffer.includes(\"\\n\")) {\n const prefixMatch = block.buffer.match(/^```(?:json)?\\s*\\n/);\n if (prefixMatch) {\n block.buffer = block.buffer.slice(\n prefixMatch[0].length\n );\n block.prefixStripped = true;\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n } else {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n }\n }\n } else if (block.buffer.length >= 3 && !block.buffer.startsWith(\"```\")) {\n block.phase = \"streaming\";\n controller.enqueue(block.startEvent);\n }\n }\n if (block.phase === \"streaming\" && block.buffer.length > SUFFIX_BUFFER_SIZE) {\n const toStream = block.buffer.slice(0, -SUFFIX_BUFFER_SIZE);\n block.buffer = block.buffer.slice(-SUFFIX_BUFFER_SIZE);\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n delta: toStream\n });\n }\n return;\n }\n if (chunk.type === \"text-end\") {\n const block = textBlocks[chunk.id];\n if (block) {\n if (block.phase === \"prefix\" || block.phase === \"buffering\") {\n controller.enqueue(block.startEvent);\n }\n let remaining = block.buffer;\n if (block.phase === \"buffering\") {\n remaining = transform(remaining);\n } else if (block.prefixStripped) {\n remaining = stripMarkdownCodeFenceSuffix(remaining);\n } else if (block.phase === \"prefix\") {\n remaining = transform(remaining);\n } else {\n remaining = stripMarkdownCodeFenceSuffix(remaining);\n }\n if (remaining.length > 0) {\n controller.enqueue({\n type: \"text-delta\",\n id: chunk.id,\n delta: remaining\n });\n }\n controller.enqueue(chunk);\n delete textBlocks[chunk.id];\n return;\n }\n }\n controller.enqueue(chunk);\n }\n })\n ),\n ...rest\n };\n }\n };\n}\n\n// src/util/get-potential-start-index.ts\nfunction getPotentialStartIndex(text2, searchedText) {\n if (searchedText.length === 0) {\n return null;\n }\n const directIndex = text2.indexOf(searchedText);\n if (directIndex !== -1) {\n return directIndex;\n }\n for (let i = text2.length - 1; i >= 0; i--) {\n const suffix = text2.substring(i);\n if (searchedText.startsWith(suffix)) {\n return i;\n }\n }\n return null;\n}\n\n// src/middleware/extract-reasoning-middleware.ts\nfunction extractReasoningMiddleware({\n tagName,\n separator = \"\\n\",\n startWithReasoning = false\n}) {\n const openingTag = `<${tagName}>`;\n const closingTag = `</${tagName}>`;\n return {\n specificationVersion: \"v4\",\n wrapGenerate: async ({ doGenerate }) => {\n const { content, ...rest } = await doGenerate();\n const transformedContent = [];\n for (const part of content) {\n if (part.type !== \"text\") {\n transformedContent.push(part);\n continue;\n }\n const text2 = startWithReasoning ? openingTag + part.text : part.text;\n const regexp = new RegExp(`${openingTag}(.*?)${closingTag}`, \"gs\");\n const matches = Array.from(text2.matchAll(regexp));\n if (!matches.length) {\n transformedContent.push(part);\n continue;\n }\n const reasoningText = matches.map((match) => match[1]).join(separator);\n let textWithoutReasoning = text2;\n for (let i = matches.length - 1; i >= 0; i--) {\n const match = matches[i];\n const beforeMatch = textWithoutReasoning.slice(0, match.index);\n const afterMatch = textWithoutReasoning.slice(\n match.index + match[0].length\n );\n textWithoutReasoning = beforeMatch + (beforeMatch.length > 0 && afterMatch.length > 0 ? separator : \"\") + afterMatch;\n }\n transformedContent.push({\n type: \"reasoning\",\n text: reasoningText\n });\n transformedContent.push({\n type: \"text\",\n text: textWithoutReasoning\n });\n }\n return { content: transformedContent, ...rest };\n },\n wrapStream: async ({ doStream }) => {\n const { stream, ...rest } = await doStream();\n const reasoningExtractions = createIdMap();\n let delayedTextStart;\n return {\n stream: stream.pipeThrough(\n new TransformStream({\n transform: (chunk, controller) => {\n if (chunk.type === \"text-start\") {\n delayedTextStart = chunk;\n return;\n }\n if (chunk.type === \"text-end\" && delayedTextStart) {\n controller.enqueue(delayedTextStart);\n delayedTextStart = void 0;\n }\n if (chunk.type !== \"text-delta\") {\n controller.enqueue(chunk);\n return;\n }\n if (reasoningExtractions[chunk.id] == null) {\n reasoningExtractions[chunk.id] = {\n isFirstReasoning: true,\n isFirstText: true,\n afterSwitch: false,\n isReasoning: startWithReasoning,\n buffer: \"\",\n idCounter: 0,\n textId: chunk.id\n };\n }\n const activeExtraction = reasoningExtractions[chunk.id];\n activeExtraction.buffer += chunk.delta;\n function publish(text2) {\n if (text2.length > 0) {\n const prefix = activeExtraction.afterSwitch && (activeExtraction.isReasoning ? !activeExtraction.isFirstReasoning : !activeExtraction.isFirstText) ? separator : \"\";\n if (activeExtraction.isReasoning && (activeExtraction.afterSwitch || activeExtraction.isFirstReasoning)) {\n controller.enqueue({\n type: \"reasoning-start\",\n id: `reasoning-${activeExtraction.idCounter}`\n });\n }\n if (activeExtraction.isReasoning) {\n controller.enqueue({\n type: \"reasoning-delta\",\n delta: prefix + text2,\n id: `reasoning-${activeExtraction.idCounter}`\n });\n } else {\n if (delayedTextStart) {\n controller.enqueue(delayedTextStart);\n delayedTextStart = void 0;\n }\n controller.enqueue({\n type: \"text-delta\",\n delta: prefix + text2,\n id: activeExtraction.textId\n });\n }\n activeExtraction.afterSwitch = false;\n if (activeExtraction.isReasoning) {\n activeExtraction.isFirstReasoning = false;\n } else {\n activeExtraction.isFirstText = false;\n }\n }\n }\n do {\n const nextTag = activeExtraction.isReasoning ? closingTag : openingTag;\n const startIndex = getPotentialStartIndex(\n activeExtraction.buffer,\n nextTag\n );\n if (startIndex == null) {\n publish(activeExtraction.buffer);\n activeExtraction.buffer = \"\";\n break;\n }\n publish(activeExtraction.buffer.slice(0, startIndex));\n const foundFullMatch = startIndex + nextTag.length <= activeExtraction.buffer.length;\n if (foundFullMatch) {\n activeExtraction.buffer = activeExtraction.buffer.slice(\n startIndex + nextTag.length\n );\n if (activeExtraction.isReasoning) {\n if (activeExtraction.isFirstReasoning) {\n controller.enqueue({\n type: \"reasoning-start\",\n id: `reasoning-${activeExtraction.idCounter}`\n });\n }\n controller.enqueue({\n type: \"reasoning-end\",\n id: `reasoning-${activeExtraction.idCounter++}`\n });\n }\n activeExtraction.isReasoning = !activeExtraction.isReasoning;\n activeExtraction.afterSwitch = true;\n } else {\n activeExtraction.buffer = activeExtraction.buffer.slice(startIndex);\n break;\n }\n } while (true);\n }\n })\n ),\n ...rest\n };\n }\n };\n}\n\n// src/middleware/simulate-streaming-middleware.ts\nfunction simulateStreamingMiddleware() {\n return {\n specificationVersion: \"v4\",\n wrapStream: async ({ doGenerate }) => {\n const result = await doGenerate();\n let id = 0;\n const simulatedStream = new ReadableStream({\n start(controller) {\n controller.enqueue({\n type: \"stream-start\",\n warnings: result.warnings\n });\n controller.enqueue({ type: \"response-metadata\", ...result.response });\n for (const part of result.content) {\n switch (part.type) {\n case \"text\": {\n if (part.text.length > 0) {\n controller.enqueue({ type: \"text-start\", id: String(id) });\n controller.enqueue({\n type: \"text-delta\",\n id: String(id),\n delta: part.text\n });\n controller.enqueue({ type: \"text-end\", id: String(id) });\n id++;\n }\n break;\n }\n case \"reasoning\": {\n controller.enqueue({\n type: \"reasoning-start\",\n id: String(id),\n providerMetadata: part.providerMetadata\n });\n controller.enqueue({\n type: \"reasoning-delta\",\n id: String(id),\n delta: part.text\n });\n controller.enqueue({ type: \"reasoning-end\", id: String(id) });\n id++;\n break;\n }\n default: {\n controller.enqueue(part);\n break;\n }\n }\n }\n controller.enqueue({\n type: \"finish\",\n finishReason: result.finishReason,\n usage: result.usage,\n providerMetadata: result.providerMetadata\n });\n controller.close();\n }\n });\n return {\n stream: simulatedStream,\n request: result.request,\n response: result.response\n };\n }\n };\n}\n\n// src/middleware/add-tool-input-examples-middleware.ts\nfunction defaultFormatExample(example) {\n return JSON.stringify(example.input);\n}\nfunction addToolInputExamplesMiddleware({\n prefix = \"Input Examples:\",\n format = defaultFormatExample,\n remove = true\n} = {}) {\n return {\n specificationVersion: \"v4\",\n transformParams: async ({ params }) => {\n var _a22;\n if (!((_a22 = params.tools) == null ? void 0 : _a22.length)) {\n return params;\n }\n const transformedTools = params.tools.map((tool2) => {\n var _a23;\n if (tool2.type !== \"function\" || !((_a23 = tool2.inputExamples) == null ? void 0 : _a23.length)) {\n return tool2;\n }\n const formattedExamples = tool2.inputExamples.map((example, index) => format(example, index)).join(\"\\n\");\n const examplesSection = `${prefix}\n${formattedExamples}`;\n const toolDescription = tool2.description ? `${tool2.description}\n\n${examplesSection}` : examplesSection;\n return {\n ...tool2,\n description: toolDescription,\n inputExamples: remove ? void 0 : tool2.inputExamples\n };\n });\n return {\n ...params,\n tools: transformedTools\n };\n }\n };\n}\n\n// src/middleware/wrap-language-model.ts\nimport { asArray as asArray7 } from \"@ai-sdk/provider-utils\";\nvar wrapLanguageModel = ({\n model: inputModel,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n const model = asLanguageModelV4(inputModel);\n return [...asArray7(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap = ({\n model,\n middleware: {\n transformParams,\n wrapGenerate,\n wrapStream,\n overrideProvider,\n overrideModelId,\n overrideSupportedUrls\n },\n modelId,\n providerId\n}) => {\n var _a22, _b, _c;\n async function doTransform({\n params,\n type\n }) {\n return transformParams ? await transformParams({ params, type, model }) : params;\n }\n return {\n specificationVersion: \"v4\",\n provider: (_a22 = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _a22 : model.provider,\n modelId: (_b = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _b : model.modelId,\n supportedUrls: (_c = overrideSupportedUrls == null ? void 0 : overrideSupportedUrls({ model })) != null ? _c : model.supportedUrls,\n async doGenerate(params) {\n const transformedParams = await doTransform({ params, type: \"generate\" });\n const doGenerate = async () => await model.doGenerate(transformedParams);\n const doStream = async () => await model.doStream(transformedParams);\n return wrapGenerate ? await wrapGenerate({\n doGenerate,\n doStream,\n params: transformedParams,\n model\n }) : await doGenerate();\n },\n async doStream(params) {\n const transformedParams = await doTransform({ params, type: \"stream\" });\n const doGenerate = async () => await model.doGenerate(transformedParams);\n const doStream = async () => await model.doStream(transformedParams);\n return wrapStream ? await wrapStream({\n doGenerate,\n doStream,\n params: transformedParams,\n model\n }) : await doStream();\n }\n };\n};\n\n// src/middleware/wrap-embedding-model.ts\nimport { asArray as asArray8 } from \"@ai-sdk/provider-utils\";\nvar wrapEmbeddingModel = ({\n model: inputModel,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n const model = asEmbeddingModelV4(inputModel);\n return [...asArray8(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap2({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap2 = ({\n model,\n middleware: {\n transformParams,\n wrapEmbed,\n overrideProvider,\n overrideModelId,\n overrideMaxEmbeddingsPerCall,\n overrideSupportsParallelCalls\n },\n modelId,\n providerId\n}) => {\n var _a22, _b, _c, _d;\n async function doTransform({\n params\n }) {\n return transformParams ? await transformParams({ params, model }) : params;\n }\n return {\n specificationVersion: \"v4\",\n provider: (_a22 = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _a22 : model.provider,\n modelId: (_b = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _b : model.modelId,\n maxEmbeddingsPerCall: (_c = overrideMaxEmbeddingsPerCall == null ? void 0 : overrideMaxEmbeddingsPerCall({ model })) != null ? _c : model.maxEmbeddingsPerCall,\n supportsParallelCalls: (_d = overrideSupportsParallelCalls == null ? void 0 : overrideSupportsParallelCalls({ model })) != null ? _d : model.supportsParallelCalls,\n async doEmbed(params) {\n const transformedParams = await doTransform({ params });\n const doEmbed = async () => await model.doEmbed(transformedParams);\n return wrapEmbed ? await wrapEmbed({\n doEmbed,\n params: transformedParams,\n model\n }) : await doEmbed();\n }\n };\n};\n\n// src/middleware/wrap-image-model.ts\nimport { asArray as asArray9 } from \"@ai-sdk/provider-utils\";\nvar wrapImageModel = ({\n model: inputModel,\n middleware: middlewareArg,\n modelId,\n providerId\n}) => {\n const model = asImageModelV4(inputModel);\n return [...asArray9(middlewareArg)].reverse().reduce((wrappedModel, middleware) => {\n return doWrap3({ model: wrappedModel, middleware, modelId, providerId });\n }, model);\n};\nvar doWrap3 = ({\n model,\n middleware: {\n transformParams,\n wrapGenerate,\n overrideProvider,\n overrideModelId,\n overrideMaxImagesPerCall\n },\n modelId,\n providerId\n}) => {\n var _a22, _b, _c;\n async function doTransform({ params }) {\n return transformParams ? await transformParams({ params, model }) : params;\n }\n const maxImagesPerCallRaw = (_a22 = overrideMaxImagesPerCall == null ? void 0 : overrideMaxImagesPerCall({ model })) != null ? _a22 : model.maxImagesPerCall;\n const maxImagesPerCall = maxImagesPerCallRaw instanceof Function ? maxImagesPerCallRaw.bind(model) : maxImagesPerCallRaw;\n return {\n specificationVersion: \"v4\",\n provider: (_b = providerId != null ? providerId : overrideProvider == null ? void 0 : overrideProvider({ model })) != null ? _b : model.provider,\n modelId: (_c = modelId != null ? modelId : overrideModelId == null ? void 0 : overrideModelId({ model })) != null ? _c : model.modelId,\n maxImagesPerCall,\n async doGenerate(params) {\n const transformedParams = await doTransform({ params });\n const doGenerate = async () => await model.doGenerate(transformedParams);\n return wrapGenerate ? await wrapGenerate({\n doGenerate,\n params: transformedParams,\n model\n }) : await doGenerate();\n }\n };\n};\n\n// src/middleware/wrap-provider.ts\nfunction wrapProvider({\n provider,\n languageModelMiddleware,\n imageModelMiddleware\n}) {\n const providerV4 = asProviderV4(provider);\n return {\n specificationVersion: \"v4\",\n languageModel: (modelId) => wrapLanguageModel({\n model: providerV4.languageModel(modelId),\n middleware: languageModelMiddleware\n }),\n embeddingModel: providerV4.embeddingModel,\n imageModel: (modelId) => {\n let model = providerV4.imageModel(modelId);\n if (imageModelMiddleware != null) {\n model = wrapImageModel({ model, middleware: imageModelMiddleware });\n }\n return model;\n },\n transcriptionModel: providerV4.transcriptionModel,\n speechModel: providerV4.speechModel,\n rerankingModel: providerV4.rerankingModel\n };\n}\n\n// src/realtime/audio-utils.ts\nfunction encodeRealtimeAudio(float32Array) {\n const buffer = new ArrayBuffer(float32Array.length * 2);\n const view = new DataView(buffer);\n for (let i = 0; i < float32Array.length; i++) {\n const s = Math.max(-1, Math.min(1, float32Array[i]));\n view.setInt16(i * 2, s < 0 ? s * 32768 : s * 32767, true);\n }\n const bytes = new Uint8Array(buffer);\n const chunkSize = 32768;\n let binary = \"\";\n for (let i = 0; i < bytes.length; i += chunkSize) {\n const chunk = bytes.subarray(i, i + chunkSize);\n binary += String.fromCharCode(...chunk);\n }\n return btoa(binary);\n}\nfunction decodeRealtimeAudio(base64Audio) {\n const binaryString = atob(base64Audio);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const pcm16 = new Int16Array(bytes.buffer);\n const float32 = new Float32Array(pcm16.length);\n for (let i = 0; i < pcm16.length; i++) {\n float32[i] = pcm16[i] / 32768;\n }\n return float32;\n}\nfunction resampleAudio(input, inputRate, outputRate) {\n if (inputRate === outputRate) {\n return input;\n }\n const ratio = inputRate / outputRate;\n const outputLength = Math.round(input.length / ratio);\n const output = new Float32Array(outputLength);\n for (let i = 0; i < outputLength; i++) {\n const srcIndex = i * ratio;\n const srcIndexFloor = Math.floor(srcIndex);\n const srcIndexCeil = Math.min(srcIndexFloor + 1, input.length - 1);\n const fraction = srcIndex - srcIndexFloor;\n output[i] = input[srcIndexFloor] * (1 - fraction) + input[srcIndexCeil] * fraction;\n }\n return output;\n}\n\n// src/realtime/get-realtime-tool-definitions.ts\nimport {\n asSchema as asSchema7\n} from \"@ai-sdk/provider-utils\";\nasync function getRealtimeToolDefinitions({\n tools,\n toolsContext = {}\n}) {\n const definitions = [];\n for (const [name22, tool2] of Object.entries(tools)) {\n const toolType = tool2.type;\n switch (toolType) {\n case void 0:\n case \"function\":\n case \"dynamic\": {\n const description = resolveRealtimeToolDescription({\n tool: tool2,\n toolName: name22,\n toolsContext\n });\n definitions.push({\n type: \"function\",\n name: name22,\n description,\n parameters: await asSchema7(tool2.inputSchema).jsonSchema\n });\n break;\n }\n case \"provider\":\n break;\n default: {\n const exhaustiveCheck = toolType;\n throw new Error(`Unsupported tool type: ${exhaustiveCheck}`);\n }\n }\n }\n return definitions;\n}\nfunction resolveRealtimeToolDescription({\n tool: tool2,\n toolName,\n toolsContext\n}) {\n return tool2.description === void 0 ? void 0 : typeof tool2.description === \"string\" ? tool2.description : tool2.description({\n context: toolsContext[toolName]\n });\n}\n\n// src/realtime/browser-realtime-audio.ts\nvar BrowserRealtimeAudio = class {\n constructor(options) {\n this.captureContext = null;\n this.captureProcessor = null;\n this.captureSource = null;\n this.captureStream = null;\n this.playbackContext = null;\n this.playbackQueue = [];\n this.playbackTime = 0;\n this.playbackStartTime = 0;\n this.activeSources = /* @__PURE__ */ new Set();\n this.isPlaying = false;\n this.captureSampleRate = options.captureSampleRate;\n this.playbackSampleRate = options.playbackSampleRate;\n this.onAudio = options.onAudio;\n this.onPlayingChange = options.onPlayingChange;\n this.onCapturingChange = options.onCapturingChange;\n }\n ensurePlaybackContext() {\n if (this.playbackContext == null) {\n this.playbackContext = new AudioContext({\n sampleRate: this.playbackSampleRate\n });\n }\n }\n startCapture(stream) {\n const ctx = new AudioContext({ sampleRate: this.captureSampleRate });\n this.captureContext = ctx;\n this.captureStream = stream;\n const source = ctx.createMediaStreamSource(stream);\n this.captureSource = source;\n const processor = ctx.createScriptProcessor(4096, 1, 1);\n this.captureProcessor = processor;\n processor.onaudioprocess = (event) => {\n const inputData = event.inputBuffer.getChannelData(0);\n const samples = resampleAudio(\n new Float32Array(inputData),\n ctx.sampleRate,\n this.captureSampleRate\n );\n this.onAudio(encodeRealtimeAudio(samples));\n };\n source.connect(processor);\n processor.connect(ctx.destination);\n this.onCapturingChange(true);\n }\n stopCapture() {\n var _a22, _b, _c, _d;\n (_a22 = this.captureProcessor) == null ? void 0 : _a22.disconnect();\n (_b = this.captureSource) == null ? void 0 : _b.disconnect();\n void ((_c = this.captureContext) == null ? void 0 : _c.close());\n (_d = this.captureStream) == null ? void 0 : _d.getTracks().forEach((track) => track.stop());\n this.captureProcessor = null;\n this.captureSource = null;\n this.captureContext = null;\n this.captureStream = null;\n this.onCapturingChange(false);\n }\n playAudio(base64Audio) {\n this.ensurePlaybackContext();\n this.playbackQueue.push(decodeRealtimeAudio(base64Audio));\n this.schedulePlayback();\n }\n stopPlayback() {\n this.playbackQueue = [];\n for (const source of this.activeSources) {\n try {\n source.stop();\n } catch (e) {\n }\n }\n this.activeSources.clear();\n if (this.playbackContext != null) {\n this.playbackTime = this.playbackContext.currentTime;\n }\n this.setPlaying(false);\n }\n getPlaybackOffsetMs() {\n const ctx = this.playbackContext;\n if (ctx == null)\n return 0;\n return (ctx.currentTime - this.playbackStartTime) * 1e3;\n }\n dispose() {\n var _a22;\n this.stopCapture();\n this.stopPlayback();\n void ((_a22 = this.playbackContext) == null ? void 0 : _a22.close());\n this.playbackContext = null;\n }\n setPlaying(isPlaying) {\n var _a22, _b;\n if (isPlaying && !this.isPlaying) {\n this.playbackStartTime = (_b = (_a22 = this.playbackContext) == null ? void 0 : _a22.currentTime) != null ? _b : 0;\n }\n if (this.isPlaying !== isPlaying) {\n this.isPlaying = isPlaying;\n this.onPlayingChange(isPlaying);\n }\n }\n schedulePlayback() {\n const ctx = this.playbackContext;\n if (ctx == null || this.playbackQueue.length === 0)\n return;\n while (this.playbackQueue.length > 0) {\n const samples = this.playbackQueue.shift();\n const buffer = ctx.createBuffer(\n 1,\n samples.length,\n this.playbackSampleRate\n );\n buffer.getChannelData(0).set(samples);\n const source = ctx.createBufferSource();\n source.buffer = buffer;\n source.connect(ctx.destination);\n const startTime = Math.max(this.playbackTime, ctx.currentTime);\n source.start(startTime);\n this.playbackTime = startTime + buffer.duration;\n this.activeSources.add(source);\n this.setPlaying(true);\n source.onended = () => {\n this.activeSources.delete(source);\n if (this.playbackQueue.length === 0 && this.activeSources.size === 0) {\n this.setPlaying(false);\n }\n };\n }\n }\n};\n\n// src/realtime/browser-realtime-transport.ts\nimport { safeParseJSON as safeParseJSON5 } from \"@ai-sdk/provider-utils\";\nvar BrowserRealtimeTransport = class {\n constructor(options) {\n this.ws = null;\n this.sendQueue = Promise.resolve();\n this.model = options.model;\n this.onServerEvent = options.onServerEvent;\n this.onError = options.onError;\n this.onClose = options.onClose;\n }\n connect({\n token,\n url,\n onOpen\n }) {\n var _a22;\n (_a22 = this.ws) == null ? void 0 : _a22.close();\n this.ws = null;\n const wsConfig = this.model.getWebSocketConfig({ token, url });\n const ws = new WebSocket(wsConfig.url, wsConfig.protocols);\n this.ws = ws;\n ws.onopen = () => {\n if (this.ws !== ws)\n return;\n onOpen();\n };\n ws.onmessage = (messageEvent) => {\n void this.handleMessage(messageEvent);\n };\n ws.onerror = () => {\n this.onError(new Error(\"WebSocket connection error\"));\n };\n ws.onclose = () => {\n if (this.ws === ws) {\n this.ws = null;\n this.onClose();\n }\n };\n }\n disconnect() {\n var _a22;\n (_a22 = this.ws) == null ? void 0 : _a22.close();\n this.ws = null;\n }\n sendEvent(event) {\n this.sendQueue = this.sendQueue.then(async () => {\n const serialized = await this.model.serializeClientEvent(event);\n if (serialized != null) {\n this.sendRaw(serialized);\n }\n }).catch((error) => {\n this.onError(\n error instanceof Error ? error : new Error(`Failed to send realtime event: ${String(error)}`)\n );\n });\n }\n sendRaw(data) {\n var _a22;\n if (((_a22 = this.ws) == null ? void 0 : _a22.readyState) === WebSocket.OPEN) {\n if (typeof data === \"string\" || data instanceof ArrayBuffer || ArrayBuffer.isView(data) || data instanceof Blob) {\n this.ws.send(data);\n } else {\n this.ws.send(JSON.stringify(data));\n }\n }\n }\n dispose() {\n this.disconnect();\n }\n async handleMessage(messageEvent) {\n let text2;\n if (typeof messageEvent.data === \"string\") {\n text2 = messageEvent.data;\n } else if (messageEvent.data instanceof Blob) {\n text2 = await messageEvent.data.text();\n } else {\n text2 = new TextDecoder().decode(messageEvent.data);\n }\n const parseResult = await safeParseJSON5({ text: text2 });\n if (!parseResult.success)\n return;\n const rawEvent = parseResult.value;\n if (this.model.getHealthCheckResponse != null) {\n const autoResponse = this.model.getHealthCheckResponse(rawEvent);\n if (autoResponse != null) {\n this.sendRaw(autoResponse);\n }\n }\n const result = this.model.parseServerEvent(rawEvent);\n const events = Array.isArray(result) ? result : [result];\n for (const event of events) {\n await this.onServerEvent(event);\n }\n }\n};\n\n// src/realtime/realtime-event-reducer.ts\nimport { safeParseJSON as safeParseJSON6 } from \"@ai-sdk/provider-utils\";\nfunction createInitialRealtimeState() {\n return {\n status: \"disconnected\",\n messages: [],\n events: [],\n isCapturing: false,\n isPlaying: false\n };\n}\nvar RealtimeEventReducer = class {\n constructor(maxEvents = 500) {\n this.maxEvents = maxEvents;\n this.currentAssistantMessageId = null;\n this.textAccumulators = /* @__PURE__ */ new Map();\n this.toolArgAccumulators = /* @__PURE__ */ new Map();\n this.toolCallIdToMessageId = /* @__PURE__ */ new Map();\n this.toolCallIdToName = /* @__PURE__ */ new Map();\n this.inputAudioMessageInsertIndex = /* @__PURE__ */ new Map();\n this.itemIdToPartLocation = /* @__PURE__ */ new Map();\n }\n setStatus(state, status) {\n return { ...state, status };\n }\n setCapturing(state, isCapturing) {\n return { ...state, isCapturing };\n }\n setPlaying(state, isPlaying) {\n return { ...state, isPlaying };\n }\n addUserTextMessage(state, text2) {\n return {\n ...state,\n messages: [\n ...state.messages,\n {\n id: `user-${Date.now()}`,\n role: \"user\",\n parts: [{ type: \"text\", text: text2, state: \"done\" }]\n }\n ]\n };\n }\n addToolOutput(state, callId, result) {\n return {\n state: this.updateToolPartState(state, callId, result),\n output: {\n callId,\n name: this.toolCallIdToName.get(callId),\n output: JSON.stringify(result)\n }\n };\n }\n async reduceServerEvent(state, event) {\n var _a22;\n let nextState = this.pushEvent(state, event);\n const effects = [];\n switch (event.type) {\n case \"session-created\":\n case \"session-updated\": {\n if (nextState.status === \"connecting\") {\n nextState = this.setStatus(nextState, \"connected\");\n }\n break;\n }\n case \"audio-delta\": {\n effects.push({\n type: \"play-audio\",\n itemId: event.itemId,\n delta: event.delta\n });\n break;\n }\n case \"audio-committed\": {\n if (event.itemId != null) {\n this.inputAudioMessageInsertIndex.set(\n event.itemId,\n nextState.messages.length\n );\n }\n break;\n }\n case \"audio-transcript-delta\":\n case \"text-delta\": {\n nextState = this.appendTextDelta(nextState, event.itemId, event.delta);\n break;\n }\n case \"audio-transcript-done\": {\n nextState = this.finalizeText(\n nextState,\n event.itemId,\n event.transcript\n );\n break;\n }\n case \"text-done\": {\n nextState = this.finalizeText(nextState, event.itemId, event.text);\n break;\n }\n case \"input-transcription-completed\": {\n nextState = this.addInputTranscriptionMessage(\n nextState,\n event.itemId,\n event.transcript\n );\n break;\n }\n case \"response-created\":\n case \"response-done\": {\n this.currentAssistantMessageId = null;\n break;\n }\n case \"speech-started\": {\n this.currentAssistantMessageId = null;\n effects.push({ type: \"speech-started\" });\n break;\n }\n case \"function-call-arguments-delta\": {\n const { state: updatedState, messageId } = this.getOrCreateAssistantMessage(nextState);\n nextState = updatedState;\n this.toolCallIdToMessageId.set(event.callId, messageId);\n const acc = (_a22 = this.toolArgAccumulators.get(event.callId)) != null ? _a22 : \"\";\n this.toolArgAccumulators.set(event.callId, acc + event.delta);\n nextState = this.ensureToolPart(nextState, messageId, event.callId);\n break;\n }\n case \"function-call-arguments-done\": {\n this.toolArgAccumulators.delete(event.callId);\n this.toolCallIdToName.set(event.callId, event.name);\n const parseResult = await safeParseJSON6({ text: event.arguments });\n const parsedInput = parseResult.success ? parseResult.value : {};\n const messageId = this.toolCallIdToMessageId.get(event.callId);\n if (messageId != null) {\n nextState = this.markToolInputAvailable(\n nextState,\n messageId,\n event.callId,\n event.name,\n parsedInput\n );\n }\n if (!parseResult.success) {\n effects.push({\n type: \"error\",\n error: new Error(\n `Failed to parse tool arguments: ${event.arguments}`\n )\n });\n } else {\n effects.push({\n type: \"tool-call\",\n callId: event.callId,\n name: event.name,\n args: parsedInput,\n rawArguments: event.arguments\n });\n }\n break;\n }\n case \"error\": {\n effects.push({ type: \"error\", error: new Error(event.message) });\n break;\n }\n }\n return { state: nextState, effects };\n }\n pushEvent(state, event) {\n const events = [...state.events, event];\n return {\n ...state,\n events: events.length > this.maxEvents ? events.slice(-this.maxEvents) : events\n };\n }\n getOrCreateAssistantMessage(state) {\n if (this.currentAssistantMessageId != null) {\n return { state, messageId: this.currentAssistantMessageId };\n }\n const messageId = `assistant-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n this.currentAssistantMessageId = messageId;\n return {\n state: {\n ...state,\n messages: [\n ...state.messages,\n {\n id: messageId,\n role: \"assistant\",\n parts: []\n }\n ]\n },\n messageId\n };\n }\n addInputTranscriptionMessage(state, itemId, transcript) {\n var _a22;\n const messageId = `user-${itemId}`;\n const existingMessage = state.messages.find(\n (message) => message.id === messageId\n );\n if (existingMessage != null) {\n return {\n ...state,\n messages: state.messages.map(\n (message) => message.id === messageId ? {\n ...message,\n parts: [\n {\n type: \"text\",\n text: transcript,\n state: \"done\"\n }\n ]\n } : message\n )\n };\n }\n const insertIndex = Math.min(\n (_a22 = this.inputAudioMessageInsertIndex.get(itemId)) != null ? _a22 : state.messages.length,\n state.messages.length\n );\n const messages = [...state.messages];\n messages.splice(insertIndex, 0, {\n id: messageId,\n role: \"user\",\n parts: [\n {\n type: \"text\",\n text: transcript,\n state: \"done\"\n }\n ]\n });\n return {\n ...state,\n messages\n };\n }\n appendTextDelta(state, itemId, delta) {\n var _a22;\n const { state: stateWithMessage, messageId } = this.getOrCreateAssistantMessage(state);\n const acc = (_a22 = this.textAccumulators.get(itemId)) != null ? _a22 : \"\";\n const text2 = acc + delta;\n this.textAccumulators.set(itemId, text2);\n const location = this.itemIdToPartLocation.get(itemId);\n if (location != null) {\n return this.updateMessagePart(\n stateWithMessage,\n location.messageId,\n location.partIndex,\n { type: \"text\", text: text2, state: \"streaming\" }\n );\n }\n return {\n ...stateWithMessage,\n messages: stateWithMessage.messages.map((message) => {\n if (message.id !== messageId)\n return message;\n const partIndex = message.parts.length;\n this.itemIdToPartLocation.set(itemId, { messageId, partIndex });\n return {\n ...message,\n parts: [\n ...message.parts,\n { type: \"text\", text: text2, state: \"streaming\" }\n ]\n };\n })\n };\n }\n finalizeText(state, itemId, finalText) {\n var _a22;\n const text2 = (_a22 = finalText != null ? finalText : this.textAccumulators.get(itemId)) != null ? _a22 : \"\";\n this.textAccumulators.delete(itemId);\n const location = this.itemIdToPartLocation.get(itemId);\n if (location == null)\n return state;\n this.itemIdToPartLocation.delete(itemId);\n return this.updateMessagePart(\n state,\n location.messageId,\n location.partIndex,\n { type: \"text\", text: text2, state: \"done\" }\n );\n }\n ensureToolPart(state, messageId, callId) {\n return {\n ...state,\n messages: state.messages.map((message) => {\n if (message.id !== messageId)\n return message;\n const existingPart = message.parts.find(\n (part) => part.type === \"dynamic-tool\" && part.toolCallId === callId\n );\n if (existingPart != null)\n return message;\n return {\n ...message,\n parts: [\n ...message.parts,\n {\n type: \"dynamic-tool\",\n toolName: \"\",\n toolCallId: callId,\n state: \"input-streaming\",\n input: void 0\n }\n ]\n };\n })\n };\n }\n markToolInputAvailable(state, messageId, callId, name22, input) {\n return {\n ...state,\n messages: state.messages.map((message) => {\n if (message.id !== messageId)\n return message;\n return {\n ...message,\n parts: message.parts.map((part) => {\n if (part.type !== \"dynamic-tool\")\n return part;\n const toolPart = part;\n if (toolPart.toolCallId !== callId)\n return part;\n return {\n ...toolPart,\n toolName: name22,\n state: \"input-available\",\n input\n };\n })\n };\n })\n };\n }\n updateToolPartState(state, callId, result) {\n const messageId = this.toolCallIdToMessageId.get(callId);\n if (messageId == null)\n return state;\n return {\n ...state,\n messages: state.messages.map((message) => {\n if (message.id !== messageId)\n return message;\n return {\n ...message,\n parts: message.parts.map((part) => {\n if (part.type !== \"dynamic-tool\")\n return part;\n const toolPart = part;\n if (toolPart.toolCallId !== callId)\n return part;\n return {\n ...toolPart,\n state: \"output-available\",\n output: result\n };\n })\n };\n })\n };\n }\n updateMessagePart(state, messageId, partIndex, part) {\n return {\n ...state,\n messages: state.messages.map((message) => {\n if (message.id !== messageId)\n return message;\n const parts = [...message.parts];\n parts[partIndex] = part;\n return { ...message, parts };\n })\n };\n }\n};\n\n// src/realtime/realtime-session.ts\nvar AbstractRealtimeSession = class {\n constructor(options) {\n this.state = createInitialRealtimeState();\n this.currentResponseItemId = null;\n // Tool calls requested by the current (tool-bearing) response, the outputs\n // that have been submitted for them, and whether that response has finished\n // delivering its tool calls. Used to request a single response only once\n // every tool output for the turn has been submitted.\n this.toolCallsInResponse = /* @__PURE__ */ new Set();\n this.submittedToolOutputs = /* @__PURE__ */ new Set();\n this.responseToolCallsClosed = false;\n var _a22, _b, _c, _d, _e, _f, _g, _h;\n this.model = options.model;\n this.api = options.api;\n this.sessionConfig = options.sessionConfig;\n this.maxEvents = (_a22 = options.maxEvents) != null ? _a22 : 500;\n this.reducer = new RealtimeEventReducer(this.maxEvents);\n this.onToolCall = options.onToolCall;\n this.onEvent = options.onEvent;\n this.onError = options.onError;\n const sampleRate = (_b = options.sampleRate) != null ? _b : 24e3;\n const captureSampleRate = (_e = (_d = (_c = options.sessionConfig) == null ? void 0 : _c.inputAudioFormat) == null ? void 0 : _d.rate) != null ? _e : sampleRate;\n const playbackSampleRate = (_h = (_g = (_f = options.sessionConfig) == null ? void 0 : _f.outputAudioFormat) == null ? void 0 : _g.rate) != null ? _h : sampleRate;\n this.transport = new BrowserRealtimeTransport({\n model: this.model,\n onServerEvent: (event) => this.handleServerEvent(event),\n onError: (error) => {\n var _a23;\n this.applyState(this.reducer.setStatus(this.state, \"error\"));\n (_a23 = this.onError) == null ? void 0 : _a23.call(this, error);\n },\n onClose: () => {\n this.applyState(this.reducer.setStatus(this.state, \"disconnected\"));\n }\n });\n this.audio = new BrowserRealtimeAudio({\n captureSampleRate,\n playbackSampleRate,\n onAudio: (audio) => this.sendAudio(audio),\n onCapturingChange: (isCapturing) => {\n this.applyState(this.reducer.setCapturing(this.state, isCapturing));\n },\n onPlayingChange: (isPlaying) => {\n this.applyState(this.reducer.setPlaying(this.state, isPlaying));\n }\n });\n }\n // ── Connection ─────────────────────────────────────────────────────\n async connect() {\n var _a22;\n this.applyState(this.reducer.setStatus(this.state, \"connecting\"));\n try {\n const response = await fetch(this.api.token, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ sessionConfig: this.sessionConfig })\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch realtime setup: ${response.status}`);\n }\n const setupData = await response.json();\n const { token, url, tools: toolDefinitions } = setupData;\n const config = {\n ...this.sessionConfig,\n tools: toolDefinitions\n };\n this.audio.ensurePlaybackContext();\n this.transport.connect({\n token,\n url,\n onOpen: () => {\n this.sendEvent({\n type: \"session-update\",\n config\n });\n }\n });\n } catch (error) {\n this.applyState(this.reducer.setStatus(this.state, \"error\"));\n (_a22 = this.onError) == null ? void 0 : _a22.call(\n this,\n error instanceof Error ? error : new Error(`Connection failed: ${String(error)}`)\n );\n }\n }\n disconnect() {\n this.transport.disconnect();\n this.applyState(this.reducer.setStatus(this.state, \"disconnected\"));\n }\n // ── Sending events ─────────────────────────────────────────────────\n sendEvent(event) {\n this.transport.sendEvent(event);\n }\n sendTextMessage(text2) {\n this.sendEvent({\n type: \"conversation-item-create\",\n item: { type: \"text-message\", role: \"user\", text: text2 }\n });\n this.sendEvent({ type: \"response-create\" });\n this.applyState(this.reducer.addUserTextMessage(this.state, text2));\n }\n sendAudio(base64Audio) {\n this.sendEvent({ type: \"input-audio-append\", audio: base64Audio });\n }\n commitAudio() {\n this.sendEvent({ type: \"input-audio-commit\" });\n }\n clearAudioBuffer() {\n this.sendEvent({ type: \"input-audio-clear\" });\n }\n requestResponse(options) {\n this.sendEvent({\n type: \"response-create\",\n ...options != null ? { options } : {}\n });\n }\n cancelResponse() {\n this.sendEvent({ type: \"response-cancel\" });\n }\n // ── Tool output ───────────────────────────────────────────────────\n addToolOutput(callId, result) {\n const { state, output } = this.reducer.addToolOutput(\n this.state,\n callId,\n result\n );\n this.applyState(state);\n this.sendEvent({\n type: \"conversation-item-create\",\n item: {\n type: \"function-call-output\",\n callId: output.callId,\n name: output.name,\n output: output.output\n }\n });\n this.submittedToolOutputs.add(callId);\n this.maybeRequestToolResponse();\n }\n /**\n * Requests a single response once the tool-bearing response has finished\n * delivering its tool calls and every one of them has an output. Requesting a\n * response after each individual output can cause the model to continue\n * without the full tool context on multi-tool turns.\n */\n maybeRequestToolResponse() {\n if (!this.responseToolCallsClosed)\n return;\n if (this.toolCallsInResponse.size === 0)\n return;\n for (const callId of this.toolCallsInResponse) {\n if (!this.submittedToolOutputs.has(callId))\n return;\n }\n this.sendEvent({ type: \"response-create\" });\n this.toolCallsInResponse.clear();\n this.submittedToolOutputs.clear();\n this.responseToolCallsClosed = false;\n }\n // ── Audio capture ──────────────────────────────────────────────────\n startAudioCapture(stream) {\n this.audio.startCapture(stream);\n }\n stopAudioCapture() {\n this.audio.stopCapture();\n }\n // ── Playback ───────────────────────────────────────────────────────\n stopPlayback() {\n this.audio.stopPlayback();\n }\n // ── Cleanup ────────────────────────────────────────────────────────\n dispose() {\n this.transport.dispose();\n this.audio.dispose();\n this.applyState(\n this.reducer.setStatus(\n this.reducer.setPlaying(\n this.reducer.setCapturing(this.state, false),\n false\n ),\n \"disconnected\"\n )\n );\n }\n // ── Private helpers ────────────────────────────────────────────────\n applyState(nextState) {\n const previousState = this.state;\n this.state = nextState;\n if (previousState.status !== nextState.status) {\n this.setState(\"status\", nextState.status);\n }\n if (previousState.messages !== nextState.messages) {\n this.setState(\"messages\", nextState.messages);\n }\n if (previousState.events !== nextState.events) {\n this.setState(\"events\", nextState.events);\n }\n if (previousState.isCapturing !== nextState.isCapturing) {\n this.setState(\"isCapturing\", nextState.isCapturing);\n }\n if (previousState.isPlaying !== nextState.isPlaying) {\n this.setState(\"isPlaying\", nextState.isPlaying);\n }\n }\n async executeToolCall({\n name: name22,\n args,\n callId\n }) {\n var _a22, _b;\n if (this.onToolCall == null) {\n (_a22 = this.onError) == null ? void 0 : _a22.call(this, new Error(`No handler provided for tool \"${name22}\"`));\n return;\n }\n try {\n const result = await this.onToolCall({\n toolCall: { toolCallId: callId, toolName: name22, args }\n });\n if (result !== void 0) {\n this.addToolOutput(callId, result);\n }\n } catch (error) {\n (_b = this.onError) == null ? void 0 : _b.call(\n this,\n error instanceof Error ? error : new Error(`Client tool execution failed: ${String(error)}`)\n );\n }\n }\n async handleServerEvent(event) {\n var _a22;\n const result = await this.reducer.reduceServerEvent(this.state, event);\n this.applyState(result.state);\n (_a22 = this.onEvent) == null ? void 0 : _a22.call(this, event);\n for (const effect of result.effects) {\n this.handleReducerEffect(effect);\n }\n if (event.type === \"response-done\" && this.toolCallsInResponse.size > 0) {\n this.responseToolCallsClosed = true;\n this.maybeRequestToolResponse();\n }\n }\n handleReducerEffect(effect) {\n var _a22;\n switch (effect.type) {\n case \"play-audio\": {\n this.currentResponseItemId = effect.itemId;\n this.audio.playAudio(effect.delta);\n break;\n }\n case \"speech-started\": {\n if (this.state.isPlaying) {\n const playedMs = this.audio.getPlaybackOffsetMs();\n this.audio.stopPlayback();\n if (this.currentResponseItemId != null) {\n this.sendEvent({\n type: \"conversation-item-truncate\",\n itemId: this.currentResponseItemId,\n contentIndex: 0,\n audioEndMs: Math.round(playedMs)\n });\n }\n }\n break;\n }\n case \"tool-call\": {\n this.toolCallsInResponse.add(effect.callId);\n void this.executeToolCall({\n name: effect.name,\n args: effect.args,\n callId: effect.callId\n });\n break;\n }\n case \"error\": {\n (_a22 = this.onError) == null ? void 0 : _a22.call(this, effect.error);\n break;\n }\n }\n }\n};\n\n// src/registry/custom-provider.ts\nimport {\n NoSuchModelError as NoSuchModelError2\n} from \"@ai-sdk/provider\";\nfunction customProvider({\n languageModels,\n embeddingModels,\n imageModels,\n transcriptionModels,\n speechModels,\n rerankingModels,\n videoModels,\n files,\n skills,\n fallbackProvider: fallbackProviderArg\n}) {\n const fallbackProvider = fallbackProviderArg == null ? void 0 : asProviderV4(fallbackProviderArg);\n const baseProvider = {\n specificationVersion: \"v4\",\n languageModel(modelId) {\n if (languageModels != null && modelId in languageModels) {\n return resolveLanguageModel(languageModels[modelId]);\n }\n if (fallbackProvider) {\n return fallbackProvider.languageModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"languageModel\" });\n },\n embeddingModel(modelId) {\n if (embeddingModels != null && modelId in embeddingModels) {\n return resolveEmbeddingModel(embeddingModels[modelId]);\n }\n if (fallbackProvider) {\n return fallbackProvider.embeddingModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"embeddingModel\" });\n },\n imageModel(modelId) {\n if (imageModels != null && modelId in imageModels) {\n return resolveImageModel(imageModels[modelId]);\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.imageModel) {\n return fallbackProvider.imageModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"imageModel\" });\n },\n transcriptionModel(modelId) {\n if (transcriptionModels != null && modelId in transcriptionModels) {\n const model = resolveTranscriptionModel(transcriptionModels[modelId]);\n if (model != null) {\n return model;\n }\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.transcriptionModel) {\n return fallbackProvider.transcriptionModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"transcriptionModel\" });\n },\n speechModel(modelId) {\n if (speechModels != null && modelId in speechModels) {\n const model = resolveSpeechModel(speechModels[modelId]);\n if (model != null) {\n return model;\n }\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.speechModel) {\n return fallbackProvider.speechModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"speechModel\" });\n },\n rerankingModel(modelId) {\n if (rerankingModels != null && modelId in rerankingModels) {\n return resolveRerankingModel(rerankingModels[modelId]);\n }\n if (fallbackProvider == null ? void 0 : fallbackProvider.rerankingModel) {\n return fallbackProvider.rerankingModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"rerankingModel\" });\n },\n videoModel(modelId) {\n if (videoModels != null && modelId in videoModels) {\n return resolveVideoModel(videoModels[modelId]);\n }\n const videoModel = fallbackProvider == null ? void 0 : fallbackProvider.videoModel;\n if (videoModel) {\n return videoModel(modelId);\n }\n throw new NoSuchModelError2({ modelId, modelType: \"videoModel\" });\n }\n };\n const filesAndSkills = {\n ...files != null || (fallbackProvider == null ? void 0 : fallbackProvider.files) != null ? {\n files() {\n return files != null ? files : fallbackProvider.files();\n }\n } : {},\n ...skills != null || (fallbackProvider == null ? void 0 : fallbackProvider.skills) != null ? {\n skills() {\n return skills != null ? skills : fallbackProvider.skills();\n }\n } : {}\n };\n return Object.assign(baseProvider, filesAndSkills);\n}\n\n// src/registry/no-such-provider-error.ts\nimport { AISDKError as AISDKError24, NoSuchModelError as NoSuchModelError3 } from \"@ai-sdk/provider\";\nvar name21 = \"AI_NoSuchProviderError\";\nvar marker21 = `vercel.ai.error.${name21}`;\nvar symbol21 = Symbol.for(marker21);\nvar _a21;\nvar NoSuchProviderError = class extends NoSuchModelError3 {\n constructor({\n modelId,\n modelType,\n providerId,\n availableProviders,\n message = `No such provider: ${providerId} (available providers: ${availableProviders.join()})`\n }) {\n super({ errorName: name21, modelId, modelType, message });\n this[_a21] = true;\n this.providerId = providerId;\n this.availableProviders = availableProviders;\n }\n static isInstance(error) {\n return AISDKError24.hasMarker(error, marker21);\n }\n};\n_a21 = symbol21;\n\n// src/registry/provider-registry.ts\nimport {\n NoSuchModelError as NoSuchModelError4\n} from \"@ai-sdk/provider\";\nfunction createProviderRegistry(providers, {\n separator = \":\",\n languageModelMiddleware,\n imageModelMiddleware\n} = {}) {\n const registry = new DefaultProviderRegistry({\n separator,\n languageModelMiddleware,\n imageModelMiddleware\n });\n for (const [id, provider] of Object.entries(providers)) {\n registry.registerProvider({ id, provider });\n }\n return registry;\n}\nvar experimental_createProviderRegistry = createProviderRegistry;\nvar DefaultProviderRegistry = class {\n constructor({\n separator,\n languageModelMiddleware,\n imageModelMiddleware\n }) {\n this.providers = {};\n this.separator = separator;\n this.languageModelMiddleware = languageModelMiddleware;\n this.imageModelMiddleware = imageModelMiddleware;\n }\n registerProvider({\n id,\n provider\n }) {\n var _a22;\n const providerV4 = asProviderV4(provider);\n const videoModel = (_a22 = provider.videoModel) == null ? void 0 : _a22.bind(provider);\n this.providers[id] = videoModel == null ? providerV4 : Object.assign(Object.create(Object.getPrototypeOf(providerV4)), {\n ...providerV4,\n videoModel: (modelId) => asVideoModelV4(videoModel(modelId))\n });\n }\n getProvider(id, modelType) {\n const provider = this.providers[id];\n if (provider == null) {\n throw new NoSuchProviderError({\n modelId: id,\n modelType,\n providerId: id,\n availableProviders: Object.keys(this.providers)\n });\n }\n return provider;\n }\n splitId(id, modelType) {\n const index = id.indexOf(this.separator);\n if (index === -1) {\n throw new NoSuchModelError4({\n modelId: id,\n modelType,\n message: `Invalid ${modelType} id for registry: ${id} (must be in the format \"providerId${this.separator}modelId\")`\n });\n }\n return [id.slice(0, index), id.slice(index + this.separator.length)];\n }\n languageModel(id) {\n var _a22, _b;\n const [providerId, modelId] = this.splitId(id, \"languageModel\");\n let model = (_b = (_a22 = this.getProvider(providerId, \"languageModel\")).languageModel) == null ? void 0 : _b.call(\n _a22,\n modelId\n );\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"languageModel\" });\n }\n if (this.languageModelMiddleware != null) {\n model = wrapLanguageModel({\n model,\n middleware: this.languageModelMiddleware\n });\n }\n return model;\n }\n embeddingModel(id) {\n var _a22;\n const [providerId, modelId] = this.splitId(id, \"embeddingModel\");\n const provider = this.getProvider(providerId, \"embeddingModel\");\n const model = (_a22 = provider.embeddingModel) == null ? void 0 : _a22.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({\n modelId: id,\n modelType: \"embeddingModel\"\n });\n }\n return model;\n }\n imageModel(id) {\n var _a22;\n const [providerId, modelId] = this.splitId(id, \"imageModel\");\n const provider = this.getProvider(providerId, \"imageModel\");\n let model = (_a22 = provider.imageModel) == null ? void 0 : _a22.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"imageModel\" });\n }\n if (this.imageModelMiddleware != null) {\n model = wrapImageModel({\n model,\n middleware: this.imageModelMiddleware\n });\n }\n return model;\n }\n transcriptionModel(id) {\n var _a22;\n const [providerId, modelId] = this.splitId(id, \"transcriptionModel\");\n const provider = this.getProvider(providerId, \"transcriptionModel\");\n const model = (_a22 = provider.transcriptionModel) == null ? void 0 : _a22.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({\n modelId: id,\n modelType: \"transcriptionModel\"\n });\n }\n return model;\n }\n speechModel(id) {\n var _a22;\n const [providerId, modelId] = this.splitId(id, \"speechModel\");\n const provider = this.getProvider(providerId, \"speechModel\");\n const model = (_a22 = provider.speechModel) == null ? void 0 : _a22.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"speechModel\" });\n }\n return model;\n }\n rerankingModel(id) {\n var _a22;\n const [providerId, modelId] = this.splitId(id, \"rerankingModel\");\n const provider = this.getProvider(providerId, \"rerankingModel\");\n const model = (_a22 = provider.rerankingModel) == null ? void 0 : _a22.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"rerankingModel\" });\n }\n return model;\n }\n videoModel(id) {\n var _a22;\n const [providerId, modelId] = this.splitId(id, \"videoModel\");\n const provider = this.getProvider(providerId, \"videoModel\");\n const model = (_a22 = provider.videoModel) == null ? void 0 : _a22.call(provider, modelId);\n if (model == null) {\n throw new NoSuchModelError4({ modelId: id, modelType: \"videoModel\" });\n }\n return asVideoModelV4(model);\n }\n files(id) {\n var _a22;\n const provider = this.getProvider(id, \"languageModel\");\n const files = (_a22 = provider.files) == null ? void 0 : _a22.call(provider);\n if (files == null) {\n throw new Error(\n `The provider \"${id}\" does not support file uploads. Make sure it exposes a files() method.`\n );\n }\n return files;\n }\n skills(id) {\n var _a22;\n const provider = this.getProvider(id, \"languageModel\");\n const skills = (_a22 = provider.skills) == null ? void 0 : _a22.call(provider);\n if (skills == null) {\n throw new Error(\n `The provider \"${id}\" does not support skills. Make sure it exposes a skills() method.`\n );\n }\n return skills;\n }\n};\n\n// src/rerank/rerank.ts\nimport {\n createIdGenerator as createIdGenerator8\n} from \"@ai-sdk/provider-utils\";\nvar originalGenerateCallId6 = createIdGenerator8({\n prefix: \"call\",\n size: 24\n});\nasync function rerank({\n model: modelArg,\n documents,\n query,\n topN,\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n providerOptions,\n experimental_telemetry,\n telemetry = experimental_telemetry,\n onStart,\n experimental_onStart,\n onEnd,\n experimental_onEnd,\n _internal: { generateCallId = originalGenerateCallId6 } = {}\n}) {\n var _a22;\n const model = resolveRerankingModel(modelArg);\n const callId = generateCallId();\n const resolvedOnStart = onStart != null ? onStart : experimental_onStart;\n const resolvedOnEnd = onEnd != null ? onEnd : experimental_onEnd;\n const telemetryDispatcher = createTelemetryDispatcher({\n telemetry\n });\n const runInTracingChannelSpan = (_a22 = telemetryDispatcher.runInTracingChannelSpan) != null ? _a22 : async ({ execute }) => await execute();\n if (documents.length === 0) {\n await notify({\n event: {\n callId,\n operationId: \"ai.rerank\",\n provider: model.provider,\n modelId: model.modelId,\n documents,\n query,\n topN,\n maxRetries: maxRetriesArg != null ? maxRetriesArg : 2,\n headers,\n providerOptions\n },\n callbacks: [resolvedOnStart, telemetryDispatcher.onStart]\n });\n await notify({\n event: {\n callId,\n operationId: \"ai.rerank\",\n provider: model.provider,\n modelId: model.modelId,\n documents,\n query,\n ranking: [],\n warnings: [],\n providerMetadata: void 0,\n response: {\n timestamp: /* @__PURE__ */ new Date(),\n modelId: model.modelId\n }\n },\n callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd]\n });\n return new DefaultRerankResult({\n originalDocuments: [],\n ranking: [],\n providerMetadata: void 0,\n response: {\n timestamp: /* @__PURE__ */ new Date(),\n modelId: model.modelId\n }\n });\n }\n const { maxRetries, retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const documentsToSend = typeof documents[0] === \"string\" ? { type: \"text\", values: documents } : { type: \"object\", values: documents };\n const startEvent = {\n callId,\n operationId: \"ai.rerank\",\n provider: model.provider,\n modelId: model.modelId,\n documents,\n query,\n topN,\n maxRetries,\n headers,\n providerOptions\n };\n return await runInTracingChannelSpan({\n type: \"rerank\",\n event: startEvent,\n execute: async () => {\n var _a23, _b, _c, _d, _e;\n await notify({\n event: startEvent,\n callbacks: [resolvedOnStart, telemetryDispatcher.onStart]\n });\n try {\n const { ranking, response, providerMetadata, warnings } = await retry(\n async () => {\n await notify({\n event: {\n callId,\n operationId: \"ai.rerank.doRerank\",\n provider: model.provider,\n modelId: model.modelId,\n documents,\n documentsType: documentsToSend.type,\n query,\n topN\n },\n callbacks: [telemetryDispatcher.onRerankStart]\n });\n const modelResponse = await model.doRerank({\n documents: documentsToSend,\n query,\n topN,\n providerOptions,\n abortSignal,\n headers\n });\n const ranking2 = modelResponse.ranking;\n await notify({\n event: {\n callId,\n operationId: \"ai.rerank.doRerank\",\n provider: model.provider,\n modelId: model.modelId,\n documentsType: documentsToSend.type,\n ranking: ranking2\n },\n callbacks: [telemetryDispatcher.onRerankEnd]\n });\n return {\n ranking: ranking2,\n providerMetadata: modelResponse.providerMetadata,\n response: modelResponse.response,\n warnings: modelResponse.warnings\n };\n }\n );\n logWarnings({\n warnings: warnings != null ? warnings : [],\n provider: model.provider,\n model: model.modelId\n });\n await notify({\n event: {\n callId,\n operationId: \"ai.rerank\",\n provider: model.provider,\n modelId: model.modelId,\n documents,\n query,\n ranking: ranking.map((r) => ({\n originalIndex: r.index,\n score: r.relevanceScore,\n document: documents[r.index]\n })),\n warnings: warnings != null ? warnings : [],\n providerMetadata,\n response: {\n id: response == null ? void 0 : response.id,\n timestamp: (_a23 = response == null ? void 0 : response.timestamp) != null ? _a23 : /* @__PURE__ */ new Date(),\n modelId: (_b = response == null ? void 0 : response.modelId) != null ? _b : model.modelId,\n headers: response == null ? void 0 : response.headers,\n body: response == null ? void 0 : response.body\n }\n },\n callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd]\n });\n return new DefaultRerankResult({\n originalDocuments: documents,\n ranking: ranking.map((ranking2) => ({\n originalIndex: ranking2.index,\n score: ranking2.relevanceScore,\n document: documents[ranking2.index]\n })),\n providerMetadata,\n response: {\n id: response == null ? void 0 : response.id,\n timestamp: (_c = response == null ? void 0 : response.timestamp) != null ? _c : /* @__PURE__ */ new Date(),\n modelId: (_d = response == null ? void 0 : response.modelId) != null ? _d : model.modelId,\n headers: response == null ? void 0 : response.headers,\n body: response == null ? void 0 : response.body\n }\n });\n } catch (error) {\n await ((_e = telemetryDispatcher.onError) == null ? void 0 : _e.call(telemetryDispatcher, { callId, error }));\n throw error;\n }\n }\n });\n}\nvar DefaultRerankResult = class {\n constructor(options) {\n this.originalDocuments = options.originalDocuments;\n this.ranking = options.ranking;\n this.response = options.response;\n this.providerMetadata = options.providerMetadata;\n }\n get rerankedDocuments() {\n return this.ranking.map((ranking) => ranking.document);\n }\n};\n\n// src/transcribe/transcribe.ts\nimport {\n detectMediaType as detectMediaType5,\n withUserAgentSuffix as withUserAgentSuffix10\n} from \"@ai-sdk/provider-utils\";\nvar defaultDownload2 = createDownload();\nasync function transcribe({\n model,\n audio,\n providerOptions = {},\n maxRetries: maxRetriesArg,\n abortSignal,\n headers,\n download: downloadFn = defaultDownload2\n}) {\n const resolvedModel = resolveTranscriptionModel(model);\n if (!resolvedModel) {\n throw new Error(\"Model could not be resolved\");\n }\n const { retry } = prepareRetries({\n maxRetries: maxRetriesArg,\n abortSignal\n });\n const headersWithUserAgent = withUserAgentSuffix10(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const audioData = audio instanceof URL ? (await downloadFn({ url: audio, abortSignal })).data : convertDataContentToUint8Array(audio);\n const result = await retry(\n () => {\n var _a22;\n return resolvedModel.doGenerate({\n audio: audioData,\n abortSignal,\n headers: headersWithUserAgent,\n providerOptions,\n mediaType: (_a22 = detectMediaType5({\n data: audioData,\n topLevelType: \"audio\"\n })) != null ? _a22 : \"audio/wav\"\n });\n }\n );\n logWarnings({\n warnings: result.warnings,\n provider: resolvedModel.provider,\n model: resolvedModel.modelId\n });\n if (!result.text) {\n throw new NoTranscriptGeneratedError({ responses: [result.response] });\n }\n return new DefaultTranscriptionResult({\n text: result.text,\n segments: result.segments,\n language: result.language,\n durationInSeconds: result.durationInSeconds,\n warnings: result.warnings,\n responses: [result.response],\n providerMetadata: result.providerMetadata\n });\n}\nvar DefaultTranscriptionResult = class {\n constructor(options) {\n var _a22;\n this.text = options.text;\n this.segments = options.segments;\n this.language = options.language;\n this.durationInSeconds = options.durationInSeconds;\n this.warnings = options.warnings;\n this.responses = options.responses;\n this.providerMetadata = (_a22 = options.providerMetadata) != null ? _a22 : {};\n }\n};\n\n// src/transcribe/stream-transcribe.ts\nimport {\n UnsupportedFunctionalityError as UnsupportedFunctionalityError4\n} from \"@ai-sdk/provider\";\nimport {\n DelayedPromise as DelayedPromise3,\n withUserAgentSuffix as withUserAgentSuffix11\n} from \"@ai-sdk/provider-utils\";\nfunction streamTranscribe({\n model,\n audio,\n inputAudioFormat,\n providerOptions = {},\n abortSignal,\n headers,\n includeRawChunks,\n _internal: { currentDate = () => /* @__PURE__ */ new Date() } = {}\n}) {\n var _a22;\n const resolvedModel = resolveTranscriptionModel(model);\n if (!resolvedModel) {\n throw new Error(\"Model could not be resolved\");\n }\n const doStream = (_a22 = resolvedModel.doStream) == null ? void 0 : _a22.bind(resolvedModel);\n if (doStream == null) {\n throw new UnsupportedFunctionalityError4({\n functionality: \"streaming transcription\",\n message: `The ${resolvedModel.provider} model \"${resolvedModel.modelId}\" does not support streaming transcription.` + (typeof model === \"string\" ? \" String model IDs resolve through the global provider (AI Gateway by default). If that provider does not support streaming transcription, pass a provider model instance instead (e.g. openai.transcription('gpt-realtime-whisper')) or upgrade @ai-sdk/gateway to a version with streaming transcription support.\" : \"\")\n });\n }\n const headersWithUserAgent = withUserAgentSuffix11(\n headers != null ? headers : {},\n `ai/${VERSION}`\n );\n const textPromise = new DelayedPromise3();\n const segmentsPromise = new DelayedPromise3();\n const languagePromise = new DelayedPromise3();\n const durationInSecondsPromise = new DelayedPromise3();\n const warningsPromise = new DelayedPromise3();\n const responsesPromise = new DelayedPromise3();\n const providerMetadataPromise = new DelayedPromise3();\n const rejectPendingPromises = (error) => {\n for (const promise of [\n textPromise,\n segmentsPromise,\n languagePromise,\n durationInSecondsPromise,\n warningsPromise,\n responsesPromise,\n providerMetadataPromise\n ]) {\n if (promise.isPending()) {\n promise.reject(error);\n }\n }\n };\n const startedAt = currentDate();\n let response;\n const currentResponseMetadata = () => response != null ? response : { timestamp: startedAt, modelId: resolvedModel.modelId };\n const resolveWarnings = (warnings) => {\n warningsPromise.resolve(warnings);\n logWarnings({\n warnings,\n provider: resolvedModel.provider,\n model: resolvedModel.modelId\n });\n };\n const pipeAbortController = new AbortController();\n const transformer = {\n transform(value, controller) {\n var _a23, _b, _c, _d;\n switch (value.type) {\n case \"stream-start\": {\n resolveWarnings(value.warnings);\n break;\n }\n case \"response-metadata\": {\n response = {\n timestamp: (_a23 = value.timestamp) != null ? _a23 : currentResponseMetadata().timestamp,\n modelId: (_b = value.modelId) != null ? _b : currentResponseMetadata().modelId,\n headers: (_c = value.headers) != null ? _c : response == null ? void 0 : response.headers\n };\n break;\n }\n case \"transcript-delta\":\n case \"transcript-partial\":\n case \"transcript-final\":\n case \"raw\":\n case \"error\": {\n controller.enqueue(value);\n break;\n }\n case \"finish\": {\n if (!warningsPromise.isResolved()) {\n resolveWarnings([]);\n }\n if (!value.text) {\n throw new NoTranscriptGeneratedError({\n responses: [currentResponseMetadata()]\n });\n }\n textPromise.resolve(value.text);\n segmentsPromise.resolve(value.segments);\n languagePromise.resolve(value.language);\n durationInSecondsPromise.resolve(value.durationInSeconds);\n responsesPromise.resolve([currentResponseMetadata()]);\n providerMetadataPromise.resolve((_d = value.providerMetadata) != null ? _d : {});\n break;\n }\n }\n },\n flush() {\n if (textPromise.isPending()) {\n throw new NoTranscriptGeneratedError({\n responses: [currentResponseMetadata()]\n });\n }\n },\n cancel(reason) {\n pipeAbortController.abort(\n reason != null ? reason : new Error(\"Transcription stream was cancelled.\")\n );\n }\n };\n const transform = new TransformStream(transformer);\n void (async () => {\n var _a23, _b, _c, _d, _e;\n const result = await doStream({\n audio,\n inputAudioFormat,\n providerOptions,\n // merged so cancelling fullStream also aborts a still-pending doStream\n abortSignal: mergeAbortSignals(abortSignal, pipeAbortController.signal),\n headers: headersWithUserAgent,\n includeRawChunks\n });\n response = {\n timestamp: (_b = (_a23 = result.response) == null ? void 0 : _a23.timestamp) != null ? _b : startedAt,\n modelId: (_d = (_c = result.response) == null ? void 0 : _c.modelId) != null ? _d : resolvedModel.modelId,\n headers: (_e = result.response) == null ? void 0 : _e.headers\n };\n await result.stream.pipeTo(transform.writable, {\n signal: pipeAbortController.signal\n });\n })().catch((error) => {\n const reason = error != null ? error : new Error(\"Transcription stream was cancelled or errored.\");\n rejectPendingPromises(reason);\n audio.cancel(reason).catch(() => {\n });\n transform.writable.abort(reason).catch(() => {\n });\n });\n let streamOwner = \"unclaimed\";\n function consumeStream2() {\n if (streamOwner === \"full-stream\" || streamOwner === \"result-promises\") {\n return;\n }\n streamOwner = \"result-promises\";\n const reader = transform.readable.getReader();\n void (async () => {\n while (!(await reader.read()).done) {\n }\n })().catch(() => {\n });\n }\n function getFullStream() {\n if (streamOwner !== \"unclaimed\") {\n throw new Error(\n streamOwner === \"full-stream\" ? \"fullStream can only be accessed once.\" : \"fullStream cannot be accessed after a result promise.\"\n );\n }\n streamOwner = \"full-stream\";\n return asAsyncIterableStream(transform.readable);\n }\n return {\n get text() {\n consumeStream2();\n return textPromise.promise;\n },\n get segments() {\n consumeStream2();\n return segmentsPromise.promise;\n },\n get language() {\n consumeStream2();\n return languagePromise.promise;\n },\n get durationInSeconds() {\n consumeStream2();\n return durationInSecondsPromise.promise;\n },\n get warnings() {\n consumeStream2();\n return warningsPromise.promise;\n },\n get responses() {\n consumeStream2();\n return responsesPromise.promise;\n },\n get providerMetadata() {\n consumeStream2();\n return providerMetadataPromise.promise;\n },\n get fullStream() {\n return getFullStream();\n }\n };\n}\n\n// src/transcribe/index.ts\nvar experimental_transcribe = transcribe;\n\n// src/ui/call-completion-api.ts\nimport {\n parseJsonEventStream,\n withUserAgentSuffix as withUserAgentSuffix12,\n getRuntimeEnvironmentUserAgent as getRuntimeEnvironmentUserAgent2\n} from \"@ai-sdk/provider-utils\";\n\n// src/ui/process-text-stream.ts\nasync function processTextStream({\n stream,\n onTextPart\n}) {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n await onTextPart(value);\n }\n}\n\n// src/ui/call-completion-api.ts\nvar getOriginalFetch = () => fetch;\nasync function callCompletionApi({\n api,\n prompt,\n credentials,\n headers,\n body,\n streamProtocol = \"data\",\n setCompletion,\n setLoading,\n setError,\n setAbortController,\n onFinish,\n onError,\n fetch: fetch2 = getOriginalFetch()\n}) {\n var _a22;\n try {\n setLoading(true);\n setError(void 0);\n const abortController = new AbortController();\n setAbortController(abortController);\n setCompletion(\"\");\n const response = await fetch2(api, {\n method: \"POST\",\n body: JSON.stringify({\n prompt,\n ...body\n }),\n credentials,\n headers: withUserAgentSuffix12(\n {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n `ai-sdk/${VERSION}`,\n getRuntimeEnvironmentUserAgent2()\n ),\n signal: abortController.signal\n }).catch((err) => {\n throw err;\n });\n if (!response.ok) {\n throw new Error(\n (_a22 = await response.text()) != null ? _a22 : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n let result = \"\";\n switch (streamProtocol) {\n case \"text\": {\n await processTextStream({\n stream: response.body,\n onTextPart: (chunk) => {\n result += chunk;\n setCompletion(result);\n }\n });\n break;\n }\n case \"data\": {\n await consumeStream({\n stream: parseJsonEventStream({\n stream: response.body,\n schema: uiMessageChunkSchema\n }).pipeThrough(\n new TransformStream({\n async transform(part) {\n if (!part.success) {\n throw part.error;\n }\n const streamPart = part.value;\n if (streamPart.type === \"text-delta\") {\n result += streamPart.delta;\n setCompletion(result);\n } else if (streamPart.type === \"error\") {\n throw new Error(streamPart.errorText);\n }\n }\n })\n ),\n onError: (error) => {\n throw error;\n }\n });\n break;\n }\n default: {\n const exhaustiveCheck = streamProtocol;\n throw new Error(`Unknown stream protocol: ${exhaustiveCheck}`);\n }\n }\n if (onFinish) {\n onFinish(prompt, result);\n }\n setAbortController(null);\n return result;\n } catch (err) {\n if (err.name === \"AbortError\") {\n setAbortController(null);\n return null;\n }\n if (err instanceof Error) {\n if (onError) {\n onError(err);\n }\n }\n setError(err);\n } finally {\n setLoading(false);\n }\n}\n\n// src/ui/chat.ts\nimport {\n generateId as generateIdFunc2\n} from \"@ai-sdk/provider-utils\";\n\n// src/ui/convert-file-list-to-file-ui-parts.ts\nasync function convertFileListToFileUIParts(files) {\n if (files == null) {\n return [];\n }\n if (!globalThis.FileList || !(files instanceof globalThis.FileList)) {\n throw new Error(\"FileList is not supported in the current environment\");\n }\n return Promise.all(\n Array.from(files).map(async (file) => {\n const { name: name22, type } = file;\n const dataUrl = await new Promise((resolve3, reject) => {\n const reader = new FileReader();\n reader.onload = (readerEvent) => {\n var _a22;\n resolve3((_a22 = readerEvent.target) == null ? void 0 : _a22.result);\n };\n reader.onerror = (error) => reject(error);\n reader.readAsDataURL(file);\n });\n return {\n type: \"file\",\n mediaType: type,\n filename: name22,\n url: dataUrl\n };\n })\n );\n}\n\n// src/ui/default-chat-transport.ts\nimport { parseJsonEventStream as parseJsonEventStream2 } from \"@ai-sdk/provider-utils\";\n\n// src/ui/http-chat-transport.ts\nimport {\n normalizeHeaders,\n resolve as resolve2\n} from \"@ai-sdk/provider-utils\";\nvar HttpChatTransport = class {\n constructor({\n api = \"/api/chat\",\n credentials,\n headers,\n body,\n fetch: fetch2,\n prepareSendMessagesRequest,\n prepareReconnectToStreamRequest\n }) {\n this.api = api;\n this.credentials = credentials;\n this.headers = headers;\n this.body = body;\n this.fetch = fetch2;\n this.prepareSendMessagesRequest = prepareSendMessagesRequest;\n this.prepareReconnectToStreamRequest = prepareReconnectToStreamRequest;\n }\n async sendMessages({\n abortSignal,\n ...options\n }) {\n var _a22, _b, _c, _d, _e;\n const resolvedBody = await resolve2(this.body);\n const resolvedHeaders = await resolve2(this.headers);\n const resolvedCredentials = await resolve2(this.credentials);\n const baseHeaders = {\n ...normalizeHeaders(resolvedHeaders),\n ...normalizeHeaders(options.headers)\n };\n const preparedRequest = await ((_a22 = this.prepareSendMessagesRequest) == null ? void 0 : _a22.call(this, {\n api: this.api,\n id: options.chatId,\n messages: options.messages,\n body: { ...resolvedBody, ...options.body },\n headers: baseHeaders,\n credentials: resolvedCredentials,\n requestMetadata: options.metadata,\n trigger: options.trigger,\n messageId: options.messageId\n }));\n const api = (_b = preparedRequest == null ? void 0 : preparedRequest.api) != null ? _b : this.api;\n const headers = (preparedRequest == null ? void 0 : preparedRequest.headers) !== void 0 ? normalizeHeaders(preparedRequest.headers) : baseHeaders;\n const body = (preparedRequest == null ? void 0 : preparedRequest.body) !== void 0 ? preparedRequest.body : {\n ...resolvedBody,\n ...options.body,\n id: options.chatId,\n messages: options.messages,\n trigger: options.trigger,\n messageId: options.messageId\n };\n const credentials = (_c = preparedRequest == null ? void 0 : preparedRequest.credentials) != null ? _c : resolvedCredentials;\n const fetch2 = (_d = this.fetch) != null ? _d : globalThis.fetch;\n const response = await fetch2(api, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n body: JSON.stringify(body),\n credentials,\n signal: abortSignal\n });\n if (!response.ok) {\n throw new Error(\n (_e = await response.text()) != null ? _e : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n return this.processResponseStream(response.body);\n }\n async reconnectToStream(options) {\n var _a22, _b, _c, _d, _e;\n const resolvedBody = await resolve2(this.body);\n const resolvedHeaders = await resolve2(this.headers);\n const resolvedCredentials = await resolve2(this.credentials);\n const baseHeaders = {\n ...normalizeHeaders(resolvedHeaders),\n ...normalizeHeaders(options.headers)\n };\n const preparedRequest = await ((_a22 = this.prepareReconnectToStreamRequest) == null ? void 0 : _a22.call(this, {\n api: this.api,\n id: options.chatId,\n body: { ...resolvedBody, ...options.body },\n headers: baseHeaders,\n credentials: resolvedCredentials,\n requestMetadata: options.metadata\n }));\n const api = (_b = preparedRequest == null ? void 0 : preparedRequest.api) != null ? _b : `${this.api}/${options.chatId}/stream`;\n const headers = (preparedRequest == null ? void 0 : preparedRequest.headers) !== void 0 ? normalizeHeaders(preparedRequest.headers) : baseHeaders;\n const credentials = (_c = preparedRequest == null ? void 0 : preparedRequest.credentials) != null ? _c : resolvedCredentials;\n const fetch2 = (_d = this.fetch) != null ? _d : globalThis.fetch;\n const response = await fetch2(api, {\n method: \"GET\",\n headers,\n credentials\n });\n if (response.status === 204) {\n return null;\n }\n if (!response.ok) {\n throw new Error(\n (_e = await response.text()) != null ? _e : \"Failed to fetch the chat response.\"\n );\n }\n if (!response.body) {\n throw new Error(\"The response body is empty.\");\n }\n return this.processResponseStream(response.body);\n }\n};\n\n// src/ui/default-chat-transport.ts\nvar DefaultChatTransport = class extends HttpChatTransport {\n constructor(options = {}) {\n super(options);\n }\n processResponseStream(stream) {\n return parseJsonEventStream2({\n stream,\n schema: uiMessageChunkSchema\n }).pipeThrough(\n new TransformStream({\n async transform(chunk, controller) {\n if (!chunk.success) {\n throw chunk.error;\n }\n controller.enqueue(chunk.value);\n }\n })\n );\n }\n};\n\n// src/ui/chat.ts\nvar AbstractChat = class {\n constructor({\n generateId: generateId2 = generateIdFunc2,\n id = generateId2(),\n transport = new DefaultChatTransport(),\n messageMetadataSchema,\n dataPartSchemas,\n state,\n onError,\n onToolCall,\n onFinish,\n onData,\n sendAutomaticallyWhen\n }) {\n this.activeResponse = void 0;\n this.jobExecutor = new SerialJobExecutor();\n /**\n * Appends or replaces a user message to the chat list. This triggers the API call to fetch\n * the assistant's response.\n *\n * If a messageId is provided, the message will be replaced.\n */\n this.sendMessage = async (message, options) => {\n var _a22, _b, _c, _d;\n if (message == null) {\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a22 = this.lastMessage) == null ? void 0 : _a22.id,\n ...options\n });\n return;\n }\n let uiMessage;\n if (\"text\" in message || \"files\" in message) {\n const fileParts = Array.isArray(message.files) ? message.files : await convertFileListToFileUIParts(message.files);\n uiMessage = {\n parts: [\n ...fileParts,\n ...\"text\" in message && message.text != null ? [{ type: \"text\", text: message.text }] : []\n ]\n };\n } else {\n uiMessage = message;\n }\n if (message.messageId != null) {\n const messageIndex = this.state.messages.findIndex(\n (m) => m.id === message.messageId\n );\n if (messageIndex === -1) {\n throw new Error(`message with id ${message.messageId} not found`);\n }\n if (this.state.messages[messageIndex].role !== \"user\") {\n throw new Error(\n `message with id ${message.messageId} is not a user message`\n );\n }\n this.state.messages = this.state.messages.slice(0, messageIndex + 1);\n this.state.replaceMessage(messageIndex, {\n ...uiMessage,\n id: message.messageId,\n role: (_b = uiMessage.role) != null ? _b : \"user\",\n metadata: message.metadata\n });\n } else {\n this.state.pushMessage({\n ...uiMessage,\n id: (_c = uiMessage.id) != null ? _c : this.generateId(),\n role: (_d = uiMessage.role) != null ? _d : \"user\",\n metadata: message.metadata\n });\n }\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: message.messageId,\n ...options\n });\n };\n /**\n * Regenerate the assistant message with the provided message id.\n * If no message id is provided, the last assistant message will be regenerated.\n */\n this.regenerate = async ({\n messageId,\n ...options\n } = {}) => {\n const messageIndex = messageId == null ? this.state.messages.length - 1 : this.state.messages.findIndex((message) => message.id === messageId);\n if (messageIndex === -1) {\n throw new Error(`message ${messageId} not found`);\n }\n this.state.messages = this.state.messages.slice(\n 0,\n // if the message is a user message, we need to include it in the request:\n this.messages[messageIndex].role === \"assistant\" ? messageIndex : messageIndex + 1\n );\n await this.makeRequest({\n trigger: \"regenerate-message\",\n messageId,\n ...options\n });\n };\n /**\n * Attempt to resume an ongoing streaming response.\n */\n this.resumeStream = async (options = {}) => {\n await this.makeRequest({ trigger: \"resume-stream\", ...options });\n };\n /**\n * Clear the error state and set the status to ready if the chat is in an error state.\n */\n this.clearError = () => {\n if (this.status === \"error\") {\n this.state.error = void 0;\n this.setStatus({ status: \"ready\" });\n }\n };\n this.addToolApprovalResponse = async ({\n id,\n approved,\n reason,\n options\n }) => this.jobExecutor.run(async () => {\n const messages = this.state.messages;\n const lastMessage = messages[messages.length - 1];\n const updatePart = (part) => isToolUIPart(part) && part.state === \"approval-requested\" && part.approval.id === id ? {\n ...part,\n state: \"approval-responded\",\n approval: { ...part.approval, id, approved, reason }\n } : part;\n this.state.replaceMessage(messages.length - 1, {\n ...lastMessage,\n parts: lastMessage.parts.map(updatePart)\n });\n if (this.activeResponse) {\n this.activeResponse.state.message.parts = this.activeResponse.state.message.parts.map(updatePart);\n }\n if (this.status !== \"streaming\" && this.status !== \"submitted\" && this.sendAutomaticallyWhen) {\n this.shouldSendAutomatically().then((shouldSend) => {\n var _a22;\n if (shouldSend) {\n this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a22 = this.lastMessage) == null ? void 0 : _a22.id,\n ...options\n });\n }\n });\n }\n });\n this.addToolOutput = async ({\n state = \"output-available\",\n toolCallId,\n output,\n errorText,\n options\n }) => this.jobExecutor.run(async () => {\n const messages = this.state.messages;\n const lastMessage = messages[messages.length - 1];\n const updatePart = (part) => isToolUIPart(part) && part.toolCallId === toolCallId ? { ...part, state, output, errorText } : part;\n this.state.replaceMessage(messages.length - 1, {\n ...lastMessage,\n parts: lastMessage.parts.map(updatePart)\n });\n if (this.activeResponse) {\n this.activeResponse.state.message.parts = this.activeResponse.state.message.parts.map(updatePart);\n }\n if (this.status !== \"streaming\" && this.status !== \"submitted\" && this.sendAutomaticallyWhen) {\n this.shouldSendAutomatically().then((shouldSend) => {\n var _a22;\n if (shouldSend) {\n this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_a22 = this.lastMessage) == null ? void 0 : _a22.id,\n ...options\n });\n }\n });\n }\n });\n /** @deprecated Use addToolOutput */\n this.addToolResult = this.addToolOutput;\n /**\n * Abort the current request immediately, keep the generated tokens if any.\n */\n this.stop = async () => {\n var _a22;\n if (this.status !== \"streaming\" && this.status !== \"submitted\")\n return;\n if ((_a22 = this.activeResponse) == null ? void 0 : _a22.abortController) {\n this.activeResponse.abortController.abort();\n }\n };\n this.id = id;\n this.transport = transport;\n this.generateId = generateId2;\n this.messageMetadataSchema = messageMetadataSchema;\n this.dataPartSchemas = dataPartSchemas;\n this.state = state;\n this.onError = onError;\n this.onToolCall = onToolCall;\n this.onFinish = onFinish;\n this.onData = onData;\n this.sendAutomaticallyWhen = sendAutomaticallyWhen;\n }\n /**\n * Hook status:\n *\n * - `submitted`: The message has been sent to the API and we're awaiting the start of the response stream.\n * - `streaming`: The response is actively streaming in from the API, receiving chunks of data.\n * - `ready`: The full response has been received and processed; a new user message can be submitted.\n * - `error`: An error occurred during the API request, preventing successful completion.\n */\n get status() {\n return this.state.status;\n }\n setStatus({\n status,\n error\n }) {\n if (this.status === status)\n return;\n this.state.status = status;\n this.state.error = error;\n }\n get error() {\n return this.state.error;\n }\n get messages() {\n return this.state.messages;\n }\n get lastMessage() {\n return this.state.messages[this.state.messages.length - 1];\n }\n set messages(messages) {\n this.state.messages = messages;\n }\n async shouldSendAutomatically() {\n if (!this.sendAutomaticallyWhen)\n return false;\n const result = this.sendAutomaticallyWhen({\n messages: this.state.messages\n });\n if (result && typeof result === \"object\" && \"then\" in result) {\n return await result;\n }\n return result;\n }\n async makeRequest({\n trigger,\n metadata,\n headers,\n body,\n messageId\n }) {\n var _a22, _b;\n let resumeStream;\n if (trigger === \"resume-stream\") {\n try {\n const reconnect = await this.transport.reconnectToStream({\n chatId: this.id,\n metadata,\n headers,\n body\n });\n if (reconnect == null) {\n return;\n }\n resumeStream = reconnect;\n } catch (err) {\n if (this.onError && err instanceof Error) {\n this.onError(err);\n }\n this.setStatus({ status: \"error\", error: err });\n return;\n }\n }\n this.setStatus({ status: \"submitted\", error: void 0 });\n const lastMessage = this.lastMessage;\n let isAbort = false;\n let isDisconnect = false;\n let isError = false;\n let activeResponse;\n try {\n const response = {\n state: createStreamingUIMessageState({\n lastMessage: this.state.snapshot(lastMessage),\n messageId: this.generateId()\n }),\n abortController: new AbortController()\n };\n activeResponse = response;\n response.abortController.signal.addEventListener(\"abort\", () => {\n isAbort = true;\n });\n this.activeResponse = response;\n let stream;\n if (trigger === \"resume-stream\") {\n stream = resumeStream;\n } else {\n stream = await this.transport.sendMessages({\n chatId: this.id,\n messages: this.state.messages,\n abortSignal: response.abortController.signal,\n metadata,\n headers,\n body,\n trigger,\n messageId\n });\n }\n const runUpdateMessageJob = (job) => (\n // serialize the job execution to avoid race conditions:\n this.jobExecutor.run(\n () => job({\n state: response.state,\n write: () => {\n var _a23;\n this.setStatus({ status: \"streaming\" });\n const replaceLastMessage = response.state.message.id === ((_a23 = this.lastMessage) == null ? void 0 : _a23.id);\n if (replaceLastMessage) {\n this.state.replaceMessage(\n this.state.messages.length - 1,\n response.state.message\n );\n } else {\n this.state.pushMessage(response.state.message);\n }\n }\n })\n )\n );\n await consumeStream({\n stream: processUIMessageStream({\n stream,\n onToolCall: this.onToolCall,\n onData: this.onData,\n messageMetadataSchema: this.messageMetadataSchema,\n dataPartSchemas: this.dataPartSchemas,\n runUpdateMessageJob,\n onError: (error) => {\n throw error;\n }\n }),\n onError: (error) => {\n throw error;\n }\n });\n this.setStatus({ status: \"ready\" });\n } catch (err) {\n if (isAbort || err.name === \"AbortError\") {\n isAbort = true;\n this.setStatus({ status: \"ready\" });\n return null;\n }\n isError = true;\n if (err instanceof TypeError && (err.message.toLowerCase().includes(\"fetch\") || err.message.toLowerCase().includes(\"network\"))) {\n isDisconnect = true;\n }\n if (this.onError && err instanceof Error) {\n this.onError(err);\n }\n this.setStatus({ status: \"error\", error: err });\n } finally {\n try {\n if (activeResponse) {\n (_a22 = this.onFinish) == null ? void 0 : _a22.call(this, {\n message: activeResponse.state.message,\n messages: this.state.messages,\n isAbort,\n isDisconnect,\n isError,\n finishReason: activeResponse.state.finishReason\n });\n }\n } catch (err) {\n console.error(err);\n }\n if (this.activeResponse === activeResponse) {\n this.activeResponse = void 0;\n }\n }\n if (!isError && await this.shouldSendAutomatically()) {\n await this.makeRequest({\n trigger: \"submit-message\",\n messageId: (_b = this.lastMessage) == null ? void 0 : _b.id,\n metadata,\n headers,\n body\n });\n }\n }\n};\n\n// src/ui/direct-chat-transport.ts\nvar DirectChatTransport = class {\n constructor({\n agent,\n options,\n ...uiMessageStreamOptions\n }) {\n this.agent = agent;\n this.agentOptions = options;\n this.uiMessageStreamOptions = uiMessageStreamOptions;\n }\n async sendMessages({\n messages,\n abortSignal\n }) {\n const validatedMessages = await validateUIMessages({\n messages,\n // tools are compatible; the casting is required because the context param is\n // not available in ui messages\n tools: this.agent.tools\n });\n const modelMessages = await convertToModelMessages(validatedMessages, {\n tools: this.agent.tools\n });\n const result = await this.agent.stream({\n prompt: modelMessages,\n abortSignal,\n ...this.agentOptions !== void 0 ? { options: this.agentOptions } : {}\n });\n return toUIMessageStream({\n ...this.uiMessageStreamOptions,\n stream: result.stream,\n tools: this.agent.tools\n });\n }\n /**\n * Direct transport does not support reconnection since there is no\n * persistent server-side stream to reconnect to.\n *\n * @returns Always returns `null`\n */\n async reconnectToStream(_options) {\n return null;\n }\n};\n\n// src/ui/last-assistant-message-is-complete-with-approval-responses.ts\nfunction lastAssistantMessageIsCompleteWithApprovalResponses({\n messages\n}) {\n const message = messages[messages.length - 1];\n if (!message) {\n return false;\n }\n if (message.role !== \"assistant\") {\n return false;\n }\n const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {\n return part.type === \"step-start\" ? index : lastIndex;\n }, -1);\n const lastStepToolInvocations = message.parts.slice(lastStepStartIndex + 1).filter(isToolUIPart);\n return (\n // has at least one tool approval response\n lastStepToolInvocations.filter((part) => part.state === \"approval-responded\").length > 0 && // all tool approvals must have a response\n lastStepToolInvocations.every(\n (part) => part.state === \"output-available\" || part.state === \"output-error\" || part.state === \"approval-responded\"\n )\n );\n}\n\n// src/ui/last-assistant-message-is-complete-with-tool-calls.ts\nfunction lastAssistantMessageIsCompleteWithToolCalls({\n messages\n}) {\n const message = messages[messages.length - 1];\n if (!message) {\n return false;\n }\n if (message.role !== \"assistant\") {\n return false;\n }\n const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {\n return part.type === \"step-start\" ? index : lastIndex;\n }, -1);\n const lastStepToolInvocations = message.parts.slice(lastStepStartIndex + 1).filter(isToolUIPart).filter((part) => !part.providerExecuted);\n return lastStepToolInvocations.length > 0 && lastStepToolInvocations.every(\n (part) => part.state === \"output-available\" || part.state === \"output-error\"\n );\n}\n\n// src/ui/transform-text-to-ui-message-stream.ts\nfunction transformTextToUiMessageStream({\n stream\n}) {\n return stream.pipeThrough(\n new TransformStream({\n start(controller) {\n controller.enqueue({ type: \"start\" });\n controller.enqueue({ type: \"start-step\" });\n controller.enqueue({ type: \"text-start\", id: \"text-1\" });\n },\n async transform(part, controller) {\n controller.enqueue({ type: \"text-delta\", id: \"text-1\", delta: part });\n },\n async flush(controller) {\n controller.enqueue({ type: \"text-end\", id: \"text-1\" });\n controller.enqueue({ type: \"finish-step\" });\n controller.enqueue({ type: \"finish\" });\n }\n })\n );\n}\n\n// src/ui/text-stream-chat-transport.ts\nvar TextStreamChatTransport = class extends HttpChatTransport {\n constructor(options = {}) {\n super(options);\n }\n processResponseStream(stream) {\n return transformTextToUiMessageStream({\n stream: stream.pipeThrough(new TextDecoderStream())\n });\n }\n};\n\n// src/upload-file/upload-file.ts\nimport {\n convertBase64ToUint8Array as convertBase64ToUint8Array6,\n detectMediaType as detectMediaType6\n} from \"@ai-sdk/provider-utils\";\nasync function uploadFile({\n api,\n data: dataArg,\n mediaType: mediaTypeArg,\n filename,\n providerOptions\n}) {\n var _a22;\n const data = dataArg instanceof Uint8Array || typeof dataArg === \"string\" ? { type: \"data\", data: dataArg } : dataArg;\n const mediaType = mediaTypeArg != null ? mediaTypeArg : data.type === \"text\" ? \"text/plain\" : (_a22 = detectMediaType6({ data: data.data })) != null ? _a22 : isLikelyText(data.data) ? \"text/plain\" : \"application/octet-stream\";\n const filesApi = \"uploadFile\" in api ? api : typeof api.files === \"function\" ? api.files() : (() => {\n throw new Error(\n \"The provider does not support file uploads. Make sure it exposes a files() method.\"\n );\n })();\n const result = await filesApi.uploadFile({\n data,\n mediaType,\n filename,\n providerOptions\n });\n return new DefaultUploadFileResult({\n providerReference: result.providerReference,\n mediaType: result.mediaType,\n filename: result.filename,\n providerMetadata: result.providerMetadata,\n warnings: result.warnings\n });\n}\nvar DefaultUploadFileResult = class {\n constructor(options) {\n this.providerReference = options.providerReference;\n this.mediaType = options.mediaType;\n this.filename = options.filename;\n this.providerMetadata = options.providerMetadata;\n this.warnings = options.warnings;\n }\n};\nfunction isLikelyText(data) {\n const CHECK_LENGTH = 512;\n const BASE64_CHECK_LENGTH = Math.ceil((CHECK_LENGTH + 4) / 3) * 4;\n const bytes = typeof data === \"string\" ? convertBase64ToUint8Array6(\n data.substring(0, Math.min(data.length, BASE64_CHECK_LENGTH))\n ) : data;\n const checkLength = Math.min(bytes.length, CHECK_LENGTH);\n if (checkLength === 0)\n return false;\n for (let i = 0; i < checkLength; i++) {\n const byte = bytes[i];\n if (byte === 0 || byte < 32 && byte !== 9 && byte !== 10 && byte !== 13) {\n return false;\n }\n }\n return true;\n}\n\n// src/upload-skill/upload-skill.ts\nasync function uploadSkill({\n api,\n files,\n displayTitle,\n providerOptions\n}) {\n const skillsApi = \"uploadSkill\" in api ? api : typeof api.skills === \"function\" ? api.skills() : (() => {\n throw new Error(\n \"The provider does not support skills. Make sure it exposes a skills() method.\"\n );\n })();\n const normalizedFiles = files.map((file) => ({\n ...file,\n data: file.data instanceof Uint8Array || typeof file.data === \"string\" ? { type: \"data\", data: file.data } : file.data\n }));\n const result = await skillsApi.uploadSkill({\n files: normalizedFiles,\n displayTitle,\n providerOptions\n });\n return result;\n}\nexport {\n AISDKError22 as AISDKError,\n AI_SDK_TELEMETRY_TRACING_CHANNEL,\n APICallError,\n AbstractChat,\n DefaultChatTransport,\n DefaultGeneratedFile,\n DirectChatTransport,\n DownloadError,\n EmptyResponseBodyError,\n AbstractRealtimeSession as Experimental_AbstractRealtimeSession,\n ToolLoopAgent as Experimental_Agent,\n HttpChatTransport,\n InvalidArgumentError,\n InvalidDataContentError,\n InvalidMessageRoleError,\n InvalidPromptError,\n InvalidResponseDataError,\n InvalidStreamPartError,\n InvalidToolApprovalError,\n InvalidToolApprovalSignatureError,\n InvalidToolInputError,\n JSONParseError,\n JsonToSseTransformStream,\n LoadAPIKeyError,\n LoadSettingError,\n MessageConversionError,\n MissingToolResultsError,\n NoContentGeneratedError,\n NoImageGeneratedError,\n NoObjectGeneratedError,\n NoOutputGeneratedError,\n NoSpeechGeneratedError,\n NoSuchModelError,\n NoSuchProviderError,\n NoSuchProviderReferenceError,\n NoSuchToolError,\n NoTranscriptGeneratedError,\n NoVideoGeneratedError,\n output_exports as Output,\n RetryError,\n SerialJobExecutor,\n TextStreamChatTransport,\n TooManyEmbeddingValuesForCallError,\n ToolCallNotFoundForApprovalError,\n ToolCallRepairError,\n ToolLoopAgent,\n TypeValidationError,\n UIMessageStreamError,\n UI_MESSAGE_STREAM_HEADERS,\n UnsupportedFunctionalityError,\n UnsupportedModelVersionError,\n addToolInputExamplesMiddleware,\n asSchema8 as asSchema,\n assistantModelMessageSchema,\n callCompletionApi,\n consumeStream,\n convertDataContentToBase64String,\n convertFileListToFileUIParts,\n convertToModelMessages,\n cosineSimilarity,\n createAgentUIStream,\n createAgentUIStreamResponse,\n createDownload,\n createGateway,\n createIdGenerator9 as createIdGenerator,\n createProviderRegistry,\n createTextStreamResponse,\n createUIMessageStream,\n createUIMessageStreamResponse,\n customProvider,\n defaultEmbeddingSettingsMiddleware,\n defaultSettingsMiddleware,\n detectToolDrift,\n dynamicTool,\n embed,\n embedMany,\n experimental_createProviderRegistry,\n decodeRealtimeAudio as experimental_decodeRealtimeAudio,\n encodeRealtimeAudio as experimental_encodeRealtimeAudio,\n filterActiveTools as experimental_filterActiveTools,\n experimental_generateSpeech,\n experimental_generateVideo,\n getRealtimeToolDefinitions as experimental_getRealtimeToolDefinitions,\n resampleAudio as experimental_resampleAudio,\n streamLanguageModelCall as experimental_streamLanguageModelCall,\n streamTranscribe as experimental_streamTranscribe,\n experimental_transcribe,\n extractJsonMiddleware,\n extractReasoningMiddleware,\n fingerprintTools,\n gateway2 as gateway,\n generateId,\n generateImage,\n generateObject,\n generateSpeech,\n generateText,\n getChunkTimeoutMs,\n getStaticToolName,\n getStepTimeoutMs,\n getTextFromDataUrl,\n getToolName,\n getToolOrDynamicToolName,\n getToolTimeoutMs,\n getTotalTimeoutMs,\n hasToolCall,\n isCustomContentUIPart,\n isDataUIPart,\n isDeepEqualData,\n isDynamicToolUIPart,\n isFileUIPart,\n isLoopFinished,\n isReasoningFileUIPart,\n isReasoningUIPart,\n isStaticToolUIPart,\n isStepCount,\n isTextUIPart,\n isToolUIPart,\n jsonSchema,\n lastAssistantMessageIsCompleteWithApprovalResponses,\n lastAssistantMessageIsCompleteWithToolCalls,\n modelMessageSchema,\n parseJsonEventStream3 as parseJsonEventStream,\n parsePartialJson,\n pipeAgentUIStreamToResponse,\n pipeTextStreamToResponse,\n pipeUIMessageStreamToResponse,\n pruneMessages,\n readUIMessageStream,\n registerTelemetry,\n rerank,\n safeValidateUIMessages,\n simulateReadableStream,\n simulateStreamingMiddleware,\n smoothStream,\n isStepCount as stepCountIs,\n streamObject,\n streamText,\n systemModelMessageSchema,\n toTextStream,\n toUIMessageChunk,\n toUIMessageStream,\n tool,\n toolModelMessageSchema,\n transcribe,\n uiMessageChunkSchema,\n uploadFile,\n uploadSkill,\n userModelMessageSchema,\n validateUIMessages,\n wrapEmbeddingModel,\n wrapImageModel,\n wrapLanguageModel,\n wrapProvider,\n zodSchema3 as zodSchema\n};\n//# sourceMappingURL=index.js.map","function throttle(function_, wait) {\n\tif (typeof function_ !== 'function') {\n\t\tthrow new TypeError(`Expected the first argument to be a \\`function\\`, got \\`${typeof function_}\\`.`);\n\t}\n\n\t// TODO: Add `wait` validation too in the next major version.\n\n\tlet timeoutId;\n\tlet lastCallTime = 0;\n\n\treturn function throttled(...arguments_) { // eslint-disable-line func-names\n\t\tclearTimeout(timeoutId);\n\n\t\tconst now = Date.now();\n\t\tconst timeSinceLastCall = now - lastCallTime;\n\t\tconst delayForNextCall = wait - timeSinceLastCall;\n\n\t\tif (delayForNextCall <= 0) {\n\t\t\tlastCallTime = now;\n\t\t\tfunction_.apply(this, arguments_);\n\t\t} else {\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tlastCallTime = Date.now();\n\t\t\t\tfunction_.apply(this, arguments_);\n\t\t\t}, delayForNextCall);\n\t\t}\n\t};\n}\n\nmodule.exports = throttle;\n","var __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateGet = (obj, member, getter) => {\n __accessCheck(obj, member, \"read from private field\");\n return getter ? getter.call(obj) : member.get(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateSet = (obj, member, value, setter) => {\n __accessCheck(obj, member, \"write to private field\");\n setter ? setter.call(obj, value) : member.set(obj, value);\n return value;\n};\n\n// src/use-object.ts\nimport {\n isAbortError,\n resolve,\n normalizeHeaders,\n safeValidateTypes\n} from \"@ai-sdk/provider-utils\";\nimport {\n asSchema,\n isDeepEqualData,\n parsePartialJson\n} from \"ai\";\nimport { useCallback, useId, useRef, useState } from \"react\";\nimport useSWR from \"swr\";\nvar getOriginalFetch = () => fetch;\nfunction useObject({\n api,\n id,\n schema,\n // required, in the future we will use it for validation\n initialValue,\n fetch: fetch2,\n onError,\n onFinish,\n headers,\n credentials\n}) {\n const hookId = useId();\n const completionId = id != null ? id : hookId;\n const { data, mutate } = useSWR(\n [api, completionId],\n null,\n { fallbackData: initialValue }\n );\n const [error, setError] = useState(void 0);\n const [isLoading, setIsLoading] = useState(false);\n const abortControllerRef = useRef(null);\n const stop = useCallback(() => {\n var _a;\n try {\n (_a = abortControllerRef.current) == null ? void 0 : _a.abort();\n } catch (e) {\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n }, []);\n const submit = async (input) => {\n var _a;\n try {\n clearObject();\n setIsLoading(true);\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n const resolvedHeaders = await resolve(headers);\n const actualFetch = fetch2 != null ? fetch2 : getOriginalFetch();\n const response = await actualFetch(api, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...normalizeHeaders(resolvedHeaders)\n },\n credentials,\n signal: abortController.signal,\n body: JSON.stringify(input)\n });\n if (!response.ok) {\n throw new Error(\n (_a = await response.text()) != null ? _a : \"Failed to fetch the response.\"\n );\n }\n if (response.body == null) {\n throw new Error(\"The response body is empty.\");\n }\n let accumulatedText = \"\";\n let latestObject = void 0;\n await response.body.pipeThrough(new TextDecoderStream()).pipeTo(\n new WritableStream({\n async write(chunk) {\n accumulatedText += chunk;\n const { value } = await parsePartialJson(accumulatedText);\n const currentObject = value;\n if (!isDeepEqualData(latestObject, currentObject)) {\n latestObject = currentObject;\n mutate(currentObject);\n }\n },\n async close() {\n setIsLoading(false);\n abortControllerRef.current = null;\n if (onFinish != null) {\n const validationResult = await safeValidateTypes({\n value: latestObject,\n schema: asSchema(schema)\n });\n onFinish(\n validationResult.success ? { object: validationResult.value, error: void 0 } : { object: void 0, error: validationResult.error }\n );\n }\n }\n })\n );\n } catch (error2) {\n if (isAbortError(error2)) {\n return;\n }\n if (onError && error2 instanceof Error) {\n onError(error2);\n }\n setIsLoading(false);\n setError(error2 instanceof Error ? error2 : new Error(String(error2)));\n }\n };\n const clear = () => {\n stop();\n clearObject();\n };\n const clearObject = () => {\n setError(void 0);\n setIsLoading(false);\n mutate(void 0);\n };\n return {\n submit,\n object: data,\n error,\n isLoading,\n stop,\n clear\n };\n}\n\n// src/use-chat.ts\nimport {\n DefaultChatTransport\n} from \"ai\";\nimport { useCallback as useCallback2, useEffect, useRef as useRef2, useSyncExternalStore } from \"react\";\n\n// src/chat.react.ts\nimport {\n AbstractChat\n} from \"ai\";\n\n// src/throttle.ts\nimport throttleFunction from \"throttleit\";\nfunction throttle(fn, waitMs) {\n return waitMs != null ? throttleFunction(fn, waitMs) : fn;\n}\n\n// src/chat.react.ts\nvar _messages, _status, _error, _messagesCallbacks, _statusCallbacks, _errorCallbacks, _callMessagesCallbacks, _callStatusCallbacks, _callErrorCallbacks;\nvar ReactChatState = class {\n constructor(initialMessages = []) {\n __privateAdd(this, _messages, void 0);\n __privateAdd(this, _status, \"ready\");\n __privateAdd(this, _error, void 0);\n __privateAdd(this, _messagesCallbacks, /* @__PURE__ */ new Set());\n __privateAdd(this, _statusCallbacks, /* @__PURE__ */ new Set());\n __privateAdd(this, _errorCallbacks, /* @__PURE__ */ new Set());\n this.pushMessage = (message) => {\n __privateSet(this, _messages, __privateGet(this, _messages).concat(message));\n __privateGet(this, _callMessagesCallbacks).call(this);\n };\n this.popMessage = () => {\n __privateSet(this, _messages, __privateGet(this, _messages).slice(0, -1));\n __privateGet(this, _callMessagesCallbacks).call(this);\n };\n this.replaceMessage = (index, message) => {\n __privateSet(this, _messages, [\n ...__privateGet(this, _messages).slice(0, index),\n // We deep clone the message here to ensure the new React Compiler (currently in RC) detects deeply nested parts/metadata changes:\n this.snapshot(message),\n ...__privateGet(this, _messages).slice(index + 1)\n ]);\n __privateGet(this, _callMessagesCallbacks).call(this);\n };\n this.snapshot = (value) => structuredClone(value);\n this[\"~registerMessagesCallback\"] = (onChange, throttleWaitMs) => {\n const callback = throttleWaitMs ? throttle(onChange, throttleWaitMs) : onChange;\n __privateGet(this, _messagesCallbacks).add(callback);\n return () => {\n __privateGet(this, _messagesCallbacks).delete(callback);\n };\n };\n this[\"~registerStatusCallback\"] = (onChange) => {\n __privateGet(this, _statusCallbacks).add(onChange);\n return () => {\n __privateGet(this, _statusCallbacks).delete(onChange);\n };\n };\n this[\"~registerErrorCallback\"] = (onChange) => {\n __privateGet(this, _errorCallbacks).add(onChange);\n return () => {\n __privateGet(this, _errorCallbacks).delete(onChange);\n };\n };\n __privateAdd(this, _callMessagesCallbacks, () => {\n __privateGet(this, _messagesCallbacks).forEach((callback) => callback());\n });\n __privateAdd(this, _callStatusCallbacks, () => {\n __privateGet(this, _statusCallbacks).forEach((callback) => callback());\n });\n __privateAdd(this, _callErrorCallbacks, () => {\n __privateGet(this, _errorCallbacks).forEach((callback) => callback());\n });\n __privateSet(this, _messages, initialMessages);\n }\n get status() {\n return __privateGet(this, _status);\n }\n set status(newStatus) {\n __privateSet(this, _status, newStatus);\n __privateGet(this, _callStatusCallbacks).call(this);\n }\n get error() {\n return __privateGet(this, _error);\n }\n set error(newError) {\n __privateSet(this, _error, newError);\n __privateGet(this, _callErrorCallbacks).call(this);\n }\n get messages() {\n return __privateGet(this, _messages);\n }\n set messages(newMessages) {\n __privateSet(this, _messages, [...newMessages]);\n __privateGet(this, _callMessagesCallbacks).call(this);\n }\n};\n_messages = new WeakMap();\n_status = new WeakMap();\n_error = new WeakMap();\n_messagesCallbacks = new WeakMap();\n_statusCallbacks = new WeakMap();\n_errorCallbacks = new WeakMap();\n_callMessagesCallbacks = new WeakMap();\n_callStatusCallbacks = new WeakMap();\n_callErrorCallbacks = new WeakMap();\nvar _state;\nvar Chat = class extends AbstractChat {\n constructor({ messages, ...init }) {\n const state = new ReactChatState(messages);\n super({ ...init, state });\n __privateAdd(this, _state, void 0);\n this[\"~registerMessagesCallback\"] = (onChange, throttleWaitMs) => __privateGet(this, _state)[\"~registerMessagesCallback\"](onChange, throttleWaitMs);\n this[\"~registerStatusCallback\"] = (onChange) => __privateGet(this, _state)[\"~registerStatusCallback\"](onChange);\n this[\"~registerErrorCallback\"] = (onChange) => __privateGet(this, _state)[\"~registerErrorCallback\"](onChange);\n __privateSet(this, _state, state);\n }\n};\n_state = new WeakMap();\n\n// src/use-chat.ts\nfunction useChat({\n throttle: throttle2,\n experimental_throttle,\n resume = false,\n ...options\n} = {}) {\n const throttleWaitMs = throttle2 != null ? throttle2 : experimental_throttle;\n const latestRef = useRef2({});\n if (!(\"chat\" in options)) {\n latestRef.current = {\n onToolCall: options.onToolCall,\n onData: options.onData,\n onFinish: options.onFinish,\n onError: options.onError,\n sendAutomaticallyWhen: options.sendAutomaticallyWhen,\n transport: options.transport\n };\n }\n let defaultTransport;\n const getTransport = () => {\n var _a;\n return (_a = latestRef.current.transport) != null ? _a : defaultTransport != null ? defaultTransport : defaultTransport = new DefaultChatTransport();\n };\n const chatOptions = {\n ...options,\n transport: {\n sendMessages: (sendOptions) => getTransport().sendMessages(sendOptions),\n reconnectToStream: (reconnectOptions) => getTransport().reconnectToStream(reconnectOptions)\n },\n onToolCall: (arg) => {\n var _a, _b;\n return (_b = (_a = latestRef.current).onToolCall) == null ? void 0 : _b.call(_a, arg);\n },\n onData: (arg) => {\n var _a, _b;\n return (_b = (_a = latestRef.current).onData) == null ? void 0 : _b.call(_a, arg);\n },\n onFinish: (arg) => {\n var _a, _b;\n return (_b = (_a = latestRef.current).onFinish) == null ? void 0 : _b.call(_a, arg);\n },\n onError: (arg) => {\n var _a, _b;\n return (_b = (_a = latestRef.current).onError) == null ? void 0 : _b.call(_a, arg);\n },\n sendAutomaticallyWhen: (arg) => {\n var _a, _b, _c;\n return (_c = (_b = (_a = latestRef.current).sendAutomaticallyWhen) == null ? void 0 : _b.call(_a, arg)) != null ? _c : false;\n }\n };\n const chatRef = useRef2(\n \"chat\" in options ? options.chat : new Chat(chatOptions)\n );\n const shouldRecreateChat = \"chat\" in options && options.chat !== chatRef.current || \"id\" in options && options.id != null && chatRef.current.id !== options.id;\n if (shouldRecreateChat) {\n chatRef.current = \"chat\" in options ? options.chat : new Chat(chatOptions);\n }\n const subscribeToMessages = useCallback2(\n (update) => chatRef.current[\"~registerMessagesCallback\"](update, throttleWaitMs),\n // `chatRef.current.id` is required to trigger re-subscription when the chat ID changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [throttleWaitMs, chatRef.current.id]\n );\n const messages = useSyncExternalStore(\n subscribeToMessages,\n () => chatRef.current.messages,\n () => chatRef.current.messages\n );\n const status = useSyncExternalStore(\n chatRef.current[\"~registerStatusCallback\"],\n () => chatRef.current.status,\n () => chatRef.current.status\n );\n const error = useSyncExternalStore(\n chatRef.current[\"~registerErrorCallback\"],\n () => chatRef.current.error,\n () => chatRef.current.error\n );\n const setMessages = useCallback2(\n (messagesParam) => {\n if (typeof messagesParam === \"function\") {\n messagesParam = messagesParam(chatRef.current.messages);\n }\n chatRef.current.messages = messagesParam;\n },\n [chatRef]\n );\n useEffect(() => {\n if (resume) {\n chatRef.current.resumeStream();\n }\n }, [resume, chatRef]);\n return {\n id: chatRef.current.id,\n messages,\n setMessages,\n sendMessage: chatRef.current.sendMessage,\n regenerate: chatRef.current.regenerate,\n clearError: chatRef.current.clearError,\n stop: chatRef.current.stop,\n error,\n resumeStream: chatRef.current.resumeStream,\n status,\n /**\n * @deprecated Use `addToolOutput` instead.\n */\n addToolResult: chatRef.current.addToolOutput,\n addToolOutput: chatRef.current.addToolOutput,\n addToolApprovalResponse: chatRef.current.addToolApprovalResponse\n };\n}\n\n// src/use-completion.ts\nimport {\n callCompletionApi\n} from \"ai\";\nimport { useCallback as useCallback3, useEffect as useEffect2, useId as useId2, useRef as useRef3, useState as useState2 } from \"react\";\nimport useSWR2 from \"swr\";\nfunction useCompletion({\n api = \"/api/completion\",\n id,\n initialCompletion = \"\",\n initialInput = \"\",\n credentials,\n headers,\n body,\n streamProtocol = \"data\",\n fetch: fetch2,\n onFinish,\n onError,\n throttle: throttleWait,\n experimental_throttle\n} = {}) {\n const throttleWaitMs = throttleWait != null ? throttleWait : experimental_throttle;\n const hookId = useId2();\n const completionId = id || hookId;\n const { data, mutate } = useSWR2([api, completionId], null, {\n fallbackData: initialCompletion\n });\n const { data: isLoading = false, mutate: mutateLoading } = useSWR2(\n [completionId, \"loading\"],\n null\n );\n const [error, setError] = useState2(void 0);\n const completion = data;\n const [abortController, setAbortController] = useState2(null);\n const extraMetadataRef = useRef3({\n credentials,\n headers,\n body\n });\n useEffect2(() => {\n extraMetadataRef.current = {\n credentials,\n headers,\n body\n };\n }, [credentials, headers, body]);\n const triggerRequest = useCallback3(\n async (prompt, options) => callCompletionApi({\n api,\n prompt,\n credentials: extraMetadataRef.current.credentials,\n headers: { ...extraMetadataRef.current.headers, ...options == null ? void 0 : options.headers },\n body: {\n ...extraMetadataRef.current.body,\n ...options == null ? void 0 : options.body\n },\n streamProtocol,\n fetch: fetch2,\n // throttle streamed ui updates:\n setCompletion: throttle(\n (completion2) => mutate(completion2, false),\n throttleWaitMs\n ),\n setLoading: mutateLoading,\n setError,\n setAbortController,\n onFinish,\n onError\n }),\n [\n mutate,\n mutateLoading,\n api,\n extraMetadataRef,\n setAbortController,\n onFinish,\n onError,\n setError,\n streamProtocol,\n fetch2,\n throttleWaitMs\n ]\n );\n const stop = useCallback3(() => {\n if (abortController) {\n abortController.abort();\n setAbortController(null);\n }\n }, [abortController]);\n const setCompletion = useCallback3(\n (completion2) => {\n mutate(completion2, false);\n },\n [mutate]\n );\n const complete = useCallback3(\n async (prompt, options) => {\n return triggerRequest(prompt, options);\n },\n [triggerRequest]\n );\n const [input, setInput] = useState2(initialInput);\n const handleSubmit = useCallback3(\n (event) => {\n var _a;\n (_a = event == null ? void 0 : event.preventDefault) == null ? void 0 : _a.call(event);\n return input ? complete(input) : void 0;\n },\n [input, complete]\n );\n const handleInputChange = useCallback3(\n (e) => {\n setInput(e.target.value);\n },\n [setInput]\n );\n return {\n completion,\n complete,\n error,\n setCompletion,\n stop,\n input,\n setInput,\n handleInputChange,\n handleSubmit,\n isLoading\n };\n}\n\n// src/use-realtime.ts\nimport {\n Experimental_AbstractRealtimeSession as AbstractRealtimeSession\n} from \"ai\";\nimport { useCallback as useCallback4, useEffect as useEffect3, useRef as useRef4, useSyncExternalStore as useSyncExternalStore2 } from \"react\";\nfunction getRealtimeStoreKey(options) {\n return {\n model: options.model,\n token: options.api.token,\n sessionConfig: options.sessionConfig,\n sampleRate: options.sampleRate,\n maxEvents: options.maxEvents\n };\n}\nfunction shouldCreateRealtimeStore(currentKey, nextOptions) {\n return currentKey.model !== nextOptions.model || currentKey.token !== nextOptions.api.token || currentKey.sessionConfig !== nextOptions.sessionConfig || currentKey.sampleRate !== nextOptions.sampleRate || currentKey.maxEvents !== nextOptions.maxEvents;\n}\nvar RealtimeStore = class extends AbstractRealtimeSession {\n constructor() {\n super(...arguments);\n this.state = {\n status: \"disconnected\",\n messages: [],\n events: [],\n isCapturing: false,\n isPlaying: false\n };\n this.callbacks = {\n status: /* @__PURE__ */ new Set(),\n messages: /* @__PURE__ */ new Set(),\n events: /* @__PURE__ */ new Set(),\n isCapturing: /* @__PURE__ */ new Set(),\n isPlaying: /* @__PURE__ */ new Set()\n };\n }\n get status() {\n return this.state.status;\n }\n get messages() {\n return this.state.messages;\n }\n get events() {\n return this.state.events;\n }\n get isCapturing() {\n return this.state.isCapturing;\n }\n get isPlaying() {\n return this.state.isPlaying;\n }\n subscribe(key, onChange) {\n this.callbacks[key].add(onChange);\n return () => {\n this.callbacks[key].delete(onChange);\n };\n }\n setState(key, value) {\n this.state = { ...this.state, [key]: value };\n this.callbacks[key].forEach((callback) => callback());\n }\n pushMessage(message) {\n this.state = {\n ...this.state,\n messages: [...this.state.messages, message]\n };\n this.callbacks.messages.forEach((callback) => callback());\n }\n updateMessages(updater) {\n this.state = {\n ...this.state,\n messages: updater(this.state.messages)\n };\n this.callbacks.messages.forEach((callback) => callback());\n }\n pushEvent(event) {\n const nextEvents = [...this.state.events, event];\n this.state = {\n ...this.state,\n events: nextEvents.length > this.maxEvents ? nextEvents.slice(-this.maxEvents) : nextEvents\n };\n this.callbacks.events.forEach((callback) => callback());\n }\n};\nfunction useRealtime(options) {\n const callbacksRef = useRef4({\n onToolCall: options.onToolCall,\n onEvent: options.onEvent,\n onError: options.onError\n });\n callbacksRef.current = {\n onToolCall: options.onToolCall,\n onEvent: options.onEvent,\n onError: options.onError\n };\n const realtimeRef = useRef4(null);\n let realtimeEntry = realtimeRef.current;\n if (realtimeEntry == null || shouldCreateRealtimeStore(realtimeEntry.key, options)) {\n realtimeEntry = {\n store: new RealtimeStore({\n ...options,\n onToolCall: (...args) => {\n var _a, _b;\n return (_b = (_a = callbacksRef.current).onToolCall) == null ? void 0 : _b.call(_a, ...args);\n },\n onEvent: (...args) => {\n var _a, _b;\n return (_b = (_a = callbacksRef.current).onEvent) == null ? void 0 : _b.call(_a, ...args);\n },\n onError: (...args) => {\n var _a, _b;\n return (_b = (_a = callbacksRef.current).onError) == null ? void 0 : _b.call(_a, ...args);\n }\n }),\n key: getRealtimeStoreKey(options)\n };\n realtimeRef.current = realtimeEntry;\n } else {\n realtimeEntry.key = getRealtimeStoreKey(options);\n }\n const rt = realtimeEntry.store;\n const status = useSyncExternalStore2(\n useCallback4((cb) => rt.subscribe(\"status\", cb), [rt]),\n () => rt.status,\n () => rt.status\n );\n const messages = useSyncExternalStore2(\n useCallback4((cb) => rt.subscribe(\"messages\", cb), [rt]),\n () => rt.messages,\n () => rt.messages\n );\n const events = useSyncExternalStore2(\n useCallback4((cb) => rt.subscribe(\"events\", cb), [rt]),\n () => rt.events,\n () => rt.events\n );\n const isCapturing = useSyncExternalStore2(\n useCallback4((cb) => rt.subscribe(\"isCapturing\", cb), [rt]),\n () => rt.isCapturing,\n () => rt.isCapturing\n );\n const isPlaying = useSyncExternalStore2(\n useCallback4((cb) => rt.subscribe(\"isPlaying\", cb), [rt]),\n () => rt.isPlaying,\n () => rt.isPlaying\n );\n useEffect3(() => {\n return () => rt.dispose();\n }, [rt]);\n return {\n status,\n messages,\n events,\n isCapturing,\n isPlaying,\n connect: rt.connect.bind(rt),\n disconnect: rt.disconnect.bind(rt),\n addToolOutput: rt.addToolOutput.bind(rt),\n sendEvent: rt.sendEvent.bind(rt),\n sendTextMessage: rt.sendTextMessage.bind(rt),\n sendAudio: rt.sendAudio.bind(rt),\n commitAudio: rt.commitAudio.bind(rt),\n clearAudioBuffer: rt.clearAudioBuffer.bind(rt),\n requestResponse: rt.requestResponse.bind(rt),\n cancelResponse: rt.cancelResponse.bind(rt),\n startAudioCapture: rt.startAudioCapture.bind(rt),\n stopAudioCapture: rt.stopAudioCapture.bind(rt),\n stopPlayback: rt.stopPlayback.bind(rt)\n };\n}\nvar experimental_useRealtime = useRealtime;\n\n// src/mcp-apps/app-renderer.tsx\nimport { useEffect as useEffect5, useState as useState3 } from \"react\";\n\n// src/mcp-apps/app-frame.tsx\nimport { useEffect as useEffect4, useMemo, useRef as useRef5 } from \"react\";\n\n// src/mcp-apps/bridge.ts\nimport { isJSONObject } from \"@ai-sdk/provider\";\nvar MCP_APP_PROTOCOL_VERSION = \"2026-01-26\";\nfunction isJsonRpcMessage(value) {\n return value != null && typeof value === \"object\" && !Array.isArray(value) && \"jsonrpc\" in value && value.jsonrpc === \"2.0\";\n}\nfunction isRequest(message) {\n return \"method\" in message && \"id\" in message;\n}\nfunction isNotification(message) {\n return \"method\" in message && !(\"id\" in message);\n}\nfunction toError(error) {\n return error instanceof Error ? error : new Error(String(error));\n}\nfunction assertToolCallParams(params) {\n if (!isJSONObject(params) || typeof params.name !== \"string\") {\n throw new Error(\"Invalid tools/call params\");\n }\n return {\n name: params.name,\n arguments: isJSONObject(params.arguments) ? params.arguments : void 0\n };\n}\nfunction assertResourceReadParams(params) {\n if (!isJSONObject(params) || typeof params.uri !== \"string\") {\n throw new Error(\"Invalid resources/read params\");\n }\n if (!params.uri.startsWith(\"ui://\")) {\n throw new Error(\n `resources/read is limited to ui:// resources: ${params.uri}`\n );\n }\n return { uri: params.uri };\n}\nfunction assertOpenLinkParams(params) {\n if (!isJSONObject(params) || typeof params.url !== \"string\") {\n throw new Error(\"Invalid ui/open-link params\");\n }\n let scheme;\n try {\n scheme = new URL(params.url).protocol;\n } catch (e) {\n throw new Error(`Invalid ui/open-link url: ${params.url}`);\n }\n if (scheme !== \"https:\" && scheme !== \"http:\" && scheme !== \"mailto:\") {\n throw new Error(`Disallowed ui/open-link scheme: ${scheme}`);\n }\n return { url: params.url };\n}\nfunction assertDisplayModeParams(params) {\n if (!isJSONObject(params) || params.mode !== \"inline\" && params.mode !== \"fullscreen\" && params.mode !== \"pip\") {\n throw new Error(\"Invalid ui/request-display-mode params\");\n }\n return { mode: params.mode };\n}\nvar MCPAppBridge = class {\n constructor({\n targetWindow,\n targetOrigin = \"*\",\n handlers = {},\n hostInfo = { name: \"ai-sdk-react\", version: \"1.0.0\" },\n hostContext = { displayMode: \"inline\" }\n }) {\n this.initialized = false;\n this.pendingNotifications = [];\n this.nextRequestId = 0;\n this.pendingResponses = /* @__PURE__ */ new Map();\n this.targetWindow = targetWindow;\n this.targetOrigin = targetOrigin;\n this.handlers = handlers;\n this.hostInfo = hostInfo;\n this.hostContext = hostContext;\n }\n /**\n * Replaces the callbacks used to serve iframe requests.\n */\n setHandlers(handlers) {\n this.handlers = handlers;\n }\n /**\n * Updates host context and notifies the iframe after initialization.\n *\n * @example\n * ```ts\n * bridge.setHostContext({ theme: 'dark', displayMode: 'inline' });\n * ```\n */\n setHostContext(hostContext) {\n this.hostContext = hostContext;\n this.sendNotification({\n method: \"ui/notifications/host-context-changed\",\n params: hostContext\n });\n }\n /**\n * Whether a `message` event came from the expected proxy window and origin.\n * The origin check is skipped only when `targetOrigin` is the `'*'` default.\n * Callers that intercept events before {@link handleMessage} share this check.\n */\n acceptsEvent(event) {\n return event.source === this.targetWindow && (this.targetOrigin === \"*\" || event.origin === this.targetOrigin);\n }\n /**\n * Processes one `message` event from the sandbox proxy iframe.\n */\n handleMessage(event) {\n if (!this.acceptsEvent(event) || !isJsonRpcMessage(event.data)) {\n return;\n }\n const message = event.data;\n if (\"result\" in message || \"error\" in message) {\n this.handleResponse(message);\n return;\n }\n if (isRequest(message)) {\n void this.handleRequest(message);\n return;\n }\n if (isNotification(message)) {\n this.handleNotification(message);\n }\n }\n /**\n * Sends app HTML and sandbox settings to the sandbox proxy.\n */\n sendSandboxResourceReady(params) {\n this.post({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/sandbox-resource-ready\",\n params\n });\n }\n /**\n * Sends final tool arguments to the MCP App.\n */\n sendToolInput(input) {\n this.sendNotification({\n method: \"ui/notifications/tool-input\",\n params: { arguments: input }\n });\n }\n /**\n * Sends a completed MCP tool result to the MCP App.\n */\n sendToolResult(result) {\n this.sendNotification({\n method: \"ui/notifications/tool-result\",\n params: result\n });\n }\n /**\n * Notifies the MCP App that the related tool call was cancelled.\n */\n sendToolCancelled(reason) {\n this.sendNotification({\n method: \"ui/notifications/tool-cancelled\",\n params: reason != null ? { reason } : {}\n });\n }\n /**\n * Requests graceful teardown before the host removes the iframe.\n */\n teardownResource() {\n return this.request(\"ui/resource-teardown\", {});\n }\n /**\n * Rejects pending bridge requests and clears queued notifications.\n */\n close() {\n for (const pending of this.pendingResponses.values()) {\n pending.reject(new Error(\"MCP App bridge closed\"));\n }\n this.pendingResponses.clear();\n this.pendingNotifications = [];\n }\n /**\n * Resolves or rejects a host-initiated request when the iframe responds.\n */\n handleResponse(response) {\n const pending = this.pendingResponses.get(response.id);\n if (pending == null) {\n return;\n }\n this.pendingResponses.delete(response.id);\n if (response.error != null) {\n pending.reject(new Error(response.error.message));\n } else {\n pending.resolve(response.result);\n }\n }\n /**\n * Runs a handler for an iframe request and posts the JSON-RPC response.\n */\n async handleRequest(request) {\n var _a, _b;\n try {\n const result = await this.getRequestResult(request);\n this.post({ jsonrpc: \"2.0\", id: request.id, result });\n } catch (error) {\n const normalizedError = toError(error);\n (_b = (_a = this.handlers).onError) == null ? void 0 : _b.call(_a, normalizedError);\n this.post({\n jsonrpc: \"2.0\",\n id: request.id,\n error: { code: -32603, message: normalizedError.message }\n });\n }\n }\n /**\n * Maps supported iframe request methods to host callbacks.\n */\n async getRequestResult(request) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;\n switch (request.method) {\n case \"ui/initialize\":\n return {\n protocolVersion: MCP_APP_PROTOCOL_VERSION,\n hostCapabilities: {\n ...this.handlers.callTool != null ? { serverTools: {} } : {},\n ...this.handlers.readResource != null ? { serverResources: {} } : {},\n ...this.handlers.onLog != null ? { logging: {} } : {}\n },\n hostInfo: this.hostInfo,\n hostContext: this.hostContext\n };\n case \"tools/call\": {\n if (this.handlers.callTool == null) {\n throw new Error(\"No tools/call handler configured\");\n }\n const params = assertToolCallParams(request.params);\n if (this.handlers.allowedTools == null || !this.handlers.allowedTools.includes(params.name)) {\n throw new Error(`Tool is not app-visible: ${params.name}`);\n }\n return this.handlers.callTool(params);\n }\n case \"resources/read\":\n if (this.handlers.readResource == null) {\n throw new Error(\"No resources/read handler configured\");\n }\n return this.handlers.readResource(\n assertResourceReadParams(request.params)\n );\n case \"resources/list\":\n if (this.handlers.listResources == null) {\n throw new Error(\"No resources/list handler configured\");\n }\n return this.handlers.listResources(request.params);\n case \"ui/open-link\":\n if (this.handlers.openLink == null) {\n throw new Error(\"No ui/open-link handler configured\");\n }\n return this.handlers.openLink(assertOpenLinkParams(request.params));\n case \"ui/message\":\n return (_c = (_b = (_a = this.handlers).sendMessage) == null ? void 0 : _b.call(_a, request.params)) != null ? _c : {};\n case \"ui/update-model-context\":\n return (_f = (_e = (_d = this.handlers).updateModelContext) == null ? void 0 : _e.call(_d, request.params)) != null ? _f : {};\n case \"ui/request-display-mode\":\n return (_j = (_h = (_g = this.handlers).requestDisplayMode) == null ? void 0 : _h.call(\n _g,\n assertDisplayModeParams(request.params)\n )) != null ? _j : { mode: (_i = this.hostContext.displayMode) != null ? _i : \"inline\" };\n default:\n throw new Error(`Unsupported MCP App method: ${request.method}`);\n }\n }\n /**\n * Handles iframe lifecycle and telemetry notifications.\n */\n handleNotification(notification) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n switch (notification.method) {\n case \"ui/notifications/initialized\":\n this.initialized = true;\n this.flushNotifications();\n (_b = (_a = this.handlers).onInitialized) == null ? void 0 : _b.call(_a);\n break;\n case \"ui/notifications/size-changed\":\n (_d = (_c = this.handlers).onSizeChange) == null ? void 0 : _d.call(\n _c,\n notification.params\n );\n break;\n case \"ui/notifications/request-teardown\":\n (_f = (_e = this.handlers).onRequestTeardown) == null ? void 0 : _f.call(_e, notification.params);\n break;\n case \"notifications/message\":\n (_h = (_g = this.handlers).onLog) == null ? void 0 : _h.call(_g, notification.params);\n break;\n }\n }\n /**\n * Sends a host-to-iframe notification, queueing it until app initialization.\n */\n sendNotification(notification) {\n const message = { jsonrpc: \"2.0\", ...notification };\n if (!this.initialized && !notification.method.includes(\"sandbox\")) {\n this.pendingNotifications.push(message);\n return;\n }\n this.post(message);\n }\n /**\n * Sends notifications that were queued before `ui/notifications/initialized`.\n */\n flushNotifications() {\n const notifications = this.pendingNotifications;\n this.pendingNotifications = [];\n for (const notification of notifications) {\n this.post(notification);\n }\n }\n /**\n * Sends a host-initiated JSON-RPC request to the iframe.\n */\n request(method, params) {\n const id = this.nextRequestId++;\n this.post({ jsonrpc: \"2.0\", id, method, params });\n return new Promise((resolve2, reject) => {\n this.pendingResponses.set(id, { resolve: resolve2, reject });\n });\n }\n /**\n * Posts a JSON-RPC message to the sandbox proxy iframe.\n */\n post(message) {\n this.targetWindow.postMessage(message, this.targetOrigin);\n }\n};\n\n// src/mcp-apps/sandbox.ts\nvar ALLOWED_CSP_SCHEMES = /* @__PURE__ */ new Set([\"https:\", \"wss:\"]);\nfunction sanitizeCSPSources(sources) {\n const result = [];\n for (const source of sources != null ? sources : []) {\n if (typeof source !== \"string\") {\n continue;\n }\n let origin;\n try {\n const url = new URL(source);\n if (!ALLOWED_CSP_SCHEMES.has(url.protocol) || url.host.length === 0 || url.host === \"*\") {\n continue;\n }\n origin = url.origin;\n } catch (e) {\n continue;\n }\n if (/[\"'`\\s;,]/.test(origin)) {\n continue;\n }\n result.push(origin);\n }\n return result;\n}\nvar MCP_APP_DEFAULT_OUTER_SANDBOX = \"allow-scripts allow-same-origin allow-forms\";\nvar MCP_APP_DEFAULT_INNER_SANDBOX = \"allow-scripts allow-forms\";\nfunction getMCPAppCSP(csp) {\n if (csp == null) {\n return void 0;\n }\n const connectSrc = [\"'self'\", ...sanitizeCSPSources(csp.connectDomains)];\n const imgSrc = [\n \"'self'\",\n \"data:\",\n ...sanitizeCSPSources(csp.resourceDomains)\n ];\n const frameSrc = [\"'self'\", ...sanitizeCSPSources(csp.frameDomains)];\n return [\n \"default-src 'none'\",\n \"base-uri 'none'\",\n \"form-action 'none'\",\n \"script-src 'unsafe-inline'\",\n \"style-src 'unsafe-inline'\",\n `connect-src ${connectSrc.join(\" \")}`,\n `img-src ${imgSrc.join(\" \")}`,\n `font-src ${imgSrc.join(\" \")}`,\n `frame-src ${frameSrc.join(\" \")}`\n ].join(\"; \");\n}\nvar MCP_APP_PERMISSION_FEATURES = {\n camera: \"camera\",\n microphone: \"microphone\",\n geolocation: \"geolocation\",\n clipboardWrite: \"clipboard-write\"\n};\nfunction getMCPAppAllowAttribute(permissions, allowedPermissions) {\n if (permissions == null || allowedPermissions == null) {\n return void 0;\n }\n const allow = allowedPermissions.filter((permission) => Boolean(permissions[permission])).map((permission) => MCP_APP_PERMISSION_FEATURES[permission]);\n return allow.length > 0 ? allow.join(\"; \") : void 0;\n}\n\n// src/mcp-apps/utils.ts\nimport { isJSONObject as isJSONObject2 } from \"@ai-sdk/provider\";\nfunction getMCPAppFromToolPart(part) {\n var _a;\n const rawAppMetadata = (_a = part.toolMetadata) == null ? void 0 : _a.app;\n const appMetadata = isJSONObject2(rawAppMetadata) ? rawAppMetadata : void 0;\n if (appMetadata == null || appMetadata.mimeType !== \"text/html;profile=mcp-app\" || typeof appMetadata.resourceUri !== \"string\" || !appMetadata.resourceUri.startsWith(\"ui://\") || appMetadata.visibility != null && (!Array.isArray(appMetadata.visibility) || appMetadata.visibility.some(\n (value) => value !== \"model\" && value !== \"app\"\n ))) {\n return void 0;\n }\n return appMetadata;\n}\nfunction normalizeMCPAppToolResult(output) {\n if (output != null && typeof output === \"object\" && \"content\" in output) {\n return output;\n }\n return {\n content: [],\n structuredContent: output\n };\n}\n\n// src/mcp-apps/app-frame.tsx\nimport { jsx } from \"react/jsx-runtime\";\nfunction deriveTargetOrigin(url) {\n var _a;\n const location = typeof window !== \"undefined\" ? window.location : void 0;\n try {\n return new URL(url, location == null ? void 0 : location.href).origin;\n } catch (e) {\n return (_a = location == null ? void 0 : location.origin) != null ? _a : \"null\";\n }\n}\nfunction sendToolState({\n bridge,\n input,\n output\n}) {\n if (bridge == null) {\n return;\n }\n if (input !== void 0) {\n bridge.sendToolInput(input);\n }\n if (output !== void 0) {\n bridge.sendToolResult(normalizeMCPAppToolResult(output));\n }\n}\nfunction MCPAppFrame({\n app,\n resource,\n input,\n output,\n sandbox,\n handlers,\n hostInfo,\n hostContext\n}) {\n var _a, _b, _c, _d, _e, _f;\n const iframeRef = useRef5(null);\n const bridgeRef = useRef5(void 0);\n const inputRef = useRef5(input);\n const outputRef = useRef5(output);\n const hostContextRef = useRef5(hostContext);\n const initializedRef = useRef5(false);\n inputRef.current = input;\n outputRef.current = output;\n hostContextRef.current = hostContext;\n const sandboxUrl = String(sandbox.url);\n const targetOrigin = (_a = sandbox.targetOrigin) != null ? _a : deriveTargetOrigin(sandboxUrl);\n const resourceCSP = getMCPAppCSP((_b = resource.meta) == null ? void 0 : _b.csp);\n const resourceAllow = getMCPAppAllowAttribute(\n (_c = resource.meta) == null ? void 0 : _c.permissions,\n sandbox.allowedPermissions\n );\n const innerSandbox = (_d = sandbox.innerSandbox) != null ? _d : MCP_APP_DEFAULT_INNER_SANDBOX;\n const bridgeHandlers = useMemo(\n () => ({\n ...handlers,\n onInitialized: () => {\n var _a2;\n initializedRef.current = true;\n (_a2 = handlers == null ? void 0 : handlers.onInitialized) == null ? void 0 : _a2.call(handlers);\n sendToolState({\n bridge: bridgeRef.current,\n input: inputRef.current,\n output: outputRef.current\n });\n }\n }),\n [handlers]\n );\n const bridgeHandlersRef = useRef5(bridgeHandlers);\n bridgeHandlersRef.current = bridgeHandlers;\n useEffect4(() => {\n const iframe = iframeRef.current;\n const targetWindow = iframe == null ? void 0 : iframe.contentWindow;\n if (targetWindow == null) {\n return;\n }\n initializedRef.current = false;\n const bridge = new MCPAppBridge({\n targetWindow,\n targetOrigin,\n handlers: bridgeHandlersRef.current,\n hostInfo,\n hostContext: hostContextRef.current\n });\n bridgeRef.current = bridge;\n const onMessage = (event) => {\n var _a2;\n if (!bridge.acceptsEvent(event)) {\n return;\n }\n if (((_a2 = event.data) == null ? void 0 : _a2.jsonrpc) === \"2.0\" && event.data.method === \"ui/notifications/sandbox-proxy-ready\") {\n bridge.sendSandboxResourceReady({\n html: resource.html,\n csp: resourceCSP,\n sandbox: innerSandbox,\n allow: resourceAllow\n });\n return;\n }\n bridge.handleMessage(event);\n };\n window.addEventListener(\"message\", onMessage);\n return () => {\n initializedRef.current = false;\n window.removeEventListener(\"message\", onMessage);\n void bridge.teardownResource().catch(() => {\n });\n bridge.close();\n bridgeRef.current = void 0;\n };\n }, [\n hostInfo,\n innerSandbox,\n resource.html,\n resourceAllow,\n resourceCSP,\n sandboxUrl,\n targetOrigin\n ]);\n useEffect4(() => {\n var _a2;\n (_a2 = bridgeRef.current) == null ? void 0 : _a2.setHandlers(bridgeHandlers);\n }, [bridgeHandlers]);\n useEffect4(() => {\n var _a2;\n if (hostContext != null) {\n (_a2 = bridgeRef.current) == null ? void 0 : _a2.setHostContext(hostContext);\n }\n }, [hostContext]);\n useEffect4(() => {\n var _a2;\n if (initializedRef.current && input !== void 0) {\n (_a2 = bridgeRef.current) == null ? void 0 : _a2.sendToolInput(input);\n }\n }, [input]);\n useEffect4(() => {\n var _a2;\n if (initializedRef.current && output !== void 0) {\n (_a2 = bridgeRef.current) == null ? void 0 : _a2.sendToolResult(normalizeMCPAppToolResult(output));\n }\n }, [output]);\n return /* @__PURE__ */ jsx(\n \"iframe\",\n {\n ref: iframeRef,\n title: \"MCP App\",\n \"aria-label\": (_e = sandbox.title) != null ? _e : app.resourceUri,\n src: sandboxUrl,\n className: sandbox.className,\n style: sandbox.style,\n allow: resourceAllow,\n sandbox: (_f = sandbox.outerSandbox) != null ? _f : MCP_APP_DEFAULT_OUTER_SANDBOX\n }\n );\n}\n\n// src/mcp-apps/app-renderer.tsx\nimport { jsx as jsx2 } from \"react/jsx-runtime\";\nfunction getToolPartOutput(part) {\n return part.state === \"output-available\" ? part.output : void 0;\n}\nfunction getToolPartInput(part) {\n return part.state === \"input-available\" || part.state === \"output-available\" ? part.input : void 0;\n}\nfunction MCPAppRenderer({\n part,\n sandbox,\n resource: resourceProp,\n loadResource,\n handlers,\n hostInfo,\n hostContext,\n fallback = null\n}) {\n const app = getMCPAppFromToolPart(part);\n const [cachedApp, setCachedApp] = useState3();\n const [loadedResource, setLoadedResource] = useState3();\n useEffect5(() => {\n if (app != null) {\n setCachedApp(\n (previous) => (previous == null ? void 0 : previous.resourceUri) === app.resourceUri ? previous : app\n );\n }\n }, [app == null ? void 0 : app.resourceUri]);\n const appForRender = app != null ? app : cachedApp;\n useEffect5(() => {\n if (appForRender == null || resourceProp != null || loadResource == null) {\n return;\n }\n let cancelled = false;\n const resourceUri = appForRender.resourceUri;\n loadResource(appForRender).then((resource2) => {\n if (!cancelled) {\n setLoadedResource({ resourceUri, resource: resource2 });\n }\n }).catch((error2) => {\n if (!cancelled) {\n setLoadedResource({\n resourceUri,\n error: error2 instanceof Error ? error2 : new Error(String(error2))\n });\n }\n });\n return () => {\n cancelled = true;\n };\n }, [appForRender == null ? void 0 : appForRender.resourceUri, loadResource, resourceProp]);\n const loadedResourceForApp = (loadedResource == null ? void 0 : loadedResource.resourceUri) === (appForRender == null ? void 0 : appForRender.resourceUri) ? loadedResource : void 0;\n const resource = resourceProp != null ? resourceProp : loadedResourceForApp == null ? void 0 : loadedResourceForApp.resource;\n const error = resourceProp == null ? loadedResourceForApp == null ? void 0 : loadedResourceForApp.error : void 0;\n if (appForRender == null || error != null || resource == null) {\n return fallback;\n }\n return /* @__PURE__ */ jsx2(\n MCPAppFrame,\n {\n app: appForRender,\n resource,\n input: getToolPartInput(part),\n output: getToolPartOutput(part),\n sandbox,\n handlers,\n hostInfo,\n hostContext\n }\n );\n}\n\n// src/index.ts\nvar experimental_useObject = useObject;\nexport {\n Chat,\n MCPAppRenderer as experimental_MCPAppRenderer,\n experimental_useObject,\n experimental_useRealtime,\n useChat,\n useCompletion,\n useObject\n};\n//# sourceMappingURL=index.js.map","/**\n * A bounded FIFO buffer for multi-send. While an agent turn is streaming\n * (useChat `status !== 'ready'`) the user's sends are queued here and drained\n * one-per-turn when the turn ends — by finishing, erroring, or being stopped.\n * Once accepted, an item is never displaced by a later enqueue: capacity\n * rejects the newest proposal so its caller can keep the payload intact.\n */\nexport class AgentChatQueue<T> {\n private buffer: T[] = [];\n /** Effective cap is at least 1. */\n private readonly cap: number;\n\n constructor(max: number) {\n this.cap = Math.max(1, Math.floor(max));\n }\n\n get size(): number {\n return this.buffer.length;\n }\n\n /** Read-only snapshot of pending items, oldest first. */\n get items(): readonly T[] {\n return this.buffer;\n }\n\n /**\n * Append an item when capacity permits. Returns `false` without mutating\n * the accepted FIFO backlog when full.\n */\n enqueue(item: T): boolean {\n if (this.buffer.length >= this.cap) return false;\n this.buffer.push(item);\n return true;\n }\n\n /** Remove and return the next item (FIFO), or `null` when empty. */\n dequeueNext(): T | null {\n return this.buffer.shift() ?? null;\n }\n\n /**\n * Remove and return the first item matching `predicate`, or `null` when\n * nothing matches. Used by the queue pill's per-message remove button.\n */\n removeWhere(predicate: (item: T) => boolean): T | null {\n const index = this.buffer.findIndex(predicate);\n if (index === -1) return null;\n const [removed] = this.buffer.splice(index, 1);\n return removed ?? null;\n }\n}\n","import { z } from 'zod';\n\n/**\n * The `ask_questions` clarification payload.\n *\n * When the agent needs to narrow a request before acting it calls this tool\n * instead of writing a paragraph of questions. Rendering that call as an\n * ordinary tool step would show the customer raw JSON, so the stream mapper\n * lifts it out of the activity trace and the styled layer renders the QUESTION\n * — the same trade the companion has always made.\n *\n * The payload arrives in two shapes and both are accepted:\n *\n * 1. as the tool's INPUT — the model emits the questions in the tool-call\n * chunk and the step finishes without a result, because the customer's\n * reply IS the result, fed back as the next user message;\n * 2. as the tool's OUTPUT — an MCP server answers with a structured response\n * carrying `request_id` and per-option `{ id, label }`.\n *\n * The loose model-emitted shape is normalised into the strict rendered shape,\n * so selection state can key off stable ids no matter which shape arrived.\n */\n\nexport type AskQuestionsRequest = {\n request_id: string;\n questions: Array<{\n id: string;\n prompt: string;\n selection: 'single' | 'multiple';\n /**\n * Chips to pick from. May be empty once the \"I'll type it\" restatements\n * are dropped — the questionnaire then offers the free-text answer alone.\n */\n options: Array<{ id: string; label: string }>;\n }>;\n};\n\nconst looseOptionSchema = z.union([\n z.string(),\n z.looseObject({ id: z.string().optional(), label: z.string() }),\n]);\n\nconst looseQuestionSchema = z.looseObject({\n id: z.string().optional(),\n prompt: z.string(),\n selection: z.enum(['single', 'multiple']).default('single'),\n options: z.array(looseOptionSchema).min(1),\n});\n\nconst looseAskQuestionsSchema = z.looseObject({\n request_id: z.string().optional(),\n questions: z.array(looseQuestionSchema).min(1),\n});\n\n/** Matches the bare name and any MCP-prefixed form (`mcp__opencx__ask_questions`). */\nexport function isAskQuestionsToolName(toolName: string | undefined): boolean {\n return Boolean(toolName?.includes('ask_questions'));\n}\n\n/**\n * Chips that merely restate the \"I'll type it\" affordance the questionnaire\n * always renders. The first two catch verb-form variants; the third is\n * anchored so a bare \"Other\" is dropped while \"Other reason\" survives.\n */\nconst REDUNDANT_OPTION_PATTERNS = [\n /\\bi[’'ʼ‘]?ll\\s+(type|describe|enter|write|tell)\\b/i,\n /\\b(type|describe|enter|write|tell)\\s+(it|my\\s+own|manually)\\b/i,\n /^\\s*(other|custom|none\\s+of\\s+the\\s+above|something\\s+else)\\s*\\.?\\s*$/i,\n];\n\nfunction isRedundantManualOption(label: string): boolean {\n return REDUNDANT_OPTION_PATTERNS.some((pattern) => pattern.test(label));\n}\n\nfunction normalize(\n loose: z.infer<typeof looseAskQuestionsSchema>,\n fallbackRequestId?: string,\n): AskQuestionsRequest {\n return {\n request_id: loose.request_id ?? fallbackRequestId ?? 'req-clarification',\n questions: loose.questions.map((question, questionIndex) => ({\n id: question.id ?? `q${questionIndex}`,\n prompt: question.prompt,\n selection: question.selection,\n options: question.options\n .map((option, optionIndex) =>\n typeof option === 'string'\n ? { id: `q${questionIndex}-o${optionIndex}`, label: option }\n : {\n id: option.id ?? `q${questionIndex}-o${optionIndex}`,\n label: option.label,\n },\n )\n .filter((option) => !isRedundantManualOption(option.label)),\n })),\n };\n}\n\nfunction safeJsonParse(text: string): unknown {\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return null;\n }\n}\n\n/**\n * The AI SDK surfaces a tool payload as a parsed object, a JSON string, an MCP\n * content array (`[{ type: 'text', text }]`), or a single content block.\n */\nfunction unwrapPayload(payload: unknown): unknown {\n if (payload == null) return null;\n if (typeof payload === 'string') return safeJsonParse(payload);\n if (Array.isArray(payload)) {\n for (const block of payload) {\n if (block && typeof block === 'object' && 'text' in block) {\n const text: unknown = (block as { text: unknown }).text;\n if (typeof text === 'string') return safeJsonParse(text);\n }\n }\n return null;\n }\n if (typeof payload === 'object') {\n if ('text' in payload) {\n const maybeText: unknown = (payload as { text: unknown }).text;\n if (typeof maybeText === 'string') return safeJsonParse(maybeText);\n }\n return payload;\n }\n return null;\n}\n\n/**\n * Parses a clarification request from a tool part's output or input. Returns\n * `null` on anything unrecognised — a malformed payload must fall back to the\n * ordinary step rendering, never blank the turn or throw inside the stream.\n */\nexport function parseAskQuestionsPayload(\n payload: unknown,\n fallbackRequestId?: string,\n): AskQuestionsRequest | null {\n const candidate = unwrapPayload(payload);\n if (candidate == null) return null;\n const parsed = looseAskQuestionsSchema.safeParse(candidate);\n return parsed.success ? normalize(parsed.data, fallbackRequestId) : null;\n}\n\n/**\n * The single combined message sent back when the customer submits. One\n * `Q:`/`A:` block per answered question keeps the mapping explicit for the\n * agent reading it as an ordinary user turn.\n */\nexport function formatAskQuestionsAnswers(\n request: AskQuestionsRequest,\n answersByQuestionId: ReadonlyMap<string, string>,\n): string {\n const blocks: string[] = [];\n for (const question of request.questions) {\n const answer = answersByQuestionId.get(question.id);\n if (answer === undefined || answer.trim() === '') continue;\n blocks.push(`Q: ${question.prompt}\\nA: ${answer.trim()}`);\n }\n return blocks.join('\\n\\n');\n}\n","import { isAgentStreamKeepalive } from '@opencx/widget-core';\nimport {\n isAskQuestionsToolName,\n parseAskQuestionsPayload,\n type AskQuestionsRequest,\n} from './ask-questions';\n\n/** One line of a turn's activity trace (reasoning or a tool call). */\nexport type StreamingStep = {\n kind: 'reasoning' | 'tool';\n /** Reasoning text, or the tool name. */\n label: string;\n done: boolean;\n /**\n * Tool steps only: the call's arguments and its result, carried straight\n * off the part. Rendered only where the embedder opted in\n * (`showStepToolIO`); every other surface reads the label alone, so this\n * costs nothing but a reference.\n */\n input?: unknown;\n output?: unknown;\n};\n\n/**\n * The wire type `pipeJsonRender` gives the ` ```spec ` fenced JSONL patches it\n * drains out of model text as typed `data-spec` UIMessage parts. The styled\n * renderer assembles these into a renderable element-tree spec.\n */\nconst SPEC_DATA_PART_TYPE = 'data-spec';\n\nexport type SpecDataPart = { type: typeof SPEC_DATA_PART_TYPE; data: unknown };\n\n/** One chronological render entry in an agent turn. */\nexport type StreamingTurnItem =\n | { kind: 'text'; text: string }\n | { kind: 'steps'; steps: StreamingStep[] }\n | { kind: 'spec'; parts: SpecDataPart[] }\n /**\n * A clarification the agent asked. Never rendered in the transcript: the\n * NEWEST one still pending takes the composer's place instead\n * (`pendingClarification`), and an answered one leaves no card behind.\n */\n | { kind: 'questions'; request: AskQuestionsRequest };\n\n/** The in-flight turn's render state: active + its ordered items. */\nexport type StreamingTurnState = {\n active: boolean;\n items: StreamingTurnItem[];\n};\n\n/**\n * The structural surface read from live AI SDK parts and persisted `ui_parts`,\n * keeping both paths behind one mapper so they cannot drift.\n */\ntype UiPartLike = {\n type: string;\n text?: unknown;\n state?: unknown;\n data?: unknown;\n toolName?: unknown;\n toolCallId?: unknown;\n input?: unknown;\n output?: unknown;\n [key: string]: unknown;\n};\n\n/** The message surface consumed by the item mapper. */\nexport type UiMessageLike = {\n parts: ReadonlyArray<UiPartLike>;\n};\n\n/** Flatten UIMessage parts into chronological render items. */\nexport function mapUiPartsToItems(\n parts: ReadonlyArray<UiPartLike>,\n): StreamingTurnItem[] {\n const items: StreamingTurnItem[] = [];\n const pushStep = (step: StreamingStep) => {\n const last = items.at(-1);\n if (last?.kind === 'steps') last.steps.push(step);\n else items.push({ kind: 'steps', steps: [step] });\n };\n const toolDone = (state: unknown) =>\n state === 'output-available' || state === 'output-error';\n // All `data-spec` parts patch one accumulating spec, anchored where the\n // first patch appeared rather than creating a new render position per patch.\n let specItem: { kind: 'spec'; parts: SpecDataPart[] } | null = null;\n for (const part of parts) {\n // The idle heartbeat is `transient` — the SDK never adds it to a message\n // — but a persisted `ui_parts` snapshot replayed on reload can carry one;\n // it renders nothing either way.\n if (isAgentStreamKeepalive(part)) continue;\n if (isAskQuestionsPart(part)) {\n // The raw call NEVER renders, parseable or not — the customer must never\n // be shown `ask_questions` as machinery. A payload that has not finished\n // streaming, or that cannot be read, contributes nothing and the turn's\n // own text carries the moment.\n const questions = askQuestionsItem(part);\n if (questions) items.push(questions);\n continue;\n }\n if (part.type === SPEC_DATA_PART_TYPE) {\n if (!specItem) {\n specItem = { kind: 'spec', parts: [] };\n items.push(specItem);\n }\n specItem.parts.push({ type: SPEC_DATA_PART_TYPE, data: part.data });\n } else if (part.type === 'text') {\n const text = typeof part.text === 'string' ? part.text : '';\n if (text.trim().length > 0) items.push({ kind: 'text', text });\n } else if (part.type === 'reasoning') {\n pushStep({\n kind: 'reasoning',\n label: typeof part.text === 'string' ? part.text : '',\n done: part.state !== 'streaming',\n });\n } else if (part.type === 'dynamic-tool') {\n pushStep({\n kind: 'tool',\n label: typeof part.toolName === 'string' ? part.toolName : 'tool',\n done: toolDone(part.state),\n ...toolIO(part),\n });\n } else if (part.type.startsWith('tool-')) {\n pushStep({\n kind: 'tool',\n label: part.type.slice('tool-'.length),\n done: toolDone(part.state),\n ...toolIO(part),\n });\n }\n }\n return items;\n}\n\n/** The tool this part calls, whichever of the two part shapes it uses. */\nfunction partToolName(part: UiPartLike): string | undefined {\n if (part.type === 'dynamic-tool') {\n return typeof part.toolName === 'string' ? part.toolName : undefined;\n }\n return part.type.startsWith('tool-')\n ? part.type.slice('tool-'.length)\n : undefined;\n}\n\nfunction isAskQuestionsPart(part: UiPartLike): boolean {\n return isAskQuestionsToolName(partToolName(part));\n}\n\n/**\n * An `ask_questions` tool part as a renderable questionnaire, or `null` when\n * the part is not one — or carries nothing parseable yet, which is the normal\n * state while the model is still streaming the call's arguments. Returning\n * `null` there leaves the part to the step mapper, so a half-arrived call\n * shows as ordinary activity rather than flickering an empty questionnaire.\n *\n * The OUTPUT is preferred over the INPUT: when an MCP server answered, its\n * response carries the real `request_id` and option ids.\n */\nfunction askQuestionsItem(\n part: UiPartLike,\n): Extract<StreamingTurnItem, { kind: 'questions' }> | null {\n const fallbackRequestId =\n typeof part.toolCallId === 'string' ? part.toolCallId : undefined;\n const request =\n parseAskQuestionsPayload(part.output, fallbackRequestId) ??\n parseAskQuestionsPayload(part.input, fallbackRequestId);\n if (!request) return null;\n return { kind: 'questions', request };\n}\n\n/**\n * A tool part's arguments/result, present only when the part actually carries\n * them: absent keys stay absent so a step never claims an empty call had\n * `undefined` input.\n */\nfunction toolIO(part: UiPartLike): { input?: unknown; output?: unknown } {\n return {\n ...(part.input === undefined ? {} : { input: part.input }),\n ...(part.output === undefined ? {} : { output: part.output }),\n };\n}\n","import { DefaultChatTransport, type UIMessage } from 'ai';\n\n/** Wiring the api layer hands the agent-chat transport (send + reconnect URLs + auth). */\nexport type AgentChatTransportOptions = {\n /** POST endpoint that starts a turn and streams it. */\n api: string;\n /** Session-scoped GET the transport hits to resume an in-flight stream. */\n reconnectApi: (sessionId: string) => string;\n /**\n * Auth headers (X-Bot-Token + Authorization), content-type stripped,\n * resolved PER REQUEST: the contact JWT is minted lazily on first contact\n * creation, so a snapshot taken at mount would send every stream request\n * without Authorization (401) for the rest of the session.\n */\n headers: () => Record<string, string>;\n};\n\n/** Build the reconnect request used by `useChat` to resume a session stream. */\nexport function agentChatReconnectPreparer(options: AgentChatTransportOptions) {\n return ({ id }: { id: string }) => ({\n api: options.reconnectApi(id),\n headers: options.headers(),\n });\n}\n\n/**\n * The AI SDK adapter for agent chat. It owns only SDK request wiring: the\n * whole wire body is handed to each send (`buildSendMessageBody`) and\n * forwarded as-is.\n */\nexport function buildAgentChatTransport(\n options: AgentChatTransportOptions,\n): DefaultChatTransport<UIMessage> {\n return new DefaultChatTransport<UIMessage>({\n api: options.api,\n headers: () => options.headers(),\n // Every send carries its full body; a send without one is a programming\n // error, and an empty body would be rejected server-side just as loudly.\n prepareSendMessagesRequest: ({ body }) => ({ body: body ?? {} }),\n prepareReconnectToStreamRequest: agentChatReconnectPreparer(options),\n });\n}\n","import { isRecord, type AgentTurnMessagesDto } from '@opencx/widget-core';\nimport { mapUiPartsToItems, type StreamingTurnItem } from './agent-chat-stream';\n\n/** One settled turn's transcript coverage and styled render model. */\nexport type TurnRenderSource = {\n key: string;\n turnId: string;\n rowIds: string[];\n items: StreamingTurnItem[];\n};\n\n/** Fold a fresh history fetch into the current list of turn render sources. */\nexport function mergeTurnSources({\n existing,\n fetched,\n}: {\n existing: TurnRenderSource[];\n fetched: AgentTurnMessagesDto;\n}): TurnRenderSource[] {\n const existingByTurnId = new Map(\n existing.map((source) => [source.turnId, source] as const),\n );\n const fetchedTurnIds = new Set<string>();\n const merged: TurnRenderSource[] = [];\n for (const turn of fetched.turns) {\n fetchedTurnIds.add(turn.turn_id);\n if (turn.message_uuids.length === 0) continue;\n const kept = existingByTurnId.get(turn.turn_id);\n if (kept) {\n // Preserve React identity and the exact streamed items; only the server's\n // authoritative transcript row coverage may change.\n if (sameRowIds(kept.rowIds, turn.message_uuids)) {\n merged.push(kept);\n } else {\n merged.push({ ...kept, rowIds: turn.message_uuids });\n }\n continue;\n }\n if (turn.ui_parts !== null) {\n const items = mapUiPartsToItems(turn.ui_parts);\n if (items.length === 0) continue;\n merged.push({\n key: `turn-${turn.turn_id}`,\n turnId: turn.turn_id,\n rowIds: turn.message_uuids,\n items,\n });\n }\n }\n // Preserve a live-retained turn that settled while this snapshot was in\n // flight and therefore was not yet present in the response.\n for (const source of existing) {\n if (!fetchedTurnIds.has(source.turnId)) merged.push(source);\n }\n\n const unchanged =\n merged.length === existing.length &&\n merged.every((source, index) => source === existing[index]);\n return unchanged ? existing : merged;\n}\n\nconst sameRowIds = (a: string[], b: string[]): boolean =>\n a.length === b.length && a.every((id, index) => id === b[index]);\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every((entry) => typeof entry === 'string');\n\n/** Read the terminal turn identity emitted on a finished useChat message. */\nexport function parseTurnSettledPart(\n parts: ReadonlyArray<{ type: string; data?: unknown }>,\n): { turnId: string; rowIds: string[] } | null {\n for (const part of parts) {\n if (part.type !== 'data-turn-settled') continue;\n const data = part.data;\n if (!isRecord(data)) return null;\n if (\n typeof data.turn_id !== 'string' ||\n !isStringArray(data.message_uuids)\n ) {\n return null;\n }\n return { turnId: data.turn_id, rowIds: data.message_uuids };\n }\n return null;\n}\n","import { isAgentStreamKeepalive, isTurnSteeredPart } from '@opencx/widget-core';\nimport type { UIMessageChunk } from 'ai';\n\n/**\n * What the v5 stream endpoint did with a message POSTed while the session\n * already had a live turn. Decided by the FIRST chunk of the request's own\n * stream:\n * - `steered`: the message joined the live turn (`data-turn-steered` is the\n * only chunk); the live turn's stream — already rendering — answers it.\n * - `turn`: the live turn did not take it, so the backend superseded that\n * turn and opened a new one for this message on THIS stream. The caller\n * drops this copy and replays the new turn through the engine's own\n * stream (the session's resume pointer moved to it).\n * - `failed`: the turn errored before producing anything.\n * - `silent`: the stream ended with no chunk at all — the reply was withheld\n * (assist draft, handoff); the transcript rows say what happened.\n */\nexport type SteerOutcome =\n | { kind: 'steered' }\n | { kind: 'turn' }\n | { kind: 'failed'; errorText: string }\n | { kind: 'silent' };\n\n/**\n * Classify a steer attempt from its stream's first DECISIVE chunk, then\n * release the stream. The backend heartbeats (`data-keepalive`) while the\n * request waits to be steered or for a fallback turn's first chunk — those\n * decide nothing and are skipped. Releasing never cancels the server turn\n * (resumable streams treat a client drop as a disconnect), so the `turn`\n * case can be replayed.\n */\nexport async function readSteerOutcome(\n stream: ReadableStream<UIMessageChunk>,\n): Promise<SteerOutcome> {\n const reader = stream.getReader();\n try {\n for (;;) {\n const { value, done } = await reader.read();\n if (done || value === undefined) return { kind: 'silent' };\n if (isAgentStreamKeepalive(value)) continue;\n if (isTurnSteeredPart(value)) return { kind: 'steered' };\n if (value.type === 'error') {\n return { kind: 'failed', errorText: value.errorText };\n }\n return { kind: 'turn' };\n }\n } finally {\n await reader.cancel().catch(() => undefined);\n }\n}\n","/**\n * Stop a live streamed turn. With resumable streams, a client abort is only a\n * disconnect, so the server generation must also be cancelled.\n */\nexport async function stopAgentChatTurn({\n api,\n sessionId,\n chatStop,\n}: {\n api: { stopStream: (sessionId: string) => Promise<void> };\n sessionId: string | null;\n chatStop: () => void | Promise<void>;\n}): Promise<void> {\n try {\n await chatStop();\n } finally {\n if (sessionId) await api.stopStream(sessionId);\n }\n}\n","import { useChat } from '@ai-sdk/react';\nimport {\n buildSendMessageBody,\n genUuid,\n log,\n type SendMessageInput,\n type StagedUserTurn,\n type WidgetConfig,\n type WidgetCtx,\n type WidgetMessageU,\n} from '@opencx/widget-core';\nimport { getToolName, isToolUIPart, type UIMessage } from 'ai';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { AgentChatQueue } from './agent-chat-queue';\nimport { mapUiPartsToItems, type StreamingTurnItem } from './agent-chat-stream';\nimport { buildAgentChatTransport } from './agent-chat-transport';\nimport {\n mergeTurnSources,\n parseTurnSettledPart,\n type TurnRenderSource,\n} from './agent-turn-sources';\nimport { readSteerOutcome, type SteerOutcome } from './steer-into-live-turn';\nimport { stopAgentChatTurn } from './stop-agent-chat-turn';\n\n/** Internal safety bound; a full backlog rejects the newest send. */\nconst MAX_QUEUED_SENDS = 20;\n\nconst HIGHLIGHT_ELEMENT_TOOL_NAME = 'highlight_element';\n\n/** A normalized browser effect for a styled renderer to perform on its host. */\nexport type AgentChatPageEffect = {\n key: string;\n type: 'highlight-element';\n input: unknown;\n};\n\ntype QueuedSend = StagedUserTurn & {\n input: SendMessageInput;\n /**\n * Wire uuid of a RETRY: the bubble keeps its identity (no duplicate render)\n * while the server sees a fresh message uuid — resending the original uuid\n * would hit the ledger's dedupe (the failed turn already claimed it) and\n * produce silence.\n */\n retryUuid?: string;\n};\n\n/**\n * Where the engine is between two turns. `useChat`'s own `status` covers the\n * stream itself; this covers the gaps around it during which the queue must\n * not drain: a send handed to `useChat` but not yet reported, a stop awaiting\n * its server ACK (+ the partial reply's row), and the post-turn reconcile.\n */\ntype TurnPhase = 'idle' | 'in-flight' | 'stopping' | 'reconciling';\n\n/**\n * The agent-chat engine, powered by the AI SDK `useChat`.\n *\n * - **Streaming** is driven by `status` ('submitted' | 'streaming' | 'ready').\n * - **Resume** is native (`resume: true` reconnects to a live turn on mount).\n * - **Steering**: a message sent while a turn is STREAMING enters the\n * transcript at once and is POSTed at once; the backend steers it into the\n * live turn (`data-turn-steered`), whose single reply — still rendering on\n * this engine's stream, untouched — answers both messages. When the live\n * turn cannot take it (already over), the backend opens a new turn for it\n * on that request's stream, which is replayed here via resume.\n * - **Multi-send queues** cover the gaps steering cannot: a turn that has\n * not started streaming yet, a stop awaiting its ACK, and the post-turn\n * reconcile window. A queued message is held in a queue pill above the\n * composer and enters the transcript when its own turn starts.\n * - **Stop cancels the RESPONSE, not the conversation**: it aborts the client\n * stream and POSTs `/stop` so the server cancels generation, then the next\n * queued message (if any) is sent to the API immediately. The queue is\n * never discarded.\n *\n * The completed transcript stays owned by the shared persisted `messages`\n * (history + polling — so human-agent handoff replies still appear); on finish\n * we poll the canonical rows and the live overlay hands off to them.\n */\nexport function useAgentChat({\n widgetCtx,\n config,\n sessionId,\n persistedMessages,\n}: {\n widgetCtx: WidgetCtx;\n config: WidgetConfig;\n sessionId: string | null;\n persistedMessages: WidgetMessageU[];\n}) {\n const { api, messageCtx } = widgetCtx;\n\n // The transport belongs to the API connection, not to one render's config\n // object. Read request-scoped config at send time so a fresh object from an\n // embedder neither replaces the transport nor leaves its request body stale.\n const configRef = useRef(config);\n configRef.current = config;\n\n // Org features narrowed by the embed: constant for the ctx lifetime.\n const { pageContext: sendsPageContext, clientTools: performsClientTools } =\n widgetCtx.features;\n\n // The whole wire body rides each send's options (`bodyFor`); the transport\n // only owns the URLs and auth. The contact JWT can be minted AFTER this\n // memo runs (lazy contact creation), so auth is re-read per request.\n const transport = useMemo(\n () =>\n buildAgentChatTransport({\n ...api.getStreamTransportOptions(),\n headers: () => api.getStreamTransportOptions().headers,\n }),\n [api],\n );\n\n const {\n status,\n messages,\n sendMessage,\n stop,\n error,\n clearError,\n resumeStream,\n } = useChat({\n id: sessionId ?? undefined,\n // Reattach to a still-live turn (reload, tab switch) — but only once a\n // session actually exists. A fresh visitor has nothing to resume, and the\n // engine mounts with the shell, so probing unconditionally would fire a\n // spurious reconnect request on every page load.\n resume: sessionId !== null,\n transport,\n // Batch token updates: without it every streamed token re-renders the\n // whole chat surface (transcript + composer), which stutters on long\n // replies inside customer pages.\n throttle: 50,\n onError: (error) => log.error('agent chat stream error', error),\n });\n\n // The turn-boundary effect is triggered by status/queue ownership changes,\n // not by every streamed token. It still needs the newest message snapshot\n // when one of those boundaries fires; trailing message ticks have their own\n // focused retention effect below.\n const messagesRef = useRef(messages);\n messagesRef.current = messages;\n\n const queueRef = useRef(new AgentChatQueue<QueuedSend>(MAX_QUEUED_SENDS));\n // `in-flight`: a send is handed to useChat until the turn's boundary, so a\n // burst of ready-state sends can't overlap.\n // `stopping`: a user stop is in flight (client abort + server cancel + the\n // post-ACK reconcile). Draining on the abort's own ready-flip could start\n // the next turn before the cancel lands, and the session-scoped cancel\n // would then kill the NEW turn too; and the partial reply's row must be\n // ingested first so the queued message never lands above it.\n // `reconciling`: the finished turn's canonical rows are being ingested. The\n // polling merge appends new rows to the END of the transcript, so the next\n // queued user bubble must wait or it renders ABOVE the finished reply.\n const turnPhaseRef = useRef<TurnPhase>('idle');\n // Preparation is serialized separately from streaming: on a fresh chat the\n // first send may be creating the session. Followers must wait for that id and\n // enqueue behind the first send, rather than being dropped or overtaking it.\n const sendPreparationTailRef = useRef<Promise<void>>(Promise.resolve());\n const sendGenerationRef = useRef(0);\n // Bumped on every enqueue / stop-completion so the drain effect re-evaluates\n // (the queue itself is a ref, so mutating it wouldn't trigger a render).\n const [queueVersion, setQueueVersion] = useState(0);\n // The live overlay must outlive the stream. `useChat` reports 'ready' the\n // moment the stream closes, but the canonical rows that replace the overlay\n // are still a fetch away, so tearing it down at 'ready' leaves the reply\n // missing for that whole window — it blanks out and flashes back in. This\n // stays true across the gap and is cleared only once a replacement exists.\n // Raised while streaming (never at the boundary) so the hold is already up on\n // the frame the stream ends, and so a RESUMED turn is covered too.\n const [settling, setSettling] = useState(false);\n // Per-turn render sources: finished turns whose transcript rows render\n // through the streaming renderer instead of their plain bubbles. Retained\n // live turns (the streamed message STAYS the render source — no swap, no\n // flash) and server-fetched historical turns (`ui_parts` — reload fidelity)\n // live in the same list; `mergeTurnSources` owns the precedence.\n const [turnSources, setTurnSources] = useState<TurnRenderSource[]>([]);\n // The live turn's React key. Set when its send drains (or when a resumed\n // stream is detected) and handed to the retained source at release — SAME\n // key before and after the promotion, so the turn's node never remounts.\n // Mirrored in a ref for the synchronous reads in effects and `send`.\n const [liveTurnKey, setLiveTurnKeyState] = useState<string | null>(null);\n const liveTurnKeyRef = useRef<string | null>(null);\n const setLiveTurnKey = useCallback((key: string | null) => {\n liveTurnKeyRef.current = key;\n setLiveTurnKeyState(key);\n }, []);\n // The node key of the turn whose overlay-release is pending (its rows have\n // not landed in the polled transcript yet). The release effect clears the\n // live key only when it still matches — a queued next send may have\n // installed ITS key by then.\n const pendingReleaseKeyRef = useRef<string | null>(null);\n // The most recently drained send — the retry source for a failed turn.\n const lastDrainedRef = useRef<QueuedSend | null>(null);\n const prevStatusRef = useRef(status);\n const previousSessionIdRef = useRef(sessionId);\n const ignoredStatusAfterSessionResetRef = useRef<typeof status | null>(null);\n const historicalFetchSessionRef = useRef<string | null>(null);\n // `useChat` creates a new Chat object as soon as a non-null id changes. Keep\n // the prior object's stop function so a direct session switch can abort the\n // stream it just detached from, rather than calling stop on the new chat.\n const clientStopRef = useRef(stop);\n // Latest status, readable synchronously from the `send` callback (which needs\n // to decide current-turn vs queued before the next render).\n const statusRef = useRef(status);\n statusRef.current = status;\n\n // Retain a finished streamed message as its rows' render source, keyed by\n // the turn identity carried on its terminal `data-turn-settled` part.\n // Idempotent per turn id — safe to call from both the boundary and the\n // trailing-tick effect below.\n const retainFromMessage = useCallback((message: UIMessage, key: string) => {\n const settled = parseTurnSettledPart(message.parts);\n if (!settled || settled.rowIds.length === 0) return;\n const items = mapUiPartsToItems(message.parts);\n if (items.length === 0) return;\n setTurnSources((existing) =>\n existing.some((source) => source.turnId === settled.turnId)\n ? existing\n : [\n ...existing,\n { key, turnId: settled.turnId, rowIds: settled.rowIds, items },\n ],\n );\n }, []);\n\n // The same wire body the blocking engine sends, from the LIVE config: an\n // embedder's refreshed config object and a function-form `context` are\n // reflected on every request without re-creating the transport.\n const bodyFor = useCallback(\n (next: QueuedSend) =>\n buildSendMessageBody({\n config: configRef.current,\n input: next.input,\n uuid: next.retryUuid ?? next.userMessage.id,\n sessionId: next.sessionId,\n content: next.userMessage.content,\n initialMessages: next.initialMessages,\n sendsPageContext,\n }),\n [sendsPageContext],\n );\n\n // Steer a message into the live turn. The bubble is already in the\n // transcript; this POSTs the message on a side stream (NOT through\n // `useChat` — a second `sendMessage` on the engine would push a duplicate\n // of the live assistant message and flip its status under the stream) and\n // acts on the first chunk. The live turn's stream keeps rendering untouched.\n const steer = useCallback(\n async (next: QueuedSend) => {\n const generation = sendGenerationRef.current;\n const abort = new AbortController();\n let outcome: SteerOutcome;\n try {\n const stream = await transport.sendMessages({\n trigger: 'submit-message',\n chatId: next.sessionId,\n messageId: undefined,\n messages: [],\n abortSignal: abort.signal,\n body: bodyFor(next),\n });\n outcome = await readSteerOutcome(stream);\n } catch (err) {\n log.error('agent chat steer failed', err);\n return;\n } finally {\n abort.abort();\n }\n // A session reset/switch mid-flight already discarded this bubble.\n if (generation !== sendGenerationRef.current) return;\n switch (outcome.kind) {\n case 'steered':\n // The live turn has it: its reply is the answer. Un-dim the bubble —\n // the server demonstrably received it.\n messageCtx.markUserMessageDelivered(next.userMessage.id);\n return;\n case 'turn':\n // The live turn was already over: the backend superseded it and\n // opened a NEW turn for this message on the stream just released.\n // The engine's stream (the superseded turn) is dead — drop it on\n // the client too, then replay the new turn from the session's\n // resume pointer so it renders through the normal live path. The\n // resumed stream's first chunk marks this bubble delivered, and\n // it is the retry source should the turn fail.\n lastDrainedRef.current = next;\n try {\n await stop();\n } catch (err) {\n log.error('agent chat steer fallback: client stop failed', err);\n }\n if (generation !== sendGenerationRef.current) return;\n void resumeStream();\n return;\n case 'failed':\n log.error('agent chat steer: the turn failed', {\n errorText: outcome.errorText,\n });\n break;\n case 'silent':\n // Accepted, reply withheld — the rows say what happened.\n messageCtx.markUserMessageDelivered(next.userMessage.id);\n break;\n }\n widgetCtx.reconcileAfterStream(next.sessionId).catch((err: unknown) => {\n log.error('agent chat post-steer reconcile failed', err);\n });\n },\n [transport, bodyFor, messageCtx, stop, resumeStream, widgetCtx],\n );\n // `send` is memoized on the MessageCtx alone (it is registered as the\n // shared send handler); it reads the latest steer through a ref.\n const steerRef = useRef(steer);\n steerRef.current = steer;\n\n // A null → id transition is the first send creating its session; clearing\n // there would delete that very send. Any transition away from a real session\n // is a reset/switch and must invalidate every conversation-owned ref. Abort\n // only the client-side stream: resetting the UI must not cancel the server's\n // turn for a session the visitor may reopen later.\n useEffect(() => {\n const previousClientStop = clientStopRef.current;\n clientStopRef.current = stop;\n const previousSessionId = previousSessionIdRef.current;\n if (previousSessionId === sessionId) return;\n previousSessionIdRef.current = sessionId;\n\n if (previousSessionId === null) {\n setTurnSources([]);\n return;\n }\n\n const hadActiveClientStream =\n statusRef.current === 'submitted' ||\n statusRef.current === 'streaming' ||\n prevStatusRef.current === 'submitted' ||\n prevStatusRef.current === 'streaming' ||\n turnPhaseRef.current === 'in-flight';\n\n sendGenerationRef.current += 1;\n sendPreparationTailRef.current = Promise.resolve();\n queueRef.current = new AgentChatQueue<QueuedSend>(MAX_QUEUED_SENDS);\n turnPhaseRef.current = 'idle';\n lastDrainedRef.current = null;\n pendingReleaseKeyRef.current = null;\n historicalFetchSessionRef.current = null;\n ignoredStatusAfterSessionResetRef.current =\n status === 'submitted' || status === 'streaming' ? status : null;\n prevStatusRef.current = 'ready';\n statusRef.current = 'ready';\n\n clearError();\n setQueueVersion((version) => version + 1);\n setSettling(false);\n setTurnSources([]);\n setLiveTurnKey(null);\n\n if (hadActiveClientStream) {\n Promise.resolve()\n .then(() => previousClientStop())\n .catch((err: unknown) => {\n log.error('agent chat client stream cancel failed', err);\n });\n }\n }, [sessionId, status, stop, clearError, setLiveTurnKey]);\n\n // Single turn-boundary + drain effect.\n //\n // Boundary (streaming/submitted → ready|error): release the in-flight guard,\n // undim the delivered user bubbles, and poll the canonical rows. 'error' is\n // a boundary too — `sendMessage` recovers from an error status on its own,\n // so a failed turn must not strand the queue.\n //\n // Drain: whenever the chat is not mid-turn and nothing is in flight (and no\n // stop is awaiting its server ACK), send the next queued message: move its\n // bubble from below the live overlay into the transcript, then stream.\n useEffect(() => {\n const ignoredStatus = ignoredStatusAfterSessionResetRef.current;\n if (ignoredStatus !== null && status === ignoredStatus) {\n // `useChat` can expose the old session's status for the render in which\n // its id changes. Do not reconstruct that discarded turn after reset.\n prevStatusRef.current = 'ready';\n return;\n }\n ignoredStatusAfterSessionResetRef.current = null;\n\n const prev = prevStatusRef.current;\n prevStatusRef.current = status;\n\n if (status === 'submitted' || status === 'streaming') {\n // First active status of a NEW turn (prev was idle): a turn nobody sent\n // from here (resume reattach) still needs a stable node key for its\n // live→retained promotion.\n if (\n prev !== 'submitted' &&\n prev !== 'streaming' &&\n liveTurnKeyRef.current === null\n ) {\n setLiveTurnKey(`turn-resumed-${genUuid()}`);\n }\n setSettling(true);\n }\n if (status === 'streaming') {\n // First chunk proves delivery for this turn only. Later queued bubbles\n // have not reached the server yet and must stay pending.\n const userMessageId = lastDrainedRef.current?.userMessage.id;\n if (userMessageId) messageCtx.markUserMessageDelivered(userMessageId);\n return;\n }\n if (status !== 'ready' && status !== 'error') return;\n\n const justFinished = prev === 'streaming' || prev === 'submitted';\n if (justFinished) {\n if (turnPhaseRef.current === 'in-flight') turnPhaseRef.current = 'idle';\n // RETENTION, synchronous: the stream's terminal `data-turn-settled`\n // part says exactly which ledger turn this was and which transcript\n // rows it produced — the streamed message becomes those rows' render\n // source right here, under the live node's key (no follow-up fetch, no\n // async race with the next queued send). A turn that ends without the\n // part never settled (it failed): nothing is retained and the release\n // below falls back to the plain row swap.\n const finishedMessage = messagesRef.current.at(-1);\n const finishedKey = liveTurnKeyRef.current;\n pendingReleaseKeyRef.current = finishedKey;\n if (\n finishedKey !== null &&\n finishedMessage &&\n finishedMessage.role === 'assistant'\n ) {\n retainFromMessage(finishedMessage, finishedKey);\n }\n // Only a turn that actually COMPLETED proves delivery. On `status ===\n // 'error'` the send may never have reached the server, so marking here\n // un-dims the user's bubble and renders a failed turn as delivered — the\n // customer sees a normally-sent message and simply never gets a reply,\n // with nothing anywhere indicating failure. A turn that errored MID-stream\n // is already covered: the `streaming` branch above marks delivery on the\n // first chunk, which is the point the server demonstrably had the message.\n if (status === 'ready') {\n const userMessageId = lastDrainedRef.current?.userMessage.id;\n if (userMessageId) messageCtx.markUserMessageDelivered(userMessageId);\n }\n // Ingest the finished turn's canonical rows BEFORE draining the next\n // queued message — transcript order is append-order, so the reply must\n // enter it before the next user bubble does.\n //\n // NOT on a stop: this flip is the CLIENT abort, which lands before the\n // server has settled the turn and persisted the partial reply. A\n // reconcile now fetches an empty transcript, the queue drains, and the\n // partial bubble is gone until a later poll appends it BELOW the queued\n // message. `stopTurn` reconciles once the `/stop` ACK says the row is\n // there; the overlay stays up (`settling`) until that row lands.\n if (turnPhaseRef.current === 'stopping') {\n // Nothing to do here — `stopTurn` owns the rest of this turn.\n } else if (sessionId) {\n turnPhaseRef.current = 'reconciling';\n widgetCtx\n .reconcileAfterStream(sessionId)\n .catch((err: unknown) => {\n log.error('agent chat post-turn reconcile failed', err);\n })\n .finally(() => {\n if (turnPhaseRef.current === 'reconciling') {\n turnPhaseRef.current = 'idle';\n }\n // Re-run this effect now that the rows are in — drain the queue.\n // The OVERLAY is not released here: this promise resolving only\n // means the fetch finished, which is not the same as the reply\n // having arrived (see the handoff effect below).\n setQueueVersion((v) => v + 1);\n });\n } else {\n // No session means nothing will ever ingest the rows — don't strand\n // the overlay waiting for a handoff that can't happen.\n setSettling(false);\n }\n }\n\n if (turnPhaseRef.current !== 'idle' || !sessionId) return;\n const next = queueRef.current.dequeueNext();\n if (!next) return;\n turnPhaseRef.current = 'in-flight';\n lastDrainedRef.current = next;\n // The turn's node key — anchored on the user message uuid so it is stable\n // from the first streamed chunk through the retained render source.\n setLiveTurnKey(`turn-${next.userMessage.id}`);\n // Its turn is starting — move the (queued) user bubble into the transcript,\n // above the response it's about to get. No-op for the current turn's message\n // (already added by `stageUserTurn`). Stays dimmed until its first chunk.\n messageCtx.appendUserMessageIfAbsent(next.userMessage);\n setQueueVersion((v) => v + 1);\n void sendMessage(\n { text: next.userMessage.content },\n { body: bodyFor(next) },\n );\n }, [\n status,\n sessionId,\n queueVersion,\n sendMessage,\n messageCtx,\n widgetCtx,\n bodyFor,\n retainFromMessage,\n setLiveTurnKey,\n ]);\n\n const send = useCallback(\n (input: SendMessageInput): Promise<void> => {\n const generation = sendGenerationRef.current;\n const work = sendPreparationTailRef.current.then(\n async (): Promise<void> => {\n if (generation !== sendGenerationRef.current) return;\n\n // A turn is STREAMING (its first chunk arrived, so the server is\n // generating) and nothing else is pending → steer: the bubble\n // enters the transcript now, above the live reply, and the message\n // is POSTed now. Not while a stop awaits its ACK (that message is\n // for AFTER the stop — the queue drains it once the cancel lands),\n // not while the reconcile is ingesting the last reply (the bubble\n // would land above it), and not behind queued messages (order).\n const phase = turnPhaseRef.current;\n const steerable =\n statusRef.current === 'streaming' &&\n phase !== 'stopping' &&\n phase !== 'reconciling' &&\n queueRef.current.size === 0;\n // Otherwise a turn is active (submitted, in flight, stopping,\n // reconciling, or something queued) → multi-send queue: hold the\n // user message in the queue pill above the composer and let it\n // enter the transcript when its own turn drains. Or nothing is\n // active: it's the current turn — render it now + ensure a session,\n // then stream.\n const turnActive =\n statusRef.current === 'submitted' ||\n statusRef.current === 'streaming' ||\n phase !== 'idle' ||\n queueRef.current.size > 0;\n\n // `disableSendingWhenAwaitingAIReply` is the non-streaming engine's\n // gate — there a mid-turn send has nowhere to go. Here it has: the\n // queue IS multi-send, so a busy turn never rejects a message.\n\n const staged: StagedUserTurn | null = turnActive\n ? withoutInitialMessages(messageCtx.buildQueuedUserMessage(input))\n : await messageCtx.stageUserTurn(input, { pending: true });\n if (!staged) return;\n if (generation !== sendGenerationRef.current) return;\n\n const next: QueuedSend = { ...staged, input };\n if (steerable) {\n // Into the transcript at once, dimmed until the server has it.\n messageCtx.appendUserMessageIfAbsent(next.userMessage);\n messageCtx.notifySendAccepted(input);\n void steerRef.current(next);\n return;\n }\n\n if (!queueRef.current.enqueue(next)) {\n log.warn('agent chat queue full; rejecting newest send', {\n rejectedMessageId: next.userMessage.id,\n });\n return;\n }\n setQueueVersion((v) => v + 1);\n messageCtx.notifySendAccepted(input);\n },\n );\n\n // Keep later sends moving after a failed preparation while preserving the\n // original rejection for the caller that owns this work item.\n sendPreparationTailRef.current = work.then(\n () => undefined,\n () => undefined,\n );\n return work;\n },\n [messageCtx],\n );\n\n // Retry the FAILED turn: same bubble, fresh wire uuid (the failed turn's\n // ledger row owns the original uuid — resending it would dedupe to\n // silence). Re-enters through the normal queue/drain path.\n const retryFailedTurn = useCallback(() => {\n const last = lastDrainedRef.current;\n if (!last) return;\n const enqueued = queueRef.current.enqueue({\n ...last,\n retryUuid: genUuid(),\n });\n if (!enqueued) {\n log.warn('agent chat queue full; retry not enqueued');\n return;\n }\n clearError();\n setQueueVersion((v) => v + 1);\n }, [clearError]);\n\n // Drop one queued (not-yet-sent) message — the pill's per-row remove button.\n const removeQueued = useCallback((messageId: string) => {\n const removed = queueRef.current.removeWhere(\n (item) => item.userMessage.id === messageId,\n );\n if (removed) setQueueVersion((v) => v + 1);\n }, []);\n\n // Stop the live response — and ONLY the response. The queue survives: once\n // the server ACKs the cancel, the drain effect immediately sends the next\n // queued message to the API (the user's \"stop mid-stream → my second message\n // starts streaming\" flow). With nothing queued, this is a plain stop.\n //\n // Ordering matters: the client abort flips `useChat` to ready at once, but\n // the server persists the partial reply only as it settles the turn — the\n // `/stop` ACK is the signal that row exists. So the partial stays on screen\n // (the boundary effect skips its reconcile while the phase is `stopping`)\n // and the reconcile runs AFTER the ACK — or after a failed stop, so the UI\n // can never stick: the overlay is released by the row landing, the queue by\n // the reconcile finishing. The `stopping` phase holds the drain for the\n // whole stop → reconcile span, so the queued message enters the transcript\n // BELOW the partial reply.\n const stopTurn = useCallback(() => {\n turnPhaseRef.current = 'stopping';\n // A session reset/switch mid-stop already discarded this turn's state;\n // its late ACK must not reconcile or re-arm the drain for the new one.\n const generation = sendGenerationRef.current;\n void stopAgentChatTurn({ api, sessionId, chatStop: stop })\n .catch((err: unknown) => {\n log.error('agent chat stop failed', err);\n })\n .then(() => {\n if (generation !== sendGenerationRef.current) return;\n if (!sessionId) {\n // No session means nothing will ever ingest the rows — don't\n // strand the overlay waiting for a handoff that can't happen.\n setSettling(false);\n return;\n }\n return widgetCtx\n .reconcileAfterStream(sessionId)\n .catch((err: unknown) => {\n log.error('agent chat post-stop reconcile failed', err);\n });\n })\n .finally(() => {\n if (generation !== sendGenerationRef.current) return;\n turnPhaseRef.current = 'idle';\n // Re-run the drain effect now that the cancel has settled and the\n // partial reply's row has been ingested.\n setQueueVersion((v) => v + 1);\n });\n }, [api, sessionId, stop, widgetCtx]);\n\n // Route the shared `sendMessage` API to this useChat engine while mounted.\n useEffect(() => {\n const handlers = { send };\n messageCtx.registerAgentHandlers(handlers);\n return () => messageCtx.unregisterAgentHandlers(handlers);\n }, [messageCtx, send]);\n\n // Session open / reload: fetch the settled turns' persisted `ui_parts` so\n // historical AI turns render through the streaming renderer (chips and all)\n // instead of their rows' plain text. A null result (any fetch surprise)\n // keeps the plain-row rendering. Guarded per session so it fetches once,\n // not once per `api` identity.\n useEffect(() => {\n if (!sessionId || historicalFetchSessionRef.current === sessionId) return;\n historicalFetchSessionRef.current = sessionId;\n let cancelled = false;\n void (async () => {\n try {\n const fetched = await api.getAgentTurnMessages(sessionId);\n if (!fetched || cancelled) return;\n setTurnSources((existing) => mergeTurnSources({ existing, fetched }));\n } catch (err) {\n log.error('agent chat turn sources fetch failed', err);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [sessionId, api]);\n\n // Normalize browser-effect tool calls without touching the host document.\n // The styled package consumes this narrow surface and owns validation,\n // theming, dedupe, and DOM effects. Client tools off (org or embed) → a\n // streamed tool part is ignored, never performed.\n const pageEffects = useMemo<AgentChatPageEffect[]>(() => {\n if (!performsClientTools) return [];\n const last = messages.at(-1);\n if (!last || last.role !== 'assistant') return [];\n const effects: AgentChatPageEffect[] = [];\n for (const part of last.parts) {\n if (!isToolUIPart(part)) continue;\n if (getToolName(part) !== HIGHLIGHT_ELEMENT_TOOL_NAME) continue;\n if (\n part.state !== 'input-available' &&\n part.state !== 'output-available'\n ) {\n continue;\n }\n effects.push({\n key: `${sessionId ?? 'pending'}:${part.toolCallId}`,\n type: 'highlight-element',\n input: part.input,\n });\n }\n return effects;\n }, [messages, sessionId, performsClientTools]);\n\n const isStreaming = status === 'submitted' || status === 'streaming';\n\n // Under `throttle`, the final messages tick can TRAIL the status flip, so\n // the boundary read may see a snapshot without the terminal\n // `data-turn-settled` part. Retry retention on each trailing tick until the\n // release clears the pending key. Idempotent per turn id.\n useEffect(() => {\n if (isStreaming) return;\n const key = pendingReleaseKeyRef.current;\n if (key === null) return;\n const last = messages.at(-1);\n if (last && last.role === 'assistant') retainFromMessage(last, key);\n }, [messages, isStreaming, retainFromMessage]);\n\n // Mid-stream disconnect recovery: the SDK's `resume` only fires on mount,\n // so a tab-sleep or network blip mid-turn leaves a dead SSE and a reply\n // that never arrives. When the tab comes back (or the network does), and a\n // turn looks unresolved — errored, or still held by `settling` — probe the\n // reconnect endpoint: a live turn replays, a finished one 204s and the\n // poll reconciles.\n useEffect(() => {\n const rearm = () => {\n if (document.visibilityState !== 'visible') return;\n if (!sessionId) return;\n if (isStreaming) return;\n if (error === undefined && !settling) return;\n resumeStream();\n };\n document.addEventListener('visibilitychange', rearm);\n window.addEventListener('online', rearm);\n return () => {\n document.removeEventListener('visibilitychange', rearm);\n window.removeEventListener('online', rearm);\n };\n }, [sessionId, isStreaming, settling, error, resumeStream]);\n\n // Stand the overlay down only once the persisted transcript actually carries\n // a replacement for it — an assistant-side row after the last user message.\n // (The retained source is already in `turnSources` from the boundary; it\n // starts rendering the moment its rows land, in the same commit this\n // releases, so ownership passes without a gap or an overlap.)\n //\n // Releasing when the reconcile FETCH resolves is not the same thing: if the\n // backend hadn't committed the row when that fetch ran, it comes back empty\n // and the reply would blank out until the next poll tick. Waiting for the row\n // itself makes the handoff correct no matter who wins that race, and it\n // self-heals — a later poll (or a human agent's reply) releases it just the\n // same. Never runs mid-stream: a row polled in while tokens are still\n // arriving must not release the overlay that is still being written to.\n useEffect(() => {\n if (isStreaming || !settling) return;\n for (let i = persistedMessages.length - 1; i >= 0; i -= 1) {\n const row = persistedMessages[i];\n if (!row) continue;\n // Walking back from the end, the first row that settles the question\n // wins. Reaching a user row means this turn has no persisted reply yet,\n // so there is still nothing to hand off to.\n if (row.type === 'USER') return;\n if (row.type !== 'AI' && row.type !== 'AGENT') continue;\n\n setSettling(false);\n // Clear the live key only if it still belongs to the released turn —\n // a queued next send may have installed ITS key already.\n if (liveTurnKeyRef.current === pendingReleaseKeyRef.current) {\n setLiveTurnKey(null);\n }\n pendingReleaseKeyRef.current = null;\n return;\n }\n }, [isStreaming, settling, persistedMessages, setLiveTurnKey]);\n\n // The live overlay: the in-flight assistant message's ordered items. Held\n // through `settling` as well as the stream itself — see above.\n const liveItems: StreamingTurnItem[] = useMemo(() => {\n if (!isStreaming && !settling) return [];\n const last = messages.at(-1);\n if (!last || last.role !== 'assistant') return [];\n return mapUiPartsToItems(last.parts);\n }, [messages, isStreaming, settling]);\n\n // Messages the user queued mid-turn — surfaced so the composer can render\n // them as a queue pill. Recomputed on every enqueue/drain (`queueVersion`).\n const queuedUserMessages = useMemo(\n () => queueRef.current.items.map((item) => item.userMessage),\n // eslint-disable-next-line react-hooks/exhaustive-deps -- queueRef is mutable; queueVersion is the signal\n [queueVersion],\n );\n\n return {\n isStreaming,\n liveItems,\n /** Finished turns' render sources — see `TurnRenderSource`. */\n turnSources,\n /** The live turn's node key (stable through the retained promotion). */\n liveTurnKey,\n /** The last turn failed — the transcript renders a visible error row. */\n turnFailed: error !== undefined,\n retryFailedTurn,\n queuedUserMessages,\n removeQueued,\n stop: stopTurn,\n pageEffects,\n };\n}\n\n/** A queued turn never carries greetings: the conversation already has them. */\nfunction withoutInitialMessages(\n built: {\n sessionId: string;\n userMessage: StagedUserTurn['userMessage'];\n } | null,\n): StagedUserTurn | null {\n return built ? { ...built, initialMessages: [] } : null;\n}\n","import type {\n WidgetConfig,\n WidgetCtx,\n WidgetUserMessage,\n} from '@opencx/widget-core';\nimport React, { createContext, useContext, useMemo } from 'react';\nimport { usePrimitiveState } from '../hooks/usePrimitiveState';\nimport type { StreamingTurnItem } from './agent-chat-stream';\nimport type { TurnRenderSource } from './agent-turn-sources';\nimport type { AskQuestionsRequest } from './ask-questions';\nimport { pendingClarification as resolvePendingClarification } from './pending-clarification';\nimport { useAgentChat, type AgentChatPageEffect } from './useAgentChat';\n\n/**\n * Streaming state for the agent-chat surface, produced by the single\n * `useAgentChat` (one useChat instance) and consumed by the message list\n * (live overlay) and the shared composer (stop button + the queue pill above\n * the input).\n *\n * On embeds whose org does not stream there is no provider, so the defaults\n * below apply.\n */\nexport type AgentChatUiValue = {\n isStreaming: boolean;\n liveItems: StreamingTurnItem[];\n /**\n * Finished turns' render sources: the transcript rows each covers and the\n * streaming items that replace those rows' plain bubbles (retained live\n * turns + server-fetched historical `ui_parts`).\n */\n turnSources: TurnRenderSource[];\n /**\n * The live turn's node key — stable through the retained promotion. Null\n * while no turn is live or settling.\n */\n liveTurnKey: string | null;\n /** The last turn failed — the transcript shows an error row with retry. */\n turnFailed: boolean;\n retryFailedTurn: () => void;\n /** Messages the user queued mid-turn — rendered in the composer's queue pill. */\n queuedUserMessages: WidgetUserMessage[];\n /** Drop one queued (not-yet-sent) message from the pill. */\n removeQueued: (messageId: string) => void;\n /** Stop the live response; queued messages survive and drain next. */\n stop: () => void;\n /** Host-page effects normalized from the current assistant tool parts. */\n pageEffects: AgentChatPageEffect[];\n /**\n * The clarification the agent is waiting on — the composer shows the\n * questionnaire in its place — or null.\n */\n pendingClarification: AskQuestionsRequest | null;\n};\n\nconst DEFAULT: AgentChatUiValue = {\n isStreaming: false,\n liveItems: [],\n turnSources: [],\n liveTurnKey: null,\n turnFailed: false,\n retryFailedTurn: () => {},\n queuedUserMessages: [],\n removeQueued: () => {},\n stop: () => {},\n pageEffects: [],\n pendingClarification: null,\n};\n\nconst AgentChatContext = createContext<AgentChatUiValue | null>(null);\n\n/** Reads the agent streaming state; safe defaults when not in an agent surface. */\nexport function useAgentChatUi(): AgentChatUiValue {\n return useContext(AgentChatContext) ?? DEFAULT;\n}\n\n/**\n * The streaming engine mount. WidgetProvider is the sole mount site, so every\n * headless and styled consumer shares one useChat lifecycle.\n */\nfunction ActiveAgentChatProvider({\n children,\n widgetCtx,\n config,\n}: {\n children: React.ReactNode;\n widgetCtx: WidgetCtx;\n config: WidgetConfig;\n}) {\n const sessionState = usePrimitiveState(widgetCtx.sessionCtx.sessionState);\n const messagesState = usePrimitiveState(widgetCtx.messageCtx.state);\n const {\n isStreaming,\n liveItems,\n turnSources,\n liveTurnKey,\n turnFailed,\n retryFailedTurn,\n queuedUserMessages,\n removeQueued,\n stop,\n pageEffects,\n } = useAgentChat({\n widgetCtx,\n config,\n sessionId: sessionState.session?.id ?? null,\n persistedMessages: messagesState.messages,\n });\n const lastMessageIsFromUser = messagesState.messages.at(-1)?.type === 'USER';\n // Memoized so consumers (message list, composer) don't re-render on every\n // provider render — only when the streaming state actually changes.\n const value: AgentChatUiValue = useMemo(\n () => ({\n isStreaming,\n liveItems,\n turnSources,\n liveTurnKey,\n turnFailed,\n retryFailedTurn,\n queuedUserMessages,\n removeQueued,\n stop,\n pageEffects,\n pendingClarification: resolvePendingClarification({\n turnSources,\n liveItems,\n isStreaming,\n lastMessageIsFromUser,\n }),\n }),\n [\n isStreaming,\n liveItems,\n turnSources,\n liveTurnKey,\n turnFailed,\n retryFailedTurn,\n queuedUserMessages,\n removeQueued,\n stop,\n pageEffects,\n lastMessageIsFromUser,\n ],\n );\n return (\n <AgentChatContext.Provider value={value}>\n {children}\n </AgentChatContext.Provider>\n );\n}\n\n/**\n * WidgetProvider-owned engine mount. Non-streaming widgets get the same safe\n * context interface without loading a useChat instance.\n */\nexport function AgentChatProvider({\n children,\n widgetCtx,\n config,\n}: {\n children: React.ReactNode;\n widgetCtx: WidgetCtx;\n config: WidgetConfig;\n}) {\n if (!widgetCtx.streaming) {\n return (\n <AgentChatContext.Provider value={DEFAULT}>\n {children}\n </AgentChatContext.Provider>\n );\n }\n return (\n <ActiveAgentChatProvider widgetCtx={widgetCtx} config={config}>\n {children}\n </ActiveAgentChatProvider>\n );\n}\n","import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { version } from '../package.json';\nimport {\n type ExternalStorage,\n type WidgetConfig,\n log,\n WidgetCtx,\n} from '@opencx/widget-core';\nimport { ComponentRegistry } from './ComponentRegistry';\nimport { AgentChatProvider } from './agent-chat/AgentChatContext';\nimport type { WidgetComponentType } from './types/components';\n\ninterface WidgetProviderValue {\n widgetCtx: WidgetCtx;\n config: WidgetConfig;\n components?: WidgetComponentType[];\n componentStore: ComponentRegistry;\n version: string;\n contentIframeRef?: React.MutableRefObject<HTMLIFrameElement | null>;\n}\n\nconst context = createContext<WidgetProviderValue | null>(null);\n\nexport function WidgetProvider({\n options: config,\n children,\n components,\n storage,\n loadingComponent,\n errorComponent,\n}: {\n options: WidgetConfig;\n children: React.ReactNode;\n components?: WidgetComponentType[];\n storage?: ExternalStorage;\n /**\n * Custom loading component while the widget is initializing\n * Not to be confused with the `loading` custom component which renders when the bot's reply is pending\n */\n loadingComponent?: React.ReactNode;\n /**\n * Render initialization failures (invalid token, network failure). When\n * omitted the widget renders nothing and reports the failure to the\n * console — a support widget must never take the host's React tree down\n * with it.\n */\n errorComponent?: (error: Error) => React.ReactNode;\n}): React.ReactElement | null {\n const contentIframeRef = useRef<HTMLIFrameElement | null>(null);\n const initializationRef = useRef<Promise<WidgetCtx> | null>(null);\n const [initialization, setInitialization] = useState<\n | { status: 'loading' }\n | { status: 'ready'; widgetCtx: WidgetCtx }\n | { status: 'error'; error: Error }\n >({ status: 'loading' });\n\n const componentStore = useMemo(\n () =>\n new ComponentRegistry({\n components: components,\n }),\n [components],\n );\n\n useEffect(() => {\n const request =\n initializationRef.current ??\n (initializationRef.current = WidgetCtx.initialize({ config, storage }));\n let active = true;\n void request.then(\n (widgetCtx) => {\n if (active) setInitialization({ status: 'ready', widgetCtx });\n },\n (reason: unknown) => {\n const error =\n reason instanceof Error\n ? reason\n : new Error('Widget initialization failed', { cause: reason });\n log.error('widget initialization failed', error);\n if (active) setInitialization({ status: 'error', error });\n },\n );\n return () => {\n active = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (initialization.status === 'loading') {\n return loadingComponent ? <>{loadingComponent}</> : null;\n }\n if (initialization.status === 'error') {\n return errorComponent ? <>{errorComponent(initialization.error)}</> : null;\n }\n\n const { widgetCtx } = initialization;\n\n return (\n <context.Provider\n value={{\n widgetCtx,\n config,\n components,\n componentStore,\n version,\n contentIframeRef,\n }}\n >\n <AgentChatProvider widgetCtx={widgetCtx} config={config}>\n {children}\n </AgentChatProvider>\n </context.Provider>\n );\n}\n\nexport function useWidget() {\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error('useWidget must be used within a WidgetProvider');\n }\n return ctx;\n}\n","import type { Agent } from '@opencx/widget-core';\nimport { useMemo } from 'react';\nimport { useWidget } from '../WidgetProvider';\n\n/**\n * The AI agent as the transcript shows it: the org's agent name/avatar\n * (resolved by the backend at init), overridden field by field by the\n * embedder's `bot` option.\n */\nexport function useBot(): Agent {\n const { config, widgetCtx } = useWidget();\n const { name, avatarUrl } = widgetCtx.agent;\n const bot = config.bot;\n return useMemo(\n () => ({\n isAi: true,\n id: null,\n name: bot?.name ?? name,\n avatarUrl: bot?.avatarUrl ?? avatarUrl,\n avatar: bot?.avatar,\n }),\n [bot?.name, bot?.avatarUrl, bot?.avatar, name, avatarUrl],\n );\n}\n","import { useWidget } from '../WidgetProvider';\n\nexport function useConfig() {\n const { config } = useWidget();\n\n return config;\n}\n","import type { WidgetDisplayModeU } from '@opencx/widget-core';\nimport { useWidget } from '../WidgetProvider';\n\n/**\n * Effective display mode for the widget shell: `config.displayMode`, falling\n * back to the classic `popover`. Embedders opt into `companion` explicitly.\n */\nexport function useDisplayMode(): WidgetDisplayModeU {\n const { config } = useWidget();\n return config.displayMode ?? 'popover';\n}\n","import { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\n\nexport function useContact() {\n const { widgetCtx } = useWidget();\n const contactState = usePrimitiveState(widgetCtx.contactCtx.state);\n\n return {\n contactState,\n createUnverifiedContact: widgetCtx.contactCtx.createUnverifiedContact,\n };\n}\n","import { useEffect, useState } from 'react';\nimport type { StringOrLiteral } from '@opencx/widget-core';\n\nexport function useDocumentDir() {\n const [dir, setDir] = useState<StringOrLiteral<'ltr' | 'rtl'>>('ltr');\n\n useEffect(() => {\n const updateDir = () => {\n if (typeof document === 'undefined') return;\n setDir(\n window.getComputedStyle((window.top || window).document.body).direction,\n );\n };\n\n // Set initial direction\n updateDir();\n\n // Watch for direction changes on both document and documentElement\n const observer = new MutationObserver(updateDir);\n\n // Observe both document and documentElement\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir'],\n });\n\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: ['dir'],\n });\n\n // Add event listener for dynamic changes\n window.addEventListener('languagechange', updateDir);\n\n return () => {\n observer.disconnect();\n window.removeEventListener('languagechange', updateDir);\n };\n }, []);\n\n return { dir };\n}\n","import { useSyncExternalStore } from 'react';\n\n/** How often the host URL is re-read for routers that call `pushState` silently. */\nconst POLL_MS = 500;\n/**\n * A host page fires this on its window after changing what `config.context`\n * would resolve to, when nothing in the URL says so (a tab switch inside one\n * page, a record loaded by id). The URL watch below covers route changes on\n * its own.\n */\nexport const HOST_CONTEXT_CHANGED_EVENT = 'opencx:context-changed';\n\nfunction hostWindow(): Window | null {\n if (typeof window === 'undefined') return null;\n try {\n // The widget renders inside an iframe of the host page; the host is the\n // top window. Reading its href throws cross-origin, in which case there\n // is nothing to follow.\n const top = window.top ?? window;\n void top.location.href;\n return top;\n } catch {\n return null;\n }\n}\n\nfunction subscribe(notify: () => void): () => void {\n const host = hostWindow();\n if (!host) return () => {};\n const onChange = (event?: Event) => {\n if (event?.type === HOST_CONTEXT_CHANGED_EVENT) notices += 1;\n notify();\n };\n // Back/forward and hash routers announce themselves. `pushState` routers\n // (every SPA framework) do not — the browser fires no event for it — so\n // the URL is also re-read on a slow tick. Patching `history.pushState` on\n // the host page would be the alternative; not ours to touch.\n host.addEventListener('popstate', onChange);\n host.addEventListener('hashchange', onChange);\n host.addEventListener(HOST_CONTEXT_CHANGED_EVENT, onChange);\n const tick = host.setInterval(onChange, POLL_MS);\n return () => {\n host.removeEventListener('popstate', onChange);\n host.removeEventListener('hashchange', onChange);\n host.removeEventListener(HOST_CONTEXT_CHANGED_EVENT, onChange);\n host.clearInterval(tick);\n };\n}\n\n// The store's value: the URL, plus a count of explicit change notices so an\n// event with no URL change still produces a new snapshot.\nlet notices = 0;\nfunction snapshot(): string {\n return `${notices}|${hostWindow()?.location.href ?? ''}`;\n}\n\n/**\n * A token that changes whenever the host page's situation may have: the\n * visitor navigated without a reload (an SPA route change, back/forward, a\n * hash), or the host fired `opencx:context-changed`. Anything derived from\n * `config.context` that describes \"where the visitor is\" — the entity pill —\n * keys on it, so it follows the page instead of showing the one the widget\n * was opened on.\n */\nexport function useHostLocation(): string {\n return useSyncExternalStore(subscribe, snapshot, () => '');\n}\n","import { usePrimitiveState } from './usePrimitiveState';\nimport { useWidget } from '../WidgetProvider';\nimport { useAgentChatUi } from '../agent-chat/AgentChatContext';\n\nexport function useMessages() {\n const { widgetCtx } = useWidget();\n const messagesState = usePrimitiveState(widgetCtx.messageCtx.state);\n // While a streamed reply is in flight the classic \"awaiting reply\" flags\n // read true too, so every consumer sees one notion of \"the AI is replying\".\n const { isStreaming } = useAgentChatUi();\n const effectiveMessagesState = isStreaming\n ? { ...messagesState, isSendingMessage: true, isSendingMessageToAI: true }\n : messagesState;\n\n return {\n messagesState: effectiveMessagesState,\n sendMessage: widgetCtx.messageCtx.sendMessage,\n // Composer ↑/↓ recall. Owned by MessageCtx so it is scoped to this widget\n // instance and cleared with the conversation.\n rememberSentText: widgetCtx.messageCtx.rememberSentText,\n getSentTextHistory: widgetCtx.messageCtx.getSentTextHistory,\n };\n}\n","import { useMemo } from 'react';\nimport { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\nimport { useConfig } from './useConfig';\n\nexport function useSessions() {\n const { widgetCtx } = useWidget();\n const { oneOpenSessionAllowed } = useConfig();\n const sessionState = usePrimitiveState(widgetCtx.sessionCtx.sessionState);\n const sessionsState = usePrimitiveState(widgetCtx.sessionCtx.sessionsState);\n\n const { openSessions, closedSessions } = useMemo(() => {\n return {\n openSessions: sessionsState.data.filter((s) => s.isOpened === true),\n closedSessions: sessionsState.data.filter((s) => s.isOpened === false),\n };\n }, [sessionsState.data]);\n\n const canCreateNewSession = useMemo(() => {\n if (oneOpenSessionAllowed) {\n return openSessions.length === 0;\n }\n return true;\n }, [oneOpenSessionAllowed, openSessions.length]);\n\n return {\n sessionState,\n sessionsState,\n loadMoreSessions: widgetCtx.sessionCtx.loadMoreSessions,\n resolveSession: widgetCtx.sessionCtx.resolveSession,\n createStateCheckpoint: widgetCtx.sessionCtx.createStateCheckpoint,\n openSessions,\n closedSessions,\n canCreateNewSession,\n };\n}\n","import { useMessages } from './useMessages';\nimport { useSessions } from './useSessions';\n\nexport function useIsAwaitingBotReply() {\n const { sessionState } = useSessions();\n const { messagesState } = useMessages();\n\n const isSessionAssignedToAI = sessionState.session?.assignee.kind === 'ai';\n // This check is useful in cases where the user might navigate in and out of a chat, and `isSendingMessage` is reset back to its default value\n const isLastMessageAUserMessage =\n messagesState.messages?.at(-1)?.type === 'USER';\n\n const isAwaitingBotReply = (() => {\n if (messagesState.isSendingMessageToAI) return true;\n if (\n (isSessionAssignedToAI || sessionState.isCreatingSession) &&\n (messagesState.isSendingMessage || isLastMessageAUserMessage)\n ) {\n return true;\n }\n return false;\n })();\n\n return { isAwaitingBotReply };\n}\n","import { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\n\nexport function useWidgetRouter() {\n const { widgetCtx } = useWidget();\n\n const routerState = usePrimitiveState(widgetCtx.routerCtx.state);\n\n return {\n routerState,\n toSessionsScreen: widgetCtx.routerCtx.toSessionsScreen,\n toChatScreen: widgetCtx.routerCtx.toChatScreen,\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { useWidget } from '../WidgetProvider';\nimport { v4 } from 'uuid';\n\nconst uploadAbortControllers: Map<string, AbortController> = new Map();\n\ninterface FileWithProgress {\n status: 'pending' | 'uploading' | 'success' | 'error';\n id: string;\n file: File;\n fileUrl?: string;\n progress: number;\n error?: string;\n}\n\nfunction useUploadFiles() {\n const [files, setFiles] = useState<FileWithProgress[]>([]);\n const {\n widgetCtx: { api },\n } = useWidget();\n function appendFiles(files: File[]) {\n const newFiles = files.map((file) => ({\n file,\n id: v4(),\n status: 'pending' as const,\n progress: 0,\n }));\n\n setFiles((prev) => [...prev, ...newFiles]);\n newFiles.forEach(uploadFile);\n }\n\n function updateFileById(id: string, update: Partial<FileWithProgress>) {\n setFiles((prev) =>\n prev.map((f) => (f.id === id ? { ...f, ...update } : f)),\n );\n }\n\n function removeFileById(id: string) {\n setFiles((prev) => prev.filter((f) => f.id !== id));\n }\n\n const uploadFile = async (fileItem: FileWithProgress) => {\n const controller = new AbortController();\n uploadAbortControllers.set(fileItem.id, controller);\n\n try {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === fileItem.id ? { ...f, status: 'uploading', progress: 0 } : f,\n ),\n );\n\n const response = await api.uploadFile({\n file: fileItem.file,\n abortSignal: controller.signal,\n onProgress: (percentage) => {\n updateFileById(fileItem.id, { progress: percentage });\n },\n });\n\n updateFileById(fileItem.id, {\n status: 'success',\n fileUrl: response.fileUrl,\n progress: 100,\n });\n } catch (error) {\n if (!controller.signal.aborted) {\n updateFileById(fileItem.id, {\n status: 'error',\n error: error instanceof Error ? error.message : 'Upload failed',\n progress: 0,\n });\n }\n } finally {\n uploadAbortControllers.delete(fileItem.id);\n }\n };\n\n const handleCancelUpload = (fileId: string) => {\n const controller = uploadAbortControllers.get(fileId);\n if (controller) {\n controller.abort();\n uploadAbortControllers.delete(fileId);\n }\n removeFileById(fileId);\n };\n\n const successFiles = useMemo(() => {\n return files.filter((f) => f.status === 'success' && f.fileUrl);\n }, [files]);\n\n function emptyTheFiles() {\n uploadAbortControllers.forEach((controller) => controller.abort());\n uploadAbortControllers.clear();\n setFiles([]);\n }\n\n useEffect(() => {\n return () => {\n uploadAbortControllers.forEach((controller) => controller.abort());\n uploadAbortControllers.clear();\n };\n }, []);\n\n return {\n allFiles: files,\n appendFiles,\n handleCancelUpload,\n successFiles,\n emptyTheFiles,\n getFileById: (id: string) => files.find((f) => f.id === id),\n getUploadProgress: (id: string) =>\n files.find((f) => f.id === id)?.progress ?? 0,\n getUploadStatus: (id: string) => files.find((f) => f.id === id)?.status,\n hasErrors: files.some((f) => f.status === 'error'),\n isUploading: files.some((f) => f.status === 'uploading'),\n };\n}\n\nexport { useUploadFiles, type FileWithProgress };\n","import React, {\n createContext,\n useContext,\n useEffect,\n useState,\n type Dispatch,\n type ReactNode,\n type SetStateAction,\n} from 'react';\nimport { useConfig } from './useConfig';\n\ntype WidgetTriggerCtx = {\n isOpen: boolean;\n setIsOpen: Dispatch<SetStateAction<boolean>>;\n};\n\nconst context = createContext<WidgetTriggerCtx | null>(null);\n\nexport function WidgetTriggerProvider({ children }: { children: ReactNode }) {\n const config = useConfig();\n const [isOpen, setIsOpen] = useState(() => {\n if (config.inline) return true;\n return config.isOpen ?? false;\n });\n\n useEffect(() => {\n setIsOpen((prev) => config.isOpen ?? prev);\n }, [config.isOpen]);\n\n useEffect(() => {\n const openAfterNSeconds = config.openAfterNSeconds;\n if (typeof openAfterNSeconds !== 'number' || isNaN(openAfterNSeconds))\n return;\n\n const timeout = setTimeout(() => setIsOpen(true), openAfterNSeconds * 1000);\n\n return () => clearTimeout(timeout);\n }, [config.openAfterNSeconds]);\n\n return (\n <context.Provider value={{ isOpen, setIsOpen }}>\n {children}\n </context.Provider>\n );\n}\n\nexport function useWidgetTrigger() {\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error(\n 'useWidgetTrigger must be used within a WidgetTriggerProvider',\n );\n }\n return ctx;\n}\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type Dispatch,\n type ReactNode,\n type SetStateAction,\n} from 'react';\nimport {\n normalizeCompanionLayouts,\n resolveCompanionDefaultLayout,\n resolveSidebarMode,\n resolveSidebarSide,\n type WidgetCompanionDefaultLayoutU,\n type WidgetCompanionLayoutU,\n type WidgetSidebarModeU,\n type WidgetSidebarSideResolvedU,\n} from '@opencx/widget-core';\nimport { useConfig } from './useConfig';\nimport { useDocumentDir } from './useDocumentDir';\nimport { useWidget } from '../WidgetProvider';\n\ntype CompanionPreferenceStorage = {\n getCompanionLayout: () => Promise<WidgetCompanionDefaultLayoutU | null>;\n setCompanionLayout: (layout: WidgetCompanionDefaultLayoutU) => Promise<void>;\n getCompanionSidebarSide: () => Promise<WidgetSidebarSideResolvedU | null>;\n setCompanionSidebarSide: (side: WidgetSidebarSideResolvedU) => Promise<void>;\n getCompanionSidebarMode: () => Promise<WidgetSidebarModeU | null>;\n setCompanionSidebarMode: (mode: WidgetSidebarModeU) => Promise<void>;\n};\n\n/** A layout the visitor can rest in, i.e. anything but the fullscreen mode. */\nfunction isRestingLayout(\n layout: WidgetCompanionLayoutU,\n): layout is WidgetCompanionDefaultLayoutU {\n return layout !== 'fullscreen';\n}\n\ntype WidgetLayoutCtx = {\n layout: WidgetCompanionLayoutU;\n setLayout: Dispatch<SetStateAction<WidgetCompanionLayoutU>>;\n /**\n * The visitor CHOOSING a layout, as opposed to the shell moving them\n * between layouts on their behalf (leaving fullscreen, opening history).\n * Only a deliberate pick is remembered for the next visit — otherwise a\n * trip through fullscreen would quietly rewrite the saved preference to\n * whatever the shell relaxed back to.\n */\n setLayoutPreference: (layout: WidgetCompanionLayoutU) => void;\n allowedLayouts: readonly WidgetCompanionLayoutU[];\n defaultLayout: WidgetCompanionLayoutU;\n /**\n * Sidebar side/mode live HERE rather than in the companion shell because the\n * two surfaces that need them sit on opposite sides of the content iframe:\n * the shell (host DOM) positions the panel and frames the page, while the\n * layout picker (inside the iframe) is what the visitor clicks. A shared\n * context is the only thing both can read.\n */\n sidebarSide: WidgetSidebarSideResolvedU;\n setSidebarSide: (side: WidgetSidebarSideResolvedU) => void;\n sidebarMode: WidgetSidebarModeU;\n setSidebarMode: (mode: WidgetSidebarModeU) => void;\n};\n\nconst context = createContext<WidgetLayoutCtx | null>(null);\n\nexport function WidgetLayoutProvider({ children }: { children: ReactNode }) {\n const { companion } = useConfig();\n const { dir } = useDocumentDir();\n const { widgetCtx } = useWidget();\n\n return (\n <WidgetLayoutStateProvider\n configuredDefaultLayout={companion?.defaultLayout}\n configuredLayouts={companion?.layouts}\n configuredSidebarSide={resolveSidebarSide(companion?.sidebar?.side, dir)}\n configuredSidebarMode={resolveSidebarMode(companion?.sidebar?.mode)}\n storage={widgetCtx.storageCtx}\n >\n {children}\n </WidgetLayoutStateProvider>\n );\n}\n\n/**\n * Layout state keyed to the CONFIGURED options. `useConfig()` is live — hosts\n * like the dashboard playground edit options on an already-mounted widget —\n * so the default and allowed layouts can change after mount. The effective\n * default is always allowed. A changed effective default is applied; removing\n * the current manual layout falls back to it; otherwise manual header toggles\n * survive unrelated config edits.\n *\n * Exported separately so tests can drive the configured values as props\n * without standing up the whole `WidgetProvider`/`WidgetCtx` stack.\n */\nexport function WidgetLayoutStateProvider({\n configuredDefaultLayout,\n configuredLayouts,\n configuredSidebarSide,\n configuredSidebarMode,\n storage,\n children,\n}: {\n configuredDefaultLayout?: WidgetCompanionLayoutU;\n configuredLayouts?: readonly WidgetCompanionLayoutU[];\n configuredSidebarSide: WidgetSidebarSideResolvedU;\n configuredSidebarMode: WidgetSidebarModeU;\n storage?: CompanionPreferenceStorage | undefined;\n children: ReactNode;\n}) {\n const allowedLayouts = normalizeCompanionLayouts(configuredLayouts);\n const defaultLayout = resolveCompanionDefaultLayout(\n configuredDefaultLayout,\n allowedLayouts,\n );\n const allowedLayoutsKey = allowedLayouts.join('|');\n const [layout, setLayoutState] =\n useState<WidgetCompanionLayoutU>(defaultLayout);\n const [previousConfig, setPreviousConfig] = useState({\n defaultLayout,\n allowedLayoutsKey,\n });\n\n // \"Adjusting state during render\" (React-sanctioned): apply live config\n // before descendants commit with an excluded layout. Reordering options by\n // itself does not clobber a still-valid manual selection.\n if (\n previousConfig.defaultLayout !== defaultLayout ||\n previousConfig.allowedLayoutsKey !== allowedLayoutsKey\n ) {\n setPreviousConfig({ defaultLayout, allowedLayoutsKey });\n if (\n previousConfig.defaultLayout !== defaultLayout ||\n !allowedLayouts.includes(layout)\n ) {\n setLayoutState(defaultLayout);\n }\n }\n\n const setLayout: Dispatch<SetStateAction<WidgetCompanionLayoutU>> = (\n action,\n ) => {\n setLayoutState((current) => {\n const next = typeof action === 'function' ? action(current) : action;\n return allowedLayouts.includes(next) ? next : current;\n });\n };\n\n // Read by the async restore below, which must not judge a saved layout\n // against the options as they stood on first render.\n const allowedLayoutsRef = useRef(allowedLayouts);\n allowedLayoutsRef.current = allowedLayouts;\n\n const setLayoutPreference = (layout: WidgetCompanionLayoutU) => {\n setLayout(layout);\n if (!allowedLayoutsRef.current.includes(layout)) return;\n // Entering fullscreen leaves the remembered resting layout alone: the\n // visitor is still \"in\" the sidebar or card they came from.\n if (!isRestingLayout(layout)) return;\n void storage?.setCompanionLayout(layout).catch(() => {});\n };\n\n // Config is the seed; a visitor's own pick (restored below, or made in the\n // picker) overrides it for the rest of the session and future visits. A\n // config change after mount still wins — an embedder moving the sidebar is\n // an explicit act, not a stale default.\n const [sidebarSide, setSidebarSideState] = useState(configuredSidebarSide);\n const [sidebarMode, setSidebarModeState] = useState(configuredSidebarMode);\n const [previousSidebarConfig, setPreviousSidebarConfig] = useState({\n side: configuredSidebarSide,\n mode: configuredSidebarMode,\n });\n if (\n previousSidebarConfig.side !== configuredSidebarSide ||\n previousSidebarConfig.mode !== configuredSidebarMode\n ) {\n setPreviousSidebarConfig({\n side: configuredSidebarSide,\n mode: configuredSidebarMode,\n });\n if (previousSidebarConfig.side !== configuredSidebarSide) {\n setSidebarSideState(configuredSidebarSide);\n }\n if (previousSidebarConfig.mode !== configuredSidebarMode) {\n setSidebarModeState(configuredSidebarMode);\n }\n }\n\n // Restore the visitor's saved pick once, and only where they actually made\n // one — a missing key must leave the configured value alone.\n useEffect(() => {\n if (!storage) return;\n let cancelled = false;\n void storage\n .getCompanionLayout()\n .then((saved) => {\n if (cancelled || !saved) return;\n // An embedder who has since excluded the saved layout outranks a\n // preference the visitor set under the old configuration.\n if (!allowedLayoutsRef.current.includes(saved)) return;\n setLayoutState(saved);\n })\n .catch(() => {});\n void storage\n .getCompanionSidebarSide()\n .then((saved) => {\n if (!cancelled && saved) setSidebarSideState(saved);\n })\n .catch(() => {});\n void storage\n .getCompanionSidebarMode()\n .then((saved) => {\n if (!cancelled && saved) setSidebarModeState(saved);\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, [storage]);\n\n const setSidebarSide = useCallback(\n (side: WidgetSidebarSideResolvedU) => {\n setSidebarSideState(side);\n void storage?.setCompanionSidebarSide(side).catch(() => {});\n },\n [storage],\n );\n\n const setSidebarMode = useCallback(\n (mode: WidgetSidebarModeU) => {\n setSidebarModeState(mode);\n void storage?.setCompanionSidebarMode(mode).catch(() => {});\n },\n [storage],\n );\n\n return (\n <context.Provider\n value={{\n layout,\n setLayout,\n setLayoutPreference,\n allowedLayouts,\n defaultLayout,\n sidebarSide,\n setSidebarSide,\n sidebarMode,\n setSidebarMode,\n }}\n >\n {children}\n </context.Provider>\n );\n}\n\nexport function useWidgetLayout() {\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error(\n 'useWidgetLayout must be used within a WidgetLayoutProvider',\n );\n }\n return ctx;\n}\n","import type { ModeComponent, ModeDto } from '@opencx/widget-core';\nimport { useWidget } from '../WidgetProvider';\nimport { useConfig } from './useConfig';\nimport { useSessions } from './useSessions';\n\nexport function useModes(): {\n modes: ModeDto[];\n modesComponents: ModeComponent[] | undefined;\n activeModeId: string | null | undefined;\n activeMode: ModeDto | undefined;\n Component: ModeComponent['component'] | undefined;\n} {\n const { widgetCtx } = useWidget();\n const { modesComponents } = useConfig();\n const { sessionState } = useSessions();\n\n const modes = widgetCtx.modes;\n const activeModeId = sessionState.session?.modeId;\n const activeMode = modes.find((mode) => mode.id === activeModeId);\n\n const Component: ModeComponent['component'] | undefined =\n modesComponents?.find((modeComponent) =>\n [\n activeMode?.id || '',\n activeMode?.name?.toLowerCase() || '',\n activeMode?.slug?.toLowerCase() || '',\n ].includes(modeComponent.key.toLowerCase()),\n )?.component;\n\n return {\n modes,\n modesComponents,\n activeModeId,\n activeMode,\n Component,\n };\n}\n","import type {\n WidgetSystemMessage__CsatRequested,\n WidgetSystemMessage__CsatSubmitted,\n} from '@opencx/widget-core';\nimport { useMemo } from 'react';\nimport { useMessages } from './useMessages';\nimport { useWidget } from '../WidgetProvider';\n\nexport function useCsat() {\n const { widgetCtx } = useWidget();\n const {\n messagesState: { messages },\n } = useMessages();\n\n const {\n csatRequestedMessage,\n isCsatRequested,\n csatSubmittedMessage,\n isCsatSubmitted,\n submittedScore,\n submittedFeedback,\n } = useMemo(() => {\n const csatRequestedMessage = messages.find(\n (message): message is WidgetSystemMessage__CsatRequested =>\n message.type === 'SYSTEM' && message.subtype === 'csat_requested',\n );\n const csatSubmittedMessage = messages.findLast(\n (message): message is WidgetSystemMessage__CsatSubmitted =>\n message.type === 'SYSTEM' && message.subtype === 'csat_submitted',\n );\n\n return {\n csatRequestedMessage,\n isCsatRequested: !!csatRequestedMessage && !csatSubmittedMessage,\n csatSubmittedMessage,\n isCsatSubmitted: !!csatSubmittedMessage,\n submittedScore: csatSubmittedMessage?.data.payload.score,\n submittedFeedback: csatSubmittedMessage?.data.payload.feedback,\n };\n }, [messages]);\n\n return {\n submitCsat: widgetCtx.csatCtx.submitCsat,\n csatRequestedMessage,\n isCsatRequested,\n csatSubmittedMessage,\n isCsatSubmitted,\n submittedScore,\n submittedFeedback,\n };\n}\n","import type { DictationTarget } from '@opencx/widget-core';\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\n\n/**\n * Voice dictation for a composer. `enabled` is the server's decision narrowed\n * by the embed (`widgetCtx.features.dictation`); the rest drives the one DictationCtx\n * session. The target callbacks are read through refs so a re-render never\n * restarts a live session.\n */\nexport function useDictation(target: DictationTarget) {\n const { widgetCtx } = useWidget();\n const ctx = widgetCtx.dictationCtx;\n const state = usePrimitiveState(ctx.state);\n\n const targetRef = useRef(target);\n targetRef.current = target;\n\n const start = useCallback(() => {\n ctx.start({\n getValue: () => targetRef.current.getValue(),\n setValue: (value) => targetRef.current.setValue(value),\n onSend: () => targetRef.current.onSend?.(),\n });\n }, [ctx]);\n\n const toggle = useCallback(() => {\n if (ctx.isActive()) ctx.stop();\n else start();\n }, [ctx, start]);\n\n // Never leave the microphone open with no visible owner.\n useEffect(() => () => ctx.stop(), [ctx]);\n\n return {\n enabled: widgetCtx.features.dictation,\n status: state.status,\n error: state.error,\n isActive: state.status !== 'idle',\n /** 0..1 mic level — read inside a rAF loop, not a render. */\n levelRef: ctx.levelRef,\n start,\n stop: ctx.stop,\n toggle,\n prewarm: ctx.prewarm,\n };\n}\n"],"names":["ComponentRegistry","opts","components","c","component","index","key","_a","usePrimitiveState","p","useSyncExternalStore","pendingClarification","turnSources","liveItems","isStreaming","lastMessageIsFromUser","newest","lastQuestions","items","item","marker","symbol","_b","AISDKError","_AISDKError","name15","message","cause","error","marker16","markerSymbol","getErrorMessage","name3","marker4","symbol4","_a4","_b4","InvalidArgumentError","argument","name6","marker7","symbol7","_a7","_b7","JSONParseError","text","name13","marker14","symbol14","_a14","_b14","TypeValidationError","_TypeValidationError","value","context","contextPrefix","parts","_a16","_b16","_c","ParseError","options","LF","CR","SPACE","noop","_arg","createParser","config","onEvent","onError","onRetry","onComment","maxBufferSize","pendingFragments","pendingFragmentsLength","isFirstChunk","id","data","dataLines","eventType","terminated","feed","chunk","trailing2","processLines","checkBufferSize","input","trailing","searchIndex","lfIndex","firstCharCode","isDataPrefix","valueStart","isEventPrefix","parseLine","crIndex","lineEnd","start","end","dispatchEvent","value2","line2","line","fieldSeparatorIndex","processField","field","offset","reset","incompleteLine","i","EventSourceParserStream","parser","controller","event","createIdGenerator","prefix","size","alphabet","separator","generator","alphabetLength","chars","generateId","normalizeHeaders","headers","normalized","isBuffer","_a2","_b2","suspectProtoRx","suspectConstructorRx","_parse","obj","filter","next","nodes","node","secureJsonParse","stackTraceLimit","addAdditionalPropertiesToJsonSchema","jsonSchema2","properties","visit","definitions","def","ignoreOverride","defaultOptions","getDefaultOptions","parseAnyDef","parseArrayDef","refs","res","ZodFirstPartyTypeKind","parseDef","parseBigintDef","check","parseBooleanDef","parseBrandedDef","_def","parseCatchDef","parseDateDef","overrideDateStrategy","strategy","integerDateParser","parseDefaultDef","parseEffectsDef","parseEnumDef","isJsonSchema7AllOfType","type","parseIntersectionDef","allOf","x","mergedAllOf","schema","nestedSchema","_additionalProperties","rest","parseLiteralDef","parsedType","emojiRegex","zodPatterns","parseStringDef","addFormat","addPattern","escapeLiteralCheckValue","literal","escapeNonAlphaNumeric","ALPHA_NUMERIC","source","result","regex","stringifyRegExpWithFlags","flags","pattern","isEscaped","inCharGroup","inCharRange","parseRecordDef","_d","_e","_f","ZodFirstPartyTypeKind2","_type","keyType","parseMapDef","keys","values","parseNativeEnumDef","object","actualValues","parsedTypes","parseNeverDef","parseNullDef","primitiveMappings","parseUnionDef","types","types2","acc","uniqueTypes","a","x2","asAnyOf","anyOf","parseNullableDef","base","parseNumberDef","parseObjectDef","required","shape","propName","propDef","propOptional","safeIsOptional","parsedDef","additionalProperties","decideAdditionalProperties","parseOptionalDef","innerSchema","parsePipelineDef","inputSchema","outputSchema","parsePromiseDef","parseSetDef","parseTupleDef","parseUndefinedDef","parseUnknownDef","parseReadonlyDef","selectParser","typeName","ZodFirstPartyTypeKind3","_","getRelativePath","pathA","pathB","forceResolution","seenItem","overrideResult","seenSchema","get$ref","newItem","jsonSchemaOrGetter","addMeta","postProcessResult","getRefs","_options","currentPath","name2","zod3ToJsonSchema","schema2","_a3","main","title","combined","schemaSymbol","lazySchema","createSchema","jsonSchema","validate","isSchema","asSchema","zodSchema","standardSchema","standardSchema2","hasStandardJsonSchema","zod3Schema","zodSchema2","useReferences","zod4Schema","z4","isZod4Schema","validateTypes","safeValidateTypes","TypeValidationError2","actualSchema","safeParseJSON","parseJsonEventStream","stream","resolve","__defProp","__export","target","all","name22","name9","marker9","symbol9","_a9","NoObjectGeneratedError","AISDKError9","text2","response","usage","finishReason","name16","symbol16","UIMessageStreamError","AISDKError17","chunkType","chunkId","jsonValueSchema","z","providerMetadataSchema","z2","fileInlineDataSchema","z3","isBuffer2","providerReferenceSchema","textPartSchema","imagePartSchema","taggedFileDataSchema","taggedReasoningFileDataSchema","filePartSchema","reasoningPartSchema","customPartSchema","reasoningFilePartSchema","toolCallPartSchema","toolResultPartSchema","toolApprovalRequestSchema","toolApprovalResponseSchema","systemModelMessageSchema","userModelMessageSchema","assistantModelMessageSchema","toolModelMessageSchema","mergeObjects","overrides","overridesValue","baseValue","isSourceObject","isTargetObject","output_exports","array","choice","json","fixJson","stack","lastValidIndex","literalStart","unicodeEscapeDigits","isHexDigit","char","processValueStart","swapState","processAfterObjectValue","processAfterArrayValue","partialLiteral","parsePartialJson","jsonText","description","asSchema2","parseResult","safeParseJSON2","validationResult","safeValidateTypes2","inputElementSchema","elementSchema","_$schema","itemSchema","outerValue","validatedElements","element","rawElements","parsedElements","rawElement","publishedElements","partialOutput","choiceOptions","potentialMatches","choiceOption","part","toolMetadataSchema","z6","uiMessageChunkSchema","isDataUIMessageChunk","createIdMap","isStaticToolUIPart","isDynamicToolUIPart","isToolUIPart","getStaticToolName","getToolName","createStreamingUIMessageState","lastMessage","messageId","processUIMessageStream","messageMetadataSchema","dataPartSchemas","runUpdateMessageJob","onToolCall","onData","state","write","_a22","getToolInvocation","toolCallId","toolInvocation","invocation","getToolInvocationByApprovalId","approvalId","_a23","updateToolPart","part2","anyOptions","anyPart","providerMetadata","resultPart","updateDynamicToolPart","updateMessageMetadata","metadata","mergedMetadata","validateTypes2","textPart","customPart","reasoningPart","toolInvocations","partialToolCall","partialArgs","existingPart","approval","partIdx","actualPartIdx","dataChunk","existingUIPart","chunkArg","consumeStream","reader","done","createIdGenerator2","createIdGenerator3","z7","createIdGenerator4","createIdGenerator5","createIdGenerator6","SerialJobExecutor","job","resolve3","reject","createIdGenerator7","createIdGenerator8","convertFileListToFileUIParts","files","file","dataUrl","readerEvent","HttpChatTransport","api","credentials","body","fetch2","prepareSendMessagesRequest","prepareReconnectToStreamRequest","abortSignal","resolvedBody","resolve2","resolvedHeaders","resolvedCredentials","baseHeaders","preparedRequest","DefaultChatTransport","parseJsonEventStream2","AbstractChat","generateId2","generateIdFunc2","transport","onFinish","sendAutomaticallyWhen","uiMessage","messageIndex","m","approved","reason","messages","updatePart","shouldSend","output","errorText","status","trigger","resumeStream","reconnect","err","isAbort","isDisconnect","isError","activeResponse","throttle","function_","wait","timeoutId","lastCallTime","arguments_","now","timeSinceLastCall","delayForNextCall","throttleit","__accessCheck","member","msg","__privateGet","getter","__privateAdd","__privateSet","setter","fn","waitMs","throttleFunction","_messages","_status","_error","_messagesCallbacks","_statusCallbacks","_errorCallbacks","_callMessagesCallbacks","_callStatusCallbacks","_callErrorCallbacks","ReactChatState","initialMessages","onChange","throttleWaitMs","callback","newStatus","newError","newMessages","_state","Chat","init","useChat","throttle2","experimental_throttle","resume","latestRef","useRef2","defaultTransport","getTransport","chatOptions","sendOptions","reconnectOptions","arg","chatRef","subscribeToMessages","useCallback2","update","setMessages","messagesParam","useEffect","AgentChatQueue","max","predicate","removed","looseOptionSchema","looseQuestionSchema","looseAskQuestionsSchema","isAskQuestionsToolName","toolName","REDUNDANT_OPTION_PATTERNS","isRedundantManualOption","label","normalize","loose","fallbackRequestId","question","questionIndex","option","optionIndex","safeJsonParse","unwrapPayload","payload","block","maybeText","parseAskQuestionsPayload","candidate","parsed","formatAskQuestionsAnswers","request","answersByQuestionId","blocks","answer","SPEC_DATA_PART_TYPE","mapUiPartsToItems","pushStep","step","last","toolDone","specItem","isAgentStreamKeepalive","isAskQuestionsPart","questions","askQuestionsItem","toolIO","partToolName","agentChatReconnectPreparer","buildAgentChatTransport","mergeTurnSources","existing","fetched","existingByTurnId","fetchedTurnIds","merged","turn","kept","sameRowIds","b","isStringArray","entry","parseTurnSettledPart","isRecord","readSteerOutcome","isTurnSteeredPart","stopAgentChatTurn","sessionId","chatStop","MAX_QUEUED_SENDS","HIGHLIGHT_ELEMENT_TOOL_NAME","useAgentChat","widgetCtx","persistedMessages","messageCtx","configRef","useRef","sendsPageContext","performsClientTools","useMemo","sendMessage","stop","clearError","log","messagesRef","queueRef","turnPhaseRef","sendPreparationTailRef","sendGenerationRef","queueVersion","setQueueVersion","useState","settling","setSettling","setTurnSources","liveTurnKey","setLiveTurnKeyState","liveTurnKeyRef","setLiveTurnKey","useCallback","pendingReleaseKeyRef","lastDrainedRef","prevStatusRef","previousSessionIdRef","ignoredStatusAfterSessionResetRef","historicalFetchSessionRef","clientStopRef","statusRef","retainFromMessage","settled","bodyFor","buildSendMessageBody","steer","generation","abort","outcome","steerRef","previousClientStop","previousSessionId","hadActiveClientStream","version","ignoredStatus","prev","genUuid","userMessageId","finishedMessage","finishedKey","v","send","work","phase","steerable","staged","withoutInitialMessages","retryFailedTurn","removeQueued","stopTurn","handlers","cancelled","pageEffects","effects","rearm","row","queuedUserMessages","built","DEFAULT","AgentChatContext","createContext","useAgentChatUi","useContext","ActiveAgentChatProvider","children","sessionState","messagesState","turnFailed","resolvePendingClarification","React","AgentChatProvider","WidgetProvider","storage","loadingComponent","errorComponent","contentIframeRef","initializationRef","initialization","setInitialization","componentStore","WidgetCtx","active","useWidget","ctx","useBot","name","avatarUrl","bot","useConfig","useDisplayMode","useContact","useDocumentDir","dir","setDir","updateDir","observer","POLL_MS","HOST_CONTEXT_CHANGED_EVENT","hostWindow","top","subscribe","notify","host","notices","tick","snapshot","useHostLocation","useMessages","useSessions","oneOpenSessionAllowed","sessionsState","openSessions","closedSessions","s","canCreateNewSession","useIsAwaitingBotReply","isSessionAssignedToAI","isLastMessageAUserMessage","useWidgetRouter","uploadAbortControllers","useUploadFiles","setFiles","appendFiles","newFiles","v4","uploadFile","updateFileById","f","removeFileById","fileItem","percentage","handleCancelUpload","fileId","successFiles","emptyTheFiles","WidgetTriggerProvider","isOpen","setIsOpen","openAfterNSeconds","timeout","useWidgetTrigger","isRestingLayout","layout","WidgetLayoutProvider","companion","WidgetLayoutStateProvider","resolveSidebarSide","resolveSidebarMode","configuredDefaultLayout","configuredLayouts","configuredSidebarSide","configuredSidebarMode","allowedLayouts","normalizeCompanionLayouts","defaultLayout","resolveCompanionDefaultLayout","allowedLayoutsKey","setLayoutState","previousConfig","setPreviousConfig","setLayout","action","current","allowedLayoutsRef","setLayoutPreference","sidebarSide","setSidebarSideState","sidebarMode","setSidebarModeState","previousSidebarConfig","setPreviousSidebarConfig","saved","setSidebarSide","side","setSidebarMode","mode","useWidgetLayout","useModes","modesComponents","modes","activeModeId","activeMode","Component","modeComponent","useCsat","csatRequestedMessage","isCsatRequested","csatSubmittedMessage","isCsatSubmitted","submittedScore","submittedFeedback","useDictation","targetRef","toggle"],"mappings":"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","x_google_ignoreList":[3,4,5,6,7,8,9]}
|