@ai-sdk-tool/parser 2.1.2 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/protocols/dummy-protocol.ts","../src/protocols/json-mix-protocol.ts","../src/utils/dynamic-tool-schema.ts","../src/utils/get-potential-start-index.ts","../src/utils/regex.ts","../src/utils/relaxed-json.ts","../src/utils/coercion.ts","../src/utils/debug.ts","../src/utils/on-error.ts","../src/utils/protocol.ts","../src/utils/tools.ts","../src/utils/type-guards.ts","../src/protocols/morph-xml-protocol.ts","../src/generate-handler.ts","../src/stream-handler.ts","../src/transform-handler.ts","../src/tool-call-middleware.ts","../src/index.ts"],"sourcesContent":["import { generateId } from \"@ai-sdk/provider-utils\";\n\nimport { ToolCallProtocol } from \"./tool-call-protocol\";\n\nexport const dummyProtocol = (): ToolCallProtocol => ({\n formatTools: () => \"\",\n formatToolCall: () => \"\",\n formatToolResponse: () => \"\",\n parseGeneratedText: ({ text }) => [{ type: \"text\", text }],\n createStreamParser: () => {\n let currentTextId: string | null = null;\n let hasEmittedText = false;\n\n return new TransformStream({\n transform(chunk, controller) {\n if (chunk.type === \"text-delta\") {\n if (chunk.delta) {\n if (!currentTextId) {\n currentTextId = generateId();\n controller.enqueue({ type: \"text-start\", id: currentTextId });\n }\n controller.enqueue({ ...chunk, id: currentTextId });\n hasEmittedText = true;\n }\n } else {\n if (currentTextId && hasEmittedText) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n }\n currentTextId = null;\n hasEmittedText = false;\n controller.enqueue(chunk);\n }\n },\n flush(controller) {\n if (currentTextId && hasEmittedText) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n }\n },\n });\n },\n});\n","import type {\n LanguageModelV2Content,\n LanguageModelV2ToolCall,\n LanguageModelV2ToolResultPart,\n} from \"@ai-sdk/provider\";\nimport { generateId } from \"@ai-sdk/provider-utils\";\n\nimport { escapeRegExp, getPotentialStartIndex, RJSON } from \"@/utils\";\n\nimport { ToolCallProtocol } from \"./tool-call-protocol\";\n\ntype JsonMixOptions = {\n toolCallStart?: string;\n toolCallEnd?: string;\n toolResponseStart?: string;\n toolResponseEnd?: string;\n};\n\nexport const jsonMixProtocol = ({\n toolCallStart = \"<tool_call>\",\n toolCallEnd = \"</tool_call>\",\n toolResponseStart = \"<tool_response>\",\n toolResponseEnd = \"</tool_response>\",\n}: JsonMixOptions = {}): ToolCallProtocol => ({\n formatTools({ tools, toolSystemPromptTemplate }) {\n const toolsForPrompt = (tools || [])\n .filter(tool => tool.type === \"function\")\n .map(tool => ({\n name: tool.name,\n description:\n tool.type === \"function\" && typeof tool.description === \"string\"\n ? tool.description\n : undefined,\n parameters: tool.inputSchema,\n }));\n return toolSystemPromptTemplate(JSON.stringify(toolsForPrompt));\n },\n\n formatToolCall(toolCall: LanguageModelV2ToolCall) {\n let args: unknown = {};\n try {\n args = JSON.parse(toolCall.input);\n } catch {\n args = toolCall.input;\n }\n return `${toolCallStart}${JSON.stringify({\n name: toolCall.toolName,\n arguments: args,\n })}${toolCallEnd}`;\n },\n\n formatToolResponse(toolResult: LanguageModelV2ToolResultPart) {\n return `${toolResponseStart}${JSON.stringify({\n toolName: toolResult.toolName,\n result: toolResult.output,\n })}${toolResponseEnd}`;\n },\n\n parseGeneratedText({ text, options }) {\n const startEsc = escapeRegExp(toolCallStart);\n const endEsc = escapeRegExp(toolCallEnd);\n const toolCallRegex = new RegExp(\n `${startEsc}([\\u0000-\\uFFFF]*?)${endEsc}`,\n \"gs\"\n );\n\n const processedElements: LanguageModelV2Content[] = [];\n let currentIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = toolCallRegex.exec(text)) !== null) {\n const startIndex = match.index;\n const toolCallJson = match[1];\n\n if (startIndex > currentIndex) {\n const textSegment = text.substring(currentIndex, startIndex);\n if (textSegment.trim()) {\n processedElements.push({ type: \"text\", text: textSegment });\n }\n }\n\n if (toolCallJson) {\n try {\n const parsedToolCall = RJSON.parse(toolCallJson) as {\n name: string;\n arguments: unknown;\n };\n processedElements.push({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: parsedToolCall.name,\n input: JSON.stringify(parsedToolCall.arguments ?? {}),\n });\n } catch (error) {\n if (options?.onError) {\n options.onError(\n \"Could not process JSON tool call, keeping original text.\",\n { toolCall: match[0], error }\n );\n }\n processedElements.push({ type: \"text\", text: match[0] });\n }\n }\n\n currentIndex = startIndex + match[0].length;\n }\n\n if (currentIndex < text.length) {\n const remainingText = text.substring(currentIndex);\n if (remainingText.trim()) {\n processedElements.push({ type: \"text\", text: remainingText });\n }\n }\n\n return processedElements;\n },\n\n createStreamParser({ tools: _tools, options } = { tools: [] }) {\n let isInsideToolCall = false;\n let buffer = \"\";\n let currentToolCallJson = \"\";\n let currentTextId: string | null = null;\n let hasEmittedTextStart = false;\n\n return new TransformStream({\n transform(chunk, controller) {\n if (chunk.type === \"finish\") {\n if (isInsideToolCall && buffer.length > 0) {\n if (!currentTextId) {\n currentTextId = generateId();\n controller.enqueue({ type: \"text-start\", id: currentTextId });\n hasEmittedTextStart = true;\n }\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId,\n delta: `${toolCallStart}${buffer}`,\n });\n buffer = \"\";\n } else if (!isInsideToolCall && buffer.length > 0) {\n // Flush any remaining buffered text (e.g., partial start tag suffix)\n if (!currentTextId) {\n currentTextId = generateId();\n controller.enqueue({ type: \"text-start\", id: currentTextId });\n hasEmittedTextStart = true;\n }\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId,\n delta: buffer,\n });\n buffer = \"\";\n }\n\n if (currentTextId && hasEmittedTextStart) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n currentTextId = null;\n hasEmittedTextStart = false;\n }\n\n // No pending calls should remain; if there is leftover, emit as text\n if (currentToolCallJson) {\n const errorId = generateId();\n controller.enqueue({ type: \"text-start\", id: errorId });\n controller.enqueue({\n type: \"text-delta\",\n id: errorId,\n delta: `${toolCallStart}${currentToolCallJson}`,\n });\n controller.enqueue({ type: \"text-end\", id: errorId });\n currentToolCallJson = \"\";\n }\n\n controller.enqueue(chunk);\n return;\n }\n\n if (chunk.type !== \"text-delta\") {\n controller.enqueue(chunk);\n return;\n }\n\n buffer += chunk.delta;\n\n const publish = (text: string) => {\n if (isInsideToolCall) {\n if (currentTextId && hasEmittedTextStart) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n currentTextId = null;\n hasEmittedTextStart = false;\n }\n currentToolCallJson += text;\n } else if (text.length > 0) {\n if (!currentTextId) {\n currentTextId = generateId();\n controller.enqueue({ type: \"text-start\", id: currentTextId });\n hasEmittedTextStart = true;\n }\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId,\n delta: text,\n });\n }\n };\n\n let startIndex: number | null | undefined;\n while (\n (startIndex = getPotentialStartIndex(\n buffer,\n isInsideToolCall ? toolCallEnd : toolCallStart\n )) != null\n ) {\n const tag = isInsideToolCall ? toolCallEnd : toolCallStart;\n if (startIndex + tag.length > buffer.length) {\n break;\n }\n\n publish(buffer.slice(0, startIndex));\n buffer = buffer.slice(startIndex + tag.length);\n // Toggle state and finalize/initialize as needed\n if (!isInsideToolCall) {\n // We just consumed a start tag; begin accumulating JSON\n currentToolCallJson = \"\";\n isInsideToolCall = true;\n } else {\n // We just consumed an end tag; parse and emit tool-call\n try {\n const parsedToolCall = RJSON.parse(currentToolCallJson) as {\n name: string;\n arguments: unknown;\n };\n // close any open text block before emitting tool-call\n if (currentTextId && hasEmittedTextStart) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n currentTextId = null;\n hasEmittedTextStart = false;\n }\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: parsedToolCall.name,\n input: JSON.stringify(parsedToolCall.arguments ?? {}),\n });\n } catch {\n const errorId = generateId();\n controller.enqueue({ type: \"text-start\", id: errorId });\n controller.enqueue({\n type: \"text-delta\",\n id: errorId,\n delta: `${toolCallStart}${currentToolCallJson}${toolCallEnd}`,\n });\n controller.enqueue({ type: \"text-end\", id: errorId });\n if (options?.onError) {\n options.onError(\n \"Could not process streaming JSON tool call; emitting original text.\",\n {\n toolCall: `${toolCallStart}${currentToolCallJson}${toolCallEnd}`,\n }\n );\n }\n }\n currentToolCallJson = \"\";\n isInsideToolCall = false;\n }\n }\n\n if (!isInsideToolCall) {\n // Avoid emitting a partial start tag that may be completed in the next chunk.\n // If the buffer ends with a suffix that matches the beginning of the start tag,\n // keep that suffix in the buffer and only emit the safe prefix.\n const potentialIndex = getPotentialStartIndex(buffer, toolCallStart);\n if (\n potentialIndex != null &&\n potentialIndex + toolCallStart.length > buffer.length\n ) {\n // Emit only the safe portion before the potential (incomplete) start tag.\n publish(buffer.slice(0, potentialIndex));\n buffer = buffer.slice(potentialIndex);\n } else {\n publish(buffer);\n buffer = \"\";\n }\n }\n },\n });\n },\n\n extractToolCallSegments({ text }) {\n const startEsc = escapeRegExp(toolCallStart);\n const endEsc = escapeRegExp(toolCallEnd);\n const regex = new RegExp(`${startEsc}([\\u0000-\\uFFFF]*?)${endEsc}`, \"gs\");\n const segments: string[] = [];\n let m: RegExpExecArray | null;\n while ((m = regex.exec(text)) != null) {\n segments.push(m[0]);\n }\n return segments;\n },\n});\n","import {\n JSONSchema7,\n LanguageModelV2FunctionTool,\n LanguageModelV2ProviderDefinedTool,\n} from \"@ai-sdk/provider\";\n\n/**\n * Dynamically generates a JSON Schema using 'if/then/else' to simulate 'oneOf' behavior\n * for tool call validation. This is useful when the environment does not support 'oneOf' directly.\n *\n * The generated schema validates that the incoming data (a tool call)\n * matches exactly one of the provided tools based on its 'name' property,\n * and then applies the corresponding tool's 'parameters' schema to its 'arguments' property.\n *\n * @param tools An array of tool definitions (LanguageModelV2FunctionTool or LanguageModelV2ProviderDefinedTool).\n * Each tool must have a unique 'name' and its 'parameters' must be a valid JSON Schema.\n * @returns A JSONSchema7 object representing the dynamic validation logic.\n * @throws Error if a 'provider-defined' tool is encountered, as they are not supported by this middleware.\n */\nexport function createDynamicIfThenElseSchema(\n tools: (LanguageModelV2FunctionTool | LanguageModelV2ProviderDefinedTool)[]\n): JSONSchema7 {\n // Explicitly specify the return type as JSONSchema7\n let currentSchema: JSONSchema7 = {};\n const toolNames: string[] = [];\n\n for (let i = tools.length - 1; i >= 0; i--) {\n const tool = tools[i];\n\n if (tool.type === \"provider-defined\") {\n throw new Error(\n \"Provider-defined tools are not supported by this middleware. Please use custom tools.\"\n );\n }\n\n toolNames.unshift(tool.name);\n\n // TODO: Support for parallel calls in required or toolname state\n const toolCondition: JSONSchema7 = {\n if: {\n properties: {\n name: {\n const: tool.name,\n },\n },\n required: [\"name\"],\n },\n then: {\n properties: {\n name: {\n const: tool.name,\n },\n arguments: tool.inputSchema,\n },\n required: [\"name\", \"arguments\"],\n },\n };\n\n if (Object.keys(currentSchema).length > 0) {\n toolCondition.else = currentSchema;\n }\n\n currentSchema = toolCondition;\n }\n\n return {\n type: \"object\", // Explicitly specify type as \"object\"\n properties: {\n name: {\n type: \"string\",\n description: \"Name of the tool to call\",\n enum: toolNames,\n },\n arguments: {\n type: \"object\", // By default, arguments is also specified as object type\n description: \"Argument object to be passed to the tool\",\n },\n },\n required: [\"name\", \"arguments\"],\n ...currentSchema,\n };\n}\n","/**\n * Returns the index of the start of the searchedText in the text, or null if it\n * is not found.\n * ref: https://github.com/vercel/ai/blob/452bf12f0be9cb398d4af85a006bca13c8ce36d8/packages/ai/core/util/get-potential-start-index.ts\n */\nexport function getPotentialStartIndex(\n text: string,\n searchedText: string\n): number | null {\n // Return null immediately if searchedText is empty.\n if (searchedText.length === 0) {\n return null;\n }\n\n // Check if the searchedText exists as a direct substring of text.\n const directIndex = text.indexOf(searchedText);\n if (directIndex !== -1) {\n return directIndex;\n }\n\n // Otherwise, look for the largest suffix of \"text\" that matches\n // a prefix of \"searchedText\". We go from the end of text inward.\n for (let i = text.length - 1; i >= 0; i--) {\n const suffix = text.substring(i);\n if (searchedText.startsWith(suffix)) {\n return i;\n }\n }\n\n return null;\n}\n","export function escapeRegExp(literal: string): string {\n return literal.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","/*\n Copyright (c) 2013, Oleg Grenrus\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of the Oleg Grenrus nor the\n names of its contributors may be used to endorse or promote products\n derived from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL OLEG GRENRUS BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/*\n https://github.com/phadej/relaxed-json\n TypeScript porting based on the original code.\n Follows the license of the original code.\n*/\n\n// Custom 'some' function definition (slightly different from ES5, returns the truthy value directly)\n// :: array -> fn -> *\nfunction some<T, R>(\n array: T[],\n f: (item: T, index: number, arr: T[]) => R | undefined | false\n): R | false {\n let acc: R | false = false;\n for (let i = 0; i < array.length; i++) {\n // We assume R is a truthy type if the condition is met, or undefined/false otherwise.\n const result = f(array[i], i, array);\n acc = result === undefined ? false : result;\n if (acc) {\n return acc; // Return the actual truthy value found\n }\n }\n return acc; // Returns false if no truthy value was returned by f\n}\n\n// --- Type Definitions ---\n\n// Type for the specification of a single token type\ntype TokenSpec = {\n re: RegExp;\n // Function to process the regex match and return a RawToken\n f: (match: RegExpExecArray) => RawToken;\n};\n\n// Literal types for possible token types\ntype TokenType =\n | \"atom\" // null, true, false\n | \"number\"\n | \"string\"\n | \"[\"\n | \"]\"\n | \"{\"\n | \"}\"\n | \":\"\n | \",\"\n | \" \" // Whitespace / Comments\n | \"eof\"; // End of file\n\n// Type for a token right after regex matching, before line number is added\n// Value is optional as punctuation/whitespace tokens might not have a semantic value\ntype RawToken = {\n type: TokenType;\n match: string; // The raw matched text\n value?: unknown; // The parsed value (for strings, numbers, atoms)\n};\n\n// Type for a token including line number information\ntype Token = RawToken & {\n line: number;\n};\n\n// Type for parse warnings\ntype ParseWarning = {\n message: string;\n line: number;\n};\n\n// Type for the state object used during parsing\ntype ParseState = {\n pos: number; // Current position in the token array\n warnings: ParseWarning[];\n // Options passed to the parser\n tolerant: boolean;\n duplicate: boolean; // true = allow duplicate keys (use last value), false = reject duplicate keys with error\n reviver?: (key: string, value: unknown) => unknown; // Optional JSON reviver function\n};\n\n/**\n * Options for configuring JSON parsing behavior\n */\ntype ParseOptions = {\n /**\n * Enable relaxed JSON syntax parsing (unquoted keys, single quotes, trailing commas, comments)\n * @default true\n */\n relaxed?: boolean;\n\n /**\n * Collect parsing warnings instead of throwing immediately. Implies tolerant mode.\n * At the end of parsing, if warnings exist, throws with warning details.\n * @default false\n */\n warnings?: boolean;\n\n /**\n * Continue parsing when encountering recoverable errors, collecting warnings.\n * In strict mode (false), throws immediately on first error.\n * @default false\n */\n tolerant?: boolean;\n\n /**\n * Allow duplicate object keys in JSON.\n * - true: Allow duplicates (uses last value, like native JSON.parse)\n * - false: Reject duplicates with error (enforces JSON specification)\n * @default false\n */\n duplicate?: boolean;\n\n /**\n * Optional reviver function to transform parsed values (same as JSON.parse reviver)\n * @param key - The object key or array index\n * @param value - The parsed value\n * @returns The transformed value\n */\n reviver?: (key: string, value: unknown) => unknown;\n};\n\n// Type for options specific to the parseMany function\ntype ParseManyOpts<T> = {\n skip: TokenType[]; // Token types to skip initially\n elementParser: (tokens: Token[], state: ParseState, obj: T) => void; // Function to parse an element/pair\n elementName: string; // Name of the expected element for error messages\n endSymbol: TokenType; // The token type that marks the end of the structure (']' or '}')\n};\n\n// --- Lexer Implementation ---\n\n// Factory function to create a lexer\n// :: array tokenSpec -> fn\nfunction makeLexer(tokenSpecs: TokenSpec[]): (contents: string) => Token[] {\n // The returned lexer function\n // :: string -> array token\n return function (contents: string): Token[] {\n const tokens: Token[] = [];\n let line = 1; // Start at line 1\n\n // Helper function to find the next token in the input string\n // :: -> { raw: string, matched: RawToken } | undefined\n function findToken(): { raw: string; matched: RawToken } | undefined {\n // Use the custom 'some' function to iterate through token specifications\n const result = some(tokenSpecs, tokenSpec => {\n const m = tokenSpec.re.exec(contents); // Try to match the regex at the current position\n if (m) {\n const raw = m[0]; // The matched raw string\n contents = contents.slice(raw.length); // Consume the matched part from the input\n return {\n raw: raw,\n matched: tokenSpec.f(m), // Process the match using the spec's function\n };\n } else {\n return undefined; // No match for this spec\n }\n });\n return result === false ? undefined : result;\n }\n\n // Main lexing loop\n while (contents !== \"\") {\n const matched = findToken(); // Find the next token\n\n if (!matched) {\n // If no token spec matches, it's a syntax error\n const err = new SyntaxError(\n `Unexpected character: ${contents[0]}; input: ${contents.substr(\n 0,\n 100\n )}`\n );\n // Attach line number to the error object (standard Error doesn't have it by default)\n (err as { line?: number }).line = line;\n throw err;\n }\n\n // Add line number information to the matched token\n // We need type assertion because 'matched.matched' is initially RawToken\n const tokenWithLine = matched.matched as Token;\n tokenWithLine.line = line;\n\n // Update line number count based on newlines in the matched raw string\n line += matched.raw.replace(/[^\\n]/g, \"\").length;\n\n tokens.push(tokenWithLine); // Add the finalized token to the list\n }\n\n // Add an EOF token (useful for the parser) - Optional, depends on parser needs.\n // The current parser handles end-of-input via state.pos check, so EOF token isn't strictly needed here\n // tokens.push({ type: 'eof', match: '', value: undefined, line: line });\n\n return tokens;\n };\n}\n\n// --- Token Creation Helper Functions ---\n\n// :: tuple string string -> rawToken\nfunction fStringSingle(m: RegExpExecArray): RawToken {\n // Handles strings in single quotes, converting them to standard JSON double-quoted strings\n const content = m[1].replace(\n /([^'\\\\]|\\\\['bnrtf\\\\]|\\\\u[0-9a-fA-F]{4})/g,\n mm => {\n if (mm === '\"') {\n return '\\\\\"'; // Escape double quotes inside\n } else if (mm === \"\\\\'\") {\n return \"'\"; // Unescape escaped single quotes\n } else {\n return mm;\n }\n }\n );\n\n const match = `\"${content}\"`;\n return {\n type: \"string\",\n match: match, // The transformed, double-quoted string representation\n // Use JSON.parse on the transformed string to handle escape sequences correctly\n value: JSON.parse(match),\n };\n}\n\n// :: tuple string -> rawToken\nfunction fStringDouble(m: RegExpExecArray): RawToken {\n // Handles standard JSON double-quoted strings\n return {\n type: \"string\",\n match: m[0], // The raw matched string (including quotes)\n value: JSON.parse(m[0]), // Use JSON.parse to handle escapes and get the value\n };\n}\n\n// :: tuple string -> rawToken\nfunction fIdentifier(m: RegExpExecArray): RawToken {\n // Transforms unquoted identifiers into JSON strings\n const value = m[0];\n const match =\n '\"' +\n value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"') + // Escape backslashes and quotes\n '\"';\n return {\n type: \"string\", // Treat identifiers as strings\n value: value, // The original identifier name\n match: match, // The double-quoted string representation\n };\n}\n\n// :: tuple string -> rawToken\nfunction fComment(m: RegExpExecArray): RawToken {\n // Treats comments as whitespace, preserving only newlines\n const match = m[0].replace(/./g, c => (/\\s/.test(c) ? c : \" \"));\n return {\n type: \" \", // Represent comments as whitespace tokens\n match: match, // String containing original newlines and spaces for other chars\n value: undefined, // Comments don't have a semantic value\n };\n}\n\n// :: tuple string -> rawToken\nfunction fNumber(m: RegExpExecArray): RawToken {\n // Handles numbers (integers, floats, exponents)\n return {\n type: \"number\",\n match: m[0], // The raw matched number string\n value: parseFloat(m[0]), // Convert string to number\n };\n}\n\n// :: tuple (\"null\" | \"true\" | \"false\") -> rawToken\nfunction fKeyword(m: RegExpExecArray): RawToken {\n // Handles JSON keywords: null, true, false\n let value: null | boolean;\n switch (m[0]) {\n case \"null\":\n value = null;\n break;\n case \"true\":\n value = true;\n break;\n case \"false\":\n value = false;\n break;\n default:\n // Should be unreachable due to regex, but satisfies TypeScript exhaustiveness check\n throw new Error(`Unexpected keyword: ${m[0]}`);\n }\n return {\n type: \"atom\", // Use 'atom' type for these literals\n match: m[0], // The raw matched keyword\n value: value, // The corresponding JavaScript value\n };\n}\n\n// --- Token Specification Creation ---\n\n// :: boolean -> array tokenSpec\nfunction makeTokenSpecs(relaxed: boolean): TokenSpec[] {\n // Helper to create a simple token spec function\n // :: string -> fn\n function f(type: TokenType): (m: RegExpExecArray) => RawToken {\n // :: tuple string -> rawToken\n return function (m: RegExpExecArray): RawToken {\n // For simple tokens like punctuation, value is not needed\n return { type: type, match: m[0], value: undefined };\n };\n }\n\n // Base JSON token specifications (strict)\n let tokenSpecs: TokenSpec[] = [\n { re: /^\\s+/, f: f(\" \") }, // Whitespace\n { re: /^\\{/, f: f(\"{\") }, // Object start\n { re: /^\\}/, f: f(\"}\") }, // Object end\n { re: /^\\[/, f: f(\"[\") }, // Array start\n { re: /^\\]/, f: f(\"]\") }, // Array end\n { re: /^,/, f: f(\",\") }, // Comma separator\n { re: /^:/, f: f(\":\") }, // Key-value separator\n { re: /^(?:true|false|null)/, f: fKeyword }, // Keywords\n // Number: optional sign, digits, optional decimal part, optional exponent\n { re: /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/, f: fNumber },\n // String: double-quoted, handles escapes\n { re: /^\"(?:[^\"\\\\]|\\\\[\"bnrtf\\\\/]|\\\\u[0-9a-fA-F]{4})*\"/, f: fStringDouble },\n ];\n\n // Add relaxed syntax rules if requested\n if (relaxed) {\n tokenSpecs = tokenSpecs.concat([\n // Single-quoted strings\n {\n re: /^'((?:[^'\\\\]|\\\\['bnrtf\\\\/]|\\\\u[0-9a-fA-F]{4})*)'/,\n f: fStringSingle,\n },\n // Single-line comments (// ...)\n { re: /^\\/\\/.*?(?:\\r\\n|\\r|\\n)/, f: fComment },\n // Multi-line comments (/* ... */)\n { re: /^\\/\\*[\\s\\S]*?\\*\\//, f: fComment },\n // Unquoted identifiers (treated as strings)\n // Allows letters, numbers, _, -, +, ., *, ?, !, |, &, %, ^, /, #, \\\n { re: /^[$a-zA-Z0-9_\\-+.*?!|&%^/#\\\\]+/, f: fIdentifier },\n // Note: The order matters here. Identifiers are checked after keywords/numbers.\n ]);\n }\n\n return tokenSpecs;\n}\n\n// Create lexer instances\nconst lexer = makeLexer(makeTokenSpecs(true)); // Relaxed syntax lexer\nconst strictLexer = makeLexer(makeTokenSpecs(false)); // Strict JSON lexer\n\n// --- Parser Helper Functions ---\n\n// Find the index of the previous non-whitespace token\n// :: array token -> nat -> nat?\nfunction previousNWSToken(tokens: Token[], index: number): number | undefined {\n for (; index >= 0; index--) {\n if (tokens[index].type !== \" \") {\n return index; // Return index of the non-whitespace token\n }\n }\n return undefined; // Not found\n}\n\n// Removes trailing commas from arrays and objects in a token stream\n// :: array token -> array token\nfunction stripTrailingComma(tokens: Token[]): Token[] {\n const res: Token[] = [];\n\n tokens.forEach((token, index) => {\n // Check if the current token is a closing bracket or brace\n if (index > 0 && (token.type === \"]\" || token.type === \"}\")) {\n // Find the last non-whitespace token *before* this closing token in the result array 'res'\n const prevNWSTokenIndex = previousNWSToken(res, res.length - 1); // Look in `res`, not `tokens`!\n\n // Check if it's a comma\n if (\n prevNWSTokenIndex !== undefined &&\n res[prevNWSTokenIndex].type === \",\"\n ) {\n // Find the token *before* the comma\n const preCommaIndex = previousNWSToken(res, prevNWSTokenIndex - 1);\n\n // Ensure there *was* a token before the comma, and it wasn't an opening bracket/brace\n // This prevents removing the comma in `[,1]` or `{, \"a\":1}` which is invalid anyway\n if (\n preCommaIndex !== undefined &&\n res[preCommaIndex].type !== \"[\" &&\n res[preCommaIndex].type !== \"{\"\n ) {\n // Replace the trailing comma with a whitespace token\n res[prevNWSTokenIndex] = {\n type: \" \",\n match: \" \", // Represent as a single space\n value: undefined, // Whitespace has no value\n line: res[prevNWSTokenIndex].line, // Preserve original line number\n };\n }\n }\n }\n\n res.push(token); // Add the current token (or the original closing bracket/brace)\n });\n\n return res;\n}\n\n/**\n * Transform relaxed JSON syntax to standard JSON string\n *\n * Converts relaxed JSON features (unquoted keys, single quotes, trailing commas, comments)\n * into valid standard JSON syntax that can be parsed by native JSON.parse().\n *\n * @param text - The relaxed JSON string to transform\n * @returns A standard JSON string\n *\n * @example\n * ```typescript\n * transform('{key: \"value\", trailing: \"comma\",}')\n * // Returns: '{\"key\": \"value\", \"trailing\": \"comma\"}'\n *\n * transform(\"{'single': 'quotes'}\")\n * // Returns: '{\"single\": \"quotes\"}'\n * ```\n */\nfunction transform(text: string): string {\n // Tokenize contents using the relaxed lexer\n let tokens = lexer(text);\n\n // Remove trailing commas if present\n tokens = stripTrailingComma(tokens);\n\n // Concatenate the 'match' part of each token back into a single string\n return tokens.reduce((str, token) => {\n return str + token.match;\n }, \"\");\n}\n\n// --- Parsing Core Functions ---\n\n// Get the next token from the stream and advance the position\n// :: array parseToken -> parseState -> *\nfunction popToken(tokens: Token[], state: ParseState): Token {\n const token = tokens[state.pos];\n state.pos += 1;\n\n if (!token) {\n // If we are past the end of the token array, return an EOF token\n const lastLine = tokens.length !== 0 ? tokens[tokens.length - 1].line : 1;\n return { type: \"eof\", match: \"\", value: undefined, line: lastLine };\n }\n\n return token;\n}\n\n// Get a string representation of a token for error messages\n// :: token -> string\nfunction strToken(token: Token): string {\n switch (token.type) {\n case \"atom\":\n case \"string\":\n case \"number\":\n // Show type and the matched text (or value, match is usually better for context)\n return `${token.type} ${token.match}`;\n case \"eof\":\n return \"end-of-file\";\n default:\n // For punctuation, just show the symbol itself in quotes\n return `'${token.type}'`;\n }\n}\n\n// Expects and consumes a colon token, raises error/warning otherwise\n// :: array token -> parseState -> undefined\nfunction skipColon(tokens: Token[], state: ParseState): void {\n const colon = popToken(tokens, state);\n if (colon.type !== \":\") {\n const message = `Unexpected token: ${strToken(colon)}, expected ':'`;\n if (state.tolerant) {\n state.warnings.push({\n message: message,\n line: colon.line,\n });\n // If tolerant, put the unexpected token back by decrementing pos\n // This allows the parser to potentially recover\n state.pos -= 1;\n } else {\n const err = new SyntaxError(message);\n (err as { line?: number }).line = colon.line;\n throw err;\n }\n }\n}\n\n// Skips over any punctuation tokens until a valid data token or EOF is found.\n// Used to recover in tolerant mode or find the start of the next value.\n// :: array token -> parseState -> (array string)? -> token\nfunction skipPunctuation(\n tokens: Token[],\n state: ParseState,\n valid?: TokenType[]\n): Token {\n // Define common punctuation tokens that might appear unexpectedly\n const punctuation: TokenType[] = [\",\", \":\", \"]\", \"}\"];\n let token = popToken(tokens, state);\n\n while (true) {\n // If the token is one of the valid types we're looking for, return it\n if (valid && valid.includes(token.type)) {\n return token;\n } else if (token.type === \"eof\") {\n // If we hit EOF, return it\n return token;\n } else if (punctuation.includes(token.type)) {\n // If it's unexpected punctuation...\n const message = `Unexpected token: ${strToken(\n token\n )}, expected '[', '{', number, string or atom`;\n if (state.tolerant) {\n // In tolerant mode, record a warning and get the next token\n state.warnings.push({\n message: message,\n line: token.line,\n });\n token = popToken(tokens, state); // Continue skipping\n } else {\n // In strict mode, throw an error\n const err = new SyntaxError(message);\n (err as { line?: number }).line = token.line;\n throw err;\n }\n } else {\n // If it's not punctuation, EOF, or a specifically valid token,\n // it must be the start of a value/object/array, so return it.\n return token;\n }\n }\n}\n\n// Helper to raise an error or add a warning based on tolerant mode\n// :: parseState -> token -> string -> undefined\nfunction raiseError(state: ParseState, token: Token, message: string): void {\n if (state.tolerant) {\n state.warnings.push({\n message: message,\n line: token.line,\n });\n } else {\n const err = new SyntaxError(message);\n (err as { line?: number }).line = token.line;\n throw err;\n }\n}\n\n// Helper for common \"Unexpected token X, expected Y\" errors\n// :: parseState -> token -> string -> undefined\nfunction raiseUnexpected(\n state: ParseState,\n token: Token,\n expected: string\n): void {\n raiseError(\n state,\n token,\n `Unexpected token: ${strToken(token)}, expected ${expected}`\n );\n}\n\n// Checks for duplicate keys in objects when duplicate checking is enabled (state.duplicate = false).\n// If a duplicate key is found, raises an error (respecting tolerant mode).\n// This enforces JSON specification compliance for duplicate key handling.\n// :: parseState -> {} -> parseToken -> undefined\nfunction checkDuplicates(\n state: ParseState,\n obj: { [key: string]: unknown },\n token: Token\n): void {\n // We assume token.type is 'string' here based on where it's called in parsePair\n // If other types could be keys, this check needs adjustment.\n const key = String(token.value); // Ensure key is string for lookup\n\n // Only check for duplicates when duplicate checking is enabled\n // state.duplicate = false means \"reject duplicates\", so we check when !state.duplicate\n if (!state.duplicate && Object.prototype.hasOwnProperty.call(obj, key)) {\n raiseError(state, token, `Duplicate key: ${key}`);\n // Note: In tolerant mode, this adds a warning and continues parsing.\n // In strict mode, this throws immediately. Either way, last value wins for the duplicate key.\n }\n}\n\n// Appends a key-value pair to an object, applying the reviver function if present\n// :: parseState -> any -> any -> any -> undefined\nfunction appendPair(\n state: ParseState,\n obj: { [key: string]: unknown },\n key: string,\n value: unknown\n): void {\n // Apply reviver function if it exists\n const finalValue = state.reviver ? state.reviver(key, value) : value;\n // The reviver can return undefined to omit the key/value pair\n if (finalValue !== undefined) {\n obj[key] = finalValue;\n }\n}\n\n// Parses a key-value pair within an object\n// :: array parseToken -> parseState -> map -> undefined\nfunction parsePair(\n tokens: Token[],\n state: ParseState,\n obj: { [key: string]: unknown }\n): void {\n // Skip leading punctuation, expecting a string key (or ':' in tolerant mode)\n let token = skipPunctuation(tokens, state, [\":\", \"string\", \"number\", \"atom\"]); // Allow recovery\n let value: unknown;\n\n // --- Key Parsing ---\n if (token.type !== \"string\") {\n // Handle unexpected token where a string key was expected\n raiseUnexpected(state, token, \"string key\");\n\n // Attempt recovery in tolerant mode\n if (state.tolerant) {\n switch (token.type) {\n case \":\": // If colon found directly, assume missing key, use \"null\"\n token = {\n type: \"string\",\n value: \"null\",\n match: '\"null\"',\n line: token.line,\n };\n state.pos -= 1; // Put the colon back for skipColon\n break;\n case \"number\": // Use number as string key\n case \"atom\": // Use atom value as string key\n token = {\n type: \"string\",\n value: String(token.value),\n match: `\"${token.value}\"`,\n line: token.line,\n };\n break;\n case \"[\": // Assume missing key before an array\n case \"{\": // Assume missing key before an object\n state.pos -= 1; // Put back the bracket/brace\n value = parseAny(tokens, state); // Parse the value directly\n checkDuplicates(state, obj, {\n type: \"string\",\n value: \"null\",\n match: '\"null\"',\n line: token.line,\n }); // Check duplicate for \"null\" key\n appendPair(state, obj, \"null\", value); // Append with \"null\" key\n return; // Finished parsing this \"pair\"\n case \"eof\": // Reached end unexpectedly\n return; // Cannot recover\n default: // Other unexpected token (like comma, closing brace)\n // raiseUnexpected already issued a warning/error. Try to advance.\n // This might lead to cascading errors, but it's tolerant mode.\n return;\n }\n } else {\n // In non-tolerant mode, raiseUnexpected already threw.\n return; // Should be unreachable\n }\n }\n\n // Now we have a string token (potentially recovered)\n checkDuplicates(state, obj, token);\n const key = String(token.value); // Ensure key is string\n\n // --- Colon and Value Parsing ---\n skipColon(tokens, state); // Expect and consume ':'\n value = parseAny(tokens, state); // Parse the value recursively\n\n // --- Appending Pair ---\n appendPair(state, obj, key, value);\n}\n\n// Parses an element within an array\n// :: array parseToken -> parseState -> array -> undefined\nfunction parseElement(\n tokens: Token[],\n state: ParseState,\n arr: unknown[]\n): void {\n const key = arr.length; // Key is the current array index\n // Skip potential leading punctuation (like extra commas in tolerant mode)\n // skipPunctuation used inside parseAny handles this implicitly\n const value = parseAny(tokens, state); // Recursively parse the element value\n // Apply reviver using the index as a string key\n arr[key] = state.reviver ? state.reviver(String(key), value) : value;\n}\n\n// Parses a JSON object structure: '{' key:value, ... '}'\n// :: array parseToken -> parseState -> {}\nfunction parseObject(\n tokens: Token[],\n state: ParseState\n): { [key: string]: unknown } {\n const obj = {};\n // Call parseMany to handle the structure { pair1, pair2, ... }\n return parseMany<{ [key: string]: unknown }>(tokens, state, obj, {\n skip: [\":\", \"}\"], // Initially skip over colon or closing brace (for empty/tolerant cases)\n elementParser: parsePair, // Use parsePair to parse each key-value element\n elementName: \"string key\", // Expected element type for errors\n endSymbol: \"}\", // The closing token for an object\n });\n}\n\n// Parses a JSON array structure: '[' element, ... ']'\n// :: array parseToken -> parseState -> array\nfunction parseArray(tokens: Token[], state: ParseState): unknown[] {\n const arr: unknown[] = [];\n // Call parseMany to handle the structure [ element1, element2, ... ]\n return parseMany<unknown[]>(tokens, state, arr, {\n skip: [\"]\"], // Initially skip over closing bracket (for empty/tolerant cases)\n elementParser: parseElement, // Use parseElement to parse each array item\n elementName: \"json value\", // Expected element type for errors\n endSymbol: \"]\", // The closing token for an array\n });\n}\n\n// Generic function to parse comma-separated elements within enclosing symbols (like objects or arrays)\n// :: t : array | {} => array parseToken -> parseState -> t -> parseManyOpts -> t\nfunction parseMany<T>(\n tokens: Token[],\n state: ParseState,\n result: T,\n opts: ParseManyOpts<T>\n): T {\n // Get the first token, skipping over potential initial punctuation (defined in opts.skip)\n let token = skipPunctuation(tokens, state, opts.skip);\n\n // Handle empty structure or unexpected EOF\n if (token.type === \"eof\") {\n raiseUnexpected(state, token, `'${opts.endSymbol}' or ${opts.elementName}`);\n // Attempt recovery in tolerant mode by assuming structure was closed\n if (state.tolerant) {\n return result;\n } else {\n // Error already thrown by raiseUnexpected\n return result; // Should be unreachable\n }\n }\n\n // Check if it's immediately the end symbol (e.g., empty array/object)\n if (token.type === opts.endSymbol) {\n return result;\n }\n\n // --- Parse First Element ---\n // If it wasn't the end symbol, it should be the start of the first element.\n // Put the token back so the element parser can consume it.\n state.pos -= 1;\n opts.elementParser(tokens, state, result);\n\n // --- Parse Remaining Elements ---\n while (true) {\n // After an element, expect a comma or the end symbol\n token = popToken(tokens, state);\n\n // Validate the token\n if (token.type !== opts.endSymbol && token.type !== \",\") {\n raiseUnexpected(state, token, `',' or '${opts.endSymbol}'`);\n\n // Attempt recovery in tolerant mode\n if (state.tolerant) {\n // If it was EOF, assume the structure was implicitly closed\n if (token.type === \"eof\") {\n return result;\n }\n // Otherwise, assume a comma was missing and put the token back\n // to be parsed as the start of the next element.\n state.pos -= 1;\n // Continue to the element parsing step below (simulates a comma)\n } else {\n // Error already thrown by raiseUnexpected\n return result; // Should be unreachable\n }\n }\n\n // Handle based on token type\n switch (token.type) {\n case opts.endSymbol:\n // End of the structure found\n return result;\n\n case \",\": {\n // Comma found, parse the next element\n // Check for trailing comma before end symbol in tolerant mode\n const nextToken = tokens[state.pos]; // Peek ahead\n if (state.tolerant && nextToken && nextToken.type === opts.endSymbol) {\n // If the next token is the end symbol, treat this as a trailing comma\n raiseError(state, token, `Trailing comma before '${opts.endSymbol}'`);\n // Consume the end symbol and return\n popToken(tokens, state); // Consume the end symbol\n return result;\n }\n // Otherwise, parse the element following the comma\n opts.elementParser(tokens, state, result);\n break;\n }\n // Default case is only reachable in tolerant mode recovery above\n default:\n opts.elementParser(tokens, state, result);\n break;\n }\n }\n}\n\n// Perform final checks after parsing the main value\n// :: array parseToken -> parseState -> any -> undefined\nfunction endChecks(tokens: Token[], state: ParseState, ret: unknown): void {\n // Check if there are unparsed tokens remaining\n if (state.pos < tokens.length) {\n // In tolerant mode, skip trailing whitespace/punctuation before declaring error\n if (state.tolerant) {\n skipPunctuation(tokens, state); // Try skipping junk\n }\n // If still not at the end, raise error/warning\n if (state.pos < tokens.length) {\n raiseError(\n state,\n tokens[state.pos],\n `Unexpected token: ${strToken(tokens[state.pos])}, expected end-of-input`\n );\n }\n }\n\n // If in tolerant mode and warnings were generated, throw a summary error at the end\n if (state.tolerant && state.warnings.length > 0) {\n const message =\n state.warnings.length === 1\n ? state.warnings[0].message // Single warning message\n : `${state.warnings.length} parse warnings`; // Multiple warnings summary\n const err = new SyntaxError(message);\n // Attach details to the error object\n (err as { line?: number; warnings?: ParseWarning[]; obj?: unknown }).line =\n state.warnings[0].line; // Line of the first warning\n (\n err as { line?: number; warnings?: ParseWarning[]; obj?: unknown }\n ).warnings = state.warnings; // Array of all warnings\n (err as { line?: number; warnings?: ParseWarning[]; obj?: unknown }).obj =\n ret; // The partially parsed object (might be useful)\n throw err;\n }\n}\n\n// Main recursive parsing function for any JSON value type\n// :: array parseToken -> parseState -> boolean? -> any\nfunction parseAny(\n tokens: Token[],\n state: ParseState,\n end: boolean = false\n): unknown {\n // Skip any leading punctuation (useful for recovery in tolerant mode)\n const token = skipPunctuation(tokens, state);\n let ret: unknown; // Variable to hold the parsed result\n\n // Check for premature end of file\n if (token.type === \"eof\") {\n // Only raise error if we expected a value (not called recursively within a structure)\n // If 'end' is true, we are at the top level.\n if (end) {\n raiseUnexpected(state, token, \"json value\");\n }\n // If called recursively (e.g., after a comma), returning undefined might be handled\n // by the caller (like parseElement/parsePair). However, hitting EOF here usually\n // means an incomplete structure. Let's raise an error/warning.\n raiseUnexpected(state, token, \"json value\");\n return undefined; // Return undefined in tolerant mode after warning\n }\n\n // Parse based on the token type\n switch (token.type) {\n case \"{\": // Start of an object\n ret = parseObject(tokens, state);\n break;\n case \"[\": // Start of an array\n ret = parseArray(tokens, state);\n break;\n case \"string\": // String literal\n case \"number\": // Number literal\n case \"atom\": // Keyword literal (true, false, null)\n ret = token.value;\n break;\n default:\n // Unexpected token type to start a value\n raiseUnexpected(state, token, \"json value\");\n // Attempt recovery in tolerant mode by returning null\n if (state.tolerant) {\n ret = null;\n } else {\n // Error already thrown\n return undefined; // Should be unreachable\n }\n }\n\n // If this is the top-level call (end === true)\n if (end) {\n // Apply the top-level reviver function (key is empty string)\n ret = state.reviver ? state.reviver(\"\", ret) : ret;\n // Perform final checks for trailing tokens or accumulated warnings\n endChecks(tokens, state, ret);\n }\n\n return ret;\n}\n\n// --- Main Parse Function ---\n\n/**\n * Parse a JSON string with enhanced features beyond standard JSON.parse()\n *\n * Supports both strict JSON and relaxed JSON syntax with configurable error handling\n * and duplicate key validation.\n *\n * @param text - The JSON string to parse\n * @param optsOrReviver - Either a ParseOptions object for configuration, or a reviver function (like JSON.parse)\n *\n * @returns The parsed JavaScript value\n *\n * @throws {SyntaxError} When parsing fails in strict mode, or when warnings are collected in tolerant mode\n *\n * @example\n * ```typescript\n * // Standard JSON parsing\n * parse('{\"key\": \"value\"}')\n *\n * // Relaxed JSON with unquoted keys and trailing commas\n * parse('{key: \"value\", trailing: \"comma\",}', { relaxed: true })\n *\n * // Strict duplicate key validation\n * parse('{\"key\": 1, \"key\": 2}', { duplicate: false }) // throws error\n *\n * // Allow duplicates (uses last value)\n * parse('{\"key\": 1, \"key\": 2}', { duplicate: true }) // returns {key: 2}\n *\n * // Tolerant mode with warning collection\n * parse('malformed json', { tolerant: true, warnings: true })\n * ```\n */\nfunction parse(\n text: string,\n optsOrReviver?: ParseOptions | ((key: string, value: unknown) => unknown)\n): unknown {\n let options: ParseOptions = {};\n\n // Determine if the second argument is options object or reviver function\n if (typeof optsOrReviver === \"function\") {\n options.reviver = optsOrReviver;\n } else if (optsOrReviver !== null && typeof optsOrReviver === \"object\") {\n options = { ...optsOrReviver }; // Shallow copy options\n } else if (optsOrReviver !== undefined) {\n throw new TypeError(\n \"Second argument must be a reviver function or an options object.\"\n );\n }\n\n // Set default options\n // Default to relaxed true ONLY IF no specific mode is set AND warnings/tolerant are not explicitly false.\n // If tolerant=true or warnings=true, imply relaxed=true unless explicitly set to false.\n // If strict JSON is desired, set relaxed: false explicitly.\n if (options.relaxed === undefined) {\n if (options.warnings === true || options.tolerant === true) {\n options.relaxed = true;\n } else if (options.warnings === false && options.tolerant === false) {\n options.relaxed = false; // Strict if tolerance/warnings explicitly off\n } else {\n options.relaxed = true; // Default to relaxed otherwise\n }\n }\n // Warnings implies tolerant\n options.tolerant = options.tolerant || options.warnings || false;\n options.warnings = options.warnings || false;\n // Default duplicate key behavior: false = reject duplicates with error, true = allow (use last value)\n options.duplicate = options.duplicate ?? false;\n\n // --- Parsing Strategy ---\n\n // Strategy 1: Strict JSON, no special handling -> use native JSON.parse for speed\n // Also use if relaxed=false and warnings=false (even if reviver is present)\n if (!options.relaxed && !options.warnings && !options.tolerant) {\n // Note: native JSON.parse doesn't support duplicate key checking.\n // - If duplicate=true (allow duplicates): native JSON.parse can be used safely\n // - If duplicate=false (reject duplicates): must use custom parser for validation\n if (!options.duplicate) {\n // duplicate=false: Need custom parser to check for duplicate keys\n } else {\n // duplicate=true: Safe to use native JSON.parse (allows duplicates, uses last value)\n return JSON.parse(\n text,\n options.reviver as (key: string, value: unknown) => unknown\n );\n }\n }\n\n // Strategy 2: Use custom lexer/parser\n // This is needed for: relaxed syntax, warning collection, tolerance, or strict duplicate checking.\n\n // Lex the input text based on the 'relaxed' option\n const lexerToUse = options.relaxed ? lexer : strictLexer;\n let tokens = lexerToUse(text);\n\n // Pre-processing for relaxed mode: strip trailing commas\n if (options.relaxed) {\n tokens = stripTrailingComma(tokens);\n }\n\n // If warnings or tolerance are enabled, use the full parser logic\n if (options.warnings || options.tolerant) {\n // Filter out whitespace tokens as they are not needed by the parser\n tokens = tokens.filter(token => token.type !== \" \");\n\n // Initialize the parser state\n const state: ParseState = {\n pos: 0,\n reviver: options.reviver,\n tolerant: options.tolerant,\n duplicate: options.duplicate, // true = allow duplicate keys, false = reject duplicates\n warnings: [],\n };\n\n // Start parsing from the top level\n return parseAny(tokens, state, true);\n } else {\n // Strategy 3: Relaxed input, but no warnings/tolerance requested.\n // Transform the relaxed syntax to stricter JSON and use native JSON.parse.\n // This path is also used for strict mode (!relaxed) when duplicate checking is needed (!options.duplicate).\n tokens.reduce((str, token) => {\n return str + token.match;\n }, \"\");\n\n // We might need a custom duplicate check *before* native parse here if options.duplicate is false.\n // However, the simplest way to check duplicates is during the custom parse.\n // Let's refine the logic: if duplicate checking is needed, always use the full custom parser.\n\n // --- Refined Strategy Selection ---\n if (\n !options.relaxed &&\n !options.warnings &&\n !options.tolerant &&\n options.duplicate /* duplicate=true: allow duplicate keys */\n ) {\n // Case 1: Strict, no warnings, no tolerance, allow duplicates => Native fastest\n return JSON.parse(text, options.reviver);\n } else if (\n options.warnings ||\n options.tolerant ||\n !options.duplicate /* duplicate=false: need duplicate key validation */\n ) {\n // Case 2: Warnings OR Tolerance OR Strict Duplicate Check needed => Full custom parser\n tokens = lexerToUse(text);\n if (options.relaxed) {\n tokens = stripTrailingComma(tokens);\n }\n tokens = tokens.filter(token => token.type !== \" \"); // Always filter whitespace for custom parser\n const state: ParseState = {\n pos: 0,\n reviver: options.reviver,\n tolerant: options.tolerant || false, // Ensure boolean\n duplicate: options.duplicate, // true = allow duplicate keys, false = reject duplicates\n warnings: [],\n };\n return parseAny(tokens, state, true);\n } else {\n // Case 3: Relaxed, no warnings, no tolerance, allow duplicates => Lex, transform, native parse\n tokens = lexer(text); // Must be relaxed lexer here\n tokens = stripTrailingComma(tokens);\n const newtext = tokens.reduce((str, token) => str + token.match, \"\");\n return JSON.parse(\n newtext,\n options.reviver as (key: string, value: unknown) => unknown\n );\n }\n }\n}\n\n// --- Stringify Function (Basic Implementation) ---\n// Note: This is a basic, non-configurable stringifier, mainly for potential internal use or testing.\n// It doesn't handle replacer/space arguments like JSON.stringify.\n\n// Helper for stringifying object pairs\n// :: any -> string -> ... -> string\nfunction stringifyPair(obj: { [key: string]: unknown }, key: string): string {\n // Stringify key and value, then join with colon\n // Recursively calls stringify for the value\n return JSON.stringify(key) + \":\" + stringify(obj[key]);\n}\n\n/**\n * Convert JavaScript value to JSON string with sorted object keys\n *\n * Similar to JSON.stringify but with consistent key ordering (sorted alphabetically).\n * Handles undefined values by converting them to null.\n *\n * @param obj - The value to convert to JSON string\n * @returns A JSON string representation\n *\n * @example\n * ```typescript\n * stringify({z: 1, a: 2, m: 3})\n * // Returns: '{\"a\":2,\"m\":3,\"z\":1}' (keys sorted)\n *\n * stringify({key: undefined})\n * // Returns: '{\"key\":null}' (undefined becomes null)\n * ```\n */\nfunction stringify(obj: unknown): string {\n const type = typeof obj;\n\n // Handle primitives directly using JSON.stringify (handles escaping etc.)\n if (\n type === \"string\" ||\n type === \"number\" ||\n type === \"boolean\" ||\n obj === null\n ) {\n return JSON.stringify(obj);\n }\n\n // Handle undefined (represented as null in this basic version, JSON.stringify omits in objects/returns undefined at top level)\n if (type === \"undefined\") {\n return \"null\";\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n // Recursively stringify each element and join with commas\n const elements = obj.map(stringify).join(\",\");\n return \"[\" + elements + \"]\";\n }\n\n // Handle objects\n // Check if it's a non-null object (using constructor check is less robust than typeof + null check)\n if (type === \"object\") {\n // Already checked for null and Array above\n // Get keys, sort them for consistent output (optional, but good practice)\n const keys = Object.keys(obj as object);\n keys.sort();\n // Stringify each key-value pair and join with commas\n const pairs = keys\n .map(key => stringifyPair(obj as { [key: string]: unknown }, key))\n .join(\",\");\n return \"{\" + pairs + \"}\";\n }\n\n // Fallback for unsupported types (like functions, symbols) - represent as null\n return \"null\";\n}\n\nexport { parse, stringify, transform };\nexport type { ParseOptions };\n","import type { LanguageModelV2Content } from \"@ai-sdk/provider\";\n\nexport function unwrapJsonSchema(schema: unknown): unknown {\n if (!schema || typeof schema !== \"object\") return schema;\n const s = schema as Record<string, unknown>;\n if (s.jsonSchema && typeof s.jsonSchema === \"object\") {\n return unwrapJsonSchema(s.jsonSchema);\n }\n return schema;\n}\n\nexport function getSchemaType(schema: unknown): string | undefined {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") return undefined;\n const t: unknown = (unwrapped as Record<string, unknown>).type;\n if (typeof t === \"string\") return t;\n if (Array.isArray(t)) {\n const preferred = [\n \"object\",\n \"array\",\n \"boolean\",\n \"number\",\n \"integer\",\n \"string\",\n ];\n for (const p of preferred) if (t.includes(p)) return p;\n }\n const s = unwrapped as Record<string, unknown>;\n if (s && typeof s === \"object\" && (s.properties || s.additionalProperties)) {\n return \"object\";\n }\n if (\n s &&\n typeof s === \"object\" &&\n (s.items || (s as Record<string, unknown>).prefixItems)\n ) {\n return \"array\";\n }\n return undefined;\n}\n\nexport function coerceBySchema(value: unknown, schema?: unknown): unknown {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n if (typeof value === \"string\") {\n const s = value.trim();\n const lower = s.toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n if (/^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(s)) {\n const num = Number(s);\n if (Number.isFinite(num)) return num;\n }\n\n // Fallback: try parsing JSON-like strings when no schema info\n if (\n (s.startsWith(\"{\") && s.endsWith(\"}\")) ||\n (s.startsWith(\"[\") && s.endsWith(\"]\"))\n ) {\n try {\n const parsed = JSON.parse(s);\n // Recursively apply coercion to the parsed value without schema\n return coerceBySchema(parsed, undefined);\n } catch {\n // If parsing fails, return original value\n }\n }\n }\n\n return value;\n }\n\n const schemaType = getSchemaType(unwrapped);\n\n if (typeof value === \"string\") {\n const s = value.trim();\n if (schemaType === \"object\") {\n try {\n // Better normalization for JSON strings with newlines and indentation\n let normalized = s.replace(/'/g, '\"');\n // Handle empty object cases\n normalized = normalized.replace(/^\\{\\s*\\}$/s, \"{}\");\n\n const obj = JSON.parse(normalized);\n if (obj && typeof obj === \"object\" && !Array.isArray(obj)) {\n const props = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n const propSchema = props ? (props[k] as unknown) : undefined;\n out[k] =\n typeof propSchema === \"boolean\"\n ? v\n : coerceBySchema(v, propSchema);\n }\n return out;\n }\n } catch {\n // fallthrough\n }\n }\n if (schemaType === \"array\") {\n try {\n const normalized = s.replace(/'/g, '\"');\n const arr = JSON.parse(normalized);\n if (Array.isArray(arr)) {\n const u = unwrapped as Record<string, unknown>;\n const prefixItems = Array.isArray(\n (u as Record<string, unknown>).prefixItems\n )\n ? ((u as Record<string, unknown>).prefixItems as unknown[])\n : undefined;\n const itemsSchema = u.items as unknown;\n if (prefixItems && arr.length === prefixItems.length) {\n return arr.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return arr.map(v => coerceBySchema(v, itemsSchema));\n }\n } catch {\n const csv = s.includes(\"\\n\") ? s.split(/\\n+/) : s.split(/,\\s*/);\n const trimmed = csv.map(x => x.trim()).filter(x => x.length > 0);\n const u = unwrapped as Record<string, unknown>;\n const prefixItems = Array.isArray(\n (u as Record<string, unknown>).prefixItems\n )\n ? ((u as Record<string, unknown>).prefixItems as unknown[])\n : undefined;\n const itemsSchema = u.items as unknown;\n if (prefixItems && trimmed.length === prefixItems.length) {\n return trimmed.map((x, i) => coerceBySchema(x, prefixItems[i]));\n }\n return trimmed.map(x => coerceBySchema(x, itemsSchema));\n }\n }\n }\n\n if (\n schemaType === \"object\" &&\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n const out: Record<string, unknown> = {};\n const props = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n const propSchema = props ? (props[k] as unknown) : undefined;\n out[k] =\n typeof propSchema === \"boolean\" ? v : coerceBySchema(v, propSchema);\n }\n return out;\n }\n\n if (schemaType === \"array\") {\n const u = unwrapped as Record<string, unknown>;\n const itemsSchema = u.items as unknown;\n const prefixItems = Array.isArray(\n (u as Record<string, unknown>).prefixItems\n )\n ? ((u as Record<string, unknown>).prefixItems as unknown[])\n : undefined;\n\n if (Array.isArray(value)) {\n if (prefixItems && value.length === prefixItems.length) {\n return value.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return value.map(v => coerceBySchema(v, itemsSchema));\n }\n\n if (value && typeof value === \"object\") {\n const maybe = value as Record<string, unknown>;\n if (Object.prototype.hasOwnProperty.call(maybe, \"item\")) {\n const items = (maybe as Record<string, unknown>).item as unknown;\n const arr = Array.isArray(items) ? items : [items];\n if (prefixItems && arr.length === prefixItems.length) {\n return arr.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return arr.map(v => coerceBySchema(v, itemsSchema));\n }\n\n // Special handling for objects with array-like field names that might represent arrays\n // This commonly happens when models output <multiples><number>3</number><number>5</number></multiples>\n // which gets parsed as { \"number\": [\"3\", \"5\"] }\n const keys = Object.keys(maybe);\n\n // Check for single field that contains an array (common XML pattern)\n if (keys.length === 1) {\n const singleKey = keys[0];\n const singleValue = maybe[singleKey];\n if (Array.isArray(singleValue)) {\n const coercedArray = singleValue.map(v =>\n coerceBySchema(v, itemsSchema)\n );\n return coercedArray;\n }\n }\n\n // Check for numeric keys (traditional tuple handling)\n if (keys.length > 0 && keys.every(k => /^\\d+$/.test(k))) {\n const arr = keys\n .sort((a, b) => Number(a) - Number(b))\n .map(k => (maybe as Record<string, unknown>)[k]);\n if (prefixItems && arr.length === prefixItems.length) {\n return arr.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return arr.map(v => coerceBySchema(v, itemsSchema));\n }\n }\n\n if (\n value == null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n if (prefixItems && prefixItems.length > 0) {\n return [coerceBySchema(value, prefixItems[0])];\n }\n return [coerceBySchema(value, itemsSchema)];\n }\n }\n\n if (typeof value === \"string\") {\n const s = value.trim();\n if (schemaType === \"boolean\") {\n const lower = s.toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n }\n if (schemaType === \"number\" || schemaType === \"integer\") {\n if (/^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(s)) {\n const num = Number(s);\n if (Number.isFinite(num)) return num;\n }\n }\n }\n\n return value;\n}\n\nexport function fixToolCallWithSchema(\n part: LanguageModelV2Content,\n tools: Array<{ name?: string; inputSchema?: unknown }>\n): LanguageModelV2Content {\n if ((part as { type?: string }).type !== \"tool-call\") return part;\n const tc = part as unknown as { toolName: string; input: unknown };\n let args: unknown = {};\n if (typeof tc.input === \"string\") {\n try {\n args = JSON.parse(tc.input);\n } catch {\n return part;\n }\n } else if (tc.input && typeof tc.input === \"object\") {\n args = tc.input;\n }\n const schema = tools.find(t => t.name === tc.toolName)\n ?.inputSchema as unknown;\n const coerced = coerceBySchema(args, schema);\n return {\n ...(part as Record<string, unknown>),\n input: JSON.stringify(coerced ?? {}),\n } as LanguageModelV2Content;\n}\n\n// Wrapper retained for backward compatibility with previous internal helper name\nexport function coerceToolCallInput(\n part: LanguageModelV2Content,\n tools: Array<{ name?: string; inputSchema?: unknown }>\n): LanguageModelV2Content {\n return fixToolCallWithSchema(part, tools);\n}\n","export type DebugLevel = \"off\" | \"stream\" | \"parse\";\n\nfunction normalizeBooleanString(value: string): boolean | undefined {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n return false;\n }\n return undefined;\n}\n\nexport function getDebugLevel(): DebugLevel {\n const envVal =\n (typeof process !== \"undefined\" &&\n process.env &&\n process.env.DEBUG_PARSER_MW) ||\n \"off\";\n const envLower = String(envVal).toLowerCase();\n if (envLower === \"stream\" || envLower === \"parse\" || envLower === \"off\") {\n return envLower as DebugLevel;\n }\n const boolEnv = normalizeBooleanString(envLower);\n if (boolEnv === true) return \"stream\";\n if (envLower === \"2\") return \"parse\";\n return \"off\";\n}\n\nfunction color(code: number) {\n return (text: string) => `\\u001b[${code}m${text}\\u001b[0m`;\n}\n\nconst cGray = color(90);\nconst cYellow = color(33);\nconst cCyan = color(36);\nconst cBgBlue = color(44);\nconst cBgGreen = color(42);\nconst cInverse = color(7);\nconst cUnderline = color(4);\nconst cBold = color(1);\n\nfunction safeStringify(value: unknown): string {\n try {\n return `\\n${typeof value === \"string\" ? value : JSON.stringify(value, null, 2)}`;\n } catch {\n return String(value);\n }\n}\n\nexport function logRawChunk(part: unknown) {\n // Raw provider stream/generate output\n console.log(cGray(\"[debug:mw:raw]\"), cYellow(safeStringify(part)));\n}\n\nexport function logParsedChunk(part: unknown) {\n // Normalized middleware output\n console.log(cGray(\"[debug:mw:out]\"), cCyan(safeStringify(part)));\n}\n\nexport function logParsedSummary({\n toolCalls,\n originalText,\n}: {\n toolCalls: unknown[];\n originalText: string;\n}) {\n if (originalText) {\n const style = (() => {\n const envVal =\n (typeof process !== \"undefined\" &&\n process.env &&\n process.env.DEBUG_PARSER_MW_STYLE) ||\n \"bg\";\n\n const normalized = String(envVal).trim().toLowerCase();\n if (normalized === \"inverse\" || normalized === \"invert\")\n return \"inverse\" as const;\n if (normalized === \"underline\" || normalized === \"ul\")\n return \"underline\" as const;\n if (normalized === \"bold\") return \"bold\" as const;\n if (normalized === \"bg\" || normalized === \"background\")\n return \"bg\" as const;\n const asBool = normalizeBooleanString(normalized);\n if (asBool === true) return \"bg\" as const;\n return \"bg\" as const; // default: background highlight\n })();\n\n const highlight =\n style === \"inverse\"\n ? cInverse\n : style === \"underline\"\n ? cUnderline\n : style === \"bold\"\n ? cBold\n : style === \"bg\"\n ? cBgGreen\n : cYellow;\n\n const rendered =\n style === \"bg\" ||\n style === \"inverse\" ||\n style === \"underline\" ||\n style === \"bold\"\n ? originalText\n .split(/\\r?\\n/)\n .map(line => (line.length ? highlight(line) : line))\n .join(\"\\n\")\n : highlight(originalText);\n\n console.log(cGray(\"[debug:mw:origin]\"), `\\n${rendered}`);\n }\n\n if (toolCalls.length > 0) {\n const styledSummary = safeStringify(toolCalls)\n .split(/\\r?\\n/)\n .map(line => (line.length ? cBgBlue(line) : line))\n .join(\"\\n\");\n console.log(cGray(\"[debug:mw:summary]\"), styledSummary);\n }\n}\n","export type OnErrorFn = (\n message: string,\n metadata?: Record<string, unknown>\n) => void;\n\ntype ProviderOptionsWithOnError = {\n toolCallMiddleware?: {\n onError?: OnErrorFn;\n };\n};\n\nexport function extractOnErrorOption(\n providerOptions?: unknown\n): { onError?: OnErrorFn } | undefined {\n if (providerOptions && typeof providerOptions === \"object\") {\n const onError = (providerOptions as ProviderOptionsWithOnError)\n .toolCallMiddleware?.onError;\n return onError ? { onError } : undefined;\n }\n return undefined;\n}\n","import { ToolCallProtocol } from \"@/protocols/tool-call-protocol\";\n\nexport function isProtocolFactory(\n protocol: ToolCallProtocol | (() => ToolCallProtocol)\n): protocol is () => ToolCallProtocol {\n return typeof protocol === \"function\";\n}\n","import type { LanguageModelV2FunctionTool } from \"@ai-sdk/provider\";\n\ntype ProviderOptionsWithToolNames = {\n toolCallMiddleware?: {\n // INTERNAL: set by transform-handler to propagate tool names when providers\n // strip `params.tools`. Used as a fallback in downstream handlers.\n toolNames?: string[];\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n // INTERNAL: set by transform-handler to activate tool-choice fast-path.\n toolChoice?: { type: string };\n };\n};\n\nexport function isToolChoiceActive(params: {\n providerOptions?: {\n toolCallMiddleware?: {\n toolChoice?: { type: string };\n };\n };\n}): boolean {\n const toolChoice = params.providerOptions?.toolCallMiddleware?.toolChoice;\n return !!(\n typeof params.providerOptions === \"object\" &&\n params.providerOptions !== null &&\n typeof params.providerOptions?.toolCallMiddleware === \"object\" &&\n toolChoice &&\n typeof toolChoice === \"object\" &&\n (toolChoice.type === \"tool\" || toolChoice.type === \"required\")\n );\n}\n\nexport function getFunctionTools(params: {\n tools?: Array<LanguageModelV2FunctionTool | { type: string }>;\n providerOptions?: unknown;\n}): LanguageModelV2FunctionTool[] {\n // Prefer full tool definitions from params.tools when available\n const functionTools = (params.tools ?? []).filter(\n (t): t is LanguageModelV2FunctionTool =>\n (t as { type: string }).type === \"function\"\n );\n if (functionTools.length > 0) return functionTools;\n\n // Fallback: use tool names passed in providerOptions (name-only stubs)\n const rawToolNames =\n (params.providerOptions &&\n typeof params.providerOptions === \"object\" &&\n (params.providerOptions as ProviderOptionsWithToolNames)\n .toolCallMiddleware?.toolNames) ||\n [];\n const toStringArray = (val: unknown): string[] =>\n Array.isArray(val)\n ? (val as unknown[]).filter(\n (item): item is string => typeof item === \"string\"\n )\n : [];\n const toolNames: string[] = toStringArray(rawToolNames);\n if (toolNames.length > 0) {\n return toolNames.map((name: string) => ({\n type: \"function\",\n name,\n description: \"\",\n inputSchema: { type: \"object\" },\n }));\n }\n return [];\n}\n","import type {\n LanguageModelV2ToolCall,\n LanguageModelV2ToolResultPart,\n} from \"@ai-sdk/provider\";\n\nexport function isToolCallContent(\n content: unknown\n): content is LanguageModelV2ToolCall {\n return (\n (content as { type?: string }).type === \"tool-call\" &&\n typeof (content as { toolName?: unknown }).toolName === \"string\" &&\n // input may be a JSON string or an already-parsed object depending on provider/runtime\n (typeof (content as { input?: unknown }).input === \"string\" ||\n typeof (content as { input?: unknown }).input === \"object\")\n );\n}\n\nexport function isToolResultPart(\n content: unknown\n): content is LanguageModelV2ToolResultPart {\n const c = content as {\n type?: string;\n toolName?: unknown;\n toolCallId?: unknown;\n output?: unknown;\n };\n return (\n !!c &&\n c.type === \"tool-result\" &&\n typeof c.toolName === \"string\" &&\n typeof c.toolCallId === \"string\" &&\n \"output\" in c\n );\n}\n\nexport function hasInputProperty(obj: unknown): obj is { input?: unknown } {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"input\" in (obj as Record<string, unknown>)\n );\n}\n","import {\n LanguageModelV2Content,\n LanguageModelV2ToolCall,\n LanguageModelV2ToolResultPart,\n} from \"@ai-sdk/provider\";\nimport { generateId } from \"@ai-sdk/provider-utils\";\nimport { XMLBuilder, XMLParser } from \"fast-xml-parser\";\n\nimport { escapeRegExp, hasInputProperty } from \"@/utils\";\nimport { coerceBySchema, unwrapJsonSchema } from \"@/utils/coercion\";\n\nimport { ToolCallProtocol } from \"./tool-call-protocol\";\n\nexport const morphXmlProtocol = (): ToolCallProtocol => ({\n formatTools({ tools, toolSystemPromptTemplate }) {\n const toolsForPrompt = (tools || []).map(tool => ({\n name: tool.name,\n description: tool.description,\n parameters: unwrapJsonSchema(tool.inputSchema),\n }));\n return toolSystemPromptTemplate(JSON.stringify(toolsForPrompt));\n },\n\n formatToolCall(toolCall: LanguageModelV2ToolCall): string {\n const builder = new XMLBuilder({ format: true, suppressEmptyNode: true });\n // Some providers pass JSON string; some runtime paths may provide an object\n let args: unknown = {};\n const inputValue = hasInputProperty(toolCall) ? toolCall.input : undefined;\n\n if (typeof inputValue === \"string\") {\n try {\n args = JSON.parse(inputValue);\n } catch {\n args = inputValue;\n }\n } else {\n args = inputValue;\n }\n const xmlContent = builder.build({\n [toolCall.toolName]: args,\n });\n return xmlContent;\n },\n\n formatToolResponse(toolResult: LanguageModelV2ToolResultPart): string {\n const builder = new XMLBuilder({ format: true });\n const xmlContent = builder.build({\n tool_response: {\n tool_name: toolResult.toolName,\n result: toolResult.output,\n },\n });\n return xmlContent;\n },\n\n parseGeneratedText({ text, tools, options }) {\n // Get original schemas from provider options if available\n const originalSchemas =\n (options as { originalToolSchemas?: Record<string, unknown> } | undefined)\n ?.originalToolSchemas || {};\n\n // Optional debug\n // Schema-based coercion: convert string primitives according to tool JSON schema types\n\n const toolNames = tools.map(t => t.name).filter(name => name != null);\n if (toolNames.length === 0) {\n return [{ type: \"text\", text }];\n }\n\n const toolNamesPattern = toolNames.map(n => escapeRegExp(n)).join(\"|\");\n const toolCallRegex = new RegExp(\n String.raw`<(${toolNamesPattern})>([\\s\\S]*?)<\\/\\1>`,\n \"g\"\n );\n\n const processedElements: LanguageModelV2Content[] = [];\n let currentIndex = 0;\n let match;\n\n while ((match = toolCallRegex.exec(text)) !== null) {\n const startIndex = match.index;\n const toolName = match[1];\n const toolContent = match[2].trim();\n\n if (startIndex > currentIndex) {\n const textSegment = text.substring(currentIndex, startIndex);\n if (textSegment.trim()) {\n processedElements.push({ type: \"text\", text: textSegment });\n }\n }\n\n try {\n const parser = new XMLParser({\n ignoreAttributes: false,\n parseTagValue: false,\n ignoreDeclaration: true,\n textNodeName: \"#text\",\n });\n const parsedArgs =\n parser.parse(`<root>${toolContent}</root>`)?.root || {};\n\n const args: Record<string, unknown> = {};\n for (const k of Object.keys(parsedArgs || {})) {\n const v = parsedArgs[k];\n let val: unknown = v;\n\n // Handle text content extraction\n if (\n v &&\n typeof v === \"object\" &&\n Object.prototype.hasOwnProperty.call(v, \"#text\")\n ) {\n val = (v as Record<string, unknown>)?.[\"#text\"];\n }\n\n // Heuristic array parsing for multiple tags with same name\n if (Array.isArray(v)) {\n val = v.map(item => {\n if (\n item &&\n typeof item === \"object\" &&\n Object.prototype.hasOwnProperty.call(item, \"#text\")\n ) {\n const textVal = (item as Record<string, unknown>)?.[\"#text\"];\n return typeof textVal === \"string\" ? textVal.trim() : textVal;\n }\n return typeof item === \"string\" ? item.trim() : item;\n });\n }\n // Heuristic tuple/array parsing for various XML patterns\n else if (\n v &&\n typeof v === \"object\" &&\n !Object.prototype.hasOwnProperty.call(v, \"#text\")\n ) {\n const obj = v as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n // Check for 'item' key pattern (common XML array pattern)\n if (keys.length === 1 && keys[0] === \"item\") {\n const itemValue = obj.item;\n if (Array.isArray(itemValue)) {\n val = itemValue.map(item => {\n if (\n item &&\n typeof item === \"object\" &&\n Object.prototype.hasOwnProperty.call(item, \"#text\")\n ) {\n const textVal = (item as Record<string, unknown>)?.[\n \"#text\"\n ];\n const trimmed =\n typeof textVal === \"string\" ? textVal.trim() : textVal;\n // Try to convert to number if it looks like one\n if (\n typeof trimmed === \"string\" &&\n /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(trimmed)\n ) {\n const num = Number(trimmed);\n if (Number.isFinite(num)) return num;\n }\n return trimmed;\n }\n const trimmed = typeof item === \"string\" ? item.trim() : item;\n // Try to convert to number if it looks like one\n if (\n typeof trimmed === \"string\" &&\n /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(trimmed)\n ) {\n const num = Number(trimmed);\n if (Number.isFinite(num)) return num;\n }\n return trimmed;\n });\n } else {\n const trimmed =\n typeof itemValue === \"string\" ? itemValue.trim() : itemValue;\n // Try to convert to number if it looks like one\n if (\n typeof trimmed === \"string\" &&\n /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(trimmed)\n ) {\n const num = Number(trimmed);\n if (Number.isFinite(num)) {\n val = num;\n } else {\n val = trimmed;\n }\n } else {\n val = trimmed;\n }\n }\n }\n // Check if all keys are numeric indices (0, 1, 2, ...) and consecutive\n else {\n const isIndexedTuple =\n keys.length > 0 &&\n keys.every(key => /^\\d+$/.test(key)) &&\n (() => {\n const indices = keys\n .map(k => parseInt(k))\n .sort((a, b) => a - b);\n return (\n indices[0] === 0 && indices.every((val, idx) => val === idx)\n );\n })();\n\n if (isIndexedTuple) {\n // Convert indexed object to array (tuple)\n const sortedKeys = keys.sort(\n (a, b) => parseInt(a) - parseInt(b)\n );\n val = sortedKeys.map(key => {\n const item = obj[key];\n if (\n item &&\n typeof item === \"object\" &&\n Object.prototype.hasOwnProperty.call(item, \"#text\")\n ) {\n const textVal = (item as Record<string, unknown>)?.[\n \"#text\"\n ];\n return typeof textVal === \"string\"\n ? textVal.trim()\n : textVal;\n }\n return typeof item === \"string\" ? item.trim() : item;\n });\n } else {\n val = v;\n }\n }\n }\n\n args[k] = typeof val === \"string\" ? val.trim() : val;\n }\n\n // Use original schema if available, fallback to transformed schema\n // INTERNAL: `originalToolSchemas` is used to propagate the provider's\n // untouched tool schemas for better coercion. Not part of public API.\n const originalSchema = originalSchemas[toolName];\n const fallbackSchema = tools.find(t => t.name === toolName)\n ?.inputSchema as unknown;\n const schema = originalSchema || fallbackSchema;\n\n const coercedArgs = coerceBySchema(args, schema) as Record<\n string,\n unknown\n >;\n\n processedElements.push({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName,\n input: JSON.stringify(coercedArgs),\n });\n } catch (error) {\n const message = `Could not process XML tool call, keeping original text: ${match[0]}`;\n options?.onError?.(message, { toolCall: match[0], toolName, error });\n processedElements.push({ type: \"text\", text: match[0] });\n }\n\n currentIndex = startIndex + match[0].length;\n }\n\n if (currentIndex < text.length) {\n const remainingText = text.substring(currentIndex);\n if (remainingText.trim()) {\n processedElements.push({ type: \"text\", text: remainingText });\n }\n }\n\n return processedElements;\n },\n\n createStreamParser({ tools, options }) {\n // Get original schemas from options if available\n const originalSchemas =\n (options as { originalToolSchemas?: Record<string, unknown> } | undefined)\n ?.originalToolSchemas || {};\n const toolNames = tools.map(t => t.name).filter(name => name != null);\n let buffer = \"\";\n let currentToolCall: { name: string; content: string } | null = null;\n let currentTextId: string | null = null;\n\n const flushText = (\n controller: TransformStreamDefaultController,\n text?: string\n ) => {\n const content = text ?? buffer;\n if (content) {\n if (!currentTextId) {\n currentTextId = generateId();\n controller.enqueue({ type: \"text-start\", id: currentTextId });\n }\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId,\n delta: content,\n });\n // Only clear the internal buffer when we are flushing the buffer itself.\n // When flushing an explicit slice (textBeforeTag), keep buffer intact so\n // subsequent substring operations use the original indices.\n if (text === undefined) {\n buffer = \"\";\n }\n }\n\n if (currentTextId && !text) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n currentTextId = null;\n }\n };\n\n return new TransformStream({\n transform(chunk, controller) {\n if (chunk.type !== \"text-delta\") {\n if (buffer) flushText(controller);\n controller.enqueue(chunk);\n return;\n }\n\n buffer += chunk.delta;\n\n while (true) {\n if (currentToolCall) {\n const endTag = `</${currentToolCall.name}>`;\n const endTagIndex = buffer.indexOf(endTag);\n\n if (endTagIndex !== -1) {\n const toolContent = buffer.substring(0, endTagIndex);\n buffer = buffer.substring(endTagIndex + endTag.length);\n\n try {\n const parser = new XMLParser({\n ignoreAttributes: false,\n parseTagValue: false,\n ignoreDeclaration: true,\n textNodeName: \"#text\",\n });\n const parsedArgs =\n parser.parse(`<root>${toolContent}</root>`)?.root || {};\n\n const args: Record<string, unknown> = {};\n for (const k of Object.keys(parsedArgs || {})) {\n const v = parsedArgs[k];\n let val: unknown = v;\n\n // Handle text content extraction\n if (\n v &&\n typeof v === \"object\" &&\n Object.prototype.hasOwnProperty.call(v, \"#text\")\n ) {\n val = (v as Record<string, unknown>)?.[\"#text\"];\n }\n\n // Heuristic array parsing for multiple tags with same name\n if (Array.isArray(v)) {\n val = v.map(item => {\n if (\n item &&\n typeof item === \"object\" &&\n Object.prototype.hasOwnProperty.call(item, \"#text\")\n ) {\n const textVal = (item as Record<string, unknown>)?.[\n \"#text\"\n ];\n return typeof textVal === \"string\"\n ? textVal.trim()\n : textVal;\n }\n return typeof item === \"string\" ? item.trim() : item;\n });\n }\n // Heuristic tuple/array parsing for various XML patterns\n else if (\n v &&\n typeof v === \"object\" &&\n !Object.prototype.hasOwnProperty.call(v, \"#text\")\n ) {\n const obj = v as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n // Check for 'item' key pattern (common XML array pattern)\n if (keys.length === 1 && keys[0] === \"item\") {\n const itemValue = obj.item;\n if (Array.isArray(itemValue)) {\n val = itemValue.map(item => {\n if (\n item &&\n typeof item === \"object\" &&\n Object.prototype.hasOwnProperty.call(item, \"#text\")\n ) {\n const textVal = (item as Record<string, unknown>)?.[\n \"#text\"\n ];\n const trimmed =\n typeof textVal === \"string\"\n ? textVal.trim()\n : textVal;\n // Try to convert to number if it looks like one\n if (\n typeof trimmed === \"string\" &&\n /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(trimmed)\n ) {\n const num = Number(trimmed);\n if (Number.isFinite(num)) return num;\n }\n return trimmed;\n }\n const trimmed =\n typeof item === \"string\" ? item.trim() : item;\n // Try to convert to number if it looks like one\n if (\n typeof trimmed === \"string\" &&\n /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(trimmed)\n ) {\n const num = Number(trimmed);\n if (Number.isFinite(num)) return num;\n }\n return trimmed;\n });\n } else {\n const trimmed =\n typeof itemValue === \"string\"\n ? itemValue.trim()\n : itemValue;\n // Try to convert to number if it looks like one\n if (\n typeof trimmed === \"string\" &&\n /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(trimmed)\n ) {\n const num = Number(trimmed);\n if (Number.isFinite(num)) {\n val = num;\n } else {\n val = trimmed;\n }\n } else {\n val = trimmed;\n }\n }\n }\n // Check if all keys are numeric indices (0, 1, 2, ...) and consecutive\n else {\n const isIndexedTuple =\n keys.length > 0 &&\n keys.every(key => /^\\d+$/.test(key)) &&\n (() => {\n const indices = keys\n .map(k => parseInt(k))\n .sort((a, b) => a - b);\n return (\n indices[0] === 0 &&\n indices.every((val, idx) => val === idx)\n );\n })();\n\n if (isIndexedTuple) {\n // Convert indexed object to array (tuple)\n const sortedKeys = keys.sort(\n (a, b) => parseInt(a) - parseInt(b)\n );\n val = sortedKeys.map(key => {\n const item = obj[key];\n if (\n item &&\n typeof item === \"object\" &&\n Object.prototype.hasOwnProperty.call(item, \"#text\")\n ) {\n const textVal = (item as Record<string, unknown>)?.[\n \"#text\"\n ];\n return typeof textVal === \"string\"\n ? textVal.trim()\n : textVal;\n }\n return typeof item === \"string\" ? item.trim() : item;\n });\n } else {\n val = v;\n }\n }\n }\n\n args[k] = typeof val === \"string\" ? val.trim() : val;\n }\n\n // Use original schema if available, fallback to transformed schema\n const originalSchema = originalSchemas[currentToolCall!.name];\n const fallbackSchema = tools.find(\n t => t.name === currentToolCall!.name\n )?.inputSchema;\n const toolSchema = originalSchema || fallbackSchema;\n\n const coercedArgs = coerceBySchema(args, toolSchema) as Record<\n string,\n unknown\n >;\n\n flushText(controller);\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: currentToolCall.name,\n input: JSON.stringify(coercedArgs),\n });\n } catch {\n const originalCallText = `<${currentToolCall.name}>${toolContent}${endTag}`;\n if (options?.onError) {\n options.onError(\n \"Could not process streaming XML tool call; emitting original text.\",\n {\n toolCall: originalCallText,\n toolName: currentToolCall.name,\n }\n );\n }\n flushText(controller, originalCallText);\n }\n currentToolCall = null;\n } else {\n break;\n }\n } else {\n let earliestStartTagIndex = -1;\n let earliestToolName = \"\";\n\n if (toolNames.length > 0) {\n for (const name of toolNames) {\n const startTag = `<${name}>`;\n const index = buffer.indexOf(startTag);\n if (\n index !== -1 &&\n (earliestStartTagIndex === -1 ||\n index < earliestStartTagIndex)\n ) {\n earliestStartTagIndex = index;\n earliestToolName = name;\n }\n }\n }\n\n if (earliestStartTagIndex !== -1) {\n const textBeforeTag = buffer.substring(0, earliestStartTagIndex);\n flushText(controller, textBeforeTag);\n\n const startTag = `<${earliestToolName}>`;\n buffer = buffer.substring(\n earliestStartTagIndex + startTag.length\n );\n currentToolCall = { name: earliestToolName, content: \"\" };\n } else {\n break;\n }\n }\n }\n },\n flush(controller) {\n if (currentToolCall) {\n const unfinishedCall = `<${currentToolCall.name}>${buffer}`;\n flushText(controller, unfinishedCall);\n } else if (buffer) {\n flushText(controller);\n }\n\n if (currentTextId) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n }\n },\n });\n },\n\n extractToolCallSegments({ text, tools }) {\n const toolNames = tools.map(t => t.name).filter(Boolean) as string[];\n if (toolNames.length === 0) return [];\n const names = toolNames.map(n => escapeRegExp(String(n))).join(\"|\");\n if (!names) return [];\n const regex = new RegExp(`<(${names})>[\\\\s\\\\S]*?<\\\\/\\\\1>`, \"g\");\n const segments: string[] = [];\n let m: RegExpExecArray | null;\n while ((m = regex.exec(text)) != null) {\n segments.push(m[0]);\n }\n return segments;\n },\n});\n","import type {\n LanguageModelV2,\n LanguageModelV2Content,\n LanguageModelV2FunctionTool,\n LanguageModelV2ToolCall,\n} from \"@ai-sdk/provider\";\nimport { generateId } from \"@ai-sdk/provider-utils\";\n\nimport { ToolCallProtocol } from \"./protocols/tool-call-protocol\";\nimport {\n extractOnErrorOption,\n getFunctionTools,\n isToolChoiceActive,\n} from \"./utils\";\nimport { coerceToolCallInput } from \"./utils/coercion\";\nimport {\n getDebugLevel,\n logParsedChunk,\n logParsedSummary,\n logRawChunk,\n} from \"./utils/debug\";\n\ntype WrapGenerateParams = {\n prompt?: unknown;\n tools?: Array<LanguageModelV2FunctionTool | { type: string }>;\n providerOptions?: unknown;\n};\n\nexport async function wrapGenerate({\n protocol,\n doGenerate,\n params,\n}: {\n protocol: ToolCallProtocol;\n doGenerate: () => ReturnType<LanguageModelV2[\"doGenerate\"]>;\n params: WrapGenerateParams & {\n providerOptions?: {\n toolCallMiddleware?: {\n toolChoice?: { type: string };\n };\n };\n };\n}) {\n if (isToolChoiceActive(params)) {\n const result = await doGenerate();\n let parsed: { name?: string; arguments?: Record<string, unknown> } = {};\n const first = result.content?.[0];\n if (first && first.type === \"text\") {\n const debugLevel = getDebugLevel();\n if (debugLevel === \"parse\") {\n logRawChunk(first.text);\n }\n try {\n parsed = JSON.parse(first.text);\n } catch (error) {\n const options = extractOnErrorOption(params.providerOptions);\n options?.onError?.(\n \"Failed to parse toolChoice JSON from generated model output\",\n {\n text: first.text,\n error: error instanceof Error ? error.message : String(error),\n }\n );\n parsed = {};\n }\n // Defer summary logging until toolCall object is constructed below\n }\n\n const toolCall: LanguageModelV2ToolCall = {\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: parsed.name || \"unknown\",\n input: JSON.stringify(parsed.arguments || {}),\n };\n\n // Use the same parse-summary shape as streaming path\n const debugLevelToolChoice = getDebugLevel();\n const originText = first && first.type === \"text\" ? first.text : \"\";\n if (debugLevelToolChoice === \"parse\") {\n logParsedSummary({ toolCalls: [toolCall], originalText: originText });\n }\n\n return {\n ...result,\n content: [toolCall],\n };\n }\n\n const result = await doGenerate();\n\n if (result.content.length === 0) {\n return result;\n }\n\n const parsed = result.content.flatMap(contentItem => {\n if (contentItem.type !== \"text\") {\n return [contentItem];\n }\n const debugLevel = getDebugLevel();\n if (debugLevel === \"stream\") {\n // For generate flow with stream debug we show raw text and parsed parts\n logRawChunk(contentItem.text);\n }\n return protocol.parseGeneratedText({\n text: contentItem.text,\n tools: getFunctionTools(params),\n options: {\n ...extractOnErrorOption(params.providerOptions),\n ...((\n params.providerOptions as { toolCallMiddleware?: unknown } | undefined\n )?.toolCallMiddleware as Record<string, unknown>),\n },\n });\n });\n const tools = getFunctionTools(params);\n const newContent = parsed.map(part =>\n coerceToolCallInput(part as LanguageModelV2Content, tools)\n );\n\n const debugLevel = getDebugLevel();\n if (debugLevel === \"stream\") {\n newContent.forEach(part => logParsedChunk(part));\n }\n if (debugLevel === \"parse\") {\n const allText = result.content\n .filter(\n (c): c is Extract<LanguageModelV2Content, { type: \"text\" }> =>\n c.type === \"text\"\n )\n .map(c => c.text)\n .join(\"\\n\\n\");\n const segments = protocol.extractToolCallSegments\n ? protocol.extractToolCallSegments({ text: allText, tools })\n : [];\n const originalText = segments.join(\"\\n\\n\");\n const toolCalls = newContent.filter(\n (p): p is Extract<LanguageModelV2Content, { type: \"tool-call\" }> =>\n (p as LanguageModelV2Content).type === \"tool-call\"\n );\n logParsedSummary({ toolCalls, originalText });\n }\n\n return {\n ...result,\n content: newContent,\n };\n}\n","import type {\n LanguageModelV2,\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2FunctionTool,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n} from \"@ai-sdk/provider\";\nimport { generateId } from \"@ai-sdk/provider-utils\";\n\nimport { ToolCallProtocol } from \"./protocols/tool-call-protocol\";\nimport {\n extractOnErrorOption,\n getFunctionTools,\n isToolChoiceActive,\n} from \"./utils\";\nimport {\n getDebugLevel,\n logParsedChunk,\n logParsedSummary,\n logRawChunk,\n} from \"./utils/debug\";\n\ntype WrapStreamParams = Parameters<typeof isToolChoiceActive>[0] & {\n tools?: Array<LanguageModelV2FunctionTool | { type: string }>;\n providerOptions?: unknown;\n};\n\nexport async function wrapStream({\n protocol,\n doStream,\n doGenerate,\n params,\n}: {\n protocol: ToolCallProtocol;\n doStream: () => ReturnType<LanguageModelV2[\"doStream\"]>;\n doGenerate: () => ReturnType<LanguageModelV2[\"doGenerate\"]>;\n params: WrapStreamParams;\n}) {\n if (isToolChoiceActive(params)) {\n return toolChoiceStream({\n doGenerate,\n options: extractOnErrorOption(params.providerOptions),\n });\n }\n\n const { stream, ...rest } = await doStream();\n\n const debugLevel = getDebugLevel();\n const tools = getFunctionTools(params);\n const options = {\n ...extractOnErrorOption(params.providerOptions),\n ...((params.providerOptions as { toolCallMiddleware?: unknown } | undefined)\n ?.toolCallMiddleware as Record<string, unknown>),\n };\n\n if (debugLevel === \"off\") {\n return {\n stream: stream.pipeThrough(\n protocol.createStreamParser({\n tools,\n options,\n })\n ),\n ...rest,\n };\n }\n\n if (debugLevel === \"stream\") {\n const withRawTap = stream.pipeThrough(\n new TransformStream<LanguageModelV2StreamPart, LanguageModelV2StreamPart>(\n {\n transform(part, controller) {\n logRawChunk(part);\n controller.enqueue(part);\n },\n }\n )\n );\n\n const parsed = withRawTap.pipeThrough(\n protocol.createStreamParser({\n tools,\n options,\n })\n );\n\n const withParsedTap = parsed.pipeThrough(\n new TransformStream<LanguageModelV2StreamPart, LanguageModelV2StreamPart>(\n {\n transform(part, controller) {\n logParsedChunk(part);\n controller.enqueue(part);\n },\n }\n )\n );\n\n return {\n stream: withParsedTap,\n ...rest,\n };\n }\n\n // debugLevel === \"parse\"\n let fullRawText = \"\";\n const withRawTap = stream.pipeThrough(\n new TransformStream<LanguageModelV2StreamPart, LanguageModelV2StreamPart>({\n transform(part, controller) {\n if (part.type === \"text-delta\") {\n const delta = (\n part as Extract<LanguageModelV2StreamPart, { type: \"text-delta\" }>\n ).delta as string | undefined;\n if (typeof delta === \"string\" && delta.length > 0) {\n fullRawText += delta;\n }\n }\n controller.enqueue(part);\n },\n })\n );\n\n const parsed = withRawTap.pipeThrough(\n protocol.createStreamParser({\n tools,\n options,\n })\n );\n\n const withSummary = parsed.pipeThrough(\n new TransformStream<LanguageModelV2StreamPart, LanguageModelV2StreamPart>({\n transform: (() => {\n const parsedToolCalls: LanguageModelV2StreamPart[] = [];\n return (\n part: LanguageModelV2StreamPart,\n controller: TransformStreamDefaultController<LanguageModelV2StreamPart>\n ) => {\n if (part.type === \"tool-call\") {\n parsedToolCalls.push(part);\n }\n if (part.type === \"finish\") {\n try {\n const segments = protocol.extractToolCallSegments\n ? protocol.extractToolCallSegments({\n text: fullRawText,\n tools,\n })\n : [];\n const origin = segments.join(\"\\n\\n\");\n logParsedSummary({\n toolCalls: parsedToolCalls,\n originalText: origin,\n });\n } catch {\n // ignore logging failures\n }\n }\n controller.enqueue(part);\n };\n })(),\n })\n );\n\n return {\n stream: withSummary,\n ...rest,\n };\n}\n\nexport async function toolChoiceStream({\n doGenerate,\n options,\n}: {\n doGenerate: () => ReturnType<LanguageModelV2[\"doGenerate\"]>;\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n}) {\n const result = await doGenerate();\n\n // Assume result.content[0] contains tool-call information (JSON)\n let toolJson: { name?: string; arguments?: Record<string, unknown> } = {};\n if (\n result?.content &&\n result.content.length > 0 &&\n result.content[0]?.type === \"text\"\n ) {\n try {\n toolJson = JSON.parse(result.content[0].text);\n } catch (error) {\n options?.onError?.(\n \"Failed to parse toolChoice JSON from streamed model output\",\n {\n text: result.content[0].text,\n error: error instanceof Error ? error.message : String(error),\n }\n );\n toolJson = {};\n }\n }\n\n const toolCallChunk: LanguageModelV2StreamPart = {\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: toolJson.name || \"unknown\",\n input: JSON.stringify(toolJson.arguments || {}),\n };\n\n const finishChunk: LanguageModelV2StreamPart = {\n type: \"finish\",\n usage:\n result?.usage ||\n // TODO: If possible, try to return a certain amount of LLM usage.\n ({\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n } as LanguageModelV2Usage),\n finishReason: \"tool-calls\" as LanguageModelV2FinishReason,\n };\n\n const stream = new ReadableStream<LanguageModelV2StreamPart>({\n start(controller) {\n controller.enqueue(toolCallChunk);\n controller.enqueue(finishChunk);\n controller.close();\n },\n });\n\n const debugLevel = getDebugLevel();\n const firstText =\n (result?.content &&\n result.content[0] &&\n (result.content[0] as Extract<LanguageModelV2Content, { type: \"text\" }>)\n .type === \"text\" &&\n (result.content[0] as Extract<LanguageModelV2Content, { type: \"text\" }>)\n .text) ||\n \"\";\n const streamWithSummary =\n debugLevel === \"parse\"\n ? stream.pipeThrough(\n new TransformStream<\n LanguageModelV2StreamPart,\n LanguageModelV2StreamPart\n >({\n transform(part, controller) {\n if (part.type === \"finish\") {\n try {\n logParsedSummary({\n toolCalls: [toolCallChunk],\n originalText:\n typeof firstText === \"string\" ? firstText : \"\",\n });\n } catch {\n // ignore logging failures\n }\n }\n controller.enqueue(part);\n },\n })\n )\n : stream;\n\n return {\n request: result?.request || {},\n response: result?.response || {},\n stream: streamWithSummary,\n };\n}\n","import type { JSONSchema7 } from \"@ai-sdk/provider\";\nimport {\n LanguageModelV2Content,\n LanguageModelV2FunctionTool,\n LanguageModelV2Prompt,\n LanguageModelV2ToolResultPart,\n} from \"@ai-sdk/provider\";\n\nimport { ToolCallProtocol } from \"./protocols/tool-call-protocol\";\nimport {\n createDynamicIfThenElseSchema,\n extractOnErrorOption,\n isToolCallContent,\n isToolResultPart,\n} from \"./utils\";\nimport { isProtocolFactory } from \"./utils/protocol\";\n\nexport async function transformParams({\n params,\n protocol,\n toolSystemPromptTemplate,\n}: {\n params: {\n prompt?: LanguageModelV2Prompt;\n tools?: Array<LanguageModelV2FunctionTool | { type: string }>;\n providerOptions?: {\n toolCallMiddleware?: {\n toolChoice?: { type: string };\n };\n };\n toolChoice?: { type: string; toolName?: string };\n };\n protocol: ToolCallProtocol | (() => ToolCallProtocol);\n toolSystemPromptTemplate: (tools: string) => string;\n}) {\n const resolvedProtocol = isProtocolFactory(protocol) ? protocol() : protocol;\n\n const functionTools = (params.tools ?? []).filter(\n (t): t is LanguageModelV2FunctionTool => t.type === \"function\"\n );\n\n const systemPrompt = resolvedProtocol.formatTools({\n tools: functionTools,\n toolSystemPromptTemplate,\n });\n\n const processedPrompt = convertToolPrompt(\n params.prompt ?? [],\n resolvedProtocol,\n extractOnErrorOption(params.providerOptions)\n );\n\n const finalPrompt: LanguageModelV2Prompt =\n processedPrompt[0]?.role === \"system\"\n ? [\n {\n role: \"system\",\n content: systemPrompt + \"\\n\\n\" + processedPrompt[0].content,\n },\n ...processedPrompt.slice(1),\n ]\n : [\n {\n role: \"system\",\n content: systemPrompt,\n },\n ...processedPrompt,\n ];\n\n const baseReturnParams = {\n ...params,\n prompt: finalPrompt,\n tools: [],\n toolChoice: undefined,\n providerOptions: {\n ...(params.providerOptions || {}),\n toolCallMiddleware: {\n ...((params.providerOptions &&\n typeof params.providerOptions === \"object\" &&\n (params.providerOptions as { toolCallMiddleware?: unknown })\n .toolCallMiddleware) ||\n {}),\n // INTERNAL: used by the middleware to propagate the names of custom\n // function tools into downstream handlers (stream/generate) when\n // providers strip or ignore `params.tools`. Not a stable public API.\n toolNames: functionTools.map(t => t.name),\n },\n },\n };\n\n if (params.toolChoice?.type === \"none\") {\n // TODO: Support 'none' toolChoice type.\n throw new Error(\n \"The 'none' toolChoice type is not supported by this middleware. Please use 'auto', 'required', or specify a tool name.\"\n );\n }\n\n if (params.toolChoice?.type === \"tool\") {\n const selectedToolName = params.toolChoice.toolName;\n // If a provider-defined tool matches the requested tool identifier, surface the specific error\n const providerDefinedMatch = (params.tools ?? []).find(t => {\n if (t.type === \"function\") return false;\n const anyTool = t as unknown as { id?: string; name?: string };\n return (\n anyTool.id === selectedToolName || anyTool.name === selectedToolName\n );\n });\n if (providerDefinedMatch) {\n throw new Error(\n \"Provider-defined tools are not supported by this middleware. Please use custom tools.\"\n );\n }\n\n const selectedTool = (params.tools ?? []).find(\n (t): t is LanguageModelV2FunctionTool =>\n t.type === \"function\" &&\n (t as LanguageModelV2FunctionTool).name === selectedToolName\n );\n\n if (!selectedTool) {\n throw new Error(\n `Tool with name '${selectedToolName}' not found in params.tools.`\n );\n }\n\n return {\n ...baseReturnParams,\n responseFormat: {\n type: \"json\" as const,\n schema: {\n type: \"object\",\n properties: {\n name: {\n const: selectedTool.name,\n },\n arguments: selectedTool.inputSchema,\n },\n required: [\"name\", \"arguments\"],\n } as JSONSchema7,\n name: selectedTool.name,\n description:\n typeof selectedTool.description === \"string\"\n ? selectedTool.description\n : undefined,\n },\n providerOptions: {\n ...(baseReturnParams.providerOptions || {}),\n toolCallMiddleware: {\n ...((baseReturnParams.providerOptions &&\n typeof baseReturnParams.providerOptions === \"object\" &&\n (\n baseReturnParams.providerOptions as {\n toolCallMiddleware?: unknown;\n }\n ).toolCallMiddleware) ||\n {}),\n // INTERNAL: used by the middleware to activate the tool-choice\n // fast-path in handlers. Not a stable public API.\n toolChoice: params.toolChoice,\n },\n },\n };\n }\n\n if (params.toolChoice?.type === \"required\") {\n if (!params.tools || params.tools.length === 0) {\n throw new Error(\n \"Tool choice type 'required' is set, but no tools are provided in params.tools.\"\n );\n }\n\n return {\n ...baseReturnParams,\n responseFormat: {\n type: \"json\" as const,\n schema: createDynamicIfThenElseSchema(functionTools),\n },\n providerOptions: {\n ...(baseReturnParams.providerOptions || {}),\n toolCallMiddleware: {\n ...((baseReturnParams.providerOptions &&\n typeof baseReturnParams.providerOptions === \"object\" &&\n (\n baseReturnParams.providerOptions as {\n toolCallMiddleware?: unknown;\n }\n ).toolCallMiddleware) ||\n {}),\n // INTERNAL: used by the middleware to activate the tool-choice\n // fast-path in handlers. Not a stable public API.\n toolChoice: { type: \"required\" },\n },\n },\n };\n }\n\n return baseReturnParams;\n}\n\nfunction convertToolPrompt(\n prompt: LanguageModelV2Prompt,\n resolvedProtocol: ToolCallProtocol,\n providerOptions?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n }\n): LanguageModelV2Prompt {\n const processedPrompt = prompt.map(message => {\n if (message.role === \"assistant\") {\n const newContent: LanguageModelV2Content[] = [];\n for (const content of message.content) {\n if (isToolCallContent(content)) {\n newContent.push({\n type: \"text\",\n text: resolvedProtocol.formatToolCall(content),\n });\n } else if ((content as { type?: string }).type === \"text\") {\n newContent.push(content as LanguageModelV2Content);\n } else if ((content as { type?: string }).type === \"reasoning\") {\n // Pass through reasoning parts unchanged for providers that support it\n newContent.push(content as LanguageModelV2Content);\n } else {\n // Prefer the onError callback for surfacing non-fatal warnings\n const options = extractOnErrorOption(providerOptions);\n options?.onError?.(\n \"tool-call-middleware: unknown assistant content; stringifying for provider compatibility\",\n { content }\n );\n newContent.push({\n type: \"text\",\n text: JSON.stringify(content),\n });\n }\n }\n // If assistant content consists solely of text parts, condense into a single text part\n const onlyText = newContent.every(c => c.type === \"text\");\n const condensedAssistant = onlyText\n ? [\n {\n type: \"text\" as const,\n text: newContent\n .map(c => (c as { text: string }).text)\n .join(\"\\n\"),\n },\n ]\n : newContent;\n return { role: \"assistant\", content: condensedAssistant };\n }\n if (message.role === \"tool\") {\n return {\n role: \"user\",\n // Map tool results to text response blocks, then condense into a single text block\n content: [\n {\n type: \"text\" as const,\n text: message.content\n .map(toolResult =>\n isToolResultPart(toolResult)\n ? resolvedProtocol.formatToolResponse(toolResult)\n : resolvedProtocol.formatToolResponse(\n toolResult as LanguageModelV2ToolResultPart\n )\n )\n .join(\"\\n\"),\n },\n ],\n };\n }\n return message;\n });\n\n // Condense any message that contains only text parts into a single text part\n for (let i = 0; i < processedPrompt.length; i++) {\n const msg = processedPrompt[i] as unknown as {\n role: string;\n content: unknown;\n };\n if (Array.isArray(msg.content)) {\n const allText = (msg.content as { type: string }[]).every(\n (c: { type: string }) => c?.type === \"text\"\n );\n if (allText && msg.content.length > 1) {\n const joinedText = (msg.content as { text: string }[])\n .map((c: { text: string }) => c.text)\n .join(\"\\n\");\n if (msg.role === \"system\") {\n processedPrompt[i] = {\n role: \"system\",\n content: joinedText,\n };\n } else if (msg.role === \"assistant\") {\n processedPrompt[i] = {\n role: \"assistant\",\n content: [\n {\n type: \"text\" as const,\n text: joinedText,\n },\n ],\n };\n } else {\n // Treat remaining roles (e.g., user) as user text content\n processedPrompt[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\" as const,\n text: joinedText,\n },\n ],\n };\n }\n }\n }\n }\n\n // Merge consecutive text blocks\n for (let i = processedPrompt.length - 1; i > 0; i--) {\n const current = processedPrompt[i];\n const prev = processedPrompt[i - 1];\n if (current.role === \"user\" && prev.role === \"user\") {\n const prevContent = prev.content\n .map(c => (c.type === \"text\" ? c.text : \"\"))\n .join(\"\\n\");\n const currentContent = current.content\n .map(c => (c.type === \"text\" ? c.text : \"\"))\n .join(\"\\n\");\n processedPrompt[i - 1] = {\n role: \"user\",\n content: [{ type: \"text\", text: prevContent + \"\\n\" + currentContent }],\n };\n processedPrompt.splice(i, 1);\n }\n }\n return processedPrompt as LanguageModelV2Prompt;\n}\n","import type {\n LanguageModelV2CallOptions,\n LanguageModelV2Middleware,\n} from \"@ai-sdk/provider\";\n\nimport { wrapGenerate as wrapGenerateHandler } from \"./generate-handler\";\nimport { ToolCallProtocol } from \"./protocols/tool-call-protocol\";\nimport {\n toolChoiceStream,\n wrapStream as wrapStreamHandler,\n} from \"./stream-handler\";\nimport { transformParams } from \"./transform-handler\";\nimport { extractOnErrorOption, isToolChoiceActive } from \"./utils\";\nimport { isProtocolFactory } from \"./utils/protocol\";\n\nexport function createToolMiddleware({\n protocol,\n toolSystemPromptTemplate,\n}: {\n protocol: ToolCallProtocol | (() => ToolCallProtocol);\n toolSystemPromptTemplate: (tools: string) => string;\n}): LanguageModelV2Middleware {\n const resolvedProtocol = isProtocolFactory(protocol) ? protocol() : protocol;\n\n return {\n middlewareVersion: \"v2\",\n wrapStream: async ({ doStream, doGenerate, params }) => {\n if (isToolChoiceActive(params)) {\n return toolChoiceStream({\n doGenerate,\n options: extractOnErrorOption(params.providerOptions),\n });\n } else {\n return wrapStreamHandler({\n protocol: resolvedProtocol,\n doStream,\n doGenerate,\n params,\n });\n }\n },\n wrapGenerate: async ({ doGenerate, params }) =>\n wrapGenerateHandler({\n protocol: resolvedProtocol,\n doGenerate,\n params,\n }),\n transformParams: async ({\n params,\n }): Promise<LanguageModelV2CallOptions> => {\n return transformParams({\n protocol: resolvedProtocol,\n toolSystemPromptTemplate,\n params,\n });\n },\n };\n}\n","import { jsonMixProtocol, morphXmlProtocol } from \"./protocols\";\nimport { createToolMiddleware } from \"./tool-call-middleware\";\n\nconst gemmaToolMiddleware = createToolMiddleware({\n protocol: jsonMixProtocol(\n // Customize the tool call delimiters to use markdown code fences\n {\n toolCallStart: \"```tool_call\\n\",\n // TODO: Support specifying multiple possible tags,\n // e.g., for gemma, it would be nice to be able to set both `` and ``` at the same time.\n toolCallEnd: \"\\n```\",\n toolResponseStart: \"```tool_response\\n\",\n toolResponseEnd: \"\\n```\",\n }\n ),\n toolSystemPromptTemplate(tools) {\n return `You have access to functions. If you decide to invoke any of the function(s),\nyou MUST put it in the format of markdown code fence block with the language name of tool_call , e.g.\n\\`\\`\\`tool_call\n{'name': <function-name>, 'arguments': <args-dict>}\n\\`\\`\\`\nYou SHOULD NOT include any other text in the response if you call a function\n${tools}`;\n },\n});\n\nconst hermesToolMiddleware = createToolMiddleware({\n protocol: jsonMixProtocol,\n toolSystemPromptTemplate(tools) {\n return `You are a function calling AI model.\nYou are provided with function signatures within <tools></tools> XML tags.\nYou may call one or more functions to assist with the user query.\nDon't make assumptions about what values to plug into functions.\nHere are the available tools: <tools>${tools}</tools>\nUse the following pydantic model json schema for each tool call you will make: {\"title\": \"FunctionCall\", \"type\": \"object\", \"properties\": {\"arguments\": {\"title\": \"Arguments\", \"type\": \"object\"}, \"name\": {\"title\": \"Name\", \"type\": \"string\"}}, \"required\": [\"arguments\", \"name\"]}\nFor each function call return a json object with function name and arguments within <tool_call></tool_call> XML tags as follows:\n<tool_call>\n{\"name\": \"<function-name>\", \"arguments\": <args-dict>}\n</tool_call>`;\n },\n});\n\nconst xmlToolMiddleware = createToolMiddleware({\n protocol: morphXmlProtocol,\n toolSystemPromptTemplate(tools: string) {\n return `You are a function calling AI model.\nYou are provided with function signatures within <tools></tools> XML tags.\nYou may call one or more functions to assist with the user query.\nDon't make assumptions about what values to plug into functions.\nHere are the available tools: <tools>${tools}</tools>\nFor a function call, return exactly one XML element whose tag name matches the tool's name, and nothing else.\nWhen an argument is an array, write each item inside a single element on one line separated by commas (or provide a JSON-like list). When an argument is an object, provide a JSON-like value.\nExamples:\n<get_weather>\n<location>\nSan Fransisco\n</location>\n</get_weather>`;\n },\n});\n\nexport {\n createToolMiddleware,\n gemmaToolMiddleware,\n hermesToolMiddleware,\n jsonMixProtocol,\n morphXmlProtocol,\n xmlToolMiddleware,\n};\n"],"mappings":"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","names":["generateId","generateId","generateId","trimmed","k","val","generateId","generateId","result","parsed","debugLevel","generateId","_a","generateId","withRawTap","parsed","generateId"]}
1
+ {"version":3,"sources":["../src/protocols/dummy-protocol.ts","../src/protocols/json-mix-protocol.ts","../src/utils/dynamic-tool-schema.ts","../src/utils/get-potential-start-index.ts","../src/utils/regex.ts","../src/utils/relaxed-json.ts","../src/utils/coercion.ts","../src/utils/debug.ts","../src/utils/on-error.ts","../src/utils/protocol.ts","../src/utils/tools.ts","../src/utils/type-guards.ts","../src/protocols/morph-xml-protocol.ts","../src/generate-handler.ts","../src/stream-handler.ts","../src/transform-handler.ts","../src/tool-call-middleware.ts","../src/index.ts"],"sourcesContent":["import { generateId } from \"@ai-sdk/provider-utils\";\n\nimport { ToolCallProtocol } from \"./tool-call-protocol\";\n\nexport const dummyProtocol = (): ToolCallProtocol => ({\n formatTools: () => \"\",\n formatToolCall: () => \"\",\n formatToolResponse: () => \"\",\n parseGeneratedText: ({ text }) => [{ type: \"text\", text }],\n createStreamParser: () => {\n let currentTextId: string | null = null;\n let hasEmittedText = false;\n\n return new TransformStream({\n transform(chunk, controller) {\n if (chunk.type === \"text-delta\") {\n if (chunk.delta) {\n if (!currentTextId) {\n currentTextId = generateId();\n controller.enqueue({ type: \"text-start\", id: currentTextId });\n }\n controller.enqueue({ ...chunk, id: currentTextId });\n hasEmittedText = true;\n }\n } else {\n if (currentTextId && hasEmittedText) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n }\n currentTextId = null;\n hasEmittedText = false;\n controller.enqueue(chunk);\n }\n },\n flush(controller) {\n if (currentTextId && hasEmittedText) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n }\n },\n });\n },\n});\n","import type {\n LanguageModelV2Content,\n LanguageModelV2ToolCall,\n LanguageModelV2ToolResultPart,\n} from \"@ai-sdk/provider\";\nimport { generateId } from \"@ai-sdk/provider-utils\";\n\nimport { escapeRegExp, getPotentialStartIndex, RJSON } from \"@/utils\";\n\nimport { ToolCallProtocol } from \"./tool-call-protocol\";\n\ntype JsonMixOptions = {\n toolCallStart?: string;\n toolCallEnd?: string;\n toolResponseStart?: string;\n toolResponseEnd?: string;\n};\n\nexport const jsonMixProtocol = ({\n toolCallStart = \"<tool_call>\",\n toolCallEnd = \"</tool_call>\",\n toolResponseStart = \"<tool_response>\",\n toolResponseEnd = \"</tool_response>\",\n}: JsonMixOptions = {}): ToolCallProtocol => ({\n formatTools({ tools, toolSystemPromptTemplate }) {\n const toolsForPrompt = (tools || [])\n .filter(tool => tool.type === \"function\")\n .map(tool => ({\n name: tool.name,\n description:\n tool.type === \"function\" && typeof tool.description === \"string\"\n ? tool.description\n : undefined,\n parameters: tool.inputSchema,\n }));\n return toolSystemPromptTemplate(JSON.stringify(toolsForPrompt));\n },\n\n formatToolCall(toolCall: LanguageModelV2ToolCall) {\n let args: unknown = {};\n try {\n args = JSON.parse(toolCall.input);\n } catch {\n args = toolCall.input;\n }\n return `${toolCallStart}${JSON.stringify({\n name: toolCall.toolName,\n arguments: args,\n })}${toolCallEnd}`;\n },\n\n formatToolResponse(toolResult: LanguageModelV2ToolResultPart) {\n return `${toolResponseStart}${JSON.stringify({\n toolName: toolResult.toolName,\n result: toolResult.output,\n })}${toolResponseEnd}`;\n },\n\n parseGeneratedText({ text, options }) {\n const startEsc = escapeRegExp(toolCallStart);\n const endEsc = escapeRegExp(toolCallEnd);\n const toolCallRegex = new RegExp(\n `${startEsc}([\\u0000-\\uFFFF]*?)${endEsc}`,\n \"gs\"\n );\n\n const processedElements: LanguageModelV2Content[] = [];\n let currentIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = toolCallRegex.exec(text)) !== null) {\n const startIndex = match.index;\n const toolCallJson = match[1];\n\n if (startIndex > currentIndex) {\n const textSegment = text.substring(currentIndex, startIndex);\n if (textSegment.trim()) {\n processedElements.push({ type: \"text\", text: textSegment });\n }\n }\n\n if (toolCallJson) {\n try {\n const parsedToolCall = RJSON.parse(toolCallJson) as {\n name: string;\n arguments: unknown;\n };\n processedElements.push({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: parsedToolCall.name,\n input: JSON.stringify(parsedToolCall.arguments ?? {}),\n });\n } catch (error) {\n if (options?.onError) {\n options.onError(\n \"Could not process JSON tool call, keeping original text.\",\n { toolCall: match[0], error }\n );\n }\n processedElements.push({ type: \"text\", text: match[0] });\n }\n }\n\n currentIndex = startIndex + match[0].length;\n }\n\n if (currentIndex < text.length) {\n const remainingText = text.substring(currentIndex);\n if (remainingText.trim()) {\n processedElements.push({ type: \"text\", text: remainingText });\n }\n }\n\n return processedElements;\n },\n\n createStreamParser({ tools: _tools, options } = { tools: [] }) {\n let isInsideToolCall = false;\n let buffer = \"\";\n let currentToolCallJson = \"\";\n let currentTextId: string | null = null;\n let hasEmittedTextStart = false;\n\n return new TransformStream({\n transform(chunk, controller) {\n if (chunk.type === \"finish\") {\n if (isInsideToolCall && buffer.length > 0) {\n if (!currentTextId) {\n currentTextId = generateId();\n controller.enqueue({ type: \"text-start\", id: currentTextId });\n hasEmittedTextStart = true;\n }\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId,\n delta: `${toolCallStart}${buffer}`,\n });\n buffer = \"\";\n } else if (!isInsideToolCall && buffer.length > 0) {\n // Flush any remaining buffered text (e.g., partial start tag suffix)\n if (!currentTextId) {\n currentTextId = generateId();\n controller.enqueue({ type: \"text-start\", id: currentTextId });\n hasEmittedTextStart = true;\n }\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId,\n delta: buffer,\n });\n buffer = \"\";\n }\n\n if (currentTextId && hasEmittedTextStart) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n currentTextId = null;\n hasEmittedTextStart = false;\n }\n\n // No pending calls should remain; if there is leftover, emit as text\n if (currentToolCallJson) {\n const errorId = generateId();\n controller.enqueue({ type: \"text-start\", id: errorId });\n controller.enqueue({\n type: \"text-delta\",\n id: errorId,\n delta: `${toolCallStart}${currentToolCallJson}`,\n });\n controller.enqueue({ type: \"text-end\", id: errorId });\n currentToolCallJson = \"\";\n }\n\n controller.enqueue(chunk);\n return;\n }\n\n if (chunk.type !== \"text-delta\") {\n controller.enqueue(chunk);\n return;\n }\n\n buffer += chunk.delta;\n\n const publish = (text: string) => {\n if (isInsideToolCall) {\n if (currentTextId && hasEmittedTextStart) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n currentTextId = null;\n hasEmittedTextStart = false;\n }\n currentToolCallJson += text;\n } else if (text.length > 0) {\n if (!currentTextId) {\n currentTextId = generateId();\n controller.enqueue({ type: \"text-start\", id: currentTextId });\n hasEmittedTextStart = true;\n }\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId,\n delta: text,\n });\n }\n };\n\n let startIndex: number | null | undefined;\n while (\n (startIndex = getPotentialStartIndex(\n buffer,\n isInsideToolCall ? toolCallEnd : toolCallStart\n )) != null\n ) {\n const tag = isInsideToolCall ? toolCallEnd : toolCallStart;\n if (startIndex + tag.length > buffer.length) {\n break;\n }\n\n publish(buffer.slice(0, startIndex));\n buffer = buffer.slice(startIndex + tag.length);\n // Toggle state and finalize/initialize as needed\n if (!isInsideToolCall) {\n // We just consumed a start tag; begin accumulating JSON\n currentToolCallJson = \"\";\n isInsideToolCall = true;\n } else {\n // We just consumed an end tag; parse and emit tool-call\n try {\n const parsedToolCall = RJSON.parse(currentToolCallJson) as {\n name: string;\n arguments: unknown;\n };\n // close any open text block before emitting tool-call\n if (currentTextId && hasEmittedTextStart) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n currentTextId = null;\n hasEmittedTextStart = false;\n }\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: parsedToolCall.name,\n input: JSON.stringify(parsedToolCall.arguments ?? {}),\n });\n } catch {\n const errorId = generateId();\n controller.enqueue({ type: \"text-start\", id: errorId });\n controller.enqueue({\n type: \"text-delta\",\n id: errorId,\n delta: `${toolCallStart}${currentToolCallJson}${toolCallEnd}`,\n });\n controller.enqueue({ type: \"text-end\", id: errorId });\n if (options?.onError) {\n options.onError(\n \"Could not process streaming JSON tool call; emitting original text.\",\n {\n toolCall: `${toolCallStart}${currentToolCallJson}${toolCallEnd}`,\n }\n );\n }\n }\n currentToolCallJson = \"\";\n isInsideToolCall = false;\n }\n }\n\n if (!isInsideToolCall) {\n // Avoid emitting a partial start tag that may be completed in the next chunk.\n // If the buffer ends with a suffix that matches the beginning of the start tag,\n // keep that suffix in the buffer and only emit the safe prefix.\n const potentialIndex = getPotentialStartIndex(buffer, toolCallStart);\n if (\n potentialIndex != null &&\n potentialIndex + toolCallStart.length > buffer.length\n ) {\n // Emit only the safe portion before the potential (incomplete) start tag.\n publish(buffer.slice(0, potentialIndex));\n buffer = buffer.slice(potentialIndex);\n } else {\n publish(buffer);\n buffer = \"\";\n }\n }\n },\n });\n },\n\n extractToolCallSegments({ text }) {\n const startEsc = escapeRegExp(toolCallStart);\n const endEsc = escapeRegExp(toolCallEnd);\n const regex = new RegExp(`${startEsc}([\\u0000-\\uFFFF]*?)${endEsc}`, \"gs\");\n const segments: string[] = [];\n let m: RegExpExecArray | null;\n while ((m = regex.exec(text)) != null) {\n segments.push(m[0]);\n }\n return segments;\n },\n});\n","import {\n JSONSchema7,\n LanguageModelV2FunctionTool,\n LanguageModelV2ProviderDefinedTool,\n} from \"@ai-sdk/provider\";\n\n/**\n * Dynamically generates a JSON Schema using 'if/then/else' to simulate 'oneOf' behavior\n * for tool call validation. This is useful when the environment does not support 'oneOf' directly.\n *\n * The generated schema validates that the incoming data (a tool call)\n * matches exactly one of the provided tools based on its 'name' property,\n * and then applies the corresponding tool's 'parameters' schema to its 'arguments' property.\n *\n * @param tools An array of tool definitions (LanguageModelV2FunctionTool or LanguageModelV2ProviderDefinedTool).\n * Each tool must have a unique 'name' and its 'parameters' must be a valid JSON Schema.\n * @returns A JSONSchema7 object representing the dynamic validation logic.\n * @throws Error if a 'provider-defined' tool is encountered, as they are not supported by this middleware.\n */\nexport function createDynamicIfThenElseSchema(\n tools: (LanguageModelV2FunctionTool | LanguageModelV2ProviderDefinedTool)[]\n): JSONSchema7 {\n // Explicitly specify the return type as JSONSchema7\n let currentSchema: JSONSchema7 = {};\n const toolNames: string[] = [];\n\n for (let i = tools.length - 1; i >= 0; i--) {\n const tool = tools[i];\n\n if (tool.type === \"provider-defined\") {\n throw new Error(\n \"Provider-defined tools are not supported by this middleware. Please use custom tools.\"\n );\n }\n\n toolNames.unshift(tool.name);\n\n // TODO: Support for parallel calls in required or toolname state\n const toolCondition: JSONSchema7 = {\n if: {\n properties: {\n name: {\n const: tool.name,\n },\n },\n required: [\"name\"],\n },\n then: {\n properties: {\n name: {\n const: tool.name,\n },\n arguments: tool.inputSchema,\n },\n required: [\"name\", \"arguments\"],\n },\n };\n\n if (Object.keys(currentSchema).length > 0) {\n toolCondition.else = currentSchema;\n }\n\n currentSchema = toolCondition;\n }\n\n return {\n type: \"object\", // Explicitly specify type as \"object\"\n properties: {\n name: {\n type: \"string\",\n description: \"Name of the tool to call\",\n enum: toolNames,\n },\n arguments: {\n type: \"object\", // By default, arguments is also specified as object type\n description: \"Argument object to be passed to the tool\",\n },\n },\n required: [\"name\", \"arguments\"],\n ...currentSchema,\n };\n}\n","/**\n * Returns the index of the start of the searchedText in the text, or null if it\n * is not found.\n * ref: https://github.com/vercel/ai/blob/452bf12f0be9cb398d4af85a006bca13c8ce36d8/packages/ai/core/util/get-potential-start-index.ts\n */\nexport function getPotentialStartIndex(\n text: string,\n searchedText: string\n): number | null {\n // Return null immediately if searchedText is empty.\n if (searchedText.length === 0) {\n return null;\n }\n\n // Check if the searchedText exists as a direct substring of text.\n const directIndex = text.indexOf(searchedText);\n if (directIndex !== -1) {\n return directIndex;\n }\n\n // Otherwise, look for the largest suffix of \"text\" that matches\n // a prefix of \"searchedText\". We go from the end of text inward.\n for (let i = text.length - 1; i >= 0; i--) {\n const suffix = text.substring(i);\n if (searchedText.startsWith(suffix)) {\n return i;\n }\n }\n\n return null;\n}\n","export function escapeRegExp(literal: string): string {\n return literal.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","/*\n Copyright (c) 2013, Oleg Grenrus\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of the Oleg Grenrus nor the\n names of its contributors may be used to endorse or promote products\n derived from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL OLEG GRENRUS BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/*\n https://github.com/phadej/relaxed-json\n TypeScript porting based on the original code.\n Follows the license of the original code.\n*/\n\n// Custom 'some' function definition (slightly different from ES5, returns the truthy value directly)\n// :: array -> fn -> *\nfunction some<T, R>(\n array: T[],\n f: (item: T, index: number, arr: T[]) => R | undefined | false\n): R | false {\n let acc: R | false = false;\n for (let i = 0; i < array.length; i++) {\n // We assume R is a truthy type if the condition is met, or undefined/false otherwise.\n const result = f(array[i], i, array);\n acc = result === undefined ? false : result;\n if (acc) {\n return acc; // Return the actual truthy value found\n }\n }\n return acc; // Returns false if no truthy value was returned by f\n}\n\n// --- Type Definitions ---\n\n// Type for the specification of a single token type\ntype TokenSpec = {\n re: RegExp;\n // Function to process the regex match and return a RawToken\n f: (match: RegExpExecArray) => RawToken;\n};\n\n// Literal types for possible token types\ntype TokenType =\n | \"atom\" // null, true, false\n | \"number\"\n | \"string\"\n | \"[\"\n | \"]\"\n | \"{\"\n | \"}\"\n | \":\"\n | \",\"\n | \" \" // Whitespace / Comments\n | \"eof\"; // End of file\n\n// Type for a token right after regex matching, before line number is added\n// Value is optional as punctuation/whitespace tokens might not have a semantic value\ntype RawToken = {\n type: TokenType;\n match: string; // The raw matched text\n value?: unknown; // The parsed value (for strings, numbers, atoms)\n};\n\n// Type for a token including line number information\ntype Token = RawToken & {\n line: number;\n};\n\n// Type for parse warnings\ntype ParseWarning = {\n message: string;\n line: number;\n};\n\n// Type for the state object used during parsing\ntype ParseState = {\n pos: number; // Current position in the token array\n warnings: ParseWarning[];\n // Options passed to the parser\n tolerant: boolean;\n duplicate: boolean; // true = allow duplicate keys (use last value), false = reject duplicate keys with error\n reviver?: (key: string, value: unknown) => unknown; // Optional JSON reviver function\n};\n\n/**\n * Options for configuring JSON parsing behavior\n */\ntype ParseOptions = {\n /**\n * Enable relaxed JSON syntax parsing (unquoted keys, single quotes, trailing commas, comments)\n * @default true\n */\n relaxed?: boolean;\n\n /**\n * Collect parsing warnings instead of throwing immediately. Implies tolerant mode.\n * At the end of parsing, if warnings exist, throws with warning details.\n * @default false\n */\n warnings?: boolean;\n\n /**\n * Continue parsing when encountering recoverable errors, collecting warnings.\n * In strict mode (false), throws immediately on first error.\n * @default false\n */\n tolerant?: boolean;\n\n /**\n * Allow duplicate object keys in JSON.\n * - true: Allow duplicates (uses last value, like native JSON.parse)\n * - false: Reject duplicates with error (enforces JSON specification)\n * @default false\n */\n duplicate?: boolean;\n\n /**\n * Optional reviver function to transform parsed values (same as JSON.parse reviver)\n * @param key - The object key or array index\n * @param value - The parsed value\n * @returns The transformed value\n */\n reviver?: (key: string, value: unknown) => unknown;\n};\n\n// Type for options specific to the parseMany function\ntype ParseManyOpts<T> = {\n skip: TokenType[]; // Token types to skip initially\n elementParser: (tokens: Token[], state: ParseState, obj: T) => void; // Function to parse an element/pair\n elementName: string; // Name of the expected element for error messages\n endSymbol: TokenType; // The token type that marks the end of the structure (']' or '}')\n};\n\n// --- Lexer Implementation ---\n\n// Factory function to create a lexer\n// :: array tokenSpec -> fn\nfunction makeLexer(tokenSpecs: TokenSpec[]): (contents: string) => Token[] {\n // The returned lexer function\n // :: string -> array token\n return function (contents: string): Token[] {\n const tokens: Token[] = [];\n let line = 1; // Start at line 1\n\n // Helper function to find the next token in the input string\n // :: -> { raw: string, matched: RawToken } | undefined\n function findToken(): { raw: string; matched: RawToken } | undefined {\n // Use the custom 'some' function to iterate through token specifications\n const result = some(tokenSpecs, tokenSpec => {\n const m = tokenSpec.re.exec(contents); // Try to match the regex at the current position\n if (m) {\n const raw = m[0]; // The matched raw string\n contents = contents.slice(raw.length); // Consume the matched part from the input\n return {\n raw: raw,\n matched: tokenSpec.f(m), // Process the match using the spec's function\n };\n } else {\n return undefined; // No match for this spec\n }\n });\n return result === false ? undefined : result;\n }\n\n // Main lexing loop\n while (contents !== \"\") {\n const matched = findToken(); // Find the next token\n\n if (!matched) {\n // If no token spec matches, it's a syntax error\n const err = new SyntaxError(\n `Unexpected character: ${contents[0]}; input: ${contents.substr(\n 0,\n 100\n )}`\n );\n // Attach line number to the error object (standard Error doesn't have it by default)\n (err as { line?: number }).line = line;\n throw err;\n }\n\n // Add line number information to the matched token\n // We need type assertion because 'matched.matched' is initially RawToken\n const tokenWithLine = matched.matched as Token;\n tokenWithLine.line = line;\n\n // Update line number count based on newlines in the matched raw string\n line += matched.raw.replace(/[^\\n]/g, \"\").length;\n\n tokens.push(tokenWithLine); // Add the finalized token to the list\n }\n\n // Add an EOF token (useful for the parser) - Optional, depends on parser needs.\n // The current parser handles end-of-input via state.pos check, so EOF token isn't strictly needed here\n // tokens.push({ type: 'eof', match: '', value: undefined, line: line });\n\n return tokens;\n };\n}\n\n// --- Token Creation Helper Functions ---\n\n// :: tuple string string -> rawToken\nfunction fStringSingle(m: RegExpExecArray): RawToken {\n // Handles strings in single quotes, converting them to standard JSON double-quoted strings\n const content = m[1].replace(\n /([^'\\\\]|\\\\['bnrtf\\\\]|\\\\u[0-9a-fA-F]{4})/g,\n mm => {\n if (mm === '\"') {\n return '\\\\\"'; // Escape double quotes inside\n } else if (mm === \"\\\\'\") {\n return \"'\"; // Unescape escaped single quotes\n } else {\n return mm;\n }\n }\n );\n\n const match = `\"${content}\"`;\n return {\n type: \"string\",\n match: match, // The transformed, double-quoted string representation\n // Use JSON.parse on the transformed string to handle escape sequences correctly\n value: JSON.parse(match),\n };\n}\n\n// :: tuple string -> rawToken\nfunction fStringDouble(m: RegExpExecArray): RawToken {\n // Handles standard JSON double-quoted strings\n return {\n type: \"string\",\n match: m[0], // The raw matched string (including quotes)\n value: JSON.parse(m[0]), // Use JSON.parse to handle escapes and get the value\n };\n}\n\n// :: tuple string -> rawToken\nfunction fIdentifier(m: RegExpExecArray): RawToken {\n // Transforms unquoted identifiers into JSON strings\n const value = m[0];\n const match =\n '\"' +\n value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"') + // Escape backslashes and quotes\n '\"';\n return {\n type: \"string\", // Treat identifiers as strings\n value: value, // The original identifier name\n match: match, // The double-quoted string representation\n };\n}\n\n// :: tuple string -> rawToken\nfunction fComment(m: RegExpExecArray): RawToken {\n // Treats comments as whitespace, preserving only newlines\n const match = m[0].replace(/./g, c => (/\\s/.test(c) ? c : \" \"));\n return {\n type: \" \", // Represent comments as whitespace tokens\n match: match, // String containing original newlines and spaces for other chars\n value: undefined, // Comments don't have a semantic value\n };\n}\n\n// :: tuple string -> rawToken\nfunction fNumber(m: RegExpExecArray): RawToken {\n // Handles numbers (integers, floats, exponents)\n return {\n type: \"number\",\n match: m[0], // The raw matched number string\n value: parseFloat(m[0]), // Convert string to number\n };\n}\n\n// :: tuple (\"null\" | \"true\" | \"false\") -> rawToken\nfunction fKeyword(m: RegExpExecArray): RawToken {\n // Handles JSON keywords: null, true, false\n let value: null | boolean;\n switch (m[0]) {\n case \"null\":\n value = null;\n break;\n case \"true\":\n value = true;\n break;\n case \"false\":\n value = false;\n break;\n default:\n // Should be unreachable due to regex, but satisfies TypeScript exhaustiveness check\n throw new Error(`Unexpected keyword: ${m[0]}`);\n }\n return {\n type: \"atom\", // Use 'atom' type for these literals\n match: m[0], // The raw matched keyword\n value: value, // The corresponding JavaScript value\n };\n}\n\n// --- Token Specification Creation ---\n\n// :: boolean -> array tokenSpec\nfunction makeTokenSpecs(relaxed: boolean): TokenSpec[] {\n // Helper to create a simple token spec function\n // :: string -> fn\n function f(type: TokenType): (m: RegExpExecArray) => RawToken {\n // :: tuple string -> rawToken\n return function (m: RegExpExecArray): RawToken {\n // For simple tokens like punctuation, value is not needed\n return { type: type, match: m[0], value: undefined };\n };\n }\n\n // Base JSON token specifications (strict)\n let tokenSpecs: TokenSpec[] = [\n { re: /^\\s+/, f: f(\" \") }, // Whitespace\n { re: /^\\{/, f: f(\"{\") }, // Object start\n { re: /^\\}/, f: f(\"}\") }, // Object end\n { re: /^\\[/, f: f(\"[\") }, // Array start\n { re: /^\\]/, f: f(\"]\") }, // Array end\n { re: /^,/, f: f(\",\") }, // Comma separator\n { re: /^:/, f: f(\":\") }, // Key-value separator\n { re: /^(?:true|false|null)/, f: fKeyword }, // Keywords\n // Number: optional sign, digits, optional decimal part, optional exponent\n { re: /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/, f: fNumber },\n // String: double-quoted, handles escapes\n { re: /^\"(?:[^\"\\\\]|\\\\[\"bnrtf\\\\/]|\\\\u[0-9a-fA-F]{4})*\"/, f: fStringDouble },\n ];\n\n // Add relaxed syntax rules if requested\n if (relaxed) {\n tokenSpecs = tokenSpecs.concat([\n // Single-quoted strings\n {\n re: /^'((?:[^'\\\\]|\\\\['bnrtf\\\\/]|\\\\u[0-9a-fA-F]{4})*)'/,\n f: fStringSingle,\n },\n // Single-line comments (// ...)\n { re: /^\\/\\/.*?(?:\\r\\n|\\r|\\n)/, f: fComment },\n // Multi-line comments (/* ... */)\n { re: /^\\/\\*[\\s\\S]*?\\*\\//, f: fComment },\n // Unquoted identifiers (treated as strings)\n // Allows letters, numbers, _, -, +, ., *, ?, !, |, &, %, ^, /, #, \\\n { re: /^[$a-zA-Z0-9_\\-+.*?!|&%^/#\\\\]+/, f: fIdentifier },\n // Note: The order matters here. Identifiers are checked after keywords/numbers.\n ]);\n }\n\n return tokenSpecs;\n}\n\n// Create lexer instances\nconst lexer = makeLexer(makeTokenSpecs(true)); // Relaxed syntax lexer\nconst strictLexer = makeLexer(makeTokenSpecs(false)); // Strict JSON lexer\n\n// --- Parser Helper Functions ---\n\n// Find the index of the previous non-whitespace token\n// :: array token -> nat -> nat?\nfunction previousNWSToken(tokens: Token[], index: number): number | undefined {\n for (; index >= 0; index--) {\n if (tokens[index].type !== \" \") {\n return index; // Return index of the non-whitespace token\n }\n }\n return undefined; // Not found\n}\n\n// Removes trailing commas from arrays and objects in a token stream\n// :: array token -> array token\nfunction stripTrailingComma(tokens: Token[]): Token[] {\n const res: Token[] = [];\n\n tokens.forEach((token, index) => {\n // Check if the current token is a closing bracket or brace\n if (index > 0 && (token.type === \"]\" || token.type === \"}\")) {\n // Find the last non-whitespace token *before* this closing token in the result array 'res'\n const prevNWSTokenIndex = previousNWSToken(res, res.length - 1); // Look in `res`, not `tokens`!\n\n // Check if it's a comma\n if (\n prevNWSTokenIndex !== undefined &&\n res[prevNWSTokenIndex].type === \",\"\n ) {\n // Find the token *before* the comma\n const preCommaIndex = previousNWSToken(res, prevNWSTokenIndex - 1);\n\n // Ensure there *was* a token before the comma, and it wasn't an opening bracket/brace\n // This prevents removing the comma in `[,1]` or `{, \"a\":1}` which is invalid anyway\n if (\n preCommaIndex !== undefined &&\n res[preCommaIndex].type !== \"[\" &&\n res[preCommaIndex].type !== \"{\"\n ) {\n // Replace the trailing comma with a whitespace token\n res[prevNWSTokenIndex] = {\n type: \" \",\n match: \" \", // Represent as a single space\n value: undefined, // Whitespace has no value\n line: res[prevNWSTokenIndex].line, // Preserve original line number\n };\n }\n }\n }\n\n res.push(token); // Add the current token (or the original closing bracket/brace)\n });\n\n return res;\n}\n\n/**\n * Transform relaxed JSON syntax to standard JSON string\n *\n * Converts relaxed JSON features (unquoted keys, single quotes, trailing commas, comments)\n * into valid standard JSON syntax that can be parsed by native JSON.parse().\n *\n * @param text - The relaxed JSON string to transform\n * @returns A standard JSON string\n *\n * @example\n * ```typescript\n * transform('{key: \"value\", trailing: \"comma\",}')\n * // Returns: '{\"key\": \"value\", \"trailing\": \"comma\"}'\n *\n * transform(\"{'single': 'quotes'}\")\n * // Returns: '{\"single\": \"quotes\"}'\n * ```\n */\nfunction transform(text: string): string {\n // Tokenize contents using the relaxed lexer\n let tokens = lexer(text);\n\n // Remove trailing commas if present\n tokens = stripTrailingComma(tokens);\n\n // Concatenate the 'match' part of each token back into a single string\n return tokens.reduce((str, token) => {\n return str + token.match;\n }, \"\");\n}\n\n// --- Parsing Core Functions ---\n\n// Get the next token from the stream and advance the position\n// :: array parseToken -> parseState -> *\nfunction popToken(tokens: Token[], state: ParseState): Token {\n const token = tokens[state.pos];\n state.pos += 1;\n\n if (!token) {\n // If we are past the end of the token array, return an EOF token\n const lastLine = tokens.length !== 0 ? tokens[tokens.length - 1].line : 1;\n return { type: \"eof\", match: \"\", value: undefined, line: lastLine };\n }\n\n return token;\n}\n\n// Get a string representation of a token for error messages\n// :: token -> string\nfunction strToken(token: Token): string {\n switch (token.type) {\n case \"atom\":\n case \"string\":\n case \"number\":\n // Show type and the matched text (or value, match is usually better for context)\n return `${token.type} ${token.match}`;\n case \"eof\":\n return \"end-of-file\";\n default:\n // For punctuation, just show the symbol itself in quotes\n return `'${token.type}'`;\n }\n}\n\n// Expects and consumes a colon token, raises error/warning otherwise\n// :: array token -> parseState -> undefined\nfunction skipColon(tokens: Token[], state: ParseState): void {\n const colon = popToken(tokens, state);\n if (colon.type !== \":\") {\n const message = `Unexpected token: ${strToken(colon)}, expected ':'`;\n if (state.tolerant) {\n state.warnings.push({\n message: message,\n line: colon.line,\n });\n // If tolerant, put the unexpected token back by decrementing pos\n // This allows the parser to potentially recover\n state.pos -= 1;\n } else {\n const err = new SyntaxError(message);\n (err as { line?: number }).line = colon.line;\n throw err;\n }\n }\n}\n\n// Skips over any punctuation tokens until a valid data token or EOF is found.\n// Used to recover in tolerant mode or find the start of the next value.\n// :: array token -> parseState -> (array string)? -> token\nfunction skipPunctuation(\n tokens: Token[],\n state: ParseState,\n valid?: TokenType[]\n): Token {\n // Define common punctuation tokens that might appear unexpectedly\n const punctuation: TokenType[] = [\",\", \":\", \"]\", \"}\"];\n let token = popToken(tokens, state);\n\n while (true) {\n // If the token is one of the valid types we're looking for, return it\n if (valid && valid.includes(token.type)) {\n return token;\n } else if (token.type === \"eof\") {\n // If we hit EOF, return it\n return token;\n } else if (punctuation.includes(token.type)) {\n // If it's unexpected punctuation...\n const message = `Unexpected token: ${strToken(\n token\n )}, expected '[', '{', number, string or atom`;\n if (state.tolerant) {\n // In tolerant mode, record a warning and get the next token\n state.warnings.push({\n message: message,\n line: token.line,\n });\n token = popToken(tokens, state); // Continue skipping\n } else {\n // In strict mode, throw an error\n const err = new SyntaxError(message);\n (err as { line?: number }).line = token.line;\n throw err;\n }\n } else {\n // If it's not punctuation, EOF, or a specifically valid token,\n // it must be the start of a value/object/array, so return it.\n return token;\n }\n }\n}\n\n// Helper to raise an error or add a warning based on tolerant mode\n// :: parseState -> token -> string -> undefined\nfunction raiseError(state: ParseState, token: Token, message: string): void {\n if (state.tolerant) {\n state.warnings.push({\n message: message,\n line: token.line,\n });\n } else {\n const err = new SyntaxError(message);\n (err as { line?: number }).line = token.line;\n throw err;\n }\n}\n\n// Helper for common \"Unexpected token X, expected Y\" errors\n// :: parseState -> token -> string -> undefined\nfunction raiseUnexpected(\n state: ParseState,\n token: Token,\n expected: string\n): void {\n raiseError(\n state,\n token,\n `Unexpected token: ${strToken(token)}, expected ${expected}`\n );\n}\n\n// Checks for duplicate keys in objects when duplicate checking is enabled (state.duplicate = false).\n// If a duplicate key is found, raises an error (respecting tolerant mode).\n// This enforces JSON specification compliance for duplicate key handling.\n// :: parseState -> {} -> parseToken -> undefined\nfunction checkDuplicates(\n state: ParseState,\n obj: { [key: string]: unknown },\n token: Token\n): void {\n // We assume token.type is 'string' here based on where it's called in parsePair\n // If other types could be keys, this check needs adjustment.\n const key = String(token.value); // Ensure key is string for lookup\n\n // Only check for duplicates when duplicate checking is enabled\n // state.duplicate = false means \"reject duplicates\", so we check when !state.duplicate\n if (!state.duplicate && Object.prototype.hasOwnProperty.call(obj, key)) {\n raiseError(state, token, `Duplicate key: ${key}`);\n // Note: In tolerant mode, this adds a warning and continues parsing.\n // In strict mode, this throws immediately. Either way, last value wins for the duplicate key.\n }\n}\n\n// Appends a key-value pair to an object, applying the reviver function if present\n// :: parseState -> any -> any -> any -> undefined\nfunction appendPair(\n state: ParseState,\n obj: { [key: string]: unknown },\n key: string,\n value: unknown\n): void {\n // Apply reviver function if it exists\n const finalValue = state.reviver ? state.reviver(key, value) : value;\n // The reviver can return undefined to omit the key/value pair\n if (finalValue !== undefined) {\n obj[key] = finalValue;\n }\n}\n\n// Parses a key-value pair within an object\n// :: array parseToken -> parseState -> map -> undefined\nfunction parsePair(\n tokens: Token[],\n state: ParseState,\n obj: { [key: string]: unknown }\n): void {\n // Skip leading punctuation, expecting a string key (or ':' in tolerant mode)\n let token = skipPunctuation(tokens, state, [\":\", \"string\", \"number\", \"atom\"]); // Allow recovery\n let value: unknown;\n\n // --- Key Parsing ---\n if (token.type !== \"string\") {\n // Handle unexpected token where a string key was expected\n raiseUnexpected(state, token, \"string key\");\n\n // Attempt recovery in tolerant mode\n if (state.tolerant) {\n switch (token.type) {\n case \":\": // If colon found directly, assume missing key, use \"null\"\n token = {\n type: \"string\",\n value: \"null\",\n match: '\"null\"',\n line: token.line,\n };\n state.pos -= 1; // Put the colon back for skipColon\n break;\n case \"number\": // Use number as string key\n case \"atom\": // Use atom value as string key\n token = {\n type: \"string\",\n value: String(token.value),\n match: `\"${token.value}\"`,\n line: token.line,\n };\n break;\n case \"[\": // Assume missing key before an array\n case \"{\": // Assume missing key before an object\n state.pos -= 1; // Put back the bracket/brace\n value = parseAny(tokens, state); // Parse the value directly\n checkDuplicates(state, obj, {\n type: \"string\",\n value: \"null\",\n match: '\"null\"',\n line: token.line,\n }); // Check duplicate for \"null\" key\n appendPair(state, obj, \"null\", value); // Append with \"null\" key\n return; // Finished parsing this \"pair\"\n case \"eof\": // Reached end unexpectedly\n return; // Cannot recover\n default: // Other unexpected token (like comma, closing brace)\n // raiseUnexpected already issued a warning/error. Try to advance.\n // This might lead to cascading errors, but it's tolerant mode.\n return;\n }\n } else {\n // In non-tolerant mode, raiseUnexpected already threw.\n return; // Should be unreachable\n }\n }\n\n // Now we have a string token (potentially recovered)\n checkDuplicates(state, obj, token);\n const key = String(token.value); // Ensure key is string\n\n // --- Colon and Value Parsing ---\n skipColon(tokens, state); // Expect and consume ':'\n value = parseAny(tokens, state); // Parse the value recursively\n\n // --- Appending Pair ---\n appendPair(state, obj, key, value);\n}\n\n// Parses an element within an array\n// :: array parseToken -> parseState -> array -> undefined\nfunction parseElement(\n tokens: Token[],\n state: ParseState,\n arr: unknown[]\n): void {\n const key = arr.length; // Key is the current array index\n // Skip potential leading punctuation (like extra commas in tolerant mode)\n // skipPunctuation used inside parseAny handles this implicitly\n const value = parseAny(tokens, state); // Recursively parse the element value\n // Apply reviver using the index as a string key\n arr[key] = state.reviver ? state.reviver(String(key), value) : value;\n}\n\n// Parses a JSON object structure: '{' key:value, ... '}'\n// :: array parseToken -> parseState -> {}\nfunction parseObject(\n tokens: Token[],\n state: ParseState\n): { [key: string]: unknown } {\n const obj = {};\n // Call parseMany to handle the structure { pair1, pair2, ... }\n return parseMany<{ [key: string]: unknown }>(tokens, state, obj, {\n skip: [\":\", \"}\"], // Initially skip over colon or closing brace (for empty/tolerant cases)\n elementParser: parsePair, // Use parsePair to parse each key-value element\n elementName: \"string key\", // Expected element type for errors\n endSymbol: \"}\", // The closing token for an object\n });\n}\n\n// Parses a JSON array structure: '[' element, ... ']'\n// :: array parseToken -> parseState -> array\nfunction parseArray(tokens: Token[], state: ParseState): unknown[] {\n const arr: unknown[] = [];\n // Call parseMany to handle the structure [ element1, element2, ... ]\n return parseMany<unknown[]>(tokens, state, arr, {\n skip: [\"]\"], // Initially skip over closing bracket (for empty/tolerant cases)\n elementParser: parseElement, // Use parseElement to parse each array item\n elementName: \"json value\", // Expected element type for errors\n endSymbol: \"]\", // The closing token for an array\n });\n}\n\n// Generic function to parse comma-separated elements within enclosing symbols (like objects or arrays)\n// :: t : array | {} => array parseToken -> parseState -> t -> parseManyOpts -> t\nfunction parseMany<T>(\n tokens: Token[],\n state: ParseState,\n result: T,\n opts: ParseManyOpts<T>\n): T {\n // Get the first token, skipping over potential initial punctuation (defined in opts.skip)\n let token = skipPunctuation(tokens, state, opts.skip);\n\n // Handle empty structure or unexpected EOF\n if (token.type === \"eof\") {\n raiseUnexpected(state, token, `'${opts.endSymbol}' or ${opts.elementName}`);\n // Attempt recovery in tolerant mode by assuming structure was closed\n if (state.tolerant) {\n return result;\n } else {\n // Error already thrown by raiseUnexpected\n return result; // Should be unreachable\n }\n }\n\n // Check if it's immediately the end symbol (e.g., empty array/object)\n if (token.type === opts.endSymbol) {\n return result;\n }\n\n // --- Parse First Element ---\n // If it wasn't the end symbol, it should be the start of the first element.\n // Put the token back so the element parser can consume it.\n state.pos -= 1;\n opts.elementParser(tokens, state, result);\n\n // --- Parse Remaining Elements ---\n while (true) {\n // After an element, expect a comma or the end symbol\n token = popToken(tokens, state);\n\n // Validate the token\n if (token.type !== opts.endSymbol && token.type !== \",\") {\n raiseUnexpected(state, token, `',' or '${opts.endSymbol}'`);\n\n // Attempt recovery in tolerant mode\n if (state.tolerant) {\n // If it was EOF, assume the structure was implicitly closed\n if (token.type === \"eof\") {\n return result;\n }\n // Otherwise, assume a comma was missing and put the token back\n // to be parsed as the start of the next element.\n state.pos -= 1;\n // Continue to the element parsing step below (simulates a comma)\n } else {\n // Error already thrown by raiseUnexpected\n return result; // Should be unreachable\n }\n }\n\n // Handle based on token type\n switch (token.type) {\n case opts.endSymbol:\n // End of the structure found\n return result;\n\n case \",\": {\n // Comma found, parse the next element\n // Check for trailing comma before end symbol in tolerant mode\n const nextToken = tokens[state.pos]; // Peek ahead\n if (state.tolerant && nextToken && nextToken.type === opts.endSymbol) {\n // If the next token is the end symbol, treat this as a trailing comma\n raiseError(state, token, `Trailing comma before '${opts.endSymbol}'`);\n // Consume the end symbol and return\n popToken(tokens, state); // Consume the end symbol\n return result;\n }\n // Otherwise, parse the element following the comma\n opts.elementParser(tokens, state, result);\n break;\n }\n // Default case is only reachable in tolerant mode recovery above\n default:\n opts.elementParser(tokens, state, result);\n break;\n }\n }\n}\n\n// Perform final checks after parsing the main value\n// :: array parseToken -> parseState -> any -> undefined\nfunction endChecks(tokens: Token[], state: ParseState, ret: unknown): void {\n // Check if there are unparsed tokens remaining\n if (state.pos < tokens.length) {\n // In tolerant mode, skip trailing whitespace/punctuation before declaring error\n if (state.tolerant) {\n skipPunctuation(tokens, state); // Try skipping junk\n }\n // If still not at the end, raise error/warning\n if (state.pos < tokens.length) {\n raiseError(\n state,\n tokens[state.pos],\n `Unexpected token: ${strToken(tokens[state.pos])}, expected end-of-input`\n );\n }\n }\n\n // If in tolerant mode and warnings were generated, throw a summary error at the end\n if (state.tolerant && state.warnings.length > 0) {\n const message =\n state.warnings.length === 1\n ? state.warnings[0].message // Single warning message\n : `${state.warnings.length} parse warnings`; // Multiple warnings summary\n const err = new SyntaxError(message);\n // Attach details to the error object\n (err as { line?: number; warnings?: ParseWarning[]; obj?: unknown }).line =\n state.warnings[0].line; // Line of the first warning\n (\n err as { line?: number; warnings?: ParseWarning[]; obj?: unknown }\n ).warnings = state.warnings; // Array of all warnings\n (err as { line?: number; warnings?: ParseWarning[]; obj?: unknown }).obj =\n ret; // The partially parsed object (might be useful)\n throw err;\n }\n}\n\n// Main recursive parsing function for any JSON value type\n// :: array parseToken -> parseState -> boolean? -> any\nfunction parseAny(\n tokens: Token[],\n state: ParseState,\n end: boolean = false\n): unknown {\n // Skip any leading punctuation (useful for recovery in tolerant mode)\n const token = skipPunctuation(tokens, state);\n let ret: unknown; // Variable to hold the parsed result\n\n // Check for premature end of file\n if (token.type === \"eof\") {\n // Only raise error if we expected a value (not called recursively within a structure)\n // If 'end' is true, we are at the top level.\n if (end) {\n raiseUnexpected(state, token, \"json value\");\n }\n // If called recursively (e.g., after a comma), returning undefined might be handled\n // by the caller (like parseElement/parsePair). However, hitting EOF here usually\n // means an incomplete structure. Let's raise an error/warning.\n raiseUnexpected(state, token, \"json value\");\n return undefined; // Return undefined in tolerant mode after warning\n }\n\n // Parse based on the token type\n switch (token.type) {\n case \"{\": // Start of an object\n ret = parseObject(tokens, state);\n break;\n case \"[\": // Start of an array\n ret = parseArray(tokens, state);\n break;\n case \"string\": // String literal\n case \"number\": // Number literal\n case \"atom\": // Keyword literal (true, false, null)\n ret = token.value;\n break;\n default:\n // Unexpected token type to start a value\n raiseUnexpected(state, token, \"json value\");\n // Attempt recovery in tolerant mode by returning null\n if (state.tolerant) {\n ret = null;\n } else {\n // Error already thrown\n return undefined; // Should be unreachable\n }\n }\n\n // If this is the top-level call (end === true)\n if (end) {\n // Apply the top-level reviver function (key is empty string)\n ret = state.reviver ? state.reviver(\"\", ret) : ret;\n // Perform final checks for trailing tokens or accumulated warnings\n endChecks(tokens, state, ret);\n }\n\n return ret;\n}\n\n// --- Main Parse Function ---\n\n/**\n * Parse a JSON string with enhanced features beyond standard JSON.parse()\n *\n * Supports both strict JSON and relaxed JSON syntax with configurable error handling\n * and duplicate key validation.\n *\n * @param text - The JSON string to parse\n * @param optsOrReviver - Either a ParseOptions object for configuration, or a reviver function (like JSON.parse)\n *\n * @returns The parsed JavaScript value\n *\n * @throws {SyntaxError} When parsing fails in strict mode, or when warnings are collected in tolerant mode\n *\n * @example\n * ```typescript\n * // Standard JSON parsing\n * parse('{\"key\": \"value\"}')\n *\n * // Relaxed JSON with unquoted keys and trailing commas\n * parse('{key: \"value\", trailing: \"comma\",}', { relaxed: true })\n *\n * // Strict duplicate key validation\n * parse('{\"key\": 1, \"key\": 2}', { duplicate: false }) // throws error\n *\n * // Allow duplicates (uses last value)\n * parse('{\"key\": 1, \"key\": 2}', { duplicate: true }) // returns {key: 2}\n *\n * // Tolerant mode with warning collection\n * parse('malformed json', { tolerant: true, warnings: true })\n * ```\n */\nfunction parse(\n text: string,\n optsOrReviver?: ParseOptions | ((key: string, value: unknown) => unknown)\n): unknown {\n let options: ParseOptions = {};\n\n // Determine if the second argument is options object or reviver function\n if (typeof optsOrReviver === \"function\") {\n options.reviver = optsOrReviver;\n } else if (optsOrReviver !== null && typeof optsOrReviver === \"object\") {\n options = { ...optsOrReviver }; // Shallow copy options\n } else if (optsOrReviver !== undefined) {\n throw new TypeError(\n \"Second argument must be a reviver function or an options object.\"\n );\n }\n\n // Set default options\n // Default to relaxed true ONLY IF no specific mode is set AND warnings/tolerant are not explicitly false.\n // If tolerant=true or warnings=true, imply relaxed=true unless explicitly set to false.\n // If strict JSON is desired, set relaxed: false explicitly.\n if (options.relaxed === undefined) {\n if (options.warnings === true || options.tolerant === true) {\n options.relaxed = true;\n } else if (options.warnings === false && options.tolerant === false) {\n options.relaxed = false; // Strict if tolerance/warnings explicitly off\n } else {\n options.relaxed = true; // Default to relaxed otherwise\n }\n }\n // Warnings implies tolerant\n options.tolerant = options.tolerant || options.warnings || false;\n options.warnings = options.warnings || false;\n // Default duplicate key behavior: false = reject duplicates with error, true = allow (use last value)\n options.duplicate = options.duplicate ?? false;\n\n // --- Parsing Strategy ---\n\n // Strategy 1: Strict JSON, no special handling -> use native JSON.parse for speed\n // Also use if relaxed=false and warnings=false (even if reviver is present)\n if (!options.relaxed && !options.warnings && !options.tolerant) {\n // Note: native JSON.parse doesn't support duplicate key checking.\n // - If duplicate=true (allow duplicates): native JSON.parse can be used safely\n // - If duplicate=false (reject duplicates): must use custom parser for validation\n if (!options.duplicate) {\n // duplicate=false: Need custom parser to check for duplicate keys\n } else {\n // duplicate=true: Safe to use native JSON.parse (allows duplicates, uses last value)\n return JSON.parse(\n text,\n options.reviver as (key: string, value: unknown) => unknown\n );\n }\n }\n\n // Strategy 2: Use custom lexer/parser\n // This is needed for: relaxed syntax, warning collection, tolerance, or strict duplicate checking.\n\n // Lex the input text based on the 'relaxed' option\n const lexerToUse = options.relaxed ? lexer : strictLexer;\n let tokens = lexerToUse(text);\n\n // Pre-processing for relaxed mode: strip trailing commas\n if (options.relaxed) {\n tokens = stripTrailingComma(tokens);\n }\n\n // If warnings or tolerance are enabled, use the full parser logic\n if (options.warnings || options.tolerant) {\n // Filter out whitespace tokens as they are not needed by the parser\n tokens = tokens.filter(token => token.type !== \" \");\n\n // Initialize the parser state\n const state: ParseState = {\n pos: 0,\n reviver: options.reviver,\n tolerant: options.tolerant,\n duplicate: options.duplicate, // true = allow duplicate keys, false = reject duplicates\n warnings: [],\n };\n\n // Start parsing from the top level\n return parseAny(tokens, state, true);\n } else {\n // Strategy 3: Relaxed input, but no warnings/tolerance requested.\n // Transform the relaxed syntax to stricter JSON and use native JSON.parse.\n // This path is also used for strict mode (!relaxed) when duplicate checking is needed (!options.duplicate).\n tokens.reduce((str, token) => {\n return str + token.match;\n }, \"\");\n\n // We might need a custom duplicate check *before* native parse here if options.duplicate is false.\n // However, the simplest way to check duplicates is during the custom parse.\n // Let's refine the logic: if duplicate checking is needed, always use the full custom parser.\n\n // --- Refined Strategy Selection ---\n if (\n !options.relaxed &&\n !options.warnings &&\n !options.tolerant &&\n options.duplicate /* duplicate=true: allow duplicate keys */\n ) {\n // Case 1: Strict, no warnings, no tolerance, allow duplicates => Native fastest\n return JSON.parse(text, options.reviver);\n } else if (\n options.warnings ||\n options.tolerant ||\n !options.duplicate /* duplicate=false: need duplicate key validation */\n ) {\n // Case 2: Warnings OR Tolerance OR Strict Duplicate Check needed => Full custom parser\n tokens = lexerToUse(text);\n if (options.relaxed) {\n tokens = stripTrailingComma(tokens);\n }\n tokens = tokens.filter(token => token.type !== \" \"); // Always filter whitespace for custom parser\n const state: ParseState = {\n pos: 0,\n reviver: options.reviver,\n tolerant: options.tolerant || false, // Ensure boolean\n duplicate: options.duplicate, // true = allow duplicate keys, false = reject duplicates\n warnings: [],\n };\n return parseAny(tokens, state, true);\n } else {\n // Case 3: Relaxed, no warnings, no tolerance, allow duplicates => Lex, transform, native parse\n tokens = lexer(text); // Must be relaxed lexer here\n tokens = stripTrailingComma(tokens);\n const newtext = tokens.reduce((str, token) => str + token.match, \"\");\n return JSON.parse(\n newtext,\n options.reviver as (key: string, value: unknown) => unknown\n );\n }\n }\n}\n\n// --- Stringify Function (Basic Implementation) ---\n// Note: This is a basic, non-configurable stringifier, mainly for potential internal use or testing.\n// It doesn't handle replacer/space arguments like JSON.stringify.\n\n// Helper for stringifying object pairs\n// :: any -> string -> ... -> string\nfunction stringifyPair(obj: { [key: string]: unknown }, key: string): string {\n // Stringify key and value, then join with colon\n // Recursively calls stringify for the value\n return JSON.stringify(key) + \":\" + stringify(obj[key]);\n}\n\n/**\n * Convert JavaScript value to JSON string with sorted object keys\n *\n * Similar to JSON.stringify but with consistent key ordering (sorted alphabetically).\n * Handles undefined values by converting them to null.\n *\n * @param obj - The value to convert to JSON string\n * @returns A JSON string representation\n *\n * @example\n * ```typescript\n * stringify({z: 1, a: 2, m: 3})\n * // Returns: '{\"a\":2,\"m\":3,\"z\":1}' (keys sorted)\n *\n * stringify({key: undefined})\n * // Returns: '{\"key\":null}' (undefined becomes null)\n * ```\n */\nfunction stringify(obj: unknown): string {\n const type = typeof obj;\n\n // Handle primitives directly using JSON.stringify (handles escaping etc.)\n if (\n type === \"string\" ||\n type === \"number\" ||\n type === \"boolean\" ||\n obj === null\n ) {\n return JSON.stringify(obj);\n }\n\n // Handle undefined (represented as null in this basic version, JSON.stringify omits in objects/returns undefined at top level)\n if (type === \"undefined\") {\n return \"null\";\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n // Recursively stringify each element and join with commas\n const elements = obj.map(stringify).join(\",\");\n return \"[\" + elements + \"]\";\n }\n\n // Handle objects\n // Check if it's a non-null object (using constructor check is less robust than typeof + null check)\n if (type === \"object\") {\n // Already checked for null and Array above\n // Get keys, sort them for consistent output (optional, but good practice)\n const keys = Object.keys(obj as object);\n keys.sort();\n // Stringify each key-value pair and join with commas\n const pairs = keys\n .map(key => stringifyPair(obj as { [key: string]: unknown }, key))\n .join(\",\");\n return \"{\" + pairs + \"}\";\n }\n\n // Fallback for unsupported types (like functions, symbols) - represent as null\n return \"null\";\n}\n\nexport { parse, stringify, transform };\nexport type { ParseOptions };\n","import type { LanguageModelV2Content } from \"@ai-sdk/provider\";\n\nexport function unwrapJsonSchema(schema: unknown): unknown {\n if (!schema || typeof schema !== \"object\") return schema;\n const s = schema as Record<string, unknown>;\n if (s.jsonSchema && typeof s.jsonSchema === \"object\") {\n return unwrapJsonSchema(s.jsonSchema);\n }\n return schema;\n}\n\nexport function getSchemaType(schema: unknown): string | undefined {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") return undefined;\n const t: unknown = (unwrapped as Record<string, unknown>).type;\n if (typeof t === \"string\") return t;\n if (Array.isArray(t)) {\n const preferred = [\n \"object\",\n \"array\",\n \"boolean\",\n \"number\",\n \"integer\",\n \"string\",\n ];\n for (const p of preferred) if (t.includes(p)) return p;\n }\n const s = unwrapped as Record<string, unknown>;\n if (s && typeof s === \"object\" && (s.properties || s.additionalProperties)) {\n return \"object\";\n }\n if (\n s &&\n typeof s === \"object\" &&\n (s.items || (s as Record<string, unknown>).prefixItems)\n ) {\n return \"array\";\n }\n return undefined;\n}\n\nexport function coerceBySchema(value: unknown, schema?: unknown): unknown {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n if (typeof value === \"string\") {\n const s = value.trim();\n const lower = s.toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n if (/^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(s)) {\n const num = Number(s);\n if (Number.isFinite(num)) return num;\n }\n\n // Fallback: try parsing JSON-like strings when no schema info\n if (\n (s.startsWith(\"{\") && s.endsWith(\"}\")) ||\n (s.startsWith(\"[\") && s.endsWith(\"]\"))\n ) {\n try {\n const parsed = JSON.parse(s);\n // Recursively apply coercion to the parsed value without schema\n return coerceBySchema(parsed, undefined);\n } catch {\n // If parsing fails, return original value\n }\n }\n }\n\n return value;\n }\n\n const schemaType = getSchemaType(unwrapped);\n\n if (typeof value === \"string\") {\n const s = value.trim();\n if (schemaType === \"object\") {\n try {\n // Better normalization for JSON strings with newlines and indentation\n let normalized = s.replace(/'/g, '\"');\n // Handle empty object cases\n normalized = normalized.replace(/^\\{\\s*\\}$/s, \"{}\");\n\n const obj = JSON.parse(normalized);\n if (obj && typeof obj === \"object\" && !Array.isArray(obj)) {\n const props = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n const propSchema = props ? (props[k] as unknown) : undefined;\n out[k] =\n typeof propSchema === \"boolean\"\n ? v\n : coerceBySchema(v, propSchema);\n }\n return out;\n }\n } catch {\n // fallthrough\n }\n }\n if (schemaType === \"array\") {\n try {\n const normalized = s.replace(/'/g, '\"');\n const arr = JSON.parse(normalized);\n if (Array.isArray(arr)) {\n const u = unwrapped as Record<string, unknown>;\n const prefixItems = Array.isArray(\n (u as Record<string, unknown>).prefixItems\n )\n ? ((u as Record<string, unknown>).prefixItems as unknown[])\n : undefined;\n const itemsSchema = u.items as unknown;\n if (prefixItems && arr.length === prefixItems.length) {\n return arr.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return arr.map(v => coerceBySchema(v, itemsSchema));\n }\n } catch {\n const csv = s.includes(\"\\n\") ? s.split(/\\n+/) : s.split(/,\\s*/);\n const trimmed = csv.map(x => x.trim()).filter(x => x.length > 0);\n const u = unwrapped as Record<string, unknown>;\n const prefixItems = Array.isArray(\n (u as Record<string, unknown>).prefixItems\n )\n ? ((u as Record<string, unknown>).prefixItems as unknown[])\n : undefined;\n const itemsSchema = u.items as unknown;\n if (prefixItems && trimmed.length === prefixItems.length) {\n return trimmed.map((x, i) => coerceBySchema(x, prefixItems[i]));\n }\n return trimmed.map(x => coerceBySchema(x, itemsSchema));\n }\n }\n }\n\n if (\n schemaType === \"object\" &&\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n const out: Record<string, unknown> = {};\n const props = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n const propSchema = props ? (props[k] as unknown) : undefined;\n out[k] =\n typeof propSchema === \"boolean\" ? v : coerceBySchema(v, propSchema);\n }\n return out;\n }\n\n if (schemaType === \"array\") {\n const u = unwrapped as Record<string, unknown>;\n const itemsSchema = u.items as unknown;\n const prefixItems = Array.isArray(\n (u as Record<string, unknown>).prefixItems\n )\n ? ((u as Record<string, unknown>).prefixItems as unknown[])\n : undefined;\n\n if (Array.isArray(value)) {\n if (prefixItems && value.length === prefixItems.length) {\n return value.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return value.map(v => coerceBySchema(v, itemsSchema));\n }\n\n if (value && typeof value === \"object\") {\n const maybe = value as Record<string, unknown>;\n if (Object.prototype.hasOwnProperty.call(maybe, \"item\")) {\n const items = (maybe as Record<string, unknown>).item as unknown;\n const arr = Array.isArray(items) ? items : [items];\n if (prefixItems && arr.length === prefixItems.length) {\n return arr.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return arr.map(v => coerceBySchema(v, itemsSchema));\n }\n\n // Special handling for objects with array-like field names that might represent arrays\n // This commonly happens when models output <multiples><number>3</number><number>5</number></multiples>\n // which gets parsed as { \"number\": [\"3\", \"5\"] }\n const keys = Object.keys(maybe);\n\n // Check for single field that contains an array (common XML pattern)\n if (keys.length === 1) {\n const singleKey = keys[0];\n const singleValue = maybe[singleKey];\n if (Array.isArray(singleValue)) {\n const coercedArray = singleValue.map(v =>\n coerceBySchema(v, itemsSchema)\n );\n return coercedArray;\n }\n }\n\n // Check for numeric keys (traditional tuple handling)\n if (keys.length > 0 && keys.every(k => /^\\d+$/.test(k))) {\n const arr = keys\n .sort((a, b) => Number(a) - Number(b))\n .map(k => (maybe as Record<string, unknown>)[k]);\n if (prefixItems && arr.length === prefixItems.length) {\n return arr.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return arr.map(v => coerceBySchema(v, itemsSchema));\n }\n }\n\n if (\n value == null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n if (prefixItems && prefixItems.length > 0) {\n return [coerceBySchema(value, prefixItems[0])];\n }\n return [coerceBySchema(value, itemsSchema)];\n }\n }\n\n if (typeof value === \"string\") {\n const s = value.trim();\n if (schemaType === \"boolean\") {\n const lower = s.toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n }\n if (schemaType === \"number\" || schemaType === \"integer\") {\n if (/^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(s)) {\n const num = Number(s);\n if (Number.isFinite(num)) return num;\n }\n }\n }\n\n return value;\n}\n\nexport function fixToolCallWithSchema(\n part: LanguageModelV2Content,\n tools: Array<{ name?: string; inputSchema?: unknown }>\n): LanguageModelV2Content {\n if ((part as { type?: string }).type !== \"tool-call\") return part;\n const tc = part as unknown as { toolName: string; input: unknown };\n let args: unknown = {};\n if (typeof tc.input === \"string\") {\n try {\n args = JSON.parse(tc.input);\n } catch {\n return part;\n }\n } else if (tc.input && typeof tc.input === \"object\") {\n args = tc.input;\n }\n const schema = tools.find(t => t.name === tc.toolName)\n ?.inputSchema as unknown;\n const coerced = coerceBySchema(args, schema);\n return {\n ...(part as Record<string, unknown>),\n input: JSON.stringify(coerced ?? {}),\n } as LanguageModelV2Content;\n}\n\n// Wrapper retained for backward compatibility with previous internal helper name\nexport function coerceToolCallInput(\n part: LanguageModelV2Content,\n tools: Array<{ name?: string; inputSchema?: unknown }>\n): LanguageModelV2Content {\n return fixToolCallWithSchema(part, tools);\n}\n","export type DebugLevel = \"off\" | \"stream\" | \"parse\";\n\nfunction normalizeBooleanString(value: string): boolean | undefined {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n return false;\n }\n return undefined;\n}\n\nexport function getDebugLevel(): DebugLevel {\n const envVal =\n (typeof process !== \"undefined\" &&\n process.env &&\n process.env.DEBUG_PARSER_MW) ||\n \"off\";\n const envLower = String(envVal).toLowerCase();\n if (envLower === \"stream\" || envLower === \"parse\" || envLower === \"off\") {\n return envLower as DebugLevel;\n }\n const boolEnv = normalizeBooleanString(envLower);\n if (boolEnv === true) return \"stream\";\n if (envLower === \"2\") return \"parse\";\n return \"off\";\n}\n\nfunction color(code: number) {\n return (text: string) => `\\u001b[${code}m${text}\\u001b[0m`;\n}\n\nconst cGray = color(90);\nconst cYellow = color(33);\nconst cCyan = color(36);\nconst cBgBlue = color(44);\nconst cBgGreen = color(42);\nconst cInverse = color(7);\nconst cUnderline = color(4);\nconst cBold = color(1);\n\nfunction safeStringify(value: unknown): string {\n try {\n return `\\n${typeof value === \"string\" ? value : JSON.stringify(value, null, 2)}`;\n } catch {\n return String(value);\n }\n}\n\nexport function logRawChunk(part: unknown) {\n // Raw provider stream/generate output\n console.log(cGray(\"[debug:mw:raw]\"), cYellow(safeStringify(part)));\n}\n\nexport function logParsedChunk(part: unknown) {\n // Normalized middleware output\n console.log(cGray(\"[debug:mw:out]\"), cCyan(safeStringify(part)));\n}\n\nexport function logParsedSummary({\n toolCalls,\n originalText,\n}: {\n toolCalls: unknown[];\n originalText: string;\n}) {\n if (originalText) {\n const style = (() => {\n const envVal =\n (typeof process !== \"undefined\" &&\n process.env &&\n process.env.DEBUG_PARSER_MW_STYLE) ||\n \"bg\";\n\n const normalized = String(envVal).trim().toLowerCase();\n if (normalized === \"inverse\" || normalized === \"invert\")\n return \"inverse\" as const;\n if (normalized === \"underline\" || normalized === \"ul\")\n return \"underline\" as const;\n if (normalized === \"bold\") return \"bold\" as const;\n if (normalized === \"bg\" || normalized === \"background\")\n return \"bg\" as const;\n const asBool = normalizeBooleanString(normalized);\n if (asBool === true) return \"bg\" as const;\n return \"bg\" as const; // default: background highlight\n })();\n\n const highlight =\n style === \"inverse\"\n ? cInverse\n : style === \"underline\"\n ? cUnderline\n : style === \"bold\"\n ? cBold\n : style === \"bg\"\n ? cBgGreen\n : cYellow;\n\n const rendered =\n style === \"bg\" ||\n style === \"inverse\" ||\n style === \"underline\" ||\n style === \"bold\"\n ? originalText\n .split(/\\r?\\n/)\n .map(line => (line.length ? highlight(line) : line))\n .join(\"\\n\")\n : highlight(originalText);\n\n console.log(cGray(\"[debug:mw:origin]\"), `\\n${rendered}`);\n }\n\n if (toolCalls.length > 0) {\n const styledSummary = safeStringify(toolCalls)\n .split(/\\r?\\n/)\n .map(line => (line.length ? cBgBlue(line) : line))\n .join(\"\\n\");\n console.log(cGray(\"[debug:mw:summary]\"), styledSummary);\n }\n}\n","export type OnErrorFn = (\n message: string,\n metadata?: Record<string, unknown>\n) => void;\n\ntype ProviderOptionsWithOnError = {\n toolCallMiddleware?: {\n onError?: OnErrorFn;\n };\n};\n\nexport function extractOnErrorOption(\n providerOptions?: unknown\n): { onError?: OnErrorFn } | undefined {\n if (providerOptions && typeof providerOptions === \"object\") {\n const onError = (providerOptions as ProviderOptionsWithOnError)\n .toolCallMiddleware?.onError;\n return onError ? { onError } : undefined;\n }\n return undefined;\n}\n","import { ToolCallProtocol } from \"@/protocols/tool-call-protocol\";\n\nexport function isProtocolFactory(\n protocol: ToolCallProtocol | (() => ToolCallProtocol)\n): protocol is () => ToolCallProtocol {\n return typeof protocol === \"function\";\n}\n","import type { LanguageModelV2FunctionTool } from \"@ai-sdk/provider\";\n\ntype ProviderOptionsWithToolNames = {\n toolCallMiddleware?: {\n // INTERNAL: set by transform-handler to propagate tool names when providers\n // strip `params.tools`. Used as a fallback in downstream handlers.\n toolNames?: string[];\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n // INTERNAL: set by transform-handler to activate tool-choice fast-path.\n toolChoice?: { type: string };\n };\n};\n\nexport function isToolChoiceActive(params: {\n providerOptions?: {\n toolCallMiddleware?: {\n toolChoice?: { type: string };\n };\n };\n}): boolean {\n const toolChoice = params.providerOptions?.toolCallMiddleware?.toolChoice;\n return !!(\n typeof params.providerOptions === \"object\" &&\n params.providerOptions !== null &&\n typeof params.providerOptions?.toolCallMiddleware === \"object\" &&\n toolChoice &&\n typeof toolChoice === \"object\" &&\n (toolChoice.type === \"tool\" || toolChoice.type === \"required\")\n );\n}\n\nexport function getFunctionTools(params: {\n tools?: Array<LanguageModelV2FunctionTool | { type: string }>;\n providerOptions?: unknown;\n}): LanguageModelV2FunctionTool[] {\n // Prefer full tool definitions from params.tools when available\n const functionTools = (params.tools ?? []).filter(\n (t): t is LanguageModelV2FunctionTool =>\n (t as { type: string }).type === \"function\"\n );\n if (functionTools.length > 0) return functionTools;\n\n // Fallback: use tool names passed in providerOptions (name-only stubs)\n const rawToolNames =\n (params.providerOptions &&\n typeof params.providerOptions === \"object\" &&\n (params.providerOptions as ProviderOptionsWithToolNames)\n .toolCallMiddleware?.toolNames) ||\n [];\n const toStringArray = (val: unknown): string[] =>\n Array.isArray(val)\n ? (val as unknown[]).filter(\n (item): item is string => typeof item === \"string\"\n )\n : [];\n const toolNames: string[] = toStringArray(rawToolNames);\n if (toolNames.length > 0) {\n return toolNames.map((name: string) => ({\n type: \"function\",\n name,\n description: \"\",\n inputSchema: { type: \"object\" },\n }));\n }\n return [];\n}\n","import type {\n LanguageModelV2ToolCall,\n LanguageModelV2ToolResultPart,\n} from \"@ai-sdk/provider\";\n\nexport function isToolCallContent(\n content: unknown\n): content is LanguageModelV2ToolCall {\n return (\n (content as { type?: string }).type === \"tool-call\" &&\n typeof (content as { toolName?: unknown }).toolName === \"string\" &&\n // input may be a JSON string or an already-parsed object depending on provider/runtime\n (typeof (content as { input?: unknown }).input === \"string\" ||\n typeof (content as { input?: unknown }).input === \"object\")\n );\n}\n\nexport function isToolResultPart(\n content: unknown\n): content is LanguageModelV2ToolResultPart {\n const c = content as {\n type?: string;\n toolName?: unknown;\n toolCallId?: unknown;\n output?: unknown;\n };\n return (\n !!c &&\n c.type === \"tool-result\" &&\n typeof c.toolName === \"string\" &&\n typeof c.toolCallId === \"string\" &&\n \"output\" in c\n );\n}\n\nexport function hasInputProperty(obj: unknown): obj is { input?: unknown } {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"input\" in (obj as Record<string, unknown>)\n );\n}\n","import {\n LanguageModelV2Content,\n LanguageModelV2ToolCall,\n LanguageModelV2ToolResultPart,\n} from \"@ai-sdk/provider\";\nimport { generateId } from \"@ai-sdk/provider-utils\";\nimport { XMLBuilder, XMLParser } from \"fast-xml-parser\";\n\nimport { escapeRegExp, hasInputProperty } from \"@/utils\";\nimport {\n coerceBySchema,\n getSchemaType,\n unwrapJsonSchema,\n} from \"@/utils/coercion\";\n\nimport { ToolCallProtocol } from \"./tool-call-protocol\";\n\n// Controls whether the parser emits warnings when duplicate string tags are detected\nconst WARN_ON_DUPLICATE_STRING_TAGS: boolean = true;\n\n// Use shared schema type resolver from coercion utils\n\nfunction getToolSchema(\n tools: Array<{ name?: string; inputSchema?: unknown }>,\n originalSchemas: Record<string, unknown>,\n toolName: string\n): unknown {\n const original = originalSchemas[toolName];\n if (original) return original;\n const fallback = tools.find(t => t.name === toolName)?.inputSchema;\n return fallback as unknown;\n}\n\nfunction getPropertySchema(toolSchema: unknown, key: string): unknown {\n const unwrapped = unwrapJsonSchema(toolSchema);\n if (!unwrapped || typeof unwrapped !== \"object\") return undefined;\n const u = unwrapped as Record<string, unknown>;\n const props = u.properties as Record<string, unknown> | undefined;\n if (props && Object.prototype.hasOwnProperty.call(props, key)) {\n return (props as Record<string, unknown>)[key];\n }\n return undefined;\n}\n\nexport function extractRawInner(\n xmlContent: string,\n tagName: string\n): string | undefined {\n // XML Name parsing helpers (simplified per XML 1.0)\n const isNameStartChar = (ch: string): boolean => /[A-Za-z_:]/.test(ch);\n const isNameChar = (ch: string): boolean => /[A-Za-z0-9_.:-]/.test(ch);\n // Extract the raw inner content of the FIRST TOP-LEVEL occurrence of <tagName ...>...</tagName>\n // within xmlContent (which is expected to be the inside of the tool element).\n // This preserves raw markup and avoids accidentally matching nested same-named tags inside other fields.\n const len = xmlContent.length;\n const target = tagName;\n let bestStart = -1;\n let bestEnd = -1;\n let bestDepth = Number.POSITIVE_INFINITY;\n\n // Helper to advance over a quoted attribute value\n const skipQuoted = (s: string, i: number): number => {\n const quote = s[i];\n i++;\n while (i < s.length) {\n const ch = s[i];\n if (ch === \"\\\\\") {\n i += 2; // skip escaped char\n continue;\n }\n if (ch === quote) {\n return i + 1;\n }\n i++;\n }\n return i;\n };\n\n // Scan for top-level start tag of the desired name\n let i = 0;\n let depth = 0;\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1) return undefined;\n\n // emit any text; move to tag\n i = lt + 1;\n if (i >= len) return undefined;\n\n const ch = xmlContent[i];\n // Skip comments, CDATA, declarations, and processing instructions\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n i = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n i = close === -1 ? len : close + 3;\n continue;\n }\n // e.g., <!DOCTYPE ...>\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n } else if (ch === \"?\") {\n // processing instruction <? ... ?>\n const close = xmlContent.indexOf(\"?>\", i + 1);\n i = close === -1 ? len : close + 2;\n continue;\n } else if (ch === \"/\") {\n // end tag\n // read name\n let j = i + 1;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j++;\n while (j < len && isNameChar(xmlContent[j])) j++;\n }\n // move to '>'\n const gt = xmlContent.indexOf(\">\", j);\n i = gt === -1 ? len : gt + 1;\n depth = Math.max(0, depth - 1);\n continue;\n } else {\n // start tag\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j++;\n while (j < len && isNameChar(xmlContent[j])) j++;\n }\n const name = xmlContent.slice(i, j);\n\n // skip attributes to '>' while respecting quotes\n let k = j;\n let isSelfClosing = false;\n while (k < len) {\n const c = xmlContent[k];\n if (c === '\"' || c === \"'\") {\n k = skipQuoted(xmlContent, k);\n continue;\n }\n if (c === \">\") {\n break;\n }\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n isSelfClosing = true;\n k++;\n break;\n }\n k++;\n }\n const tagEnd = k; // points at '>' or at the second char of '/>'\n\n if (name === target) {\n const contentStart =\n xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n if (isSelfClosing) {\n if (depth < bestDepth) {\n bestStart = contentStart;\n bestEnd = contentStart; // empty content\n bestDepth = depth;\n if (bestDepth === 0) {\n // cannot get shallower than 0\n // continue scanning in case of errors, but we already have best\n }\n }\n } else {\n // Compute matching closing tag for this occurrence without affecting outer scan state\n let pos = contentStart;\n let sameDepth = 1;\n while (pos < len) {\n const nextLt = xmlContent.indexOf(\"<\", pos);\n if (nextLt === -1) break;\n const nx = nextLt + 1;\n if (nx >= len) break;\n const h = xmlContent[nx];\n if (h === \"!\") {\n if (xmlContent.startsWith(\"!--\", nx + 1)) {\n const close = xmlContent.indexOf(\"-->\", nx + 4);\n pos = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", nx + 1)) {\n const close = xmlContent.indexOf(\"]]>\", nx + 9);\n pos = close === -1 ? len : close + 3;\n continue;\n }\n const gt2 = xmlContent.indexOf(\">\", nx + 1);\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n } else if (h === \"?\") {\n const close = xmlContent.indexOf(\"?>\", nx + 1);\n pos = close === -1 ? len : close + 2;\n continue;\n } else if (h === \"/\") {\n // end tag\n let t = nx + 1;\n if (t < len && isNameStartChar(xmlContent[t])) {\n t++;\n while (t < len && isNameChar(xmlContent[t])) t++;\n }\n const endName = xmlContent.slice(nx + 1, t);\n const gt2 = xmlContent.indexOf(\">\", t);\n if (endName === target) {\n sameDepth--;\n if (sameDepth === 0) {\n if (depth < bestDepth) {\n bestStart = contentStart;\n bestEnd = nextLt;\n bestDepth = depth;\n if (bestDepth === 0) {\n // minimal possible depth; we can stop searching deeper candidates\n }\n }\n break;\n }\n }\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n } else {\n // start tag\n let t = nx;\n if (t < len && isNameStartChar(xmlContent[t])) {\n t++;\n while (t < len && isNameChar(xmlContent[t])) t++;\n }\n const startName = xmlContent.slice(nx, t);\n // skip attributes\n let u = t;\n let selfClose = false;\n while (u < len) {\n const cu = xmlContent[u];\n if (cu === '\"' || cu === \"'\") {\n u = skipQuoted(xmlContent, u);\n continue;\n }\n if (cu === \">\") break;\n if (cu === \"/\" && xmlContent[u + 1] === \">\") {\n selfClose = true;\n u++;\n break;\n }\n u++;\n }\n if (startName === target && !selfClose) {\n sameDepth++;\n }\n pos = xmlContent[u] === \">\" ? u + 1 : u + 1;\n continue;\n }\n }\n }\n }\n\n // Advance and adjust depth accordingly\n i = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n depth += isSelfClosing ? 0 : 1;\n continue;\n }\n }\n if (bestStart !== -1) {\n return xmlContent.slice(bestStart, bestEnd);\n }\n return undefined;\n}\n\nexport function findFirstTopLevelRange(\n xmlContent: string,\n tagName: string\n): { start: number; end: number } | undefined {\n const isNameStartChar = (ch: string): boolean => /[A-Za-z_:]/.test(ch);\n const isNameChar = (ch: string): boolean => /[A-Za-z0-9_.:-]/.test(ch);\n const len = xmlContent.length;\n const target = tagName;\n\n const skipQuoted = (s: string, i: number): number => {\n const quote = s[i];\n i++;\n while (i < s.length) {\n const ch = s[i];\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === quote) return i + 1;\n i++;\n }\n return i;\n };\n\n let i = 0;\n let depth = 0;\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1) return undefined;\n i = lt + 1;\n if (i >= len) return undefined;\n const ch = xmlContent[i];\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n i = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n i = close === -1 ? len : close + 3;\n continue;\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n } else if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n i = close === -1 ? len : close + 2;\n continue;\n } else if (ch === \"/\") {\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n depth = Math.max(0, depth - 1);\n continue;\n } else {\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j++;\n while (j < len && isNameChar(xmlContent[j])) j++;\n }\n const name = xmlContent.slice(i, j);\n let k = j;\n let isSelfClosing = false;\n while (k < len) {\n const c = xmlContent[k];\n if (c === '\"' || c === \"'\") {\n k = skipQuoted(xmlContent, k);\n continue;\n }\n if (c === \">\") break;\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n isSelfClosing = true;\n k++;\n break;\n }\n k++;\n }\n const tagEnd = k;\n if (depth === 0 && name === target) {\n const contentStart =\n xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n if (isSelfClosing) return { start: contentStart, end: contentStart };\n // find matching close\n let pos = contentStart;\n let sameDepth = 1;\n while (pos < len) {\n const nextLt = xmlContent.indexOf(\"<\", pos);\n if (nextLt === -1) break;\n const nx = nextLt + 1;\n if (nx >= len) break;\n const h = xmlContent[nx];\n if (h === \"!\") {\n if (xmlContent.startsWith(\"!--\", nx + 1)) {\n const close = xmlContent.indexOf(\"-->\", nx + 4);\n pos = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", nx + 1)) {\n const close = xmlContent.indexOf(\"]]>\", nx + 9);\n pos = close === -1 ? len : close + 3;\n continue;\n }\n const gt2 = xmlContent.indexOf(\">\", nx + 1);\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n } else if (h === \"?\") {\n const close = xmlContent.indexOf(\"?>\", nx + 1);\n pos = close === -1 ? len : close + 2;\n continue;\n } else if (h === \"/\") {\n let t = nx + 1;\n if (t < len && isNameStartChar(xmlContent[t])) {\n t++;\n while (t < len && isNameChar(xmlContent[t])) t++;\n }\n const endName = xmlContent.slice(nx + 1, t);\n const gt2 = xmlContent.indexOf(\">\", t);\n if (endName === target) {\n sameDepth--;\n if (sameDepth === 0) {\n return { start: contentStart, end: nextLt };\n }\n }\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n } else {\n let t = nx;\n if (t < len && isNameStartChar(xmlContent[t])) {\n t++;\n while (t < len && isNameChar(xmlContent[t])) t++;\n }\n // skip attributes\n let u = t;\n let selfClose = false;\n while (u < len) {\n const cu = xmlContent[u];\n if (cu === '\"' || cu === \"'\") {\n u = skipQuoted(xmlContent, u);\n continue;\n }\n if (cu === \">\") break;\n if (cu === \"/\" && xmlContent[u + 1] === \">\") {\n selfClose = true;\n u++;\n break;\n }\n u++;\n }\n if (!selfClose) {\n // nested tag\n }\n pos = xmlContent[u] === \">\" ? u + 1 : u + 1;\n continue;\n }\n }\n return undefined;\n }\n i = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n depth += isSelfClosing ? 0 : 1;\n continue;\n }\n }\n return undefined;\n}\n\nexport function countTagOccurrences(\n xmlContent: string,\n tagName: string,\n excludeRanges?: Array<{ start: number; end: number }>,\n skipFirst: boolean = true\n): number {\n const isNameStartChar = (ch: string): boolean => /[A-Za-z_:]/.test(ch);\n const isNameChar = (ch: string): boolean => /[A-Za-z0-9_.:-]/.test(ch);\n const len = xmlContent.length;\n const target = tagName;\n\n const skipQuoted = (s: string, i: number): number => {\n const quote = s[i];\n i++;\n while (i < s.length) {\n const ch = s[i];\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === quote) return i + 1;\n i++;\n }\n return i;\n };\n\n let i = 0;\n let count = 0;\n const isExcluded = (pos: number): boolean => {\n if (!excludeRanges || excludeRanges.length === 0) return false;\n for (const r of excludeRanges) {\n if (pos >= r.start && pos < r.end) return true;\n }\n return false;\n };\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1) break;\n i = lt + 1;\n if (i >= len) break;\n const ch = xmlContent[i];\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n i = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n i = close === -1 ? len : close + 3;\n continue;\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n } else if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n i = close === -1 ? len : close + 2;\n continue;\n } else if (ch === \"/\") {\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n } else {\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j++;\n while (j < len && isNameChar(xmlContent[j])) j++;\n }\n const name = xmlContent.slice(i, j);\n let k = j;\n while (k < len) {\n const c = xmlContent[k];\n if (c === '\"' || c === \"'\") {\n k = skipQuoted(xmlContent, k);\n continue;\n }\n if (c === \">\") break;\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n k++;\n break;\n }\n k++;\n }\n if (name === target && !isExcluded(lt)) {\n if (skipFirst) {\n // Skip the first occurrence only once\n skipFirst = false;\n } else {\n count++;\n }\n }\n i = k + 1;\n continue;\n }\n }\n return count;\n}\n\n// Shared helper to process parsed XML arguments according to schema and heuristics\n// exported for internal use (test)\nexport function processParsedArgs(\n parsedArgs: Record<string, unknown>,\n toolSchema: unknown,\n toolContent: string,\n toolName: string,\n options?: {\n onError?: (message: string, meta?: Record<string, unknown>) => void;\n }\n): { args: Record<string, unknown>; cancelToolCall: boolean } {\n const args: Record<string, unknown> = {};\n let cancelToolCall = false;\n // Precompute set of string-typed property names from the schema\n const stringTypedProps: Set<string> = (() => {\n const set = new Set<string>();\n const unwrapped = unwrapJsonSchema(toolSchema);\n if (unwrapped && typeof unwrapped === \"object\") {\n const u = unwrapped as Record<string, unknown>;\n const props = u.properties as Record<string, unknown> | undefined;\n if (props && typeof props === \"object\") {\n for (const key of Object.keys(props)) {\n const t = getSchemaType((props as Record<string, unknown>)[key]);\n if (t === \"string\") set.add(key);\n }\n }\n }\n return set;\n })();\n\n for (const k of Object.keys(parsedArgs || {})) {\n const v = parsedArgs[k];\n let val: unknown = v;\n\n // If schema says this property is a string, prefer raw inner content\n const propSchema = getPropertySchema(toolSchema, k);\n const propType = getSchemaType(propSchema);\n if (propType === \"string\" && !Array.isArray(v)) {\n // Build exclusion ranges for other string-typed properties so that\n // occurrences of <k> nested inside other string fields' raw content\n // don't count as duplicates.\n const excludeRanges: Array<{ start: number; end: number }> = [];\n for (const other of stringTypedProps) {\n if (other === k) continue;\n const range = findFirstTopLevelRange(toolContent, other);\n if (range) excludeRanges.push(range);\n }\n const occurrences = countTagOccurrences(\n toolContent,\n k,\n excludeRanges,\n true\n );\n if (occurrences > 0) {\n if (WARN_ON_DUPLICATE_STRING_TAGS) {\n options?.onError?.(\n `Duplicate string tags for <${k}> detected; cancelling tool call`,\n {\n toolName,\n toolCall: `<${toolName}>${toolContent}</${toolName}>`,\n }\n );\n }\n cancelToolCall = true;\n break;\n }\n const raw = extractRawInner(toolContent, k);\n if (typeof raw === \"string\") {\n args[k] = raw; // do not trim or coerce raw string\n continue;\n }\n }\n\n // Handle text content extraction\n if (\n v &&\n typeof v === \"object\" &&\n Object.prototype.hasOwnProperty.call(v, \"#text\")\n ) {\n val = (v as Record<string, unknown>)?.[\"#text\"];\n }\n\n // Heuristic array parsing for multiple tags with same name\n if (Array.isArray(v)) {\n if (propType === \"string\") {\n const mapped = v.map(item => {\n if (\n item &&\n typeof item === \"object\" &&\n Object.prototype.hasOwnProperty.call(item, \"#text\")\n ) {\n const textVal = (item as Record<string, unknown>)?.[\"#text\"];\n return typeof textVal === \"string\" ? textVal : String(textVal);\n }\n return typeof item === \"string\" ? item : String(item);\n });\n\n if (mapped.length > 1 && WARN_ON_DUPLICATE_STRING_TAGS) {\n options?.onError?.(\n `Duplicate string tags for <${k}> detected; cancelling tool call`,\n {\n toolName,\n toolCall: `<${toolName}>${toolContent}</${toolName}>`,\n }\n );\n }\n\n if (mapped.length > 1) {\n cancelToolCall = true;\n break;\n } else {\n args[k] = mapped[0] ?? \"\";\n continue;\n }\n } else {\n val = v.map(item => {\n if (\n item &&\n typeof item === \"object\" &&\n Object.prototype.hasOwnProperty.call(item, \"#text\")\n ) {\n const textVal = (item as Record<string, unknown>)?.[\"#text\"];\n return typeof textVal === \"string\" ? textVal.trim() : textVal;\n }\n return typeof item === \"string\" ? item.trim() : item;\n });\n }\n }\n // Heuristic tuple/array parsing for various XML patterns\n else if (\n v &&\n typeof v === \"object\" &&\n !Object.prototype.hasOwnProperty.call(v, \"#text\")\n ) {\n const obj = v as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n // Check for 'item' key pattern (common XML array pattern)\n if (keys.length === 1 && keys[0] === \"item\") {\n const itemValue = obj.item as unknown;\n if (Array.isArray(itemValue)) {\n val = itemValue.map(item => {\n let currentVal: unknown = item;\n if (\n item &&\n typeof item === \"object\" &&\n Object.prototype.hasOwnProperty.call(item, \"#text\")\n ) {\n currentVal = (item as Record<string, unknown>)?.[\"#text\"];\n }\n const trimmed =\n typeof currentVal === \"string\" ? currentVal.trim() : currentVal;\n // Try to convert to number if it looks like one\n if (\n typeof trimmed === \"string\" &&\n /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(trimmed)\n ) {\n const num = Number(trimmed);\n if (Number.isFinite(num)) return num;\n }\n return trimmed;\n });\n } else {\n const trimmed =\n typeof itemValue === \"string\" ? itemValue.trim() : itemValue;\n if (\n typeof trimmed === \"string\" &&\n /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(trimmed)\n ) {\n const num = Number(trimmed);\n val = Number.isFinite(num) ? num : trimmed;\n } else {\n val = trimmed;\n }\n }\n }\n // Check if all keys are numeric indices (0, 1, 2, ...) and consecutive\n else {\n let isIndexedTuple = false;\n if (keys.length > 0 && keys.every(key => /^\\d+$/.test(key))) {\n const indices = keys.map(k => parseInt(k, 10)).sort((a, b) => a - b);\n isIndexedTuple =\n indices[0] === 0 && indices.every((val, idx) => val === idx);\n }\n\n if (isIndexedTuple) {\n // Convert indexed object to array (tuple)\n const sortedKeys = keys.sort(\n (a, b) => parseInt(a, 10) - parseInt(b, 10)\n );\n val = sortedKeys.map(key => {\n const item = obj[key];\n if (\n item &&\n typeof item === \"object\" &&\n Object.prototype.hasOwnProperty.call(item, \"#text\")\n ) {\n const textVal = (item as Record<string, unknown>)?.[\"#text\"];\n return typeof textVal === \"string\" ? textVal.trim() : textVal;\n }\n return typeof item === \"string\" ? item.trim() : item;\n });\n } else {\n val = v;\n }\n }\n }\n\n args[k] = typeof val === \"string\" ? val.trim() : val;\n }\n\n return { args, cancelToolCall };\n}\n\nexport const morphXmlProtocol = (): ToolCallProtocol => ({\n formatTools({ tools, toolSystemPromptTemplate }) {\n const toolsForPrompt = (tools || []).map(tool => ({\n name: tool.name,\n description: tool.description,\n parameters: unwrapJsonSchema(tool.inputSchema),\n }));\n return toolSystemPromptTemplate(JSON.stringify(toolsForPrompt));\n },\n\n formatToolCall(toolCall: LanguageModelV2ToolCall): string {\n const builder = new XMLBuilder({ format: true, suppressEmptyNode: true });\n // Some providers pass JSON string; some runtime paths may provide an object\n let args: unknown = {};\n const inputValue = hasInputProperty(toolCall) ? toolCall.input : undefined;\n\n if (typeof inputValue === \"string\") {\n try {\n args = JSON.parse(inputValue);\n } catch {\n args = inputValue;\n }\n } else {\n args = inputValue;\n }\n const xmlContent = builder.build({\n [toolCall.toolName]: args,\n });\n return xmlContent;\n },\n\n formatToolResponse(toolResult: LanguageModelV2ToolResultPart): string {\n const builder = new XMLBuilder({ format: true });\n const xmlContent = builder.build({\n tool_response: {\n tool_name: toolResult.toolName,\n result: toolResult.output,\n },\n });\n return xmlContent;\n },\n\n parseGeneratedText({ text, tools, options }) {\n // Get original schemas from provider options if available\n const originalSchemas =\n (options as { originalToolSchemas?: Record<string, unknown> } | undefined)\n ?.originalToolSchemas || {};\n\n // Optional debug\n // Schema-based coercion: convert string primitives according to tool JSON schema types\n\n const toolNames = tools.map(t => t.name).filter(name => name != null);\n if (toolNames.length === 0) {\n return [{ type: \"text\", text }];\n }\n\n const toolNamesPattern = toolNames.map(n => escapeRegExp(n)).join(\"|\");\n const toolCallRegex = new RegExp(\n String.raw`<(${toolNamesPattern})>([\\s\\S]*?)<\\/\\1>`,\n \"g\"\n );\n\n const processedElements: LanguageModelV2Content[] = [];\n let currentIndex = 0;\n let match;\n\n while ((match = toolCallRegex.exec(text)) !== null) {\n const startIndex = match.index;\n const toolName = match[1];\n const toolContent = match[2].trim();\n\n if (startIndex > currentIndex) {\n const textSegment = text.substring(currentIndex, startIndex);\n if (textSegment.trim()) {\n processedElements.push({ type: \"text\", text: textSegment });\n }\n }\n\n try {\n const parser = new XMLParser({\n ignoreAttributes: false,\n parseTagValue: false,\n ignoreDeclaration: true,\n textNodeName: \"#text\",\n });\n const parsedArgs =\n parser.parse(`<root>${toolContent}</root>`)?.root || {};\n\n // Determine tool schema and process args via shared helper\n const toolSchema = getToolSchema(tools, originalSchemas, toolName);\n const { args, cancelToolCall } = processParsedArgs(\n parsedArgs,\n toolSchema,\n toolContent,\n toolName,\n options\n );\n\n if (cancelToolCall) {\n const originalCallText = match[0];\n options?.onError?.(\n `Duplicate string tags detected; cancelling tool call`,\n { toolCall: originalCallText, toolName }\n );\n processedElements.push({ type: \"text\", text: originalCallText });\n } else {\n // Use original schema if available, fallback to transformed schema\n // INTERNAL: `originalToolSchemas` is used to propagate the provider's\n // untouched tool schemas for better coercion. Not part of public API.\n const coercedArgs = coerceBySchema(args, toolSchema) as Record<\n string,\n unknown\n >;\n\n processedElements.push({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName,\n input: JSON.stringify(coercedArgs),\n });\n }\n } catch (error) {\n const message = `Could not process XML tool call, keeping original text: ${match[0]}`;\n options?.onError?.(message, { toolCall: match[0], toolName, error });\n processedElements.push({ type: \"text\", text: match[0] });\n }\n\n currentIndex = startIndex + match[0].length;\n }\n\n if (currentIndex < text.length) {\n const remainingText = text.substring(currentIndex);\n if (remainingText.trim()) {\n processedElements.push({ type: \"text\", text: remainingText });\n }\n }\n\n return processedElements;\n },\n\n createStreamParser({ tools, options }) {\n // Get original schemas from options if available\n const originalSchemas =\n (options as { originalToolSchemas?: Record<string, unknown> } | undefined)\n ?.originalToolSchemas || {};\n const toolNames = tools.map(t => t.name).filter(name => name != null);\n let buffer = \"\";\n let currentToolCall: { name: string; content: string } | null = null;\n let currentTextId: string | null = null;\n\n const flushText = (\n controller: TransformStreamDefaultController,\n text?: string\n ) => {\n const content = text ?? buffer;\n if (content) {\n if (!currentTextId) {\n currentTextId = generateId();\n controller.enqueue({ type: \"text-start\", id: currentTextId });\n }\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId,\n delta: content,\n });\n // Only clear the internal buffer when we are flushing the buffer itself.\n // When flushing an explicit slice (textBeforeTag), keep buffer intact so\n // subsequent substring operations use the original indices.\n if (text === undefined) {\n buffer = \"\";\n }\n }\n\n if (currentTextId && !text) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n currentTextId = null;\n }\n };\n\n return new TransformStream({\n transform(chunk, controller) {\n if (chunk.type !== \"text-delta\") {\n if (buffer) flushText(controller);\n controller.enqueue(chunk);\n return;\n }\n\n buffer += chunk.delta;\n\n while (true) {\n if (currentToolCall) {\n const endTag = `</${currentToolCall.name}>`;\n const endTagIndex = buffer.indexOf(endTag);\n\n if (endTagIndex !== -1) {\n const toolContent = buffer.substring(0, endTagIndex);\n buffer = buffer.substring(endTagIndex + endTag.length);\n\n try {\n const parser = new XMLParser({\n ignoreAttributes: false,\n parseTagValue: false,\n ignoreDeclaration: true,\n textNodeName: \"#text\",\n });\n const parsedArgs =\n parser.parse(`<root>${toolContent}</root>`)?.root || {};\n\n const toolSchema = getToolSchema(\n tools,\n originalSchemas,\n currentToolCall!.name\n );\n const { args, cancelToolCall } = processParsedArgs(\n parsedArgs,\n toolSchema,\n toolContent,\n currentToolCall!.name,\n options\n );\n\n if (cancelToolCall) {\n const originalCallText = `<${currentToolCall.name}>${toolContent}</${currentToolCall.name}>`;\n if (options?.onError) {\n options.onError(\n \"Duplicate string tags detected; cancelling tool call\",\n {\n toolCall: originalCallText,\n toolName: currentToolCall.name,\n }\n );\n }\n flushText(controller, originalCallText);\n } else {\n // Use original schema if available, fallback to transformed schema\n const coercedArgs = coerceBySchema(\n args,\n toolSchema\n ) as Record<string, unknown>;\n\n flushText(controller);\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: currentToolCall.name,\n input: JSON.stringify(coercedArgs),\n });\n }\n } catch {\n const originalCallText = `<${currentToolCall.name}>${toolContent}${endTag}`;\n if (options?.onError) {\n options.onError(\n \"Could not process streaming XML tool call; emitting original text.\",\n {\n toolCall: originalCallText,\n toolName: currentToolCall.name,\n }\n );\n }\n flushText(controller, originalCallText);\n }\n currentToolCall = null;\n } else {\n break;\n }\n } else {\n let earliestStartTagIndex = -1;\n let earliestToolName = \"\";\n\n if (toolNames.length > 0) {\n for (const name of toolNames) {\n const startTag = `<${name}>`;\n const index = buffer.indexOf(startTag);\n if (\n index !== -1 &&\n (earliestStartTagIndex === -1 ||\n index < earliestStartTagIndex)\n ) {\n earliestStartTagIndex = index;\n earliestToolName = name;\n }\n }\n }\n\n if (earliestStartTagIndex !== -1) {\n const textBeforeTag = buffer.substring(0, earliestStartTagIndex);\n flushText(controller, textBeforeTag);\n\n const startTag = `<${earliestToolName}>`;\n buffer = buffer.substring(\n earliestStartTagIndex + startTag.length\n );\n currentToolCall = { name: earliestToolName, content: \"\" };\n } else {\n break;\n }\n }\n }\n },\n flush(controller) {\n if (currentToolCall) {\n const unfinishedCall = `<${currentToolCall.name}>${buffer}`;\n flushText(controller, unfinishedCall);\n } else if (buffer) {\n flushText(controller);\n }\n\n if (currentTextId) {\n controller.enqueue({ type: \"text-end\", id: currentTextId });\n }\n },\n });\n },\n\n extractToolCallSegments({ text, tools }) {\n const toolNames = tools.map(t => t.name).filter(Boolean) as string[];\n if (toolNames.length === 0) return [];\n const names = toolNames.map(n => escapeRegExp(String(n))).join(\"|\");\n if (!names) return [];\n const regex = new RegExp(`<(${names})>[\\\\s\\\\S]*?<\\\\/\\\\1>`, \"g\");\n const segments: string[] = [];\n let m: RegExpExecArray | null;\n while ((m = regex.exec(text)) != null) {\n segments.push(m[0]);\n }\n return segments;\n },\n});\n","import type {\n LanguageModelV2,\n LanguageModelV2Content,\n LanguageModelV2FunctionTool,\n LanguageModelV2ToolCall,\n} from \"@ai-sdk/provider\";\nimport { generateId } from \"@ai-sdk/provider-utils\";\n\nimport { ToolCallProtocol } from \"./protocols/tool-call-protocol\";\nimport {\n extractOnErrorOption,\n getFunctionTools,\n isToolChoiceActive,\n} from \"./utils\";\nimport { coerceToolCallInput } from \"./utils/coercion\";\nimport {\n getDebugLevel,\n logParsedChunk,\n logParsedSummary,\n logRawChunk,\n} from \"./utils/debug\";\n\ntype WrapGenerateParams = {\n prompt?: unknown;\n tools?: Array<LanguageModelV2FunctionTool | { type: string }>;\n providerOptions?: unknown;\n};\n\nexport async function wrapGenerate({\n protocol,\n doGenerate,\n params,\n}: {\n protocol: ToolCallProtocol;\n doGenerate: () => ReturnType<LanguageModelV2[\"doGenerate\"]>;\n params: WrapGenerateParams & {\n providerOptions?: {\n toolCallMiddleware?: {\n toolChoice?: { type: string };\n };\n };\n };\n}) {\n if (isToolChoiceActive(params)) {\n const result = await doGenerate();\n let parsed: { name?: string; arguments?: Record<string, unknown> } = {};\n const first = result.content?.[0];\n if (first && first.type === \"text\") {\n const debugLevel = getDebugLevel();\n if (debugLevel === \"parse\") {\n logRawChunk(first.text);\n }\n try {\n parsed = JSON.parse(first.text);\n } catch (error) {\n const options = extractOnErrorOption(params.providerOptions);\n options?.onError?.(\n \"Failed to parse toolChoice JSON from generated model output\",\n {\n text: first.text,\n error: error instanceof Error ? error.message : String(error),\n }\n );\n parsed = {};\n }\n // Defer summary logging until toolCall object is constructed below\n }\n\n const toolCall: LanguageModelV2ToolCall = {\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: parsed.name || \"unknown\",\n input: JSON.stringify(parsed.arguments || {}),\n };\n\n // Use the same parse-summary shape as streaming path\n const debugLevelToolChoice = getDebugLevel();\n const originText = first && first.type === \"text\" ? first.text : \"\";\n if (debugLevelToolChoice === \"parse\") {\n logParsedSummary({ toolCalls: [toolCall], originalText: originText });\n }\n\n return {\n ...result,\n content: [toolCall],\n };\n }\n\n const result = await doGenerate();\n\n if (result.content.length === 0) {\n return result;\n }\n\n const parsed = result.content.flatMap(contentItem => {\n if (contentItem.type !== \"text\") {\n return [contentItem];\n }\n const debugLevel = getDebugLevel();\n if (debugLevel === \"stream\") {\n // For generate flow with stream debug we show raw text and parsed parts\n logRawChunk(contentItem.text);\n }\n return protocol.parseGeneratedText({\n text: contentItem.text,\n tools: getFunctionTools(params),\n options: {\n ...extractOnErrorOption(params.providerOptions),\n ...((\n params.providerOptions as { toolCallMiddleware?: unknown } | undefined\n )?.toolCallMiddleware as Record<string, unknown>),\n },\n });\n });\n const tools = getFunctionTools(params);\n const newContent = parsed.map(part =>\n coerceToolCallInput(part as LanguageModelV2Content, tools)\n );\n\n const debugLevel = getDebugLevel();\n if (debugLevel === \"stream\") {\n newContent.forEach(part => logParsedChunk(part));\n }\n if (debugLevel === \"parse\") {\n const allText = result.content\n .filter(\n (c): c is Extract<LanguageModelV2Content, { type: \"text\" }> =>\n c.type === \"text\"\n )\n .map(c => c.text)\n .join(\"\\n\\n\");\n const segments = protocol.extractToolCallSegments\n ? protocol.extractToolCallSegments({ text: allText, tools })\n : [];\n const originalText = segments.join(\"\\n\\n\");\n const toolCalls = newContent.filter(\n (p): p is Extract<LanguageModelV2Content, { type: \"tool-call\" }> =>\n (p as LanguageModelV2Content).type === \"tool-call\"\n );\n logParsedSummary({ toolCalls, originalText });\n }\n\n return {\n ...result,\n content: newContent,\n };\n}\n","import type {\n LanguageModelV2,\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2FunctionTool,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n} from \"@ai-sdk/provider\";\nimport { generateId } from \"@ai-sdk/provider-utils\";\n\nimport { ToolCallProtocol } from \"./protocols/tool-call-protocol\";\nimport {\n extractOnErrorOption,\n getFunctionTools,\n isToolChoiceActive,\n} from \"./utils\";\nimport {\n getDebugLevel,\n logParsedChunk,\n logParsedSummary,\n logRawChunk,\n} from \"./utils/debug\";\n\ntype WrapStreamParams = Parameters<typeof isToolChoiceActive>[0] & {\n tools?: Array<LanguageModelV2FunctionTool | { type: string }>;\n providerOptions?: unknown;\n};\n\nexport async function wrapStream({\n protocol,\n doStream,\n doGenerate,\n params,\n}: {\n protocol: ToolCallProtocol;\n doStream: () => ReturnType<LanguageModelV2[\"doStream\"]>;\n doGenerate: () => ReturnType<LanguageModelV2[\"doGenerate\"]>;\n params: WrapStreamParams;\n}) {\n if (isToolChoiceActive(params)) {\n return toolChoiceStream({\n doGenerate,\n options: extractOnErrorOption(params.providerOptions),\n });\n }\n\n const { stream, ...rest } = await doStream();\n\n const debugLevel = getDebugLevel();\n const tools = getFunctionTools(params);\n const options = {\n ...extractOnErrorOption(params.providerOptions),\n ...((params.providerOptions as { toolCallMiddleware?: unknown } | undefined)\n ?.toolCallMiddleware as Record<string, unknown>),\n };\n\n if (debugLevel === \"off\") {\n return {\n stream: stream.pipeThrough(\n protocol.createStreamParser({\n tools,\n options,\n })\n ),\n ...rest,\n };\n }\n\n if (debugLevel === \"stream\") {\n const withRawTap = stream.pipeThrough(\n new TransformStream<LanguageModelV2StreamPart, LanguageModelV2StreamPart>(\n {\n transform(part, controller) {\n logRawChunk(part);\n controller.enqueue(part);\n },\n }\n )\n );\n\n const parsed = withRawTap.pipeThrough(\n protocol.createStreamParser({\n tools,\n options,\n })\n );\n\n const withParsedTap = parsed.pipeThrough(\n new TransformStream<LanguageModelV2StreamPart, LanguageModelV2StreamPart>(\n {\n transform(part, controller) {\n logParsedChunk(part);\n controller.enqueue(part);\n },\n }\n )\n );\n\n return {\n stream: withParsedTap,\n ...rest,\n };\n }\n\n // debugLevel === \"parse\"\n let fullRawText = \"\";\n const withRawTap = stream.pipeThrough(\n new TransformStream<LanguageModelV2StreamPart, LanguageModelV2StreamPart>({\n transform(part, controller) {\n if (part.type === \"text-delta\") {\n const delta = (\n part as Extract<LanguageModelV2StreamPart, { type: \"text-delta\" }>\n ).delta as string | undefined;\n if (typeof delta === \"string\" && delta.length > 0) {\n fullRawText += delta;\n }\n }\n controller.enqueue(part);\n },\n })\n );\n\n const parsed = withRawTap.pipeThrough(\n protocol.createStreamParser({\n tools,\n options,\n })\n );\n\n const withSummary = parsed.pipeThrough(\n new TransformStream<LanguageModelV2StreamPart, LanguageModelV2StreamPart>({\n transform: (() => {\n const parsedToolCalls: LanguageModelV2StreamPart[] = [];\n return (\n part: LanguageModelV2StreamPart,\n controller: TransformStreamDefaultController<LanguageModelV2StreamPart>\n ) => {\n if (part.type === \"tool-call\") {\n parsedToolCalls.push(part);\n }\n if (part.type === \"finish\") {\n try {\n const segments = protocol.extractToolCallSegments\n ? protocol.extractToolCallSegments({\n text: fullRawText,\n tools,\n })\n : [];\n const origin = segments.join(\"\\n\\n\");\n logParsedSummary({\n toolCalls: parsedToolCalls,\n originalText: origin,\n });\n } catch {\n // ignore logging failures\n }\n }\n controller.enqueue(part);\n };\n })(),\n })\n );\n\n return {\n stream: withSummary,\n ...rest,\n };\n}\n\nexport async function toolChoiceStream({\n doGenerate,\n options,\n}: {\n doGenerate: () => ReturnType<LanguageModelV2[\"doGenerate\"]>;\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n}) {\n const result = await doGenerate();\n\n // Assume result.content[0] contains tool-call information (JSON)\n let toolJson: { name?: string; arguments?: Record<string, unknown> } = {};\n if (\n result?.content &&\n result.content.length > 0 &&\n result.content[0]?.type === \"text\"\n ) {\n try {\n toolJson = JSON.parse(result.content[0].text);\n } catch (error) {\n options?.onError?.(\n \"Failed to parse toolChoice JSON from streamed model output\",\n {\n text: result.content[0].text,\n error: error instanceof Error ? error.message : String(error),\n }\n );\n toolJson = {};\n }\n }\n\n const toolCallChunk: LanguageModelV2StreamPart = {\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: toolJson.name || \"unknown\",\n input: JSON.stringify(toolJson.arguments || {}),\n };\n\n const finishChunk: LanguageModelV2StreamPart = {\n type: \"finish\",\n usage:\n result?.usage ||\n // TODO: If possible, try to return a certain amount of LLM usage.\n ({\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n } as LanguageModelV2Usage),\n finishReason: \"tool-calls\" as LanguageModelV2FinishReason,\n };\n\n const stream = new ReadableStream<LanguageModelV2StreamPart>({\n start(controller) {\n controller.enqueue(toolCallChunk);\n controller.enqueue(finishChunk);\n controller.close();\n },\n });\n\n const debugLevel = getDebugLevel();\n const firstText =\n (result?.content &&\n result.content[0] &&\n (result.content[0] as Extract<LanguageModelV2Content, { type: \"text\" }>)\n .type === \"text\" &&\n (result.content[0] as Extract<LanguageModelV2Content, { type: \"text\" }>)\n .text) ||\n \"\";\n const streamWithSummary =\n debugLevel === \"parse\"\n ? stream.pipeThrough(\n new TransformStream<\n LanguageModelV2StreamPart,\n LanguageModelV2StreamPart\n >({\n transform(part, controller) {\n if (part.type === \"finish\") {\n try {\n logParsedSummary({\n toolCalls: [toolCallChunk],\n originalText:\n typeof firstText === \"string\" ? firstText : \"\",\n });\n } catch {\n // ignore logging failures\n }\n }\n controller.enqueue(part);\n },\n })\n )\n : stream;\n\n return {\n request: result?.request || {},\n response: result?.response || {},\n stream: streamWithSummary,\n };\n}\n","import type { JSONSchema7 } from \"@ai-sdk/provider\";\nimport {\n LanguageModelV2Content,\n LanguageModelV2FunctionTool,\n LanguageModelV2Prompt,\n LanguageModelV2ToolResultPart,\n} from \"@ai-sdk/provider\";\n\nimport { ToolCallProtocol } from \"./protocols/tool-call-protocol\";\nimport {\n createDynamicIfThenElseSchema,\n extractOnErrorOption,\n isToolCallContent,\n isToolResultPart,\n} from \"./utils\";\nimport { isProtocolFactory } from \"./utils/protocol\";\n\nexport async function transformParams({\n params,\n protocol,\n toolSystemPromptTemplate,\n}: {\n params: {\n prompt?: LanguageModelV2Prompt;\n tools?: Array<LanguageModelV2FunctionTool | { type: string }>;\n providerOptions?: {\n toolCallMiddleware?: {\n toolChoice?: { type: string };\n };\n };\n toolChoice?: { type: string; toolName?: string };\n };\n protocol: ToolCallProtocol | (() => ToolCallProtocol);\n toolSystemPromptTemplate: (tools: string) => string;\n}) {\n const resolvedProtocol = isProtocolFactory(protocol) ? protocol() : protocol;\n\n const functionTools = (params.tools ?? []).filter(\n (t): t is LanguageModelV2FunctionTool => t.type === \"function\"\n );\n\n const systemPrompt = resolvedProtocol.formatTools({\n tools: functionTools,\n toolSystemPromptTemplate,\n });\n\n const processedPrompt = convertToolPrompt(\n params.prompt ?? [],\n resolvedProtocol,\n extractOnErrorOption(params.providerOptions)\n );\n\n const finalPrompt: LanguageModelV2Prompt =\n processedPrompt[0]?.role === \"system\"\n ? [\n {\n role: \"system\",\n content: systemPrompt + \"\\n\\n\" + processedPrompt[0].content,\n },\n ...processedPrompt.slice(1),\n ]\n : [\n {\n role: \"system\",\n content: systemPrompt,\n },\n ...processedPrompt,\n ];\n\n const baseReturnParams = {\n ...params,\n prompt: finalPrompt,\n tools: [],\n toolChoice: undefined,\n providerOptions: {\n ...(params.providerOptions || {}),\n toolCallMiddleware: {\n ...((params.providerOptions &&\n typeof params.providerOptions === \"object\" &&\n (params.providerOptions as { toolCallMiddleware?: unknown })\n .toolCallMiddleware) ||\n {}),\n // INTERNAL: used by the middleware to propagate the names of custom\n // function tools into downstream handlers (stream/generate) when\n // providers strip or ignore `params.tools`. Not a stable public API.\n toolNames: functionTools.map(t => t.name),\n },\n },\n };\n\n if (params.toolChoice?.type === \"none\") {\n // TODO: Support 'none' toolChoice type.\n throw new Error(\n \"The 'none' toolChoice type is not supported by this middleware. Please use 'auto', 'required', or specify a tool name.\"\n );\n }\n\n if (params.toolChoice?.type === \"tool\") {\n const selectedToolName = params.toolChoice.toolName;\n // If a provider-defined tool matches the requested tool identifier, surface the specific error\n const providerDefinedMatch = (params.tools ?? []).find(t => {\n if (t.type === \"function\") return false;\n const anyTool = t as unknown as { id?: string; name?: string };\n return (\n anyTool.id === selectedToolName || anyTool.name === selectedToolName\n );\n });\n if (providerDefinedMatch) {\n throw new Error(\n \"Provider-defined tools are not supported by this middleware. Please use custom tools.\"\n );\n }\n\n const selectedTool = (params.tools ?? []).find(\n (t): t is LanguageModelV2FunctionTool =>\n t.type === \"function\" &&\n (t as LanguageModelV2FunctionTool).name === selectedToolName\n );\n\n if (!selectedTool) {\n throw new Error(\n `Tool with name '${selectedToolName}' not found in params.tools.`\n );\n }\n\n return {\n ...baseReturnParams,\n responseFormat: {\n type: \"json\" as const,\n schema: {\n type: \"object\",\n properties: {\n name: {\n const: selectedTool.name,\n },\n arguments: selectedTool.inputSchema,\n },\n required: [\"name\", \"arguments\"],\n } as JSONSchema7,\n name: selectedTool.name,\n description:\n typeof selectedTool.description === \"string\"\n ? selectedTool.description\n : undefined,\n },\n providerOptions: {\n ...(baseReturnParams.providerOptions || {}),\n toolCallMiddleware: {\n ...((baseReturnParams.providerOptions &&\n typeof baseReturnParams.providerOptions === \"object\" &&\n (\n baseReturnParams.providerOptions as {\n toolCallMiddleware?: unknown;\n }\n ).toolCallMiddleware) ||\n {}),\n // INTERNAL: used by the middleware to activate the tool-choice\n // fast-path in handlers. Not a stable public API.\n toolChoice: params.toolChoice,\n },\n },\n };\n }\n\n if (params.toolChoice?.type === \"required\") {\n if (!params.tools || params.tools.length === 0) {\n throw new Error(\n \"Tool choice type 'required' is set, but no tools are provided in params.tools.\"\n );\n }\n\n return {\n ...baseReturnParams,\n responseFormat: {\n type: \"json\" as const,\n schema: createDynamicIfThenElseSchema(functionTools),\n },\n providerOptions: {\n ...(baseReturnParams.providerOptions || {}),\n toolCallMiddleware: {\n ...((baseReturnParams.providerOptions &&\n typeof baseReturnParams.providerOptions === \"object\" &&\n (\n baseReturnParams.providerOptions as {\n toolCallMiddleware?: unknown;\n }\n ).toolCallMiddleware) ||\n {}),\n // INTERNAL: used by the middleware to activate the tool-choice\n // fast-path in handlers. Not a stable public API.\n toolChoice: { type: \"required\" },\n },\n },\n };\n }\n\n return baseReturnParams;\n}\n\nfunction convertToolPrompt(\n prompt: LanguageModelV2Prompt,\n resolvedProtocol: ToolCallProtocol,\n providerOptions?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n }\n): LanguageModelV2Prompt {\n const processedPrompt = prompt.map(message => {\n if (message.role === \"assistant\") {\n const newContent: LanguageModelV2Content[] = [];\n for (const content of message.content) {\n if (isToolCallContent(content)) {\n newContent.push({\n type: \"text\",\n text: resolvedProtocol.formatToolCall(content),\n });\n } else if ((content as { type?: string }).type === \"text\") {\n newContent.push(content as LanguageModelV2Content);\n } else if ((content as { type?: string }).type === \"reasoning\") {\n // Pass through reasoning parts unchanged for providers that support it\n newContent.push(content as LanguageModelV2Content);\n } else {\n // Prefer the onError callback for surfacing non-fatal warnings\n const options = extractOnErrorOption(providerOptions);\n options?.onError?.(\n \"tool-call-middleware: unknown assistant content; stringifying for provider compatibility\",\n { content }\n );\n newContent.push({\n type: \"text\",\n text: JSON.stringify(content),\n });\n }\n }\n // If assistant content consists solely of text parts, condense into a single text part\n const onlyText = newContent.every(c => c.type === \"text\");\n const condensedAssistant = onlyText\n ? [\n {\n type: \"text\" as const,\n text: newContent\n .map(c => (c as { text: string }).text)\n .join(\"\\n\"),\n },\n ]\n : newContent;\n return { role: \"assistant\", content: condensedAssistant };\n }\n if (message.role === \"tool\") {\n return {\n role: \"user\",\n // Map tool results to text response blocks, then condense into a single text block\n content: [\n {\n type: \"text\" as const,\n text: message.content\n .map(toolResult =>\n isToolResultPart(toolResult)\n ? resolvedProtocol.formatToolResponse(toolResult)\n : resolvedProtocol.formatToolResponse(\n toolResult as LanguageModelV2ToolResultPart\n )\n )\n .join(\"\\n\"),\n },\n ],\n };\n }\n return message;\n });\n\n // Condense any message that contains only text parts into a single text part\n for (let i = 0; i < processedPrompt.length; i++) {\n const msg = processedPrompt[i] as unknown as {\n role: string;\n content: unknown;\n };\n if (Array.isArray(msg.content)) {\n const allText = (msg.content as { type: string }[]).every(\n (c: { type: string }) => c?.type === \"text\"\n );\n if (allText && msg.content.length > 1) {\n const joinedText = (msg.content as { text: string }[])\n .map((c: { text: string }) => c.text)\n .join(\"\\n\");\n if (msg.role === \"system\") {\n processedPrompt[i] = {\n role: \"system\",\n content: joinedText,\n };\n } else if (msg.role === \"assistant\") {\n processedPrompt[i] = {\n role: \"assistant\",\n content: [\n {\n type: \"text\" as const,\n text: joinedText,\n },\n ],\n };\n } else {\n // Treat remaining roles (e.g., user) as user text content\n processedPrompt[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\" as const,\n text: joinedText,\n },\n ],\n };\n }\n }\n }\n }\n\n // Merge consecutive text blocks\n for (let i = processedPrompt.length - 1; i > 0; i--) {\n const current = processedPrompt[i];\n const prev = processedPrompt[i - 1];\n if (current.role === \"user\" && prev.role === \"user\") {\n const prevContent = prev.content\n .map(c => (c.type === \"text\" ? c.text : \"\"))\n .join(\"\\n\");\n const currentContent = current.content\n .map(c => (c.type === \"text\" ? c.text : \"\"))\n .join(\"\\n\");\n processedPrompt[i - 1] = {\n role: \"user\",\n content: [{ type: \"text\", text: prevContent + \"\\n\" + currentContent }],\n };\n processedPrompt.splice(i, 1);\n }\n }\n return processedPrompt as LanguageModelV2Prompt;\n}\n","import type {\n LanguageModelV2CallOptions,\n LanguageModelV2Middleware,\n} from \"@ai-sdk/provider\";\n\nimport { wrapGenerate as wrapGenerateHandler } from \"./generate-handler\";\nimport { ToolCallProtocol } from \"./protocols/tool-call-protocol\";\nimport {\n toolChoiceStream,\n wrapStream as wrapStreamHandler,\n} from \"./stream-handler\";\nimport { transformParams } from \"./transform-handler\";\nimport { extractOnErrorOption, isToolChoiceActive } from \"./utils\";\nimport { isProtocolFactory } from \"./utils/protocol\";\n\nexport function createToolMiddleware({\n protocol,\n toolSystemPromptTemplate,\n}: {\n protocol: ToolCallProtocol | (() => ToolCallProtocol);\n toolSystemPromptTemplate: (tools: string) => string;\n}): LanguageModelV2Middleware {\n const resolvedProtocol = isProtocolFactory(protocol) ? protocol() : protocol;\n\n return {\n middlewareVersion: \"v2\",\n wrapStream: async ({ doStream, doGenerate, params }) => {\n if (isToolChoiceActive(params)) {\n return toolChoiceStream({\n doGenerate,\n options: extractOnErrorOption(params.providerOptions),\n });\n } else {\n return wrapStreamHandler({\n protocol: resolvedProtocol,\n doStream,\n doGenerate,\n params,\n });\n }\n },\n wrapGenerate: async ({ doGenerate, params }) =>\n wrapGenerateHandler({\n protocol: resolvedProtocol,\n doGenerate,\n params,\n }),\n transformParams: async ({\n params,\n }): Promise<LanguageModelV2CallOptions> => {\n return transformParams({\n protocol: resolvedProtocol,\n toolSystemPromptTemplate,\n params,\n });\n },\n };\n}\n","import { jsonMixProtocol, morphXmlProtocol } from \"./protocols\";\nimport { createToolMiddleware } from \"./tool-call-middleware\";\n\nconst gemmaToolMiddleware = createToolMiddleware({\n protocol: jsonMixProtocol(\n // Customize the tool call delimiters to use markdown code fences\n {\n toolCallStart: \"```tool_call\\n\",\n // TODO: Support specifying multiple possible tags,\n // e.g., for gemma, it would be nice to be able to set both `` and ``` at the same time.\n toolCallEnd: \"\\n```\",\n toolResponseStart: \"```tool_response\\n\",\n toolResponseEnd: \"\\n```\",\n }\n ),\n toolSystemPromptTemplate(tools) {\n return `You have access to functions. If you decide to invoke any of the function(s),\nyou MUST put it in the format of markdown code fence block with the language name of tool_call , e.g.\n\\`\\`\\`tool_call\n{'name': <function-name>, 'arguments': <args-dict>}\n\\`\\`\\`\nYou SHOULD NOT include any other text in the response if you call a function\n${tools}`;\n },\n});\n\nconst hermesToolMiddleware = createToolMiddleware({\n protocol: jsonMixProtocol,\n toolSystemPromptTemplate(tools) {\n return `You are a function calling AI model.\nYou are provided with function signatures within <tools></tools> XML tags.\nYou may call one or more functions to assist with the user query.\nDon't make assumptions about what values to plug into functions.\nHere are the available tools: <tools>${tools}</tools>\nUse the following pydantic model json schema for each tool call you will make: {\"title\": \"FunctionCall\", \"type\": \"object\", \"properties\": {\"arguments\": {\"title\": \"Arguments\", \"type\": \"object\"}, \"name\": {\"title\": \"Name\", \"type\": \"string\"}}, \"required\": [\"arguments\", \"name\"]}\nFor each function call return a json object with function name and arguments within <tool_call></tool_call> XML tags as follows:\n<tool_call>\n{\"name\": \"<function-name>\", \"arguments\": <args-dict>}\n</tool_call>`;\n },\n});\n\nconst xmlToolMiddleware = createToolMiddleware({\n protocol: morphXmlProtocol,\n toolSystemPromptTemplate(tools: string) {\n return `You are a function calling AI model.\nYou are provided with function signatures within <tools></tools> XML tags.\nYou may call one or more functions to assist with the user query.\nDon't make assumptions about what values to plug into functions.\nHere are the available tools: <tools>${tools}</tools>\nFor a function call, return exactly one XML element whose tag name matches the tool's name, and nothing else.\nWhen an argument is an array, write each item inside a single element on one line separated by commas (or provide a JSON-like list). When an argument is an object, provide a JSON-like value.\nExamples:\n<get_weather>\n<location>\nSan Fransisco\n</location>\n</get_weather>`;\n },\n});\n\nexport {\n createToolMiddleware,\n gemmaToolMiddleware,\n hermesToolMiddleware,\n jsonMixProtocol,\n morphXmlProtocol,\n xmlToolMiddleware,\n};\n"],"mappings":"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","names":["generateId","generateId","generateId","i","k","val","generateId","generateId","result","parsed","debugLevel","generateId","_a","generateId","withRawTap","parsed","generateId"]}