{"version":3,"sources":["../../node_modules/@ai-sdk/provider/src/errors/ai-sdk-error.ts","../../node_modules/@ai-sdk/provider/src/errors/load-setting-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/unsupported-functionality-error.ts","../../node_modules/@browser-ai/shared/src/utils/tool-utils.ts","../../node_modules/@browser-ai/shared/src/utils/warnings.ts","../../node_modules/@browser-ai/shared/src/tool-calling/build-json-system-prompt.ts","../../node_modules/@browser-ai/shared/src/tool-calling/format-tool-results.ts","../../node_modules/@browser-ai/shared/src/tool-calling/parse-json-function-calls.ts","../../node_modules/@browser-ai/shared/src/streaming/tool-call-detector.ts","../../node_modules/@browser-ai/shared/src/streaming/tool-call-stream-utils.ts","../../node_modules/@browser-ai/shared/src/streaming/stream-processor.ts","../../node_modules/@browser-ai/web-llm/src/utils/convert-to-webllm-messages.tsx","../../node_modules/@browser-ai/web-llm/src/utils/prompt-utils.ts","../../node_modules/@browser-ai/web-llm/src/utils/browser.ts","../../node_modules/@browser-ai/web-llm/src/chat/web-llm-language-model.ts","../../node_modules/@browser-ai/web-llm/src/embedding/web-llm-embedding-model.ts","../../node_modules/@browser-ai/web-llm/src/web-llm-provider.ts"],"names":["name","marker","symbol","_a","_b","prefixText","generateToolCallId","CreateWebWorkerMLCEngine","MLCEngine"],"mappings":"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","file":"dist-ZNAPELAW.cjs","sourcesContent":["/**\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_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_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';\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","/**\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 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  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 {\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"]}