@browser-ai/web-llm 2.1.5 → 2.1.6

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../../../node_modules/@ai-sdk/provider/src/errors/ai-sdk-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/api-call-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/empty-response-body-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/get-error-message.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-argument-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-prompt-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-response-data-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/json-parse-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/load-api-key-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/load-setting-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/no-content-generated-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/no-such-model-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/too-many-embedding-values-for-call-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/type-validation-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/unsupported-functionality-error.ts","../../../../node_modules/@ai-sdk/provider/src/json-value/is-json.ts","../../shared/src/utils/tool-utils.ts","../../shared/src/utils/warnings.ts","../../shared/src/tool-calling/build-json-system-prompt.ts","../../shared/src/tool-calling/format-tool-results.ts","../../shared/src/tool-calling/parse-json-function-calls.ts","../../shared/src/streaming/tool-call-detector.ts","../../shared/src/streaming/tool-call-stream-utils.ts","../../shared/src/streaming/stream-processor.ts","../src/utils/convert-to-webllm-messages.tsx","../src/chat/web-llm-language-model.ts","../src/utils/prompt-utils.ts","../src/utils/browser.ts","../src/embedding/web-llm-embedding-model.ts","../src/web-llm-provider.ts"],"sourcesContent":["export {\n WebLLMLanguageModel,\n doesBrowserSupportWebLLM,\n} from \"./chat/web-llm-language-model\";\nexport type {\n WebLLMModelId,\n WebLLMSettings,\n} from \"./chat/web-llm-language-model\";\n\nexport { WebLLMEmbeddingModel } from \"./embedding/web-llm-embedding-model\";\nexport type {\n WebLLMEmbeddingModelId,\n WebLLMEmbeddingSettings,\n} from \"./embedding/web-llm-embedding-model\";\n\nexport type { WebLLMUIMessage, WebLLMProgress } from \"./types\";\n\nexport { WebWorkerMLCEngineHandler } from \"@mlc-ai/web-llm\";\n\nexport { webLLM, createWebLLM } from \"./web-llm-provider\";\nexport type { WebLLMProvider } from \"./web-llm-provider\";\n","/**\n * Symbol used for identifying AI SDK Error instances.\n * Enables checking if an error is an instance of AISDKError across package versions.\n */\nconst marker = 'vercel.ai.error';\nconst symbol = Symbol.for(marker);\n\n/**\n * Custom error class for AI SDK related errors.\n * @extends Error\n */\nexport class AISDKError extends Error {\n private readonly [symbol] = true; // used in isInstance\n\n /**\n * The underlying cause of the error, if any.\n */\n readonly cause?: unknown;\n\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,\n message,\n cause,\n }: {\n name: string;\n message: string;\n cause?: unknown;\n }) {\n super(message);\n\n this.name = name;\n this.cause = cause;\n }\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: unknown): error is AISDKError {\n return AISDKError.hasMarker(error, marker);\n }\n\n protected static hasMarker(error: unknown, marker: string): boolean {\n const markerSymbol = Symbol.for(marker);\n return (\n error != null &&\n typeof error === 'object' &&\n markerSymbol in error &&\n typeof error[markerSymbol] === 'boolean' &&\n error[markerSymbol] === true\n );\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_APICallError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class APICallError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly url: string;\n readonly requestBodyValues: unknown;\n readonly statusCode?: number;\n\n readonly responseHeaders?: Record<string, string>;\n readonly responseBody?: string;\n\n readonly isRetryable: boolean;\n readonly data?: unknown;\n\n constructor({\n message,\n url,\n requestBodyValues,\n statusCode,\n responseHeaders,\n responseBody,\n cause,\n isRetryable = statusCode != null &&\n (statusCode === 408 || // request timeout\n statusCode === 409 || // conflict\n statusCode === 429 || // too many requests\n statusCode >= 500), // server error\n data,\n }: {\n message: string;\n url: string;\n requestBodyValues: unknown;\n statusCode?: number;\n responseHeaders?: Record<string, string>;\n responseBody?: string;\n cause?: unknown;\n isRetryable?: boolean;\n data?: unknown;\n }) {\n super({ name, message, cause });\n\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\n static isInstance(error: unknown): error is APICallError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_EmptyResponseBodyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class EmptyResponseBodyError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message = 'Empty response body' }: { message?: string } = {}) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is EmptyResponseBodyError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","export function getErrorMessage(error: unknown | undefined) {\n if (error == null) {\n return 'unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return JSON.stringify(error);\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidArgumentError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * A function argument is invalid.\n */\nexport class InvalidArgumentError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly argument: string;\n\n constructor({\n message,\n cause,\n argument,\n }: {\n argument: string;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n\n this.argument = argument;\n }\n\n static isInstance(error: unknown): error is InvalidArgumentError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidPromptError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * A prompt is invalid. This error should be thrown by providers when they cannot\n * process a prompt.\n */\nexport class InvalidPromptError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly prompt: unknown;\n\n constructor({\n prompt,\n message,\n cause,\n }: {\n prompt: unknown;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message: `Invalid prompt: ${message}`, cause });\n\n this.prompt = prompt;\n }\n\n static isInstance(error: unknown): error is InvalidPromptError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidResponseDataError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Server returned a response with invalid data content.\n * This should be thrown by providers when they cannot parse the response from the API.\n */\nexport class InvalidResponseDataError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly data: unknown;\n\n constructor({\n data,\n message = `Invalid response data: ${JSON.stringify(data)}.`,\n }: {\n data: unknown;\n message?: string;\n }) {\n super({ name, message });\n\n this.data = data;\n }\n\n static isInstance(error: unknown): error is InvalidResponseDataError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_JSONParseError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class JSONParseError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly text: string;\n\n constructor({ text, cause }: { text: string; cause: unknown }) {\n super({\n name,\n message:\n `JSON parsing failed: ` +\n `Text: ${text}.\\n` +\n `Error message: ${getErrorMessage(cause)}`,\n cause,\n });\n\n this.text = text;\n }\n\n static isInstance(error: unknown): error is JSONParseError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadAPIKeyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadAPIKeyError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message }: { message: string }) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is LoadAPIKeyError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadSettingError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadSettingError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message }: { message: string }) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is LoadSettingError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_NoContentGeneratedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\nThrown when the AI provider fails to generate any content.\n */\nexport class NoContentGeneratedError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({\n message = 'No content generated.',\n }: { message?: string } = {}) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is NoContentGeneratedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_NoSuchModelError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class NoSuchModelError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly modelId: string;\n readonly modelType:\n | 'languageModel'\n | 'embeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel'\n | 'rerankingModel';\n\n constructor({\n errorName = name,\n modelId,\n modelType,\n message = `No such ${modelType}: ${modelId}`,\n }: {\n errorName?: string;\n modelId: string;\n modelType:\n | 'languageModel'\n | 'embeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel'\n | 'rerankingModel';\n message?: string;\n }) {\n super({ name: errorName, message });\n\n this.modelId = modelId;\n this.modelType = modelType;\n }\n\n static isInstance(error: unknown): error is NoSuchModelError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_TooManyEmbeddingValuesForCallError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class TooManyEmbeddingValuesForCallError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly provider: string;\n readonly modelId: string;\n readonly maxEmbeddingsPerCall: number;\n readonly values: Array<unknown>;\n\n constructor(options: {\n provider: string;\n modelId: string;\n maxEmbeddingsPerCall: number;\n values: Array<unknown>;\n }) {\n super({\n name,\n message:\n `Too many values for a single embedding call. ` +\n `The ${options.provider} model \"${options.modelId}\" can only embed up to ` +\n `${options.maxEmbeddingsPerCall} values per call, but ${options.values.length} values were provided.`,\n });\n\n this.provider = options.provider;\n this.modelId = options.modelId;\n this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall;\n this.values = options.values;\n }\n\n static isInstance(\n error: unknown,\n ): error is TooManyEmbeddingValuesForCallError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_TypeValidationError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class TypeValidationError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly value: unknown;\n\n constructor({ value, cause }: { value: unknown; cause: unknown }) {\n super({\n name,\n message:\n `Type validation failed: ` +\n `Value: ${JSON.stringify(value)}.\\n` +\n `Error message: ${getErrorMessage(cause)}`,\n cause,\n });\n\n this.value = value;\n }\n\n static isInstance(error: unknown): error is TypeValidationError {\n return AISDKError.hasMarker(error, marker);\n }\n\n /**\n * Wraps an error into a TypeValidationError.\n * If the cause is already a TypeValidationError with the same value, 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 * @returns {TypeValidationError} A TypeValidationError instance.\n */\n static wrap({\n value,\n cause,\n }: {\n value: unknown;\n cause: unknown;\n }): TypeValidationError {\n return TypeValidationError.isInstance(cause) && cause.value === value\n ? cause\n : new TypeValidationError({ value, cause });\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_UnsupportedFunctionalityError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class UnsupportedFunctionalityError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly functionality: string;\n\n constructor({\n functionality,\n message = `'${functionality}' functionality not supported.`,\n }: {\n functionality: string;\n message?: string;\n }) {\n super({ name, message });\n this.functionality = functionality;\n }\n\n static isInstance(error: unknown): error is UnsupportedFunctionalityError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { JSONArray, JSONObject, JSONValue } from './json-value';\n\nexport function isJSONValue(value: unknown): value is JSONValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.every(isJSONValue);\n }\n\n if (typeof value === 'object') {\n return Object.entries(value).every(\n ([key, val]) =>\n typeof key === 'string' && (val === undefined || isJSONValue(val)),\n );\n }\n\n return false;\n}\n\nexport function isJSONArray(value: unknown): value is JSONArray {\n return Array.isArray(value) && value.every(isJSONValue);\n}\n\nexport function isJSONObject(value: unknown): value is JSONObject {\n return (\n value != null &&\n typeof value === 'object' &&\n Object.entries(value).every(\n ([key, val]) =>\n typeof key === 'string' && (val === undefined || isJSONValue(val)),\n )\n );\n}\n","/**\n * Utilities for working with AI SDK tools\n */\n\nimport type {\n LanguageModelV3FunctionTool,\n LanguageModelV3ProviderTool,\n} from \"@ai-sdk/provider\";\n\n/**\n * Type guard to check if a tool is a function tool\n *\n * @param tool - The tool to check\n * @returns true if the tool is a LanguageModelV3FunctionTool\n */\nexport function isFunctionTool(\n tool: LanguageModelV3FunctionTool | LanguageModelV3ProviderTool,\n): tool is LanguageModelV3FunctionTool {\n return tool.type === \"function\";\n}\n","/**\n * Warning generation utilities for unsupported settings and tools\n */\n\nimport type {\n SharedV3Warning,\n LanguageModelV3ProviderTool,\n} from \"@ai-sdk/provider\";\n\n/**\n * Creates a warning for an unsupported setting\n *\n * @param setting - Name of the setting that is not supported\n * @param details - Additional details about why it's not supported\n * @returns A call warning object\n *\n * @example\n * ```typescript\n * const warning = createUnsupportedSettingWarning(\n * \"maxOutputTokens\",\n * \"maxOutputTokens is not supported by this provider\"\n * );\n * ```\n */\nexport function createUnsupportedSettingWarning(\n feature: string,\n details: string,\n): SharedV3Warning {\n return {\n type: \"unsupported\",\n feature,\n details,\n };\n}\n\n/**\n * Creates a warning for an unsupported tool type\n *\n * @param tool - The provider-defined tool that is not supported\n * @param details - Additional details about why it's not supported\n * @returns A call warning object\n *\n * @example\n * ```typescript\n * const warning = createUnsupportedToolWarning(\n * providerTool,\n * \"Only function tools are supported\"\n * );\n * ```\n */\nexport function createUnsupportedToolWarning(\n tool: LanguageModelV3ProviderTool,\n details: string,\n): SharedV3Warning {\n return {\n type: \"unsupported\",\n feature: `tool:${tool.name}`,\n details,\n };\n}\n","import type {\n JSONSchema7,\n LanguageModelV3FunctionTool,\n} from \"@ai-sdk/provider\";\nimport type { ToolDefinition } from \"../types\";\n\n/**\n * Builds an enhanced system prompt for JSON-based tool calling.\n * The model receives JSON schemas and is expected to return JSON tool calls.\n *\n * @param originalSystemPrompt - The original system prompt (if any)\n * @param tools - Array of available tool definitions\n * @param options - Configuration options for tool calling behavior (unused, kept for backwards compatibility)\n * @returns Enhanced system prompt with JSON tool calling instructions\n */\nexport function buildJsonToolSystemPrompt(\n originalSystemPrompt: string | undefined,\n tools: Array<ToolDefinition | LanguageModelV3FunctionTool>,\n options?: { allowParallelToolCalls?: boolean },\n): string {\n if (!tools || tools.length === 0) {\n return originalSystemPrompt || \"\";\n }\n\n const parallelInstruction =\n \"Only request one tool call at a time. Wait for tool results before asking for another tool.\";\n\n const toolSchemas = tools.map((tool) => {\n const schema = getParameters(tool);\n return {\n name: tool.name,\n description: tool.description ?? \"No description provided.\",\n parameters: schema || { type: \"object\", properties: {} },\n };\n });\n\n const toolsJson = JSON.stringify(toolSchemas, null, 2);\n\n const instructionBody = `You are a helpful AI assistant with access to tools.\n\n# Available Tools\n${toolsJson}\n\n# Tool Calling Instructions\n${parallelInstruction}\n\nTo call a tool, output JSON in this exact format inside a \\`\\`\\`tool_call code fence:\n\n\\`\\`\\`tool_call\n{\"name\": \"tool_name\", \"arguments\": {\"param1\": \"value1\", \"param2\": \"value2\"}}\n\\`\\`\\`\n\nTool responses will be provided in \\`\\`\\`tool_result fences. Each line contains JSON like:\n\\`\\`\\`tool_result\n{\"id\": \"call_123\", \"name\": \"tool_name\", \"result\": {...}, \"error\": false}\n\\`\\`\\`\nUse the \\`result\\` payload (and treat \\`error\\` as a boolean flag) when continuing the conversation.\n\nImportant:\n- Use exact tool and parameter names from the schema above\n- Arguments must be a valid JSON object matching the tool's parameters\n- You can include brief reasoning before or after the tool call\n- If no tool is needed, respond directly without tool_call fences`;\n\n if (originalSystemPrompt?.trim()) {\n return `${originalSystemPrompt.trim()}\\n\\n${instructionBody}`;\n }\n\n return instructionBody;\n}\n\n/**\n * Extracts the parameters/input schema from a tool definition.\n * Handles both ToolDefinition (parameters field) and LanguageModelV3FunctionTool (inputSchema field).\n *\n * @param tool - The tool definition to extract parameters from\n * @returns The JSON Schema for the tool's parameters, or undefined if not present\n */\nfunction getParameters(\n tool: ToolDefinition | LanguageModelV3FunctionTool,\n): JSONSchema7 | undefined {\n if (\"parameters\" in tool) {\n return tool.parameters;\n }\n\n return tool.inputSchema as JSONSchema7 | undefined;\n}\n","import type { ToolResult } from \"../types\";\n\n/**\n * Builds a JSON-serializable payload for a single tool result.\n * Includes tool name, result data, error flag, and optional call ID.\n *\n * @param result - The tool execution result to format\n * @returns Object containing formatted result data ready for JSON serialization\n */\nfunction buildResultPayload(result: ToolResult): Record<string, unknown> {\n const payload: Record<string, unknown> = {\n name: result.toolName,\n result: result.result ?? null,\n error: Boolean(result.isError),\n };\n\n if (result.toolCallId) {\n payload.id = result.toolCallId;\n }\n\n return payload;\n}\n\n/**\n * Formats tool execution results as JSON for continuation in the conversation.\n *\n * Each result is serialized as a single JSON object. Multiple results (for parallel\n * execution scenarios) are emitted on separate lines within a ```tool_result code fence.\n *\n * @param results - Array of tool execution results to format\n * @returns Formatted string with results in tool_result code fence, or empty string if no results\n * @example\n * ```typescript\n * formatToolResults([\n * { toolCallId: \"call_123\", toolName: \"search\", result: { data: \"...\" } }\n * ])\n * // Returns: ```tool_result\\n{\"id\":\"call_123\",\"name\":\"search\",\"result\":{...},\"error\":false}\\n```\n * ```\n */\nexport function formatToolResults(results: ToolResult[]): string {\n if (!results || results.length === 0) {\n return \"\";\n }\n\n const payloads = results.map((result) =>\n JSON.stringify(buildResultPayload(result)),\n );\n\n return `\\`\\`\\`tool_result\n${payloads.join(\"\\n\")}\n\\`\\`\\``;\n}\n\n/**\n * Formats a single tool result.\n * Convenience wrapper around formatToolResults for single result scenarios.\n *\n * @param result - The tool execution result to format\n * @returns Formatted string with result in tool_result code fence\n */\nexport function formatSingleToolResult(result: ToolResult): string {\n return formatToolResults([result]);\n}\n","import type { ParsedResponse, ParsedToolCall } from \"../types\";\n\n/**\n * Options for configuring the JSON function call parser\n */\nexport interface ParseJsonFunctionCallsOptions {\n /** Support XML-style tags: <tool_call>...</tool_call> */\n supportXmlTags?: boolean;\n /** Support Python-style: [functionName(arg=\"value\")] */\n supportPythonStyle?: boolean;\n /** Support \"parameters\" as alias for \"arguments\" (Llama format) */\n supportParametersField?: boolean;\n}\n\nconst DEFAULT_OPTIONS: ParseJsonFunctionCallsOptions = {\n supportXmlTags: true,\n supportPythonStyle: true,\n supportParametersField: true,\n};\n\nfunction generateToolCallId(): string {\n return `call_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction buildRegex(options: ParseJsonFunctionCallsOptions): RegExp {\n const patterns: string[] = [];\n\n // Always support markdown fences\n patterns.push(\"```tool[_-]?call\\\\s*([\\\\s\\\\S]*?)```\");\n\n if (options.supportXmlTags) {\n patterns.push(\"<tool_call>\\\\s*([\\\\s\\\\S]*?)\\\\s*</tool_call>\");\n }\n\n if (options.supportPythonStyle) {\n patterns.push(\"\\\\[(\\\\w+)\\\\(([^)]*)\\\\)\\\\]\");\n }\n\n return new RegExp(patterns.join(\"|\"), \"gi\");\n}\n\n/**\n * Parses JSON-formatted tool calls from model response.\n * Supports multiple formats:\n * 1. Single object: {\"name\": \"tool\", \"arguments\": {...}} or {\"name\": \"tool\", \"parameters\": {...}}\n * 2. Array: [{\"name\": \"tool1\", ...}, {\"name\": \"tool2\", ...}]\n * 3. Newline-separated objects:\n * {\"name\": \"tool1\", \"arguments\": {...}}\n * {\"name\": \"tool2\", \"arguments\": {...}}\n *\n * Note: Handles both \"arguments\" (OpenAI/Mistral format) and \"parameters\" (Llama format)\n *\n * @param response - The model's response text to parse\n * @param options - Configuration options for parsing\n * @returns Object containing parsed tool calls and remaining text content\n */\nexport function parseJsonFunctionCalls(\n response: string,\n options: ParseJsonFunctionCallsOptions = DEFAULT_OPTIONS,\n): ParsedResponse {\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const regex = buildRegex(mergedOptions);\n\n const matches = Array.from(response.matchAll(regex));\n regex.lastIndex = 0;\n\n if (matches.length === 0) {\n return { toolCalls: [], textContent: response };\n }\n\n const toolCalls: ParsedToolCall[] = [];\n let textContent = response;\n\n for (const match of matches) {\n const fullMatch = match[0];\n textContent = textContent.replace(fullMatch, \"\");\n\n try {\n // Check for Python-style match: [functionName(args)]\n if (mergedOptions.supportPythonStyle && match[0].startsWith(\"[\")) {\n const pythonMatch = /\\[(\\w+)\\(([^)]*)\\)\\]/.exec(match[0]);\n if (pythonMatch) {\n const [, funcName, pythonArgs] = pythonMatch;\n const args: Record<string, unknown> = {};\n\n if (pythonArgs && pythonArgs.trim()) {\n const argPairs = pythonArgs.split(\",\").map((s) => s.trim());\n for (const pair of argPairs) {\n const equalIndex = pair.indexOf(\"=\");\n if (equalIndex > 0) {\n const key = pair.substring(0, equalIndex).trim();\n let value = pair.substring(equalIndex + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.substring(1, value.length - 1);\n }\n args[key] = value;\n }\n }\n }\n\n toolCalls.push({\n type: \"tool-call\",\n toolCallId: generateToolCallId(),\n toolName: funcName,\n args: args,\n });\n continue;\n }\n }\n\n // Get the captured content from the first capturing group\n const innerContent = match[1] || match[2] || \"\";\n const trimmed = innerContent.trim();\n\n if (!trimmed) continue;\n\n // Try parsing as a single JSON value first (object or array)\n try {\n const parsed = JSON.parse(trimmed);\n const callsArray = Array.isArray(parsed) ? parsed : [parsed];\n\n for (const call of callsArray) {\n if (!call.name) continue;\n\n let args =\n call.arguments ||\n (mergedOptions.supportParametersField ? call.parameters : null) ||\n {};\n\n // If args is a string, try to parse it as JSON\n if (typeof args === \"string\") {\n try {\n args = JSON.parse(args);\n } catch {\n // If parsing fails, keep it as string\n }\n }\n\n toolCalls.push({\n type: \"tool-call\",\n toolCallId: call.id || generateToolCallId(),\n toolName: call.name,\n args: args,\n });\n }\n } catch {\n // If single JSON parsing fails, try parsing as newline-separated JSON objects\n const lines = trimmed.split(\"\\n\").filter((line) => line.trim());\n\n for (const line of lines) {\n try {\n const call = JSON.parse(line.trim());\n if (!call.name) continue;\n\n let args =\n call.arguments ||\n (mergedOptions.supportParametersField ? call.parameters : null) ||\n {};\n\n if (typeof args === \"string\") {\n try {\n args = JSON.parse(args);\n } catch {\n // If parsing fails, keep it as string\n }\n }\n\n toolCalls.push({\n type: \"tool-call\",\n toolCallId: call.id || generateToolCallId(),\n toolName: call.name,\n args: args,\n });\n } catch {\n // Skip invalid JSON lines\n continue;\n }\n }\n }\n } catch (error) {\n console.warn(\"Failed to parse JSON tool call:\", error);\n continue;\n }\n }\n\n textContent = textContent.replace(/\\n{2,}/g, \"\\n\");\n\n return { toolCalls, textContent: textContent.trim() };\n}\n\n/**\n * Checks if a response contains JSON function calls\n */\nexport function hasJsonFunctionCalls(\n response: string,\n options: ParseJsonFunctionCallsOptions = DEFAULT_OPTIONS,\n): boolean {\n const regex = buildRegex({ ...DEFAULT_OPTIONS, ...options });\n const hasMatch = regex.test(response);\n regex.lastIndex = 0;\n return hasMatch;\n}\n\n/**\n * Extracts the first JSON function call block from a response\n */\nexport function extractJsonFunctionCallsBlock(\n response: string,\n options: ParseJsonFunctionCallsOptions = DEFAULT_OPTIONS,\n): string | null {\n const regex = buildRegex({ ...DEFAULT_OPTIONS, ...options });\n const match = regex.exec(response);\n regex.lastIndex = 0;\n return match ? match[0] : null;\n}\n","/**\n * ToolCallFenceDetector - Detects and extracts tool call fences from streaming text\n *\n * This module handles the complex task of detecting tool call fences in a stream\n * where fences might be split across multiple chunks. It uses overlap detection\n * to avoid emitting text that might be the beginning of a fence.\n */\n\n/**\n * Result of fence detection operation\n */\nexport interface FenceDetectionResult {\n fence: string | null;\n prefixText: string;\n remainingText: string;\n /** Length of potential partial fence at buffer end */\n overlapLength: number;\n}\n\n/**\n * Result of streaming fence content detection\n */\nexport interface StreamingFenceResult {\n inFence: boolean;\n /** Content that can be safely emitted (either as text or tool-input-delta) */\n safeContent: string;\n completeFence: string | null;\n textAfterFence: string;\n}\n\n/**\n * Fence pattern configuration\n */\nexport interface FencePattern {\n start: string;\n end: string;\n reconstructStart: string;\n isRegex?: boolean;\n matchedStart?: string;\n}\n\n/**\n * Options for configuring the ToolCallFenceDetector\n */\nexport interface ToolCallFenceDetectorOptions {\n /** Custom fence patterns to use instead of defaults */\n patterns?: FencePattern[];\n /** Enable Python-style function call detection: [functionName(args)] */\n enablePythonStyle?: boolean;\n}\n\n/**\n * Default fence patterns for tool call detection\n */\nexport const DEFAULT_FENCE_PATTERNS: FencePattern[] = [\n { start: \"```tool_call\", end: \"```\", reconstructStart: \"```tool_call\\n\" },\n { start: \"```tool-call\", end: \"```\", reconstructStart: \"```tool-call\\n\" },\n];\n\n/**\n * Extended fence patterns including XML-style tags\n */\nexport const EXTENDED_FENCE_PATTERNS: FencePattern[] = [\n ...DEFAULT_FENCE_PATTERNS,\n {\n start: \"<tool_call>\",\n end: \"</tool_call>\",\n reconstructStart: \"<tool_call>\",\n },\n];\n\n/**\n * Detects tool call fences in streaming text with support for partial matches\n */\nexport class ToolCallFenceDetector {\n private readonly fencePatterns: FencePattern[];\n private readonly enablePythonStyle: boolean;\n private readonly pythonStyleRegex = /\\[(\\w+)\\(/g;\n private readonly fenceStarts: string[];\n private buffer = \"\";\n\n private inFence = false;\n private fenceStartBuffer = \"\"; // Accumulated fence content\n private currentFencePattern: FencePattern | null = null;\n\n constructor(options: ToolCallFenceDetectorOptions = {}) {\n this.fencePatterns = options.patterns ?? EXTENDED_FENCE_PATTERNS;\n this.enablePythonStyle = options.enablePythonStyle ?? true;\n this.fenceStarts = this.fencePatterns.map((p) => p.start);\n }\n\n addChunk(chunk: string): void {\n this.buffer += chunk;\n }\n\n getBuffer(): string {\n return this.buffer;\n }\n\n clearBuffer(): void {\n this.buffer = \"\";\n }\n\n /**\n * Detects if there's a complete fence in the buffer\n * @returns Detection result with fence info and safe text\n */\n detectFence(): FenceDetectionResult {\n const {\n index: startIdx,\n prefix: matchedPrefix,\n pattern,\n } = this.findFenceStart(this.buffer);\n\n // No fence start found\n if (startIdx === -1) {\n // Compute how much of the buffer end might be a partial fence start\n const overlap = this.computeOverlapLength(this.buffer, this.fenceStarts);\n const safeTextLength = this.buffer.length - overlap;\n\n const prefixText =\n safeTextLength > 0 ? this.buffer.slice(0, safeTextLength) : \"\";\n const remaining = overlap > 0 ? this.buffer.slice(-overlap) : \"\";\n\n // Update buffer to keep only the overlap\n this.buffer = remaining;\n\n return {\n fence: null,\n prefixText,\n remainingText: \"\",\n overlapLength: overlap,\n };\n }\n\n const prefixText = this.buffer.slice(0, startIdx);\n this.buffer = this.buffer.slice(startIdx);\n\n // Look for closing fence using the matched pattern's end marker\n const prefixLength = matchedPrefix?.length ?? 0;\n const fenceEnd = pattern?.end ?? \"```\";\n const closingIdx = this.buffer.indexOf(fenceEnd, prefixLength);\n\n // Fence not complete yet\n if (closingIdx === -1) {\n // Keep the buffer as-is, waiting for more data\n return {\n fence: null,\n prefixText,\n remainingText: \"\",\n overlapLength: 0,\n };\n }\n\n // Complete fence found!\n const endPos = closingIdx + fenceEnd.length;\n const fence = this.buffer.slice(0, endPos);\n const remainingText = this.buffer.slice(endPos);\n\n // Clear the buffer since we extracted everything\n this.buffer = \"\";\n\n return {\n fence,\n prefixText,\n remainingText,\n overlapLength: 0,\n };\n }\n\n /**\n * Finds the first occurrence of any fence start marker\n *\n * @param text - Text to search in\n * @returns Index of first fence start and which pattern matched\n * @private\n */\n private findFenceStart(text: string): {\n index: number;\n prefix: string | null;\n pattern: FencePattern | null;\n } {\n let bestIndex = -1;\n let matchedPrefix: string | null = null;\n let matchedPattern: FencePattern | null = null;\n\n for (const pattern of this.fencePatterns) {\n const idx = text.indexOf(pattern.start);\n if (idx !== -1 && (bestIndex === -1 || idx < bestIndex)) {\n bestIndex = idx;\n matchedPrefix = pattern.start;\n matchedPattern = pattern;\n }\n }\n\n if (this.enablePythonStyle) {\n this.pythonStyleRegex.lastIndex = 0;\n const pythonMatch = this.pythonStyleRegex.exec(text);\n if (pythonMatch && (bestIndex === -1 || pythonMatch.index < bestIndex)) {\n bestIndex = pythonMatch.index;\n matchedPrefix = pythonMatch[0];\n matchedPattern = {\n start: pythonMatch[0],\n end: \")]\",\n reconstructStart: pythonMatch[0],\n isRegex: true,\n };\n }\n }\n\n return { index: bestIndex, prefix: matchedPrefix, pattern: matchedPattern };\n }\n\n /**\n * Computes the maximum overlap between the end of text and the start of any prefix\n * @param text - Text to check for overlap\n * @param prefixes - List of prefixes to check against\n * @returns Length of the maximum overlap found\n */\n private computeOverlapLength(text: string, prefixes: string[]): number {\n let overlap = 0;\n\n for (const prefix of prefixes) {\n const maxLength = Math.min(text.length, prefix.length - 1);\n\n for (let size = maxLength; size > 0; size -= 1) {\n // Check if the last 'size' characters of text match the first 'size' characters of prefix\n if (prefix.startsWith(text.slice(-size))) {\n overlap = Math.max(overlap, size);\n break;\n }\n }\n }\n\n return overlap;\n }\n\n /**\n * Checks if the buffer currently contains any text\n */\n hasContent(): boolean {\n return this.buffer.length > 0;\n }\n\n /**\n * Gets the buffer size\n */\n getBufferSize(): number {\n return this.buffer.length;\n }\n\n /**\n * Detect and stream fence content in real-time for true incremental streaming\n * @returns Streaming result with current state and safe content to emit\n */\n detectStreamingFence(): StreamingFenceResult {\n if (!this.inFence) {\n // Look for fence start\n const {\n index: startIdx,\n prefix: matchedPrefix,\n pattern,\n } = this.findFenceStart(this.buffer);\n\n if (startIdx === -1) {\n // No fence start found - emit safe text\n const overlap = this.computeOverlapLength(\n this.buffer,\n this.fenceStarts,\n );\n const safeTextLength = this.buffer.length - overlap;\n const safeContent =\n safeTextLength > 0 ? this.buffer.slice(0, safeTextLength) : \"\";\n this.buffer = this.buffer.slice(safeTextLength);\n\n return {\n inFence: false,\n safeContent,\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n // Found fence start!\n const prefixText = this.buffer.slice(0, startIdx);\n const fenceStartLength = matchedPrefix?.length ?? 0;\n\n // Move buffer past the fence start marker\n this.buffer = this.buffer.slice(startIdx + fenceStartLength);\n\n if (\n pattern &&\n pattern.start.startsWith(\"```\") &&\n this.buffer.startsWith(\"\\n\")\n ) {\n this.buffer = this.buffer.slice(1);\n }\n\n this.inFence = true;\n this.fenceStartBuffer = \"\";\n this.currentFencePattern = pattern;\n\n return {\n inFence: true,\n safeContent: prefixText, // Emit any text before the fence\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n // We're inside a fence - look for fence end using the current pattern\n const fenceEnd = this.currentFencePattern?.end ?? \"```\";\n const closingIdx = this.buffer.indexOf(fenceEnd);\n\n if (closingIdx === -1) {\n // No fence end yet - emit safe content (leaving potential fence end marker)\n const overlap = this.computeOverlapLength(this.buffer, [fenceEnd]);\n const safeContentLength = this.buffer.length - overlap;\n\n if (safeContentLength > 0) {\n const safeContent = this.buffer.slice(0, safeContentLength);\n this.fenceStartBuffer += safeContent;\n this.buffer = this.buffer.slice(safeContentLength);\n\n return {\n inFence: true,\n safeContent,\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n // Nothing safe to emit yet\n return {\n inFence: true,\n safeContent: \"\",\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n // Found fence end!\n const fenceContent = this.buffer.slice(0, closingIdx);\n this.fenceStartBuffer += fenceContent;\n\n // Reconstruct complete fence using the current pattern\n const reconstructStart =\n this.currentFencePattern?.reconstructStart ?? \"```tool_call\\n\";\n const completeFence = `${reconstructStart}${this.fenceStartBuffer}${fenceEnd}`;\n\n // Get text after fence\n const textAfterFence = this.buffer.slice(closingIdx + fenceEnd.length);\n\n // Reset state\n this.inFence = false;\n this.fenceStartBuffer = \"\";\n this.currentFencePattern = null;\n this.buffer = textAfterFence;\n\n return {\n inFence: false,\n safeContent: fenceContent, // Emit the last bit of fence content\n completeFence,\n textAfterFence,\n };\n }\n\n isInFence(): boolean {\n return this.inFence;\n }\n\n resetStreamingState(): void {\n this.inFence = false;\n this.fenceStartBuffer = \"\";\n this.currentFencePattern = null;\n }\n}\n\n/**\n * Creates a basic ToolCallFenceDetector with default markdown fence patterns\n */\nexport function createBasicDetector(): ToolCallFenceDetector {\n return new ToolCallFenceDetector({\n patterns: DEFAULT_FENCE_PATTERNS,\n enablePythonStyle: false,\n });\n}\n\n/**\n * Creates an extended ToolCallFenceDetector with all fence patterns\n */\nexport function createExtendedDetector(): ToolCallFenceDetector {\n return new ToolCallFenceDetector({\n patterns: EXTENDED_FENCE_PATTERNS,\n enablePythonStyle: true,\n });\n}\n","/**\n * Extracts tool name from partial fence content for early tool-input-start emission.\n * Expects a JSON fragment like: {\"name\":\"toolName\"\n */\nexport function extractToolName(content: string): string | null {\n const jsonMatch = content.match(/\\{\\s*\"name\"\\s*:\\s*\"([^\"]+)\"/);\n if (jsonMatch) {\n return jsonMatch[1];\n }\n return null;\n}\n\nexport interface ArgumentsStreamState {\n searchFrom: number;\n valueStartIndex: number | null;\n parseIndex: number;\n started: boolean;\n depth: number;\n inString: boolean;\n escaped: boolean;\n complete: boolean;\n}\n\nconst ARGUMENTS_FIELD_REGEX = /\"arguments\"\\s*:\\s*/g;\nconst ARGUMENTS_SEARCH_OVERLAP = 32;\n\nexport function createArgumentsStreamState(): ArgumentsStreamState {\n return {\n searchFrom: 0,\n valueStartIndex: null,\n parseIndex: 0,\n started: false,\n depth: 0,\n inString: false,\n escaped: false,\n complete: false,\n };\n}\n\n/**\n * Incrementally extracts only new argument content from a streaming tool call fence.\n */\nexport function extractArgumentsDelta(\n content: string,\n state: ArgumentsStreamState,\n): string {\n if (state.complete) {\n return \"\";\n }\n\n if (state.valueStartIndex === null) {\n ARGUMENTS_FIELD_REGEX.lastIndex = state.searchFrom;\n const match = ARGUMENTS_FIELD_REGEX.exec(content);\n ARGUMENTS_FIELD_REGEX.lastIndex = 0;\n\n if (!match || match.index === undefined) {\n state.searchFrom = Math.max(0, content.length - ARGUMENTS_SEARCH_OVERLAP);\n return \"\";\n }\n\n state.valueStartIndex = match.index + match[0].length;\n state.parseIndex = state.valueStartIndex;\n state.searchFrom = state.valueStartIndex;\n }\n\n if (state.parseIndex >= content.length) {\n return \"\";\n }\n\n let delta = \"\";\n for (let i = state.parseIndex; i < content.length; i++) {\n const char = content[i];\n delta += char;\n\n if (!state.started) {\n if (!/\\s/.test(char)) {\n state.started = true;\n if (char === \"{\" || char === \"[\") {\n state.depth = 1;\n }\n }\n continue;\n }\n\n if (state.escaped) {\n state.escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n state.escaped = true;\n continue;\n }\n\n if (char === '\"') {\n state.inString = !state.inString;\n continue;\n }\n\n if (!state.inString) {\n if (char === \"{\" || char === \"[\") {\n state.depth += 1;\n } else if (char === \"}\" || char === \"]\") {\n if (state.depth > 0) {\n state.depth -= 1;\n if (state.depth === 0) {\n state.parseIndex = i + 1;\n state.complete = true;\n return delta;\n }\n }\n }\n }\n }\n\n state.parseIndex = content.length;\n return delta;\n}\n","import type { LanguageModelV3StreamPart } from \"@ai-sdk/provider\";\nimport { ToolCallFenceDetector } from \"./tool-call-detector\";\nimport {\n createArgumentsStreamState,\n extractArgumentsDelta,\n extractToolName,\n} from \"./tool-call-stream-utils\";\nimport { parseJsonFunctionCalls } from \"../tool-calling/parse-json-function-calls\";\nimport type { ParsedToolCall } from \"../types\";\n\nexport interface ToolCallStreamResult {\n toolCallDetected: boolean;\n toolCalls: ParsedToolCall[];\n /** Text appearing after the tool call fence — caller decides when to emit it */\n trailingText: string;\n}\n\nexport function generateToolCallId(): string {\n return `call_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Processes an async iterable of string chunks, detecting tool call fences and\n * emitting the appropriate stream events via `controller` and `emitTextDelta`.\n *\n * When `stopEarlyOnToolCall` is true the function stops consuming chunks as soon as\n * a tool call is detected (useful when the caller needs to cancel the source).\n * When false (the default) the function continues draining remaining chunks without\n * processing them, allowing the underlying stream/engine to conclude normally.\n */\nexport async function processToolCallStream(\n chunks: AsyncIterable<string>,\n emitTextDelta: (delta: string) => void,\n controller: ReadableStreamDefaultController<LanguageModelV3StreamPart>,\n options?: { stopEarlyOnToolCall?: boolean },\n): Promise<ToolCallStreamResult> {\n const fenceDetector = new ToolCallFenceDetector();\n\n let currentToolCallId: string | null = null;\n let toolInputStartEmitted = false;\n let accumulatedFenceContent = \"\";\n let argumentsStreamState = createArgumentsStreamState();\n let insideFence = false;\n\n let toolCallDetected = false;\n let toolCalls: ParsedToolCall[] = [];\n let trailingText = \"\";\n\n const resetFenceState = () => {\n currentToolCallId = null;\n toolInputStartEmitted = false;\n accumulatedFenceContent = \"\";\n argumentsStreamState = createArgumentsStreamState();\n insideFence = false;\n };\n\n for await (const chunk of chunks) {\n if (toolCallDetected) {\n // Drain without processing so the underlying stream/engine can conclude.\n continue;\n }\n\n fenceDetector.addChunk(chunk);\n\n while (fenceDetector.hasContent()) {\n const wasInsideFence = insideFence;\n const result = fenceDetector.detectStreamingFence();\n insideFence = result.inFence;\n\n let madeProgress = false;\n\n if (!wasInsideFence && result.inFence) {\n if (result.safeContent) {\n emitTextDelta(result.safeContent);\n madeProgress = true;\n }\n\n currentToolCallId = generateToolCallId();\n toolInputStartEmitted = false;\n accumulatedFenceContent = \"\";\n argumentsStreamState = createArgumentsStreamState();\n insideFence = true;\n\n continue;\n }\n\n if (result.completeFence) {\n madeProgress = true;\n if (result.safeContent) {\n accumulatedFenceContent += result.safeContent;\n }\n\n if (toolInputStartEmitted && currentToolCallId) {\n const delta = extractArgumentsDelta(\n accumulatedFenceContent,\n argumentsStreamState,\n );\n if (delta.length > 0) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: currentToolCallId,\n delta,\n });\n }\n }\n\n const parsed = parseJsonFunctionCalls(result.completeFence);\n const selectedToolCalls = parsed.toolCalls.slice(0, 1);\n\n if (selectedToolCalls.length === 0) {\n emitTextDelta(result.completeFence);\n if (result.textAfterFence) {\n emitTextDelta(result.textAfterFence);\n }\n resetFenceState();\n continue;\n }\n\n if (currentToolCallId) {\n selectedToolCalls[0].toolCallId = currentToolCallId;\n }\n\n for (const [index, call] of selectedToolCalls.entries()) {\n const toolCallId =\n index === 0 && currentToolCallId\n ? currentToolCallId\n : call.toolCallId;\n const toolName = call.toolName;\n const argsJson = JSON.stringify(call.args ?? {});\n\n if (toolCallId === currentToolCallId) {\n if (!toolInputStartEmitted) {\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallId,\n toolName,\n });\n toolInputStartEmitted = true;\n }\n\n const delta = extractArgumentsDelta(\n accumulatedFenceContent,\n argumentsStreamState,\n );\n if (delta.length > 0) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCallId,\n delta,\n });\n }\n } else {\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallId,\n toolName,\n });\n if (argsJson.length > 0) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCallId,\n delta: argsJson,\n });\n }\n }\n\n controller.enqueue({ type: \"tool-input-end\", id: toolCallId });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId,\n toolName,\n input: argsJson,\n providerExecuted: false,\n });\n }\n\n trailingText = result.textAfterFence ?? \"\";\n toolCalls = selectedToolCalls;\n toolCallDetected = true;\n resetFenceState();\n break; // stop processing inner buffer\n }\n\n if (insideFence) {\n if (result.safeContent) {\n accumulatedFenceContent += result.safeContent;\n madeProgress = true;\n\n const toolName = extractToolName(accumulatedFenceContent);\n if (toolName && !toolInputStartEmitted && currentToolCallId) {\n controller.enqueue({\n type: \"tool-input-start\",\n id: currentToolCallId,\n toolName,\n });\n toolInputStartEmitted = true;\n }\n\n if (toolInputStartEmitted && currentToolCallId) {\n const delta = extractArgumentsDelta(\n accumulatedFenceContent,\n argumentsStreamState,\n );\n if (delta.length > 0) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: currentToolCallId,\n delta,\n });\n }\n }\n }\n\n continue;\n }\n\n if (!insideFence && result.safeContent) {\n emitTextDelta(result.safeContent);\n madeProgress = true;\n }\n\n if (!madeProgress) {\n break;\n }\n }\n\n if (toolCallDetected && options?.stopEarlyOnToolCall) {\n break; // caller will cancel/drain the underlying source\n }\n }\n\n // Flush any remaining buffer when no tool call was detected\n if (!toolCallDetected && fenceDetector.hasContent()) {\n emitTextDelta(fenceDetector.getBuffer());\n fenceDetector.clearBuffer();\n }\n\n return { toolCallDetected, toolCalls, trailingText };\n}\n","import {\n LanguageModelV3Prompt,\n LanguageModelV3ToolResultPart,\n LanguageModelV3ToolResultOutput,\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\";\nimport * as webllm from \"@mlc-ai/web-llm\";\nimport { formatToolResults, type ToolResult } from \"@browser-ai/shared\";\n\n/**\n * Converts the AI SDK ToolResultOutput format to a simple value + error flag\n */\nfunction convertToolResultOutput(output: LanguageModelV3ToolResultOutput): {\n value: unknown;\n isError: boolean;\n} {\n switch (output.type) {\n case \"text\":\n return { value: output.value, isError: false };\n case \"json\":\n return { value: output.value, isError: false };\n case \"error-text\":\n return { value: output.value, isError: true };\n case \"error-json\":\n return { value: output.value, isError: true };\n case \"content\":\n return { value: output.value, isError: false };\n case \"execution-denied\":\n return { value: output.reason, isError: true };\n default: {\n const exhaustiveCheck: never = output;\n return { value: exhaustiveCheck, isError: false };\n }\n }\n}\n\n/**\n * Converts a ToolResultPart to our internal ToolResult format\n */\nfunction toToolResult(part: LanguageModelV3ToolResultPart): ToolResult {\n const { value, isError } = convertToolResultOutput(part.output);\n return {\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: value,\n isError,\n };\n}\n\nfunction uint8ArrayToBase64(uint8array: Uint8Array): string {\n const binary = Array.from(uint8array, (byte) =>\n String.fromCharCode(byte),\n ).join(\"\");\n return btoa(binary);\n}\n\nfunction convertDataToURL(\n data:\n | string\n | Buffer\n | URL\n | Uint8Array\n | ArrayBuffer\n | ReadableStream\n | undefined,\n mediaType: string,\n): string {\n if (data instanceof URL) {\n return data.toString();\n }\n\n if (typeof data === \"string\") {\n // AI SDK provides base64 string\n return `data:${mediaType};base64,${data}`;\n }\n\n if (data instanceof Uint8Array) {\n return `data:${mediaType};base64,${uint8ArrayToBase64(data)}`;\n }\n\n if (data instanceof ArrayBuffer) {\n return `data:${mediaType};base64,${uint8ArrayToBase64(\n new Uint8Array(data),\n )}`;\n }\n\n if (typeof Buffer !== \"undefined\" && data instanceof Buffer) {\n return `data:${mediaType};base64,${data.toString(\"base64\")}`;\n }\n\n throw new UnsupportedFunctionalityError({\n functionality: `file data type: ${typeof data}`,\n });\n}\n\nexport function convertToWebLLMMessages(\n prompt: LanguageModelV3Prompt,\n): webllm.ChatCompletionMessageParam[] {\n const messages: webllm.ChatCompletionMessageParam[] = [];\n\n for (const message of prompt) {\n switch (message.role) {\n case \"system\":\n messages.push({\n role: \"system\",\n content: message.content,\n });\n break;\n\n case \"user\":\n const hasFileContent = message.content.some(\n (part) => part.type === \"file\",\n );\n\n if (!hasFileContent) {\n const userContent: string[] = [];\n for (const part of message.content) {\n if (part.type === \"text\") {\n userContent.push(part.text);\n }\n }\n messages.push({\n role: \"user\",\n content: userContent.join(\"\\n\"),\n });\n break;\n }\n\n const content: webllm.ChatCompletionContentPart[] = [];\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text });\n } else if (part.type === \"file\") {\n if (!part.mediaType?.startsWith(\"image/\")) {\n throw new UnsupportedFunctionalityError({\n functionality: `file input with media type '${part.mediaType}'`,\n });\n }\n content.push({\n type: \"image_url\",\n image_url: {\n url: convertDataToURL(part.data, part.mediaType),\n },\n });\n }\n }\n messages.push({ role: \"user\", content });\n break;\n\n case \"assistant\":\n let assistantContent = \"\";\n const toolCallsInMessage: Array<{\n toolCallId: string;\n toolName: string;\n }> = [];\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n assistantContent += part.text;\n } else if (part.type === \"tool-call\") {\n // Store tool call info but don't include in content\n // Tool calls will be tracked separately\n toolCallsInMessage.push({\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n });\n }\n }\n\n // Only add assistant message if there's text content\n // Tool calls are handled via the JSON fence format in the text\n if (assistantContent) {\n messages.push({\n role: \"assistant\",\n content: assistantContent,\n });\n }\n break;\n\n case \"tool\":\n // Collect tool results and format them\n // filter for tool-result parts only\n // not sure how to support tool-approval-response parts yet\n const toolResults: ToolResult[] = message.content\n .filter((part) => part.type === \"tool-result\")\n .map(toToolResult);\n\n // Format tool results as user message with JSON fence format\n const formattedResults = formatToolResults(toolResults);\n messages.push({\n role: \"user\",\n content: formattedResults,\n });\n break;\n }\n }\n\n return messages;\n}\n","import {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n SharedV3Warning,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3ProviderTool,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n LoadSettingError,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n} from \"@ai-sdk/provider\";\nimport { convertToWebLLMMessages } from \"../utils/convert-to-webllm-messages\";\n\nimport {\n AppConfig,\n ChatCompletionRequestStreaming,\n CreateWebWorkerMLCEngine,\n InitProgressReport,\n MLCEngine,\n MLCEngineConfig,\n MLCEngineInterface,\n} from \"@mlc-ai/web-llm\";\nimport { Availability } from \"../types\";\nimport {\n buildJsonToolSystemPrompt,\n parseJsonFunctionCalls,\n createUnsupportedSettingWarning,\n createUnsupportedToolWarning,\n isFunctionTool,\n processToolCallStream,\n type ToolDefinition,\n type DownloadProgressCallback,\n} from \"@browser-ai/shared\";\nimport {\n prependSystemPromptToMessages,\n extractSystemPrompt,\n} from \"../utils/prompt-utils\";\nimport {\n isMobile,\n checkWebGPU,\n doesBrowserSupportWebLLM,\n} from \"../utils/browser\";\n\nexport { doesBrowserSupportWebLLM };\n\nexport type WebLLMModelId = string;\n\nexport interface WebLLMSettings {\n /**\n * Custom app configuration for WebLLM\n */\n appConfig?: AppConfig;\n /**\n * Progress callback for model initialization\n */\n initProgressCallback?: (progress: InitProgressReport) => void;\n /**\n * Engine configuration options\n */\n engineConfig?: MLCEngineConfig;\n /**\n * A web worker instance to run the model in.\n * When provided, the model will run in a separate thread.\n *\n * @default undefined\n */\n worker?: Worker;\n}\n\ntype WebLLMConfig = {\n provider: string;\n modelId: WebLLMModelId;\n options: WebLLMSettings;\n};\n\nexport class WebLLMLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\";\n readonly modelId: WebLLMModelId;\n readonly provider = \"web-llm\";\n\n private readonly config: WebLLMConfig;\n private engine?: MLCEngineInterface;\n private isInitialized = false;\n private initializationPromise?: Promise<void>;\n\n constructor(modelId: WebLLMModelId, options: WebLLMSettings = {}) {\n this.modelId = modelId;\n this.config = {\n provider: this.provider,\n modelId,\n options,\n };\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {\n // WebLLM doesn't support URLs natively\n };\n\n /**\n * Check if the model is initialized and ready to use\n * @returns true if the model is initialized, false otherwise\n */\n get isModelInitialized(): boolean {\n return this.isInitialized;\n }\n\n private async getEngine(\n options?: MLCEngineConfig,\n onInitProgress?: (progress: InitProgressReport) => void,\n ): Promise<MLCEngineInterface> {\n const availability = await this.availability();\n if (availability === \"unavailable\") {\n throw new LoadSettingError({\n message:\n \"WebLLM is not available. This library requires a browser with WebGPU support.\",\n });\n }\n\n if (this.engine && this.isInitialized) return this.engine;\n\n // If initialization is already in progress, wait for it\n if (this.initializationPromise) {\n await this.initializationPromise;\n if (this.engine) return this.engine;\n }\n\n this.initializationPromise = this._initializeEngine(\n options,\n onInitProgress,\n );\n await this.initializationPromise;\n\n if (!this.engine) {\n throw new LoadSettingError({\n message: \"Engine initialization failed\",\n });\n }\n\n return this.engine;\n }\n\n private async _initializeEngine(\n options?: MLCEngineConfig,\n onInitProgress?: (progress: InitProgressReport) => void,\n ): Promise<void> {\n try {\n // Create engine instance\n const engineConfig = {\n ...this.config.options.engineConfig,\n ...options,\n initProgressCallback:\n onInitProgress || this.config.options.initProgressCallback,\n };\n\n if (this.config.options.worker) {\n this.engine = await CreateWebWorkerMLCEngine(\n this.config.options.worker,\n this.modelId,\n engineConfig,\n );\n } else {\n this.engine = new MLCEngine(engineConfig);\n // Load the model\n await this.engine.reload(this.modelId);\n }\n\n this.isInitialized = true;\n } catch (error) {\n // Reset state on error so we can retry\n this.engine = undefined;\n this.isInitialized = false;\n this.initializationPromise = undefined;\n\n throw new LoadSettingError({\n message: `Failed to initialize WebLLM engine: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n });\n }\n }\n\n private getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n responseFormat,\n seed,\n tools,\n toolChoice,\n providerOptions,\n }: Parameters<LanguageModelV3[\"doGenerate\"]>[0]) {\n const warnings: SharedV3Warning[] = [];\n\n const functionTools: ToolDefinition[] = (tools ?? [])\n .filter(isFunctionTool)\n .map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n }));\n\n const unsupportedTools = (tools ?? []).filter(\n (tool): tool is LanguageModelV3ProviderTool => !isFunctionTool(tool),\n );\n\n for (const tool of unsupportedTools) {\n warnings.push(\n createUnsupportedToolWarning(\n tool,\n \"Only function tools are supported by WebLLM\",\n ),\n );\n }\n\n if (topK != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"topK\",\n \"topK is not supported by WebLLM\",\n ),\n );\n }\n\n if (stopSequences != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"stopSequences\",\n \"Stop sequences may not be fully implemented\",\n ),\n );\n }\n\n if (presencePenalty != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"presencePenalty\",\n \"Presence penalty is not fully implemented\",\n ),\n );\n }\n\n if (frequencyPenalty != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"frequencyPenalty\",\n \"Frequency penalty is not fully implemented\",\n ),\n );\n }\n\n if (toolChoice != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"toolChoice\",\n \"toolChoice is not supported by WebLLM\",\n ),\n );\n }\n\n // Convert messages to WebLLM format\n const messages = convertToWebLLMMessages(prompt);\n\n // Build request options\n const requestOptions: any = {\n messages,\n temperature,\n max_tokens: maxOutputTokens,\n top_p: topP,\n seed,\n };\n\n if (providerOptions?.extra_body) {\n // https://webllm.mlc.ai/docs/user/api_reference.html#generationconfig\n requestOptions.extra_body = {\n enable_thinking: providerOptions.extra_body.enable_thinking,\n enable_latency_breakdown:\n providerOptions.extra_body.enable_latency_breakdown,\n };\n }\n\n // Handle response format\n if (responseFormat?.type === \"json\") {\n requestOptions.response_format = {\n type: \"json_object\",\n ...(responseFormat.schema && {\n schema: JSON.stringify(responseFormat.schema),\n }),\n };\n }\n\n return {\n messages,\n warnings,\n requestOptions,\n functionTools,\n };\n }\n\n /**\n * Generates a complete text response using WebLLM\n * @param options\n * @returns Promise resolving to the generated content with finish reason, usage stats, and any warnings\n * @throws {LoadSettingError} When WebLLM is not available or model needs to be downloaded\n * @throws {UnsupportedFunctionalityError} When unsupported features like file input are used\n */\n public async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const converted = this.getArgs(options);\n const { messages, warnings, requestOptions, functionTools } = converted;\n\n // Extract system prompt and build tool calling prompt\n const {\n systemPrompt: originalSystemPrompt,\n messages: messagesWithoutSystem,\n } = extractSystemPrompt(messages);\n\n const systemPrompt = buildJsonToolSystemPrompt(\n originalSystemPrompt,\n functionTools,\n {\n allowParallelToolCalls: false,\n },\n );\n\n // Prepend system prompt to messages\n const promptMessages = prependSystemPromptToMessages(\n messagesWithoutSystem,\n systemPrompt,\n );\n\n const engine = await this.getEngine();\n\n const abortHandler = async () => {\n await engine.interruptGenerate();\n };\n\n if (options.abortSignal) {\n options.abortSignal.addEventListener(\"abort\", abortHandler);\n }\n\n try {\n const response = await engine.chat.completions.create({\n ...requestOptions,\n messages: promptMessages,\n stream: false,\n ...(options.abortSignal &&\n !this.config.options.worker && { signal: options.abortSignal }),\n });\n\n const choice = response.choices[0];\n if (!choice) {\n throw new Error(\"No response choice returned from WebLLM\");\n }\n\n const rawResponse = choice.message.content || \"\";\n\n // Parse JSON tool calls from response\n const { toolCalls, textContent } = parseJsonFunctionCalls(rawResponse);\n\n if (toolCalls.length > 0) {\n const toolCallsToEmit = toolCalls.slice(0, 1);\n\n const parts: LanguageModelV3Content[] = [];\n\n if (textContent) {\n parts.push({\n type: \"text\",\n text: textContent,\n });\n }\n\n for (const call of toolCallsToEmit) {\n parts.push({\n type: \"tool-call\",\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: JSON.stringify(call.args ?? {}),\n } satisfies LanguageModelV3ToolCall);\n }\n\n return {\n content: parts,\n finishReason: { unified: \"tool-calls\", raw: \"tool-calls\" },\n usage: {\n inputTokens: {\n total: response.usage?.prompt_tokens,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: response.usage?.completion_tokens,\n text: undefined,\n reasoning: undefined,\n },\n },\n request: { body: { messages: promptMessages, ...requestOptions } },\n warnings,\n };\n }\n\n const content: LanguageModelV3Content[] = [\n {\n type: \"text\",\n text: textContent || rawResponse,\n },\n ];\n\n let finishReason: LanguageModelV3FinishReason = {\n unified: \"stop\",\n raw: choice.finish_reason,\n };\n if (choice.finish_reason === \"abort\") {\n finishReason = { unified: \"other\", raw: choice.finish_reason };\n }\n\n return {\n content,\n finishReason,\n usage: {\n inputTokens: {\n total: response.usage?.prompt_tokens,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: response.usage?.completion_tokens,\n text: undefined,\n reasoning: undefined,\n },\n raw: {\n total: response.usage?.total_tokens,\n },\n },\n request: { body: { messages: promptMessages, ...requestOptions } },\n warnings,\n };\n } catch (error) {\n throw new Error(\n `WebLLM generation failed: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n );\n } finally {\n if (options.abortSignal) {\n options.abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n }\n }\n\n /**\n * Check the availability of the WebLLM model.\n * Note: On mobile devices with a worker, WebGPU detection is skipped since it\n * can't be done reliably. The actual availability will be determined at init.\n * @returns Promise resolving to \"unavailable\", \"available\", or \"downloadable\"\n */\n public async availability(): Promise<Availability> {\n if (this.isInitialized) {\n return \"available\";\n }\n\n // Skip on mobile if using a worker, since detecting GPU is unreliable.\n // Let worker initialization handle it and return an error if unavailable.\n if (this.config.options.worker && isMobile()) {\n return \"downloadable\";\n }\n\n const supported = checkWebGPU();\n return supported ? \"downloadable\" : \"unavailable\";\n }\n\n /**\n * Creates an engine session with download progress monitoring.\n *\n * @example\n * ```typescript\n * const model = await model.createSessionWithProgress(\n * (progress) => {\n * console.log(`Download progress: ${Math.round(progress * 100)}%`);\n * }\n * );\n * ```\n *\n * @param onDownloadProgress Optional callback receiving progress values from 0 to 1\n * @returns Promise resolving to the model instance\n * @throws {LoadSettingError} When WebLLM is not available or model is unavailable\n */\n public async createSessionWithProgress(\n onDownloadProgress?: DownloadProgressCallback,\n ): Promise<WebLLMLanguageModel> {\n const adaptedCallback = onDownloadProgress\n ? (report: InitProgressReport) => {\n onDownloadProgress(report.progress);\n }\n : undefined;\n await this.getEngine(undefined, adaptedCallback);\n return this;\n }\n\n /**\n * Generates a streaming text response using WebLLM\n * @param options\n * @returns Promise resolving to a readable stream of text chunks and request metadata\n * @throws {LoadSettingError} When WebLLM is not available or model needs to be downloaded\n * @throws {UnsupportedFunctionalityError} When unsupported features like file input are used\n */\n public async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const converted = this.getArgs(options);\n const { messages, warnings, requestOptions, functionTools } = converted;\n\n // Extract system prompt and build tool calling prompt\n const {\n systemPrompt: originalSystemPrompt,\n messages: messagesWithoutSystem,\n } = extractSystemPrompt(messages);\n\n const systemPrompt = buildJsonToolSystemPrompt(\n originalSystemPrompt,\n functionTools,\n {\n allowParallelToolCalls: false,\n },\n );\n\n // Prepend system prompt to messages\n const promptMessages = prependSystemPromptToMessages(\n messagesWithoutSystem,\n systemPrompt,\n );\n\n const engine = await this.getEngine();\n const useWorker = this.config.options.worker != null;\n\n const abortHandler = async () => {\n await engine.interruptGenerate();\n };\n\n if (options.abortSignal) {\n options.abortSignal.addEventListener(\"abort\", abortHandler);\n }\n\n const textId = \"text-0\";\n\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n async start(controller) {\n controller.enqueue({\n type: \"stream-start\",\n warnings,\n });\n\n let textStarted = false;\n let finished = false;\n\n const ensureTextStart = () => {\n if (!textStarted) {\n controller.enqueue({\n type: \"text-start\",\n id: textId,\n });\n textStarted = true;\n }\n };\n\n const emitTextDelta = (delta: string) => {\n if (!delta) return;\n ensureTextStart();\n controller.enqueue({\n type: \"text-delta\",\n id: textId,\n delta,\n });\n };\n\n const emitTextEndIfNeeded = () => {\n if (!textStarted) return;\n controller.enqueue({\n type: \"text-end\",\n id: textId,\n });\n textStarted = false;\n };\n\n const finishStream = (\n finishReason: LanguageModelV3FinishReason,\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n },\n ) => {\n if (finished) return;\n finished = true;\n emitTextEndIfNeeded();\n controller.enqueue({\n type: \"finish\",\n finishReason,\n usage: {\n inputTokens: {\n total: usage?.prompt_tokens,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: usage?.completion_tokens,\n text: undefined,\n reasoning: undefined,\n },\n raw: {\n total: usage?.total_tokens,\n },\n },\n });\n controller.close();\n };\n\n try {\n const streamingRequest: ChatCompletionRequestStreaming = {\n ...requestOptions,\n messages: promptMessages,\n stream: true,\n stream_options: { include_usage: true },\n ...(options.abortSignal &&\n !useWorker && { signal: options.abortSignal }),\n };\n\n const response =\n await engine.chat.completions.create(streamingRequest);\n\n let lastUsage:\n | {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n }\n | undefined;\n let isAbort = false;\n\n const chunks = (async function* () {\n for await (const chunk of response) {\n const choice = chunk.choices[0];\n if (!choice) continue;\n if (choice.delta.content) yield choice.delta.content;\n if (chunk.usage) lastUsage = chunk.usage;\n if (choice.finish_reason === \"abort\") isAbort = true;\n }\n })();\n\n const result = await processToolCallStream(\n chunks,\n emitTextDelta,\n controller,\n );\n\n if (result.trailingText) {\n emitTextDelta(result.trailingText);\n }\n\n const finishReason: LanguageModelV3FinishReason = isAbort\n ? { unified: \"other\", raw: \"abort\" }\n : result.toolCallDetected\n ? { unified: \"tool-calls\", raw: \"tool-calls\" }\n : { unified: \"stop\", raw: \"stop\" };\n\n finishStream(finishReason, lastUsage);\n } catch (error) {\n // Propagate all other errors.\n controller.error(error);\n } finally {\n if (options.abortSignal) {\n options.abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n if (!finished) {\n controller.close();\n }\n }\n },\n });\n\n return {\n stream,\n request: { body: { messages: promptMessages, ...requestOptions } },\n };\n }\n}\n","import type { ChatCompletionMessageParam } from \"@mlc-ai/web-llm\";\n\n/**\n * Extracts the system prompt from a message array and returns both the system prompt\n * and the remaining messages without the system message.\n *\n * @param messages - Array of chat messages\n * @returns Object with systemPrompt string and messages array without system messages\n */\nexport function extractSystemPrompt(messages: ChatCompletionMessageParam[]): {\n systemPrompt: string | undefined;\n messages: ChatCompletionMessageParam[];\n} {\n const systemMessages = messages.filter((msg) => msg.role === \"system\");\n const nonSystemMessages = messages.filter((msg) => msg.role !== \"system\");\n\n if (systemMessages.length === 0) {\n return { systemPrompt: undefined, messages };\n }\n\n // Combine all system messages into one\n const systemPrompt = systemMessages\n .map((msg) => msg.content)\n .filter((content): content is string => typeof content === \"string\")\n .join(\"\\n\\n\");\n\n return {\n systemPrompt: systemPrompt || undefined,\n messages: nonSystemMessages,\n };\n}\n\n/**\n * Prepends a system prompt to the messages array.\n * If there's already a system message, it prepends to it.\n * Otherwise, creates a new system message at the start.\n *\n * @param messages - Array of chat messages\n * @param systemPrompt - System prompt to prepend\n * @returns New messages array with system prompt prepended\n */\nexport function prependSystemPromptToMessages(\n messages: ChatCompletionMessageParam[],\n systemPrompt: string,\n): ChatCompletionMessageParam[] {\n if (!systemPrompt.trim()) {\n return messages;\n }\n\n const systemMessageIndex = messages.findIndex((msg) => msg.role === \"system\");\n\n if (systemMessageIndex !== -1) {\n const newMessages = [...messages];\n const existingSystemMessage = messages[systemMessageIndex];\n const existingContent =\n typeof existingSystemMessage.content === \"string\"\n ? existingSystemMessage.content\n : \"\";\n\n newMessages[systemMessageIndex] = {\n ...existingSystemMessage,\n content: systemPrompt + (existingContent ? `\\n\\n${existingContent}` : \"\"),\n };\n\n return newMessages;\n }\n\n return [\n {\n role: \"system\",\n content: systemPrompt,\n },\n ...messages,\n ];\n}\n","declare global {\n interface Navigator {\n gpu?: GPU;\n }\n}\n\nexport function isMobile(): boolean {\n if (typeof navigator === \"undefined\") return false;\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent,\n );\n}\n\nexport function checkWebGPU(): boolean {\n try {\n return !!globalThis?.navigator?.gpu;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if the browser supports WebLLM (WebGPU)\n */\nexport function doesBrowserSupportWebLLM(): boolean {\n return checkWebGPU();\n}\n","import {\n EmbeddingModelV3,\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\n TooManyEmbeddingValuesForCallError,\n LoadSettingError,\n} from \"@ai-sdk/provider\";\nimport {\n AppConfig,\n CreateWebWorkerMLCEngine,\n InitProgressReport,\n MLCEngine,\n MLCEngineConfig,\n MLCEngineInterface,\n} from \"@mlc-ai/web-llm\";\nimport { Availability } from \"../types\";\nimport { isMobile, checkWebGPU } from \"../utils/browser\";\n\nexport type WebLLMEmbeddingModelId = string;\n\nexport interface WebLLMEmbeddingSettings {\n /**\n * Custom app configuration for WebLLM\n */\n appConfig?: AppConfig;\n /**\n * Progress callback for model initialization\n */\n initProgressCallback?: (progress: InitProgressReport) => void;\n /**\n * Engine configuration options\n */\n engineConfig?: MLCEngineConfig;\n /**\n * A web worker instance to run the model in.\n * When provided, the model will run in a separate thread.\n *\n * @default undefined\n */\n worker?: Worker;\n /**\n * Maximum number of texts to embed in a single call.\n * @default 100\n */\n maxEmbeddingsPerCall?: number;\n}\n\ntype WebLLMEmbeddingConfig = {\n provider: string;\n modelId: WebLLMEmbeddingModelId;\n options: WebLLMEmbeddingSettings;\n};\n\nexport class WebLLMEmbeddingModel implements EmbeddingModelV3 {\n readonly specificationVersion = \"v3\";\n readonly provider = \"web-llm\";\n readonly modelId: WebLLMEmbeddingModelId;\n readonly maxEmbeddingsPerCall: number;\n readonly supportsParallelCalls = false;\n\n private readonly config: WebLLMEmbeddingConfig;\n private engine?: MLCEngineInterface;\n private isInitialized = false;\n private initializationPromise?: Promise<void>;\n\n constructor(\n modelId: WebLLMEmbeddingModelId,\n options: WebLLMEmbeddingSettings = {},\n ) {\n this.modelId = modelId;\n this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall ?? 100;\n this.config = {\n provider: this.provider,\n modelId,\n options,\n };\n }\n\n /**\n * Check if the model is initialized and ready to use\n */\n get isModelInitialized(): boolean {\n return this.isInitialized;\n }\n\n private async getEngine(\n options?: MLCEngineConfig,\n onInitProgress?: (progress: InitProgressReport) => void,\n ): Promise<MLCEngineInterface> {\n const availability = await this.availability();\n if (availability === \"unavailable\") {\n throw new LoadSettingError({\n message:\n \"WebLLM is not available. This library requires a browser with WebGPU support.\",\n });\n }\n\n if (this.engine && this.isInitialized) return this.engine;\n\n if (this.initializationPromise) {\n await this.initializationPromise;\n if (this.engine) return this.engine;\n }\n\n this.initializationPromise = this._initializeEngine(\n options,\n onInitProgress,\n );\n await this.initializationPromise;\n\n if (!this.engine) {\n throw new LoadSettingError({\n message: \"Engine initialization failed\",\n });\n }\n\n return this.engine;\n }\n\n private async _initializeEngine(\n options?: MLCEngineConfig,\n onInitProgress?: (progress: InitProgressReport) => void,\n ): Promise<void> {\n try {\n const engineConfig = {\n ...this.config.options.engineConfig,\n ...options,\n initProgressCallback:\n onInitProgress || this.config.options.initProgressCallback,\n };\n\n if (this.config.options.worker) {\n this.engine = await CreateWebWorkerMLCEngine(\n this.config.options.worker,\n this.modelId,\n engineConfig,\n );\n } else {\n this.engine = new MLCEngine(engineConfig);\n await this.engine.reload(this.modelId);\n }\n\n this.isInitialized = true;\n } catch (error) {\n this.engine = undefined;\n this.isInitialized = false;\n this.initializationPromise = undefined;\n\n throw new LoadSettingError({\n message: `Failed to initialize WebLLM embedding engine: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n });\n }\n }\n\n /**\n * Check the availability of the WebLLM embedding model\n * @returns Promise resolving to \"unavailable\", \"available\", or \"downloadable\"\n */\n public async availability(): Promise<Availability> {\n if (this.isInitialized) {\n return \"available\";\n }\n\n if (this.config.options.worker && isMobile()) {\n return \"downloadable\";\n }\n\n const supported = checkWebGPU();\n return supported ? \"downloadable\" : \"unavailable\";\n }\n\n /**\n * Creates an engine session with download progress monitoring.\n *\n * @example\n * ```typescript\n * const engine = await model.createSessionWithProgress(\n * (progress) => {\n * console.log(`Download progress: ${Math.round(progress.progress * 100)}%`);\n * }\n * );\n * ```\n *\n * @param onInitProgress Optional callback receiving progress reports during model download\n * @returns Promise resolving to a configured WebLLM engine\n * @throws {LoadSettingError} When WebLLM isn't available or model is unavailable\n */\n public async createSessionWithProgress(\n onInitProgress?: (progress: InitProgressReport) => void,\n ): Promise<MLCEngineInterface> {\n return this.getEngine(undefined, onInitProgress);\n }\n\n /**\n * Embed texts using the WebLLM embedding model\n */\n public async doEmbed(\n options: EmbeddingModelV3CallOptions,\n ): Promise<EmbeddingModelV3Result> {\n const { values, abortSignal } = options;\n\n if (values.length > this.maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n provider: this.provider,\n modelId: this.modelId,\n maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n values,\n });\n }\n\n if (abortSignal?.aborted) {\n throw new Error(\"Operation was aborted\");\n }\n\n const engine = await this.getEngine();\n\n const abortHandler = () => {\n engine.interruptGenerate();\n };\n\n if (abortSignal) {\n abortSignal.addEventListener(\"abort\", abortHandler);\n }\n\n try {\n const response = await engine.embeddings.create({\n input: values,\n model: this.modelId,\n ...(abortSignal &&\n !this.config.options.worker && { signal: abortSignal }),\n });\n\n const sortedEmbeddings = response.data\n .sort((a, b) => a.index - b.index)\n .map((e) => e.embedding);\n\n return {\n embeddings: sortedEmbeddings,\n usage: {\n tokens: response.usage.total_tokens,\n },\n providerMetadata: {\n webllm: {\n model: response.model,\n promptTokens: response.usage.prompt_tokens,\n totalTokens: response.usage.total_tokens,\n prefillTokensPerSecond: response.usage.extra?.prefill_tokens_per_s,\n },\n },\n warnings: [],\n };\n } catch (error) {\n throw new Error(\n `WebLLM embedding failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n } finally {\n if (abortSignal) {\n abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n }\n }\n}\n","import {\n EmbeddingModelV3,\n NoSuchModelError,\n ProviderV3,\n} from \"@ai-sdk/provider\";\nimport {\n WebLLMLanguageModel,\n WebLLMModelId,\n WebLLMSettings,\n} from \"./chat/web-llm-language-model\";\nimport {\n WebLLMEmbeddingModel,\n WebLLMEmbeddingModelId,\n WebLLMEmbeddingSettings,\n} from \"./embedding/web-llm-embedding-model\";\n\nexport interface WebLLMProvider extends ProviderV3 {\n (modelId: WebLLMModelId, settings?: WebLLMSettings): WebLLMLanguageModel;\n\n /**\n * Creates a model for text generation.\n */\n languageModel(\n modelId: WebLLMModelId,\n settings?: WebLLMSettings,\n ): WebLLMLanguageModel;\n\n /**\n * Creates a model for text generation.\n */\n chat(modelId: WebLLMModelId, settings?: WebLLMSettings): WebLLMLanguageModel;\n\n /**\n * Creates a model for text embeddings.\n */\n embedding(\n modelId: WebLLMEmbeddingModelId,\n settings?: WebLLMEmbeddingSettings,\n ): EmbeddingModelV3;\n\n /**\n * Creates a model for text embeddings.\n */\n embeddingModel: (\n modelId: WebLLMEmbeddingModelId,\n settings?: WebLLMEmbeddingSettings,\n ) => EmbeddingModelV3;\n}\n\n/**\n * Create a WebLLM provider instance.\n */\nexport function createWebLLM(): WebLLMProvider {\n const createLanguageModel = (\n modelId: WebLLMModelId,\n settings?: WebLLMSettings,\n ) => {\n return new WebLLMLanguageModel(modelId, settings);\n };\n\n const createEmbeddingModel = (\n modelId: WebLLMEmbeddingModelId,\n settings?: WebLLMEmbeddingSettings,\n ) => {\n return new WebLLMEmbeddingModel(modelId, settings);\n };\n\n const provider = function (\n modelId: WebLLMModelId,\n settings?: WebLLMSettings,\n ) {\n if (new.target) {\n throw new Error(\n \"The WebLLM model function cannot be called with the new keyword.\",\n );\n }\n\n return createLanguageModel(modelId, settings);\n };\n\n provider.specificationVersion = \"v3\" as const;\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.embedding = createEmbeddingModel;\n provider.embeddingModel = createEmbeddingModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: \"imageModel\" });\n };\n\n provider.speechModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: \"speechModel\" });\n };\n\n provider.transcriptionModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: \"transcriptionModel\" });\n };\n\n return provider as WebLLMProvider;\n}\n\n/**\n * Default WebLLM provider instance\n *\n * @example\n * ```typescript\n * import { webLLM } from \"@browser-ai/web-llm\";\n *\n * // Language model\n * const chat = webLLM(\"Llama-3.2-3B-Instruct-q4f16_1-MLC\");\n *\n * // Embedding model\n * const embed = webLLM.embeddingModel(\"snowflake-arctic-embed-m-q0f32-MLC-b32\");\n * ```\n */\nexport const webLLM = createWebLLM();\n"],"mappings":"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","names":["name","marker","symbol","_a","_b","prefixText","generateToolCallId","import_web_llm","import_web_llm"]}
1
+ {"version":3,"sources":["../src/index.ts","../../../../node_modules/@ai-sdk/provider/src/errors/ai-sdk-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/api-call-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/empty-response-body-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/get-error-message.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-argument-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-prompt-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-response-data-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/json-parse-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/load-api-key-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/load-setting-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/no-content-generated-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/no-such-model-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/too-many-embedding-values-for-call-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/type-validation-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/unsupported-functionality-error.ts","../../../../node_modules/@ai-sdk/provider/src/json-value/is-json.ts","../../shared/src/utils/tool-utils.ts","../../shared/src/utils/warnings.ts","../../shared/src/tool-calling/build-json-system-prompt.ts","../../shared/src/tool-calling/format-tool-results.ts","../../shared/src/tool-calling/parse-json-function-calls.ts","../../shared/src/streaming/tool-call-detector.ts","../../shared/src/streaming/tool-call-stream-utils.ts","../../shared/src/streaming/stream-processor.ts","../src/utils/convert-to-webllm-messages.tsx","../src/chat/web-llm-language-model.ts","../src/utils/prompt-utils.ts","../src/utils/browser.ts","../src/embedding/web-llm-embedding-model.ts","../src/web-llm-provider.ts"],"sourcesContent":["export {\n WebLLMLanguageModel,\n doesBrowserSupportWebLLM,\n} from \"./chat/web-llm-language-model\";\nexport type {\n WebLLMModelId,\n WebLLMSettings,\n} from \"./chat/web-llm-language-model\";\n\nexport { WebLLMEmbeddingModel } from \"./embedding/web-llm-embedding-model\";\nexport type {\n WebLLMEmbeddingModelId,\n WebLLMEmbeddingSettings,\n} from \"./embedding/web-llm-embedding-model\";\n\nexport type { WebLLMUIMessage, WebLLMProgress } from \"./types\";\n\nexport { WebWorkerMLCEngineHandler } from \"@mlc-ai/web-llm\";\n\nexport { webLLM, createWebLLM } from \"./web-llm-provider\";\nexport type { WebLLMProvider } from \"./web-llm-provider\";\n","/**\n * Symbol used for identifying AI SDK Error instances.\n * Enables checking if an error is an instance of AISDKError across package versions.\n */\nconst marker = 'vercel.ai.error';\nconst symbol = Symbol.for(marker);\n\n/**\n * Custom error class for AI SDK related errors.\n * @extends Error\n */\nexport class AISDKError extends Error {\n private readonly [symbol] = true; // used in isInstance\n\n /**\n * The underlying cause of the error, if any.\n */\n readonly cause?: unknown;\n\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,\n message,\n cause,\n }: {\n name: string;\n message: string;\n cause?: unknown;\n }) {\n super(message);\n\n this.name = name;\n this.cause = cause;\n }\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: unknown): error is AISDKError {\n return AISDKError.hasMarker(error, marker);\n }\n\n protected static hasMarker(error: unknown, marker: string): boolean {\n const markerSymbol = Symbol.for(marker);\n return (\n error != null &&\n typeof error === 'object' &&\n markerSymbol in error &&\n typeof error[markerSymbol] === 'boolean' &&\n error[markerSymbol] === true\n );\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_APICallError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class APICallError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly url: string;\n readonly requestBodyValues: unknown;\n readonly statusCode?: number;\n\n readonly responseHeaders?: Record<string, string>;\n readonly responseBody?: string;\n\n readonly isRetryable: boolean;\n readonly data?: unknown;\n\n constructor({\n message,\n url,\n requestBodyValues,\n statusCode,\n responseHeaders,\n responseBody,\n cause,\n isRetryable = statusCode != null &&\n (statusCode === 408 || // request timeout\n statusCode === 409 || // conflict\n statusCode === 429 || // too many requests\n statusCode >= 500), // server error\n data,\n }: {\n message: string;\n url: string;\n requestBodyValues: unknown;\n statusCode?: number;\n responseHeaders?: Record<string, string>;\n responseBody?: string;\n cause?: unknown;\n isRetryable?: boolean;\n data?: unknown;\n }) {\n super({ name, message, cause });\n\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\n static isInstance(error: unknown): error is APICallError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_EmptyResponseBodyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class EmptyResponseBodyError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message = 'Empty response body' }: { message?: string } = {}) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is EmptyResponseBodyError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","export function getErrorMessage(error: unknown | undefined) {\n if (error == null) {\n return 'unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return JSON.stringify(error);\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidArgumentError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * A function argument is invalid.\n */\nexport class InvalidArgumentError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly argument: string;\n\n constructor({\n message,\n cause,\n argument,\n }: {\n argument: string;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n\n this.argument = argument;\n }\n\n static isInstance(error: unknown): error is InvalidArgumentError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidPromptError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * A prompt is invalid. This error should be thrown by providers when they cannot\n * process a prompt.\n */\nexport class InvalidPromptError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly prompt: unknown;\n\n constructor({\n prompt,\n message,\n cause,\n }: {\n prompt: unknown;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message: `Invalid prompt: ${message}`, cause });\n\n this.prompt = prompt;\n }\n\n static isInstance(error: unknown): error is InvalidPromptError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidResponseDataError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Server returned a response with invalid data content.\n * This should be thrown by providers when they cannot parse the response from the API.\n */\nexport class InvalidResponseDataError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly data: unknown;\n\n constructor({\n data,\n message = `Invalid response data: ${JSON.stringify(data)}.`,\n }: {\n data: unknown;\n message?: string;\n }) {\n super({ name, message });\n\n this.data = data;\n }\n\n static isInstance(error: unknown): error is InvalidResponseDataError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_JSONParseError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class JSONParseError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly text: string;\n\n constructor({ text, cause }: { text: string; cause: unknown }) {\n super({\n name,\n message:\n `JSON parsing failed: ` +\n `Text: ${text}.\\n` +\n `Error message: ${getErrorMessage(cause)}`,\n cause,\n });\n\n this.text = text;\n }\n\n static isInstance(error: unknown): error is JSONParseError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadAPIKeyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadAPIKeyError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message }: { message: string }) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is LoadAPIKeyError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadSettingError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadSettingError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message }: { message: string }) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is LoadSettingError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_NoContentGeneratedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\nThrown when the AI provider fails to generate any content.\n */\nexport class NoContentGeneratedError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({\n message = 'No content generated.',\n }: { message?: string } = {}) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is NoContentGeneratedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_NoSuchModelError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class NoSuchModelError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly modelId: string;\n readonly modelType:\n | 'languageModel'\n | 'embeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel'\n | 'rerankingModel';\n\n constructor({\n errorName = name,\n modelId,\n modelType,\n message = `No such ${modelType}: ${modelId}`,\n }: {\n errorName?: string;\n modelId: string;\n modelType:\n | 'languageModel'\n | 'embeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel'\n | 'rerankingModel';\n message?: string;\n }) {\n super({ name: errorName, message });\n\n this.modelId = modelId;\n this.modelType = modelType;\n }\n\n static isInstance(error: unknown): error is NoSuchModelError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_TooManyEmbeddingValuesForCallError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class TooManyEmbeddingValuesForCallError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly provider: string;\n readonly modelId: string;\n readonly maxEmbeddingsPerCall: number;\n readonly values: Array<unknown>;\n\n constructor(options: {\n provider: string;\n modelId: string;\n maxEmbeddingsPerCall: number;\n values: Array<unknown>;\n }) {\n super({\n name,\n message:\n `Too many values for a single embedding call. ` +\n `The ${options.provider} model \"${options.modelId}\" can only embed up to ` +\n `${options.maxEmbeddingsPerCall} values per call, but ${options.values.length} values were provided.`,\n });\n\n this.provider = options.provider;\n this.modelId = options.modelId;\n this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall;\n this.values = options.values;\n }\n\n static isInstance(\n error: unknown,\n ): error is TooManyEmbeddingValuesForCallError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_TypeValidationError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class TypeValidationError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly value: unknown;\n\n constructor({ value, cause }: { value: unknown; cause: unknown }) {\n super({\n name,\n message:\n `Type validation failed: ` +\n `Value: ${JSON.stringify(value)}.\\n` +\n `Error message: ${getErrorMessage(cause)}`,\n cause,\n });\n\n this.value = value;\n }\n\n static isInstance(error: unknown): error is TypeValidationError {\n return AISDKError.hasMarker(error, marker);\n }\n\n /**\n * Wraps an error into a TypeValidationError.\n * If the cause is already a TypeValidationError with the same value, 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 * @returns {TypeValidationError} A TypeValidationError instance.\n */\n static wrap({\n value,\n cause,\n }: {\n value: unknown;\n cause: unknown;\n }): TypeValidationError {\n return TypeValidationError.isInstance(cause) && cause.value === value\n ? cause\n : new TypeValidationError({ value, cause });\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_UnsupportedFunctionalityError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class UnsupportedFunctionalityError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly functionality: string;\n\n constructor({\n functionality,\n message = `'${functionality}' functionality not supported.`,\n }: {\n functionality: string;\n message?: string;\n }) {\n super({ name, message });\n this.functionality = functionality;\n }\n\n static isInstance(error: unknown): error is UnsupportedFunctionalityError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { JSONArray, JSONObject, JSONValue } from './json-value';\n\nexport function isJSONValue(value: unknown): value is JSONValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.every(isJSONValue);\n }\n\n if (typeof value === 'object') {\n return Object.entries(value).every(\n ([key, val]) =>\n typeof key === 'string' && (val === undefined || isJSONValue(val)),\n );\n }\n\n return false;\n}\n\nexport function isJSONArray(value: unknown): value is JSONArray {\n return Array.isArray(value) && value.every(isJSONValue);\n}\n\nexport function isJSONObject(value: unknown): value is JSONObject {\n return (\n value != null &&\n typeof value === 'object' &&\n Object.entries(value).every(\n ([key, val]) =>\n typeof key === 'string' && (val === undefined || isJSONValue(val)),\n )\n );\n}\n","/**\n * Utilities for working with AI SDK tools\n */\n\nimport type {\n LanguageModelV3FunctionTool,\n LanguageModelV3ProviderTool,\n} from \"@ai-sdk/provider\";\n\n/**\n * Type guard to check if a tool is a function tool\n *\n * @param tool - The tool to check\n * @returns true if the tool is a LanguageModelV3FunctionTool\n */\nexport function isFunctionTool(\n tool: LanguageModelV3FunctionTool | LanguageModelV3ProviderTool,\n): tool is LanguageModelV3FunctionTool {\n return tool.type === \"function\";\n}\n","/**\n * Warning generation utilities for unsupported settings and tools\n */\n\nimport type {\n SharedV3Warning,\n LanguageModelV3ProviderTool,\n} from \"@ai-sdk/provider\";\n\n/**\n * Creates a warning for an unsupported setting\n *\n * @param setting - Name of the setting that is not supported\n * @param details - Additional details about why it's not supported\n * @returns A call warning object\n *\n * @example\n * ```typescript\n * const warning = createUnsupportedSettingWarning(\n * \"maxOutputTokens\",\n * \"maxOutputTokens is not supported by this provider\"\n * );\n * ```\n */\nexport function createUnsupportedSettingWarning(\n feature: string,\n details: string,\n): SharedV3Warning {\n return {\n type: \"unsupported\",\n feature,\n details,\n };\n}\n\n/**\n * Creates a warning for an unsupported tool type\n *\n * @param tool - The provider-defined tool that is not supported\n * @param details - Additional details about why it's not supported\n * @returns A call warning object\n *\n * @example\n * ```typescript\n * const warning = createUnsupportedToolWarning(\n * providerTool,\n * \"Only function tools are supported\"\n * );\n * ```\n */\nexport function createUnsupportedToolWarning(\n tool: LanguageModelV3ProviderTool,\n details: string,\n): SharedV3Warning {\n return {\n type: \"unsupported\",\n feature: `tool:${tool.name}`,\n details,\n };\n}\n","import type {\n JSONSchema7,\n LanguageModelV3FunctionTool,\n} from \"@ai-sdk/provider\";\nimport type { ToolDefinition } from \"../types\";\n\n/**\n * Builds an enhanced system prompt for JSON-based tool calling.\n * The model receives JSON schemas and is expected to return JSON tool calls.\n *\n * @param originalSystemPrompt - The original system prompt (if any)\n * @param tools - Array of available tool definitions\n * @param options - Configuration options for tool calling behavior (unused, kept for backwards compatibility)\n * @returns Enhanced system prompt with JSON tool calling instructions\n */\nexport function buildJsonToolSystemPrompt(\n originalSystemPrompt: string | undefined,\n tools: Array<ToolDefinition | LanguageModelV3FunctionTool>,\n options?: { allowParallelToolCalls?: boolean },\n): string {\n if (!tools || tools.length === 0) {\n return originalSystemPrompt || \"\";\n }\n\n const parallelInstruction =\n \"Only request one tool call at a time. Wait for tool results before asking for another tool.\";\n\n const toolSchemas = tools.map((tool) => {\n const schema = getParameters(tool);\n return {\n name: tool.name,\n description: tool.description ?? \"No description provided.\",\n parameters: schema || { type: \"object\", properties: {} },\n };\n });\n\n const toolsJson = JSON.stringify(toolSchemas, null, 2);\n\n const instructionBody = `You are a helpful AI assistant with access to tools.\n\n# Available Tools\n${toolsJson}\n\n# Tool Calling Instructions\n${parallelInstruction}\n\nTo call a tool, output JSON in this exact format inside a \\`\\`\\`tool_call code fence:\n\n\\`\\`\\`tool_call\n{\"name\": \"tool_name\", \"arguments\": {\"param1\": \"value1\", \"param2\": \"value2\"}}\n\\`\\`\\`\n\nTool responses will be provided in \\`\\`\\`tool_result fences. Each line contains JSON like:\n\\`\\`\\`tool_result\n{\"id\": \"call_123\", \"name\": \"tool_name\", \"result\": {...}, \"error\": false}\n\\`\\`\\`\nUse the \\`result\\` payload (and treat \\`error\\` as a boolean flag) when continuing the conversation.\n\nImportant:\n- Use exact tool and parameter names from the schema above\n- Arguments must be a valid JSON object matching the tool's parameters\n- You can include brief reasoning before or after the tool call\n- If no tool is needed, respond directly without tool_call fences`;\n\n if (originalSystemPrompt?.trim()) {\n return `${originalSystemPrompt.trim()}\\n\\n${instructionBody}`;\n }\n\n return instructionBody;\n}\n\n/**\n * Extracts the parameters/input schema from a tool definition.\n * Handles both ToolDefinition (parameters field) and LanguageModelV3FunctionTool (inputSchema field).\n *\n * @param tool - The tool definition to extract parameters from\n * @returns The JSON Schema for the tool's parameters, or undefined if not present\n */\nfunction getParameters(\n tool: ToolDefinition | LanguageModelV3FunctionTool,\n): JSONSchema7 | undefined {\n if (\"parameters\" in tool) {\n return tool.parameters;\n }\n\n return tool.inputSchema as JSONSchema7 | undefined;\n}\n","import type { ToolResult } from \"../types\";\n\n/**\n * Builds a JSON-serializable payload for a single tool result.\n * Includes tool name, result data, error flag, and optional call ID.\n *\n * @param result - The tool execution result to format\n * @returns Object containing formatted result data ready for JSON serialization\n */\nfunction buildResultPayload(result: ToolResult): Record<string, unknown> {\n const payload: Record<string, unknown> = {\n name: result.toolName,\n result: result.result ?? null,\n error: Boolean(result.isError),\n };\n\n if (result.toolCallId) {\n payload.id = result.toolCallId;\n }\n\n return payload;\n}\n\n/**\n * Formats tool execution results as JSON for continuation in the conversation.\n *\n * Each result is serialized as a single JSON object. Multiple results (for parallel\n * execution scenarios) are emitted on separate lines within a ```tool_result code fence.\n *\n * @param results - Array of tool execution results to format\n * @returns Formatted string with results in tool_result code fence, or empty string if no results\n * @example\n * ```typescript\n * formatToolResults([\n * { toolCallId: \"call_123\", toolName: \"search\", result: { data: \"...\" } }\n * ])\n * // Returns: ```tool_result\\n{\"id\":\"call_123\",\"name\":\"search\",\"result\":{...},\"error\":false}\\n```\n * ```\n */\nexport function formatToolResults(results: ToolResult[]): string {\n if (!results || results.length === 0) {\n return \"\";\n }\n\n const payloads = results.map((result) =>\n JSON.stringify(buildResultPayload(result)),\n );\n\n return `\\`\\`\\`tool_result\n${payloads.join(\"\\n\")}\n\\`\\`\\``;\n}\n\n/**\n * Formats a single tool result.\n * Convenience wrapper around formatToolResults for single result scenarios.\n *\n * @param result - The tool execution result to format\n * @returns Formatted string with result in tool_result code fence\n */\nexport function formatSingleToolResult(result: ToolResult): string {\n return formatToolResults([result]);\n}\n","import type { ParsedResponse, ParsedToolCall } from \"../types\";\n\n/**\n * Options for configuring the JSON function call parser\n */\nexport interface ParseJsonFunctionCallsOptions {\n /** Support XML-style tags: <tool_call>...</tool_call> */\n supportXmlTags?: boolean;\n /** Support Python-style: [functionName(arg=\"value\")] */\n supportPythonStyle?: boolean;\n /** Support \"parameters\" as alias for \"arguments\" (Llama format) */\n supportParametersField?: boolean;\n}\n\nconst DEFAULT_OPTIONS: ParseJsonFunctionCallsOptions = {\n supportXmlTags: true,\n supportPythonStyle: true,\n supportParametersField: true,\n};\n\nfunction generateToolCallId(): string {\n return `call_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction buildRegex(options: ParseJsonFunctionCallsOptions): RegExp {\n const patterns: string[] = [];\n\n // Always support markdown fences\n patterns.push(\"```tool[_-]?call\\\\s*([\\\\s\\\\S]*?)```\");\n\n if (options.supportXmlTags) {\n patterns.push(\"<tool_call>\\\\s*([\\\\s\\\\S]*?)\\\\s*</tool_call>\");\n }\n\n if (options.supportPythonStyle) {\n patterns.push(\"\\\\[(\\\\w+)\\\\(([^)]*)\\\\)\\\\]\");\n }\n\n return new RegExp(patterns.join(\"|\"), \"gi\");\n}\n\n/**\n * Parses JSON-formatted tool calls from model response.\n * Supports multiple formats:\n * 1. Single object: {\"name\": \"tool\", \"arguments\": {...}} or {\"name\": \"tool\", \"parameters\": {...}}\n * 2. Array: [{\"name\": \"tool1\", ...}, {\"name\": \"tool2\", ...}]\n * 3. Newline-separated objects:\n * {\"name\": \"tool1\", \"arguments\": {...}}\n * {\"name\": \"tool2\", \"arguments\": {...}}\n *\n * Note: Handles both \"arguments\" (OpenAI/Mistral format) and \"parameters\" (Llama format)\n *\n * @param response - The model's response text to parse\n * @param options - Configuration options for parsing\n * @returns Object containing parsed tool calls and remaining text content\n */\nexport function parseJsonFunctionCalls(\n response: string,\n options: ParseJsonFunctionCallsOptions = DEFAULT_OPTIONS,\n): ParsedResponse {\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const regex = buildRegex(mergedOptions);\n\n const matches = Array.from(response.matchAll(regex));\n regex.lastIndex = 0;\n\n if (matches.length === 0) {\n return { toolCalls: [], textContent: response };\n }\n\n const toolCalls: ParsedToolCall[] = [];\n let textContent = response;\n\n for (const match of matches) {\n const fullMatch = match[0];\n textContent = textContent.replace(fullMatch, \"\");\n\n try {\n // Check for Python-style match: [functionName(args)]\n if (mergedOptions.supportPythonStyle && match[0].startsWith(\"[\")) {\n const pythonMatch = /\\[(\\w+)\\(([^)]*)\\)\\]/.exec(match[0]);\n if (pythonMatch) {\n const [, funcName, pythonArgs] = pythonMatch;\n const args: Record<string, unknown> = {};\n\n if (pythonArgs && pythonArgs.trim()) {\n const argPairs = pythonArgs.split(\",\").map((s) => s.trim());\n for (const pair of argPairs) {\n const equalIndex = pair.indexOf(\"=\");\n if (equalIndex > 0) {\n const key = pair.substring(0, equalIndex).trim();\n let value = pair.substring(equalIndex + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.substring(1, value.length - 1);\n }\n args[key] = value;\n }\n }\n }\n\n toolCalls.push({\n type: \"tool-call\",\n toolCallId: generateToolCallId(),\n toolName: funcName,\n args: args,\n });\n continue;\n }\n }\n\n // Get the captured content from the first capturing group\n const innerContent = match[1] || match[2] || \"\";\n const trimmed = innerContent.trim();\n\n if (!trimmed) continue;\n\n // Try parsing as a single JSON value first (object or array)\n try {\n const parsed = JSON.parse(trimmed);\n const callsArray = Array.isArray(parsed) ? parsed : [parsed];\n\n for (const call of callsArray) {\n if (!call.name) continue;\n\n let args =\n call.arguments ||\n (mergedOptions.supportParametersField ? call.parameters : null) ||\n {};\n\n // If args is a string, try to parse it as JSON\n if (typeof args === \"string\") {\n try {\n args = JSON.parse(args);\n } catch {\n // If parsing fails, keep it as string\n }\n }\n\n toolCalls.push({\n type: \"tool-call\",\n toolCallId: call.id || generateToolCallId(),\n toolName: call.name,\n args: args,\n });\n }\n } catch {\n // If single JSON parsing fails, try parsing as newline-separated JSON objects\n const lines = trimmed.split(\"\\n\").filter((line) => line.trim());\n\n for (const line of lines) {\n try {\n const call = JSON.parse(line.trim());\n if (!call.name) continue;\n\n let args =\n call.arguments ||\n (mergedOptions.supportParametersField ? call.parameters : null) ||\n {};\n\n if (typeof args === \"string\") {\n try {\n args = JSON.parse(args);\n } catch {\n // If parsing fails, keep it as string\n }\n }\n\n toolCalls.push({\n type: \"tool-call\",\n toolCallId: call.id || generateToolCallId(),\n toolName: call.name,\n args: args,\n });\n } catch {\n // Skip invalid JSON lines\n continue;\n }\n }\n }\n } catch (error) {\n console.warn(\"Failed to parse JSON tool call:\", error);\n continue;\n }\n }\n\n textContent = textContent.replace(/\\n{2,}/g, \"\\n\");\n\n return { toolCalls, textContent: textContent.trim() };\n}\n\n/**\n * Checks if a response contains JSON function calls\n */\nexport function hasJsonFunctionCalls(\n response: string,\n options: ParseJsonFunctionCallsOptions = DEFAULT_OPTIONS,\n): boolean {\n const regex = buildRegex({ ...DEFAULT_OPTIONS, ...options });\n const hasMatch = regex.test(response);\n regex.lastIndex = 0;\n return hasMatch;\n}\n\n/**\n * Extracts the first JSON function call block from a response\n */\nexport function extractJsonFunctionCallsBlock(\n response: string,\n options: ParseJsonFunctionCallsOptions = DEFAULT_OPTIONS,\n): string | null {\n const regex = buildRegex({ ...DEFAULT_OPTIONS, ...options });\n const match = regex.exec(response);\n regex.lastIndex = 0;\n return match ? match[0] : null;\n}\n","/**\n * ToolCallFenceDetector - Detects and extracts tool call fences from streaming text\n *\n * This module handles the complex task of detecting tool call fences in a stream\n * where fences might be split across multiple chunks. It uses overlap detection\n * to avoid emitting text that might be the beginning of a fence.\n */\n\n/**\n * Result of fence detection operation\n */\nexport interface FenceDetectionResult {\n fence: string | null;\n prefixText: string;\n remainingText: string;\n /** Length of potential partial fence at buffer end */\n overlapLength: number;\n}\n\n/**\n * Result of streaming fence content detection\n */\nexport interface StreamingFenceResult {\n inFence: boolean;\n /** Content that can be safely emitted (either as text or tool-input-delta) */\n safeContent: string;\n completeFence: string | null;\n textAfterFence: string;\n}\n\n/**\n * Fence pattern configuration\n */\nexport interface FencePattern {\n start: string;\n end: string;\n reconstructStart: string;\n isRegex?: boolean;\n matchedStart?: string;\n}\n\n/**\n * Options for configuring the ToolCallFenceDetector\n */\nexport interface ToolCallFenceDetectorOptions {\n /** Custom fence patterns to use instead of defaults */\n patterns?: FencePattern[];\n /** Enable Python-style function call detection: [functionName(args)] */\n enablePythonStyle?: boolean;\n}\n\n/**\n * Default fence patterns for tool call detection\n */\nexport const DEFAULT_FENCE_PATTERNS: FencePattern[] = [\n { start: \"```tool_call\", end: \"```\", reconstructStart: \"```tool_call\\n\" },\n { start: \"```tool-call\", end: \"```\", reconstructStart: \"```tool-call\\n\" },\n];\n\n/**\n * Extended fence patterns including XML-style tags\n */\nexport const EXTENDED_FENCE_PATTERNS: FencePattern[] = [\n ...DEFAULT_FENCE_PATTERNS,\n {\n start: \"<tool_call>\",\n end: \"</tool_call>\",\n reconstructStart: \"<tool_call>\",\n },\n];\n\n/**\n * Detects tool call fences in streaming text with support for partial matches\n */\nexport class ToolCallFenceDetector {\n private readonly fencePatterns: FencePattern[];\n private readonly enablePythonStyle: boolean;\n private readonly pythonStyleRegex = /\\[(\\w+)\\(/g;\n private readonly fenceStarts: string[];\n private buffer = \"\";\n\n private inFence = false;\n private fenceStartBuffer = \"\"; // Accumulated fence content\n private currentFencePattern: FencePattern | null = null;\n\n constructor(options: ToolCallFenceDetectorOptions = {}) {\n this.fencePatterns = options.patterns ?? EXTENDED_FENCE_PATTERNS;\n this.enablePythonStyle = options.enablePythonStyle ?? true;\n this.fenceStarts = this.fencePatterns.map((p) => p.start);\n }\n\n addChunk(chunk: string): void {\n this.buffer += chunk;\n }\n\n getBuffer(): string {\n return this.buffer;\n }\n\n clearBuffer(): void {\n this.buffer = \"\";\n }\n\n /**\n * Detects if there's a complete fence in the buffer\n * @returns Detection result with fence info and safe text\n */\n detectFence(): FenceDetectionResult {\n const {\n index: startIdx,\n prefix: matchedPrefix,\n pattern,\n } = this.findFenceStart(this.buffer);\n\n // No fence start found\n if (startIdx === -1) {\n // Compute how much of the buffer end might be a partial fence start\n const overlap = this.computeOverlapLength(this.buffer, this.fenceStarts);\n const safeTextLength = this.buffer.length - overlap;\n\n const prefixText =\n safeTextLength > 0 ? this.buffer.slice(0, safeTextLength) : \"\";\n const remaining = overlap > 0 ? this.buffer.slice(-overlap) : \"\";\n\n // Update buffer to keep only the overlap\n this.buffer = remaining;\n\n return {\n fence: null,\n prefixText,\n remainingText: \"\",\n overlapLength: overlap,\n };\n }\n\n const prefixText = this.buffer.slice(0, startIdx);\n this.buffer = this.buffer.slice(startIdx);\n\n // Look for closing fence using the matched pattern's end marker\n const prefixLength = matchedPrefix?.length ?? 0;\n const fenceEnd = pattern?.end ?? \"```\";\n const closingIdx = this.buffer.indexOf(fenceEnd, prefixLength);\n\n // Fence not complete yet\n if (closingIdx === -1) {\n // Keep the buffer as-is, waiting for more data\n return {\n fence: null,\n prefixText,\n remainingText: \"\",\n overlapLength: 0,\n };\n }\n\n // Complete fence found!\n const endPos = closingIdx + fenceEnd.length;\n const fence = this.buffer.slice(0, endPos);\n const remainingText = this.buffer.slice(endPos);\n\n // Clear the buffer since we extracted everything\n this.buffer = \"\";\n\n return {\n fence,\n prefixText,\n remainingText,\n overlapLength: 0,\n };\n }\n\n /**\n * Finds the first occurrence of any fence start marker\n *\n * @param text - Text to search in\n * @returns Index of first fence start and which pattern matched\n * @private\n */\n private findFenceStart(text: string): {\n index: number;\n prefix: string | null;\n pattern: FencePattern | null;\n } {\n let bestIndex = -1;\n let matchedPrefix: string | null = null;\n let matchedPattern: FencePattern | null = null;\n\n for (const pattern of this.fencePatterns) {\n const idx = text.indexOf(pattern.start);\n if (idx !== -1 && (bestIndex === -1 || idx < bestIndex)) {\n bestIndex = idx;\n matchedPrefix = pattern.start;\n matchedPattern = pattern;\n }\n }\n\n if (this.enablePythonStyle) {\n this.pythonStyleRegex.lastIndex = 0;\n const pythonMatch = this.pythonStyleRegex.exec(text);\n if (pythonMatch && (bestIndex === -1 || pythonMatch.index < bestIndex)) {\n bestIndex = pythonMatch.index;\n matchedPrefix = pythonMatch[0];\n matchedPattern = {\n start: pythonMatch[0],\n end: \")]\",\n reconstructStart: pythonMatch[0],\n isRegex: true,\n };\n }\n }\n\n return { index: bestIndex, prefix: matchedPrefix, pattern: matchedPattern };\n }\n\n /**\n * Computes the maximum overlap between the end of text and the start of any prefix\n * @param text - Text to check for overlap\n * @param prefixes - List of prefixes to check against\n * @returns Length of the maximum overlap found\n */\n private computeOverlapLength(text: string, prefixes: string[]): number {\n let overlap = 0;\n\n for (const prefix of prefixes) {\n const maxLength = Math.min(text.length, prefix.length - 1);\n\n for (let size = maxLength; size > 0; size -= 1) {\n // Check if the last 'size' characters of text match the first 'size' characters of prefix\n if (prefix.startsWith(text.slice(-size))) {\n overlap = Math.max(overlap, size);\n break;\n }\n }\n }\n\n return overlap;\n }\n\n /**\n * Checks if the buffer currently contains any text\n */\n hasContent(): boolean {\n return this.buffer.length > 0;\n }\n\n /**\n * Gets the buffer size\n */\n getBufferSize(): number {\n return this.buffer.length;\n }\n\n /**\n * Detect and stream fence content in real-time for true incremental streaming\n * @returns Streaming result with current state and safe content to emit\n */\n detectStreamingFence(): StreamingFenceResult {\n if (!this.inFence) {\n // Look for fence start\n const {\n index: startIdx,\n prefix: matchedPrefix,\n pattern,\n } = this.findFenceStart(this.buffer);\n\n if (startIdx === -1) {\n // No fence start found - emit safe text\n const overlap = this.computeOverlapLength(\n this.buffer,\n this.fenceStarts,\n );\n const safeTextLength = this.buffer.length - overlap;\n const safeContent =\n safeTextLength > 0 ? this.buffer.slice(0, safeTextLength) : \"\";\n this.buffer = this.buffer.slice(safeTextLength);\n\n return {\n inFence: false,\n safeContent,\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n // Found fence start!\n const prefixText = this.buffer.slice(0, startIdx);\n const fenceStartLength = matchedPrefix?.length ?? 0;\n\n // Move buffer past the fence start marker\n this.buffer = this.buffer.slice(startIdx + fenceStartLength);\n\n if (\n pattern &&\n pattern.start.startsWith(\"```\") &&\n this.buffer.startsWith(\"\\n\")\n ) {\n this.buffer = this.buffer.slice(1);\n }\n\n this.inFence = true;\n this.fenceStartBuffer = \"\";\n this.currentFencePattern = pattern;\n\n return {\n inFence: true,\n safeContent: prefixText, // Emit any text before the fence\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n // We're inside a fence - look for fence end using the current pattern\n const fenceEnd = this.currentFencePattern?.end ?? \"```\";\n const closingIdx = this.buffer.indexOf(fenceEnd);\n\n if (closingIdx === -1) {\n // No fence end yet - emit safe content (leaving potential fence end marker)\n const overlap = this.computeOverlapLength(this.buffer, [fenceEnd]);\n const safeContentLength = this.buffer.length - overlap;\n\n if (safeContentLength > 0) {\n const safeContent = this.buffer.slice(0, safeContentLength);\n this.fenceStartBuffer += safeContent;\n this.buffer = this.buffer.slice(safeContentLength);\n\n return {\n inFence: true,\n safeContent,\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n // Nothing safe to emit yet\n return {\n inFence: true,\n safeContent: \"\",\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n // Found fence end!\n const fenceContent = this.buffer.slice(0, closingIdx);\n this.fenceStartBuffer += fenceContent;\n\n // Reconstruct complete fence using the current pattern\n const reconstructStart =\n this.currentFencePattern?.reconstructStart ?? \"```tool_call\\n\";\n const completeFence = `${reconstructStart}${this.fenceStartBuffer}${fenceEnd}`;\n\n // Get text after fence\n const textAfterFence = this.buffer.slice(closingIdx + fenceEnd.length);\n\n // Reset state\n this.inFence = false;\n this.fenceStartBuffer = \"\";\n this.currentFencePattern = null;\n this.buffer = textAfterFence;\n\n return {\n inFence: false,\n safeContent: fenceContent, // Emit the last bit of fence content\n completeFence,\n textAfterFence,\n };\n }\n\n isInFence(): boolean {\n return this.inFence;\n }\n\n resetStreamingState(): void {\n this.inFence = false;\n this.fenceStartBuffer = \"\";\n this.currentFencePattern = null;\n }\n}\n\n/**\n * Creates a basic ToolCallFenceDetector with default markdown fence patterns\n */\nexport function createBasicDetector(): ToolCallFenceDetector {\n return new ToolCallFenceDetector({\n patterns: DEFAULT_FENCE_PATTERNS,\n enablePythonStyle: false,\n });\n}\n\n/**\n * Creates an extended ToolCallFenceDetector with all fence patterns\n */\nexport function createExtendedDetector(): ToolCallFenceDetector {\n return new ToolCallFenceDetector({\n patterns: EXTENDED_FENCE_PATTERNS,\n enablePythonStyle: true,\n });\n}\n","/**\n * Extracts tool name from partial fence content for early tool-input-start emission.\n * Expects a JSON fragment like: {\"name\":\"toolName\"\n */\nexport function extractToolName(content: string): string | null {\n const jsonMatch = content.match(/\\{\\s*\"name\"\\s*:\\s*\"([^\"]+)\"/);\n if (jsonMatch) {\n return jsonMatch[1];\n }\n return null;\n}\n\nexport interface ArgumentsStreamState {\n searchFrom: number;\n valueStartIndex: number | null;\n parseIndex: number;\n started: boolean;\n depth: number;\n inString: boolean;\n escaped: boolean;\n complete: boolean;\n}\n\nconst ARGUMENTS_FIELD_REGEX = /\"arguments\"\\s*:\\s*/g;\nconst ARGUMENTS_SEARCH_OVERLAP = 32;\n\nexport function createArgumentsStreamState(): ArgumentsStreamState {\n return {\n searchFrom: 0,\n valueStartIndex: null,\n parseIndex: 0,\n started: false,\n depth: 0,\n inString: false,\n escaped: false,\n complete: false,\n };\n}\n\n/**\n * Incrementally extracts only new argument content from a streaming tool call fence.\n */\nexport function extractArgumentsDelta(\n content: string,\n state: ArgumentsStreamState,\n): string {\n if (state.complete) {\n return \"\";\n }\n\n if (state.valueStartIndex === null) {\n ARGUMENTS_FIELD_REGEX.lastIndex = state.searchFrom;\n const match = ARGUMENTS_FIELD_REGEX.exec(content);\n ARGUMENTS_FIELD_REGEX.lastIndex = 0;\n\n if (!match || match.index === undefined) {\n state.searchFrom = Math.max(0, content.length - ARGUMENTS_SEARCH_OVERLAP);\n return \"\";\n }\n\n state.valueStartIndex = match.index + match[0].length;\n state.parseIndex = state.valueStartIndex;\n state.searchFrom = state.valueStartIndex;\n }\n\n if (state.parseIndex >= content.length) {\n return \"\";\n }\n\n let delta = \"\";\n for (let i = state.parseIndex; i < content.length; i++) {\n const char = content[i];\n delta += char;\n\n if (!state.started) {\n if (!/\\s/.test(char)) {\n state.started = true;\n if (char === \"{\" || char === \"[\") {\n state.depth = 1;\n }\n }\n continue;\n }\n\n if (state.escaped) {\n state.escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n state.escaped = true;\n continue;\n }\n\n if (char === '\"') {\n state.inString = !state.inString;\n continue;\n }\n\n if (!state.inString) {\n if (char === \"{\" || char === \"[\") {\n state.depth += 1;\n } else if (char === \"}\" || char === \"]\") {\n if (state.depth > 0) {\n state.depth -= 1;\n if (state.depth === 0) {\n state.parseIndex = i + 1;\n state.complete = true;\n return delta;\n }\n }\n }\n }\n }\n\n state.parseIndex = content.length;\n return delta;\n}\n","import type { LanguageModelV3StreamPart } from \"@ai-sdk/provider\";\nimport { ToolCallFenceDetector } from \"./tool-call-detector\";\nimport {\n createArgumentsStreamState,\n extractArgumentsDelta,\n extractToolName,\n} from \"./tool-call-stream-utils\";\nimport { parseJsonFunctionCalls } from \"../tool-calling/parse-json-function-calls\";\nimport type { ParsedToolCall } from \"../types\";\n\nexport interface ToolCallStreamResult {\n toolCallDetected: boolean;\n toolCalls: ParsedToolCall[];\n /** Text appearing after the tool call fence — caller decides when to emit it */\n trailingText: string;\n}\n\nexport function generateToolCallId(): string {\n return `call_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Processes an async iterable of string chunks, detecting tool call fences and\n * emitting the appropriate stream events via `controller` and `emitTextDelta`.\n *\n * When `stopEarlyOnToolCall` is true the function stops consuming chunks as soon as\n * a tool call is detected (useful when the caller needs to cancel the source).\n * When false (the default) the function continues draining remaining chunks without\n * processing them, allowing the underlying stream/engine to conclude normally.\n */\nexport async function processToolCallStream(\n chunks: AsyncIterable<string>,\n emitTextDelta: (delta: string) => void,\n controller: ReadableStreamDefaultController<LanguageModelV3StreamPart>,\n options?: { stopEarlyOnToolCall?: boolean },\n): Promise<ToolCallStreamResult> {\n const fenceDetector = new ToolCallFenceDetector();\n\n let currentToolCallId: string | null = null;\n let toolInputStartEmitted = false;\n let accumulatedFenceContent = \"\";\n let argumentsStreamState = createArgumentsStreamState();\n let insideFence = false;\n\n let toolCallDetected = false;\n let toolCalls: ParsedToolCall[] = [];\n let trailingText = \"\";\n\n const resetFenceState = () => {\n currentToolCallId = null;\n toolInputStartEmitted = false;\n accumulatedFenceContent = \"\";\n argumentsStreamState = createArgumentsStreamState();\n insideFence = false;\n };\n\n for await (const chunk of chunks) {\n if (toolCallDetected) {\n // Drain without processing so the underlying stream/engine can conclude.\n continue;\n }\n\n fenceDetector.addChunk(chunk);\n\n while (fenceDetector.hasContent()) {\n const wasInsideFence = insideFence;\n const result = fenceDetector.detectStreamingFence();\n insideFence = result.inFence;\n\n let madeProgress = false;\n\n if (!wasInsideFence && result.inFence) {\n if (result.safeContent) {\n emitTextDelta(result.safeContent);\n madeProgress = true;\n }\n\n currentToolCallId = generateToolCallId();\n toolInputStartEmitted = false;\n accumulatedFenceContent = \"\";\n argumentsStreamState = createArgumentsStreamState();\n insideFence = true;\n\n continue;\n }\n\n if (result.completeFence) {\n madeProgress = true;\n if (result.safeContent) {\n accumulatedFenceContent += result.safeContent;\n }\n\n if (toolInputStartEmitted && currentToolCallId) {\n const delta = extractArgumentsDelta(\n accumulatedFenceContent,\n argumentsStreamState,\n );\n if (delta.length > 0) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: currentToolCallId,\n delta,\n });\n }\n }\n\n const parsed = parseJsonFunctionCalls(result.completeFence);\n const selectedToolCalls = parsed.toolCalls.slice(0, 1);\n\n if (selectedToolCalls.length === 0) {\n emitTextDelta(result.completeFence);\n if (result.textAfterFence) {\n emitTextDelta(result.textAfterFence);\n }\n resetFenceState();\n continue;\n }\n\n if (currentToolCallId) {\n selectedToolCalls[0].toolCallId = currentToolCallId;\n }\n\n for (const [index, call] of selectedToolCalls.entries()) {\n const toolCallId =\n index === 0 && currentToolCallId\n ? currentToolCallId\n : call.toolCallId;\n const toolName = call.toolName;\n const argsJson = JSON.stringify(call.args ?? {});\n\n if (toolCallId === currentToolCallId) {\n if (!toolInputStartEmitted) {\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallId,\n toolName,\n });\n toolInputStartEmitted = true;\n }\n\n const delta = extractArgumentsDelta(\n accumulatedFenceContent,\n argumentsStreamState,\n );\n if (delta.length > 0) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCallId,\n delta,\n });\n }\n } else {\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallId,\n toolName,\n });\n if (argsJson.length > 0) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCallId,\n delta: argsJson,\n });\n }\n }\n\n controller.enqueue({ type: \"tool-input-end\", id: toolCallId });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId,\n toolName,\n input: argsJson,\n providerExecuted: false,\n });\n }\n\n trailingText = result.textAfterFence ?? \"\";\n toolCalls = selectedToolCalls;\n toolCallDetected = true;\n resetFenceState();\n break; // stop processing inner buffer\n }\n\n if (insideFence) {\n if (result.safeContent) {\n accumulatedFenceContent += result.safeContent;\n madeProgress = true;\n\n const toolName = extractToolName(accumulatedFenceContent);\n if (toolName && !toolInputStartEmitted && currentToolCallId) {\n controller.enqueue({\n type: \"tool-input-start\",\n id: currentToolCallId,\n toolName,\n });\n toolInputStartEmitted = true;\n }\n\n if (toolInputStartEmitted && currentToolCallId) {\n const delta = extractArgumentsDelta(\n accumulatedFenceContent,\n argumentsStreamState,\n );\n if (delta.length > 0) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: currentToolCallId,\n delta,\n });\n }\n }\n }\n\n continue;\n }\n\n if (!insideFence && result.safeContent) {\n emitTextDelta(result.safeContent);\n madeProgress = true;\n }\n\n if (!madeProgress) {\n break;\n }\n }\n\n if (toolCallDetected && options?.stopEarlyOnToolCall) {\n break; // caller will cancel/drain the underlying source\n }\n }\n\n // Flush any remaining buffer when no tool call was detected\n if (!toolCallDetected && fenceDetector.hasContent()) {\n emitTextDelta(fenceDetector.getBuffer());\n fenceDetector.clearBuffer();\n }\n\n return { toolCallDetected, toolCalls, trailingText };\n}\n","import {\n LanguageModelV3Prompt,\n LanguageModelV3ToolResultPart,\n LanguageModelV3ToolResultOutput,\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\";\nimport * as webllm from \"@mlc-ai/web-llm\";\nimport { formatToolResults, type ToolResult } from \"@browser-ai/shared\";\n\n/**\n * Converts the AI SDK ToolResultOutput format to a simple value + error flag\n */\nfunction convertToolResultOutput(output: LanguageModelV3ToolResultOutput): {\n value: unknown;\n isError: boolean;\n} {\n switch (output.type) {\n case \"text\":\n return { value: output.value, isError: false };\n case \"json\":\n return { value: output.value, isError: false };\n case \"error-text\":\n return { value: output.value, isError: true };\n case \"error-json\":\n return { value: output.value, isError: true };\n case \"content\":\n return { value: output.value, isError: false };\n case \"execution-denied\":\n return { value: output.reason, isError: true };\n default: {\n const exhaustiveCheck: never = output;\n return { value: exhaustiveCheck, isError: false };\n }\n }\n}\n\n/**\n * Converts a ToolResultPart to our internal ToolResult format\n */\nfunction toToolResult(part: LanguageModelV3ToolResultPart): ToolResult {\n const { value, isError } = convertToolResultOutput(part.output);\n return {\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: value,\n isError,\n };\n}\n\nfunction uint8ArrayToBase64(uint8array: Uint8Array): string {\n const binary = Array.from(uint8array, (byte) =>\n String.fromCharCode(byte),\n ).join(\"\");\n return btoa(binary);\n}\n\nfunction convertDataToURL(\n data:\n | string\n | Buffer\n | URL\n | Uint8Array\n | ArrayBuffer\n | ReadableStream\n | undefined,\n mediaType: string,\n): string {\n if (data instanceof URL) {\n return data.toString();\n }\n\n if (typeof data === \"string\") {\n // AI SDK provides base64 string\n return `data:${mediaType};base64,${data}`;\n }\n\n if (data instanceof Uint8Array) {\n return `data:${mediaType};base64,${uint8ArrayToBase64(data)}`;\n }\n\n if (data instanceof ArrayBuffer) {\n return `data:${mediaType};base64,${uint8ArrayToBase64(\n new Uint8Array(data),\n )}`;\n }\n\n if (typeof Buffer !== \"undefined\" && data instanceof Buffer) {\n return `data:${mediaType};base64,${data.toString(\"base64\")}`;\n }\n\n throw new UnsupportedFunctionalityError({\n functionality: `file data type: ${typeof data}`,\n });\n}\n\nexport function convertToWebLLMMessages(\n prompt: LanguageModelV3Prompt,\n): webllm.ChatCompletionMessageParam[] {\n const messages: webllm.ChatCompletionMessageParam[] = [];\n\n for (const message of prompt) {\n switch (message.role) {\n case \"system\":\n messages.push({\n role: \"system\",\n content: message.content,\n });\n break;\n\n case \"user\":\n const hasFileContent = message.content.some(\n (part) => part.type === \"file\",\n );\n\n if (!hasFileContent) {\n const userContent: string[] = [];\n for (const part of message.content) {\n if (part.type === \"text\") {\n userContent.push(part.text);\n }\n }\n messages.push({\n role: \"user\",\n content: userContent.join(\"\\n\"),\n });\n break;\n }\n\n const content: webllm.ChatCompletionContentPart[] = [];\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text });\n } else if (part.type === \"file\") {\n if (!part.mediaType?.startsWith(\"image/\")) {\n throw new UnsupportedFunctionalityError({\n functionality: `file input with media type '${part.mediaType}'`,\n });\n }\n content.push({\n type: \"image_url\",\n image_url: {\n url: convertDataToURL(part.data, part.mediaType),\n },\n });\n }\n }\n messages.push({ role: \"user\", content });\n break;\n\n case \"assistant\":\n let assistantContent = \"\";\n const toolCallsInMessage: Array<{\n toolCallId: string;\n toolName: string;\n }> = [];\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n assistantContent += part.text;\n } else if (part.type === \"tool-call\") {\n // Store tool call info but don't include in content\n // Tool calls will be tracked separately\n toolCallsInMessage.push({\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n });\n }\n }\n\n // Only add assistant message if there's text content\n // Tool calls are handled via the JSON fence format in the text\n if (assistantContent) {\n messages.push({\n role: \"assistant\",\n content: assistantContent,\n });\n }\n break;\n\n case \"tool\":\n // Collect tool results and format them\n // filter for tool-result parts only\n // not sure how to support tool-approval-response parts yet\n const toolResults: ToolResult[] = message.content\n .filter((part) => part.type === \"tool-result\")\n .map(toToolResult);\n\n // Format tool results as user message with JSON fence format\n const formattedResults = formatToolResults(toolResults);\n messages.push({\n role: \"user\",\n content: formattedResults,\n });\n break;\n }\n }\n\n return messages;\n}\n","import {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n SharedV3Warning,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3ProviderTool,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n LoadSettingError,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n} from \"@ai-sdk/provider\";\nimport { convertToWebLLMMessages } from \"../utils/convert-to-webllm-messages\";\n\nimport {\n AppConfig,\n ChatCompletionRequestNonStreaming,\n ChatCompletionRequestStreaming,\n CreateWebWorkerMLCEngine,\n InitProgressReport,\n MLCEngine,\n MLCEngineConfig,\n MLCEngineInterface,\n} from \"@mlc-ai/web-llm\";\nimport { Availability } from \"../types\";\nimport {\n buildJsonToolSystemPrompt,\n parseJsonFunctionCalls,\n createUnsupportedSettingWarning,\n createUnsupportedToolWarning,\n isFunctionTool,\n processToolCallStream,\n type ToolDefinition,\n type DownloadProgressCallback,\n} from \"@browser-ai/shared\";\nimport {\n prependSystemPromptToMessages,\n extractSystemPrompt,\n} from \"../utils/prompt-utils\";\nimport {\n isMobile,\n checkWebGPU,\n doesBrowserSupportWebLLM,\n} from \"../utils/browser\";\n\nexport { doesBrowserSupportWebLLM };\n\nexport type WebLLMModelId = string;\n\nexport interface WebLLMSettings {\n /**\n * Custom app configuration for WebLLM\n */\n appConfig?: AppConfig;\n /**\n * Progress callback for model initialization\n */\n initProgressCallback?: (progress: InitProgressReport) => void;\n /**\n * Engine configuration options\n */\n engineConfig?: MLCEngineConfig;\n /**\n * A web worker instance to run the model in.\n * When provided, the model will run in a separate thread.\n *\n * @default undefined\n */\n worker?: Worker;\n}\n\ntype WebLLMConfig = {\n provider: string;\n modelId: WebLLMModelId;\n options: WebLLMSettings;\n};\n\nexport class WebLLMLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\";\n readonly modelId: WebLLMModelId;\n readonly provider = \"web-llm\";\n\n private readonly config: WebLLMConfig;\n private engine?: MLCEngineInterface;\n private isInitialized = false;\n private initializationPromise?: Promise<void>;\n\n constructor(modelId: WebLLMModelId, options: WebLLMSettings = {}) {\n this.modelId = modelId;\n this.config = {\n provider: this.provider,\n modelId,\n options,\n };\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {\n // WebLLM doesn't support URLs natively\n };\n\n /**\n * Check if the model is initialized and ready to use\n * @returns true if the model is initialized, false otherwise\n */\n get isModelInitialized(): boolean {\n return this.isInitialized;\n }\n\n private async getEngine(\n options?: MLCEngineConfig,\n onInitProgress?: (progress: InitProgressReport) => void,\n ): Promise<MLCEngineInterface> {\n const availability = await this.availability();\n if (availability === \"unavailable\") {\n throw new LoadSettingError({\n message:\n \"WebLLM is not available. This library requires a browser with WebGPU support.\",\n });\n }\n\n if (this.engine && this.isInitialized) return this.engine;\n\n // If initialization is already in progress, wait for it\n if (this.initializationPromise) {\n await this.initializationPromise;\n if (this.engine) return this.engine;\n }\n\n this.initializationPromise = this._initializeEngine(\n options,\n onInitProgress,\n );\n await this.initializationPromise;\n\n if (!this.engine) {\n throw new LoadSettingError({\n message: \"Engine initialization failed\",\n });\n }\n\n return this.engine;\n }\n\n private async _initializeEngine(\n options?: MLCEngineConfig,\n onInitProgress?: (progress: InitProgressReport) => void,\n ): Promise<void> {\n try {\n // Create engine instance\n const engineConfig = {\n ...this.config.options.engineConfig,\n ...options,\n initProgressCallback:\n onInitProgress || this.config.options.initProgressCallback,\n };\n\n if (this.config.options.worker) {\n this.engine = await CreateWebWorkerMLCEngine(\n this.config.options.worker,\n this.modelId,\n engineConfig,\n );\n } else {\n this.engine = new MLCEngine(engineConfig);\n // Load the model\n await this.engine.reload(this.modelId);\n }\n\n this.isInitialized = true;\n } catch (error) {\n // Reset state on error so we can retry\n this.engine = undefined;\n this.isInitialized = false;\n this.initializationPromise = undefined;\n\n throw new LoadSettingError({\n message: `Failed to initialize WebLLM engine: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n });\n }\n }\n\n private getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n responseFormat,\n seed,\n tools,\n toolChoice,\n providerOptions,\n }: Parameters<LanguageModelV3[\"doGenerate\"]>[0]) {\n const warnings: SharedV3Warning[] = [];\n\n const functionTools: ToolDefinition[] = (tools ?? [])\n .filter(isFunctionTool)\n .map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n }));\n\n const unsupportedTools = (tools ?? []).filter(\n (tool): tool is LanguageModelV3ProviderTool => !isFunctionTool(tool),\n );\n\n for (const tool of unsupportedTools) {\n warnings.push(\n createUnsupportedToolWarning(\n tool,\n \"Only function tools are supported by WebLLM\",\n ),\n );\n }\n\n if (topK != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"topK\",\n \"topK is not supported by WebLLM\",\n ),\n );\n }\n\n if (stopSequences != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"stopSequences\",\n \"Stop sequences may not be fully implemented\",\n ),\n );\n }\n\n if (presencePenalty != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"presencePenalty\",\n \"Presence penalty is not fully implemented\",\n ),\n );\n }\n\n if (frequencyPenalty != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"frequencyPenalty\",\n \"Frequency penalty is not fully implemented\",\n ),\n );\n }\n\n if (toolChoice != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"toolChoice\",\n \"toolChoice is not supported by WebLLM\",\n ),\n );\n }\n\n // Convert messages to WebLLM format\n const messages = convertToWebLLMMessages(prompt);\n\n // Build request options\n const requestOptions: ChatCompletionRequestNonStreaming = {\n messages,\n temperature,\n max_tokens: maxOutputTokens,\n top_p: topP,\n seed,\n };\n\n const webLLMOptions = providerOptions?.[this.provider];\n const extraBody = webLLMOptions?.extra_body as\n | Record<string, unknown>\n | undefined;\n if (extraBody) {\n // https://webllm.mlc.ai/docs/user/api_reference.html#generationconfig\n requestOptions.extra_body = {\n enable_thinking: extraBody.enable_thinking as boolean | undefined,\n enable_latency_breakdown: extraBody.enable_latency_breakdown as\n | boolean\n | undefined,\n };\n }\n\n // Handle response format\n if (responseFormat?.type === \"json\") {\n requestOptions.response_format = {\n type: \"json_object\",\n ...(responseFormat.schema && {\n schema: JSON.stringify(responseFormat.schema),\n }),\n };\n }\n\n return {\n messages,\n warnings,\n requestOptions,\n functionTools,\n };\n }\n\n /**\n * Generates a complete text response using WebLLM\n * @param options\n * @returns Promise resolving to the generated content with finish reason, usage stats, and any warnings\n * @throws {LoadSettingError} When WebLLM is not available or model needs to be downloaded\n * @throws {UnsupportedFunctionalityError} When unsupported features like file input are used\n */\n public async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const converted = this.getArgs(options);\n const { messages, warnings, requestOptions, functionTools } = converted;\n\n // Extract system prompt and build tool calling prompt\n const {\n systemPrompt: originalSystemPrompt,\n messages: messagesWithoutSystem,\n } = extractSystemPrompt(messages);\n\n const systemPrompt = buildJsonToolSystemPrompt(\n originalSystemPrompt,\n functionTools,\n {\n allowParallelToolCalls: false,\n },\n );\n\n // Prepend system prompt to messages\n const promptMessages = prependSystemPromptToMessages(\n messagesWithoutSystem,\n systemPrompt,\n );\n\n const engine = await this.getEngine();\n\n const abortHandler = async () => {\n await engine.interruptGenerate();\n };\n\n if (options.abortSignal) {\n options.abortSignal.addEventListener(\"abort\", abortHandler);\n }\n\n try {\n const response = await engine.chat.completions.create({\n ...requestOptions,\n messages: promptMessages,\n stream: false,\n ...(options.abortSignal &&\n !this.config.options.worker && { signal: options.abortSignal }),\n });\n\n const choice = response.choices[0];\n if (!choice) {\n throw new Error(\"No response choice returned from WebLLM\");\n }\n\n const rawResponse = choice.message.content || \"\";\n\n // Parse JSON tool calls from response\n const { toolCalls, textContent } = parseJsonFunctionCalls(rawResponse);\n\n if (toolCalls.length > 0) {\n const toolCallsToEmit = toolCalls.slice(0, 1);\n\n const parts: LanguageModelV3Content[] = [];\n\n if (textContent) {\n parts.push({\n type: \"text\",\n text: textContent,\n });\n }\n\n for (const call of toolCallsToEmit) {\n parts.push({\n type: \"tool-call\",\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: JSON.stringify(call.args ?? {}),\n } satisfies LanguageModelV3ToolCall);\n }\n\n return {\n content: parts,\n finishReason: { unified: \"tool-calls\", raw: \"tool-calls\" },\n usage: {\n inputTokens: {\n total: response.usage?.prompt_tokens,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: response.usage?.completion_tokens,\n text: undefined,\n reasoning: undefined,\n },\n },\n request: { body: { ...requestOptions, messages: promptMessages } },\n warnings,\n };\n }\n\n const content: LanguageModelV3Content[] = [\n {\n type: \"text\",\n text: textContent || rawResponse,\n },\n ];\n\n let finishReason: LanguageModelV3FinishReason = {\n unified: \"stop\",\n raw: choice.finish_reason,\n };\n if (choice.finish_reason === \"abort\") {\n finishReason = { unified: \"other\", raw: choice.finish_reason };\n }\n\n return {\n content,\n finishReason,\n usage: {\n inputTokens: {\n total: response.usage?.prompt_tokens,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: response.usage?.completion_tokens,\n text: undefined,\n reasoning: undefined,\n },\n raw: {\n total: response.usage?.total_tokens,\n },\n },\n request: { body: { ...requestOptions, messages: promptMessages } },\n warnings,\n };\n } catch (error) {\n throw new Error(\n `WebLLM generation failed: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n );\n } finally {\n if (options.abortSignal) {\n options.abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n }\n }\n\n /**\n * Check the availability of the WebLLM model.\n * Note: On mobile devices with a worker, WebGPU detection is skipped since it\n * can't be done reliably. The actual availability will be determined at init.\n * @returns Promise resolving to \"unavailable\", \"available\", or \"downloadable\"\n */\n public async availability(): Promise<Availability> {\n if (this.isInitialized) {\n return \"available\";\n }\n\n // Skip on mobile if using a worker, since detecting GPU is unreliable.\n // Let worker initialization handle it and return an error if unavailable.\n if (this.config.options.worker && isMobile()) {\n return \"downloadable\";\n }\n\n const supported = checkWebGPU();\n return supported ? \"downloadable\" : \"unavailable\";\n }\n\n /**\n * Creates an engine session with download progress monitoring.\n *\n * @example\n * ```typescript\n * const model = await model.createSessionWithProgress(\n * (progress) => {\n * console.log(`Download progress: ${Math.round(progress * 100)}%`);\n * }\n * );\n * ```\n *\n * @param onDownloadProgress Optional callback receiving progress values from 0 to 1\n * @returns Promise resolving to the model instance\n * @throws {LoadSettingError} When WebLLM is not available or model is unavailable\n */\n public async createSessionWithProgress(\n onDownloadProgress?: DownloadProgressCallback,\n ): Promise<WebLLMLanguageModel> {\n const adaptedCallback = onDownloadProgress\n ? (report: InitProgressReport) => {\n onDownloadProgress(report.progress);\n }\n : undefined;\n await this.getEngine(undefined, adaptedCallback);\n return this;\n }\n\n /**\n * Generates a streaming text response using WebLLM\n * @param options\n * @returns Promise resolving to a readable stream of text chunks and request metadata\n * @throws {LoadSettingError} When WebLLM is not available or model needs to be downloaded\n * @throws {UnsupportedFunctionalityError} When unsupported features like file input are used\n */\n public async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const converted = this.getArgs(options);\n const { messages, warnings, requestOptions, functionTools } = converted;\n\n // Extract system prompt and build tool calling prompt\n const {\n systemPrompt: originalSystemPrompt,\n messages: messagesWithoutSystem,\n } = extractSystemPrompt(messages);\n\n const systemPrompt = buildJsonToolSystemPrompt(\n originalSystemPrompt,\n functionTools,\n {\n allowParallelToolCalls: false,\n },\n );\n\n // Prepend system prompt to messages\n const promptMessages = prependSystemPromptToMessages(\n messagesWithoutSystem,\n systemPrompt,\n );\n\n const engine = await this.getEngine();\n const useWorker = this.config.options.worker != null;\n\n const abortHandler = async () => {\n await engine.interruptGenerate();\n };\n\n if (options.abortSignal) {\n options.abortSignal.addEventListener(\"abort\", abortHandler);\n }\n\n const textId = \"text-0\";\n\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n async start(controller) {\n controller.enqueue({\n type: \"stream-start\",\n warnings,\n });\n\n let textStarted = false;\n let finished = false;\n\n const ensureTextStart = () => {\n if (!textStarted) {\n controller.enqueue({\n type: \"text-start\",\n id: textId,\n });\n textStarted = true;\n }\n };\n\n const emitTextDelta = (delta: string) => {\n if (!delta) return;\n ensureTextStart();\n controller.enqueue({\n type: \"text-delta\",\n id: textId,\n delta,\n });\n };\n\n const emitTextEndIfNeeded = () => {\n if (!textStarted) return;\n controller.enqueue({\n type: \"text-end\",\n id: textId,\n });\n textStarted = false;\n };\n\n const finishStream = (\n finishReason: LanguageModelV3FinishReason,\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n },\n ) => {\n if (finished) return;\n finished = true;\n emitTextEndIfNeeded();\n controller.enqueue({\n type: \"finish\",\n finishReason,\n usage: {\n inputTokens: {\n total: usage?.prompt_tokens,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: usage?.completion_tokens,\n text: undefined,\n reasoning: undefined,\n },\n raw: {\n total: usage?.total_tokens,\n },\n },\n });\n controller.close();\n };\n\n try {\n const streamingRequest: ChatCompletionRequestStreaming = {\n ...requestOptions,\n messages: promptMessages,\n stream: true,\n stream_options: { include_usage: true },\n ...(options.abortSignal &&\n !useWorker && { signal: options.abortSignal }),\n };\n\n const response =\n await engine.chat.completions.create(streamingRequest);\n\n let lastUsage:\n | {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n }\n | undefined;\n let isAbort = false;\n\n const chunks = (async function* () {\n for await (const chunk of response) {\n const choice = chunk.choices[0];\n if (!choice) continue;\n if (choice.delta.content) yield choice.delta.content;\n if (chunk.usage) lastUsage = chunk.usage;\n if (choice.finish_reason === \"abort\") isAbort = true;\n }\n })();\n\n const result = await processToolCallStream(\n chunks,\n emitTextDelta,\n controller,\n );\n\n if (result.trailingText) {\n emitTextDelta(result.trailingText);\n }\n\n const finishReason: LanguageModelV3FinishReason = isAbort\n ? { unified: \"other\", raw: \"abort\" }\n : result.toolCallDetected\n ? { unified: \"tool-calls\", raw: \"tool-calls\" }\n : { unified: \"stop\", raw: \"stop\" };\n\n finishStream(finishReason, lastUsage);\n } catch (error) {\n // Propagate all other errors.\n controller.error(error);\n } finally {\n if (options.abortSignal) {\n options.abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n if (!finished) {\n controller.close();\n }\n }\n },\n });\n\n return {\n stream,\n request: { body: { ...requestOptions, messages: promptMessages } },\n };\n }\n}\n","import type { ChatCompletionMessageParam } from \"@mlc-ai/web-llm\";\n\n/**\n * Extracts the system prompt from a message array and returns both the system prompt\n * and the remaining messages without the system message.\n *\n * @param messages - Array of chat messages\n * @returns Object with systemPrompt string and messages array without system messages\n */\nexport function extractSystemPrompt(messages: ChatCompletionMessageParam[]): {\n systemPrompt: string | undefined;\n messages: ChatCompletionMessageParam[];\n} {\n const systemMessages = messages.filter((msg) => msg.role === \"system\");\n const nonSystemMessages = messages.filter((msg) => msg.role !== \"system\");\n\n if (systemMessages.length === 0) {\n return { systemPrompt: undefined, messages };\n }\n\n // Combine all system messages into one\n const systemPrompt = systemMessages\n .map((msg) => msg.content)\n .filter((content): content is string => typeof content === \"string\")\n .join(\"\\n\\n\");\n\n return {\n systemPrompt: systemPrompt || undefined,\n messages: nonSystemMessages,\n };\n}\n\n/**\n * Prepends a system prompt to the messages array.\n * If there's already a system message, it prepends to it.\n * Otherwise, creates a new system message at the start.\n *\n * @param messages - Array of chat messages\n * @param systemPrompt - System prompt to prepend\n * @returns New messages array with system prompt prepended\n */\nexport function prependSystemPromptToMessages(\n messages: ChatCompletionMessageParam[],\n systemPrompt: string,\n): ChatCompletionMessageParam[] {\n if (!systemPrompt.trim()) {\n return messages;\n }\n\n const systemMessageIndex = messages.findIndex((msg) => msg.role === \"system\");\n\n if (systemMessageIndex !== -1) {\n const newMessages = [...messages];\n const existingSystemMessage = messages[systemMessageIndex];\n const existingContent =\n typeof existingSystemMessage.content === \"string\"\n ? existingSystemMessage.content\n : \"\";\n\n newMessages[systemMessageIndex] = {\n ...existingSystemMessage,\n content: systemPrompt + (existingContent ? `\\n\\n${existingContent}` : \"\"),\n };\n\n return newMessages;\n }\n\n return [\n {\n role: \"system\",\n content: systemPrompt,\n },\n ...messages,\n ];\n}\n","declare global {\n interface Navigator {\n gpu?: GPU;\n }\n}\n\nexport function isMobile(): boolean {\n if (typeof navigator === \"undefined\") return false;\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent,\n );\n}\n\nexport function checkWebGPU(): boolean {\n try {\n return !!globalThis?.navigator?.gpu;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if the browser supports WebLLM (WebGPU)\n */\nexport function doesBrowserSupportWebLLM(): boolean {\n return checkWebGPU();\n}\n","import {\n EmbeddingModelV3,\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Result,\n TooManyEmbeddingValuesForCallError,\n LoadSettingError,\n} from \"@ai-sdk/provider\";\nimport {\n AppConfig,\n CreateWebWorkerMLCEngine,\n InitProgressReport,\n MLCEngine,\n MLCEngineConfig,\n MLCEngineInterface,\n} from \"@mlc-ai/web-llm\";\nimport { Availability } from \"../types\";\nimport { isMobile, checkWebGPU } from \"../utils/browser\";\n\nexport type WebLLMEmbeddingModelId = string;\n\nexport interface WebLLMEmbeddingSettings {\n /**\n * Custom app configuration for WebLLM\n */\n appConfig?: AppConfig;\n /**\n * Progress callback for model initialization\n */\n initProgressCallback?: (progress: InitProgressReport) => void;\n /**\n * Engine configuration options\n */\n engineConfig?: MLCEngineConfig;\n /**\n * A web worker instance to run the model in.\n * When provided, the model will run in a separate thread.\n *\n * @default undefined\n */\n worker?: Worker;\n /**\n * Maximum number of texts to embed in a single call.\n * @default 100\n */\n maxEmbeddingsPerCall?: number;\n}\n\ntype WebLLMEmbeddingConfig = {\n provider: string;\n modelId: WebLLMEmbeddingModelId;\n options: WebLLMEmbeddingSettings;\n};\n\nexport class WebLLMEmbeddingModel implements EmbeddingModelV3 {\n readonly specificationVersion = \"v3\";\n readonly provider = \"web-llm\";\n readonly modelId: WebLLMEmbeddingModelId;\n readonly maxEmbeddingsPerCall: number;\n readonly supportsParallelCalls = false;\n\n private readonly config: WebLLMEmbeddingConfig;\n private engine?: MLCEngineInterface;\n private isInitialized = false;\n private initializationPromise?: Promise<void>;\n\n constructor(\n modelId: WebLLMEmbeddingModelId,\n options: WebLLMEmbeddingSettings = {},\n ) {\n this.modelId = modelId;\n this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall ?? 100;\n this.config = {\n provider: this.provider,\n modelId,\n options,\n };\n }\n\n /**\n * Check if the model is initialized and ready to use\n */\n get isModelInitialized(): boolean {\n return this.isInitialized;\n }\n\n private async getEngine(\n options?: MLCEngineConfig,\n onInitProgress?: (progress: InitProgressReport) => void,\n ): Promise<MLCEngineInterface> {\n const availability = await this.availability();\n if (availability === \"unavailable\") {\n throw new LoadSettingError({\n message:\n \"WebLLM is not available. This library requires a browser with WebGPU support.\",\n });\n }\n\n if (this.engine && this.isInitialized) return this.engine;\n\n if (this.initializationPromise) {\n await this.initializationPromise;\n if (this.engine) return this.engine;\n }\n\n this.initializationPromise = this._initializeEngine(\n options,\n onInitProgress,\n );\n await this.initializationPromise;\n\n if (!this.engine) {\n throw new LoadSettingError({\n message: \"Engine initialization failed\",\n });\n }\n\n return this.engine;\n }\n\n private async _initializeEngine(\n options?: MLCEngineConfig,\n onInitProgress?: (progress: InitProgressReport) => void,\n ): Promise<void> {\n try {\n const engineConfig = {\n ...this.config.options.engineConfig,\n ...options,\n initProgressCallback:\n onInitProgress || this.config.options.initProgressCallback,\n };\n\n if (this.config.options.worker) {\n this.engine = await CreateWebWorkerMLCEngine(\n this.config.options.worker,\n this.modelId,\n engineConfig,\n );\n } else {\n this.engine = new MLCEngine(engineConfig);\n await this.engine.reload(this.modelId);\n }\n\n this.isInitialized = true;\n } catch (error) {\n this.engine = undefined;\n this.isInitialized = false;\n this.initializationPromise = undefined;\n\n throw new LoadSettingError({\n message: `Failed to initialize WebLLM embedding engine: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n });\n }\n }\n\n /**\n * Check the availability of the WebLLM embedding model\n * @returns Promise resolving to \"unavailable\", \"available\", or \"downloadable\"\n */\n public async availability(): Promise<Availability> {\n if (this.isInitialized) {\n return \"available\";\n }\n\n if (this.config.options.worker && isMobile()) {\n return \"downloadable\";\n }\n\n const supported = checkWebGPU();\n return supported ? \"downloadable\" : \"unavailable\";\n }\n\n /**\n * Creates an engine session with download progress monitoring.\n *\n * @example\n * ```typescript\n * const engine = await model.createSessionWithProgress(\n * (progress) => {\n * console.log(`Download progress: ${Math.round(progress.progress * 100)}%`);\n * }\n * );\n * ```\n *\n * @param onInitProgress Optional callback receiving progress reports during model download\n * @returns Promise resolving to a configured WebLLM engine\n * @throws {LoadSettingError} When WebLLM isn't available or model is unavailable\n */\n public async createSessionWithProgress(\n onInitProgress?: (progress: InitProgressReport) => void,\n ): Promise<MLCEngineInterface> {\n return this.getEngine(undefined, onInitProgress);\n }\n\n /**\n * Embed texts using the WebLLM embedding model\n */\n public async doEmbed(\n options: EmbeddingModelV3CallOptions,\n ): Promise<EmbeddingModelV3Result> {\n const { values, abortSignal } = options;\n\n if (values.length > this.maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n provider: this.provider,\n modelId: this.modelId,\n maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n values,\n });\n }\n\n if (abortSignal?.aborted) {\n throw new Error(\"Operation was aborted\");\n }\n\n const engine = await this.getEngine();\n\n const abortHandler = () => {\n engine.interruptGenerate();\n };\n\n if (abortSignal) {\n abortSignal.addEventListener(\"abort\", abortHandler);\n }\n\n try {\n const response = await engine.embeddings.create({\n input: values,\n model: this.modelId,\n ...(abortSignal &&\n !this.config.options.worker && { signal: abortSignal }),\n });\n\n const sortedEmbeddings = response.data\n .sort((a, b) => a.index - b.index)\n .map((e) => e.embedding);\n\n return {\n embeddings: sortedEmbeddings,\n usage: {\n tokens: response.usage.total_tokens,\n },\n providerMetadata: {\n webllm: {\n model: response.model,\n promptTokens: response.usage.prompt_tokens,\n totalTokens: response.usage.total_tokens,\n prefillTokensPerSecond: response.usage.extra?.prefill_tokens_per_s,\n },\n },\n warnings: [],\n };\n } catch (error) {\n throw new Error(\n `WebLLM embedding failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n } finally {\n if (abortSignal) {\n abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n }\n }\n}\n","import {\n EmbeddingModelV3,\n NoSuchModelError,\n ProviderV3,\n} from \"@ai-sdk/provider\";\nimport {\n WebLLMLanguageModel,\n WebLLMModelId,\n WebLLMSettings,\n} from \"./chat/web-llm-language-model\";\nimport {\n WebLLMEmbeddingModel,\n WebLLMEmbeddingModelId,\n WebLLMEmbeddingSettings,\n} from \"./embedding/web-llm-embedding-model\";\n\nexport interface WebLLMProvider extends ProviderV3 {\n (modelId: WebLLMModelId, settings?: WebLLMSettings): WebLLMLanguageModel;\n\n /**\n * Creates a model for text generation.\n */\n languageModel(\n modelId: WebLLMModelId,\n settings?: WebLLMSettings,\n ): WebLLMLanguageModel;\n\n /**\n * Creates a model for text generation.\n */\n chat(modelId: WebLLMModelId, settings?: WebLLMSettings): WebLLMLanguageModel;\n\n /**\n * Creates a model for text embeddings.\n */\n embedding(\n modelId: WebLLMEmbeddingModelId,\n settings?: WebLLMEmbeddingSettings,\n ): EmbeddingModelV3;\n\n /**\n * Creates a model for text embeddings.\n */\n embeddingModel: (\n modelId: WebLLMEmbeddingModelId,\n settings?: WebLLMEmbeddingSettings,\n ) => EmbeddingModelV3;\n}\n\n/**\n * Create a WebLLM provider instance.\n */\nexport function createWebLLM(): WebLLMProvider {\n const createLanguageModel = (\n modelId: WebLLMModelId,\n settings?: WebLLMSettings,\n ) => {\n return new WebLLMLanguageModel(modelId, settings);\n };\n\n const createEmbeddingModel = (\n modelId: WebLLMEmbeddingModelId,\n settings?: WebLLMEmbeddingSettings,\n ) => {\n return new WebLLMEmbeddingModel(modelId, settings);\n };\n\n const provider = function (\n modelId: WebLLMModelId,\n settings?: WebLLMSettings,\n ) {\n if (new.target) {\n throw new Error(\n \"The WebLLM model function cannot be called with the new keyword.\",\n );\n }\n\n return createLanguageModel(modelId, settings);\n };\n\n provider.specificationVersion = \"v3\" as const;\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.embedding = createEmbeddingModel;\n provider.embeddingModel = createEmbeddingModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: \"imageModel\" });\n };\n\n provider.speechModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: \"speechModel\" });\n };\n\n provider.transcriptionModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: \"transcriptionModel\" });\n };\n\n return provider as WebLLMProvider;\n}\n\n/**\n * Default WebLLM provider instance\n *\n * @example\n * ```typescript\n * import { webLLM } from \"@browser-ai/web-llm\";\n *\n * // Language model\n * const chat = webLLM(\"Llama-3.2-3B-Instruct-q4f16_1-MLC\");\n *\n * // Embedding model\n * const embed = webLLM.embeddingModel(\"snowflake-arctic-embed-m-q0f32-MLC-b32\");\n * ```\n */\nexport const webLLM = createWebLLM();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACIA,IAAM,SAAS;AACf,IAAM,SAAS,OAAO,IAAI,MAAM;AALhC,IAAA;AAAA,IAAA;AAWO,IAAM,aAAN,MAAM,qBAAmB,KAAA,OACZ,KAAA,QADY,IAAM;;;;;;;;;EAgBpC,YAAY;IACV,MAAAA;IACA;IACA;EACF,GAIG;AACD,UAAM,OAAO;AAxBf,SAAkB,EAAA,IAAU;AA0B1B,SAAK,OAAOA;AACZ,SAAK,QAAQ;EACf;;;;;;EAOA,OAAO,WAAW,OAAqC;AACrD,WAAO,YAAW,UAAU,OAAO,MAAM;EAC3C;EAEA,OAAiB,UAAU,OAAgBC,UAAyB;AAClE,UAAM,eAAe,OAAO,IAAIA,QAAM;AACtC,WACE,SAAS,QACT,OAAO,UAAU,YACjB,gBAAgB,SAChB,OAAO,MAAM,YAAY,MAAM,aAC/B,MAAM,YAAY,MAAM;EAE5B;AACF;AC3DA,IAAM,OAAO;AACb,IAAMA,UAAS,mBAAmB,IAAI;AACtC,IAAMC,UAAS,OAAO,IAAID,OAAM;AAJhC,IAAAE;AAAA,IAAAC;AAMO,IAAM,eAAN,eAA2BA,MAAA,YACdD,MAAAD,SADcE,KAAW;EAa3C,YAAY;IACV;IACA;IACA;IACA;IACA;IACA;IACA;IACA,cAAc,cAAc,SACzB,eAAe;IACd,eAAe;IACf,eAAe;IACf,cAAc;;IAClB;EACF,GAUG;AACD,UAAM,EAAE,MAAM,SAAS,MAAM,CAAC;AArChC,SAAkBD,GAAAA,IAAU;AAuC1B,SAAK,MAAM;AACX,SAAK,oBAAoB;AACzB,SAAK,aAAa;AAClB,SAAK,kBAAkB;AACvB,SAAK,eAAe;AACpB,SAAK,cAAc;AACnB,SAAK,OAAO;EACd;EAEA,OAAO,WAAW,OAAuC;AACvD,WAAO,WAAW,UAAU,OAAOF,OAAM;EAC3C;AACF;ACxDA,IAAMD,QAAO;AACb,IAAMC,UAAS,mBAAmBD,KAAI;AACtC,IAAME,UAAS,OAAO,IAAID,OAAM;AAJhC,IAAAE;AAAA,IAAAC;AAMO,IAAM,yBAAN,eAAqCA,MAAA,YACxBD,MAAAD,SADwBE,KAAW;;EAGrD,YAAY,EAAE,UAAU,sBAAsB,IAA0B,CAAC,GAAG;AAC1E,UAAM,EAAE,MAAAJ,OAAM,QAAQ,CAAC;AAHzB,SAAkBG,GAAAA,IAAU;EAI5B;EAEA,OAAO,WAAW,OAAiD;AACjE,WAAO,WAAW,UAAU,OAAOF,OAAM;EAC3C;AACF;AChBO,SAAS,gBAAgB,OAA4B;AAC1D,MAAI,SAAS,MAAM;AACjB,WAAO;EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;EACT;AAEA,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;EACf;AAEA,SAAO,KAAK,UAAU,KAAK;AAC7B;ACZA,IAAMD,QAAO;AACb,IAAMC,UAAS,mBAAmBD,KAAI;AACtC,IAAME,UAAS,OAAO,IAAID,OAAM;AAJhC,IAAAE;AAAA,IAAAC;AASO,IAAM,uBAAN,eAAmCA,MAAA,YACtBD,MAAAD,SADsBE,KAAW;EAKnD,YAAY;IACV;IACA;IACA;EACF,GAIG;AACD,UAAM,EAAE,MAAAJ,OAAM,SAAS,MAAM,CAAC;AAbhC,SAAkBG,GAAAA,IAAU;AAe1B,SAAK,WAAW;EAClB;EAEA,OAAO,WAAW,OAA+C;AAC/D,WAAO,WAAW,UAAU,OAAOF,OAAM;EAC3C;AACF;AC7BA,IAAMD,QAAO;AACb,IAAMC,UAAS,mBAAmBD,KAAI;AACtC,IAAME,UAAS,OAAO,IAAID,OAAM;AAJhC,IAAAE;AAAA,IAAAC;AAUO,IAAM,qBAAN,eAAiCA,MAAA,YACpBD,MAAAD,SADoBE,KAAW;EAKjD,YAAY;IACV;IACA;IACA;EACF,GAIG;AACD,UAAM,EAAE,MAAAJ,OAAM,SAAS,mBAAmB,OAAO,IAAI,MAAM,CAAC;AAb9D,SAAkBG,GAAAA,IAAU;AAe1B,SAAK,SAAS;EAChB;EAEA,OAAO,WAAW,OAA6C;AAC7D,WAAO,WAAW,UAAU,OAAOF,OAAM;EAC3C;AACF;AC9BA,IAAMD,QAAO;AACb,IAAMC,UAAS,mBAAmBD,KAAI;AACtC,IAAME,UAAS,OAAO,IAAID,OAAM;AAJhC,IAAAE;AAAA,IAAAC;AAUO,IAAM,2BAAN,eAAuCA,MAAA,YAC1BD,MAAAD,SAD0BE,KAAW;EAKvD,YAAY;IACV;IACA,UAAU,0BAA0B,KAAK,UAAU,IAAI,CAAC;EAC1D,GAGG;AACD,UAAM,EAAE,MAAAJ,OAAM,QAAQ,CAAC;AAXzB,SAAkBG,GAAAA,IAAU;AAa1B,SAAK,OAAO;EACd;EAEA,OAAO,WAAW,OAAmD;AACnE,WAAO,WAAW,UAAU,OAAOF,OAAM;EAC3C;AACF;AC3BA,IAAMD,QAAO;AACb,IAAMC,UAAS,mBAAmBD,KAAI;AACtC,IAAME,UAAS,OAAO,IAAID,OAAM;AALhC,IAAAE;AAAA,IAAAC;AAOO,IAAM,iBAAN,eAA6BA,MAAA,YAChBD,MAAAD,SADgBE,KAAW;EAK7C,YAAY,EAAE,MAAM,MAAM,GAAqC;AAC7D,UAAM;MACJ,MAAAJ;MACA,SACE,8BACS,IAAI;iBACK,gBAAgB,KAAK,CAAC;MAC1C;IACF,CAAC;AAZH,SAAkBG,GAAAA,IAAU;AAc1B,SAAK,OAAO;EACd;EAEA,OAAO,WAAW,OAAyC;AACzD,WAAO,WAAW,UAAU,OAAOF,OAAM;EAC3C;AACF;AC1BA,IAAMD,QAAO;AACb,IAAMC,UAAS,mBAAmBD,KAAI;AACtC,IAAME,UAAS,OAAO,IAAID,OAAM;AAJhC,IAAAE;AAAA,IAAAC;AAMO,IAAM,kBAAN,eAA8BA,MAAA,YACjBD,MAAAD,SADiBE,KAAW;;EAG9C,YAAY,EAAE,QAAQ,GAAwB;AAC5C,UAAM,EAAE,MAAAJ,OAAM,QAAQ,CAAC;AAHzB,SAAkBG,GAAAA,IAAU;EAI5B;EAEA,OAAO,WAAW,OAA0C;AAC1D,WAAO,WAAW,UAAU,OAAOF,OAAM;EAC3C;AACF;ACdA,IAAMD,QAAO;AACb,IAAMC,UAAS,mBAAmBD,KAAI;AACtC,IAAME,UAAS,OAAO,IAAID,OAAM;AAJhC,IAAAE;AAAA,IAAAC;AAMO,IAAM,mBAAN,eAA+BA,MAAA,YAClBD,MAAAD,SADkBE,KAAW;;EAG/C,YAAY,EAAE,QAAQ,GAAwB;AAC5C,UAAM,EAAE,MAAAJ,OAAM,QAAQ,CAAC;AAHzB,SAAkBG,GAAAA,IAAU;EAI5B;EAEA,OAAO,WAAW,OAA2C;AAC3D,WAAO,WAAW,UAAU,OAAOF,OAAM;EAC3C;AACF;ACdA,IAAMD,QAAO;AACb,IAAMC,WAAS,mBAAmBD,KAAI;AACtC,IAAME,WAAS,OAAO,IAAID,QAAM;AAJhC,IAAAE;AAAA,IAAAC;AASO,IAAM,0BAAN,eAAsCA,OAAA,YACzBD,OAAAD,UADyBE,MAAW;;EAGtD,YAAY;IACV,UAAU;EACZ,IAA0B,CAAC,GAAG;AAC5B,UAAM,EAAE,MAAAJ,OAAM,QAAQ,CAAC;AALzB,SAAkBG,IAAAA,IAAU;EAM5B;EAEA,OAAO,WAAW,OAAkD;AAClE,WAAO,WAAW,UAAU,OAAOF,QAAM;EAC3C;AACF;ACnBA,IAAMD,SAAO;AACb,IAAMC,WAAS,mBAAmBD,MAAI;AACtC,IAAME,WAAS,OAAO,IAAID,QAAM;AAJhC,IAAAE;AAAA,IAAAC;AAMO,IAAM,mBAAN,eAA+BA,OAAA,YAClBD,OAAAD,UADkBE,MAAW;EAY/C,YAAY;IACV,YAAYJ;IACZ;IACA;IACA,UAAU,WAAW,SAAS,KAAK,OAAO;EAC5C,GAWG;AACD,UAAM,EAAE,MAAM,WAAW,QAAQ,CAAC;AA5BpC,SAAkBG,IAAAA,IAAU;AA8B1B,SAAK,UAAU;AACf,SAAK,YAAY;EACnB;EAEA,OAAO,WAAW,OAA2C;AAC3D,WAAO,WAAW,UAAU,OAAOF,QAAM;EAC3C;AACF;AC1CA,IAAMD,SAAO;AACb,IAAMC,WAAS,mBAAmBD,MAAI;AACtC,IAAME,WAAS,OAAO,IAAID,QAAM;AAJhC,IAAAE;AAAA,IAAAC;AAMO,IAAM,qCAAN,eAAiDA,OAAA,YACpCD,OAAAD,UADoCE,MAAW;EAQjE,YAAY,SAKT;AACD,UAAM;MACJ,MAAAJ;MACA,SACE,oDACO,QAAQ,QAAQ,WAAW,QAAQ,OAAO,0BAC9C,QAAQ,oBAAoB,yBAAyB,QAAQ,OAAO,MAAM;IACjF,CAAC;AAnBH,SAAkBG,IAAAA,IAAU;AAqB1B,SAAK,WAAW,QAAQ;AACxB,SAAK,UAAU,QAAQ;AACvB,SAAK,uBAAuB,QAAQ;AACpC,SAAK,SAAS,QAAQ;EACxB;EAEA,OAAO,WACL,OAC6C;AAC7C,WAAO,WAAW,UAAU,OAAOF,QAAM;EAC3C;AACF;ACpCA,IAAMD,SAAO;AACb,IAAMC,WAAS,mBAAmBD,MAAI;AACtC,IAAME,WAAS,OAAO,IAAID,QAAM;AALhC,IAAAE;AAAA,IAAAC;AAOO,IAAM,sBAAN,MAAM,8BAA4BA,OAAA,YACrBD,OAAAD,UADqBE,MAAW;EAKlD,YAAY,EAAE,OAAO,MAAM,GAAuC;AAChE,UAAM;MACJ,MAAAJ;MACA,SACE,kCACU,KAAK,UAAU,KAAK,CAAC;iBACb,gBAAgB,KAAK,CAAC;MAC1C;IACF,CAAC;AAZH,SAAkBG,IAAAA,IAAU;AAc1B,SAAK,QAAQ;EACf;EAEA,OAAO,WAAW,OAA8C;AAC9D,WAAO,WAAW,UAAU,OAAOF,QAAM;EAC3C;;;;;;;;;;;EAYA,OAAO,KAAK;IACV;IACA;EACF,GAGwB;AACtB,WAAO,qBAAoB,WAAW,KAAK,KAAK,MAAM,UAAU,QAC5D,QACA,IAAI,qBAAoB,EAAE,OAAO,MAAM,CAAC;EAC9C;AACF;AChDA,IAAMD,SAAO;AACb,IAAMC,WAAS,mBAAmBD,MAAI;AACtC,IAAME,WAAS,OAAO,IAAID,QAAM;AAJhC,IAAAE;AAAA,IAAAC;AAMO,IAAM,gCAAN,eAA4CA,OAAA,YAC/BD,OAAAD,UAD+BE,MAAW;EAK5D,YAAY;IACV;IACA,UAAU,IAAI,aAAa;EAC7B,GAGG;AACD,UAAM,EAAE,MAAAJ,QAAM,QAAQ,CAAC;AAXzB,SAAkBG,IAAAA,IAAU;AAY1B,SAAK,gBAAgB;EACvB;EAEA,OAAO,WAAW,OAAwD;AACxE,WAAO,WAAW,UAAU,OAAOF,QAAM;EAC3C;AACF;;;AEVO,SAAS,eACd,MACqC;AACrC,SAAO,KAAK,SAAS;AACvB;;;ACKO,SAAS,gCACd,SACA,SACiB;AACjB,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;AAiBO,SAAS,6BACd,MACA,SACiB;AACjB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,QAAQ,KAAK,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;;;AC5CO,SAAS,0BACd,sBACA,OACA,SACQ;AACR,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,WAAO,wBAAwB;AAAA,EACjC;AAEA,QAAM,sBACJ;AAEF,QAAM,cAAc,MAAM,IAAI,CAAC,SAAS;AACtC,UAAM,SAAS,cAAc,IAAI;AACjC,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,aAAa,KAAK,eAAe;AAAA,MACjC,YAAY,UAAU,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,IACzD;AAAA,EACF,CAAC;AAED,QAAM,YAAY,KAAK,UAAU,aAAa,MAAM,CAAC;AAErD,QAAM,kBAAkB;AAAA;AAAA;AAAA,EAGxB,SAAS;AAAA;AAAA;AAAA,EAGT,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBnB,MAAI,sBAAsB,KAAK,GAAG;AAChC,WAAO,GAAG,qBAAqB,KAAK,CAAC;AAAA;AAAA,EAAO,eAAe;AAAA,EAC7D;AAEA,SAAO;AACT;AASA,SAAS,cACP,MACyB;AACzB,MAAI,gBAAgB,MAAM;AACxB,WAAO,KAAK;AAAA,EACd;AAEA,SAAO,KAAK;AACd;;;AC7EA,SAAS,mBAAmB,QAA6C;AACvE,QAAM,UAAmC;AAAA,IACvC,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO,UAAU;AAAA,IACzB,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B;AAEA,MAAI,OAAO,YAAY;AACrB,YAAQ,KAAK,OAAO;AAAA,EACtB;AAEA,SAAO;AACT;AAkBO,SAAS,kBAAkB,SAA+B;AAC/D,MAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,QAAQ;AAAA,IAAI,CAAC,WAC5B,KAAK,UAAU,mBAAmB,MAAM,CAAC;AAAA,EAC3C;AAEA,SAAO;AAAA,EACP,SAAS,KAAK,IAAI,CAAC;AAAA;AAErB;;;ACrCA,IAAM,kBAAiD;AAAA,EACrD,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,wBAAwB;AAC1B;AAEA,SAAS,qBAA6B;AACpC,SAAO,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACrE;AAEA,SAAS,WAAW,SAAgD;AAClE,QAAM,WAAqB,CAAC;AAG5B,WAAS,KAAK,qCAAqC;AAEnD,MAAI,QAAQ,gBAAgB;AAC1B,aAAS,KAAK,6CAA6C;AAAA,EAC7D;AAEA,MAAI,QAAQ,oBAAoB;AAC9B,aAAS,KAAK,2BAA2B;AAAA,EAC3C;AAEA,SAAO,IAAI,OAAO,SAAS,KAAK,GAAG,GAAG,IAAI;AAC5C;AAiBO,SAAS,uBACd,UACA,UAAyC,iBACzB;AAChB,QAAM,gBAAgB,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AACvD,QAAM,QAAQ,WAAW,aAAa;AAEtC,QAAM,UAAU,MAAM,KAAK,SAAS,SAAS,KAAK,CAAC;AACnD,QAAM,YAAY;AAElB,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,WAAW,CAAC,GAAG,aAAa,SAAS;AAAA,EAChD;AAEA,QAAM,YAA8B,CAAC;AACrC,MAAI,cAAc;AAElB,aAAW,SAAS,SAAS;AAC3B,UAAM,YAAY,MAAM,CAAC;AACzB,kBAAc,YAAY,QAAQ,WAAW,EAAE;AAE/C,QAAI;AAEF,UAAI,cAAc,sBAAsB,MAAM,CAAC,EAAE,WAAW,GAAG,GAAG;AAChE,cAAM,cAAc,uBAAuB,KAAK,MAAM,CAAC,CAAC;AACxD,YAAI,aAAa;AACf,gBAAM,CAAC,EAAE,UAAU,UAAU,IAAI;AACjC,gBAAM,OAAgC,CAAC;AAEvC,cAAI,cAAc,WAAW,KAAK,GAAG;AACnC,kBAAM,WAAW,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC1D,uBAAW,QAAQ,UAAU;AAC3B,oBAAM,aAAa,KAAK,QAAQ,GAAG;AACnC,kBAAI,aAAa,GAAG;AAClB,sBAAM,MAAM,KAAK,UAAU,GAAG,UAAU,EAAE,KAAK;AAC/C,oBAAI,QAAQ,KAAK,UAAU,aAAa,CAAC,EAAE,KAAK;AAChD,oBACG,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAC5C;AACA,0BAAQ,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC;AAAA,gBAC7C;AACA,qBAAK,GAAG,IAAI;AAAA,cACd;AAAA,YACF;AAAA,UACF;AAEA,oBAAU,KAAK;AAAA,YACb,MAAM;AAAA,YACN,YAAY,mBAAmB;AAAA,YAC/B,UAAU;AAAA,YACV;AAAA,UACF,CAAC;AACD;AAAA,QACF;AAAA,MACF;AAGA,YAAM,eAAe,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK;AAC7C,YAAM,UAAU,aAAa,KAAK;AAElC,UAAI,CAAC,QAAS;AAGd,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,OAAO;AACjC,cAAM,aAAa,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAE3D,mBAAW,QAAQ,YAAY;AAC7B,cAAI,CAAC,KAAK,KAAM;AAEhB,cAAI,OACF,KAAK,cACJ,cAAc,yBAAyB,KAAK,aAAa,SAC1D,CAAC;AAGH,cAAI,OAAO,SAAS,UAAU;AAC5B,gBAAI;AACF,qBAAO,KAAK,MAAM,IAAI;AAAA,YACxB,QAAQ;AAAA,YAER;AAAA,UACF;AAEA,oBAAU,KAAK;AAAA,YACb,MAAM;AAAA,YACN,YAAY,KAAK,MAAM,mBAAmB;AAAA,YAC1C,UAAU,KAAK;AAAA,YACf;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,QAAQ;AAEN,cAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AAE9D,mBAAW,QAAQ,OAAO;AACxB,cAAI;AACF,kBAAM,OAAO,KAAK,MAAM,KAAK,KAAK,CAAC;AACnC,gBAAI,CAAC,KAAK,KAAM;AAEhB,gBAAI,OACF,KAAK,cACJ,cAAc,yBAAyB,KAAK,aAAa,SAC1D,CAAC;AAEH,gBAAI,OAAO,SAAS,UAAU;AAC5B,kBAAI;AACF,uBAAO,KAAK,MAAM,IAAI;AAAA,cACxB,QAAQ;AAAA,cAER;AAAA,YACF;AAEA,sBAAU,KAAK;AAAA,cACb,MAAM;AAAA,cACN,YAAY,KAAK,MAAM,mBAAmB;AAAA,cAC1C,UAAU,KAAK;AAAA,cACf;AAAA,YACF,CAAC;AAAA,UACH,QAAQ;AAEN;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,KAAK,mCAAmC,KAAK;AACrD;AAAA,IACF;AAAA,EACF;AAEA,gBAAc,YAAY,QAAQ,WAAW,IAAI;AAEjD,SAAO,EAAE,WAAW,aAAa,YAAY,KAAK,EAAE;AACtD;;;ACzIO,IAAM,yBAAyC;AAAA,EACpD,EAAE,OAAO,gBAAgB,KAAK,OAAO,kBAAkB,iBAAiB;AAAA,EACxE,EAAE,OAAO,gBAAgB,KAAK,OAAO,kBAAkB,iBAAiB;AAC1E;AAKO,IAAM,0BAA0C;AAAA,EACrD,GAAG;AAAA,EACH;AAAA,IACE,OAAO;AAAA,IACP,KAAK;AAAA,IACL,kBAAkB;AAAA,EACpB;AACF;AAKO,IAAM,wBAAN,MAA4B;AAAA,EAWjC,YAAY,UAAwC,CAAC,GAAG;AARxD,SAAiB,mBAAmB;AAEpC,SAAQ,SAAS;AAEjB,SAAQ,UAAU;AAClB,SAAQ,mBAAmB;AAC3B;AAAA,SAAQ,sBAA2C;AAGjD,SAAK,gBAAgB,QAAQ,YAAY;AACzC,SAAK,oBAAoB,QAAQ,qBAAqB;AACtD,SAAK,cAAc,KAAK,cAAc,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,EAC1D;AAAA,EAEA,SAAS,OAAqB;AAC5B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,YAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAoB;AAClB,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAoC;AAClC,UAAM;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR;AAAA,IACF,IAAI,KAAK,eAAe,KAAK,MAAM;AAGnC,QAAI,aAAa,IAAI;AAEnB,YAAM,UAAU,KAAK,qBAAqB,KAAK,QAAQ,KAAK,WAAW;AACvE,YAAM,iBAAiB,KAAK,OAAO,SAAS;AAE5C,YAAMI,cACJ,iBAAiB,IAAI,KAAK,OAAO,MAAM,GAAG,cAAc,IAAI;AAC9D,YAAM,YAAY,UAAU,IAAI,KAAK,OAAO,MAAM,CAAC,OAAO,IAAI;AAG9D,WAAK,SAAS;AAEd,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAAA;AAAA,QACA,eAAe;AAAA,QACf,eAAe;AAAA,MACjB;AAAA,IACF;AAEA,UAAM,aAAa,KAAK,OAAO,MAAM,GAAG,QAAQ;AAChD,SAAK,SAAS,KAAK,OAAO,MAAM,QAAQ;AAGxC,UAAM,eAAe,eAAe,UAAU;AAC9C,UAAM,WAAW,SAAS,OAAO;AACjC,UAAM,aAAa,KAAK,OAAO,QAAQ,UAAU,YAAY;AAG7D,QAAI,eAAe,IAAI;AAErB,aAAO;AAAA,QACL,OAAO;AAAA,QACP;AAAA,QACA,eAAe;AAAA,QACf,eAAe;AAAA,MACjB;AAAA,IACF;AAGA,UAAM,SAAS,aAAa,SAAS;AACrC,UAAM,QAAQ,KAAK,OAAO,MAAM,GAAG,MAAM;AACzC,UAAM,gBAAgB,KAAK,OAAO,MAAM,MAAM;AAG9C,SAAK,SAAS;AAEd,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,eAAe,MAIrB;AACA,QAAI,YAAY;AAChB,QAAI,gBAA+B;AACnC,QAAI,iBAAsC;AAE1C,eAAW,WAAW,KAAK,eAAe;AACxC,YAAM,MAAM,KAAK,QAAQ,QAAQ,KAAK;AACtC,UAAI,QAAQ,OAAO,cAAc,MAAM,MAAM,YAAY;AACvD,oBAAY;AACZ,wBAAgB,QAAQ;AACxB,yBAAiB;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,KAAK,mBAAmB;AAC1B,WAAK,iBAAiB,YAAY;AAClC,YAAM,cAAc,KAAK,iBAAiB,KAAK,IAAI;AACnD,UAAI,gBAAgB,cAAc,MAAM,YAAY,QAAQ,YAAY;AACtE,oBAAY,YAAY;AACxB,wBAAgB,YAAY,CAAC;AAC7B,yBAAiB;AAAA,UACf,OAAO,YAAY,CAAC;AAAA,UACpB,KAAK;AAAA,UACL,kBAAkB,YAAY,CAAC;AAAA,UAC/B,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,OAAO,WAAW,QAAQ,eAAe,SAAS,eAAe;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,qBAAqB,MAAc,UAA4B;AACrE,QAAI,UAAU;AAEd,eAAW,UAAU,UAAU;AAC7B,YAAM,YAAY,KAAK,IAAI,KAAK,QAAQ,OAAO,SAAS,CAAC;AAEzD,eAAS,OAAO,WAAW,OAAO,GAAG,QAAQ,GAAG;AAE9C,YAAI,OAAO,WAAW,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG;AACxC,oBAAU,KAAK,IAAI,SAAS,IAAI;AAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAsB;AACpB,WAAO,KAAK,OAAO,SAAS;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAwB;AACtB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAA6C;AAC3C,QAAI,CAAC,KAAK,SAAS;AAEjB,YAAM;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR;AAAA,MACF,IAAI,KAAK,eAAe,KAAK,MAAM;AAEnC,UAAI,aAAa,IAAI;AAEnB,cAAM,UAAU,KAAK;AAAA,UACnB,KAAK;AAAA,UACL,KAAK;AAAA,QACP;AACA,cAAM,iBAAiB,KAAK,OAAO,SAAS;AAC5C,cAAM,cACJ,iBAAiB,IAAI,KAAK,OAAO,MAAM,GAAG,cAAc,IAAI;AAC9D,aAAK,SAAS,KAAK,OAAO,MAAM,cAAc;AAE9C,eAAO;AAAA,UACL,SAAS;AAAA,UACT;AAAA,UACA,eAAe;AAAA,UACf,gBAAgB;AAAA,QAClB;AAAA,MACF;AAGA,YAAM,aAAa,KAAK,OAAO,MAAM,GAAG,QAAQ;AAChD,YAAM,mBAAmB,eAAe,UAAU;AAGlD,WAAK,SAAS,KAAK,OAAO,MAAM,WAAW,gBAAgB;AAE3D,UACE,WACA,QAAQ,MAAM,WAAW,KAAK,KAC9B,KAAK,OAAO,WAAW,IAAI,GAC3B;AACA,aAAK,SAAS,KAAK,OAAO,MAAM,CAAC;AAAA,MACnC;AAEA,WAAK,UAAU;AACf,WAAK,mBAAmB;AACxB,WAAK,sBAAsB;AAE3B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,aAAa;AAAA;AAAA,QACb,eAAe;AAAA,QACf,gBAAgB;AAAA,MAClB;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,qBAAqB,OAAO;AAClD,UAAM,aAAa,KAAK,OAAO,QAAQ,QAAQ;AAE/C,QAAI,eAAe,IAAI;AAErB,YAAM,UAAU,KAAK,qBAAqB,KAAK,QAAQ,CAAC,QAAQ,CAAC;AACjE,YAAM,oBAAoB,KAAK,OAAO,SAAS;AAE/C,UAAI,oBAAoB,GAAG;AACzB,cAAM,cAAc,KAAK,OAAO,MAAM,GAAG,iBAAiB;AAC1D,aAAK,oBAAoB;AACzB,aAAK,SAAS,KAAK,OAAO,MAAM,iBAAiB;AAEjD,eAAO;AAAA,UACL,SAAS;AAAA,UACT;AAAA,UACA,eAAe;AAAA,UACf,gBAAgB;AAAA,QAClB;AAAA,MACF;AAGA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,aAAa;AAAA,QACb,eAAe;AAAA,QACf,gBAAgB;AAAA,MAClB;AAAA,IACF;AAGA,UAAM,eAAe,KAAK,OAAO,MAAM,GAAG,UAAU;AACpD,SAAK,oBAAoB;AAGzB,UAAM,mBACJ,KAAK,qBAAqB,oBAAoB;AAChD,UAAM,gBAAgB,GAAG,gBAAgB,GAAG,KAAK,gBAAgB,GAAG,QAAQ;AAG5E,UAAM,iBAAiB,KAAK,OAAO,MAAM,aAAa,SAAS,MAAM;AAGrE,SAAK,UAAU;AACf,SAAK,mBAAmB;AACxB,SAAK,sBAAsB;AAC3B,SAAK,SAAS;AAEd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa;AAAA;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,sBAA4B;AAC1B,SAAK,UAAU;AACf,SAAK,mBAAmB;AACxB,SAAK,sBAAsB;AAAA,EAC7B;AACF;;;ACpXO,SAAS,gBAAgB,SAAgC;AAC9D,QAAM,YAAY,QAAQ,MAAM,6BAA6B;AAC7D,MAAI,WAAW;AACb,WAAO,UAAU,CAAC;AAAA,EACpB;AACA,SAAO;AACT;AAaA,IAAM,wBAAwB;AAC9B,IAAM,2BAA2B;AAE1B,SAAS,6BAAmD;AACjE,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF;AAKO,SAAS,sBACd,SACA,OACQ;AACR,MAAI,MAAM,UAAU;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,oBAAoB,MAAM;AAClC,0BAAsB,YAAY,MAAM;AACxC,UAAM,QAAQ,sBAAsB,KAAK,OAAO;AAChD,0BAAsB,YAAY;AAElC,QAAI,CAAC,SAAS,MAAM,UAAU,QAAW;AACvC,YAAM,aAAa,KAAK,IAAI,GAAG,QAAQ,SAAS,wBAAwB;AACxE,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,MAAM,QAAQ,MAAM,CAAC,EAAE;AAC/C,UAAM,aAAa,MAAM;AACzB,UAAM,aAAa,MAAM;AAAA,EAC3B;AAEA,MAAI,MAAM,cAAc,QAAQ,QAAQ;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACZ,WAAS,IAAI,MAAM,YAAY,IAAI,QAAQ,QAAQ,KAAK;AACtD,UAAM,OAAO,QAAQ,CAAC;AACtB,aAAS;AAET,QAAI,CAAC,MAAM,SAAS;AAClB,UAAI,CAAC,KAAK,KAAK,IAAI,GAAG;AACpB,cAAM,UAAU;AAChB,YAAI,SAAS,OAAO,SAAS,KAAK;AAChC,gBAAM,QAAQ;AAAA,QAChB;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,MAAM,SAAS;AACjB,YAAM,UAAU;AAChB;AAAA,IACF;AAEA,QAAI,SAAS,MAAM;AACjB,YAAM,UAAU;AAChB;AAAA,IACF;AAEA,QAAI,SAAS,KAAK;AAChB,YAAM,WAAW,CAAC,MAAM;AACxB;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,UAAU;AACnB,UAAI,SAAS,OAAO,SAAS,KAAK;AAChC,cAAM,SAAS;AAAA,MACjB,WAAW,SAAS,OAAO,SAAS,KAAK;AACvC,YAAI,MAAM,QAAQ,GAAG;AACnB,gBAAM,SAAS;AACf,cAAI,MAAM,UAAU,GAAG;AACrB,kBAAM,aAAa,IAAI;AACvB,kBAAM,WAAW;AACjB,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,QAAQ;AAC3B,SAAO;AACT;;;ACpGO,SAASC,sBAA6B;AAC3C,SAAO,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACrE;AAWA,eAAsB,sBACpB,QACA,eACA,YACA,SAC+B;AAC/B,QAAM,gBAAgB,IAAI,sBAAsB;AAEhD,MAAI,oBAAmC;AACvC,MAAI,wBAAwB;AAC5B,MAAI,0BAA0B;AAC9B,MAAI,uBAAuB,2BAA2B;AACtD,MAAI,cAAc;AAElB,MAAI,mBAAmB;AACvB,MAAI,YAA8B,CAAC;AACnC,MAAI,eAAe;AAEnB,QAAM,kBAAkB,MAAM;AAC5B,wBAAoB;AACpB,4BAAwB;AACxB,8BAA0B;AAC1B,2BAAuB,2BAA2B;AAClD,kBAAc;AAAA,EAChB;AAEA,mBAAiB,SAAS,QAAQ;AAChC,QAAI,kBAAkB;AAEpB;AAAA,IACF;AAEA,kBAAc,SAAS,KAAK;AAE5B,WAAO,cAAc,WAAW,GAAG;AACjC,YAAM,iBAAiB;AACvB,YAAM,SAAS,cAAc,qBAAqB;AAClD,oBAAc,OAAO;AAErB,UAAI,eAAe;AAEnB,UAAI,CAAC,kBAAkB,OAAO,SAAS;AACrC,YAAI,OAAO,aAAa;AACtB,wBAAc,OAAO,WAAW;AAChC,yBAAe;AAAA,QACjB;AAEA,4BAAoBA,oBAAmB;AACvC,gCAAwB;AACxB,kCAA0B;AAC1B,+BAAuB,2BAA2B;AAClD,sBAAc;AAEd;AAAA,MACF;AAEA,UAAI,OAAO,eAAe;AACxB,uBAAe;AACf,YAAI,OAAO,aAAa;AACtB,qCAA2B,OAAO;AAAA,QACpC;AAEA,YAAI,yBAAyB,mBAAmB;AAC9C,gBAAM,QAAQ;AAAA,YACZ;AAAA,YACA;AAAA,UACF;AACA,cAAI,MAAM,SAAS,GAAG;AACpB,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN,IAAI;AAAA,cACJ;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,SAAS,uBAAuB,OAAO,aAAa;AAC1D,cAAM,oBAAoB,OAAO,UAAU,MAAM,GAAG,CAAC;AAErD,YAAI,kBAAkB,WAAW,GAAG;AAClC,wBAAc,OAAO,aAAa;AAClC,cAAI,OAAO,gBAAgB;AACzB,0BAAc,OAAO,cAAc;AAAA,UACrC;AACA,0BAAgB;AAChB;AAAA,QACF;AAEA,YAAI,mBAAmB;AACrB,4BAAkB,CAAC,EAAE,aAAa;AAAA,QACpC;AAEA,mBAAW,CAAC,OAAO,IAAI,KAAK,kBAAkB,QAAQ,GAAG;AACvD,gBAAM,aACJ,UAAU,KAAK,oBACX,oBACA,KAAK;AACX,gBAAM,WAAW,KAAK;AACtB,gBAAM,WAAW,KAAK,UAAU,KAAK,QAAQ,CAAC,CAAC;AAE/C,cAAI,eAAe,mBAAmB;AACpC,gBAAI,CAAC,uBAAuB;AAC1B,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ;AAAA,cACF,CAAC;AACD,sCAAwB;AAAA,YAC1B;AAEA,kBAAM,QAAQ;AAAA,cACZ;AAAA,cACA;AAAA,YACF;AACA,gBAAI,MAAM,SAAS,GAAG;AACpB,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF,OAAO;AACL,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN,IAAI;AAAA,cACJ;AAAA,YACF,CAAC;AACD,gBAAI,SAAS,SAAS,GAAG;AACvB,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,OAAO;AAAA,cACT,CAAC;AAAA,YACH;AAAA,UACF;AAEA,qBAAW,QAAQ,EAAE,MAAM,kBAAkB,IAAI,WAAW,CAAC;AAC7D,qBAAW,QAAQ;AAAA,YACjB,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA,OAAO;AAAA,YACP,kBAAkB;AAAA,UACpB,CAAC;AAAA,QACH;AAEA,uBAAe,OAAO,kBAAkB;AACxC,oBAAY;AACZ,2BAAmB;AACnB,wBAAgB;AAChB;AAAA,MACF;AAEA,UAAI,aAAa;AACf,YAAI,OAAO,aAAa;AACtB,qCAA2B,OAAO;AAClC,yBAAe;AAEf,gBAAM,WAAW,gBAAgB,uBAAuB;AACxD,cAAI,YAAY,CAAC,yBAAyB,mBAAmB;AAC3D,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN,IAAI;AAAA,cACJ;AAAA,YACF,CAAC;AACD,oCAAwB;AAAA,UAC1B;AAEA,cAAI,yBAAyB,mBAAmB;AAC9C,kBAAM,QAAQ;AAAA,cACZ;AAAA,cACA;AAAA,YACF;AACA,gBAAI,MAAM,SAAS,GAAG;AACpB,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAEA;AAAA,MACF;AAEA,UAAI,CAAC,eAAe,OAAO,aAAa;AACtC,sBAAc,OAAO,WAAW;AAChC,uBAAe;AAAA,MACjB;AAEA,UAAI,CAAC,cAAc;AACjB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,oBAAoB,SAAS,qBAAqB;AACpD;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,oBAAoB,cAAc,WAAW,GAAG;AACnD,kBAAc,cAAc,UAAU,CAAC;AACvC,kBAAc,YAAY;AAAA,EAC5B;AAEA,SAAO,EAAE,kBAAkB,WAAW,aAAa;AACrD;;;AClOA,SAAS,wBAAwB,QAG/B;AACA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,OAAO,OAAO,OAAO,SAAS,MAAM;AAAA,IAC/C,KAAK;AACH,aAAO,EAAE,OAAO,OAAO,OAAO,SAAS,MAAM;AAAA,IAC/C,KAAK;AACH,aAAO,EAAE,OAAO,OAAO,OAAO,SAAS,KAAK;AAAA,IAC9C,KAAK;AACH,aAAO,EAAE,OAAO,OAAO,OAAO,SAAS,KAAK;AAAA,IAC9C,KAAK;AACH,aAAO,EAAE,OAAO,OAAO,OAAO,SAAS,MAAM;AAAA,IAC/C,KAAK;AACH,aAAO,EAAE,OAAO,OAAO,QAAQ,SAAS,KAAK;AAAA,IAC/C,SAAS;AACP,YAAM,kBAAyB;AAC/B,aAAO,EAAE,OAAO,iBAAiB,SAAS,MAAM;AAAA,IAClD;AAAA,EACF;AACF;AAKA,SAAS,aAAa,MAAiD;AACrE,QAAM,EAAE,OAAO,QAAQ,IAAI,wBAAwB,KAAK,MAAM;AAC9D,SAAO;AAAA,IACL,YAAY,KAAK;AAAA,IACjB,UAAU,KAAK;AAAA,IACf,QAAQ;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,YAAgC;AAC1D,QAAM,SAAS,MAAM;AAAA,IAAK;AAAA,IAAY,CAAC,SACrC,OAAO,aAAa,IAAI;AAAA,EAC1B,EAAE,KAAK,EAAE;AACT,SAAO,KAAK,MAAM;AACpB;AAEA,SAAS,iBACP,MAQA,WACQ;AACR,MAAI,gBAAgB,KAAK;AACvB,WAAO,KAAK,SAAS;AAAA,EACvB;AAEA,MAAI,OAAO,SAAS,UAAU;AAE5B,WAAO,QAAQ,SAAS,WAAW,IAAI;AAAA,EACzC;AAEA,MAAI,gBAAgB,YAAY;AAC9B,WAAO,QAAQ,SAAS,WAAW,mBAAmB,IAAI,CAAC;AAAA,EAC7D;AAEA,MAAI,gBAAgB,aAAa;AAC/B,WAAO,QAAQ,SAAS,WAAW;AAAA,MACjC,IAAI,WAAW,IAAI;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,WAAW,eAAe,gBAAgB,QAAQ;AAC3D,WAAO,QAAQ,SAAS,WAAW,KAAK,SAAS,QAAQ,CAAC;AAAA,EAC5D;AAEA,QAAM,IAAI,8BAA8B;AAAA,IACtC,eAAe,mBAAmB,OAAO,IAAI;AAAA,EAC/C,CAAC;AACH;AAEO,SAAS,wBACd,QACqC;AACrC,QAAM,WAAgD,CAAC;AAEvD,aAAW,WAAW,QAAQ;AAC5B,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,QAAQ;AAAA,QACnB,CAAC;AACD;AAAA,MAEF,KAAK;AACH,cAAM,iBAAiB,QAAQ,QAAQ;AAAA,UACrC,CAAC,SAAS,KAAK,SAAS;AAAA,QAC1B;AAEA,YAAI,CAAC,gBAAgB;AACnB,gBAAM,cAAwB,CAAC;AAC/B,qBAAW,QAAQ,QAAQ,SAAS;AAClC,gBAAI,KAAK,SAAS,QAAQ;AACxB,0BAAY,KAAK,KAAK,IAAI;AAAA,YAC5B;AAAA,UACF;AACA,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS,YAAY,KAAK,IAAI;AAAA,UAChC,CAAC;AACD;AAAA,QACF;AAEA,cAAM,UAA8C,CAAC;AACrD,mBAAW,QAAQ,QAAQ,SAAS;AAClC,cAAI,KAAK,SAAS,QAAQ;AACxB,oBAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,CAAC;AAAA,UAChD,WAAW,KAAK,SAAS,QAAQ;AAC/B,gBAAI,CAAC,KAAK,WAAW,WAAW,QAAQ,GAAG;AACzC,oBAAM,IAAI,8BAA8B;AAAA,gBACtC,eAAe,+BAA+B,KAAK,SAAS;AAAA,cAC9D,CAAC;AAAA,YACH;AACA,oBAAQ,KAAK;AAAA,cACX,MAAM;AAAA,cACN,WAAW;AAAA,gBACT,KAAK,iBAAiB,KAAK,MAAM,KAAK,SAAS;AAAA,cACjD;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AACA,iBAAS,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AACvC;AAAA,MAEF,KAAK;AACH,YAAI,mBAAmB;AACvB,cAAM,qBAGD,CAAC;AAEN,mBAAW,QAAQ,QAAQ,SAAS;AAClC,cAAI,KAAK,SAAS,QAAQ;AACxB,gCAAoB,KAAK;AAAA,UAC3B,WAAW,KAAK,SAAS,aAAa;AAGpC,+BAAmB,KAAK;AAAA,cACtB,YAAY,KAAK;AAAA,cACjB,UAAU,KAAK;AAAA,YACjB,CAAC;AAAA,UACH;AAAA,QACF;AAIA,YAAI,kBAAkB;AACpB,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AACA;AAAA,MAEF,KAAK;AAIH,cAAM,cAA4B,QAAQ,QACvC,OAAO,CAAC,SAAS,KAAK,SAAS,aAAa,EAC5C,IAAI,YAAY;AAGnB,cAAM,mBAAmB,kBAAkB,WAAW;AACtD,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AACD;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;;;ACvLA,qBASO;;;ACfA,SAAS,oBAAoB,UAGlC;AACA,QAAM,iBAAiB,SAAS,OAAO,CAAC,QAAQ,IAAI,SAAS,QAAQ;AACrE,QAAM,oBAAoB,SAAS,OAAO,CAAC,QAAQ,IAAI,SAAS,QAAQ;AAExE,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO,EAAE,cAAc,QAAW,SAAS;AAAA,EAC7C;AAGA,QAAM,eAAe,eAClB,IAAI,CAAC,QAAQ,IAAI,OAAO,EACxB,OAAO,CAAC,YAA+B,OAAO,YAAY,QAAQ,EAClE,KAAK,MAAM;AAEd,SAAO;AAAA,IACL,cAAc,gBAAgB;AAAA,IAC9B,UAAU;AAAA,EACZ;AACF;AAWO,SAAS,8BACd,UACA,cAC8B;AAC9B,MAAI,CAAC,aAAa,KAAK,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB,SAAS,UAAU,CAAC,QAAQ,IAAI,SAAS,QAAQ;AAE5E,MAAI,uBAAuB,IAAI;AAC7B,UAAM,cAAc,CAAC,GAAG,QAAQ;AAChC,UAAM,wBAAwB,SAAS,kBAAkB;AACzD,UAAM,kBACJ,OAAO,sBAAsB,YAAY,WACrC,sBAAsB,UACtB;AAEN,gBAAY,kBAAkB,IAAI;AAAA,MAChC,GAAG;AAAA,MACH,SAAS,gBAAgB,kBAAkB;AAAA;AAAA,EAAO,eAAe,KAAK;AAAA,IACxE;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,GAAG;AAAA,EACL;AACF;;;ACpEO,SAAS,WAAoB;AAClC,MAAI,OAAO,cAAc,YAAa,QAAO;AAC7C,SAAO,iEAAiE;AAAA,IACtE,UAAU;AAAA,EACZ;AACF;AAEO,SAAS,cAAuB;AACrC,MAAI;AACF,WAAO,CAAC,CAAC,YAAY,WAAW;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,2BAAoC;AAClD,SAAO,YAAY;AACrB;;;AFoDO,IAAM,sBAAN,MAAqD;AAAA,EAU1D,YAAY,SAAwB,UAA0B,CAAC,GAAG;AATlE,SAAS,uBAAuB;AAEhC,SAAS,WAAW;AAIpB,SAAQ,gBAAgB;AAYxB,SAAS,gBAA0C;AAAA;AAAA,IAEnD;AAVE,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,MACZ,UAAU,KAAK;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAI,qBAA8B;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,UACZ,SACA,gBAC6B;AAC7B,UAAM,eAAe,MAAM,KAAK,aAAa;AAC7C,QAAI,iBAAiB,eAAe;AAClC,YAAM,IAAI,iBAAiB;AAAA,QACzB,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,UAAU,KAAK,cAAe,QAAO,KAAK;AAGnD,QAAI,KAAK,uBAAuB;AAC9B,YAAM,KAAK;AACX,UAAI,KAAK,OAAQ,QAAO,KAAK;AAAA,IAC/B;AAEA,SAAK,wBAAwB,KAAK;AAAA,MAChC;AAAA,MACA;AAAA,IACF;AACA,UAAM,KAAK;AAEX,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,iBAAiB;AAAA,QACzB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,kBACZ,SACA,gBACe;AACf,QAAI;AAEF,YAAM,eAAe;AAAA,QACnB,GAAG,KAAK,OAAO,QAAQ;AAAA,QACvB,GAAG;AAAA,QACH,sBACE,kBAAkB,KAAK,OAAO,QAAQ;AAAA,MAC1C;AAEA,UAAI,KAAK,OAAO,QAAQ,QAAQ;AAC9B,aAAK,SAAS,UAAM;AAAA,UAClB,KAAK,OAAO,QAAQ;AAAA,UACpB,KAAK;AAAA,UACL;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK,SAAS,IAAI,yBAAU,YAAY;AAExC,cAAM,KAAK,OAAO,OAAO,KAAK,OAAO;AAAA,MACvC;AAEA,WAAK,gBAAgB;AAAA,IACvB,SAAS,OAAO;AAEd,WAAK,SAAS;AACd,WAAK,gBAAgB;AACrB,WAAK,wBAAwB;AAE7B,YAAM,IAAI,iBAAiB;AAAA,QACzB,SAAS,uCAAuC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAC1G,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,QAAQ;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAiD;AAC/C,UAAM,WAA8B,CAAC;AAErC,UAAM,iBAAmC,SAAS,CAAC,GAChD,OAAO,cAAc,EACrB,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,IACnB,EAAE;AAEJ,UAAM,oBAAoB,SAAS,CAAC,GAAG;AAAA,MACrC,CAAC,SAA8C,CAAC,eAAe,IAAI;AAAA,IACrE;AAEA,eAAW,QAAQ,kBAAkB;AACnC,eAAS;AAAA,QACP;AAAA,UACE;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,MAAM;AAChB,eAAS;AAAA,QACP;AAAA,UACE;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,iBAAiB,MAAM;AACzB,eAAS;AAAA,QACP;AAAA,UACE;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,mBAAmB,MAAM;AAC3B,eAAS;AAAA,QACP;AAAA,UACE;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,oBAAoB,MAAM;AAC5B,eAAS;AAAA,QACP;AAAA,UACE;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,cAAc,MAAM;AACtB,eAAS;AAAA,QACP;AAAA,UACE;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAW,wBAAwB,MAAM;AAG/C,UAAM,iBAAoD;AAAA,MACxD;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,OAAO;AAAA,MACP;AAAA,IACF;AAEA,UAAM,gBAAgB,kBAAkB,KAAK,QAAQ;AACrD,UAAM,YAAY,eAAe;AAGjC,QAAI,WAAW;AAEb,qBAAe,aAAa;AAAA,QAC1B,iBAAiB,UAAU;AAAA,QAC3B,0BAA0B,UAAU;AAAA,MAGtC;AAAA,IACF;AAGA,QAAI,gBAAgB,SAAS,QAAQ;AACnC,qBAAe,kBAAkB;AAAA,QAC/B,MAAM;AAAA,QACN,GAAI,eAAe,UAAU;AAAA,UAC3B,QAAQ,KAAK,UAAU,eAAe,MAAM;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,WACX,SACwC;AACxC,UAAM,YAAY,KAAK,QAAQ,OAAO;AACtC,UAAM,EAAE,UAAU,UAAU,gBAAgB,cAAc,IAAI;AAG9D,UAAM;AAAA,MACJ,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,IAAI,oBAAoB,QAAQ;AAEhC,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,QACE,wBAAwB;AAAA,MAC1B;AAAA,IACF;AAGA,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,KAAK,UAAU;AAEpC,UAAM,eAAe,YAAY;AAC/B,YAAM,OAAO,kBAAkB;AAAA,IACjC;AAEA,QAAI,QAAQ,aAAa;AACvB,cAAQ,YAAY,iBAAiB,SAAS,YAAY;AAAA,IAC5D;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,KAAK,YAAY,OAAO;AAAA,QACpD,GAAG;AAAA,QACH,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,GAAI,QAAQ,eACV,CAAC,KAAK,OAAO,QAAQ,UAAU,EAAE,QAAQ,QAAQ,YAAY;AAAA,MACjE,CAAC;AAED,YAAM,SAAS,SAAS,QAAQ,CAAC;AACjC,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,yCAAyC;AAAA,MAC3D;AAEA,YAAM,cAAc,OAAO,QAAQ,WAAW;AAG9C,YAAM,EAAE,WAAW,YAAY,IAAI,uBAAuB,WAAW;AAErE,UAAI,UAAU,SAAS,GAAG;AACxB,cAAM,kBAAkB,UAAU,MAAM,GAAG,CAAC;AAE5C,cAAM,QAAkC,CAAC;AAEzC,YAAI,aAAa;AACf,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAEA,mBAAW,QAAQ,iBAAiB;AAClC,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,YAAY,KAAK;AAAA,YACjB,UAAU,KAAK;AAAA,YACf,OAAO,KAAK,UAAU,KAAK,QAAQ,CAAC,CAAC;AAAA,UACvC,CAAmC;AAAA,QACrC;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc,EAAE,SAAS,cAAc,KAAK,aAAa;AAAA,UACzD,OAAO;AAAA,YACL,aAAa;AAAA,cACX,OAAO,SAAS,OAAO;AAAA,cACvB,SAAS;AAAA,cACT,WAAW;AAAA,cACX,YAAY;AAAA,YACd;AAAA,YACA,cAAc;AAAA,cACZ,OAAO,SAAS,OAAO;AAAA,cACvB,MAAM;AAAA,cACN,WAAW;AAAA,YACb;AAAA,UACF;AAAA,UACA,SAAS,EAAE,MAAM,EAAE,GAAG,gBAAgB,UAAU,eAAe,EAAE;AAAA,UACjE;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAoC;AAAA,QACxC;AAAA,UACE,MAAM;AAAA,UACN,MAAM,eAAe;AAAA,QACvB;AAAA,MACF;AAEA,UAAI,eAA4C;AAAA,QAC9C,SAAS;AAAA,QACT,KAAK,OAAO;AAAA,MACd;AACA,UAAI,OAAO,kBAAkB,SAAS;AACpC,uBAAe,EAAE,SAAS,SAAS,KAAK,OAAO,cAAc;AAAA,MAC/D;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,OAAO;AAAA,UACL,aAAa;AAAA,YACX,OAAO,SAAS,OAAO;AAAA,YACvB,SAAS;AAAA,YACT,WAAW;AAAA,YACX,YAAY;AAAA,UACd;AAAA,UACA,cAAc;AAAA,YACZ,OAAO,SAAS,OAAO;AAAA,YACvB,MAAM;AAAA,YACN,WAAW;AAAA,UACb;AAAA,UACA,KAAK;AAAA,YACH,OAAO,SAAS,OAAO;AAAA,UACzB;AAAA,QACF;AAAA,QACA,SAAS,EAAE,MAAM,EAAE,GAAG,gBAAgB,UAAU,eAAe,EAAE;AAAA,QACjE;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,6BACE,iBAAiB,QAAQ,MAAM,UAAU,eAC3C;AAAA,MACF;AAAA,IACF,UAAE;AACA,UAAI,QAAQ,aAAa;AACvB,gBAAQ,YAAY,oBAAoB,SAAS,YAAY;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,eAAsC;AACjD,QAAI,KAAK,eAAe;AACtB,aAAO;AAAA,IACT;AAIA,QAAI,KAAK,OAAO,QAAQ,UAAU,SAAS,GAAG;AAC5C,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,YAAY;AAC9B,WAAO,YAAY,iBAAiB;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAa,0BACX,oBAC8B;AAC9B,UAAM,kBAAkB,qBACpB,CAAC,WAA+B;AAC9B,yBAAmB,OAAO,QAAQ;AAAA,IACpC,IACA;AACJ,UAAM,KAAK,UAAU,QAAW,eAAe;AAC/C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,SACX,SACsC;AACtC,UAAM,YAAY,KAAK,QAAQ,OAAO;AACtC,UAAM,EAAE,UAAU,UAAU,gBAAgB,cAAc,IAAI;AAG9D,UAAM;AAAA,MACJ,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,IAAI,oBAAoB,QAAQ;AAEhC,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,QACE,wBAAwB;AAAA,MAC1B;AAAA,IACF;AAGA,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,YAAY,KAAK,OAAO,QAAQ,UAAU;AAEhD,UAAM,eAAe,YAAY;AAC/B,YAAM,OAAO,kBAAkB;AAAA,IACjC;AAEA,QAAI,QAAQ,aAAa;AACvB,cAAQ,YAAY,iBAAiB,SAAS,YAAY;AAAA,IAC5D;AAEA,UAAM,SAAS;AAEf,UAAM,SAAS,IAAI,eAA0C;AAAA,MAC3D,MAAM,MAAM,YAAY;AACtB,mBAAW,QAAQ;AAAA,UACjB,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAED,YAAI,cAAc;AAClB,YAAI,WAAW;AAEf,cAAM,kBAAkB,MAAM;AAC5B,cAAI,CAAC,aAAa;AAChB,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN,IAAI;AAAA,YACN,CAAC;AACD,0BAAc;AAAA,UAChB;AAAA,QACF;AAEA,cAAM,gBAAgB,CAAC,UAAkB;AACvC,cAAI,CAAC,MAAO;AACZ,0BAAgB;AAChB,qBAAW,QAAQ;AAAA,YACjB,MAAM;AAAA,YACN,IAAI;AAAA,YACJ;AAAA,UACF,CAAC;AAAA,QACH;AAEA,cAAM,sBAAsB,MAAM;AAChC,cAAI,CAAC,YAAa;AAClB,qBAAW,QAAQ;AAAA,YACjB,MAAM;AAAA,YACN,IAAI;AAAA,UACN,CAAC;AACD,wBAAc;AAAA,QAChB;AAEA,cAAM,eAAe,CACnB,cACA,UAKG;AACH,cAAI,SAAU;AACd,qBAAW;AACX,8BAAoB;AACpB,qBAAW,QAAQ;AAAA,YACjB,MAAM;AAAA,YACN;AAAA,YACA,OAAO;AAAA,cACL,aAAa;AAAA,gBACX,OAAO,OAAO;AAAA,gBACd,SAAS;AAAA,gBACT,WAAW;AAAA,gBACX,YAAY;AAAA,cACd;AAAA,cACA,cAAc;AAAA,gBACZ,OAAO,OAAO;AAAA,gBACd,MAAM;AAAA,gBACN,WAAW;AAAA,cACb;AAAA,cACA,KAAK;AAAA,gBACH,OAAO,OAAO;AAAA,cAChB;AAAA,YACF;AAAA,UACF,CAAC;AACD,qBAAW,MAAM;AAAA,QACnB;AAEA,YAAI;AACF,gBAAM,mBAAmD;AAAA,YACvD,GAAG;AAAA,YACH,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,gBAAgB,EAAE,eAAe,KAAK;AAAA,YACtC,GAAI,QAAQ,eACV,CAAC,aAAa,EAAE,QAAQ,QAAQ,YAAY;AAAA,UAChD;AAEA,gBAAM,WACJ,MAAM,OAAO,KAAK,YAAY,OAAO,gBAAgB;AAEvD,cAAI;AAOJ,cAAI,UAAU;AAEd,gBAAM,UAAU,mBAAmB;AACjC,6BAAiB,SAAS,UAAU;AAClC,oBAAM,SAAS,MAAM,QAAQ,CAAC;AAC9B,kBAAI,CAAC,OAAQ;AACb,kBAAI,OAAO,MAAM,QAAS,OAAM,OAAO,MAAM;AAC7C,kBAAI,MAAM,MAAO,aAAY,MAAM;AACnC,kBAAI,OAAO,kBAAkB,QAAS,WAAU;AAAA,YAClD;AAAA,UACF,GAAG;AAEH,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,cAAI,OAAO,cAAc;AACvB,0BAAc,OAAO,YAAY;AAAA,UACnC;AAEA,gBAAM,eAA4C,UAC9C,EAAE,SAAS,SAAS,KAAK,QAAQ,IACjC,OAAO,mBACL,EAAE,SAAS,cAAc,KAAK,aAAa,IAC3C,EAAE,SAAS,QAAQ,KAAK,OAAO;AAErC,uBAAa,cAAc,SAAS;AAAA,QACtC,SAAS,OAAO;AAEd,qBAAW,MAAM,KAAK;AAAA,QACxB,UAAE;AACA,cAAI,QAAQ,aAAa;AACvB,oBAAQ,YAAY,oBAAoB,SAAS,YAAY;AAAA,UAC/D;AACA,cAAI,CAAC,UAAU;AACb,uBAAW,MAAM;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,SAAS,EAAE,MAAM,EAAE,GAAG,gBAAgB,UAAU,eAAe,EAAE;AAAA,IACnE;AAAA,EACF;AACF;;;AGprBA,IAAAC,kBAOO;AAuCA,IAAM,uBAAN,MAAuD;AAAA,EAY5D,YACE,SACA,UAAmC,CAAC,GACpC;AAdF,SAAS,uBAAuB;AAChC,SAAS,WAAW;AAGpB,SAAS,wBAAwB;AAIjC,SAAQ,gBAAgB;AAOtB,SAAK,UAAU;AACf,SAAK,uBAAuB,QAAQ,wBAAwB;AAC5D,SAAK,SAAS;AAAA,MACZ,UAAU,KAAK;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,qBAA8B;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,UACZ,SACA,gBAC6B;AAC7B,UAAM,eAAe,MAAM,KAAK,aAAa;AAC7C,QAAI,iBAAiB,eAAe;AAClC,YAAM,IAAI,iBAAiB;AAAA,QACzB,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,UAAU,KAAK,cAAe,QAAO,KAAK;AAEnD,QAAI,KAAK,uBAAuB;AAC9B,YAAM,KAAK;AACX,UAAI,KAAK,OAAQ,QAAO,KAAK;AAAA,IAC/B;AAEA,SAAK,wBAAwB,KAAK;AAAA,MAChC;AAAA,MACA;AAAA,IACF;AACA,UAAM,KAAK;AAEX,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,iBAAiB;AAAA,QACzB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,kBACZ,SACA,gBACe;AACf,QAAI;AACF,YAAM,eAAe;AAAA,QACnB,GAAG,KAAK,OAAO,QAAQ;AAAA,QACvB,GAAG;AAAA,QACH,sBACE,kBAAkB,KAAK,OAAO,QAAQ;AAAA,MAC1C;AAEA,UAAI,KAAK,OAAO,QAAQ,QAAQ;AAC9B,aAAK,SAAS,UAAM;AAAA,UAClB,KAAK,OAAO,QAAQ;AAAA,UACpB,KAAK;AAAA,UACL;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK,SAAS,IAAI,0BAAU,YAAY;AACxC,cAAM,KAAK,OAAO,OAAO,KAAK,OAAO;AAAA,MACvC;AAEA,WAAK,gBAAgB;AAAA,IACvB,SAAS,OAAO;AACd,WAAK,SAAS;AACd,WAAK,gBAAgB;AACrB,WAAK,wBAAwB;AAE7B,YAAM,IAAI,iBAAiB;AAAA,QACzB,SAAS,iDAAiD,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACpH,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,eAAsC;AACjD,QAAI,KAAK,eAAe;AACtB,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,OAAO,QAAQ,UAAU,SAAS,GAAG;AAC5C,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,YAAY;AAC9B,WAAO,YAAY,iBAAiB;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAa,0BACX,gBAC6B;AAC7B,WAAO,KAAK,UAAU,QAAW,cAAc;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,QACX,SACiC;AACjC,UAAM,EAAE,QAAQ,YAAY,IAAI;AAEhC,QAAI,OAAO,SAAS,KAAK,sBAAsB;AAC7C,YAAM,IAAI,mCAAmC;AAAA,QAC3C,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,sBAAsB,KAAK;AAAA,QAC3B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,aAAa,SAAS;AACxB,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AAEA,UAAM,SAAS,MAAM,KAAK,UAAU;AAEpC,UAAM,eAAe,MAAM;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,QAAI,aAAa;AACf,kBAAY,iBAAiB,SAAS,YAAY;AAAA,IACpD;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,WAAW,OAAO;AAAA,QAC9C,OAAO;AAAA,QACP,OAAO,KAAK;AAAA,QACZ,GAAI,eACF,CAAC,KAAK,OAAO,QAAQ,UAAU,EAAE,QAAQ,YAAY;AAAA,MACzD,CAAC;AAED,YAAM,mBAAmB,SAAS,KAC/B,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,IAAI,CAAC,MAAM,EAAE,SAAS;AAEzB,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,OAAO;AAAA,UACL,QAAQ,SAAS,MAAM;AAAA,QACzB;AAAA,QACA,kBAAkB;AAAA,UAChB,QAAQ;AAAA,YACN,OAAO,SAAS;AAAA,YAChB,cAAc,SAAS,MAAM;AAAA,YAC7B,aAAa,SAAS,MAAM;AAAA,YAC5B,wBAAwB,SAAS,MAAM,OAAO;AAAA,UAChD;AAAA,QACF;AAAA,QACA,UAAU,CAAC;AAAA,MACb;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACtF;AAAA,IACF,UAAE;AACA,UAAI,aAAa;AACf,oBAAY,oBAAoB,SAAS,YAAY;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AACF;;;A7BpPA,IAAAC,kBAA0C;;;A8BmCnC,SAAS,eAA+B;AAC7C,QAAM,sBAAsB,CAC1B,SACA,aACG;AACH,WAAO,IAAI,oBAAoB,SAAS,QAAQ;AAAA,EAClD;AAEA,QAAM,uBAAuB,CAC3B,SACA,aACG;AACH,WAAO,IAAI,qBAAqB,SAAS,QAAQ;AAAA,EACnD;AAEA,QAAM,WAAW,SACf,SACA,UACA;AACA,QAAI,YAAY;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO,oBAAoB,SAAS,QAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuB;AAChC,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAChB,WAAS,YAAY;AACrB,WAAS,iBAAiB;AAE1B,WAAS,aAAa,CAAC,YAAoB;AACzC,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,aAAa,CAAC;AAAA,EACjE;AAEA,WAAS,cAAc,CAAC,YAAoB;AAC1C,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,cAAc,CAAC;AAAA,EAClE;AAEA,WAAS,qBAAqB,CAAC,YAAoB;AACjD,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,qBAAqB,CAAC;AAAA,EACzE;AAEA,SAAO;AACT;AAgBO,IAAM,SAAS,aAAa;","names":["name","marker","symbol","_a","_b","prefixText","generateToolCallId","import_web_llm","import_web_llm"]}