@ai-sdk-tool/parser 3.3.0 → 3.3.2
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/{chunk-3QJVNEHE.js → chunk-5WKXBBCU.js} +21 -32
- package/dist/chunk-5WKXBBCU.js.map +1 -0
- package/dist/{chunk-DZB6Y354.js → chunk-OUGMLYAW.js} +167 -18
- package/dist/chunk-OUGMLYAW.js.map +1 -0
- package/dist/{chunk-TR2ARLIF.js → chunk-ZDBNJWLY.js} +8 -5
- package/dist/chunk-ZDBNJWLY.js.map +1 -0
- package/dist/community.cjs +186 -46
- package/dist/community.cjs.map +1 -1
- package/dist/community.js +3 -3
- package/dist/index.cjs +186 -46
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.js +5 -4
- package/dist/rxml.cjs +171 -20
- package/dist/rxml.cjs.map +1 -1
- package/dist/rxml.js +2 -2
- package/dist/schema-coerce.cjs +166 -17
- package/dist/schema-coerce.cjs.map +1 -1
- package/dist/schema-coerce.js +1 -1
- package/package.json +13 -12
- package/dist/chunk-3QJVNEHE.js.map +0 -1
- package/dist/chunk-DZB6Y354.js.map +0 -1
- package/dist/chunk-TR2ARLIF.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/rjson/index.ts","../src/core/utils/debug.ts","../src/core/utils/get-potential-start-index.ts","../src/core/utils/id.ts","../src/core/utils/regex.ts","../src/core/protocols/json-protocol.ts","../src/core/protocols/protocol-interface.ts","../src/rxml/errors/types.ts","../src/rxml/core/types.ts","../src/rxml/utils/helpers.ts","../src/rxml/builders/stringify.ts","../src/schema-coerce/index.ts","../src/rxml/schema/coercion.ts","../src/rxml/schema/extraction.ts","../src/rxml/core/tokenizer.ts","../src/rxml/core/parser.ts","../src/rxml/heuristics/engine.ts","../src/rxml/heuristics/xml-defaults.ts","../src/rxml/parse.ts","../src/core/protocols/xml-protocol.ts","../src/core/protocols/yaml-protocol.ts","../src/core/utils/dynamic-tool-schema.ts","../src/core/utils/on-error.ts","../src/core/utils/provider-options.ts","../src/core/utils/type-guards.ts","../src/generate-handler.ts","../src/core/prompts/hermes-system-prompt.ts","../src/core/prompts/tool-response.ts","../src/core/prompts/xml-system-prompt.ts","../src/core/prompts/yaml-system-prompt.ts","../src/stream-handler.ts","../src/transform-handler.ts","../src/tool-call-middleware.ts","../src/preconfigured-middleware.ts"],"sourcesContent":["// biome-ignore-all lint/performance/noBarrelFile: intentional public API surface\n\n// Core Protocols (Agnostic)\n\nexport * from \"./core/protocols/json-protocol\";\nexport * from \"./core/protocols/protocol-interface\";\nexport type { XmlProtocolOptions } from \"./core/protocols/xml-protocol\";\nexport { xmlProtocol } from \"./core/protocols/xml-protocol\";\nexport type { YamlProtocolOptions } from \"./core/protocols/yaml-protocol\";\nexport { yamlProtocol } from \"./core/protocols/yaml-protocol\";\n// Utilities (Agnostic)\nexport * from \"./core/utils/debug\";\nexport * from \"./core/utils/dynamic-tool-schema\";\nexport * from \"./core/utils/get-potential-start-index\";\nexport * from \"./core/utils/on-error\";\nexport * from \"./core/utils/provider-options\";\nexport * from \"./core/utils/regex\";\nexport * from \"./core/utils/type-guards\";\nexport { wrapGenerate } from \"./generate-handler\";\n// Pre-configured Middleware\nexport * from \"./preconfigured-middleware\";\nexport * from \"./rjson\";\nexport { toolChoiceStream, wrapStream } from \"./stream-handler\";\n// Tool Call Middleware Implementation\nexport { createToolMiddleware } from \"./tool-call-middleware\";\nexport { transformParams } from \"./transform-handler\";\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// --- Regex Constants (for performance) ---\nconst WHITESPACE_TEST_REGEX = /\\s/;\nconst WHITESPACE_REGEX = /^\\s+/;\nconst OBJECT_START_REGEX = /^\\{/;\nconst OBJECT_END_REGEX = /^\\}/;\nconst ARRAY_START_REGEX = /^\\[/;\nconst ARRAY_END_REGEX = /^\\]/;\nconst COMMA_REGEX = /^,/;\nconst COLON_REGEX = /^:/;\nconst KEYWORD_REGEX = /^(?:true|false|null)/;\nconst NUMBER_REGEX = /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/;\nconst STRING_DOUBLE_REGEX = /^\"(?:[^\"\\\\]|\\\\[\"bnrtf\\\\/]|\\\\u[0-9a-fA-F]{4})*\"/;\nconst STRING_SINGLE_REGEX = /^'((?:[^'\\\\]|\\\\['bnrtf\\\\/]|\\\\u[0-9a-fA-F]{4})*)'/;\nconst COMMENT_SINGLE_REGEX = /^\\/\\/.*?(?:\\r\\n|\\r|\\n)/;\nconst COMMENT_MULTI_REGEX = /^\\/\\*[\\s\\S]*?\\*\\//;\nconst IDENTIFIER_REGEX = /^[$a-zA-Z0-9_\\-+.*?!|&%^/#\\\\]+/;\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 += 1) {\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\ninterface 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\ninterface 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\ninterface ParseWarning {\n message: string;\n line: number;\n}\n\n// Type for the state object used during parsing\ninterface 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 */\ninterface 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\ninterface 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 (contents: string): Token[] => {\n const tokens: Token[] = [];\n let line = 1; // Start at line 1\n let remainingContents = contents;\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(remainingContents); // Try to match the regex at the current position\n if (m) {\n const raw = m[0]; // The matched raw string\n remainingContents = remainingContents.slice(raw.length); // Consume the matched part from the input\n return {\n raw,\n matched: tokenSpec.f(m), // Process the match using the spec's function\n };\n }\n return; // No match for this spec\n });\n return result === false ? undefined : result;\n }\n\n // Main lexing loop\n while (remainingContents !== \"\") {\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: ${remainingContents[0]}; input: ${remainingContents.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 }\n if (mm === \"\\\\'\") {\n return \"'\"; // Unescape escaped single quotes\n }\n return mm;\n }\n );\n\n const match = `\"${content}\"`;\n return {\n type: \"string\",\n 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, // The original identifier name\n 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) =>\n WHITESPACE_TEST_REGEX.test(c) ? c : \" \"\n );\n return {\n type: \" \", // Represent comments as whitespace tokens\n 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: Number.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, // 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 (m: RegExpExecArray): RawToken => {\n // For simple tokens like punctuation, value is not needed\n return { type, match: m[0], value: undefined };\n };\n }\n\n // Base JSON token specifications (strict)\n let tokenSpecs: TokenSpec[] = [\n { re: WHITESPACE_REGEX, f: f(\" \") }, // Whitespace\n { re: OBJECT_START_REGEX, f: f(\"{\") }, // Object start\n { re: OBJECT_END_REGEX, f: f(\"}\") }, // Object end\n { re: ARRAY_START_REGEX, f: f(\"[\") }, // Array start\n { re: ARRAY_END_REGEX, f: f(\"]\") }, // Array end\n { re: COMMA_REGEX, f: f(\",\") }, // Comma separator\n { re: COLON_REGEX, f: f(\":\") }, // Key-value separator\n { re: KEYWORD_REGEX, f: fKeyword }, // Keywords\n // Number: optional sign, digits, optional decimal part, optional exponent\n { re: NUMBER_REGEX, f: fNumber },\n // String: double-quoted, handles escapes\n { re: STRING_DOUBLE_REGEX, 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: STRING_SINGLE_REGEX,\n f: fStringSingle,\n },\n // Single-line comments (// ...)\n { re: COMMENT_SINGLE_REGEX, f: fComment },\n // Multi-line comments (/* ... */)\n { re: COMMENT_MULTI_REGEX, f: fComment },\n // Unquoted identifiers (treated as strings)\n // Allows letters, numbers, _, -, +, ., *, ?, !, |, &, %, ^, /, #, \\\n { re: IDENTIFIER_REGEX, 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 let currentIndex = index;\n for (; currentIndex >= 0; currentIndex -= 1) {\n if (tokens[currentIndex].type !== \" \") {\n return currentIndex; // Return index of the non-whitespace token\n }\n }\n return; // 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) => str + token.match, \"\");\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.at(-1)?.line ?? 1) : 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,\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?.includes(token.type)) {\n return token;\n }\n if (token.type === \"eof\") {\n // If we hit EOF, return it\n return token;\n }\n 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,\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,\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.hasOwn(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: { [objKey: 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// Helper to handle invalid tokens in parseMany\nfunction handleInvalidToken<T>(\n token: Token,\n state: ParseState,\n opts: ParseManyOpts<T>,\n result: T\n): T | null {\n raiseUnexpected(state, token, `',' or '${opts.endSymbol}'`);\n\n if (state.tolerant) {\n if (token.type === \"eof\") {\n return result;\n }\n // Assume a comma was missing and put the token back\n state.pos -= 1;\n return null; // Signal to continue parsing\n }\n return result; // Should be unreachable in strict mode\n}\n\n// Helper to handle comma tokens in parseMany\ninterface HandleCommaTokenParams<T> {\n token: Token;\n tokens: Token[];\n state: ParseState;\n opts: ParseManyOpts<T>;\n result: T;\n}\n\nfunction handleCommaToken<T>(params: HandleCommaTokenParams<T>): T | null {\n const { token, tokens, state, opts, result } = params;\n const nextToken = tokens[state.pos];\n if (state.tolerant && nextToken && nextToken.type === opts.endSymbol) {\n raiseError(state, token, `Trailing comma before '${opts.endSymbol}'`);\n popToken(tokens, state);\n return result;\n }\n opts.elementParser(tokens, state, result);\n return null; // Signal to continue parsing\n}\n\n// Helper to handle the initial element in parseMany\nfunction parseManyInitialElement<T>(\n tokens: Token[],\n state: ParseState,\n result: T,\n opts: ParseManyOpts<T>\n): T | undefined {\n const token = skipPunctuation(tokens, state, opts.skip);\n\n if (token.type === \"eof\") {\n raiseUnexpected(state, token, `'${opts.endSymbol}' or ${opts.elementName}`);\n return result;\n }\n\n if (token.type === opts.endSymbol) {\n return result;\n }\n\n state.pos -= 1;\n opts.elementParser(tokens, state, result);\n return; // Signal to continue parsing\n}\n\n// Helper to process a token in parseMany loop\nfunction parseManyProcessToken<T>(params: {\n token: Token;\n tokens: Token[];\n state: ParseState;\n opts: ParseManyOpts<T>;\n result: T;\n}): T | undefined {\n const { token, tokens, state, opts, result } = params;\n if (token.type !== opts.endSymbol && token.type !== \",\") {\n const handledResult = handleInvalidToken(token, state, opts, result);\n if (handledResult !== null) {\n return handledResult;\n }\n }\n\n if (token.type === opts.endSymbol) {\n return result;\n }\n\n if (token.type === \",\") {\n const handledResult = handleCommaToken({\n token,\n tokens,\n state,\n opts,\n result,\n });\n if (handledResult !== null) {\n return handledResult;\n }\n return; // Continue loop\n }\n\n opts.elementParser(tokens, state, result);\n return; // Continue loop\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 const initialResult = parseManyInitialElement(tokens, state, result, opts);\n if (initialResult !== undefined) {\n return initialResult;\n }\n\n while (true) {\n const token = popToken(tokens, state);\n const processedResult = parseManyProcessToken({\n token,\n tokens,\n state,\n opts,\n result,\n });\n if (processedResult !== undefined) {\n return processedResult;\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(tokens: Token[], state: ParseState, end = false): 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; // 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; // 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// Helper to normalize parse options\nfunction normalizeParseOptions(\n optsOrReviver?: ParseOptions | ((key: string, value: unknown) => unknown)\n): ParseOptions {\n let options: ParseOptions = {};\n\n if (typeof optsOrReviver === \"function\") {\n options.reviver = optsOrReviver;\n } else if (optsOrReviver !== null && typeof optsOrReviver === \"object\") {\n options = { ...optsOrReviver };\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 for relaxed mode\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;\n } else {\n options.relaxed = true;\n }\n }\n\n options.tolerant = options.tolerant || options.warnings;\n options.duplicate = options.duplicate ?? false;\n\n return options;\n}\n\n// Helper to create parser state\nfunction createParseState(options: ParseOptions): ParseState {\n return {\n pos: 0,\n reviver: options.reviver,\n tolerant: options.tolerant ?? false,\n duplicate: options.duplicate ?? false,\n warnings: [],\n };\n}\n\n// Helper to use custom parser with tokens\nfunction parseWithCustomParser(text: string, options: ParseOptions): unknown {\n const lexerToUse = options.relaxed ? lexer : strictLexer;\n let tokens = lexerToUse(text);\n\n if (options.relaxed) {\n tokens = stripTrailingComma(tokens);\n }\n\n tokens = tokens.filter((token) => token.type !== \" \");\n const state = createParseState(options);\n return parseAny(tokens, state, true);\n}\n\n// Helper to use native JSON.parse with transformation\nfunction parseWithTransform(text: string, options: ParseOptions): unknown {\n let tokens = lexer(text);\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// --- 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 const options = normalizeParseOptions(optsOrReviver);\n\n // Strategy 1: Strict JSON with duplicate allowance -> use native JSON.parse\n if (\n !(options.relaxed || options.warnings || options.tolerant) &&\n options.duplicate\n ) {\n return JSON.parse(\n text,\n options.reviver as (key: string, value: unknown) => unknown\n );\n }\n\n // Strategy 2: Need custom parser (warnings, tolerant, or duplicate checking)\n if (options.warnings || options.tolerant || !options.duplicate) {\n return parseWithCustomParser(text, options);\n }\n\n // Strategy 3: Relaxed syntax without warnings/tolerance -> transform and use native\n return parseWithTransform(text, options);\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(\n obj: { [objKey: string]: unknown },\n key: string\n): 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 { [objKey: 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","export type DebugLevel = \"off\" | \"stream\" | \"parse\";\n\nconst LINE_SPLIT_REGEX = /\\r?\\n/;\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;\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) {\n return \"stream\";\n }\n if (envLower === \"2\") {\n return \"parse\";\n }\n return \"off\";\n}\n\nfunction color(code: number) {\n return (text: string) => `\\u001b[${code}m${text}\\u001b[0m`;\n}\n\n// ANSI color codes\nconst ANSI_GRAY = 90;\nconst ANSI_YELLOW = 33;\nconst ANSI_CYAN = 36;\nconst ANSI_BG_BLUE = 44;\nconst ANSI_BG_GREEN = 42;\nconst ANSI_INVERSE = 7;\nconst ANSI_UNDERLINE = 4;\nconst ANSI_BOLD = 1;\n\nconst cGray = color(ANSI_GRAY);\nconst cYellow = color(ANSI_YELLOW);\nconst cCyan = color(ANSI_CYAN);\nconst cBgBlue = color(ANSI_BG_BLUE);\nconst cBgGreen = color(ANSI_BG_GREEN);\nconst cInverse = color(ANSI_INVERSE);\nconst cUnderline = color(ANSI_UNDERLINE);\nconst cBold = color(ANSI_BOLD);\n\nconst MAX_SNIPPET_LENGTH = 800;\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\nfunction formatError(error: unknown): string {\n if (error instanceof Error) {\n const stack = error.stack ? `\\n${error.stack}` : \"\";\n return `\\n${error.name}: ${error.message}${stack}`;\n }\n return safeStringify(error);\n}\n\nfunction truncateSnippet(snippet: string): string {\n if (snippet.length <= MAX_SNIPPET_LENGTH) {\n return snippet;\n }\n return `${snippet.slice(0, MAX_SNIPPET_LENGTH)}\\n…[truncated ${snippet.length - MAX_SNIPPET_LENGTH} chars]`;\n}\n\nexport function logParseFailure({\n phase,\n reason,\n snippet,\n error,\n}: {\n phase: \"generated-text\" | \"stream\" | string;\n reason: string;\n snippet?: string;\n error?: unknown;\n}) {\n if (getDebugLevel() !== \"parse\") {\n return;\n }\n\n const label = cBgBlue(`[${phase}]`);\n console.log(cGray(\"[debug:mw:fail]\"), label, cYellow(reason));\n\n if (snippet) {\n const formatted = truncateSnippet(snippet);\n console.log(cGray(\"[debug:mw:fail:snippet]\"), formatted);\n }\n\n if (error) {\n console.log(cGray(\"[debug:mw:fail:error]\"), cCyan(formatError(error)));\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\nfunction getHighlightStyle(): \"inverse\" | \"underline\" | \"bold\" | \"bg\" {\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 }\n if (normalized === \"underline\" || normalized === \"ul\") {\n return \"underline\" as const;\n }\n if (normalized === \"bold\") {\n return \"bold\" as const;\n }\n if (normalized === \"bg\" || normalized === \"background\") {\n return \"bg\" as const;\n }\n const asBool = normalizeBooleanString(normalized);\n if (asBool === true) {\n return \"bg\" as const;\n }\n return \"bg\" as const; // default: background highlight\n}\n\nfunction getHighlightFunction(style: \"inverse\" | \"underline\" | \"bold\" | \"bg\") {\n if (style === \"inverse\") {\n return cInverse;\n }\n if (style === \"underline\") {\n return cUnderline;\n }\n if (style === \"bold\") {\n return cBold;\n }\n if (style === \"bg\") {\n return cBgGreen;\n }\n return cYellow;\n}\n\nfunction renderHighlightedText(\n originalText: string,\n style: \"inverse\" | \"underline\" | \"bold\" | \"bg\",\n highlight: (text: string) => string\n) {\n if (\n style === \"bg\" ||\n style === \"inverse\" ||\n style === \"underline\" ||\n style === \"bold\"\n ) {\n return originalText\n .split(LINE_SPLIT_REGEX)\n .map((line) => (line.length ? highlight(line) : line))\n .join(\"\\n\");\n }\n return highlight(originalText);\n}\n\nexport function logParsedSummary({\n toolCalls,\n originalText,\n}: {\n toolCalls: unknown[];\n originalText: string;\n}) {\n if (originalText) {\n const style = getHighlightStyle();\n const highlight = getHighlightFunction(style);\n const rendered = renderHighlightedText(originalText, style, highlight);\n\n console.log(cGray(\"[debug:mw:origin]\"), `\\n${rendered}`);\n }\n\n if (toolCalls.length > 0) {\n const styledSummary = safeStringify(toolCalls)\n .split(LINE_SPLIT_REGEX)\n .map((line) => (line.length ? cBgBlue(line) : line))\n .join(\"\\n\");\n console.log(cGray(\"[debug:mw:summary]\"), styledSummary);\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 -= 1) {\n const suffix = text.substring(i);\n if (searchedText.startsWith(suffix)) {\n return i;\n }\n }\n\n return null;\n}\n","export function generateId(): string {\n return Math.random().toString(36).substring(2, 15);\n}\n","export function escapeRegExp(literal: string): string {\n return literal.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import type {\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport { parse as parseRJSON } from \"../../rjson\";\nimport { logParseFailure } from \"../utils/debug\";\nimport { getPotentialStartIndex } from \"../utils/get-potential-start-index\";\nimport { generateId } from \"../utils/id\";\nimport { escapeRegExp } from \"../utils/regex\";\nimport type { TCMProtocol } from \"./protocol-interface\";\n\ninterface JsonProtocolOptions {\n toolCallStart?: string;\n toolCallEnd?: string;\n}\n\nfunction processToolCallJson(\n toolCallJson: string,\n fullMatch: string,\n processedElements: LanguageModelV3Content[],\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n }\n) {\n try {\n const parsedToolCall = parseRJSON(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 logParseFailure({\n phase: \"generated-text\",\n reason: \"Failed to parse tool call JSON segment\",\n snippet: fullMatch,\n error,\n });\n options?.onError?.(\n \"Could not process JSON tool call, keeping original text.\",\n { toolCall: fullMatch, error }\n );\n processedElements.push({ type: \"text\", text: fullMatch });\n }\n}\n\nfunction addTextSegment(\n text: string,\n processedElements: LanguageModelV3Content[]\n) {\n if (text.trim()) {\n processedElements.push({ type: \"text\", text });\n }\n}\n\ninterface ParseContext {\n match: RegExpExecArray;\n text: string;\n currentIndex: number;\n processedElements: LanguageModelV3Content[];\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n}\n\nfunction processMatchedToolCall(context: ParseContext): number {\n const { match, text, currentIndex, processedElements, options } = context;\n const startIndex = match.index;\n const toolCallJson = match[1];\n\n if (startIndex > currentIndex) {\n const textSegment = text.substring(currentIndex, startIndex);\n addTextSegment(textSegment, processedElements);\n }\n\n if (toolCallJson) {\n processToolCallJson(toolCallJson, match[0], processedElements, options);\n }\n\n return startIndex + match[0].length;\n}\n\ninterface StreamState {\n isInsideToolCall: boolean;\n buffer: string;\n currentToolCallJson: string;\n currentTextId: string | null;\n hasEmittedTextStart: boolean;\n}\n\ntype StreamController =\n TransformStreamDefaultController<LanguageModelV3StreamPart>;\n\ninterface TagProcessingContext {\n state: StreamState;\n controller: StreamController;\n toolCallStart: string;\n toolCallEnd: string;\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n}\n\nfunction flushBuffer(\n state: StreamState,\n controller: StreamController,\n toolCallStart: string\n) {\n if (state.buffer.length === 0) {\n return;\n }\n\n if (!state.currentTextId) {\n state.currentTextId = generateId();\n controller.enqueue({\n type: \"text-start\",\n id: state.currentTextId,\n } as LanguageModelV3StreamPart);\n state.hasEmittedTextStart = true;\n }\n\n const deltaContent = state.isInsideToolCall\n ? `${toolCallStart}${state.buffer}`\n : state.buffer;\n\n controller.enqueue({\n type: \"text-delta\",\n id: state.currentTextId,\n delta: deltaContent,\n } as LanguageModelV3StreamPart);\n state.buffer = \"\";\n}\n\nfunction closeTextBlock(state: StreamState, controller: StreamController) {\n if (state.currentTextId && state.hasEmittedTextStart) {\n controller.enqueue({\n type: \"text-end\",\n id: state.currentTextId,\n } as LanguageModelV3StreamPart);\n state.currentTextId = null;\n state.hasEmittedTextStart = false;\n }\n}\n\nfunction emitIncompleteToolCall(\n state: StreamState,\n controller: StreamController,\n toolCallStart: string\n) {\n if (!state.currentToolCallJson) {\n return;\n }\n\n logParseFailure({\n phase: \"stream\",\n reason: \"Incomplete streaming tool call segment emitted as text\",\n snippet: `${toolCallStart}${state.currentToolCallJson}`,\n });\n\n const errorId = generateId();\n const errorContent = `${toolCallStart}${state.currentToolCallJson}`;\n controller.enqueue({\n type: \"text-start\",\n id: errorId,\n } as LanguageModelV3StreamPart);\n controller.enqueue({\n type: \"text-delta\",\n id: errorId,\n delta: errorContent,\n } as LanguageModelV3StreamPart);\n controller.enqueue({\n type: \"text-end\",\n id: errorId,\n } as LanguageModelV3StreamPart);\n state.currentToolCallJson = \"\";\n}\n\nfunction handleFinishChunk(\n state: StreamState,\n controller: StreamController,\n toolCallStart: string,\n chunk: LanguageModelV3StreamPart\n) {\n if (state.buffer.length > 0) {\n flushBuffer(state, controller, toolCallStart);\n }\n closeTextBlock(state, controller);\n emitIncompleteToolCall(state, controller, toolCallStart);\n controller.enqueue(chunk);\n}\n\nfunction publishText(\n text: string,\n state: StreamState,\n controller: StreamController\n) {\n if (state.isInsideToolCall) {\n closeTextBlock(state, controller);\n state.currentToolCallJson += text;\n } else if (text.length > 0) {\n if (!state.currentTextId) {\n state.currentTextId = generateId();\n controller.enqueue({\n type: \"text-start\",\n id: state.currentTextId,\n } as LanguageModelV3StreamPart);\n state.hasEmittedTextStart = true;\n }\n controller.enqueue({\n type: \"text-delta\",\n id: state.currentTextId,\n delta: text,\n } as LanguageModelV3StreamPart);\n }\n}\n\nfunction emitToolCall(context: TagProcessingContext) {\n const { state, controller, toolCallStart, toolCallEnd, options } = context;\n try {\n const parsedToolCall = parseRJSON(state.currentToolCallJson) as {\n name: string;\n arguments: unknown;\n };\n closeTextBlock(state, controller);\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: parsedToolCall.name,\n input: JSON.stringify(parsedToolCall.arguments ?? {}),\n } as LanguageModelV3StreamPart);\n } catch (error) {\n logParseFailure({\n phase: \"stream\",\n reason: \"Failed to parse streaming tool call JSON segment\",\n snippet: `${toolCallStart}${state.currentToolCallJson}${toolCallEnd}`,\n error,\n });\n const errorId = generateId();\n const errorContent = `${toolCallStart}${state.currentToolCallJson}${toolCallEnd}`;\n controller.enqueue({\n type: \"text-start\",\n id: errorId,\n } as LanguageModelV3StreamPart);\n controller.enqueue({\n type: \"text-delta\",\n id: errorId,\n delta: errorContent,\n } as LanguageModelV3StreamPart);\n controller.enqueue({\n type: \"text-end\",\n id: errorId,\n } as LanguageModelV3StreamPart);\n options?.onError?.(\n \"Could not process streaming JSON tool call; emitting original text.\",\n {\n toolCall: errorContent,\n }\n );\n }\n}\n\nfunction processTagMatch(context: TagProcessingContext) {\n const { state } = context;\n if (state.isInsideToolCall) {\n emitToolCall(context);\n state.currentToolCallJson = \"\";\n state.isInsideToolCall = false;\n } else {\n state.currentToolCallJson = \"\";\n state.isInsideToolCall = true;\n }\n}\n\nfunction processBufferTags(context: TagProcessingContext) {\n const { state, controller, toolCallStart, toolCallEnd } = context;\n let startIndex = getPotentialStartIndex(\n state.buffer,\n state.isInsideToolCall ? toolCallEnd : toolCallStart\n );\n\n while (startIndex != null) {\n const tag = state.isInsideToolCall ? toolCallEnd : toolCallStart;\n if (startIndex + tag.length > state.buffer.length) {\n break;\n }\n\n publishText(state.buffer.slice(0, startIndex), state, controller);\n state.buffer = state.buffer.slice(startIndex + tag.length);\n processTagMatch(context);\n\n startIndex = getPotentialStartIndex(\n state.buffer,\n state.isInsideToolCall ? toolCallEnd : toolCallStart\n );\n }\n}\n\nfunction handlePartialTag(\n state: StreamState,\n controller: StreamController,\n toolCallStart: string\n) {\n if (state.isInsideToolCall) {\n return;\n }\n\n const potentialIndex = getPotentialStartIndex(state.buffer, toolCallStart);\n if (\n potentialIndex != null &&\n potentialIndex + toolCallStart.length > state.buffer.length\n ) {\n publishText(state.buffer.slice(0, potentialIndex), state, controller);\n state.buffer = state.buffer.slice(potentialIndex);\n } else {\n publishText(state.buffer, state, controller);\n state.buffer = \"\";\n }\n}\n\nexport const jsonProtocol = ({\n toolCallStart = \"<tool_call>\",\n toolCallEnd = \"</tool_call>\",\n}: JsonProtocolOptions = {}): TCMProtocol => ({\n formatTools({\n tools,\n toolSystemPromptTemplate,\n }: {\n tools: LanguageModelV3FunctionTool[];\n toolSystemPromptTemplate: (tools: LanguageModelV3FunctionTool[]) => string;\n }) {\n return toolSystemPromptTemplate(tools || []);\n },\n\n formatToolCall(toolCall: LanguageModelV3ToolCall) {\n let args: unknown = {};\n if (toolCall.input != null) {\n try {\n args = JSON.parse(toolCall.input);\n } catch {\n args = toolCall.input;\n }\n }\n return `${toolCallStart}${JSON.stringify({\n name: toolCall.toolName,\n arguments: args,\n })}${toolCallEnd}`;\n },\n\n parseGeneratedText({\n text,\n options,\n }: {\n text: string;\n tools: LanguageModelV3FunctionTool[];\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n }) {\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: LanguageModelV3Content[] = [];\n let currentIndex = 0;\n let match = toolCallRegex.exec(text);\n\n while (match !== null) {\n currentIndex = processMatchedToolCall({\n match,\n text,\n currentIndex,\n processedElements,\n options,\n });\n match = toolCallRegex.exec(text);\n }\n\n if (currentIndex < text.length) {\n const remainingText = text.substring(currentIndex);\n addTextSegment(remainingText, processedElements);\n }\n\n return processedElements;\n },\n\n createStreamParser({\n options,\n }: {\n tools: LanguageModelV3FunctionTool[];\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n }) {\n const state: StreamState = {\n isInsideToolCall: false,\n buffer: \"\",\n currentToolCallJson: \"\",\n currentTextId: null,\n hasEmittedTextStart: false,\n };\n\n return new TransformStream<\n LanguageModelV3StreamPart,\n LanguageModelV3StreamPart\n >({\n transform(chunk, controller) {\n if (chunk.type === \"finish\") {\n handleFinishChunk(state, controller, toolCallStart, chunk);\n return;\n }\n\n if (chunk.type !== \"text-delta\") {\n controller.enqueue(chunk);\n return;\n }\n\n const textContent = (chunk as { delta?: string }).delta ?? \"\";\n state.buffer += textContent;\n processBufferTags({\n state,\n controller,\n toolCallStart,\n toolCallEnd,\n options,\n });\n handlePartialTag(state, controller, toolCallStart);\n },\n });\n },\n\n extractToolCallSegments({ text }: { text: string }) {\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 = regex.exec(text);\n while (m != null) {\n segments.push(m[0]);\n m = regex.exec(text);\n }\n return segments;\n },\n});\n","import type {\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\n\nexport interface TCMProtocol {\n formatTools({\n tools,\n toolSystemPromptTemplate,\n }: {\n tools: LanguageModelV3FunctionTool[];\n toolSystemPromptTemplate: (tools: LanguageModelV3FunctionTool[]) => string;\n }): string;\n\n formatToolCall(toolCall: LanguageModelV3ToolCall): string;\n\n parseGeneratedText({\n text,\n tools,\n options,\n }: {\n text: string;\n tools: LanguageModelV3FunctionTool[];\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n }): LanguageModelV3Content[];\n\n createStreamParser({\n tools,\n options,\n }: {\n tools: LanguageModelV3FunctionTool[];\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n }): TransformStream<LanguageModelV3StreamPart, LanguageModelV3StreamPart>;\n\n extractToolCallSegments?: ({\n text,\n tools,\n }: {\n text: string;\n tools: LanguageModelV3FunctionTool[];\n }) => string[];\n}\n\nexport type TCMCoreProtocol = TCMProtocol;\n\nexport function isProtocolFactory(\n protocol: TCMProtocol | (() => TCMProtocol)\n): protocol is () => TCMProtocol {\n return typeof protocol === \"function\";\n}\n\nexport function isTCMProtocolFactory(\n protocol: TCMProtocol | (() => TCMProtocol)\n): protocol is () => TCMProtocol {\n return typeof protocol === \"function\";\n}\n","/**\n * Error classes for robust-xml parser\n */\n\nexport class RXMLParseError extends Error {\n cause?: unknown;\n line?: number;\n column?: number;\n\n constructor(\n message: string,\n cause?: unknown,\n line?: number,\n column?: number\n ) {\n super(message);\n this.name = \"RXMLParseError\";\n this.cause = cause;\n this.line = line;\n this.column = column;\n }\n}\n\nexport class RXMLDuplicateStringTagError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RXMLDuplicateStringTagError\";\n }\n}\n\nexport class RXMLCoercionError extends Error {\n cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"RXMLCoercionError\";\n this.cause = cause;\n }\n}\n\nexport class RXMLStringifyError extends Error {\n cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"RXMLStringifyError\";\n this.cause = cause;\n }\n}\n\nexport class RXMLStreamError extends Error {\n cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"RXMLStreamError\";\n this.cause = cause;\n }\n}\n","/**\n * Core types for the robust-xml parser\n * Based on TXML structure but enhanced for schema-aware parsing\n */\n\nexport type OnErrorFn = (\n message: string,\n metadata?: Record<string, unknown>\n) => void;\n\n/**\n * Represents a parsed XML node in the DOM tree\n */\nexport interface RXMLNode {\n tagName: string;\n attributes: Record<string, string | null>;\n children: (RXMLNode | string)[];\n}\n\n/**\n * Options for XML parsing\n */\nexport interface ParseOptions {\n /** Position to start parsing from (for streaming) */\n pos?: number;\n /** Array of tag names that don't have children and don't need to be closed */\n noChildNodes?: string[];\n /** Whether to set position information in result */\n setPos?: boolean;\n /** Keep comments in the parsed result */\n keepComments?: boolean;\n /** Keep whitespace like spaces, tabs and line breaks as string content */\n keepWhitespace?: boolean;\n /** Name of the text node property (default: \"#text\") */\n textNodeName?: string;\n /** Whether to throw on duplicate string tags */\n throwOnDuplicateStringTags?: boolean;\n /** Error handling callback */\n onError?: OnErrorFn;\n /**\n * Apply internal repair heuristics for fragment parsing.\n * When enabled, parsing attempts normalization/repair before throwing.\n */\n repair?: boolean;\n /** Maximum reparses when repair heuristics are enabled */\n maxReparses?: number;\n /** Whether to parse a single node instead of children */\n parseNode?: boolean;\n /** Filter function for nodes */\n filter?: (\n node: RXMLNode,\n index: number,\n depth: number,\n path: string\n ) => boolean;\n /** Simplify the result structure */\n simplify?: boolean;\n}\n\n/**\n * Options for XML stringification\n */\nexport interface StringifyOptions {\n /** Whether to format the output with indentation */\n format?: boolean;\n /** Whether to suppress empty nodes */\n suppressEmptyNode?: boolean;\n /**\n * Whether to use minimal escaping per XML 1.0:\n * - In character data: escape '&' and '<' (and '>' only in ']]>' sequence)\n * - In attribute values: escape '&', '<', and only the wrapping quote\n * Defaults to false (conservative escaping of &, <, >, \", ')\n */\n minimalEscaping?: boolean;\n /** Error handling callback */\n onError?: OnErrorFn;\n /**\n * Whether to serialize boolean-like attributes (value === null)\n * as name=\"name\" to follow strict XML attribute rules.\n * When false (default), serialize as a convenience flag without value\n * (e.g., <item checked>), for compatibility with existing outputs.\n */\n strictBooleanAttributes?: boolean;\n /**\n * Whether to include the XML declaration\n */\n declaration?: boolean;\n}\n\n/**\n * Result of parsing with position information\n */\nexport interface ParseResult {\n result: (RXMLNode | string)[];\n pos: number;\n}\n\n/**\n * Character code constants for efficient parsing\n */\nexport const CharCodes = {\n OPEN_BRACKET: \"<\".charCodeAt(0),\n CLOSE_BRACKET: \">\".charCodeAt(0),\n MINUS: \"-\".charCodeAt(0),\n SLASH: \"/\".charCodeAt(0),\n EXCLAMATION: \"!\".charCodeAt(0),\n QUESTION: \"?\".charCodeAt(0),\n SINGLE_QUOTE: \"'\".charCodeAt(0),\n DOUBLE_QUOTE: '\"'.charCodeAt(0),\n OPEN_CORNER_BRACKET: \"[\".charCodeAt(0),\n CLOSE_CORNER_BRACKET: \"]\".charCodeAt(0),\n SPACE: \" \".charCodeAt(0),\n TAB: \"\\t\".charCodeAt(0),\n NEWLINE: \"\\n\".charCodeAt(0),\n CARRIAGE_RETURN: \"\\r\".charCodeAt(0),\n} as const;\n\n/**\n * Default self-closing HTML tags\n */\nexport const DEFAULT_NO_CHILD_NODES = [\n \"img\",\n \"br\",\n \"input\",\n \"meta\",\n \"link\",\n \"hr\",\n \"area\",\n \"base\",\n \"col\",\n \"embed\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n] as const;\n\n/**\n * Name spacer characters for tag name parsing\n */\nexport const NAME_SPACER = \"\\r\\n\\t>/= \";\n","/**\n * Utility functions for XML parsing\n */\n\nimport { CharCodes, NAME_SPACER } from \"../core/types\";\n\nconst NAME_START_CHAR_REGEX = /[A-Za-z_:]/;\nconst NAME_CHAR_REGEX = /[A-Za-z0-9_.:-]/;\n\n/**\n * Check if a character is a valid XML name start character\n */\nexport function isNameStartChar(ch: string): boolean {\n return NAME_START_CHAR_REGEX.test(ch);\n}\n\n/**\n * Check if a character is a valid XML name character\n */\nexport function isNameChar(ch: string): boolean {\n return NAME_CHAR_REGEX.test(ch);\n}\n\n/**\n * Check if a character is whitespace\n */\nexport function isWhitespace(charCode: number): boolean {\n return (\n charCode === CharCodes.SPACE ||\n charCode === CharCodes.TAB ||\n charCode === CharCodes.NEWLINE ||\n charCode === CharCodes.CARRIAGE_RETURN\n );\n}\n\n/**\n * Skip over quoted string content in XML\n */\nexport function skipQuoted(s: string, i: number): number {\n const quote = s[i];\n let pos = i + 1;\n while (pos < s.length) {\n const ch = s[pos];\n if (ch === \"\\\\\") {\n pos += 2;\n continue;\n }\n if (ch === quote) {\n return pos + 1;\n }\n pos += 1;\n }\n return pos;\n}\n\n/**\n * Parse a tag name from the current position\n */\nexport function parseName(\n s: string,\n pos: number\n): { name: string; newPos: number } {\n const start = pos;\n let currentPos = pos;\n while (NAME_SPACER.indexOf(s[currentPos]) === -1 && s[currentPos]) {\n currentPos += 1;\n }\n return { name: s.slice(start, currentPos), newPos: currentPos };\n}\n\n/**\n * Parse a quoted string value\n */\nexport function parseString(\n s: string,\n pos: number\n): { value: string; newPos: number } {\n const startChar = s[pos];\n const startPos = pos + 1;\n const endPos = s.indexOf(startChar, startPos);\n if (endPos === -1) {\n // Unclosed string - find the next > to continue parsing\n const tagEnd = s.indexOf(\">\", startPos);\n if (tagEnd !== -1) {\n return { value: s.slice(startPos, tagEnd), newPos: tagEnd };\n }\n // If no > found, return what we have\n return { value: s.slice(startPos), newPos: s.length };\n }\n return { value: s.slice(startPos, endPos), newPos: endPos + 1 };\n}\n\n/**\n * Find elements by attribute value (used for getElementById, etc.)\n */\nexport function findElementsByAttr(\n xmlString: string,\n attrName: string,\n attrValue: string\n): number[] {\n const regex = new RegExp(`\\\\s${attrName}\\\\s*=['\"\"]${attrValue}['\"\"]`);\n const positions: number[] = [];\n let searchPos = 0;\n\n while (true) {\n const match = regex.exec(xmlString.slice(searchPos));\n if (!match) {\n break;\n }\n\n const pos = xmlString.lastIndexOf(\"<\", searchPos + match.index);\n if (pos !== -1) {\n positions.push(pos);\n }\n searchPos += match.index + match[0].length;\n }\n\n return positions;\n}\n\n/**\n * Calculate line and column from position in string\n */\nexport function getLineColumn(\n s: string,\n pos: number\n): { line: number; column: number } {\n let line = 1;\n let column = 1;\n\n for (let i = 0; i < pos && i < s.length; i += 1) {\n if (s[i] === \"\\n\") {\n line += 1;\n column = 1;\n } else {\n column += 1;\n }\n }\n\n return { line, column };\n}\n\n/**\n * Escape XML special characters used in element content and attribute values.\n *\n * References (W3C XML 1.0, Fifth Edition):\n * - 2.4 Character Data and Markup: '<' and '&' MUST NOT appear literally in content;\n * they MUST be escaped. '>' MUST be escaped in the sequence ']]>' and MAY be\n * escaped otherwise. Spec: https://www.w3.org/TR/2008/REC-xml-20081126/\n * - 3.1 Start-Tags, End-Tags, and Empty-Element Tags (AttValue [10]): attribute\n * values are quoted with ' or \", and the matching quote MUST be escaped inside.\n * - 4.6 Predefined Entities: amp, lt, gt, apos, quot MUST be recognized by all\n * XML processors. Spec: https://www.w3.org/TR/2008/REC-xml-20081126/#sec-predefined-ent\n *\n * We conservatively escape &, <, >, \", ' using the predefined entities.\n */\nexport function escapeXml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/**\n * Minimal escaping for character data per XML 1.0 §2.4.\n * - Escape '&' and '<' always\n * - Escape only the ']]>' sequence by turning '>' into '>' in that context\n */\nexport function escapeXmlMinimalText(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/]]>/g, \"]]>\");\n}\n\n/**\n * Minimal escaping for attribute values per XML 1.0 §3.1 (AttValue [10]).\n * - Escape '&' and '<' always\n * - Escape only the wrapper quote among ' or \"\n */\nexport function escapeXmlMinimalAttr(\n value: string,\n wrapper: '\"' | \"'\" = '\"'\n): string {\n let escaped = value.replace(/&/g, \"&\").replace(/</g, \"<\");\n if (wrapper === '\"') {\n escaped = escaped.replace(/\"/g, \""\");\n } else {\n escaped = escaped.replace(/'/g, \"'\");\n }\n return escaped;\n}\n\n/**\n * Unescape XML entities\n */\nexport function unescapeXml(text: string): string {\n return text\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\");\n}\n","/**\n * XML stringification based on TXML's stringify approach\n * Replaces the fast-xml-parser XMLBuilder with a native implementation\n */\n\nimport type { RXMLNode, StringifyOptions } from \"../core/types\";\nimport { RXMLStringifyError } from \"../errors/types\";\nimport {\n escapeXml,\n escapeXmlMinimalAttr,\n escapeXmlMinimalText,\n} from \"../utils/helpers\";\n\n/**\n * Stringify an object to XML\n */\nexport function stringify(\n rootTag: string,\n obj: unknown,\n options: StringifyOptions = {}\n): string {\n try {\n const format = options.format ?? true;\n const declaration = options.declaration ?? false;\n const minimalEscaping = options.minimalEscaping ?? false;\n const suppressEmptyNode = options.suppressEmptyNode ?? false;\n const strictBooleanAttributes = options.strictBooleanAttributes ?? false;\n\n let result = \"\";\n\n if (declaration) {\n result += '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n }\n\n result += stringifyValue(rootTag, obj, {\n depth: 0,\n format,\n suppressEmptyNode,\n minimalEscaping,\n strictBooleanAttributes,\n });\n\n if (result.endsWith(\"\\n\")) {\n return result.slice(0, -1);\n }\n\n return result;\n } catch (error) {\n throw new RXMLStringifyError(\"Failed to stringify XML\", error);\n }\n}\n\ninterface StringifyContext {\n depth: number;\n format: boolean;\n suppressEmptyNode: boolean;\n minimalEscaping: boolean;\n strictBooleanAttributes: boolean;\n}\n\n/**\n * Escape content based on escaping mode\n */\nfunction escapeContent(content: string, minimalEscaping: boolean): string {\n return minimalEscaping ? escapeXmlMinimalText(content) : escapeXml(content);\n}\n\n/**\n * Create self-closing tag\n */\nfunction createSelfClosingTag(\n tagName: string,\n indent: string,\n newline: string\n): string {\n return `${indent}<${tagName}/>${newline}`;\n}\n\n/**\n * Create element with text content\n */\nfunction createTextElement(\n tagName: string,\n content: string,\n indent: string,\n newline: string\n): string {\n return `${indent}<${tagName}>${content}</${tagName}>${newline}`;\n}\n\n/**\n * Check if value is a primitive type\n */\nfunction isPrimitive(value: unknown): boolean {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n );\n}\n\ninterface FormatOptions {\n indent: string;\n newline: string;\n}\n\n/**\n * Stringify a primitive value\n */\nfunction stringifyPrimitive(\n tagName: string,\n value: unknown,\n context: StringifyContext,\n format: FormatOptions\n): string {\n const { minimalEscaping, suppressEmptyNode } = context;\n const content = escapeContent(String(value), minimalEscaping);\n\n if (content === \"\" && suppressEmptyNode) {\n return \"\";\n }\n\n return createTextElement(tagName, content, format.indent, format.newline);\n}\n\n/**\n * Stringify an array value\n */\nfunction stringifyArray(\n tagName: string,\n value: unknown[],\n context: StringifyContext\n): string {\n let result = \"\";\n for (const item of value) {\n result += stringifyValue(tagName, item, context);\n }\n return result;\n}\n\n/**\n * Stringify a value to XML format\n */\nfunction stringifyValue(\n tagName: string,\n value: unknown,\n context: StringifyContext\n): string {\n const { format, suppressEmptyNode, minimalEscaping } = context;\n const indent = format ? \" \".repeat(context.depth) : \"\";\n const newline = format ? \"\\n\" : \"\";\n\n if (value === null || value === undefined) {\n if (suppressEmptyNode) {\n return \"\";\n }\n return createSelfClosingTag(tagName, indent, newline);\n }\n\n if (isPrimitive(value)) {\n return stringifyPrimitive(tagName, value, context, { indent, newline });\n }\n\n if (Array.isArray(value)) {\n return stringifyArray(tagName, value, context);\n }\n\n if (typeof value === \"object\") {\n return stringifyObject(tagName, value as Record<string, unknown>, context);\n }\n\n // Fallback for other types\n const content = escapeContent(String(value), minimalEscaping);\n if (content === \"\" && suppressEmptyNode) {\n return \"\";\n }\n return createTextElement(tagName, content, indent, newline);\n}\n\ninterface ObjectParts {\n attributes: Record<string, unknown>;\n elements: Record<string, unknown>;\n textContent: string | undefined;\n}\n\n/**\n * Extract attributes, elements, and text content from an object\n */\nfunction extractObjectParts(obj: Record<string, unknown>): ObjectParts {\n const attributes: Record<string, unknown> = {};\n const elements: Record<string, unknown> = {};\n let textContent: string | undefined;\n\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith(\"@\")) {\n attributes[key.substring(1)] = value;\n } else if (key === \"#text\" || key === \"_text\") {\n textContent = String(value);\n } else if (key === \"_attributes\") {\n if (typeof value === \"object\" && value !== null) {\n Object.assign(attributes, value as Record<string, unknown>);\n }\n } else {\n elements[key] = value;\n }\n }\n\n return { attributes, elements, textContent };\n}\n\n/**\n * Format a single attribute\n */\nfunction formatAttribute(\n attrName: string,\n attrValue: unknown,\n minimalEscaping: boolean,\n strictBooleanAttributes: boolean\n): string {\n if (attrValue === null) {\n return strictBooleanAttributes\n ? ` ${attrName}=\"${attrName}\"`\n : ` ${attrName}`;\n }\n\n const valueStr = String(attrValue);\n // Attribute quoting strategy per XML 1.0:\n // - 3.1 (AttValue [10]): attribute values MUST be quoted with ' or \".\n // If the same quote appears in the value, it MUST be escaped (via\n // predefined entities per 4.6). We choose the quote that minimizes\n // escaping: prefer \" unless value contains \", otherwise use '.\n // See: https://www.w3.org/TR/2008/REC-xml-20081126/\n if (valueStr.indexOf('\"') === -1) {\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(valueStr, '\"')\n : escapeXml(valueStr);\n return ` ${attrName}=\"${escaped}\"`;\n }\n\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(valueStr, \"'\")\n : escapeXml(valueStr);\n return ` ${attrName}='${escaped}'`;\n}\n\n/**\n * Build opening tag with attributes\n */\nfunction buildOpeningTag(\n tagName: string,\n attributes: Record<string, unknown>,\n context: StringifyContext\n): string {\n let openTag = `<${tagName}`;\n const { minimalEscaping, strictBooleanAttributes } = context;\n\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n openTag += formatAttribute(\n attrName,\n attrValue,\n minimalEscaping,\n strictBooleanAttributes\n );\n }\n\n return openTag;\n}\n\n/**\n * Stringify text-only content\n */\nfunction stringifyTextOnlyContent(options: {\n tagName: string;\n textContent: string;\n openTag: string;\n format: FormatOptions;\n minimalEscaping: boolean;\n}): string {\n const { tagName, textContent, openTag, format, minimalEscaping } = options;\n const content = escapeContent(textContent, minimalEscaping);\n return `${format.indent}${openTag}${content}</${tagName}>${format.newline}`;\n}\n\ninterface ComplexContentOptions {\n indent: string;\n newline: string;\n childIndent: string;\n openTag: string;\n}\n\n/**\n * Stringify complex content (text + elements)\n */\nfunction stringifyComplexContent(\n tagName: string,\n parts: ObjectParts,\n context: StringifyContext,\n options: ComplexContentOptions\n): string {\n const { format, minimalEscaping, depth } = context;\n const { textContent, elements } = parts;\n const hasElements = Object.keys(elements).length > 0;\n\n let result = `${options.indent}${options.openTag}`;\n\n if (textContent) {\n const content = escapeContent(textContent, minimalEscaping);\n result += format\n ? `${options.newline}${options.childIndent}${content}`\n : content;\n }\n\n if (hasElements) {\n if (format) {\n result += options.newline;\n }\n\n for (const [elementName, elementValue] of Object.entries(elements)) {\n result += stringifyValue(elementName, elementValue, {\n ...context,\n depth: depth + 1,\n });\n }\n\n if (format) {\n result += options.indent;\n }\n }\n\n result += `</${tagName}>${options.newline}`;\n return result;\n}\n\n/**\n * Stringify an object to XML\n */\nfunction stringifyObject(\n tagName: string,\n obj: Record<string, unknown>,\n context: StringifyContext\n): string {\n const { depth, format, suppressEmptyNode } = context;\n const indent = format ? \" \".repeat(depth) : \"\";\n const newline = format ? \"\\n\" : \"\";\n const childIndent = format ? \" \".repeat(depth + 1) : \"\";\n\n const parts = extractObjectParts(obj);\n const openTag = buildOpeningTag(tagName, parts.attributes, context);\n\n // Check if we have any content\n const hasElements = Object.keys(parts.elements).length > 0;\n const hasTextContent =\n parts.textContent !== undefined && parts.textContent !== \"\";\n\n if (!(hasElements || hasTextContent)) {\n if (suppressEmptyNode) {\n return \"\";\n }\n return `${indent}${openTag}/>${newline}`;\n }\n\n const fullOpenTag = `${openTag}>`;\n\n // Handle text-only content\n if (!hasElements && hasTextContent && parts.textContent) {\n return stringifyTextOnlyContent({\n tagName,\n textContent: parts.textContent,\n openTag: fullOpenTag,\n format: { indent, newline },\n minimalEscaping: context.minimalEscaping,\n });\n }\n\n // Handle complex content\n return stringifyComplexContent(tagName, parts, context, {\n indent,\n newline,\n childIndent,\n openTag: fullOpenTag,\n });\n}\n\n/**\n * Stringify parsed XML nodes back to XML string\n */\nexport function stringifyNodes(\n nodes: (RXMLNode | string)[],\n format = true,\n options: Pick<\n StringifyOptions,\n \"strictBooleanAttributes\" | \"minimalEscaping\"\n > = {}\n): string {\n let result = \"\";\n\n for (const node of nodes) {\n if (typeof node === \"string\") {\n result += node;\n } else {\n result += stringifyNode(node, 0, format, options);\n }\n }\n\n return result;\n}\n\ninterface NodeStringifyOptions {\n minimalEscaping: boolean;\n strictBooleanAttributes: boolean;\n indent: string;\n newline: string;\n}\n\n/**\n * Format a single node attribute\n */\nfunction formatNodeAttribute(\n attrName: string,\n attrValue: string | null,\n minimalEscaping: boolean,\n strictBooleanAttributes: boolean\n): string {\n if (attrValue === null) {\n if (strictBooleanAttributes) {\n return ` ${attrName}=\"${attrName}\"`;\n }\n return ` ${attrName}`;\n }\n\n if (attrValue.indexOf('\"') === -1) {\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(attrValue, '\"')\n : escapeXml(attrValue);\n return ` ${attrName}=\"${escaped}\"`;\n }\n\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(attrValue, \"'\")\n : escapeXml(attrValue);\n return ` ${attrName}='${escaped}'`;\n}\n\n/**\n * Build opening tag with attributes\n */\nfunction buildNodeOpeningTag(\n node: RXMLNode,\n opts: NodeStringifyOptions\n): string {\n let result = `${opts.indent}<${node.tagName}`;\n\n for (const [attrName, attrValue] of Object.entries(node.attributes)) {\n result += formatNodeAttribute(\n attrName,\n attrValue,\n opts.minimalEscaping,\n opts.strictBooleanAttributes\n );\n }\n\n return result;\n}\n\n/**\n * Stringify node children\n */\nfunction stringifyNodeChildren(options: {\n children: (RXMLNode | string)[];\n depth: number;\n format: boolean;\n stringifyOptions: Pick<\n StringifyOptions,\n \"strictBooleanAttributes\" | \"minimalEscaping\"\n >;\n minimalEscaping: boolean;\n newline: string;\n}): { content: string; hasElementChildren: boolean } {\n const {\n children,\n depth,\n format,\n stringifyOptions,\n minimalEscaping,\n newline,\n } = options;\n let content = \"\";\n let hasElementChildren = false;\n\n for (const child of children) {\n if (typeof child === \"string\") {\n content += minimalEscaping\n ? escapeXmlMinimalText(child)\n : escapeXml(child);\n } else {\n if (!hasElementChildren && format) {\n content += newline;\n hasElementChildren = true;\n }\n content += stringifyNode(child, depth + 1, format, stringifyOptions);\n }\n }\n\n return { content, hasElementChildren };\n}\n\n/**\n * Stringify a single XML node\n */\nexport function stringifyNode(\n node: RXMLNode,\n depth = 0,\n format = true,\n options: Pick<\n StringifyOptions,\n \"strictBooleanAttributes\" | \"minimalEscaping\"\n > = {}\n): string {\n const indent = format ? \" \".repeat(depth) : \"\";\n const newline = format ? \"\\n\" : \"\";\n const minimalEscaping = options.minimalEscaping ?? false;\n const strictBooleanAttributes = options.strictBooleanAttributes ?? false;\n\n const opts: NodeStringifyOptions = {\n minimalEscaping,\n strictBooleanAttributes,\n indent,\n newline,\n };\n\n let result = buildNodeOpeningTag(node, opts);\n\n // Handle processing instructions\n if (node.tagName[0] === \"?\") {\n return `${result}?>${newline}`;\n }\n\n // Handle self-closing tags\n if (node.children.length === 0) {\n return `${result}/>${newline}`;\n }\n\n result += \">\";\n\n // Handle children\n const { content, hasElementChildren } = stringifyNodeChildren({\n children: node.children,\n depth,\n format,\n stringifyOptions: options,\n minimalEscaping,\n newline,\n });\n\n result += content;\n\n if (hasElementChildren && format) {\n result += indent;\n }\n\n result += `</${node.tagName}>`;\n\n if (format) {\n result += newline;\n }\n\n return result;\n}\n\n/**\n * Convert content to a string representation (similar to TXML's toContentString)\n */\nexport function toContentString(nodes: (RXMLNode | string)[]): string {\n let result = \"\";\n\n for (const node of nodes) {\n if (typeof node === \"string\") {\n result += ` ${node}`;\n } else {\n result += ` ${toContentString(node.children)}`;\n }\n result = result.trim();\n }\n\n return result;\n}\n","// Regex constants for performance\nconst NUMERIC_REGEX = /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/;\nconst EMPTY_OBJECT_REGEX = /^\\{\\s*\\}$/s;\nconst NEWLINE_SPLIT_REGEX = /\\n+/;\nconst COMMA_SPLIT_REGEX = /,\\s*/;\nconst DIGIT_KEY_REGEX = /^\\d+$/;\n\nexport function unwrapJsonSchema(schema: unknown): unknown {\n if (!schema || typeof schema !== \"object\") {\n return schema;\n }\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\") {\n return;\n }\n const t: unknown = (unwrapped as Record<string, unknown>).type;\n if (typeof t === \"string\") {\n return t;\n }\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) {\n if (t.includes(p)) {\n return p;\n }\n }\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;\n}\n\n/**\n * Coerce string value without schema information\n */\nfunction coerceStringWithoutSchema(value: string): unknown {\n const s = value.trim();\n const lower = s.toLowerCase();\n if (lower === \"true\") {\n return true;\n }\n if (lower === \"false\") {\n return false;\n }\n if (NUMERIC_REGEX.test(s)) {\n const num = Number(s);\n if (Number.isFinite(num)) {\n return num;\n }\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 return coerceBySchema(parsed, undefined);\n } catch {\n // If parsing fails, return original value\n }\n }\n return value;\n}\n\n/**\n * Coerce string to object using schema\n */\nfunction coerceStringToObject(\n s: string,\n unwrapped: Record<string, unknown>\n): unknown {\n try {\n let normalized = s.replace(/'/g, '\"');\n normalized = normalized.replace(EMPTY_OBJECT_REGEX, \"{}\");\n\n const obj = JSON.parse(normalized);\n if (obj && typeof obj === \"object\" && !Array.isArray(obj)) {\n const props = unwrapped.properties as Record<string, unknown> | 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\" ? v : coerceBySchema(v, propSchema);\n }\n return out;\n }\n } catch {\n // fallthrough\n }\n return null;\n}\n\n/**\n * Coerce string to array using schema\n */\nfunction coerceStringToArray(\n s: string,\n unwrapped: Record<string, unknown>\n): unknown {\n const prefixItems = Array.isArray(unwrapped.prefixItems)\n ? (unwrapped.prefixItems as unknown[])\n : undefined;\n const itemsSchema = unwrapped.items as unknown;\n\n try {\n const normalized = s.replace(/'/g, '\"');\n const arr = JSON.parse(normalized);\n if (Array.isArray(arr)) {\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\")\n ? s.split(NEWLINE_SPLIT_REGEX)\n : s.split(COMMA_SPLIT_REGEX);\n const trimmed = csv.map((x) => x.trim()).filter((x) => x.length > 0);\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 return null;\n}\n\n/**\n * Coerce object to object using schema\n */\nfunction coerceObjectToObject(\n value: Record<string, unknown>,\n unwrapped: Record<string, unknown>\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const props = unwrapped.properties as Record<string, unknown> | undefined;\n for (const [k, v] of Object.entries(value)) {\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/**\n * Coerce array to array using schema\n */\nfunction coerceArrayToArray(\n value: unknown[],\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown[] {\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/**\n * Coerce object to array using schema\n */\nfunction coerceObjectToArray(\n maybe: Record<string, unknown>,\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown {\n if (Object.hasOwn(maybe, \"item\")) {\n const items = maybe.item as unknown;\n const arr = Array.isArray(items) ? items : [items];\n return coerceArrayToArray(arr, prefixItems, itemsSchema);\n }\n\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 singleValue = maybe[keys[0]];\n if (Array.isArray(singleValue)) {\n return singleValue.map((v) => coerceBySchema(v, itemsSchema));\n }\n }\n\n // Check for numeric keys (traditional tuple handling)\n if (keys.length > 0 && keys.every((k) => DIGIT_KEY_REGEX.test(k))) {\n const arr = keys.sort((a, b) => Number(a) - Number(b)).map((k) => maybe[k]);\n return coerceArrayToArray(arr, prefixItems, itemsSchema);\n }\n\n return null;\n}\n\n/**\n * Coerce primitive to array using schema\n */\nfunction coercePrimitiveToArray(\n value: unknown,\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown[] {\n if (prefixItems && prefixItems.length > 0) {\n return [coerceBySchema(value, prefixItems[0])];\n }\n return [coerceBySchema(value, itemsSchema)];\n}\n\n/**\n * Coerce string to primitive type using schema\n */\nfunction coerceStringToPrimitive(\n s: string,\n schemaType: string | undefined\n): unknown {\n if (schemaType === \"boolean\") {\n const lower = s.toLowerCase();\n if (lower === \"true\") {\n return true;\n }\n if (lower === \"false\") {\n return false;\n }\n }\n if (\n (schemaType === \"number\" || schemaType === \"integer\") &&\n NUMERIC_REGEX.test(s)\n ) {\n const num = Number(s);\n if (Number.isFinite(num)) {\n return num;\n }\n }\n return null;\n}\n\nfunction coerceStringValue(\n value: string,\n schemaType: string | undefined,\n u: Record<string, unknown>\n): unknown {\n const s = value.trim();\n\n if (schemaType === \"object\") {\n const result = coerceStringToObject(s, u);\n if (result !== null) {\n return result;\n }\n }\n\n if (schemaType === \"array\") {\n const result = coerceStringToArray(s, u);\n if (result !== null) {\n return result;\n }\n }\n\n const primitiveResult = coerceStringToPrimitive(s, schemaType);\n if (primitiveResult !== null) {\n return primitiveResult;\n }\n\n return value;\n}\n\nfunction coerceArrayValue(\n value: unknown,\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown {\n if (Array.isArray(value)) {\n return coerceArrayToArray(value, prefixItems, itemsSchema);\n }\n\n if (value && typeof value === \"object\") {\n const result = coerceObjectToArray(\n value as Record<string, unknown>,\n prefixItems,\n itemsSchema\n );\n if (result !== null) {\n return result;\n }\n }\n\n if (\n value == null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return coercePrimitiveToArray(value, prefixItems, itemsSchema);\n }\n\n return value;\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 return coerceStringWithoutSchema(value);\n }\n return value;\n }\n\n const schemaType = getSchemaType(unwrapped);\n const u = unwrapped as Record<string, unknown>;\n\n // Handle string values\n if (typeof value === \"string\") {\n return coerceStringValue(value, schemaType, u);\n }\n\n // Handle object to object coercion\n if (\n schemaType === \"object\" &&\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n return coerceObjectToObject(value as Record<string, unknown>, u);\n }\n\n // Handle array coercion\n if (schemaType === \"array\") {\n const prefixItems = Array.isArray(u.prefixItems)\n ? (u.prefixItems as unknown[])\n : undefined;\n const itemsSchema = u.items as unknown;\n\n return coerceArrayValue(value, prefixItems, itemsSchema);\n }\n\n return value;\n}\n","/**\n * Schema-aware type coercion for robust-xml\n * Integrates with the existing coercion system but adds XML-specific handling\n */\n\nimport {\n coerceBySchema as baseCoerceBySchema,\n getSchemaType,\n unwrapJsonSchema,\n} from \"../../schema-coerce\";\nimport type { RXMLNode } from \"../core/types\";\nimport { RXMLCoercionError } from \"../errors/types\";\n\n/**\n * Get property schema from a parent schema\n */\nexport function getPropertySchema(toolSchema: unknown, key: string): unknown {\n const unwrapped = unwrapJsonSchema(toolSchema);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n return;\n }\n const u = unwrapped as Record<string, unknown>;\n const props = u.properties as Record<string, unknown> | undefined;\n if (props && Object.hasOwn(props, key)) {\n return (props as Record<string, unknown>)[key];\n }\n return;\n}\n\n/**\n * Get node value from children\n */\nfunction getNodeValue(\n children: (RXMLNode | string)[],\n schema: unknown,\n tagName: string,\n textNodeName: string\n): unknown {\n if (children.length === 0) {\n return \"\";\n }\n if (children.length === 1 && typeof children[0] === \"string\") {\n return children[0];\n }\n return processComplexContent(\n children,\n getPropertySchema(schema, tagName),\n textNodeName\n );\n}\n\n/**\n * Add attributes to value\n */\nfunction addAttributesToValue(\n value: unknown,\n attributes: Record<string, string | null>,\n textNodeName: string\n): unknown {\n if (Object.keys(attributes).length === 0) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const valueResult: Record<string, unknown> = { [textNodeName]: value };\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n valueResult[`@_${attrName}`] = attrValue;\n }\n return valueResult;\n }\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n (value as Record<string, unknown>)[`@_${attrName}`] = attrValue;\n }\n }\n\n return value;\n}\n\n/**\n * Add value to result, handling duplicates\n */\nfunction addToResult(\n result: Record<string, unknown>,\n tagName: string,\n value: unknown\n): void {\n if (result[tagName]) {\n if (!Array.isArray(result[tagName])) {\n result[tagName] = [result[tagName]];\n }\n (result[tagName] as unknown[]).push(value);\n } else {\n result[tagName] = value;\n }\n}\n\n/**\n * Convert TXML-style DOM to flat object structure for schema coercion\n */\nexport function domToObject(\n nodes: (RXMLNode | string)[],\n schema: unknown,\n textNodeName = \"#text\"\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const node of nodes) {\n if (typeof node === \"string\") {\n continue;\n }\n\n const { tagName, children, attributes } = node;\n let value = getNodeValue(children, schema, tagName, textNodeName);\n value = addAttributesToValue(value, attributes, textNodeName);\n addToResult(result, tagName, value);\n }\n\n return result;\n}\n\n/**\n * Process child element node\n */\nfunction processChildElement(\n child: RXMLNode,\n schema: unknown,\n textNodeName: string\n): unknown {\n let childValue: unknown;\n\n if (child.children.length === 0) {\n childValue = \"\";\n } else if (\n child.children.length === 1 &&\n typeof child.children[0] === \"string\"\n ) {\n childValue = child.children[0];\n } else {\n childValue = processComplexContent(\n child.children,\n getPropertySchema(schema, child.tagName),\n textNodeName\n );\n }\n\n return addAttributesToValue(childValue, child.attributes, textNodeName);\n}\n\n/**\n * Combine text and elements into result\n */\nfunction combineContent(\n textContent: string[],\n elements: Record<string, unknown>,\n textNodeName: string\n): unknown {\n const hasText = textContent.length > 0;\n const hasElements = Object.keys(elements).length > 0;\n\n if (hasText && hasElements) {\n return {\n [textNodeName]: textContent.join(\"\").trim(),\n ...elements,\n };\n }\n\n if (hasText) {\n return textContent.join(\"\").trim();\n }\n\n if (hasElements) {\n return elements;\n }\n\n return \"\";\n}\n\n/**\n * Process complex content (mixed text and elements)\n */\nfunction processComplexContent(\n children: (RXMLNode | string)[],\n schema: unknown,\n textNodeName: string\n): unknown {\n const textContent: string[] = [];\n const elements: Record<string, unknown> = {};\n\n for (const child of children) {\n if (typeof child === \"string\") {\n textContent.push(child);\n } else {\n const childValue = processChildElement(child, schema, textNodeName);\n addToResult(elements, child.tagName, childValue);\n }\n }\n\n return combineContent(textContent, elements, textNodeName);\n}\n\n/**\n * Coerce DOM object using schema information\n */\nexport function coerceDomBySchema(\n domObject: Record<string, unknown>,\n schema: unknown\n): Record<string, unknown> {\n try {\n return baseCoerceBySchema(domObject, schema) as Record<string, unknown>;\n } catch (error) {\n throw new RXMLCoercionError(\"Failed to coerce DOM object by schema\", error);\n }\n}\n\n/**\n * Visit object schema properties\n */\nfunction visitObjectProperties(\n props: Record<string, unknown>,\n collected: Set<string>,\n visit: (s: unknown) => void\n): void {\n for (const [key, propSchema] of Object.entries(props)) {\n const t = getSchemaType(propSchema);\n if (t === \"string\") {\n collected.add(key);\n } else if (t === \"object\" || t === \"array\") {\n visit(propSchema);\n }\n }\n}\n\n/**\n * Visit array schema items\n */\nfunction visitArrayItems(\n u: Record<string, unknown>,\n visit: (s: unknown) => void\n): void {\n const items = u.items as unknown;\n if (items) {\n visit(items);\n }\n const prefix = u.prefixItems as unknown[] | undefined;\n if (Array.isArray(prefix)) {\n for (const item of prefix) {\n visit(item);\n }\n }\n}\n\n/**\n * Extract string-typed property names from schema\n */\nexport function getStringTypedProperties(schema: unknown): Set<string> {\n const collected = new Set<string>();\n\n const visit = (s: unknown): void => {\n const unwrapped = unwrapJsonSchema(s);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n return;\n }\n const u = unwrapped as Record<string, unknown>;\n const type = getSchemaType(unwrapped);\n\n if (type === \"object\") {\n const props = u.properties as Record<string, unknown> | undefined;\n if (props && typeof props === \"object\") {\n visitObjectProperties(props, collected, visit);\n }\n } else if (type === \"array\") {\n visitArrayItems(u, visit);\n }\n };\n\n visit(schema);\n return collected;\n}\n\n/**\n * Process array-like structures from XML\n */\nexport function processArrayContent(\n value: unknown,\n schema: unknown,\n textNodeName: string\n): unknown {\n if (!Array.isArray(value)) {\n return value;\n }\n\n const schemaType = getSchemaType(schema);\n\n if (schemaType === \"string\") {\n // For string arrays, extract text content and take first item for duplicates\n return value.map((item) => {\n if (typeof item === \"string\") {\n return item.trim();\n }\n if (item && typeof item === \"object\" && textNodeName in item) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal.trim() : String(textVal);\n }\n return String(item);\n });\n }\n\n // For other types, process each item\n return value.map((item) => {\n if (typeof item === \"string\") {\n return item.trim();\n }\n if (item && typeof item === \"object\" && textNodeName in item) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal.trim() : textVal;\n }\n return item;\n });\n}\n\n/**\n * Handle indexed tuple structures (elements with numeric keys)\n */\nexport function processIndexedTuple(\n obj: Record<string, unknown>,\n textNodeName: string\n): unknown[] {\n const keys = Object.keys(obj);\n const indices = keys.map((k) => Number.parseInt(k, 10)).sort((a, b) => a - b);\n const isValidTuple =\n indices[0] === 0 && indices.every((val, idx) => val === idx);\n\n if (!isValidTuple) {\n return [obj];\n }\n\n const sortedKeys = keys.sort(\n (a, b) => Number.parseInt(a, 10) - Number.parseInt(b, 10)\n );\n return sortedKeys.map((key) => {\n const item = obj[key];\n if (item && typeof item === \"object\" && textNodeName in item) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal.trim() : textVal;\n }\n return typeof item === \"string\" ? item.trim() : item;\n });\n}\n","/**\n * Raw content extraction utilities for string-typed properties\n * This replaces the string-based extraction with DOM-based extraction\n */\n\nimport type { RXMLNode } from \"../core/types\";\nimport {\n isNameChar,\n isNameStartChar,\n parseName,\n skipQuoted,\n} from \"../utils/helpers\";\n\n/**\n * Helper to skip DOCTYPE declarations\n */\nfunction skipDoctype(xmlContent: string, i: number, len: number): number {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n}\n\n/**\n * Helper to skip comments\n */\nfunction skipComment(xmlContent: string, i: number, len: number): number {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n return close === -1 ? len : close + 3;\n}\n\n/**\n * Helper to skip CDATA sections\n */\nfunction skipCdata(xmlContent: string, i: number, len: number): number {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n return close === -1 ? len : close + 3;\n}\n\n/**\n * Helper to skip processing instructions\n */\nfunction skipProcessingInstruction(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n return close === -1 ? len : close + 2;\n}\n\n/**\n * Helper to skip special XML constructs (comments, CDATA, DOCTYPE, processing instructions)\n * Returns the new position after the construct, or -1 if not a special construct\n */\nfunction skipSpecialConstruct(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const ch = xmlContent[i];\n\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!DOCTYPE\", i + 1)) {\n return skipDoctype(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n return skipComment(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n return skipCdata(xmlContent, i, len);\n }\n // Other declarations\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n }\n\n if (ch === \"?\") {\n return skipProcessingInstruction(xmlContent, i, len);\n }\n\n return -1;\n}\n\n/**\n * Parse tag name starting at position i\n * Returns the tag name and position after the name\n */\nfunction parseTagName(\n xmlContent: string,\n i: number,\n len: number\n): { name: string; pos: number } {\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j += 1;\n while (j < len && isNameChar(xmlContent[j])) {\n j += 1;\n }\n }\n return { name: xmlContent.slice(i, j), pos: j };\n}\n\n/**\n * Skip to the end of a tag (finding the closing > or />)\n * Returns { pos: position after >, isSelfClosing: boolean }\n */\nfunction skipToTagEnd(\n xmlContent: string,\n start: number,\n len: number\n): { pos: number; isSelfClosing: boolean } {\n let k = start;\n let isSelfClosing = false;\n\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 += 1;\n break;\n }\n k += 1;\n }\n\n return { pos: k, isSelfClosing };\n}\n\n/**\n * Helper to process closing tag in findMatchingCloseTag\n */\nfunction processClosingTagMatch(options: {\n xmlContent: string;\n nx: number;\n len: number;\n tagName: string;\n depth: number;\n nextLt: number;\n}): { newPos: number; newDepth: number; found: boolean } {\n const { xmlContent, nx, len, tagName, depth, nextLt } = options;\n const tagInfo = parseTagName(xmlContent, nx + 1, len);\n const gt = xmlContent.indexOf(\">\", tagInfo.pos);\n\n if (tagInfo.name === tagName) {\n const newDepth = depth - 1;\n if (newDepth === 0) {\n return { newPos: nextLt, newDepth, found: true };\n }\n return { newPos: gt === -1 ? len : gt + 1, newDepth, found: false };\n }\n\n return { newPos: gt === -1 ? len : gt + 1, newDepth: depth, found: false };\n}\n\n/**\n * Helper to process opening tag in findMatchingCloseTag\n */\nfunction processOpeningTagMatch(options: {\n xmlContent: string;\n nx: number;\n len: number;\n tagName: string;\n depth: number;\n}): { newPos: number; newDepth: number } {\n const { xmlContent, nx, len, tagName, depth } = options;\n const tagInfo = parseTagName(xmlContent, nx, len);\n const tagEndInfo = skipToTagEnd(xmlContent, tagInfo.pos, len);\n\n const newDepth =\n tagInfo.name === tagName && !tagEndInfo.isSelfClosing ? depth + 1 : depth;\n\n const newPos =\n xmlContent[tagEndInfo.pos] === \">\"\n ? tagEndInfo.pos + 1\n : tagEndInfo.pos + 1;\n\n return { newPos, newDepth };\n}\n\n/**\n * Find the matching closing tag for a given opening tag\n * Returns the position of the start of the closing tag, or -1 if not found\n */\nfunction findMatchingCloseTag(\n xmlContent: string,\n startPos: number,\n tagName: string,\n len: number\n): number {\n let pos = startPos;\n let depth = 1;\n\n while (pos < len) {\n const nextLt = xmlContent.indexOf(\"<\", pos);\n if (nextLt === -1 || nextLt + 1 >= len) {\n break;\n }\n\n const nx = nextLt + 1;\n const h = xmlContent[nx];\n const specialPos = skipSpecialConstruct(xmlContent, nx, len);\n\n if (specialPos !== -1) {\n pos = specialPos;\n continue;\n }\n\n if (h === \"/\") {\n const result = processClosingTagMatch({\n xmlContent,\n nx,\n len,\n tagName,\n depth,\n nextLt,\n });\n if (result.found) {\n return result.newPos;\n }\n pos = result.newPos;\n depth = result.newDepth;\n } else {\n const result = processOpeningTagMatch({\n xmlContent,\n nx,\n len,\n tagName,\n depth,\n });\n pos = result.newPos;\n depth = result.newDepth;\n }\n }\n\n return -1;\n}\n\n/**\n * Helper to update best match if current depth is better\n */\nfunction updateBestMatch(\n depth: number,\n bestDepth: number,\n contentStart: number,\n contentEnd: number\n): { start: number; end: number; depth: number } | null {\n if (depth < bestDepth) {\n return { start: contentStart, end: contentEnd, depth };\n }\n return null;\n}\n\n/**\n * Helper to process target tag match\n */\nfunction processTargetTag(options: {\n xmlContent: string;\n tagEnd: number;\n isSelfClosing: boolean;\n target: string;\n len: number;\n depth: number;\n bestDepth: number;\n}): { start: number; end: number; depth: number } | null {\n const { xmlContent, tagEnd, isSelfClosing, target, len, depth, bestDepth } =\n options;\n const contentStart = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n\n if (isSelfClosing) {\n return updateBestMatch(depth, bestDepth, contentStart, contentStart);\n }\n\n const closePos = findMatchingCloseTag(xmlContent, contentStart, target, len);\n if (closePos !== -1) {\n return updateBestMatch(depth, bestDepth, contentStart, closePos);\n }\n return null;\n}\n\n/**\n * Helper to handle closing tag in extractRawInner\n */\nfunction handleClosingTagInExtract(\n xmlContent: string,\n i: number,\n len: number,\n depth: number\n): { newPos: number; newDepth: number } {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return {\n newPos: gt === -1 ? len : gt + 1,\n newDepth: Math.max(0, depth - 1),\n };\n}\n\n/**\n * Helper to process opening tag in extractRawInner\n */\nfunction processOpeningTagInExtract(options: {\n xmlContent: string;\n i: number;\n len: number;\n target: string;\n depth: number;\n bestDepth: number;\n}): {\n newPos: number;\n newDepth: number;\n bestMatch: { start: number; end: number; depth: number } | null;\n} {\n const { xmlContent, i, len, target, depth, bestDepth } = options;\n const tagInfo = parseTagName(xmlContent, i, len);\n const tagEndInfo = skipToTagEnd(xmlContent, tagInfo.pos, len);\n const tagEnd = tagEndInfo.pos;\n const isSelfClosing = tagEndInfo.isSelfClosing;\n\n let bestMatch: { start: number; end: number; depth: number } | null = null;\n if (tagInfo.name === target) {\n bestMatch = processTargetTag({\n xmlContent,\n tagEnd,\n isSelfClosing,\n target,\n len,\n depth,\n bestDepth,\n });\n }\n\n return {\n newPos: xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1,\n newDepth: depth + (isSelfClosing ? 0 : 1),\n bestMatch,\n };\n}\n\n/**\n * Extract raw inner content from XML string for a specific tag\n * This is used for string-typed properties to preserve exact content\n */\nexport function extractRawInner(\n xmlContent: string,\n tagName: string\n): string | undefined {\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 let i = 0;\n let depth = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1 || lt + 1 >= len) {\n return;\n }\n i = lt + 1;\n\n const ch = xmlContent[i];\n const specialPos = skipSpecialConstruct(xmlContent, i, len);\n if (specialPos !== -1) {\n i = specialPos;\n continue;\n }\n\n if (ch === \"/\") {\n const result = handleClosingTagInExtract(xmlContent, i, len, depth);\n i = result.newPos;\n depth = result.newDepth;\n continue;\n }\n\n const result = processOpeningTagInExtract({\n xmlContent,\n i,\n len,\n target,\n depth,\n bestDepth,\n });\n if (result.bestMatch) {\n bestStart = result.bestMatch.start;\n bestEnd = result.bestMatch.end;\n bestDepth = result.bestMatch.depth;\n }\n i = result.newPos;\n depth = result.newDepth;\n }\n\n if (bestStart !== -1) {\n return xmlContent.slice(bestStart, bestEnd);\n }\n return;\n}\n\n/**\n * Helper to process opening tag and add range if it's a target\n */\nfunction processOpeningTag(options: {\n xmlContent: string;\n tagEnd: number;\n isSelfClosing: boolean;\n target: string;\n len: number;\n ranges: Array<{ start: number; end: number }>;\n}): number {\n const { xmlContent, tagEnd, isSelfClosing, target, len, ranges } = options;\n const contentStart = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n\n if (isSelfClosing) {\n ranges.push({ start: contentStart, end: contentStart });\n return contentStart;\n }\n\n const closePos = findMatchingCloseTag(xmlContent, contentStart, target, len);\n if (closePos !== -1) {\n ranges.push({ start: contentStart, end: closePos });\n const gt = xmlContent.indexOf(\">\", closePos);\n return gt === -1 ? len : gt + 1;\n }\n\n // Unmatched tag\n return -1;\n}\n\n/**\n * Helper to handle closing tag in findAllInnerRanges\n */\nfunction handleClosingTagInFindAll(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n}\n\n/**\n * Find all inner content ranges for a given tag name at any depth.\n * Returns ranges for the inner content between <tagName ...> and </tagName>.\n */\nexport function findAllInnerRanges(\n xmlContent: string,\n tagName: string\n): Array<{ start: number; end: number }> {\n const len = xmlContent.length;\n const target = tagName;\n const ranges: Array<{ start: number; end: number }> = [];\n\n let i = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1 || lt + 1 >= len) {\n break;\n }\n i = lt + 1;\n\n const ch = xmlContent[i];\n const specialPos = skipSpecialConstruct(xmlContent, i, len);\n if (specialPos !== -1) {\n i = specialPos;\n continue;\n }\n\n if (ch === \"/\") {\n i = handleClosingTagInFindAll(xmlContent, i, len);\n continue;\n }\n\n // Opening tag\n const tagInfo = parseTagName(xmlContent, i, len);\n const tagEndInfo = skipToTagEnd(xmlContent, tagInfo.pos, len);\n const tagEnd = tagEndInfo.pos;\n const isSelfClosing = tagEndInfo.isSelfClosing;\n\n if (tagInfo.name !== target) {\n // Advance over this tag\n i = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n continue;\n }\n\n // Found a target start tag\n const nextPos = processOpeningTag({\n xmlContent,\n tagEnd,\n isSelfClosing,\n target,\n len,\n ranges,\n });\n if (nextPos === -1) {\n // Unmatched tag, stop to avoid infinite loops\n break;\n }\n i = nextPos;\n }\n\n return ranges;\n}\n\n/**\n * Helper to find range for top-level target tag\n */\nfunction findTopLevelTargetRange(options: {\n xmlContent: string;\n tagEnd: number;\n isSelfClosing: boolean;\n target: string;\n len: number;\n}): { start: number; end: number } | undefined {\n const { xmlContent, tagEnd, isSelfClosing, target, len } = options;\n const contentStart = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n\n if (isSelfClosing) {\n return { start: contentStart, end: contentStart };\n }\n\n const closePos = findMatchingCloseTag(xmlContent, contentStart, target, len);\n if (closePos !== -1) {\n return { start: contentStart, end: closePos };\n }\n return;\n}\n\n/**\n * Helper to handle closing tag in findFirstTopLevelRange\n */\nfunction handleClosingTagInFindFirst(\n xmlContent: string,\n i: number,\n len: number,\n depth: number\n): { newPos: number; newDepth: number } {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return {\n newPos: gt === -1 ? len : gt + 1,\n newDepth: Math.max(0, depth - 1),\n };\n}\n\n/**\n * Find the first top-level range for a tag\n */\nexport function findFirstTopLevelRange(\n xmlContent: string,\n tagName: string\n): { start: number; end: number } | undefined {\n const len = xmlContent.length;\n const target = tagName;\n\n let i = 0;\n let depth = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1 || lt + 1 >= len) {\n return;\n }\n i = lt + 1;\n\n const ch = xmlContent[i];\n const specialPos = skipSpecialConstruct(xmlContent, i, len);\n if (specialPos !== -1) {\n i = specialPos;\n continue;\n }\n\n if (ch === \"/\") {\n const result = handleClosingTagInFindFirst(xmlContent, i, len, depth);\n i = result.newPos;\n depth = result.newDepth;\n continue;\n }\n\n const tagInfo = parseTagName(xmlContent, i, len);\n const tagEndInfo = skipToTagEnd(xmlContent, tagInfo.pos, len);\n const tagEnd = tagEndInfo.pos;\n const isSelfClosing = tagEndInfo.isSelfClosing;\n\n if (depth === 0 && tagInfo.name === target) {\n return findTopLevelTargetRange({\n xmlContent,\n tagEnd,\n isSelfClosing,\n target,\n len,\n });\n }\n i = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n depth += isSelfClosing ? 0 : 1;\n }\n return;\n}\n\n/**\n * Helper to check if position is in excluded ranges\n */\nfunction isPositionExcluded(\n pos: number,\n excludeRanges?: Array<{ start: number; end: number }>\n): boolean {\n if (!excludeRanges || excludeRanges.length === 0) {\n return false;\n }\n for (const r of excludeRanges) {\n if (pos >= r.start && pos < r.end) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Helper to skip comment in counting\n */\nfunction skipCommentInCounting(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n return close === -1 ? len : close + 3;\n}\n\n/**\n * Helper to skip CDATA in counting\n */\nfunction skipCdataInCounting(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n return close === -1 ? len : close + 3;\n}\n\n/**\n * Helper to handle special constructs in counting\n */\nfunction skipSpecialInCounting(\n xmlContent: string,\n ch: string,\n i: number,\n len: number\n): number {\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n return skipCommentInCounting(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n return skipCdataInCounting(xmlContent, i, len);\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n }\n if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n return close === -1 ? len : close + 2;\n }\n if (ch === \"/\") {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n }\n return -1;\n}\n\n/**\n * Helper to parse and count opening tag\n */\nfunction parseAndCountTag(options: {\n xmlContent: string;\n i: number;\n len: number;\n target: string;\n lt: number;\n excludeRanges?: Array<{ start: number; end: number }>;\n}): { nextPos: number; shouldCount: boolean } {\n const { xmlContent, i, len, target, lt, excludeRanges } = options;\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j += 1;\n while (j < len && isNameChar(xmlContent[j])) {\n j += 1;\n }\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 === \">\") {\n break;\n }\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n k += 1;\n break;\n }\n k += 1;\n }\n const shouldCount = name === target && !isPositionExcluded(lt, excludeRanges);\n return { nextPos: k + 1, shouldCount };\n}\n\n/**\n * Count tag occurrences, excluding specified ranges\n */\nexport function countTagOccurrences(\n xmlContent: string,\n tagName: string,\n excludeRanges?: Array<{ start: number; end: number }>,\n shouldSkipFirst = true\n): number {\n const len = xmlContent.length;\n const target = tagName;\n\n let i = 0;\n let count = 0;\n let skipFirstLocal = shouldSkipFirst;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1) {\n break;\n }\n i = lt + 1;\n if (i >= len) {\n break;\n }\n\n const ch = xmlContent[i];\n const skipPos = skipSpecialInCounting(xmlContent, ch, i, len);\n if (skipPos !== -1) {\n i = skipPos;\n continue;\n }\n\n const result = parseAndCountTag({\n xmlContent,\n i,\n len,\n target,\n lt,\n excludeRanges,\n });\n if (result.shouldCount) {\n if (skipFirstLocal) {\n skipFirstLocal = false;\n } else {\n count += 1;\n }\n }\n i = result.nextPos;\n }\n\n return count;\n}\n\n/**\n * Helper to skip attributes and find tag end position\n */\nfunction skipAttributes(xmlContent: string, i: number, len: number): number {\n let k = i;\n while (k < len && xmlContent[k] !== \">\") {\n const c = xmlContent[k];\n if (c === '\"' || c === \"'\") {\n k = skipQuoted(xmlContent, k);\n continue;\n }\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n k += 1;\n break;\n }\n k += 1;\n }\n return k;\n}\n\n/**\n * Helper to update depth for closing tag\n */\nfunction updateDepthForClosingTag(\n xmlContent: string,\n nextLt: number,\n target: string,\n closeDepth: number\n): number {\n const { name: closeName } = parseName(xmlContent, nextLt + 2);\n return closeName === target ? closeDepth - 1 : closeDepth;\n}\n\n/**\n * Helper to update depth for opening tag\n */\nfunction updateDepthForOpeningTag(\n xmlContent: string,\n nextLt: number,\n target: string,\n closeDepth: number\n): number {\n const { name: openName } = parseName(xmlContent, nextLt + 1);\n return openName === target ? closeDepth + 1 : closeDepth;\n}\n\n/**\n * Helper to find closing tag for top-level range\n */\nfunction findClosingTagForRange(\n xmlContent: string,\n k: number,\n len: number,\n target: string\n): number {\n let closeDepth = 1;\n let j = k + 1;\n\n while (j < len && closeDepth > 0) {\n const nextLt = xmlContent.indexOf(\"<\", j);\n if (nextLt === -1) {\n break;\n }\n\n if (xmlContent[nextLt + 1] === \"/\") {\n closeDepth = updateDepthForClosingTag(\n xmlContent,\n nextLt,\n target,\n closeDepth\n );\n } else if (\n xmlContent[nextLt + 1] !== \"!\" &&\n xmlContent[nextLt + 1] !== \"?\"\n ) {\n closeDepth = updateDepthForOpeningTag(\n xmlContent,\n nextLt,\n target,\n closeDepth\n );\n }\n\n j = xmlContent.indexOf(\">\", nextLt + 1);\n if (j === -1) {\n break;\n }\n j += 1;\n }\n\n return closeDepth === 0 ? j : -1;\n}\n\n/**\n * Helper to process top-level target tag\n */\nfunction processTopLevelTarget(options: {\n xmlContent: string;\n tagStart: number;\n k: number;\n len: number;\n target: string;\n ranges: Array<{ start: number; end: number }>;\n}): { newDepth: number } {\n const { xmlContent, tagStart, k, len, target, ranges } = options;\n const isSelfClosing = xmlContent[k] === \"/\" || xmlContent.startsWith(\"/>\", k);\n\n if (isSelfClosing) {\n ranges.push({\n start: tagStart,\n end: k + (xmlContent[k] === \"/\" ? 2 : 1),\n });\n return { newDepth: 0 };\n }\n\n const endPos = findClosingTagForRange(xmlContent, k, len, target);\n if (endPos !== -1) {\n ranges.push({ start: tagStart, end: endPos });\n }\n return { newDepth: 0 };\n}\n\n/**\n * Helper to skip DOCTYPE declaration\n */\nfunction skipDoctypeInSpecial(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n}\n\n/**\n * Helper to handle special constructs for top-level ranges\n */\nfunction handleSpecialConstructs(\n xmlContent: string,\n ch: string,\n i: number,\n len: number\n): number {\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!DOCTYPE\", i + 1)) {\n return skipDoctypeInSpecial(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n return skipCommentInCounting(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n return skipCdataInCounting(xmlContent, i, len);\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n }\n if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n return close === -1 ? len : close + 2;\n }\n return -1;\n}\n\n/**\n * Helper to handle closing tag in findAllTopLevelRanges\n */\nfunction handleClosingTagInFindAllTop(\n xmlContent: string,\n i: number,\n target: string,\n depth: number\n): { newPos: number; newDepth: number } {\n const { name: closingName, newPos: closingPos } = parseName(\n xmlContent,\n i + 1\n );\n const newDepth = closingName === target ? depth - 1 : depth;\n const gt = xmlContent.indexOf(\">\", closingPos);\n return {\n newPos: gt === -1 ? -1 : gt + 1,\n newDepth,\n };\n}\n\n/**\n * Find all top-level ranges for a tag (for handling duplicates)\n */\nexport function findAllTopLevelRanges(\n xmlContent: string,\n tagName: string\n): Array<{ start: number; end: number }> {\n const ranges: Array<{ start: number; end: number }> = [];\n const len = xmlContent.length;\n const target = tagName;\n let i = 0;\n let depth = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1 || lt + 1 >= len) {\n break;\n }\n i = lt + 1;\n\n const ch = xmlContent[i];\n const specialPos = handleSpecialConstructs(xmlContent, ch, i, len);\n if (specialPos !== -1) {\n i = specialPos;\n continue;\n }\n\n if (ch === \"/\") {\n const result = handleClosingTagInFindAllTop(xmlContent, i, target, depth);\n if (result.newPos === -1) {\n break;\n }\n i = result.newPos;\n depth = result.newDepth;\n continue;\n }\n\n // Opening tag\n const { name, newPos } = parseName(xmlContent, i);\n i = newPos;\n\n const k = skipAttributes(xmlContent, i, len);\n\n if (name === target && depth === 0) {\n depth += 1;\n const result = processTopLevelTarget({\n xmlContent,\n tagStart: lt,\n k,\n len,\n target,\n ranges,\n });\n depth += result.newDepth;\n }\n\n i = k + 1;\n }\n\n return ranges;\n}\n\n/**\n * Extract raw content from DOM node\n */\nexport function extractRawFromNode(node: RXMLNode): string {\n if (node.children.length === 0) {\n return \"\";\n }\n if (node.children.length === 1 && typeof node.children[0] === \"string\") {\n return node.children[0];\n }\n\n // For complex content, concatenate all text nodes\n let result = \"\";\n for (const child of node.children) {\n if (typeof child === \"string\") {\n result += child;\n } else {\n result += extractRawFromNode(child);\n }\n }\n return result;\n}\n","/**\n * XML Tokenizer based on TXML's character-by-character parsing approach\n * with enhanced error tolerance and schema awareness\n */\n\nimport { RXMLParseError } from \"../errors/types\";\nimport { getLineColumn, parseName, parseString } from \"../utils/helpers\";\nimport type { ParseOptions, RXMLNode } from \"./types\";\nimport { CharCodes, DEFAULT_NO_CHILD_NODES } from \"./types\";\n\nexport class XMLTokenizer {\n private pos = 0;\n private readonly xmlString: string;\n private readonly options: ParseOptions;\n\n constructor(xmlString: string, options: ParseOptions = {}) {\n this.xmlString = xmlString;\n this.options = {\n keepComments: false,\n keepWhitespace: false,\n noChildNodes: DEFAULT_NO_CHILD_NODES.slice(),\n textNodeName: \"#text\",\n throwOnDuplicateStringTags: true,\n ...options,\n };\n this.pos = options.pos || 0;\n }\n\n /**\n * Handle closing tag parsing\n */\n private handleClosingTag(\n tagName: string | undefined,\n children: (RXMLNode | string)[]\n ): (RXMLNode | string)[] | null {\n const closeStart = this.pos + 2;\n this.pos = this.xmlString.indexOf(\">\", this.pos);\n\n const closeTag = this.xmlString.substring(closeStart, this.pos);\n if (tagName && closeTag.trim() !== tagName) {\n const { line, column } = getLineColumn(this.xmlString, this.pos);\n throw new RXMLParseError(\n `Unexpected close tag at line ${line}, column ${column}. Expected </${tagName}>, found </${closeTag}>`,\n undefined,\n line,\n column\n );\n }\n\n if (this.pos !== -1) {\n this.pos += 1;\n }\n return children;\n }\n\n /**\n * Check if we're at end of string and should throw unclosed tag error\n */\n private checkUnclosedTag(\n tagName: string | undefined,\n consumedToEnd: boolean\n ): void {\n if (tagName && this.pos >= this.xmlString.length && !consumedToEnd) {\n const { line, column } = getLineColumn(this.xmlString, this.pos - 1);\n throw new RXMLParseError(\n `Unclosed tag at line ${line}, column ${column}. Expected closing tag </${tagName}>`,\n undefined,\n line,\n column\n );\n }\n }\n\n /**\n * Process special content (comments, CDATA, DOCTYPE) and track if we consumed to end\n */\n private processSpecialContent(children: (RXMLNode | string)[]): boolean {\n const prevPos = this.pos;\n this.handleSpecialContent(children);\n return this.pos >= this.xmlString.length && prevPos < this.xmlString.length;\n }\n\n /**\n * Handle text content parsing\n */\n private handleTextContent(children: (RXMLNode | string)[]): void {\n const text = this.parseText();\n if (this.options.keepWhitespace) {\n if (text.length > 0) {\n children.push(text);\n }\n } else {\n const trimmed = text.trim();\n if (trimmed.length > 0) {\n children.push(trimmed);\n }\n }\n this.pos += 1;\n }\n\n /**\n * Handle regular element parsing\n */\n private handleRegularElement(children: (RXMLNode | string)[]): void {\n const node = this.parseNode();\n children.push(node);\n\n // Handle processing instructions differently\n if (node.tagName[0] === \"?\") {\n children.push(...node.children);\n node.children = [];\n }\n }\n\n /**\n * Process a single child element based on the current character\n */\n private processSingleChild(\n children: (RXMLNode | string)[],\n tagName: string | undefined\n ): { shouldReturn: boolean; consumedToEnd: boolean } {\n if (this.xmlString.charCodeAt(this.pos) !== CharCodes.OPEN_BRACKET) {\n // Text content\n this.handleTextContent(children);\n return { shouldReturn: false, consumedToEnd: false };\n }\n\n const nextChar = this.xmlString.charCodeAt(this.pos + 1);\n\n if (nextChar === CharCodes.SLASH) {\n // Closing tag\n const result = this.handleClosingTag(tagName, children);\n if (result !== null) {\n return { shouldReturn: true, consumedToEnd: false };\n }\n return { shouldReturn: false, consumedToEnd: false };\n }\n\n if (nextChar === CharCodes.EXCLAMATION) {\n // Comment, CDATA, or DOCTYPE\n const wasConsumedToEnd = this.processSpecialContent(children);\n return { shouldReturn: false, consumedToEnd: wasConsumedToEnd };\n }\n\n // Regular element\n this.handleRegularElement(children);\n return { shouldReturn: false, consumedToEnd: false };\n }\n\n /**\n * Parse XML children recursively\n */\n parseChildren(tagName?: string): (RXMLNode | string)[] {\n const children: (RXMLNode | string)[] = [];\n let consumedToEnd = false;\n\n while (this.xmlString[this.pos]) {\n const result = this.processSingleChild(children, tagName);\n if (result.shouldReturn) {\n return children;\n }\n if (result.consumedToEnd) {\n consumedToEnd = true;\n }\n }\n\n // Check for unclosed tags\n this.checkUnclosedTag(tagName, consumedToEnd);\n\n return children;\n }\n\n /**\n * Check if character is whitespace\n */\n private isWhitespace(code: number): boolean {\n return (\n code === CharCodes.SPACE ||\n code === CharCodes.TAB ||\n code === CharCodes.NEWLINE ||\n code === CharCodes.CARRIAGE_RETURN\n );\n }\n\n /**\n * Skip whitespace characters\n */\n private skipWhitespace(): void {\n while (\n this.pos < this.xmlString.length &&\n this.isWhitespace(this.xmlString.charCodeAt(this.pos))\n ) {\n this.pos += 1;\n }\n }\n\n /**\n * Parse attribute value\n */\n private parseAttributeValue(): string | null {\n if (this.pos >= this.xmlString.length || this.xmlString[this.pos] !== \"=\") {\n return null;\n }\n\n this.pos += 1; // Skip =\n this.skipWhitespace();\n\n const code = this.xmlString.charCodeAt(this.pos);\n if (code === CharCodes.SINGLE_QUOTE || code === CharCodes.DOUBLE_QUOTE) {\n const { value: parsedValue, newPos: valueEnd } = parseString(\n this.xmlString,\n this.pos\n );\n this.pos = valueEnd;\n return parsedValue;\n }\n\n return null;\n }\n\n /**\n * Parse single attribute\n */\n private parseAttribute(attributes: Record<string, string | null>): void {\n const { name: attrName, newPos: nameEnd } = parseName(\n this.xmlString,\n this.pos\n );\n this.pos = nameEnd;\n this.skipWhitespace();\n\n const value = this.parseAttributeValue();\n attributes[attrName] = value;\n }\n\n /**\n * Parse all attributes\n */\n private parseAttributes(): Record<string, string | null> {\n const attributes: Record<string, string | null> = {};\n\n while (\n this.xmlString.charCodeAt(this.pos) !== CharCodes.CLOSE_BRACKET &&\n this.xmlString[this.pos]\n ) {\n const c = this.xmlString.charCodeAt(this.pos);\n\n if (this.isWhitespace(c)) {\n this.pos += 1;\n continue;\n }\n\n if ((c > 64 && c < 91) || (c > 96 && c < 123)) {\n this.parseAttribute(attributes);\n } else {\n this.pos += 1;\n }\n }\n\n return attributes;\n }\n\n /**\n * Parse special tag content (script, style)\n */\n private parseSpecialTagContent(\n _tagName: string,\n closingTag: string\n ): (RXMLNode | string)[] {\n const start = this.pos + 1;\n this.pos = this.xmlString.indexOf(closingTag, this.pos);\n\n if (this.pos === -1) {\n const children = [this.xmlString.slice(start)];\n this.pos = this.xmlString.length;\n return children;\n }\n\n const children = [this.xmlString.slice(start, this.pos)];\n this.pos += closingTag.length;\n return children;\n }\n\n /**\n * Parse node children based on tag type\n */\n private parseNodeChildren(\n tagName: string,\n isSelfClosing: boolean\n ): (RXMLNode | string)[] {\n if (isSelfClosing) {\n this.pos += 1;\n return [];\n }\n\n if (tagName === \"script\") {\n return this.parseSpecialTagContent(tagName, \"</script>\");\n }\n\n if (tagName === \"style\") {\n return this.parseSpecialTagContent(tagName, \"</style>\");\n }\n\n if (this.options.noChildNodes?.indexOf(tagName) === -1) {\n this.pos += 1;\n return this.parseChildren(tagName);\n }\n\n // Tag is in noChildNodes\n this.pos += 1;\n if ((DEFAULT_NO_CHILD_NODES as readonly string[]).includes(tagName)) {\n return [];\n }\n\n // Custom noChildNodes tags might have closing tags to skip\n const closingTag = `</${tagName}>`;\n const closingPos = this.xmlString.indexOf(closingTag, this.pos);\n if (closingPos !== -1) {\n this.pos = closingPos + closingTag.length;\n }\n\n return [];\n }\n\n /**\n * Parse a single XML node\n */\n parseNode(): RXMLNode {\n this.pos += 1; // Skip opening <\n\n const { name: tagName, newPos } = parseName(this.xmlString, this.pos);\n this.pos = newPos;\n\n const attributes = this.parseAttributes();\n\n // Check for self-closing tag or processing instruction\n const isSelfClosing =\n this.xmlString.charCodeAt(this.pos - 1) === CharCodes.SLASH ||\n (tagName[0] === \"?\" &&\n this.xmlString.charCodeAt(this.pos - 1) === CharCodes.QUESTION);\n\n const children = this.parseNodeChildren(tagName, isSelfClosing);\n\n return { tagName, attributes, children };\n }\n\n /**\n * Parse text content until next tag\n */\n private parseText(): string {\n const start = this.pos;\n this.pos = this.xmlString.indexOf(\"<\", this.pos) - 1;\n if (this.pos === -2) {\n this.pos = this.xmlString.length;\n }\n return this.xmlString.slice(start, this.pos + 1);\n }\n\n /**\n * Handle comments, CDATA, and DOCTYPE declarations\n */\n private handleSpecialContent(children: (RXMLNode | string)[]): void {\n if (this.xmlString.charCodeAt(this.pos + 2) === CharCodes.MINUS) {\n // Comment\n this.handleComment(children);\n } else if (\n this.xmlString.charCodeAt(this.pos + 2) ===\n CharCodes.OPEN_CORNER_BRACKET &&\n this.xmlString.charCodeAt(this.pos + 8) ===\n CharCodes.OPEN_CORNER_BRACKET &&\n this.xmlString.substr(this.pos + 3, 5).toLowerCase() === \"cdata\"\n ) {\n // CDATA\n this.handleCData(children);\n } else {\n // DOCTYPE or other declaration\n this.handleDoctype(children);\n }\n }\n\n /**\n * Handle XML comments\n */\n private handleComment(children: (RXMLNode | string)[]): void {\n const startCommentPos = this.pos;\n\n // Find comment end\n while (\n this.pos !== -1 &&\n !(\n this.xmlString.charCodeAt(this.pos) === CharCodes.CLOSE_BRACKET &&\n this.xmlString.charCodeAt(this.pos - 1) === CharCodes.MINUS &&\n this.xmlString.charCodeAt(this.pos - 2) === CharCodes.MINUS\n )\n ) {\n this.pos = this.xmlString.indexOf(\">\", this.pos + 1);\n }\n\n if (this.pos === -1) {\n this.pos = this.xmlString.length;\n }\n\n if (this.options.keepComments) {\n children.push(this.xmlString.substring(startCommentPos, this.pos + 1));\n }\n\n this.pos += 1;\n }\n\n /**\n * Handle CDATA sections\n */\n private handleCData(children: (RXMLNode | string)[]): void {\n const cdataEndIndex = this.xmlString.indexOf(\"]]>\", this.pos);\n if (cdataEndIndex === -1) {\n // Unclosed CDATA - consume everything to the end\n children.push(this.xmlString.substr(this.pos + 9));\n this.pos = this.xmlString.length;\n } else {\n children.push(this.xmlString.substring(this.pos + 9, cdataEndIndex));\n this.pos = cdataEndIndex + 3;\n }\n }\n\n /**\n * Handle DOCTYPE declarations\n */\n private handleDoctype(children: (RXMLNode | string)[]): void {\n const startDoctype = this.pos + 1;\n this.pos += 2;\n let encapsulated = false;\n\n while (\n (this.xmlString.charCodeAt(this.pos) !== CharCodes.CLOSE_BRACKET ||\n encapsulated) &&\n this.xmlString[this.pos]\n ) {\n if (\n this.xmlString.charCodeAt(this.pos) === CharCodes.OPEN_CORNER_BRACKET\n ) {\n encapsulated = true;\n } else if (\n encapsulated &&\n this.xmlString.charCodeAt(this.pos) === CharCodes.CLOSE_CORNER_BRACKET\n ) {\n encapsulated = false;\n }\n this.pos += 1;\n }\n\n children.push(this.xmlString.substring(startDoctype, this.pos));\n this.pos += 1;\n }\n\n /**\n * Get current position\n */\n getPosition(): number {\n return this.pos;\n }\n\n /**\n * Set position\n */\n setPosition(pos: number): void {\n this.pos = pos;\n }\n}\n","/**\n * Main XML parser that integrates tokenization, schema awareness, and error tolerance\n * This replaces the fast-xml-parser dependency with a TXML-based implementation\n */\n\nimport { getSchemaType, unwrapJsonSchema } from \"../../schema-coerce\";\nimport {\n RXMLCoercionError,\n RXMLDuplicateStringTagError,\n RXMLParseError,\n} from \"../errors/types\";\n\n// Regex constants for performance\nconst WHITESPACE_REGEX = /\\s/;\nconst NUMERIC_STRING_REGEX = /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/;\nconst DIGIT_KEY_REGEX = /^\\d+$/;\n\n/**\n * Extract top-level string-typed properties from a schema\n */\nfunction getTopLevelStringProps(s: unknown): Set<string> {\n const set = new Set<string>();\n const unwrapped = unwrapJsonSchema(s);\n if (unwrapped && typeof unwrapped === \"object\") {\n const props = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n if (props && typeof props === \"object\") {\n for (const [k, v] of Object.entries(props)) {\n if (getSchemaType(v) === \"string\") {\n set.add(k);\n }\n }\n }\n }\n return set;\n}\n\n/**\n * Restore a single string value from placeholder if needed\n */\nfunction restorePlaceholderString(\n val: string,\n placeholderMap: Map<string, string>\n): string {\n if (val.startsWith(\"__RXML_PLACEHOLDER_\")) {\n const orig = placeholderMap.get(val);\n return orig !== undefined ? orig : val;\n }\n return val;\n}\n\n/**\n * Restore placeholders in an object\n */\nfunction restorePlaceholdersInObject(\n obj: Record<string, unknown>,\n _placeholderMap: Map<string, string>,\n textNodeName: string,\n restorer: (val: unknown) => unknown\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n const restored = restorer(v);\n // Trim when restoring into text node field to match tokenizer's default trimming\n if (k === textNodeName && typeof restored === \"string\") {\n out[k] = restored.trim();\n } else {\n out[k] = restored;\n }\n }\n return out;\n}\n\n/**\n * Create a function to restore placeholders deeply in parsed structure\n */\nfunction createPlaceholderRestorer(\n placeholderMap: Map<string, string>,\n textNodeName: string\n): (val: unknown) => unknown {\n const restorer = (val: unknown): unknown => {\n if (val == null) {\n return val;\n }\n if (typeof val === \"string\") {\n return restorePlaceholderString(val, placeholderMap);\n }\n if (Array.isArray(val)) {\n return val.map(restorer);\n }\n if (typeof val === \"object\") {\n return restorePlaceholdersInObject(\n val as Record<string, unknown>,\n placeholderMap,\n textNodeName,\n restorer\n );\n }\n return val;\n };\n return restorer;\n}\n\n/**\n * Convert a value to a number if it matches numeric pattern\n */\nfunction tryConvertToNumber(val: unknown): unknown {\n if (typeof val !== \"string\") {\n return val;\n }\n const trimmed = val.trim();\n if (NUMERIC_STRING_REGEX.test(trimmed)) {\n const num = Number(trimmed);\n if (Number.isFinite(num)) {\n return num;\n }\n }\n return trimmed;\n}\n\n/**\n * Process a single item value, extracting text content and converting numbers\n */\nfunction processItemValue(item: unknown, textNodeName: string): unknown {\n let currentVal: unknown = item;\n if (item && typeof item === \"object\" && Object.hasOwn(item, textNodeName)) {\n currentVal = (item as Record<string, unknown>)[textNodeName];\n }\n const trimmed =\n typeof currentVal === \"string\" ? currentVal.trim() : currentVal;\n return tryConvertToNumber(trimmed);\n}\n\n/**\n * Process item wrapper pattern values\n */\nfunction processItemWrapper(itemValue: unknown, textNodeName: string): unknown {\n if (Array.isArray(itemValue)) {\n return itemValue.map((item) => processItemValue(item, textNodeName));\n }\n const trimmed = typeof itemValue === \"string\" ? itemValue.trim() : itemValue;\n return tryConvertToNumber(trimmed);\n}\n\n/**\n * Check if error should be re-thrown based on error type and XML simplicity\n */\nfunction shouldRethrowParseError(\n error: unknown,\n xmlString: string\n): error is RXMLParseError {\n if (!(error instanceof RXMLParseError)) {\n return false;\n }\n const isSimple = xmlString.split(\"<\").length < 6;\n return (\n (error.message.includes(\"Unexpected close tag\") && isSimple) ||\n (error.message.includes(\"Unclosed tag\") && isSimple)\n );\n}\n\n/**\n * Try to extract partial XML results from malformed XML\n */\nfunction extractPartialXmlResults(\n xmlString: string,\n options: ParseOptions\n): (RXMLNode | string)[] {\n const partialResults: (RXMLNode | string)[] = [];\n const xmlPattern = /<([a-zA-Z_][\\w.-]*)[^>]*>.*?<\\/\\1>/gs;\n let match: RegExpExecArray | null = null;\n\n match = xmlPattern.exec(xmlString);\n while (match !== null) {\n try {\n const elementXml = match[0];\n const tokenizer = new XMLTokenizer(elementXml, options);\n const parsed = tokenizer.parseChildren();\n partialResults.push(...parsed);\n } catch {\n // Ignore parse errors for individual elements\n }\n match = xmlPattern.exec(xmlString);\n }\n\n return partialResults;\n}\n\nimport {\n coerceDomBySchema,\n domToObject,\n getPropertySchema,\n getStringTypedProperties,\n processArrayContent,\n processIndexedTuple,\n} from \"../schema/coercion\";\nimport {\n countTagOccurrences,\n extractRawInner,\n findAllInnerRanges,\n findFirstTopLevelRange,\n} from \"../schema/extraction\";\nimport { unescapeXml } from \"../utils/helpers\";\nimport { XMLTokenizer } from \"./tokenizer\";\nimport type { ParseOptions, RXMLNode } from \"./types\";\n\n// Internal: schema-guided deep XML entity decoding\nfunction deepDecodeStringsBySchema(input: unknown, schema: unknown): unknown {\n if (input == null || schema == null) {\n return input;\n }\n\n const type = getSchemaType(schema);\n\n if (type === \"string\" && typeof input === \"string\") {\n return unescapeXml(input);\n }\n\n if (type === \"array\" && Array.isArray(input)) {\n const unwrapped = unwrapJsonSchema(schema) as\n | { items?: unknown }\n | undefined;\n const itemSchema = unwrapped?.items ?? {};\n return input.map((item) => deepDecodeStringsBySchema(item, itemSchema));\n }\n\n if (type === \"object\" && input && typeof input === \"object\") {\n const obj = input as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n const childSchema = getPropertySchema(schema, key);\n out[key] = deepDecodeStringsBySchema(obj[key], childSchema);\n }\n return out;\n }\n\n // Fallback: decode any string when schema typing is ambiguous/missing\n if (typeof input === \"string\") {\n return unescapeXml(input);\n }\n return input;\n}\n\n/**\n * Parse XML with schema-aware type coercion\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: This function handles complex XML parsing logic that is difficult to break down further without losing clarity\nexport function parse(\n xmlInner: string,\n schema: unknown,\n options: ParseOptions = {}\n): Record<string, unknown> {\n const textNodeName = options.textNodeName ?? \"#text\";\n const throwDup = options.throwOnDuplicateStringTags ?? true;\n\n // If xmlInner looks like a full XML document (single root element), extract its inner content\n // But only if the schema doesn't expect that root element. Use a parser-style scan for robustness.\n let actualXmlInner = xmlInner.trim();\n if (actualXmlInner.startsWith(\"<\") && actualXmlInner.endsWith(\">\")) {\n const s = actualXmlInner;\n let i = 0;\n let rootStart = -1;\n let rootName = \"\";\n\n while (i < s.length) {\n const lt = s.indexOf(\"<\", i);\n if (lt === -1) {\n break;\n }\n const next = s[lt + 1];\n if (next === \"?\") {\n const end = s.indexOf(\"?>\", lt + 2);\n i = end === -1 ? s.length : end + 2;\n continue;\n }\n if (next === \"!\") {\n if (s.startsWith(\"!--\", lt + 2)) {\n const end = s.indexOf(\"-->\", lt + 5);\n i = end === -1 ? s.length : end + 3;\n continue;\n }\n if (s.startsWith(\"![CDATA[\", lt + 2)) {\n const end = s.indexOf(\"]]>\", lt + 9);\n i = end === -1 ? s.length : end + 3;\n continue;\n }\n const end = s.indexOf(\">\", lt + 2);\n i = end === -1 ? s.length : end + 1;\n continue;\n }\n if (next === \"/\") {\n // unexpected close before open; treat as not-a-root document\n break;\n }\n // Found a start tag; parse name until whitespace, '/', or '>'\n let j = lt + 1;\n while (\n j < s.length &&\n s[j] !== \" \" &&\n s[j] !== \"\\n\" &&\n s[j] !== \"\\r\" &&\n s[j] !== \"\\t\" &&\n s[j] !== \"/\" &&\n s[j] !== \">\"\n ) {\n j += 1;\n }\n rootStart = lt;\n rootName = s.slice(lt + 1, j);\n break;\n }\n\n if (rootStart === 0 && rootName) {\n const range = findFirstTopLevelRange(s, rootName);\n if (range) {\n // Compute full closing tag end index allowing whitespace before '>'\n let fullEnd = range.end + `</${rootName}>`.length;\n const closeHead = s.indexOf(`</${rootName}`, range.end);\n if (closeHead === range.end) {\n let p = closeHead + 2 + rootName.length;\n while (p < s.length && WHITESPACE_REGEX.test(s[p])) {\n p += 1;\n }\n if (s[p] === \">\") {\n fullEnd = p + 1;\n }\n }\n\n if (fullEnd === s.length) {\n // Check if the schema expects this root tag\n const unwrapped = unwrapJsonSchema(schema);\n const schemaProps =\n unwrapped && typeof unwrapped === \"object\"\n ? ((unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined)\n : undefined;\n\n if (schemaProps && !Object.hasOwn(schemaProps, rootName)) {\n actualXmlInner = s.slice(range.start, range.end);\n }\n }\n }\n }\n }\n\n // Identify string-typed properties for special handling\n // Use top-level keys for duplicate detection/backfill, deep keys for placeholder shielding\n const topLevelStringProps = getTopLevelStringProps(schema);\n const deepStringTypedProps = getStringTypedProperties(schema);\n\n // First, check for duplicates before doing any placeholder replacement\n const duplicateKeys = new Set<string>();\n for (const key of topLevelStringProps) {\n const excludeRanges: Array<{ start: number; end: number }> = [];\n for (const other of topLevelStringProps) {\n if (other === key) {\n continue;\n }\n const range = findFirstTopLevelRange(actualXmlInner, other);\n if (range) {\n excludeRanges.push(range);\n }\n }\n\n const occurrences = countTagOccurrences(\n actualXmlInner,\n key,\n excludeRanges,\n true\n );\n\n if (occurrences > 0 && throwDup) {\n throw new RXMLDuplicateStringTagError(\n `Duplicate string tags for <${key}> detected`\n );\n }\n if (occurrences > 0 && !throwDup) {\n duplicateKeys.add(key);\n if (options.onError) {\n options.onError(\n `RXML: Duplicate string tags for <${key}> detected; using first occurrence.`,\n { tag: key, occurrences }\n );\n }\n }\n }\n\n // Replace inner content of string-typed tags with placeholders to avoid\n // XML parsing errors from constructs like <!DOCTYPE ...> within element bodies\n let xmlInnerForParsing = actualXmlInner;\n const originalContentMap = new Map<string, string>();\n try {\n // Collect ranges of all occurrences for each string-typed tag name (at any depth)\n const ranges: Array<{ start: number; end: number; key: string }> = [];\n for (const key of deepStringTypedProps) {\n const innerRanges = findAllInnerRanges(actualXmlInner, key);\n for (const r of innerRanges) {\n if (r.end > r.start) {\n ranges.push({ ...r, key });\n }\n }\n }\n\n if (ranges.length > 0) {\n // Sort by start index and replace from left to right\n const sorted = [...ranges].sort((a, b) => a.start - b.start);\n let rebuilt = \"\";\n let cursor = 0;\n for (const r of sorted) {\n if (r.start < cursor) {\n // Overlapping range (nested); skip, as outer replacement already handled it\n continue;\n }\n if (cursor < r.start) {\n rebuilt += actualXmlInner.slice(cursor, r.start);\n }\n const placeholder = `__RXML_PLACEHOLDER_${r.key}_${r.start}_${r.end}__`;\n const originalContent = actualXmlInner.slice(r.start, r.end);\n originalContentMap.set(placeholder, originalContent);\n rebuilt += placeholder;\n cursor = r.end;\n }\n if (cursor < actualXmlInner.length) {\n rebuilt += actualXmlInner.slice(cursor);\n }\n xmlInnerForParsing = rebuilt;\n }\n } catch (error) {\n // Non-fatal: fall back to original XML; allow caller to handle via onError\n if (options.onError) {\n options.onError(\n \"RXML: Failed to replace string placeholders, falling back to original XML.\",\n { error }\n );\n }\n xmlInnerForParsing = actualXmlInner;\n }\n\n // Parse XML using our TXML-based tokenizer\n let parsedNodes: (RXMLNode | string)[];\n try {\n const wrappedXml = `<root>${xmlInnerForParsing}</root>`;\n const tokenizer = new XMLTokenizer(wrappedXml, {\n ...options,\n textNodeName,\n });\n const rootNode = tokenizer.parseNode();\n\n // Extract content from root wrapper\n parsedNodes = rootNode.children;\n } catch (cause) {\n throw new RXMLParseError(\"Failed to parse XML\", cause);\n }\n\n // Convert DOM to flat object structure\n const parsedArgs = domToObject(parsedNodes, schema, textNodeName);\n\n // Restore any placeholders across the entire parsed structure before schema-aware processing\n const restorePlaceholdersDeep = createPlaceholderRestorer(\n originalContentMap,\n textNodeName\n );\n const parsedArgsRestored = restorePlaceholdersDeep(parsedArgs) as Record<\n string,\n unknown\n >;\n const args: Record<string, unknown> = {};\n\n // Process each property with schema-aware handling\n for (const k of Object.keys(parsedArgsRestored || {})) {\n const v = parsedArgsRestored[k];\n let val: unknown = v;\n const propSchema = getPropertySchema(schema, k);\n const propType = getSchemaType(propSchema);\n\n // Handle duplicates when throwOnDuplicateStringTags is false\n if (propType === \"string\" && duplicateKeys.has(k) && Array.isArray(v)) {\n // For duplicates, use the first occurrence\n const firstValue = v[0];\n if (\n typeof firstValue === \"string\" &&\n firstValue.startsWith(\"__RXML_PLACEHOLDER_\")\n ) {\n // Restore from placeholder\n const originalContent = originalContentMap.get(firstValue);\n if (originalContent !== undefined) {\n args[k] = originalContent;\n continue;\n }\n } else {\n args[k] = firstValue;\n continue;\n }\n }\n\n if (propType === \"string\" && !Array.isArray(v)) {\n // First, check if this is a placeholder value and restore original content\n const placeholderUsed =\n (typeof v === \"string\" && v.startsWith(\"__RXML_PLACEHOLDER_\")) ||\n (v &&\n typeof v === \"object\" &&\n Object.hasOwn(v, textNodeName) &&\n typeof (v as Record<string, unknown>)[textNodeName] === \"string\" &&\n ((v as Record<string, unknown>)[textNodeName] as string).startsWith(\n \"__RXML_PLACEHOLDER_\"\n ));\n\n if (placeholderUsed) {\n // Extract the original content from the placeholder map\n let placeholderKey: string;\n if (typeof v === \"string\") {\n placeholderKey = v;\n } else {\n placeholderKey = (v as Record<string, unknown>)[\n textNodeName\n ] as string;\n }\n\n const originalContent = originalContentMap.get(placeholderKey);\n if (originalContent !== undefined) {\n args[k] = originalContent;\n continue;\n }\n }\n\n // Try to extract raw content (duplicates already handled earlier)\n const raw = extractRawInner(actualXmlInner, k);\n if (typeof raw === \"string\") {\n args[k] = raw;\n continue;\n }\n }\n\n // Extract text content from wrapped objects\n if (v && typeof v === \"object\" && Object.hasOwn(v, textNodeName)) {\n val = (v as Record<string, unknown>)[textNodeName];\n }\n\n // Handle array content\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.hasOwn(item, textNodeName)\n ) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal : String(textVal);\n }\n return typeof item === \"string\" ? item : String(item);\n });\n\n if (mapped.length > 1 && throwDup) {\n throw new RXMLDuplicateStringTagError(\n `Duplicate string tags for <${k}> detected`\n );\n }\n if (mapped.length > 1 && !throwDup && options.onError) {\n options.onError(\n `RXML: Duplicate string tags for <${k}> detected; using first occurrence.`,\n { tag: k, occurrences: mapped.length }\n );\n }\n\n args[k] = mapped[0] ?? \"\";\n continue;\n }\n val = processArrayContent(v, propSchema, textNodeName);\n } else if (v && typeof v === \"object\" && !Object.hasOwn(v, textNodeName)) {\n const obj = v as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n // Handle <item> wrapper pattern\n if (keys.length === 1 && keys[0] === \"item\") {\n val = processItemWrapper(obj.item, textNodeName);\n } else {\n // Check for indexed tuple pattern (numeric keys)\n let isIndexedTuple = false;\n if (keys.length > 0 && keys.every((key) => DIGIT_KEY_REGEX.test(key))) {\n const indices = keys\n .map((keyStr) => Number.parseInt(keyStr, 10))\n .sort((a, b) => a - b);\n isIndexedTuple =\n indices[0] === 0 &&\n indices.every((indexVal, idx) => indexVal === idx);\n }\n\n if (isIndexedTuple) {\n val = processIndexedTuple(obj, textNodeName);\n } else {\n val = v;\n }\n }\n }\n\n args[k] = typeof val === \"string\" ? val.trim() : val;\n }\n\n // Ensure missing string-typed properties are populated from original XML\n for (const key of topLevelStringProps) {\n if (!Object.hasOwn(args, key)) {\n const raw = extractRawInner(actualXmlInner, key);\n if (typeof raw === \"string\") {\n args[key] = raw;\n }\n }\n }\n\n // Auto-unwrap single root element if schema doesn't expect it (before coercion)\n let dataToCoerce = args;\n const keys = Object.keys(args);\n if (keys.length === 1) {\n const rootKey = keys[0];\n const rootValue = args[rootKey];\n\n // Check if schema expects the root key\n const unwrapped = unwrapJsonSchema(schema);\n if (unwrapped && typeof unwrapped === \"object\") {\n const schemaProps = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n if (schemaProps && !Object.hasOwn(schemaProps, rootKey)) {\n // Schema doesn't expect the root key, so unwrap it before coercion\n dataToCoerce = rootValue as Record<string, unknown>;\n }\n }\n }\n\n // Apply schema-based coercion\n try {\n const coerced = coerceDomBySchema(dataToCoerce, schema);\n const decoded = deepDecodeStringsBySchema(coerced, schema) as Record<\n string,\n unknown\n >;\n return decoded;\n } catch (error) {\n throw new RXMLCoercionError(\"Failed to coerce by schema\", error);\n }\n}\n\n/**\n * Parse XML without schema (similar to TXML's parse function)\n */\nexport function parseWithoutSchema(\n xmlString: string,\n options: ParseOptions = {}\n): (RXMLNode | string)[] {\n try {\n const tokenizer = new XMLTokenizer(xmlString, options);\n return tokenizer.parseChildren();\n } catch (error) {\n // Check if this is a specific type of error that should be re-thrown\n if (shouldRethrowParseError(error, xmlString)) {\n // Preserve the original error message and line/column information\n throw new RXMLParseError(\n error.message,\n error.cause,\n error.line,\n error.column\n );\n }\n\n // For other types of malformed XML, try to be more tolerant and return partial results\n if (options.onError) {\n options.onError(\"Failed to parse XML without schema\", { error });\n }\n\n // Try to extract any valid XML elements that we can parse\n try {\n const partialResults = extractPartialXmlResults(xmlString, options);\n if (partialResults.length > 0) {\n return partialResults;\n }\n } catch {\n // Fallback failed too\n }\n\n // Last resort: return the input as text content\n return [xmlString.trim()];\n }\n}\n\n/**\n * Parse a single XML node\n */\nexport function parseNode(\n xmlString: string,\n options: ParseOptions = {}\n): RXMLNode {\n try {\n const tokenizer = new XMLTokenizer(xmlString, options);\n return tokenizer.parseNode();\n } catch (error) {\n throw new RXMLParseError(\"Failed to parse XML node\", error);\n }\n}\n\n/**\n * Build node value with attributes if present\n */\nfunction buildNodeValue(child: RXMLNode): unknown {\n const kids = simplify(child.children);\n let nodeValue: unknown = kids;\n\n // Add attributes if present\n if (Object.keys(child.attributes).length) {\n if (typeof kids === \"string\") {\n nodeValue = kids;\n // For string content with attributes, we need to preserve both\n if (kids !== \"\") {\n nodeValue = { _attributes: child.attributes, value: kids };\n } else {\n nodeValue = { _attributes: child.attributes };\n }\n } else if (typeof kids === \"object\" && kids !== null) {\n (kids as Record<string, unknown>)._attributes = child.attributes;\n nodeValue = kids;\n } else {\n nodeValue = { _attributes: child.attributes };\n }\n }\n\n return nodeValue;\n}\n\n/**\n * Simplify parsed XML structure (similar to TXML's simplify)\n */\nexport function simplify(children: (RXMLNode | string)[]): unknown {\n if (!children.length) {\n return \"\";\n }\n\n if (children.length === 1 && typeof children[0] === \"string\") {\n return children[0];\n }\n\n const out: Record<string, unknown> = {};\n\n // Map each object\n for (const child of children) {\n if (typeof child !== \"object\") {\n continue;\n }\n\n if (!out[child.tagName]) {\n out[child.tagName] = [];\n }\n\n const nodeValue = buildNodeValue(child);\n (out[child.tagName] as unknown[]).push(nodeValue);\n }\n\n // Flatten single-item arrays\n for (const key in out) {\n if (!Object.hasOwn(out, key)) {\n continue;\n }\n const value = out[key];\n if (Array.isArray(value) && value.length === 1) {\n out[key] = value[0];\n }\n }\n\n return out;\n}\n\n/**\n * Filter XML nodes (similar to TXML's filter)\n */\nexport function filter(\n children: (RXMLNode | string)[],\n filterFn: (\n node: RXMLNode,\n index: number,\n currentDepth: number,\n currentPath: string\n ) => boolean,\n depth = 0,\n path = \"\"\n): RXMLNode[] {\n const out: RXMLNode[] = [];\n\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i];\n if (typeof child === \"object\" && filterFn(child, i, depth, path)) {\n out.push(child);\n }\n if (typeof child === \"object\" && child.children) {\n const childPath = `${path ? `${path}.` : \"\"}${i}.${child.tagName}`;\n const kids = filter(child.children, filterFn, depth + 1, childPath);\n out.push(...kids);\n }\n }\n\n return out;\n}\n","/**\n * Heuristic Engine for XML Tool-Call Parsing\n *\n * Pluggable pipeline for text normalization, repair, and object coercion.\n *\n * Phases:\n * 1. pre-parse: Text normalization before initial parse\n * 2. fallback-reparse: Text repair when initial parse fails\n * 3. post-parse: Object repair/coercion after successful parse\n */\n\nexport type HeuristicPhase = \"pre-parse\" | \"fallback-reparse\" | \"post-parse\";\n\nexport interface IntermediateCall {\n toolName: string;\n schema: unknown;\n rawSegment: string;\n parsed: unknown | null;\n errors: unknown[];\n meta?: Record<string, unknown>;\n}\n\nexport interface HeuristicResult {\n rawSegment?: string;\n parsed?: unknown;\n reparse?: boolean;\n stop?: boolean;\n warnings?: string[];\n}\n\nexport interface ToolCallHeuristic {\n id: string;\n phase: HeuristicPhase;\n applies(ctx: IntermediateCall): boolean;\n run(ctx: IntermediateCall): HeuristicResult;\n}\n\nexport interface PipelineConfig {\n preParse?: ToolCallHeuristic[];\n fallbackReparse?: ToolCallHeuristic[];\n postParse?: ToolCallHeuristic[];\n}\n\nexport interface HeuristicEngineOptions {\n parse: (xml: string, schema: unknown) => unknown;\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n maxReparses?: number;\n}\n\nfunction applyRawSegmentUpdate(\n current: IntermediateCall,\n result: HeuristicResult\n): IntermediateCall {\n if (result.rawSegment !== undefined) {\n return { ...current, rawSegment: result.rawSegment };\n }\n return current;\n}\n\nfunction applyParsedUpdate(\n current: IntermediateCall,\n result: HeuristicResult\n): IntermediateCall {\n if (result.parsed !== undefined) {\n return { ...current, parsed: result.parsed };\n }\n return current;\n}\n\nfunction applyWarningsUpdate(\n current: IntermediateCall,\n result: HeuristicResult\n): IntermediateCall {\n if (result.warnings && result.warnings.length > 0) {\n const meta = current.meta ?? {};\n const existingWarnings = (meta.warnings as string[] | undefined) ?? [];\n return {\n ...current,\n meta: { ...meta, warnings: [...existingWarnings, ...result.warnings] },\n };\n }\n return current;\n}\n\nfunction attemptReparse(\n current: IntermediateCall,\n result: HeuristicResult,\n reparseCount: number,\n maxReparses: number,\n parse: (xml: string, schema: unknown) => unknown\n): { state: IntermediateCall; newCount: number } {\n if (\n !result.reparse ||\n result.rawSegment === undefined ||\n reparseCount >= maxReparses\n ) {\n return { state: current, newCount: reparseCount };\n }\n\n try {\n const reparsed = parse(result.rawSegment, current.schema);\n return {\n state: { ...current, parsed: reparsed, errors: [] },\n newCount: reparseCount + 1,\n };\n } catch (error) {\n return {\n state: { ...current, errors: [...current.errors, error] },\n newCount: reparseCount + 1,\n };\n }\n}\n\nfunction executePhase(\n ctx: IntermediateCall,\n heuristics: ToolCallHeuristic[],\n options: HeuristicEngineOptions\n): IntermediateCall {\n let current = ctx;\n let reparseCount = 0;\n const maxReparses = options.maxReparses ?? 2;\n\n for (const heuristic of heuristics) {\n if (!heuristic.applies(current)) {\n continue;\n }\n\n const result = heuristic.run(current);\n\n current = applyRawSegmentUpdate(current, result);\n current = applyParsedUpdate(current, result);\n current = applyWarningsUpdate(current, result);\n\n const reparseResult = attemptReparse(\n current,\n result,\n reparseCount,\n maxReparses,\n options.parse\n );\n current = reparseResult.state;\n reparseCount = reparseResult.newCount;\n\n if (result.stop) {\n break;\n }\n }\n\n return current;\n}\n\nexport function applyHeuristicPipeline(\n ctx: IntermediateCall,\n config: PipelineConfig,\n options: HeuristicEngineOptions\n): IntermediateCall {\n let current = ctx;\n\n if (config.preParse && config.preParse.length > 0) {\n current = executePhase(current, config.preParse, options);\n }\n\n if (current.parsed === null && current.errors.length === 0) {\n try {\n const parsed = options.parse(current.rawSegment, current.schema);\n current = { ...current, parsed, errors: [] };\n } catch (error) {\n current = { ...current, errors: [error] };\n }\n }\n\n if (\n current.errors.length > 0 &&\n config.fallbackReparse &&\n config.fallbackReparse.length > 0\n ) {\n current = executePhase(current, config.fallbackReparse, options);\n }\n\n if (\n current.parsed !== null &&\n config.postParse &&\n config.postParse.length > 0\n ) {\n current = executePhase(current, config.postParse, options);\n }\n\n return current;\n}\n\nexport function createIntermediateCall(\n toolName: string,\n rawSegment: string,\n schema: unknown\n): IntermediateCall {\n return {\n toolName,\n schema,\n rawSegment,\n parsed: null,\n errors: [],\n meta: { originalContent: rawSegment },\n };\n}\n\nexport function mergePipelineConfigs(\n ...configs: PipelineConfig[]\n): PipelineConfig {\n const result: PipelineConfig = {\n preParse: [],\n fallbackReparse: [],\n postParse: [],\n };\n\n for (const config of configs) {\n if (config.preParse) {\n result.preParse = [...(result.preParse ?? []), ...config.preParse];\n }\n if (config.fallbackReparse) {\n result.fallbackReparse = [\n ...(result.fallbackReparse ?? []),\n ...config.fallbackReparse,\n ];\n }\n if (config.postParse) {\n result.postParse = [...(result.postParse ?? []), ...config.postParse];\n }\n }\n\n return result;\n}\n","/**\n * Default heuristics for XML fragment parsing.\n * Modular, reusable versions of normalization/repair logic from morph-xml-protocol.\n */\n\nimport { unwrapJsonSchema } from \"../../schema-coerce\";\nimport { parse } from \"../core/parser\";\nimport type {\n HeuristicResult,\n IntermediateCall,\n PipelineConfig,\n ToolCallHeuristic,\n} from \"./engine\";\n\nconst MALFORMED_CLOSE_RE_G = /<\\/\\s+([A-Za-z0-9_:-]+)\\s*>/g;\nconst MALFORMED_CLOSE_RE = /<\\/\\s+([A-Za-z0-9_:-]+)\\s*>/;\nconst STATUS_TO_STEP_BOUNDARY_RE = /<\\/status>\\s*<step>/g;\nconst WHITESPACE_REGEX = /\\s/;\nconst NAME_CHAR_RE = /[A-Za-z0-9_:-]/;\n// NameStartChar per XML 1.0 spec: letter, underscore, or colon (digits NOT allowed as first char)\nconst NAME_START_CHAR_RE = /[A-Za-z_:]/;\nconst STEP_TAG_RE = /<step>([\\s\\S]*?)<\\/step>/i;\nconst STATUS_TAG_RE = /<status>([\\s\\S]*?)<\\/status>/i;\n\nexport const normalizeCloseTagsHeuristic: ToolCallHeuristic = {\n id: \"normalize-close-tags\",\n phase: \"pre-parse\",\n applies: () => true,\n run: (ctx: IntermediateCall): HeuristicResult => {\n const normalized = ctx.rawSegment.replace(MALFORMED_CLOSE_RE_G, \"</$1>\");\n if (normalized !== ctx.rawSegment) {\n return { rawSegment: normalized };\n }\n return {};\n },\n};\n\nexport const escapeInvalidLtHeuristic: ToolCallHeuristic = {\n id: \"escape-invalid-lt\",\n phase: \"pre-parse\",\n applies: () => true,\n run: (ctx: IntermediateCall): HeuristicResult => {\n const escaped = escapeInvalidLt(ctx.rawSegment);\n if (escaped !== ctx.rawSegment) {\n return { rawSegment: escaped };\n }\n return {};\n },\n};\n\nexport const balanceTagsHeuristic: ToolCallHeuristic = {\n id: \"balance-tags\",\n phase: \"fallback-reparse\",\n applies: (ctx: IntermediateCall): boolean => {\n const original = (ctx.meta?.originalContent as string) || ctx.rawSegment;\n const normalized = original.replace(MALFORMED_CLOSE_RE_G, \"</$1>\");\n const balanced = balanceTags(original);\n const hasMalformedClose = MALFORMED_CLOSE_RE.test(original);\n\n if (\n !hasMalformedClose &&\n balanced.length > normalized.length &&\n ctx.errors.length === 0\n ) {\n return false;\n }\n return balanced !== normalized;\n },\n run: (ctx: IntermediateCall): HeuristicResult => {\n const original = (ctx.meta?.originalContent as string) || ctx.rawSegment;\n const balanced = balanceTags(original);\n const escaped = escapeInvalidLt(balanced);\n return { rawSegment: escaped, reparse: true };\n },\n};\n\nexport const dedupeShellStringTagsHeuristic: ToolCallHeuristic = {\n id: \"dedupe-shell-string-tags\",\n phase: \"fallback-reparse\",\n applies: (ctx: IntermediateCall): boolean =>\n shouldDeduplicateStringTags(ctx.schema),\n run: (ctx: IntermediateCall): HeuristicResult => {\n const names = getStringPropertyNames(ctx.schema);\n let deduped = ctx.rawSegment;\n for (const key of names) {\n deduped = dedupeSingleTag(deduped, key);\n }\n if (deduped !== ctx.rawSegment) {\n return { rawSegment: deduped, reparse: true };\n }\n return {};\n },\n};\n\nexport const repairAgainstSchemaHeuristic: ToolCallHeuristic = {\n id: \"repair-against-schema\",\n phase: \"post-parse\",\n applies: (ctx: IntermediateCall): boolean =>\n ctx.parsed !== null && typeof ctx.parsed === \"object\",\n run: (ctx: IntermediateCall): HeuristicResult => {\n const repaired = repairParsedAgainstSchema(ctx.parsed, ctx.schema);\n if (repaired !== ctx.parsed) {\n return { parsed: repaired };\n }\n return {};\n },\n};\n\nexport const defaultPipelineConfig: PipelineConfig = {\n preParse: [normalizeCloseTagsHeuristic, escapeInvalidLtHeuristic],\n fallbackReparse: [balanceTagsHeuristic, dedupeShellStringTagsHeuristic],\n postParse: [repairAgainstSchemaHeuristic],\n};\n\nconst INDEX_TAG_RE = /^<(\\d+)(?:>|\\/?>)/;\n\nfunction isIndexTagAt(xml: string, pos: number): boolean {\n const remaining = xml.slice(pos);\n return INDEX_TAG_RE.test(remaining);\n}\n\nfunction escapeInvalidLt(xml: string): string {\n const len = xml.length;\n let out = \"\";\n for (let i = 0; i < len; i += 1) {\n const ch = xml[i];\n if (ch === \"<\") {\n const next = i + 1 < len ? xml[i + 1] : \"\";\n const isValidStart =\n NAME_START_CHAR_RE.test(next) ||\n next === \"/\" ||\n next === \"!\" ||\n next === \"?\";\n const isIndexTag = !isValidStart && isIndexTagAt(xml, i);\n if (!(isValidStart || isIndexTag)) {\n out += \"<\";\n continue;\n }\n }\n out += ch;\n }\n return out;\n}\n\nfunction balanceTags(xml: string): string {\n const src = xml\n .replace(MALFORMED_CLOSE_RE_G, \"</$1>\")\n .replace(STATUS_TO_STEP_BOUNDARY_RE, \"</status></step><step>\");\n let i = 0;\n const len = src.length;\n const out: string[] = [];\n const stack: string[] = [];\n\n while (i < len) {\n const lt = src.indexOf(\"<\", i);\n if (lt === -1) {\n out.push(src.slice(i));\n break;\n }\n out.push(src.slice(i, lt));\n if (lt + 1 >= len) {\n break;\n }\n const next = src[lt + 1];\n if (next === \"!\" || next === \"?\") {\n i = handleSpecialTagSegment(src, lt, out);\n continue;\n }\n if (next === \"/\") {\n i = handleClosingTagSegment(src, lt, out, stack);\n continue;\n }\n i = handleOpeningTagSegment(src, lt, out, stack);\n }\n\n for (let k = stack.length - 1; k >= 0; k -= 1) {\n out.push(`</${stack[k]}>`);\n }\n return out.join(\"\");\n}\n\nfunction skipWs(s: string, p: number, len: number): number {\n let idx = p;\n while (idx < len && WHITESPACE_REGEX.test(s[idx])) {\n idx += 1;\n }\n return idx;\n}\n\nfunction parseTagNameAt(\n s: string,\n p: number,\n len: number\n): { name: string; pos: number } {\n let idx = p;\n const start = idx;\n while (idx < len && NAME_CHAR_RE.test(s[idx])) {\n idx += 1;\n }\n return { name: s.slice(start, idx), pos: idx };\n}\n\nfunction handleSpecialTagSegment(\n src: string,\n lt: number,\n out: string[]\n): number {\n const gt = src.indexOf(\">\", lt + 1);\n if (gt === -1) {\n out.push(src.slice(lt));\n return src.length;\n }\n out.push(src.slice(lt, gt + 1));\n return gt + 1;\n}\n\nfunction handleClosingTagSegment(\n src: string,\n lt: number,\n out: string[],\n stack: string[]\n): number {\n const len = src.length;\n let p = skipWs(src, lt + 2, len);\n const { name, pos } = parseTagNameAt(src, p, len);\n p = pos;\n const gt = src.indexOf(\">\", p);\n const closingText = gt === -1 ? src.slice(lt) : src.slice(lt, gt + 1);\n const idx = stack.lastIndexOf(name);\n if (idx !== -1) {\n for (let k = stack.length - 1; k > idx; k -= 1) {\n out.push(`</${stack[k]}>`);\n stack.pop();\n }\n out.push(closingText);\n stack.pop();\n }\n return gt === -1 ? len : gt + 1;\n}\n\nfunction handleOpeningTagSegment(\n src: string,\n lt: number,\n out: string[],\n stack: string[]\n): number {\n const len = src.length;\n let p = skipWs(src, lt + 1, len);\n const nameStart = p;\n const parsed = parseTagNameAt(src, p, len);\n p = parsed.pos;\n const name = src.slice(nameStart, p);\n const q = src.indexOf(\">\", p);\n if (q === -1) {\n out.push(src.slice(lt));\n return len;\n }\n let r = q - 1;\n while (r >= nameStart && WHITESPACE_REGEX.test(src[r])) {\n r -= 1;\n }\n const selfClosing = src[r] === \"/\";\n out.push(src.slice(lt, q + 1));\n if (!selfClosing && name) {\n stack.push(name);\n }\n return q + 1;\n}\n\n/**\n * Extract properties from a JSON schema, handling $ref unwrapping.\n * Returns undefined if schema is invalid or has no properties.\n */\nfunction extractSchemaProperties(\n schema: unknown\n): Record<string, unknown> | undefined {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n return undefined;\n }\n return (unwrapped as { properties?: Record<string, unknown> }).properties;\n}\n\nfunction shouldDeduplicateStringTags(schema: unknown): boolean {\n const props = extractSchemaProperties(schema);\n if (!props) {\n return false;\n }\n const commandRaw = props.command;\n if (!commandRaw) {\n return false;\n }\n const command = unwrapJsonSchema(commandRaw) as { type?: string } | undefined;\n return command?.type === \"array\";\n}\n\nfunction getStringPropertyNames(schema: unknown): string[] {\n const props = extractSchemaProperties(schema);\n if (!props) {\n return [];\n }\n const names: string[] = [];\n for (const key of Object.keys(props)) {\n const prop = unwrapJsonSchema(props[key]) as { type?: string } | undefined;\n if (prop?.type === \"string\") {\n names.push(key);\n }\n }\n return names;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction dedupeSingleTag(xml: string, key: string): string {\n const escaped = escapeRegExp(key);\n const re = new RegExp(`<${escaped}>([\\\\s\\\\S]*?)<\\\\/${escaped}>`, \"g\");\n const matches = Array.from(xml.matchAll(re));\n if (matches.length <= 1) {\n return xml;\n }\n const last = matches.at(-1);\n let result = \"\";\n let cursor = 0;\n for (const m of matches) {\n const idx = m.index ?? 0;\n result += xml.slice(cursor, idx);\n if (last && idx === (last.index ?? -1)) {\n result += m[0];\n }\n cursor = idx + m[0].length;\n }\n result += xml.slice(cursor);\n return result;\n}\n\nfunction repairParsedAgainstSchema(input: unknown, schema: unknown): unknown {\n if (!input || typeof input !== \"object\") {\n return input;\n }\n const properties = extractSchemaProperties(schema);\n if (!properties) {\n return input;\n }\n applySchemaProps(input as Record<string, unknown>, properties);\n return input;\n}\n\ninterface PropSchema {\n type?: string;\n items?: unknown;\n}\n\nfunction applySchemaProps(\n obj: Record<string, unknown>,\n properties: Record<string, unknown>\n): void {\n for (const key of Object.keys(obj)) {\n const propSchema = properties[key];\n if (!propSchema) {\n continue;\n }\n const prop = unwrapJsonSchema(propSchema) as PropSchema | undefined;\n if (prop?.type === \"array\" && prop.items) {\n const itemSchema = unwrapJsonSchema(prop.items);\n obj[key] = coerceArrayItems(obj[key], itemSchema);\n continue;\n }\n if (prop?.type === \"object\") {\n const val = obj[key];\n if (val && typeof val === \"object\") {\n obj[key] = repairParsedAgainstSchema(val, prop);\n }\n }\n }\n}\n\nfunction coerceArrayItems(\n val: unknown,\n itemSchema: unknown\n): unknown[] | unknown {\n if (!Array.isArray(val)) {\n return val;\n }\n return val.map((v) => coerceArrayItem(v, itemSchema));\n}\n\nfunction coerceArrayItem(v: unknown, itemSchema: unknown): unknown {\n const itemType = (itemSchema as { type?: string })?.type;\n if (typeof v === \"string\" && itemType === \"object\") {\n const parsed = tryParseStringToSchemaObject(v, itemSchema);\n if (parsed !== null) {\n return parsed;\n }\n const fallback = extractStepStatusFromString(\n v.replace(MALFORMED_CLOSE_RE_G, \"</$1>\")\n );\n if (fallback) {\n return fallback;\n }\n return v;\n }\n if (v && typeof v === \"object\" && itemType === \"object\") {\n return repairParsedAgainstSchema(v, itemSchema);\n }\n return v;\n}\n\nfunction tryParseStringToSchemaObject(\n xml: string,\n itemSchema: unknown\n): unknown | null {\n try {\n const normalized = xml.replace(MALFORMED_CLOSE_RE_G, \"</$1>\");\n const fixed = parse(normalized, itemSchema, { noChildNodes: [] });\n return typeof fixed === \"string\" ? null : (fixed as unknown);\n } catch {\n return null;\n }\n}\n\nfunction extractStepStatusFromString(\n normXml: string\n): Record<string, string> | null {\n const stepMatch = normXml.match(STEP_TAG_RE);\n const statusMatch = normXml.match(STATUS_TAG_RE);\n if (stepMatch && statusMatch) {\n return { step: stepMatch[1], status: statusMatch[1] };\n }\n return null;\n}\n\nexport {\n escapeInvalidLt,\n balanceTags,\n shouldDeduplicateStringTags,\n getStringPropertyNames,\n dedupeSingleTag,\n repairParsedAgainstSchema,\n};\n","import { parse as parseCore } from \"./core/parser\";\nimport type { ParseOptions } from \"./core/types\";\nimport { RXMLParseError } from \"./errors/types\";\nimport {\n applyHeuristicPipeline,\n createIntermediateCall,\n defaultPipelineConfig,\n} from \"./heuristics\";\n\nexport function parse(\n xml: string,\n schema: unknown,\n options: ParseOptions = {}\n): Record<string, unknown> {\n if (!options.repair) {\n return parseCore(xml, schema, options);\n }\n\n const baseOptions: ParseOptions = {\n ...options,\n repair: false,\n };\n\n const ctx = createIntermediateCall(\"\", xml, schema);\n const result = applyHeuristicPipeline(ctx, defaultPipelineConfig, {\n parse: (raw, s) => parseCore(raw, s, baseOptions),\n onError: options.onError,\n maxReparses: options.maxReparses,\n });\n\n if (result.parsed !== null) {\n return result.parsed as Record<string, unknown>;\n }\n\n const error = result.errors[0];\n throw new RXMLParseError(\"Failed to parse XML with repair heuristics\", error);\n}\n","import type {\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport { parse, stringify } from \"../../rxml\";\nimport { generateId } from \"../utils/id\";\nimport { escapeRegExp } from \"../utils/regex\";\nimport type { TCMCoreProtocol } from \"./protocol-interface\";\n\nexport interface XmlProtocolOptions {\n parseOptions?: {\n repair?: boolean;\n maxReparses?: number;\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n noChildNodes?: string[];\n [key: string]: unknown;\n };\n}\n\ninterface ParserOptions {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n}\n\ntype FlushTextFn = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n text?: string\n) => void;\n\nconst NAME_CHAR_RE = /[A-Za-z0-9_:-]/;\nconst WHITESPACE_REGEX = /\\s/;\n\nfunction getToolSchema(tools: LanguageModelV3FunctionTool[], toolName: string) {\n return tools.find((t) => t.name === toolName)?.inputSchema;\n}\n\ninterface ProcessToolCallParams {\n toolCall: {\n toolName: string;\n content: string;\n startIndex: number;\n endIndex: number;\n };\n tools: LanguageModelV3FunctionTool[];\n options?: ParserOptions;\n text: string;\n processedElements: LanguageModelV3Content[];\n parseOptions?: Record<string, unknown>;\n}\n\nfunction processToolCall(params: ProcessToolCallParams): void {\n const { toolCall, tools, options, text, processedElements, parseOptions } =\n params;\n const toolSchema = getToolSchema(tools, toolCall.toolName);\n\n const parseConfig = {\n ...(parseOptions ?? {}),\n onError:\n options?.onError ??\n (parseOptions as { onError?: ParserOptions[\"onError\"] } | undefined)\n ?.onError,\n };\n\n try {\n const parsed = parse(toolCall.content, toolSchema, parseConfig);\n processedElements.push({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: toolCall.toolName,\n input: JSON.stringify(parsed),\n });\n } catch (error) {\n const originalCallText = text.substring(\n toolCall.startIndex,\n toolCall.endIndex\n );\n options?.onError?.(\n `Could not process XML tool call: ${toolCall.toolName}`,\n { toolCall: originalCallText, error }\n );\n processedElements.push({ type: \"text\", text: originalCallText });\n }\n}\n\ninterface HandleStreamingToolCallEndParams {\n toolContent: string;\n currentToolCall: { name: string; content?: string };\n tools: LanguageModelV3FunctionTool[];\n options?: ParserOptions;\n ctrl: TransformStreamDefaultController<LanguageModelV3StreamPart>;\n flushText: FlushTextFn;\n parseOptions?: Record<string, unknown>;\n}\n\nfunction handleStreamingToolCallEnd(\n params: HandleStreamingToolCallEndParams\n): void {\n const {\n toolContent,\n currentToolCall,\n tools,\n options,\n ctrl,\n flushText,\n parseOptions,\n } = params;\n const toolSchema = getToolSchema(tools, currentToolCall.name);\n const parseConfig = {\n ...(parseOptions ?? {}),\n onError:\n options?.onError ??\n (parseOptions as { onError?: ParserOptions[\"onError\"] } | undefined)\n ?.onError,\n };\n\n flushText(ctrl);\n try {\n const parsedResult = parse(toolContent, toolSchema, parseConfig);\n ctrl.enqueue({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: currentToolCall.name,\n input: JSON.stringify(parsedResult),\n });\n } catch (error) {\n const original = `<${currentToolCall.name}>${toolContent}</${currentToolCall.name}>`;\n options?.onError?.(\"Could not process streaming XML tool call\", {\n toolCall: original,\n error,\n });\n flushText(ctrl, original);\n }\n}\n\nfunction findClosingTagEndFlexible(\n text: string,\n contentStart: number,\n toolName: string\n): number {\n let pos = contentStart;\n let depth = 1;\n\n while (pos < text.length) {\n const tok = nextTagToken(text, pos);\n if (tok.kind === \"eof\") {\n break;\n }\n const result = updateDepthWithToken(tok, toolName, depth);\n depth = result.depth;\n if (result.closedAt !== undefined) {\n return result.closedAt;\n }\n pos = tok.nextPos;\n }\n return -1;\n}\n\nfunction skipSpecialSegment(text: string, lt: number): number | null {\n const next = text[lt + 1];\n if (next === \"!\" || next === \"?\") {\n const gt = text.indexOf(\">\", lt + 1);\n if (gt !== -1) {\n return gt + 1;\n }\n }\n return null;\n}\n\nfunction consumeClosingTag(\n text: string,\n lt: number\n): { matched: boolean; endPos: number } {\n const gt = text.indexOf(\">\", lt + 1);\n const endPos = gt === -1 ? text.length : gt + 1;\n return { matched: false, endPos };\n}\n\nfunction consumeOpenTag(\n text: string,\n lt: number\n): { name: string; selfClosing: boolean; nextPos: number } | null {\n let p = lt + 1;\n while (p < text.length && WHITESPACE_REGEX.test(text[p])) {\n p += 1;\n }\n const nameStart = p;\n while (p < text.length && NAME_CHAR_RE.test(text.charAt(p))) {\n p += 1;\n }\n const name = text.slice(nameStart, p);\n const q = text.indexOf(\">\", p);\n if (q === -1) {\n return null;\n }\n let r = q - 1;\n while (r >= nameStart && WHITESPACE_REGEX.test(text[r])) {\n r -= 1;\n }\n const selfClosing = text[r] === \"/\";\n return { name, selfClosing, nextPos: q + 1 };\n}\n\nfunction updateDepthWithToken(\n tok:\n | { kind: \"special\"; nextPos: number }\n | { kind: \"close\"; name: string; nextPos: number }\n | { kind: \"open\"; name: string; selfClosing: boolean; nextPos: number },\n toolName: string,\n depth: number\n): { depth: number; closedAt?: number } {\n if (tok.kind === \"close\" && tok.name === toolName) {\n const newDepth = depth - 1;\n return newDepth === 0\n ? { depth: newDepth, closedAt: tok.nextPos }\n : { depth: newDepth };\n }\n if (tok.kind === \"open\" && tok.name === toolName && !tok.selfClosing) {\n return { depth: depth + 1 };\n }\n return { depth };\n}\n\nfunction nextTagToken(\n text: string,\n fromPos: number\n):\n | { kind: \"eof\"; nextPos: number }\n | { kind: \"special\"; nextPos: number }\n | { kind: \"close\"; name: string; nextPos: number }\n | { kind: \"open\"; name: string; selfClosing: boolean; nextPos: number } {\n const lt = text.indexOf(\"<\", fromPos);\n if (lt === -1 || lt + 1 >= text.length) {\n return { kind: \"eof\", nextPos: text.length };\n }\n const next = text[lt + 1];\n const specialEnd = skipSpecialSegment(text, lt);\n if (specialEnd !== null) {\n return { kind: \"special\", nextPos: specialEnd };\n }\n if (next === \"/\") {\n const closing = consumeClosingTag(text, lt);\n let p = lt + 2;\n while (p < text.length && WHITESPACE_REGEX.test(text[p])) {\n p += 1;\n }\n const nameStart = p;\n while (p < text.length && NAME_CHAR_RE.test(text.charAt(p))) {\n p += 1;\n }\n const name = text.slice(nameStart, p);\n return { kind: \"close\", name, nextPos: closing.endPos };\n }\n const open = consumeOpenTag(text, lt);\n if (open === null) {\n return { kind: \"eof\", nextPos: text.length };\n }\n return {\n kind: \"open\",\n name: open.name,\n selfClosing: open.selfClosing,\n nextPos: open.nextPos,\n };\n}\n\ninterface ToolTagMatch {\n tagStart: number;\n isSelfClosing: boolean;\n tagLength: number;\n}\n\nfunction findNextToolTag(\n text: string,\n searchIndex: number,\n toolName: string\n): ToolTagMatch | null {\n const startTag = `<${toolName}>`;\n const openIdx = text.indexOf(startTag, searchIndex);\n const selfMatch = findSelfClosingTag(text, toolName, searchIndex);\n const selfIdx = selfMatch?.index ?? -1;\n if (openIdx === -1 && selfIdx === -1) {\n return null;\n }\n const isSelfClosing = selfIdx !== -1 && (openIdx === -1 || selfIdx < openIdx);\n return {\n tagStart: isSelfClosing ? selfIdx : openIdx,\n isSelfClosing,\n tagLength: isSelfClosing ? (selfMatch?.length ?? 0) : startTag.length,\n };\n}\n\nfunction findLastCloseTagStart(segment: string, toolName: string): number {\n const closeTagPattern = new RegExp(\n `</\\\\s*${escapeRegExp(toolName)}\\\\s*>`,\n \"g\"\n );\n let closeTagStart = -1;\n let match = closeTagPattern.exec(segment);\n while (match !== null) {\n closeTagStart = match.index;\n match = closeTagPattern.exec(segment);\n }\n if (closeTagStart === -1) {\n return segment.lastIndexOf(\"<\");\n }\n return closeTagStart;\n}\n\nfunction pushSelfClosingToolCall(\n toolCalls: Array<{\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n }>,\n toolName: string,\n text: string,\n tagStart: number,\n tagLength: number\n): number {\n const endIndex = tagStart + tagLength;\n toolCalls.push({\n toolName,\n startIndex: tagStart,\n endIndex,\n content: \"\",\n segment: text.substring(tagStart, endIndex),\n });\n return endIndex;\n}\n\n/**\n * Cache for self-closing tag regex patterns.\n * This cache grows with the number of unique tool names but is bounded\n * in practice since tools are defined at configuration time, not dynamically.\n */\nconst selfClosingTagCache = new Map<string, RegExp>();\n\nfunction getSelfClosingTagPattern(toolName: string): RegExp {\n let pattern = selfClosingTagCache.get(toolName);\n if (!pattern) {\n pattern = new RegExp(`<\\\\s*${escapeRegExp(toolName)}\\\\s*/>`, \"g\");\n selfClosingTagCache.set(toolName, pattern);\n }\n return pattern;\n}\n\nfunction findSelfClosingTag(\n text: string,\n toolName: string,\n fromIndex: number\n): { index: number; length: number } | null {\n const pattern = getSelfClosingTagPattern(toolName);\n pattern.lastIndex = fromIndex;\n const match = pattern.exec(text);\n if (!match || match.index === undefined) {\n return null;\n }\n return { index: match.index, length: match[0].length };\n}\n\nfunction appendOpenToolCallIfComplete(\n toolCalls: Array<{\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n }>,\n text: string,\n toolName: string,\n tagStart: number,\n startTag: string\n): number {\n const contentStart = tagStart + startTag.length;\n const fullTagEnd = findClosingTagEndFlexible(text, contentStart, toolName);\n if (fullTagEnd === -1 || fullTagEnd <= contentStart) {\n return contentStart;\n }\n const segment = text.substring(tagStart, fullTagEnd);\n const closeTagStart = findLastCloseTagStart(segment, toolName);\n const inner =\n closeTagStart === -1\n ? segment.slice(startTag.length)\n : segment.slice(startTag.length, closeTagStart);\n toolCalls.push({\n toolName,\n startIndex: tagStart,\n endIndex: fullTagEnd,\n content: inner,\n segment,\n });\n return fullTagEnd;\n}\n\nfunction findToolCallsForName(\n text: string,\n toolName: string\n): Array<{\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n}> {\n const toolCalls: Array<{\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n }> = [];\n const startTag = `<${toolName}>`;\n let searchIndex = 0;\n\n while (searchIndex < text.length) {\n const match = findNextToolTag(text, searchIndex, toolName);\n if (match === null) {\n break;\n }\n if (match.isSelfClosing) {\n searchIndex = pushSelfClosingToolCall(\n toolCalls,\n toolName,\n text,\n match.tagStart,\n match.tagLength\n );\n continue;\n }\n searchIndex = appendOpenToolCallIfComplete(\n toolCalls,\n text,\n toolName,\n match.tagStart,\n startTag\n );\n }\n\n return toolCalls;\n}\n\nfunction findToolCalls(\n text: string,\n toolNames: string[]\n): Array<{\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n}> {\n const toolCalls: Array<{\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n }> = [];\n\n for (const toolName of toolNames) {\n const calls = findToolCallsForName(text, toolName);\n toolCalls.push(...calls);\n }\n\n return toolCalls.sort((a, b) => a.startIndex - b.startIndex);\n}\n\nfunction findEarliestToolTag(\n buffer: string,\n toolNames: string[]\n): { index: number; name: string; selfClosing: boolean; tagLength: number } {\n let bestIndex = -1;\n let bestName = \"\";\n let bestSelfClosing = false;\n let bestTagLength = 0;\n\n if (toolNames.length > 0) {\n for (const name of toolNames) {\n const openTag = `<${name}>`;\n const idxOpen = buffer.indexOf(openTag);\n const selfMatch = findSelfClosingTag(buffer, name, 0);\n const idxSelf = selfMatch?.index ?? -1;\n\n if (idxOpen !== -1 && (bestIndex === -1 || idxOpen < bestIndex)) {\n bestIndex = idxOpen;\n bestName = name;\n bestSelfClosing = false;\n bestTagLength = openTag.length;\n }\n if (idxSelf !== -1 && (bestIndex === -1 || idxSelf < bestIndex)) {\n bestIndex = idxSelf;\n bestName = name;\n bestSelfClosing = true;\n bestTagLength = selfMatch?.length ?? 0;\n }\n }\n }\n\n return {\n index: bestIndex,\n name: bestName,\n selfClosing: bestSelfClosing,\n tagLength: bestTagLength,\n };\n}\n\nfunction isOpenTagPrefix(suffix: string, toolName: string): boolean {\n return `${toolName}>`.startsWith(suffix);\n}\n\nfunction consumeWhitespace(text: string, index: number): number {\n let i = index;\n while (i < text.length && WHITESPACE_REGEX.test(text.charAt(i))) {\n i += 1;\n }\n return i;\n}\n\nfunction consumeToolNamePrefix(\n text: string,\n index: number,\n toolName: string\n): { index: number; done: boolean; valid: boolean } {\n let i = index;\n let nameIndex = 0;\n\n while (i < text.length && nameIndex < toolName.length) {\n if (text.charAt(i) !== toolName.charAt(nameIndex)) {\n return { index: i, done: false, valid: false };\n }\n i += 1;\n nameIndex += 1;\n }\n\n return { index: i, done: nameIndex === toolName.length, valid: true };\n}\n\n/**\n * Checks if the remainder of text at index is a valid self-closing tag suffix.\n * Returns true if:\n * - text[index] is \"/\" and we're at the end (incomplete \"/\")\n * - text[index..] is \"/>\" at the end of the string\n */\nfunction isSelfClosingSuffixRemainder(text: string, index: number): boolean {\n if (text.charAt(index) !== \"/\") {\n return false;\n }\n if (index + 1 >= text.length) {\n return true;\n }\n return index + 1 === text.length - 1 && text.charAt(index + 1) === \">\";\n}\n\nfunction isSelfClosingTagPrefix(suffix: string, toolName: string): boolean {\n let i = consumeWhitespace(suffix, 0);\n if (i >= suffix.length) {\n return true;\n }\n\n const nameRemainder = suffix.slice(i);\n if (toolName.startsWith(nameRemainder)) {\n return true;\n }\n\n const nameResult = consumeToolNamePrefix(suffix, i, toolName);\n if (!nameResult.valid) {\n return false;\n }\n\n i = nameResult.index;\n if (i >= suffix.length) {\n return true;\n }\n if (!nameResult.done) {\n return false;\n }\n\n i = consumeWhitespace(suffix, i);\n if (i >= suffix.length) {\n return true;\n }\n\n return isSelfClosingSuffixRemainder(suffix, i);\n}\n\nfunction findPotentialToolTagStart(\n buffer: string,\n toolNames: string[]\n): number {\n if (toolNames.length === 0 || buffer.length === 0) {\n return -1;\n }\n\n const lastGt = buffer.lastIndexOf(\">\");\n const offset = lastGt === -1 ? 0 : lastGt + 1;\n const trailing = buffer.slice(offset);\n\n for (let i = trailing.length - 1; i >= 0; i -= 1) {\n if (trailing.charAt(i) !== \"<\") {\n continue;\n }\n const suffix = trailing.slice(i + 1);\n for (const name of toolNames) {\n if (\n isOpenTagPrefix(suffix, name) ||\n isSelfClosingTagPrefix(suffix, name)\n ) {\n return offset + i;\n }\n }\n }\n\n return -1;\n}\n\nfunction createFlushTextHandler(\n getCurrentTextId: () => string | null,\n setCurrentTextId: (id: string | null) => void,\n getHasEmittedTextStart: () => boolean,\n setHasEmittedTextStart: (value: boolean) => void\n) {\n return (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n text?: string\n ) => {\n const content = text;\n if (content) {\n if (!getCurrentTextId()) {\n const newId = generateId();\n setCurrentTextId(newId);\n controller.enqueue({\n type: \"text-start\",\n id: newId,\n });\n setHasEmittedTextStart(true);\n }\n controller.enqueue({\n type: \"text-delta\",\n id: getCurrentTextId() as string,\n delta: content,\n });\n }\n\n const currentTextId = getCurrentTextId();\n if (currentTextId && !text) {\n if (getHasEmittedTextStart()) {\n controller.enqueue({\n type: \"text-end\",\n id: currentTextId,\n });\n setHasEmittedTextStart(false);\n }\n setCurrentTextId(null);\n }\n };\n}\n\ninterface ProcessToolCallInBufferParams {\n buffer: string;\n currentToolCall: { name: string; content: string };\n tools: LanguageModelV3FunctionTool[];\n options?: ParserOptions;\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>;\n flushText: FlushTextFn;\n setBuffer: (buffer: string) => void;\n parseOptions?: Record<string, unknown>;\n}\n\nfunction processToolCallInBuffer(params: ProcessToolCallInBufferParams): {\n buffer: string;\n currentToolCall: { name: string; content: string } | null;\n shouldBreak: boolean;\n} {\n const {\n buffer,\n currentToolCall,\n tools,\n options,\n controller,\n flushText,\n setBuffer,\n parseOptions,\n } = params;\n const endTagPattern = new RegExp(\n `</\\\\s*${escapeRegExp(currentToolCall.name)}\\\\s*>`\n );\n const endMatch = endTagPattern.exec(buffer);\n if (!endMatch || endMatch.index === undefined) {\n return { buffer, currentToolCall, shouldBreak: true };\n }\n\n const endIdx = endMatch.index;\n const endPos = endIdx + endMatch[0].length;\n const content = buffer.substring(0, endIdx);\n const remainder = buffer.substring(endPos);\n setBuffer(remainder);\n\n handleStreamingToolCallEnd({\n toolContent: content,\n currentToolCall,\n tools,\n options,\n ctrl: controller,\n flushText,\n parseOptions,\n });\n\n return {\n buffer: remainder,\n currentToolCall: null,\n shouldBreak: false,\n };\n}\n\ninterface ProcessNoToolCallInBufferParams {\n buffer: string;\n toolNames: string[];\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>;\n flushText: FlushTextFn;\n tools: LanguageModelV3FunctionTool[];\n options?: ParserOptions;\n parseOptions?: Record<string, unknown>;\n setBuffer: (buffer: string) => void;\n}\n\nfunction processNoToolCallInBuffer(params: ProcessNoToolCallInBufferParams): {\n buffer: string;\n currentToolCall: { name: string; content: string } | null;\n shouldBreak: boolean;\n shouldContinue: boolean;\n} {\n const {\n buffer,\n toolNames,\n controller,\n flushText,\n tools,\n options,\n parseOptions,\n setBuffer,\n } = params;\n const {\n index: earliestStartTagIndex,\n name: earliestToolName,\n selfClosing,\n tagLength,\n } = findEarliestToolTag(buffer, toolNames);\n\n if (earliestStartTagIndex === -1) {\n const potentialStart = findPotentialToolTagStart(buffer, toolNames);\n const safeLen = Math.max(\n 0,\n potentialStart === -1 ? buffer.length : potentialStart\n );\n const remaining = buffer.slice(safeLen);\n if (safeLen > 0) {\n flushText(controller, buffer.slice(0, safeLen));\n setBuffer(remaining);\n }\n return {\n buffer: remaining,\n currentToolCall: null,\n shouldBreak: true,\n shouldContinue: false,\n };\n }\n\n flushText(controller, buffer.substring(0, earliestStartTagIndex));\n\n if (selfClosing) {\n const newBuffer = buffer.substring(earliestStartTagIndex + tagLength);\n setBuffer(newBuffer);\n handleStreamingToolCallEnd({\n toolContent: \"\",\n currentToolCall: { name: earliestToolName, content: \"\" },\n tools,\n options,\n ctrl: controller,\n flushText,\n parseOptions,\n });\n return {\n buffer: newBuffer,\n currentToolCall: null,\n shouldBreak: false,\n shouldContinue: false,\n };\n }\n\n const startTag = `<${earliestToolName}>`;\n const newBuffer = buffer.substring(earliestStartTagIndex + startTag.length);\n setBuffer(newBuffer);\n return {\n buffer: newBuffer,\n currentToolCall: { name: earliestToolName, content: \"\" },\n shouldBreak: false,\n shouldContinue: true,\n };\n}\n\nfunction createProcessBufferHandler(\n getBuffer: () => string,\n setBuffer: (buffer: string) => void,\n getCurrentToolCall: () => { name: string; content: string } | null,\n setCurrentToolCall: (\n toolCall: { name: string; content: string } | null\n ) => void,\n tools: LanguageModelV3FunctionTool[],\n options: ParserOptions | undefined,\n toolNames: string[],\n flushText: FlushTextFn,\n parseOptions?: Record<string, unknown>\n) {\n return (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>\n ) => {\n while (true) {\n const currentToolCall = getCurrentToolCall();\n if (currentToolCall) {\n const result = processToolCallInBuffer({\n buffer: getBuffer(),\n currentToolCall,\n tools,\n options,\n controller,\n flushText,\n setBuffer,\n parseOptions,\n });\n setBuffer(result.buffer);\n setCurrentToolCall(result.currentToolCall);\n if (result.shouldBreak) {\n break;\n }\n } else {\n const result = processNoToolCallInBuffer({\n buffer: getBuffer(),\n toolNames,\n controller,\n flushText,\n tools,\n options,\n parseOptions,\n setBuffer,\n });\n setBuffer(result.buffer);\n setCurrentToolCall(result.currentToolCall);\n if (result.shouldBreak) {\n break;\n }\n if (result.shouldContinue) {\n continue;\n }\n break;\n }\n }\n };\n}\n\nexport const xmlProtocol = (\n protocolOptions?: XmlProtocolOptions\n): TCMCoreProtocol => {\n const parseOptions = {\n repair: true,\n noChildNodes: [],\n ...(protocolOptions?.parseOptions ?? {}),\n };\n\n return {\n formatTools({ tools, toolSystemPromptTemplate }) {\n return toolSystemPromptTemplate(tools || []);\n },\n\n formatToolCall(toolCall: LanguageModelV3ToolCall): string {\n let args: unknown = {};\n if (toolCall.input != null) {\n try {\n args = JSON.parse(toolCall.input);\n } catch {\n args = toolCall.input;\n }\n }\n return stringify(toolCall.toolName, args, {\n suppressEmptyNode: false,\n format: true,\n minimalEscaping: true,\n });\n },\n\n parseGeneratedText({ text, tools, options }) {\n const toolNames = tools.map((t) => t.name).filter(Boolean) as string[];\n if (toolNames.length === 0) {\n return [{ type: \"text\", text }];\n }\n\n const processedElements: LanguageModelV3Content[] = [];\n let currentIndex = 0;\n\n const toolCalls = findToolCalls(text, toolNames);\n\n for (const tc of toolCalls) {\n if (tc.startIndex > currentIndex) {\n processedElements.push({\n type: \"text\",\n text: text.substring(currentIndex, tc.startIndex),\n });\n }\n processToolCall({\n toolCall: tc,\n tools,\n options,\n text,\n processedElements,\n parseOptions,\n });\n currentIndex = tc.endIndex;\n }\n\n if (currentIndex < text.length) {\n processedElements.push({\n type: \"text\",\n text: text.substring(currentIndex),\n });\n }\n\n return processedElements;\n },\n\n createStreamParser({ tools, options }) {\n const toolNames = tools.map((t) => t.name).filter(Boolean) as string[];\n let buffer = \"\";\n // biome-ignore lint/suspicious/noExplicitAny: internal state\n let currentToolCall: any = null;\n let currentTextId: string | null = null;\n let hasEmittedTextStart = false;\n\n const flushText = createFlushTextHandler(\n () => currentTextId,\n (newId: string | null) => {\n currentTextId = newId;\n },\n () => hasEmittedTextStart,\n (value: boolean) => {\n hasEmittedTextStart = value;\n }\n );\n\n const processBuffer = createProcessBufferHandler(\n () => buffer,\n (newBuffer: string) => {\n buffer = newBuffer;\n },\n () => currentToolCall,\n (newToolCall: { name: string; content: string } | null) => {\n currentToolCall = newToolCall;\n },\n tools,\n options,\n toolNames,\n flushText,\n parseOptions\n );\n\n return new TransformStream({\n transform(chunk, controller) {\n if (chunk.type !== \"text-delta\") {\n if (buffer) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n controller.enqueue(chunk);\n return;\n }\n\n const textContent =\n (chunk as unknown as { delta?: string }).delta ?? \"\";\n buffer += textContent;\n processBuffer(controller);\n },\n flush(controller) {\n if (currentToolCall) {\n const unfinishedContent = `<${currentToolCall.name}>${currentToolCall.content || \"\"}${buffer}`;\n flushText(controller, unfinishedContent);\n buffer = \"\";\n currentToolCall = null;\n } else if (buffer) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n if (currentTextId && hasEmittedTextStart) {\n controller.enqueue({\n type: \"text-end\",\n id: currentTextId,\n });\n hasEmittedTextStart = false;\n currentTextId = null;\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) {\n return [];\n }\n\n return findToolCalls(text, toolNames).map((tc) => tc.segment);\n },\n };\n};\n","import type {\n LanguageModelV3Content,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport YAML from \"yaml\";\nimport { generateId } from \"../utils/id\";\nimport type { TCMCoreProtocol } from \"./protocol-interface\";\n\nexport interface YamlProtocolOptions {\n /**\n * Whether to include a system prompt example showing YAML multiline syntax.\n * @default true\n */\n includeMultilineExample?: boolean;\n}\n\ninterface ParserOptions {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n}\n\nconst NAME_CHAR_RE = /[A-Za-z0-9_:-]/;\nconst WHITESPACE_REGEX = /\\s/;\nconst LEADING_WHITESPACE_RE = /^(\\s*)/;\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: XML tag parsing with nested tag tracking inherently requires complex state management\nfunction findClosingTagEnd(\n text: string,\n contentStart: number,\n toolName: string\n): number {\n let pos = contentStart;\n let depth = 1;\n\n while (pos < text.length) {\n const ltIdx = text.indexOf(\"<\", pos);\n if (ltIdx === -1) {\n break;\n }\n\n const next = text[ltIdx + 1];\n if (next === \"/\") {\n const gtIdx = text.indexOf(\">\", ltIdx);\n if (gtIdx === -1) {\n break;\n }\n\n let p = ltIdx + 2;\n while (p < gtIdx && WHITESPACE_REGEX.test(text[p])) {\n p++;\n }\n const nameStart = p;\n while (p < gtIdx && NAME_CHAR_RE.test(text.charAt(p))) {\n p++;\n }\n const name = text.slice(nameStart, p);\n\n if (name === toolName) {\n depth--;\n if (depth === 0) {\n return gtIdx + 1;\n }\n }\n pos = gtIdx + 1;\n } else if (next === \"!\" || next === \"?\") {\n const gtIdx = text.indexOf(\">\", ltIdx);\n pos = gtIdx === -1 ? text.length : gtIdx + 1;\n } else {\n let p = ltIdx + 1;\n while (p < text.length && WHITESPACE_REGEX.test(text[p])) {\n p++;\n }\n const nameStart = p;\n while (p < text.length && NAME_CHAR_RE.test(text.charAt(p))) {\n p++;\n }\n const name = text.slice(nameStart, p);\n\n const gtIdx = text.indexOf(\">\", p);\n if (gtIdx === -1) {\n break;\n }\n\n let r = gtIdx - 1;\n while (r >= nameStart && WHITESPACE_REGEX.test(text[r])) {\n r--;\n }\n const selfClosing = text[r] === \"/\";\n\n if (name === toolName && !selfClosing) {\n depth++;\n }\n pos = gtIdx + 1;\n }\n }\n\n return -1;\n}\n\nfunction findEarliestTagPosition(\n openIdx: number,\n selfIdx: number\n): { tagStart: number; isSelfClosing: boolean } {\n const hasSelf = selfIdx !== -1;\n const hasOpen = openIdx !== -1;\n\n if (hasSelf && (!hasOpen || selfIdx < openIdx)) {\n return { tagStart: selfIdx, isSelfClosing: true };\n }\n return { tagStart: openIdx, isSelfClosing: false };\n}\n\n/**\n * Find all tool calls in the text for the given tool names.\n */\ninterface ToolCallMatch {\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n}\n\nfunction collectToolCallsForName(\n text: string,\n toolName: string\n): ToolCallMatch[] {\n const toolCalls: ToolCallMatch[] = [];\n let searchIndex = 0;\n const selfTagRegex = new RegExp(`<${toolName}\\\\s*/>`, \"g\");\n\n while (searchIndex < text.length) {\n const startTag = `<${toolName}>`;\n const openIdx = text.indexOf(startTag, searchIndex);\n\n selfTagRegex.lastIndex = searchIndex;\n const selfMatch = selfTagRegex.exec(text);\n const selfIdx = selfMatch ? selfMatch.index : -1;\n const selfTagLength = selfMatch ? selfMatch[0].length : 0;\n\n if (openIdx === -1 && selfIdx === -1) {\n break;\n }\n\n const { tagStart, isSelfClosing } = findEarliestTagPosition(\n openIdx,\n selfIdx\n );\n\n if (isSelfClosing) {\n const endIndex = tagStart + selfTagLength;\n toolCalls.push({\n toolName,\n startIndex: tagStart,\n endIndex,\n content: \"\",\n });\n searchIndex = endIndex;\n continue;\n }\n\n const contentStart = tagStart + startTag.length;\n const fullTagEnd = findClosingTagEnd(text, contentStart, toolName);\n if (fullTagEnd !== -1 && fullTagEnd > contentStart) {\n const endTag = `</${toolName}>`;\n const endTagStart = fullTagEnd - endTag.length;\n const content = text.substring(contentStart, endTagStart);\n toolCalls.push({\n toolName,\n startIndex: tagStart,\n endIndex: fullTagEnd,\n content,\n });\n searchIndex = fullTagEnd;\n } else {\n searchIndex = contentStart;\n }\n }\n\n return toolCalls;\n}\n\nfunction findToolCalls(text: string, toolNames: string[]): ToolCallMatch[] {\n const toolCalls = toolNames.flatMap((toolName) =>\n collectToolCallsForName(text, toolName)\n );\n return toolCalls.sort((a, b) => a.startIndex - b.startIndex);\n}\n\n/**\n * Parse YAML content from inside an XML tag.\n * Handles common LLM output issues like inconsistent indentation.\n */\nfunction parseYamlContent(\n yamlContent: string,\n options?: ParserOptions\n): Record<string, unknown> | null {\n let normalized = yamlContent;\n if (normalized.startsWith(\"\\n\")) {\n normalized = normalized.slice(1);\n }\n\n const lines = normalized.split(\"\\n\");\n const nonEmptyLines = lines.filter((line) => line.trim().length > 0);\n\n if (nonEmptyLines.length === 0) {\n return {};\n }\n\n const minIndent = Math.min(\n ...nonEmptyLines.map((line) => {\n const match = line.match(LEADING_WHITESPACE_RE);\n return match ? match[1].length : 0;\n })\n );\n if (minIndent > 0) {\n normalized = lines.map((line) => line.slice(minIndent)).join(\"\\n\");\n }\n\n try {\n const doc = YAML.parseDocument(normalized);\n\n if (doc.errors && doc.errors.length > 0) {\n options?.onError?.(\"YAML parse error\", {\n errors: doc.errors.map((e: { message: string }) => e.message),\n });\n return null;\n }\n\n const result = doc.toJSON();\n\n if (result === null) {\n return {};\n }\n\n if (typeof result !== \"object\" || Array.isArray(result)) {\n options?.onError?.(\"YAML content must be a key-value mapping\", {\n got: typeof result,\n });\n return null;\n }\n\n return result as Record<string, unknown>;\n } catch (error) {\n options?.onError?.(\"Failed to parse YAML content\", { error });\n return null;\n }\n}\n\nfunction appendTextPart(\n processedElements: LanguageModelV3Content[],\n textPart: string\n) {\n if (textPart.trim()) {\n processedElements.push({\n type: \"text\",\n text: textPart,\n });\n }\n}\n\nfunction processToolCallMatch(\n text: string,\n tc: ToolCallMatch,\n currentIndex: number,\n processedElements: LanguageModelV3Content[],\n options?: ParserOptions\n): number {\n if (tc.startIndex < currentIndex) {\n return currentIndex;\n }\n\n appendTextPart(\n processedElements,\n text.substring(currentIndex, tc.startIndex)\n );\n\n const parsedArgs = parseYamlContent(tc.content, options);\n if (parsedArgs !== null) {\n processedElements.push({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: tc.toolName,\n input: JSON.stringify(parsedArgs),\n });\n } else {\n const originalText = text.substring(tc.startIndex, tc.endIndex);\n options?.onError?.(\"Could not parse YAML tool call\", {\n toolCall: originalText,\n });\n processedElements.push({ type: \"text\", text: originalText });\n }\n\n return tc.endIndex;\n}\n\nfunction createFlushTextHandler(\n getCurrentTextId: () => string | null,\n setCurrentTextId: (id: string | null) => void,\n getHasEmittedTextStart: () => boolean,\n setHasEmittedTextStart: (value: boolean) => void\n) {\n return (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n text?: string\n ) => {\n const content = text;\n if (content) {\n if (!getCurrentTextId()) {\n const newId = generateId();\n setCurrentTextId(newId);\n controller.enqueue({\n type: \"text-start\",\n id: newId,\n });\n setHasEmittedTextStart(true);\n }\n controller.enqueue({\n type: \"text-delta\",\n id: getCurrentTextId() as string,\n delta: content,\n });\n }\n\n const currentTextId = getCurrentTextId();\n if (currentTextId && !text) {\n if (getHasEmittedTextStart()) {\n controller.enqueue({\n type: \"text-end\",\n id: currentTextId,\n });\n setHasEmittedTextStart(false);\n }\n setCurrentTextId(null);\n }\n };\n}\n\nfunction findEarliestToolTag(\n buffer: string,\n toolNames: string[]\n): { index: number; name: string; selfClosing: boolean; tagLength: number } {\n let bestIndex = -1;\n let bestName = \"\";\n let bestSelfClosing = false;\n let bestTagLength = 0;\n\n for (const name of toolNames) {\n const openTag = `<${name}>`;\n const selfTagRegex = new RegExp(`<${name}\\\\s*/>`);\n const idxOpen = buffer.indexOf(openTag);\n const selfMatch = selfTagRegex.exec(buffer);\n const idxSelf = selfMatch ? selfMatch.index : -1;\n\n if (idxOpen !== -1 && (bestIndex === -1 || idxOpen < bestIndex)) {\n bestIndex = idxOpen;\n bestName = name;\n bestSelfClosing = false;\n bestTagLength = openTag.length;\n }\n if (idxSelf !== -1 && (bestIndex === -1 || idxSelf < bestIndex)) {\n bestIndex = idxSelf;\n bestName = name;\n bestSelfClosing = true;\n bestTagLength = selfMatch ? selfMatch[0].length : 0;\n }\n }\n\n return {\n index: bestIndex,\n name: bestName,\n selfClosing: bestSelfClosing,\n tagLength: bestTagLength,\n };\n}\n\nexport const yamlProtocol = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- reserved for future extensibility\n _protocolOptions?: YamlProtocolOptions\n): TCMCoreProtocol => {\n return {\n formatTools({ tools, toolSystemPromptTemplate }) {\n return toolSystemPromptTemplate(tools || []);\n },\n\n formatToolCall(toolCall: LanguageModelV3ToolCall): string {\n let args: Record<string, unknown> = {};\n if (toolCall.input != null) {\n try {\n args = JSON.parse(toolCall.input) as Record<string, unknown>;\n } catch {\n args = { value: toolCall.input };\n }\n }\n const yamlContent = YAML.stringify(args);\n return `<${toolCall.toolName}>\\n${yamlContent}</${toolCall.toolName}>`;\n },\n\n parseGeneratedText({ text, tools, options }) {\n const toolNames = tools.map((t) => t.name).filter(Boolean) as string[];\n if (toolNames.length === 0) {\n return [{ type: \"text\", text }];\n }\n\n const processedElements: LanguageModelV3Content[] = [];\n let currentIndex = 0;\n\n const toolCalls = findToolCalls(text, toolNames);\n\n for (const tc of toolCalls) {\n currentIndex = processToolCallMatch(\n text,\n tc,\n currentIndex,\n processedElements,\n options\n );\n }\n\n if (currentIndex < text.length) {\n appendTextPart(processedElements, text.substring(currentIndex));\n }\n\n return processedElements;\n },\n\n createStreamParser({ tools, options }) {\n const toolNames = tools.map((t) => t.name).filter(Boolean) as string[];\n let buffer = \"\";\n let currentToolCall: { name: string; content: string } | null = null;\n let currentTextId: string | null = null;\n let hasEmittedTextStart = false;\n\n const flushText = createFlushTextHandler(\n () => currentTextId,\n (newId: string | null) => {\n currentTextId = newId;\n },\n () => hasEmittedTextStart,\n (value: boolean) => {\n hasEmittedTextStart = value;\n }\n );\n\n const processToolCallEnd = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolContent: string,\n toolName: string\n ) => {\n const parsedArgs = parseYamlContent(toolContent, options);\n flushText(controller);\n\n if (parsedArgs !== null) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName,\n input: JSON.stringify(parsedArgs),\n });\n } else {\n const original = `<${toolName}>${toolContent}</${toolName}>`;\n options?.onError?.(\"Could not parse streaming YAML tool call\", {\n toolCall: original,\n });\n flushText(controller, original);\n }\n };\n\n const handlePendingToolCall = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n endTag: string,\n toolName: string\n ): boolean => {\n const endIdx = buffer.indexOf(endTag);\n if (endIdx === -1) {\n return false;\n }\n\n const content = buffer.substring(0, endIdx);\n buffer = buffer.substring(endIdx + endTag.length);\n processToolCallEnd(controller, content, toolName);\n currentToolCall = null;\n return true;\n };\n\n const flushSafeText = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>\n ): void => {\n const maxTagLen = toolNames.length\n ? Math.max(...toolNames.map((n) => `<${n} />`.length))\n : 0;\n const tail = Math.max(0, maxTagLen - 1);\n const safeLen = Math.max(0, buffer.length - tail);\n if (safeLen > 0) {\n flushText(controller, buffer.slice(0, safeLen));\n buffer = buffer.slice(safeLen);\n }\n };\n\n const handleNewToolTag = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n tagIndex: number,\n tagName: string,\n selfClosing: boolean,\n tagLength: number\n ): void => {\n if (tagIndex > 0) {\n flushText(controller, buffer.substring(0, tagIndex));\n }\n\n if (selfClosing) {\n buffer = buffer.substring(tagIndex + tagLength);\n processToolCallEnd(controller, \"\", tagName);\n } else {\n const startTag = `<${tagName}>`;\n buffer = buffer.substring(tagIndex + startTag.length);\n currentToolCall = { name: tagName, content: \"\" };\n }\n };\n\n const processBuffer = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>\n ) => {\n while (true) {\n if (currentToolCall) {\n const toolName = currentToolCall.name;\n const endTag = `</${toolName}>`;\n if (!handlePendingToolCall(controller, endTag, toolName)) {\n break;\n }\n } else {\n const { index, name, selfClosing, tagLength } = findEarliestToolTag(\n buffer,\n toolNames\n );\n\n if (index === -1) {\n flushSafeText(controller);\n break;\n }\n\n handleNewToolTag(controller, index, name, selfClosing, tagLength);\n }\n }\n };\n\n return new TransformStream({\n transform(chunk, controller) {\n if (chunk.type !== \"text-delta\") {\n if (buffer) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n controller.enqueue(chunk);\n return;\n }\n\n const textContent =\n (chunk as unknown as { delta?: string }).delta ?? \"\";\n buffer += textContent;\n processBuffer(controller);\n },\n flush(controller) {\n if (currentToolCall) {\n const unfinishedContent = `<${currentToolCall.name}>${buffer}`;\n flushText(controller, unfinishedContent);\n buffer = \"\";\n currentToolCall = null;\n } else if (buffer) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n if (currentTextId && hasEmittedTextStart) {\n controller.enqueue({\n type: \"text-end\",\n id: currentTextId,\n });\n hasEmittedTextStart = false;\n currentTextId = null;\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) {\n return [];\n }\n\n return findToolCalls(text, toolNames).map(\n (tc) => `<${tc.toolName}>${tc.content}</${tc.toolName}>`\n );\n },\n };\n};\n","import type {\n JSONSchema7,\n LanguageModelV3FunctionTool,\n LanguageModelV3ProviderTool,\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 (LanguageModelV3FunctionTool or LanguageModelV3ProviderTool).\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' tool is encountered, as they are not supported by this middleware.\n */\nexport function createDynamicIfThenElseSchema(\n tools: (LanguageModelV3FunctionTool | LanguageModelV3ProviderTool)[]\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 -= 1) {\n const tool = tools[i];\n\n if (tool.type === \"provider\") {\n throw new Error(\n \"Provider tools are not supported by this middleware. Please use function tools.\"\n );\n }\n\n toolNames.unshift(tool.name);\n\n const toolCondition: JSONSchema7 = {\n if: {\n properties: {\n name: {\n const: tool.name,\n },\n },\n required: [\"name\"],\n },\n // biome-ignore lint/suspicious/noThenProperty: JSON Schema uses 'then' as a keyword\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","export type OnErrorFn = (\n message: string,\n metadata?: Record<string, unknown>\n) => void;\n\ninterface 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;\n}\n","import type {\n JSONSchema7,\n LanguageModelV3FunctionTool,\n} from \"@ai-sdk/provider\";\n\nexport interface ToolCallMiddlewareProviderOptions {\n toolCallMiddleware?: {\n // onError?: (message: string, metadata?: Record<string, unknown>) => void;\n // Optional debug summary container that middleware can populate.\n // Values must be JSON-safe.\n debugSummary?: {\n originalText?: string;\n toolCalls?: string; // JSON string of array of { toolName, input }\n };\n\n // INTERNAL: Set by transform-handler. Used for internal propagation of tool-choice.\n toolChoice?: { type: string; toolName?: string };\n // INTERNAL: Set by transform-handler. Used for internal propagation of params.tools.\n originalTools?: Array<{\n name: string;\n inputSchema: string; // Stringified JSONSchema7\n }>;\n };\n}\n\nexport const originalToolsSchema = {\n encode: encodeOriginalTools,\n decode: decodeOriginalTools,\n};\n\nexport function encodeOriginalTools(\n tools: LanguageModelV3FunctionTool[] | undefined\n): Array<{ name: string; inputSchema: string }> {\n return (\n tools?.map((t) => ({\n name: t.name,\n inputSchema: JSON.stringify(t.inputSchema),\n })) || []\n );\n}\n\nexport function decodeOriginalTools(\n originalTools:\n | Array<{\n name: string;\n inputSchema: string; // stringified JSONSchema7\n }>\n | undefined\n): LanguageModelV3FunctionTool[] {\n if (!originalTools) {\n return [];\n }\n\n return originalTools.map(\n (t): LanguageModelV3FunctionTool => ({\n type: \"function\",\n name: t.name,\n inputSchema: JSON.parse(t.inputSchema) as JSONSchema7,\n })\n );\n}\n\nexport function extractToolNamesFromOriginalTools(\n originalTools:\n | Array<{\n name: string;\n inputSchema: string; // stringified JSONSchema7\n }>\n | undefined\n): string[] {\n return originalTools?.map((t) => t.name) || [];\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","import type { ToolResultPart } from \"@ai-sdk/provider-utils\";\n\nexport function isToolResultPart(content: unknown): content is ToolResultPart {\n if (!content || typeof content !== \"object\") {\n return false;\n }\n const c = content as Record<string, unknown>;\n return (\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 type {\n LanguageModelV3,\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport { generateId } from \"@ai-sdk/provider-utils\";\nimport type { TCMCoreProtocol } from \"./core/protocols/protocol-interface\";\nimport {\n getDebugLevel,\n logParsedChunk,\n logParsedSummary,\n logRawChunk,\n} from \"./core/utils/debug\";\nimport { extractOnErrorOption } from \"./core/utils/on-error\";\nimport {\n isToolChoiceActive,\n originalToolsSchema,\n type ToolCallMiddlewareProviderOptions,\n} from \"./core/utils/provider-options\";\nimport { coerceBySchema } from \"./schema-coerce\";\n\nfunction parseToolChoiceJson(\n text: string,\n providerOptions?: ToolCallMiddlewareProviderOptions\n): { name?: string; arguments?: Record<string, unknown> } {\n try {\n return JSON.parse(text);\n } catch (error) {\n const options = extractOnErrorOption(providerOptions);\n options?.onError?.(\n \"Failed to parse toolChoice JSON from generated model output\",\n {\n text,\n error: error instanceof Error ? error.message : String(error),\n }\n );\n return {};\n }\n}\n\nfunction logDebugSummary(\n debugSummary: { originalText?: string; toolCalls?: string } | undefined,\n toolCall: LanguageModelV3ToolCall,\n originText: string\n) {\n if (debugSummary) {\n debugSummary.originalText = originText;\n try {\n debugSummary.toolCalls = JSON.stringify([\n { toolName: toolCall.toolName, input: toolCall.input },\n ]);\n } catch {\n // ignore\n }\n } else if (getDebugLevel() === \"parse\") {\n logParsedSummary({ toolCalls: [toolCall], originalText: originText });\n }\n}\n\nasync function handleToolChoice(\n doGenerate: () => ReturnType<LanguageModelV3[\"doGenerate\"]>,\n params: { providerOptions?: ToolCallMiddlewareProviderOptions }\n) {\n const result = await doGenerate();\n const first = result.content?.[0];\n\n let parsed: { name?: string; arguments?: Record<string, unknown> } = {};\n if (first && first.type === \"text\") {\n if (getDebugLevel() === \"parse\") {\n logRawChunk(first.text);\n }\n parsed = parseToolChoiceJson(first.text, params.providerOptions);\n }\n\n const toolCall: LanguageModelV3ToolCall = {\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: parsed.name || \"unknown\",\n input: JSON.stringify(parsed.arguments || {}),\n };\n\n const originText = first && first.type === \"text\" ? first.text : \"\";\n const debugSummary = params.providerOptions?.toolCallMiddleware?.debugSummary;\n logDebugSummary(debugSummary, toolCall, originText);\n\n return {\n ...result,\n content: [toolCall],\n };\n}\n\nfunction parseContent(\n content: LanguageModelV3Content[],\n protocol: TCMCoreProtocol,\n tools: LanguageModelV3FunctionTool[],\n providerOptions?: ToolCallMiddlewareProviderOptions\n): LanguageModelV3Content[] {\n const parsed = content.flatMap((contentItem): LanguageModelV3Content[] => {\n if (contentItem.type !== \"text\") {\n return [contentItem];\n }\n if (getDebugLevel() === \"stream\") {\n logRawChunk(contentItem.text);\n }\n return protocol.parseGeneratedText({\n text: contentItem.text,\n tools,\n options: {\n ...extractOnErrorOption(providerOptions),\n ...((providerOptions as { toolCallMiddleware?: unknown } | undefined)\n ?.toolCallMiddleware as Record<string, unknown>),\n },\n }) as LanguageModelV3Content[];\n });\n\n return parsed.map((part) =>\n fixToolCallWithSchema(part as LanguageModelV3Content, tools)\n );\n}\n\nfunction logParsedContent(content: LanguageModelV3Content[]) {\n if (getDebugLevel() === \"stream\") {\n for (const part of content) {\n logParsedChunk(part);\n }\n }\n}\n\nfunction computeDebugSummary(options: {\n result: { content: LanguageModelV3Content[] };\n newContent: LanguageModelV3Content[];\n protocol: TCMCoreProtocol;\n tools: LanguageModelV3FunctionTool[];\n providerOptions?: ToolCallMiddlewareProviderOptions;\n}) {\n const { result, newContent, protocol, tools, providerOptions } = options;\n const allText = result.content\n .filter(\n (c): c is Extract<LanguageModelV3Content, { type: \"text\" }> =>\n c.type === \"text\"\n )\n .map((c) => c.text)\n .join(\"\\n\\n\");\n\n const segments = protocol.extractToolCallSegments\n ? protocol.extractToolCallSegments({ text: allText, tools })\n : [];\n const originalText = segments.join(\"\\n\\n\");\n\n const toolCalls = newContent.filter(\n (p): p is Extract<LanguageModelV3Content, { type: \"tool-call\" }> =>\n p.type === \"tool-call\"\n );\n\n const dbg = providerOptions?.toolCallMiddleware?.debugSummary;\n if (dbg) {\n dbg.originalText = originalText;\n try {\n dbg.toolCalls = JSON.stringify(\n toolCalls.map((tc) => ({\n toolName: tc.toolName,\n input: tc.input as unknown,\n }))\n );\n } catch {\n // ignore JSON failure\n }\n } else if (getDebugLevel() === \"parse\") {\n logParsedSummary({ toolCalls, originalText });\n }\n}\n\nexport async function wrapGenerate({\n protocol,\n doGenerate,\n params,\n}: {\n protocol: TCMCoreProtocol;\n doGenerate: () => ReturnType<LanguageModelV3[\"doGenerate\"]>;\n params: {\n providerOptions?: ToolCallMiddlewareProviderOptions;\n };\n}) {\n if (isToolChoiceActive(params)) {\n return handleToolChoice(doGenerate, params);\n }\n\n const tools = originalToolsSchema.decode(\n params.providerOptions?.toolCallMiddleware?.originalTools\n );\n\n const result = await doGenerate();\n\n if (result.content.length === 0) {\n return result;\n }\n\n const newContent = parseContent(\n result.content,\n protocol,\n tools,\n params.providerOptions\n );\n\n logParsedContent(newContent);\n computeDebugSummary({\n result,\n newContent,\n protocol,\n tools,\n providerOptions: params.providerOptions,\n });\n\n return {\n ...result,\n content: newContent,\n };\n}\n\nfunction fixToolCallWithSchema(\n part: LanguageModelV3Content,\n tools: LanguageModelV3FunctionTool[]\n): LanguageModelV3Content {\n if (part.type !== \"tool-call\") {\n return part;\n }\n let args: unknown = {};\n if (typeof part.input === \"string\") {\n try {\n args = JSON.parse(part.input);\n } catch {\n return part;\n }\n } else if (part.input && typeof part.input === \"object\") {\n args = part.input;\n }\n const schema = tools.find((t) => t.name === part.toolName)?.inputSchema;\n const coerced = coerceBySchema(args, schema);\n return {\n ...part,\n input: JSON.stringify(coerced ?? {}),\n };\n}\n","import type { LanguageModelV3FunctionTool } from \"@ai-sdk/provider\";\n\nexport function hermesSystemPromptTemplate(\n tools: LanguageModelV3FunctionTool[]\n): string {\n const toolsJson = JSON.stringify(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>${toolsJson}</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","import type { JSONValue } from \"@ai-sdk/provider\";\nimport type { ToolResultOutput, ToolResultPart } from \"@ai-sdk/provider-utils\";\n\n/**\n * Common tool response to text conversion utilities\n * Used by all protocols to format tool responses consistently\n */\n\n/**\n * Unwraps tool result output into a display/serialization-friendly value.\n *\n * For successful outputs (e.g. \"text\", \"json\") the underlying value is preserved.\n * For error/denial/content outputs (e.g. \"execution-denied\", \"error-text\",\n * \"error-json\", \"content\") this function returns a human-readable string\n * representation suitable for display or embedding in JSON/XML, rather than\n * the original raw tool result.\n */\nexport function unwrapToolResult(result: ToolResultOutput): JSONValue {\n switch (result.type) {\n case \"text\":\n return result.value ?? \"\";\n case \"json\":\n return result.value;\n case \"execution-denied\": {\n const reason = result.reason;\n return reason ? `[Execution Denied: ${reason}]` : \"[Execution Denied]\";\n }\n case \"error-text\":\n return `[Error: ${result.value ?? \"\"}]`;\n case \"error-json\":\n return `[Error: ${JSON.stringify(result.value)}]`;\n case \"content\": {\n return result.value\n .map((part) => {\n const contentPart = part as { type?: string };\n switch (contentPart.type) {\n case \"text\":\n return (contentPart as { text?: string }).text ?? \"\";\n case \"image-data\":\n return `[Image: ${\n (contentPart as { mediaType?: string }).mediaType\n }]`;\n case \"image-url\":\n return `[Image URL: ${(contentPart as { url?: string }).url}]`;\n case \"image-file-id\": {\n const fileId = (contentPart as { fileId?: unknown }).fileId;\n const displayId =\n typeof fileId === \"string\" ? fileId : JSON.stringify(fileId);\n return `[Image ID: ${displayId}]`;\n }\n case \"file-data\": {\n const filePart = contentPart as {\n filename?: string;\n mediaType?: string;\n };\n if (filePart.filename) {\n return `[File: ${filePart.filename} (${filePart.mediaType})]`;\n }\n return `[File: ${filePart.mediaType}]`;\n }\n case \"file-url\":\n return `[File URL: ${(contentPart as { url?: string }).url}]`;\n case \"file-id\": {\n const fileId = (contentPart as { fileId?: unknown }).fileId;\n const displayId =\n typeof fileId === \"string\" ? fileId : JSON.stringify(fileId);\n return `[File ID: ${displayId}]`;\n }\n case \"media\":\n return `[Media: ${\n (contentPart as { mediaType?: string }).mediaType\n }]`;\n case \"custom\":\n return \"[Custom content]\";\n default:\n return \"[Unknown content]\";\n }\n })\n .join(\"\\n\");\n }\n default: {\n const _exhaustive: never = result;\n return _exhaustive;\n }\n }\n}\n\n/**\n * Formats a tool response as JSON inside XML tags\n * Used by JSON protocol for tool response formatting\n */\nexport function formatToolResponseAsJsonInXml(\n toolResult: ToolResultPart\n): string {\n const unwrappedResult = unwrapToolResult(toolResult.output);\n return `<tool_response>${JSON.stringify({\n toolName: toolResult.toolName,\n result: unwrappedResult,\n })}</tool_response>`;\n}\n\n/**\n * Formats a tool response as XML\n * Used by XML and YAML protocols for tool response formatting\n */\nexport function formatToolResponseAsXml(toolResult: ToolResultPart): string {\n const unwrappedResult = unwrapToolResult(toolResult.output);\n\n const toolNameXml = `<tool_name>${toolResult.toolName}</tool_name>`;\n const resultLines = formatXmlNode(\"result\", unwrappedResult, 1);\n\n return [\n \"<tool_response>\",\n ` ${toolNameXml}`,\n ...resultLines,\n \"</tool_response>\",\n ].join(\"\\n\");\n}\n\nfunction formatXmlNode(\n tagName: string,\n value: JSONValue,\n depth: number\n): string[] {\n const indent = \" \".repeat(depth);\n\n if (value === null || value === undefined) {\n return [`${indent}<${tagName}></${tagName}>`];\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return [`${indent}<${tagName}>${String(value)}</${tagName}>`];\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return [`${indent}<${tagName}></${tagName}>`];\n }\n const lines = [`${indent}<${tagName}>`];\n for (const item of value) {\n lines.push(...formatXmlNode(\"item\", item as JSONValue, depth + 1));\n }\n lines.push(`${indent}</${tagName}>`);\n return lines;\n }\n\n const entries = Object.entries(value as Record<string, JSONValue>);\n if (entries.length === 0) {\n return [`${indent}<${tagName}></${tagName}>`];\n }\n\n const lines = [`${indent}<${tagName}>`];\n for (const [key, entryValue] of entries) {\n lines.push(...formatXmlNode(key, entryValue, depth + 1));\n }\n lines.push(`${indent}</${tagName}>`);\n return lines;\n}\n","import type {\n JSONSchema7,\n LanguageModelV3FunctionTool,\n} from \"@ai-sdk/provider\";\nimport dedent from \"dedent\";\n\nexport function xmlSystemPromptTemplate(\n tools: LanguageModelV3FunctionTool[]\n): string {\n const toolsText = renderToolsForXmlPrompt(tools);\n\n const header = dedent`\n # Tools\n You may call one or more functions to assist with the user query.\n `;\n\n const definitions = [\n \"You have access to the following functions:\",\n \"<tools>\",\n toolsText,\n \"</tools>\",\n ].join(\"\\n\");\n\n const rules = dedent`\n <rules>\n - Use exactly one XML element whose tag name is the function name.\n - Put each parameter as a child element.\n - Values must follow the schema exactly (numbers, arrays, objects, enums → copy as-is).\n - Do not add or remove functions or parameters.\n - Each required parameter must appear once.\n - Output nothing before or after the function call.\n - It is also possible to call multiple types of functions in one turn or to call a single function multiple times.\n </rules>\n `;\n\n const examples = dedent`\n For each function call, output the function name and parameter in the following format:\n <example_function_name>\n <example_parameter_1>value_1</example_parameter_1>\n <example_parameter_2>This is the value for the second parameter\n that can span\n multiple lines</example_parameter_2>\n </example_function_name>\n `;\n\n return [header, definitions, rules, examples].join(\"\\n\\n\");\n}\n\nconst INDENT = \" \";\n\nfunction renderToolsForXmlPrompt(tools: LanguageModelV3FunctionTool[]): string {\n if (!tools.length) {\n return \"none\";\n }\n\n return tools.map(renderToolForXmlPrompt).join(\"\\n\\n\");\n}\n\nfunction renderToolForXmlPrompt(tool: LanguageModelV3FunctionTool): string {\n const lines: string[] = [`name: ${tool.name}`];\n\n if (tool.description) {\n lines.push(`description: ${tool.description}`);\n }\n\n lines.push(\"parameters:\");\n const normalizedSchema = normalizeSchema(tool.inputSchema);\n lines.push(...renderParametersSummary(normalizedSchema, 1));\n lines.push(`schema: ${stringifySchema(normalizedSchema)}`);\n\n return lines.join(\"\\n\");\n}\n\nfunction normalizeSchema(\n schema: JSONSchema7 | boolean | string | undefined\n): JSONSchema7 | boolean | undefined {\n if (typeof schema === \"string\") {\n try {\n return JSON.parse(schema) as JSONSchema7;\n } catch {\n return { type: \"string\", const: schema };\n }\n }\n\n return schema;\n}\n\nfunction renderParametersSummary(\n schema: JSONSchema7 | boolean | undefined,\n indentLevel: number\n): string[] {\n const indent = INDENT.repeat(indentLevel);\n\n if (schema === undefined || schema === null) {\n return [`${indent}(none)`];\n }\n\n if (schema === true) {\n return [`${indent}(any)`];\n }\n\n if (schema === false) {\n return [`${indent}(no valid parameters)`];\n }\n\n if (typeof schema !== \"object\") {\n return [`${indent}- value (${String(schema)})`];\n }\n\n const schemaType: NonNullable<JSONSchema7[\"type\"]>[] = [];\n\n if (Array.isArray(schema.type)) {\n schemaType.push(...schema.type);\n } else if (schema.type) {\n schemaType.push(schema.type);\n }\n const isObjectLike = schemaType.includes(\"object\") || !!schema.properties;\n\n if (isObjectLike) {\n const properties = schema.properties ?? {};\n const requiredSet = new Set(schema.required ?? []);\n const propertyNames = Object.keys(properties).sort();\n if (propertyNames.length === 0) {\n return [`${indent}(no named parameters)`];\n }\n\n const lines: string[] = [];\n for (const propName of propertyNames) {\n const propSchema = properties[propName] as\n | JSONSchema7\n | boolean\n | undefined;\n lines.push(\n renderPropertySummaryLine({\n indent,\n propName,\n propSchema,\n required: requiredSet.has(propName),\n })\n );\n }\n\n return lines.length ? lines : [`${indent}(no parameters)`];\n }\n\n return [`${indent}- value (${summarizeType(schema)})`];\n}\n\nfunction renderPropertySummaryLine({\n indent,\n propName,\n propSchema,\n required,\n}: {\n indent: string;\n propName: string;\n propSchema: JSONSchema7 | boolean | undefined;\n required: boolean;\n}): string {\n const typeLabel = summarizeType(propSchema);\n const requiredLabel = required ? \"required\" : \"optional\";\n const extras = collectPropertyExtras(propSchema);\n const extraText = extras.length ? ` - ${extras.join(\"; \")}` : \"\";\n\n return `${indent}- ${propName} (${typeLabel}, ${requiredLabel})${extraText}`;\n}\n\nfunction collectPropertyExtras(\n propSchema: JSONSchema7 | boolean | undefined\n): string[] {\n if (!propSchema || typeof propSchema !== \"object\") {\n return [];\n }\n\n const extras: string[] = [];\n\n if (propSchema.enum) {\n extras.push(`enum: ${formatEnumForSummary(propSchema.enum)}`);\n }\n\n if (propSchema.default !== undefined) {\n extras.push(`default: ${formatValue(propSchema.default)}`);\n }\n\n if (propSchema.description) {\n extras.push(propSchema.description);\n }\n\n return extras;\n}\n\nfunction summarizeType(schema: JSONSchema7 | boolean | undefined): string {\n if (schema === undefined || schema === null) {\n return \"unknown\";\n }\n\n if (schema === true) {\n return \"any\";\n }\n\n if (schema === false) {\n return \"never\";\n }\n\n if (typeof schema !== \"object\") {\n return String(schema);\n }\n\n const schemaType = schema.type;\n let baseType = \"\";\n\n if (Array.isArray(schemaType) && schemaType.length) {\n baseType = schemaType.join(\" | \");\n } else if (typeof schemaType === \"string\") {\n baseType = schemaType;\n } else if (schema.enum) {\n const inferred: string[] = Array.from(\n new Set(schema.enum.map((value: unknown) => typeof value))\n );\n if (inferred.length === 1) {\n baseType = inferred[0] ?? \"\";\n }\n } else if (schema.const !== undefined) {\n baseType = typeof schema.const;\n }\n\n if (!baseType) {\n baseType = \"any\";\n }\n\n if (baseType === \"array\" && schema.items) {\n const itemType = Array.isArray(schema.items)\n ? schema.items\n .map((item: JSONSchema7 | boolean) => summarizeType(item))\n .join(\" | \")\n : summarizeType(schema.items);\n return `array<${itemType}>`;\n }\n\n if (baseType === \"string\" && schema.format) {\n return `string (${schema.format})`;\n }\n\n return baseType;\n}\n\nconst ENUM_MAX_INLINE = 6;\nconst ENUM_PREVIEW_LIMIT = 5;\n\nfunction formatEnumForSummary(values: unknown[]): string {\n if (values.length <= ENUM_MAX_INLINE) {\n return formatValue(values);\n }\n\n const preview = values\n .slice(0, ENUM_PREVIEW_LIMIT)\n .map((value) => formatValue(value));\n return `[${preview.join(\", \")}, ... (${values.length} total)]`;\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (value === null) {\n return \"null\";\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(formatValue).join(\", \")}]`;\n }\n\n return JSON.stringify(value);\n}\n\nfunction stringifySchema(schema: JSONSchema7 | boolean | undefined): string {\n if (schema === undefined) {\n return \"null\";\n }\n\n return JSON.stringify(stripSchemaKeys(schema));\n}\n\nfunction stripSchemaKeys(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => stripSchemaKeys(entry));\n }\n\n if (value && typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n const cleaned: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(record)) {\n if (key === \"$schema\") {\n continue;\n }\n cleaned[key] = stripSchemaKeys(entry);\n }\n\n return cleaned;\n }\n\n return value;\n}\n","import type { LanguageModelV3FunctionTool } from \"@ai-sdk/provider\";\n\nexport function yamlSystemPromptTemplate(\n tools: LanguageModelV3FunctionTool[],\n includeMultilineExample = true\n): string {\n const toolsJson = JSON.stringify(tools);\n const multilineExample = includeMultilineExample\n ? `\n\nFor multiline values, use YAML's literal block syntax:\n<write_file>\nfile_path: /tmp/example.txt\ncontents: |\n First line\n Second line\n Third line\n</write_file>`\n : \"\";\n\n return `# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>${toolsJson}</tools>\n\n# Format\n\nUse exactly one XML element whose tag name is the function name.\nInside the XML element, specify parameters using YAML syntax (key: value pairs).\n\n# Example\n<get_weather>\nlocation: New York\nunit: celsius\n</get_weather>${multilineExample}\n\n# Rules\n- Parameter names and values must follow the schema exactly.\n- Use proper YAML syntax for values (strings, numbers, booleans, arrays, objects).\n- Each required parameter must appear once.\n- Do not add functions or parameters not in the schema.\n- After calling a tool, you will receive a response. Use this result to answer the user.\n- Do NOT ask clarifying questions. Use reasonable defaults for optional parameters.\n- If a task requires multiple function calls, make ALL of them at once.`;\n}\n","import type {\n LanguageModelV3,\n LanguageModelV3StreamPart,\n} from \"@ai-sdk/provider\";\nimport { generateId } from \"@ai-sdk/provider-utils\";\nimport type { TCMCoreProtocol } from \"./core/protocols/protocol-interface\";\nimport { getDebugLevel, logParsedChunk, logRawChunk } from \"./core/utils/debug\";\nimport { extractOnErrorOption } from \"./core/utils/on-error\";\nimport {\n isToolChoiceActive,\n originalToolsSchema,\n type ToolCallMiddlewareProviderOptions,\n} from \"./core/utils/provider-options\";\n\nexport async function wrapStream({\n protocol,\n doStream,\n doGenerate,\n params,\n}: {\n protocol: TCMCoreProtocol;\n doStream: () => ReturnType<LanguageModelV3[\"doStream\"]>;\n doGenerate: () => ReturnType<LanguageModelV3[\"doGenerate\"]>;\n params: {\n providerOptions?: ToolCallMiddlewareProviderOptions;\n };\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 const debugLevel = getDebugLevel();\n const tools = originalToolsSchema.decode(\n params.providerOptions?.toolCallMiddleware?.originalTools\n );\n const options = {\n ...extractOnErrorOption(params.providerOptions),\n ...((params.providerOptions as Record<string, unknown>)\n ?.toolCallMiddleware || {}),\n };\n\n const coreStream = stream\n .pipeThrough(\n new TransformStream<LanguageModelV3StreamPart, LanguageModelV3StreamPart>(\n {\n transform(part, controller) {\n if (debugLevel === \"stream\") {\n logRawChunk(part);\n }\n controller.enqueue(part);\n },\n }\n )\n )\n .pipeThrough(protocol.createStreamParser({ tools, options }));\n\n const v3Stream = coreStream.pipeThrough(\n new TransformStream<LanguageModelV3StreamPart, LanguageModelV3StreamPart>({\n transform(part, controller) {\n if (debugLevel === \"stream\") {\n logParsedChunk(part);\n }\n controller.enqueue(part);\n },\n })\n );\n\n return {\n ...rest,\n stream: v3Stream,\n };\n}\n\nexport async function toolChoiceStream({\n doGenerate,\n options,\n}: {\n doGenerate: () => ReturnType<LanguageModelV3[\"doGenerate\"]>;\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n}) {\n const result = await doGenerate();\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 stream = new ReadableStream<LanguageModelV3StreamPart>({\n start(controller) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: toolJson.name || \"unknown\",\n input: JSON.stringify(toolJson.arguments || {}),\n });\n controller.enqueue({\n type: \"finish\",\n usage: result?.usage || {\n inputTokens: 0,\n outputTokens: 0,\n },\n finishReason: \"tool-calls\",\n } as unknown as LanguageModelV3StreamPart);\n controller.close();\n },\n });\n\n return {\n request: result?.request || {},\n response: result?.response || {},\n stream,\n };\n}\n","import type {\n JSONSchema7,\n LanguageModelV3Content,\n LanguageModelV3FilePart,\n LanguageModelV3FunctionTool,\n LanguageModelV3Message,\n LanguageModelV3Prompt,\n LanguageModelV3ReasoningPart,\n LanguageModelV3TextPart,\n LanguageModelV3ToolCallPart,\n LanguageModelV3ToolResultPart,\n SharedV3ProviderOptions,\n} from \"@ai-sdk/provider\";\nimport type {\n ToolApprovalResponse,\n ToolContent,\n ToolResultPart,\n} from \"@ai-sdk/provider-utils\";\nimport type { TCMCoreProtocol } from \"./core/protocols/protocol-interface\";\nimport { isTCMProtocolFactory } from \"./core/protocols/protocol-interface\";\nimport { createDynamicIfThenElseSchema } from \"./core/utils/dynamic-tool-schema\";\nimport { extractOnErrorOption } from \"./core/utils/on-error\";\nimport { originalToolsSchema } from \"./core/utils/provider-options\";\n\n/**\n * Build final prompt by merging system prompt with existing prompt\n */\nfunction buildFinalPrompt(\n systemPrompt: string,\n processedPrompt: LanguageModelV3Prompt,\n placement: \"first\" | \"last\"\n): LanguageModelV3Prompt {\n const systemIndex = processedPrompt.findIndex((m) => m.role === \"system\");\n if (systemIndex !== -1) {\n const existing = processedPrompt[systemIndex].content as unknown;\n let existingText = \"\";\n if (typeof existing === \"string\") {\n existingText = existing;\n } else if (Array.isArray(existing)) {\n existingText = (existing as { type?: string; text?: string }[])\n .map((p) => (p?.type === \"text\" ? (p.text ?? \"\") : \"\"))\n .filter(Boolean)\n .join(\"\\n\");\n } else {\n existingText = String(existing ?? \"\");\n }\n\n const mergedContent =\n placement === \"first\"\n ? `${systemPrompt}\\n\\n${existingText}`\n : `${existingText}\\n\\n${systemPrompt}`;\n\n return processedPrompt.map((m, idx) =>\n idx === systemIndex\n ? {\n ...m,\n content: mergedContent,\n }\n : m\n ) as LanguageModelV3Prompt;\n }\n if (placement === \"first\") {\n return [\n {\n role: \"system\",\n content: systemPrompt,\n },\n ...processedPrompt,\n ];\n }\n // placement === 'last'\n return [\n ...processedPrompt,\n {\n role: \"system\",\n content: systemPrompt,\n },\n ];\n}\n\n/**\n * Build base return parameters with middleware options\n */\nfunction buildBaseReturnParams(\n params: {\n prompt?: LanguageModelV3Prompt;\n tools?: Array<LanguageModelV3FunctionTool | { type: string }>;\n providerOptions?: unknown;\n toolChoice?: { type: string; toolName?: string };\n },\n finalPrompt: LanguageModelV3Prompt,\n functionTools: LanguageModelV3FunctionTool[]\n) {\n return {\n ...params,\n prompt: finalPrompt,\n tools: [] as never[],\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 originalTools: originalToolsSchema.encode(functionTools),\n },\n } as unknown as SharedV3ProviderOptions,\n };\n}\n\n/**\n * Find provider-defined tool matching the selected tool name\n */\nfunction findProviderDefinedTool(\n tools: Array<LanguageModelV3FunctionTool | { type: string }>,\n selectedToolName: string\n) {\n return tools.find((t) => {\n if (t.type === \"function\") {\n return false;\n }\n const anyTool = t as unknown as { id?: string; name?: string };\n return anyTool.id === selectedToolName || anyTool.name === selectedToolName;\n });\n}\n\n/**\n * Handle tool choice type 'tool'\n */\nfunction handleToolChoiceTool(\n params: {\n tools?: Array<LanguageModelV3FunctionTool | { type: string }>;\n toolChoice?: { type: string; toolName?: string };\n },\n baseReturnParams: ReturnType<typeof buildBaseReturnParams>\n) {\n const selectedToolName = params.toolChoice?.toolName;\n if (!selectedToolName) {\n throw new Error(\"Tool name is required for 'tool' toolChoice type.\");\n }\n\n const providerDefinedMatch = findProviderDefinedTool(\n params.tools ?? [],\n selectedToolName\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 LanguageModelV3FunctionTool =>\n t.type === \"function\" &&\n (t as LanguageModelV3FunctionTool).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 ...(params.toolChoice ? { toolChoice: params.toolChoice } : {}),\n },\n },\n };\n}\n\n/**\n * Handle tool choice type 'required'\n */\nfunction handleToolChoiceRequired(\n params: {\n tools?: Array<LanguageModelV3FunctionTool | { type: string }>;\n toolChoice?: { type: string; toolName?: string };\n },\n baseReturnParams: ReturnType<typeof buildBaseReturnParams>,\n functionTools: LanguageModelV3FunctionTool[]\n) {\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 toolChoice: { type: \"required\" as const },\n },\n },\n };\n}\n\nexport function transformParams({\n params,\n protocol,\n toolSystemPromptTemplate,\n toolResponsePromptTemplate,\n placement = \"first\",\n}: {\n params: {\n prompt?: LanguageModelV3Prompt;\n tools?: Array<LanguageModelV3FunctionTool | { type: string }>;\n providerOptions?: {\n toolCallMiddleware?: {\n toolChoice?: { type: string };\n };\n };\n toolChoice?: { type: string; toolName?: string };\n };\n protocol: TCMCoreProtocol | (() => TCMCoreProtocol);\n toolSystemPromptTemplate: (tools: LanguageModelV3FunctionTool[]) => string;\n toolResponsePromptTemplate?: (toolResult: ToolResultPart) => string;\n placement?: \"first\" | \"last\";\n}) {\n const resolvedProtocol = isTCMProtocolFactory(protocol)\n ? protocol()\n : protocol;\n\n const functionTools = (params.tools ?? []).filter(\n (t): t is LanguageModelV3FunctionTool => t.type === \"function\"\n );\n\n const systemPrompt = resolvedProtocol.formatTools({\n tools: functionTools,\n toolSystemPromptTemplate,\n });\n\n let normalizedPrompt: LanguageModelV3Message[];\n if (Array.isArray(params.prompt)) {\n normalizedPrompt = params.prompt;\n } else if (params.prompt) {\n normalizedPrompt = [params.prompt];\n } else {\n normalizedPrompt = [];\n }\n const processedPrompt = convertToolPrompt(\n normalizedPrompt,\n resolvedProtocol,\n toolResponsePromptTemplate,\n extractOnErrorOption(params.providerOptions)\n );\n\n const finalPrompt = buildFinalPrompt(\n systemPrompt,\n processedPrompt,\n placement\n );\n const baseReturnParams = buildBaseReturnParams(\n params,\n finalPrompt,\n functionTools\n );\n\n if (params.toolChoice?.type === \"none\") {\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 return handleToolChoiceTool(params, baseReturnParams);\n }\n\n if (params.toolChoice?.type === \"required\") {\n return handleToolChoiceRequired(params, baseReturnParams, functionTools);\n }\n\n return baseReturnParams;\n}\n\n/**\n * Process assistant message content\n */\nfunction processAssistantContent(\n content: LanguageModelV3Content[],\n resolvedProtocol: TCMCoreProtocol,\n providerOptions?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n }\n): LanguageModelV3Content[] {\n const newContent: LanguageModelV3Content[] = [];\n for (const item of content) {\n switch (item.type) {\n case \"tool-call\":\n newContent.push({\n type: \"text\",\n text: resolvedProtocol.formatToolCall(item),\n });\n break;\n case \"text\":\n case \"reasoning\":\n newContent.push(item);\n break;\n default: {\n const options = extractOnErrorOption(providerOptions);\n options?.onError?.(\n \"tool-call-middleware: unknown assistant content; stringifying for provider compatibility\",\n { content: item }\n );\n newContent.push({\n type: \"text\",\n text: JSON.stringify(item),\n });\n }\n }\n }\n\n // Condense if all content is text\n const onlyText = newContent.every((c) => c.type === \"text\");\n return onlyText\n ? [\n {\n type: \"text\" as const,\n text: newContent.map((c) => (c as { text: string }).text).join(\"\\n\"),\n },\n ]\n : newContent;\n}\n\n/**\n * Process tool message content\n */\nfunction formatApprovalResponse(part: ToolApprovalResponse): string {\n const status = part.approved ? \"Approved\" : \"Denied\";\n const reason = part.reason ? `: ${part.reason}` : \"\";\n return `[Tool Approval ${status}${reason}]`;\n}\n\nfunction processToolMessage(\n toolResults: ToolResultPart[],\n approvalResponses: ToolApprovalResponse[],\n toolResponsePromptTemplate: (toolResult: ToolResultPart) => string\n): LanguageModelV3Prompt[number] {\n const resultTexts = toolResults.map((toolResult) => {\n return toolResponsePromptTemplate(toolResult);\n });\n\n const approvalTexts = approvalResponses.map(formatApprovalResponse);\n\n const allTexts = [...resultTexts, ...approvalTexts];\n\n return {\n role: \"user\" as const,\n content: [\n {\n type: \"text\" as const,\n text: allTexts.join(\"\\n\"),\n },\n ],\n };\n}\n\n/**\n * Process a single message in the prompt\n */\nfunction processMessage(\n message: LanguageModelV3Prompt[number],\n resolvedProtocol: TCMCoreProtocol,\n providerOptions?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n },\n toolResponsePromptTemplate?: (toolResult: ToolResultPart) => string\n): LanguageModelV3Prompt[number] {\n if (message.role === \"assistant\") {\n const condensedContent = processAssistantContent(\n message.content as LanguageModelV3Content[],\n resolvedProtocol,\n providerOptions\n );\n return {\n role: \"assistant\" as const,\n content: condensedContent as Array<\n | LanguageModelV3TextPart\n | LanguageModelV3FilePart\n | LanguageModelV3ReasoningPart\n | LanguageModelV3ToolCallPart\n | LanguageModelV3ToolResultPart\n >,\n };\n }\n if (message.role === \"tool\") {\n const toolContent = message.content as ToolContent;\n const toolResultParts = toolContent.filter(\n (part): part is ToolResultPart => part.type === \"tool-result\"\n );\n const approvalResponseParts = toolContent.filter(\n (part): part is ToolApprovalResponse =>\n part.type === \"tool-approval-response\"\n );\n if (!toolResponsePromptTemplate) {\n throw new Error(\n 'toolResponsePromptTemplate is required when processing messages with role \"tool\". ' +\n \"This parameter is optional for other roles but is required here so tool-result content can be \" +\n \"converted into a prompt. Ensure your middleware or transform configuration passes a toolResponsePromptTemplate \" +\n \"when tool message processing is enabled.\"\n );\n }\n return processToolMessage(\n toolResultParts,\n approvalResponseParts,\n toolResponsePromptTemplate\n );\n }\n return message;\n}\n\n/**\n * Check if all content parts are text\n */\nfunction isAllTextContent(content: unknown): boolean {\n if (!Array.isArray(content)) {\n return false;\n }\n return (content as { type: string }[]).every(\n (c: { type: string }) => c?.type === \"text\"\n );\n}\n\n/**\n * Join text content parts into a single string\n */\nfunction joinTextContent(content: { text: string }[]): string {\n return content.map((c) => c.text).join(\"\\n\");\n}\n\n/**\n * Create condensed message based on role\n */\nfunction createCondensedMessage(role: string, joinedText: string) {\n if (role === \"system\") {\n return {\n role: \"system\" as const,\n content: joinedText,\n };\n }\n\n return {\n role: role as \"assistant\" | \"user\",\n content: [\n {\n type: \"text\" as const,\n text: joinedText,\n },\n ],\n };\n}\n\n/**\n * Condense multi-part text content into single text part\n */\nfunction condenseTextContent(\n processedPrompt: LanguageModelV3Prompt\n): LanguageModelV3Prompt {\n for (let i = 0; i < processedPrompt.length; i += 1) {\n const msg = processedPrompt[i] as unknown as {\n role: string;\n content: unknown;\n };\n\n if (!Array.isArray(msg.content)) {\n continue;\n }\n\n const shouldCondense =\n isAllTextContent(msg.content) && msg.content.length > 1;\n if (shouldCondense) {\n const joinedText = joinTextContent(msg.content as { text: string }[]);\n processedPrompt[i] = createCondensedMessage(msg.role, joinedText);\n }\n }\n return processedPrompt;\n}\n\n/**\n * Merge consecutive user messages\n */\nfunction mergeConsecutiveUserMessages(\n processedPrompt: LanguageModelV3Prompt\n): LanguageModelV3Prompt {\n for (let i = processedPrompt.length - 1; i > 0; i -= 1) {\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;\n}\n\nfunction convertToolPrompt(\n prompt: LanguageModelV3Message[],\n resolvedProtocol: TCMCoreProtocol,\n toolResponsePromptTemplate?: (toolResult: ToolResultPart) => string,\n providerOptions?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n }\n): LanguageModelV3Message[] {\n let processedPrompt = prompt.map((message: LanguageModelV3Message) =>\n processMessage(\n message,\n resolvedProtocol,\n providerOptions,\n toolResponsePromptTemplate\n )\n );\n\n processedPrompt = condenseTextContent(processedPrompt);\n processedPrompt = mergeConsecutiveUserMessages(processedPrompt);\n return processedPrompt as LanguageModelV3Prompt;\n}\n","import type {\n LanguageModelV3CallOptions,\n LanguageModelV3FunctionTool,\n LanguageModelV3Middleware,\n} from \"@ai-sdk/provider\";\nimport type { ToolResultPart } from \"@ai-sdk/provider-utils\";\nimport type { TCMCoreProtocol } from \"./core/protocols/protocol-interface\";\nimport { isTCMProtocolFactory } from \"./core/protocols/protocol-interface\";\nimport { wrapGenerate as wrapGenerateHandler } from \"./generate-handler\";\nimport { wrapStream as wrapStreamHandler } from \"./stream-handler\";\nimport { transformParams } from \"./transform-handler\";\n\nexport function createToolMiddleware({\n protocol,\n toolSystemPromptTemplate,\n toolResponsePromptTemplate,\n placement = \"last\",\n}: {\n protocol: TCMCoreProtocol | (() => TCMCoreProtocol);\n toolSystemPromptTemplate: (tools: LanguageModelV3FunctionTool[]) => string;\n toolResponsePromptTemplate?: (toolResult: ToolResultPart) => string;\n placement?: \"first\" | \"last\";\n}): LanguageModelV3Middleware {\n const resolvedProtocol = isTCMProtocolFactory(protocol)\n ? protocol()\n : protocol;\n\n return {\n specificationVersion: \"v3\",\n wrapStream: ({ doStream, doGenerate, params }) =>\n wrapStreamHandler({\n protocol: resolvedProtocol,\n doStream,\n doGenerate,\n params,\n }),\n wrapGenerate: async ({ doGenerate, params }) =>\n wrapGenerateHandler({\n protocol: resolvedProtocol,\n doGenerate,\n params,\n }),\n transformParams: async ({ params }): Promise<LanguageModelV3CallOptions> =>\n transformParams({\n protocol: resolvedProtocol,\n toolSystemPromptTemplate,\n toolResponsePromptTemplate,\n placement,\n params,\n }),\n };\n}\n","import { hermesSystemPromptTemplate } from \"./core/prompts/hermes-system-prompt\";\nimport {\n formatToolResponseAsJsonInXml,\n formatToolResponseAsXml,\n} from \"./core/prompts/tool-response\";\nimport { xmlSystemPromptTemplate } from \"./core/prompts/xml-system-prompt\";\nimport { yamlSystemPromptTemplate } from \"./core/prompts/yaml-system-prompt\";\nimport { jsonProtocol } from \"./core/protocols/json-protocol\";\nimport { xmlProtocol } from \"./core/protocols/xml-protocol\";\nimport { yamlProtocol } from \"./core/protocols/yaml-protocol\";\nimport { createToolMiddleware } from \"./tool-call-middleware\";\n\nexport const hermesToolMiddleware = createToolMiddleware({\n protocol: jsonProtocol({}),\n toolSystemPromptTemplate: hermesSystemPromptTemplate,\n toolResponsePromptTemplate: formatToolResponseAsJsonInXml,\n});\n\nexport const xmlToolMiddleware = createToolMiddleware({\n protocol: xmlProtocol({}),\n toolSystemPromptTemplate: xmlSystemPromptTemplate,\n toolResponsePromptTemplate: formatToolResponseAsXml,\n});\n\nexport const yamlToolMiddleware = createToolMiddleware({\n protocol: yamlProtocol({}),\n toolSystemPromptTemplate: yamlSystemPromptTemplate,\n toolResponsePromptTemplate: formatToolResponseAsXml,\n});\n"],"mappings":"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","names":["stringify","escaped","result","children","WHITESPACE_REGEX","DIGIT_KEY_REGEX","parse","end","WHITESPACE_REGEX","keys","DIGIT_KEY_REGEX","parse","WHITESPACE_REGEX","escapeRegExp","parse","parse","NAME_CHAR_RE","WHITESPACE_REGEX","parse","newBuffer","stringify","_a","NAME_CHAR_RE","WHITESPACE_REGEX","findToolCalls","YAML","createFlushTextHandler","findEarliestToolTag","_a","lines","dedent","import_provider_utils"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/rjson/index.ts","../src/core/utils/debug.ts","../src/core/utils/get-potential-start-index.ts","../src/core/utils/id.ts","../src/core/utils/protocol-utils.ts","../src/core/utils/regex.ts","../src/core/protocols/json-protocol.ts","../src/core/protocols/protocol-interface.ts","../src/rxml/errors/types.ts","../src/rxml/core/types.ts","../src/rxml/utils/helpers.ts","../src/rxml/builders/stringify.ts","../src/schema-coerce/index.ts","../src/rxml/schema/coercion.ts","../src/rxml/schema/extraction.ts","../src/rxml/core/tokenizer.ts","../src/rxml/core/parser.ts","../src/rxml/heuristics/engine.ts","../src/rxml/heuristics/xml-defaults.ts","../src/rxml/parse.ts","../src/core/utils/regex-constants.ts","../src/core/protocols/xml-protocol.ts","../src/core/protocols/yaml-protocol.ts","../src/core/utils/dynamic-tool-schema.ts","../src/core/utils/on-error.ts","../src/core/utils/provider-options.ts","../src/core/utils/type-guards.ts","../src/generate-handler.ts","../src/core/prompts/hermes-system-prompt.ts","../src/core/prompts/tool-response.ts","../src/core/prompts/xml-system-prompt.ts","../src/core/prompts/yaml-system-prompt.ts","../src/stream-handler.ts","../src/transform-handler.ts","../src/tool-call-middleware.ts","../src/preconfigured-middleware.ts"],"sourcesContent":["// biome-ignore-all lint/performance/noBarrelFile: intentional public API surface\n\n// Core Protocols (Agnostic)\n\nexport * from \"./core/protocols/json-protocol\";\nexport * from \"./core/protocols/protocol-interface\";\nexport type { XmlProtocolOptions } from \"./core/protocols/xml-protocol\";\nexport { xmlProtocol } from \"./core/protocols/xml-protocol\";\nexport type { YamlProtocolOptions } from \"./core/protocols/yaml-protocol\";\nexport { yamlProtocol } from \"./core/protocols/yaml-protocol\";\n// Utilities (Agnostic)\nexport * from \"./core/utils/debug\";\nexport * from \"./core/utils/dynamic-tool-schema\";\nexport * from \"./core/utils/get-potential-start-index\";\nexport * from \"./core/utils/on-error\";\nexport * from \"./core/utils/provider-options\";\nexport * from \"./core/utils/regex\";\nexport * from \"./core/utils/type-guards\";\nexport { wrapGenerate } from \"./generate-handler\";\n// Pre-configured Middleware\nexport * from \"./preconfigured-middleware\";\nexport * from \"./rjson\";\nexport { toolChoiceStream, wrapStream } from \"./stream-handler\";\n// Tool Call Middleware Implementation\nexport { createToolMiddleware } from \"./tool-call-middleware\";\nexport { transformParams } from \"./transform-handler\";\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// --- Regex Constants (for performance) ---\nconst WHITESPACE_TEST_REGEX = /\\s/;\nconst WHITESPACE_REGEX = /^\\s+/;\nconst OBJECT_START_REGEX = /^\\{/;\nconst OBJECT_END_REGEX = /^\\}/;\nconst ARRAY_START_REGEX = /^\\[/;\nconst ARRAY_END_REGEX = /^\\]/;\nconst COMMA_REGEX = /^,/;\nconst COLON_REGEX = /^:/;\nconst KEYWORD_REGEX = /^(?:true|false|null)/;\nconst NUMBER_REGEX = /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/;\nconst STRING_DOUBLE_REGEX = /^\"(?:[^\"\\\\]|\\\\[\"bnrtf\\\\/]|\\\\u[0-9a-fA-F]{4})*\"/;\nconst STRING_SINGLE_REGEX = /^'((?:[^'\\\\]|\\\\['bnrtf\\\\/]|\\\\u[0-9a-fA-F]{4})*)'/;\nconst COMMENT_SINGLE_REGEX = /^\\/\\/.*?(?:\\r\\n|\\r|\\n)/;\nconst COMMENT_MULTI_REGEX = /^\\/\\*[\\s\\S]*?\\*\\//;\nconst IDENTIFIER_REGEX = /^[$a-zA-Z0-9_\\-+.*?!|&%^/#\\\\]+/;\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 += 1) {\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\ninterface 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\ninterface 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\ninterface ParseWarning {\n message: string;\n line: number;\n}\n\n// Type for the state object used during parsing\ninterface 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 */\ninterface 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\ninterface 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 (contents: string): Token[] => {\n const tokens: Token[] = [];\n let line = 1; // Start at line 1\n let remainingContents = contents;\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(remainingContents); // Try to match the regex at the current position\n if (m) {\n const raw = m[0]; // The matched raw string\n remainingContents = remainingContents.slice(raw.length); // Consume the matched part from the input\n return {\n raw,\n matched: tokenSpec.f(m), // Process the match using the spec's function\n };\n }\n return; // No match for this spec\n });\n return result === false ? undefined : result;\n }\n\n // Main lexing loop\n while (remainingContents !== \"\") {\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: ${remainingContents[0]}; input: ${remainingContents.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 }\n if (mm === \"\\\\'\") {\n return \"'\"; // Unescape escaped single quotes\n }\n return mm;\n }\n );\n\n const match = `\"${content}\"`;\n return {\n type: \"string\",\n 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, // The original identifier name\n 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) =>\n WHITESPACE_TEST_REGEX.test(c) ? c : \" \"\n );\n return {\n type: \" \", // Represent comments as whitespace tokens\n 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: Number.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, // 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 (m: RegExpExecArray): RawToken => {\n // For simple tokens like punctuation, value is not needed\n return { type, match: m[0], value: undefined };\n };\n }\n\n // Base JSON token specifications (strict)\n let tokenSpecs: TokenSpec[] = [\n { re: WHITESPACE_REGEX, f: f(\" \") }, // Whitespace\n { re: OBJECT_START_REGEX, f: f(\"{\") }, // Object start\n { re: OBJECT_END_REGEX, f: f(\"}\") }, // Object end\n { re: ARRAY_START_REGEX, f: f(\"[\") }, // Array start\n { re: ARRAY_END_REGEX, f: f(\"]\") }, // Array end\n { re: COMMA_REGEX, f: f(\",\") }, // Comma separator\n { re: COLON_REGEX, f: f(\":\") }, // Key-value separator\n { re: KEYWORD_REGEX, f: fKeyword }, // Keywords\n // Number: optional sign, digits, optional decimal part, optional exponent\n { re: NUMBER_REGEX, f: fNumber },\n // String: double-quoted, handles escapes\n { re: STRING_DOUBLE_REGEX, 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: STRING_SINGLE_REGEX,\n f: fStringSingle,\n },\n // Single-line comments (// ...)\n { re: COMMENT_SINGLE_REGEX, f: fComment },\n // Multi-line comments (/* ... */)\n { re: COMMENT_MULTI_REGEX, f: fComment },\n // Unquoted identifiers (treated as strings)\n // Allows letters, numbers, _, -, +, ., *, ?, !, |, &, %, ^, /, #, \\\n { re: IDENTIFIER_REGEX, 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 let currentIndex = index;\n for (; currentIndex >= 0; currentIndex -= 1) {\n if (tokens[currentIndex].type !== \" \") {\n return currentIndex; // Return index of the non-whitespace token\n }\n }\n return; // 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) => str + token.match, \"\");\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.at(-1)?.line ?? 1) : 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,\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?.includes(token.type)) {\n return token;\n }\n if (token.type === \"eof\") {\n // If we hit EOF, return it\n return token;\n }\n 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,\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,\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.hasOwn(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: { [objKey: 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// Helper to handle invalid tokens in parseMany\nfunction handleInvalidToken<T>(\n token: Token,\n state: ParseState,\n opts: ParseManyOpts<T>,\n result: T\n): T | null {\n raiseUnexpected(state, token, `',' or '${opts.endSymbol}'`);\n\n if (state.tolerant) {\n if (token.type === \"eof\") {\n return result;\n }\n // Assume a comma was missing and put the token back\n state.pos -= 1;\n return null; // Signal to continue parsing\n }\n return result; // Should be unreachable in strict mode\n}\n\n// Helper to handle comma tokens in parseMany\ninterface HandleCommaTokenParams<T> {\n token: Token;\n tokens: Token[];\n state: ParseState;\n opts: ParseManyOpts<T>;\n result: T;\n}\n\nfunction handleCommaToken<T>(params: HandleCommaTokenParams<T>): T | null {\n const { token, tokens, state, opts, result } = params;\n const nextToken = tokens[state.pos];\n if (state.tolerant && nextToken && nextToken.type === opts.endSymbol) {\n raiseError(state, token, `Trailing comma before '${opts.endSymbol}'`);\n popToken(tokens, state);\n return result;\n }\n opts.elementParser(tokens, state, result);\n return null; // Signal to continue parsing\n}\n\n// Helper to handle the initial element in parseMany\nfunction parseManyInitialElement<T>(\n tokens: Token[],\n state: ParseState,\n result: T,\n opts: ParseManyOpts<T>\n): T | undefined {\n const token = skipPunctuation(tokens, state, opts.skip);\n\n if (token.type === \"eof\") {\n raiseUnexpected(state, token, `'${opts.endSymbol}' or ${opts.elementName}`);\n return result;\n }\n\n if (token.type === opts.endSymbol) {\n return result;\n }\n\n state.pos -= 1;\n opts.elementParser(tokens, state, result);\n return; // Signal to continue parsing\n}\n\n// Helper to process a token in parseMany loop\nfunction parseManyProcessToken<T>(params: {\n token: Token;\n tokens: Token[];\n state: ParseState;\n opts: ParseManyOpts<T>;\n result: T;\n}): T | undefined {\n const { token, tokens, state, opts, result } = params;\n if (token.type !== opts.endSymbol && token.type !== \",\") {\n const handledResult = handleInvalidToken(token, state, opts, result);\n if (handledResult !== null) {\n return handledResult;\n }\n }\n\n if (token.type === opts.endSymbol) {\n return result;\n }\n\n if (token.type === \",\") {\n const handledResult = handleCommaToken({\n token,\n tokens,\n state,\n opts,\n result,\n });\n if (handledResult !== null) {\n return handledResult;\n }\n return; // Continue loop\n }\n\n opts.elementParser(tokens, state, result);\n return; // Continue loop\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 const initialResult = parseManyInitialElement(tokens, state, result, opts);\n if (initialResult !== undefined) {\n return initialResult;\n }\n\n while (true) {\n const token = popToken(tokens, state);\n const processedResult = parseManyProcessToken({\n token,\n tokens,\n state,\n opts,\n result,\n });\n if (processedResult !== undefined) {\n return processedResult;\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(tokens: Token[], state: ParseState, end = false): 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; // 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; // 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// Helper to normalize parse options\nfunction normalizeParseOptions(\n optsOrReviver?: ParseOptions | ((key: string, value: unknown) => unknown)\n): ParseOptions {\n let options: ParseOptions = {};\n\n if (typeof optsOrReviver === \"function\") {\n options.reviver = optsOrReviver;\n } else if (optsOrReviver !== null && typeof optsOrReviver === \"object\") {\n options = { ...optsOrReviver };\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 for relaxed mode\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;\n } else {\n options.relaxed = true;\n }\n }\n\n options.tolerant = options.tolerant || options.warnings;\n options.duplicate = options.duplicate ?? false;\n\n return options;\n}\n\n// Helper to create parser state\nfunction createParseState(options: ParseOptions): ParseState {\n return {\n pos: 0,\n reviver: options.reviver,\n tolerant: options.tolerant ?? false,\n duplicate: options.duplicate ?? false,\n warnings: [],\n };\n}\n\n// Helper to use custom parser with tokens\nfunction parseWithCustomParser(text: string, options: ParseOptions): unknown {\n const lexerToUse = options.relaxed ? lexer : strictLexer;\n let tokens = lexerToUse(text);\n\n if (options.relaxed) {\n tokens = stripTrailingComma(tokens);\n }\n\n tokens = tokens.filter((token) => token.type !== \" \");\n const state = createParseState(options);\n return parseAny(tokens, state, true);\n}\n\n// Helper to use native JSON.parse with transformation\nfunction parseWithTransform(text: string, options: ParseOptions): unknown {\n let tokens = lexer(text);\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// --- 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 const options = normalizeParseOptions(optsOrReviver);\n\n // Strategy 1: Strict JSON with duplicate allowance -> use native JSON.parse\n if (\n !(options.relaxed || options.warnings || options.tolerant) &&\n options.duplicate\n ) {\n return JSON.parse(\n text,\n options.reviver as (key: string, value: unknown) => unknown\n );\n }\n\n // Strategy 2: Need custom parser (warnings, tolerant, or duplicate checking)\n if (options.warnings || options.tolerant || !options.duplicate) {\n return parseWithCustomParser(text, options);\n }\n\n // Strategy 3: Relaxed syntax without warnings/tolerance -> transform and use native\n return parseWithTransform(text, options);\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(\n obj: { [objKey: string]: unknown },\n key: string\n): 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 { [objKey: 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","export type DebugLevel = \"off\" | \"stream\" | \"parse\";\n\nconst LINE_SPLIT_REGEX = /\\r?\\n/;\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;\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) {\n return \"stream\";\n }\n if (envLower === \"2\") {\n return \"parse\";\n }\n return \"off\";\n}\n\nfunction color(code: number) {\n return (text: string) => `\\u001b[${code}m${text}\\u001b[0m`;\n}\n\n// ANSI color codes\nconst ANSI_GRAY = 90;\nconst ANSI_YELLOW = 33;\nconst ANSI_CYAN = 36;\nconst ANSI_BG_BLUE = 44;\nconst ANSI_BG_GREEN = 42;\nconst ANSI_INVERSE = 7;\nconst ANSI_UNDERLINE = 4;\nconst ANSI_BOLD = 1;\n\nconst cGray = color(ANSI_GRAY);\nconst cYellow = color(ANSI_YELLOW);\nconst cCyan = color(ANSI_CYAN);\nconst cBgBlue = color(ANSI_BG_BLUE);\nconst cBgGreen = color(ANSI_BG_GREEN);\nconst cInverse = color(ANSI_INVERSE);\nconst cUnderline = color(ANSI_UNDERLINE);\nconst cBold = color(ANSI_BOLD);\n\nconst MAX_SNIPPET_LENGTH = 800;\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\nfunction formatError(error: unknown): string {\n if (error instanceof Error) {\n const stack = error.stack ? `\\n${error.stack}` : \"\";\n return `\\n${error.name}: ${error.message}${stack}`;\n }\n return safeStringify(error);\n}\n\nfunction truncateSnippet(snippet: string): string {\n if (snippet.length <= MAX_SNIPPET_LENGTH) {\n return snippet;\n }\n return `${snippet.slice(0, MAX_SNIPPET_LENGTH)}\\n…[truncated ${snippet.length - MAX_SNIPPET_LENGTH} chars]`;\n}\n\nexport function logParseFailure({\n phase,\n reason,\n snippet,\n error,\n}: {\n phase: \"generated-text\" | \"stream\" | string;\n reason: string;\n snippet?: string;\n error?: unknown;\n}) {\n if (getDebugLevel() !== \"parse\") {\n return;\n }\n\n const label = cBgBlue(`[${phase}]`);\n console.log(cGray(\"[debug:mw:fail]\"), label, cYellow(reason));\n\n if (snippet) {\n const formatted = truncateSnippet(snippet);\n console.log(cGray(\"[debug:mw:fail:snippet]\"), formatted);\n }\n\n if (error) {\n console.log(cGray(\"[debug:mw:fail:error]\"), cCyan(formatError(error)));\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\nfunction getHighlightStyle(): \"inverse\" | \"underline\" | \"bold\" | \"bg\" {\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 }\n if (normalized === \"underline\" || normalized === \"ul\") {\n return \"underline\" as const;\n }\n if (normalized === \"bold\") {\n return \"bold\" as const;\n }\n if (normalized === \"bg\" || normalized === \"background\") {\n return \"bg\" as const;\n }\n const asBool = normalizeBooleanString(normalized);\n if (asBool === true) {\n return \"bg\" as const;\n }\n return \"bg\" as const; // default: background highlight\n}\n\nfunction getHighlightFunction(style: \"inverse\" | \"underline\" | \"bold\" | \"bg\") {\n if (style === \"inverse\") {\n return cInverse;\n }\n if (style === \"underline\") {\n return cUnderline;\n }\n if (style === \"bold\") {\n return cBold;\n }\n if (style === \"bg\") {\n return cBgGreen;\n }\n return cYellow;\n}\n\nfunction renderHighlightedText(\n originalText: string,\n style: \"inverse\" | \"underline\" | \"bold\" | \"bg\",\n highlight: (text: string) => string\n) {\n if (\n style === \"bg\" ||\n style === \"inverse\" ||\n style === \"underline\" ||\n style === \"bold\"\n ) {\n return originalText\n .split(LINE_SPLIT_REGEX)\n .map((line) => (line.length ? highlight(line) : line))\n .join(\"\\n\");\n }\n return highlight(originalText);\n}\n\nexport function logParsedSummary({\n toolCalls,\n originalText,\n}: {\n toolCalls: unknown[];\n originalText: string;\n}) {\n if (originalText) {\n const style = getHighlightStyle();\n const highlight = getHighlightFunction(style);\n const rendered = renderHighlightedText(originalText, style, highlight);\n\n console.log(cGray(\"[debug:mw:origin]\"), `\\n${rendered}`);\n }\n\n if (toolCalls.length > 0) {\n const styledSummary = safeStringify(toolCalls)\n .split(LINE_SPLIT_REGEX)\n .map((line) => (line.length ? cBgBlue(line) : line))\n .join(\"\\n\");\n console.log(cGray(\"[debug:mw:summary]\"), styledSummary);\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 -= 1) {\n const suffix = text.substring(i);\n if (searchedText.startsWith(suffix)) {\n return i;\n }\n }\n\n return null;\n}\n","export function generateId(): string {\n return Math.random().toString(36).substring(2, 15);\n}\n","/**\n * Shared utilities for processing content in protocol implementations\n */\n\nimport type { LanguageModelV3Content } from \"@ai-sdk/provider\";\n\n/**\n * Adds a text segment to the processed elements array if it's not empty after trimming.\n * This prevents adding whitespace-only text elements.\n *\n * @param text - The text to add\n * @param processedElements - The array to add the text element to\n */\nexport function addTextSegment(\n text: string,\n processedElements: LanguageModelV3Content[]\n): void {\n if (text.trim()) {\n processedElements.push({ type: \"text\", text });\n }\n}\n","export function escapeRegExp(literal: string): string {\n return literal.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import type {\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport { parse as parseRJSON } from \"../../rjson\";\nimport { logParseFailure } from \"../utils/debug\";\nimport { getPotentialStartIndex } from \"../utils/get-potential-start-index\";\nimport { generateId } from \"../utils/id\";\nimport { addTextSegment } from \"../utils/protocol-utils\";\nimport { escapeRegExp } from \"../utils/regex\";\nimport type { TCMProtocol } from \"./protocol-interface\";\n\ninterface JsonProtocolOptions {\n toolCallStart?: string;\n toolCallEnd?: string;\n}\n\nfunction processToolCallJson(\n toolCallJson: string,\n fullMatch: string,\n processedElements: LanguageModelV3Content[],\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n }\n) {\n try {\n const parsedToolCall = parseRJSON(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 logParseFailure({\n phase: \"generated-text\",\n reason: \"Failed to parse tool call JSON segment\",\n snippet: fullMatch,\n error,\n });\n options?.onError?.(\n \"Could not process JSON tool call, keeping original text.\",\n { toolCall: fullMatch, error }\n );\n processedElements.push({ type: \"text\", text: fullMatch });\n }\n}\n\ninterface ParseContext {\n match: RegExpExecArray;\n text: string;\n currentIndex: number;\n processedElements: LanguageModelV3Content[];\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n}\n\nfunction processMatchedToolCall(context: ParseContext): number {\n const { match, text, currentIndex, processedElements, options } = context;\n const startIndex = match.index;\n const toolCallJson = match[1];\n\n if (startIndex > currentIndex) {\n const textSegment = text.substring(currentIndex, startIndex);\n addTextSegment(textSegment, processedElements);\n }\n\n if (toolCallJson) {\n processToolCallJson(toolCallJson, match[0], processedElements, options);\n }\n\n return startIndex + match[0].length;\n}\n\ninterface StreamState {\n isInsideToolCall: boolean;\n buffer: string;\n currentToolCallJson: string;\n currentTextId: string | null;\n hasEmittedTextStart: boolean;\n}\n\ntype StreamController =\n TransformStreamDefaultController<LanguageModelV3StreamPart>;\n\ninterface TagProcessingContext {\n state: StreamState;\n controller: StreamController;\n toolCallStart: string;\n toolCallEnd: string;\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n}\n\nfunction flushBuffer(\n state: StreamState,\n controller: StreamController,\n toolCallStart: string\n) {\n if (state.buffer.length === 0) {\n return;\n }\n\n if (!state.currentTextId) {\n state.currentTextId = generateId();\n controller.enqueue({\n type: \"text-start\",\n id: state.currentTextId,\n } as LanguageModelV3StreamPart);\n state.hasEmittedTextStart = true;\n }\n\n const deltaContent = state.isInsideToolCall\n ? `${toolCallStart}${state.buffer}`\n : state.buffer;\n\n controller.enqueue({\n type: \"text-delta\",\n id: state.currentTextId,\n delta: deltaContent,\n } as LanguageModelV3StreamPart);\n state.buffer = \"\";\n}\n\nfunction closeTextBlock(state: StreamState, controller: StreamController) {\n if (state.currentTextId && state.hasEmittedTextStart) {\n controller.enqueue({\n type: \"text-end\",\n id: state.currentTextId,\n } as LanguageModelV3StreamPart);\n state.currentTextId = null;\n state.hasEmittedTextStart = false;\n }\n}\n\nfunction emitIncompleteToolCall(\n state: StreamState,\n controller: StreamController,\n toolCallStart: string\n) {\n if (!state.currentToolCallJson) {\n return;\n }\n\n logParseFailure({\n phase: \"stream\",\n reason: \"Incomplete streaming tool call segment emitted as text\",\n snippet: `${toolCallStart}${state.currentToolCallJson}`,\n });\n\n const errorId = generateId();\n const errorContent = `${toolCallStart}${state.currentToolCallJson}`;\n controller.enqueue({\n type: \"text-start\",\n id: errorId,\n } as LanguageModelV3StreamPart);\n controller.enqueue({\n type: \"text-delta\",\n id: errorId,\n delta: errorContent,\n } as LanguageModelV3StreamPart);\n controller.enqueue({\n type: \"text-end\",\n id: errorId,\n } as LanguageModelV3StreamPart);\n state.currentToolCallJson = \"\";\n}\n\nfunction handleFinishChunk(\n state: StreamState,\n controller: StreamController,\n toolCallStart: string,\n chunk: LanguageModelV3StreamPart\n) {\n if (state.buffer.length > 0) {\n flushBuffer(state, controller, toolCallStart);\n }\n closeTextBlock(state, controller);\n emitIncompleteToolCall(state, controller, toolCallStart);\n controller.enqueue(chunk);\n}\n\nfunction publishText(\n text: string,\n state: StreamState,\n controller: StreamController\n) {\n if (state.isInsideToolCall) {\n closeTextBlock(state, controller);\n state.currentToolCallJson += text;\n } else if (text.length > 0) {\n if (!state.currentTextId) {\n state.currentTextId = generateId();\n controller.enqueue({\n type: \"text-start\",\n id: state.currentTextId,\n } as LanguageModelV3StreamPart);\n state.hasEmittedTextStart = true;\n }\n controller.enqueue({\n type: \"text-delta\",\n id: state.currentTextId,\n delta: text,\n } as LanguageModelV3StreamPart);\n }\n}\n\nfunction emitToolCall(context: TagProcessingContext) {\n const { state, controller, toolCallStart, toolCallEnd, options } = context;\n try {\n const parsedToolCall = parseRJSON(state.currentToolCallJson) as {\n name: string;\n arguments: unknown;\n };\n closeTextBlock(state, controller);\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: parsedToolCall.name,\n input: JSON.stringify(parsedToolCall.arguments ?? {}),\n } as LanguageModelV3StreamPart);\n } catch (error) {\n logParseFailure({\n phase: \"stream\",\n reason: \"Failed to parse streaming tool call JSON segment\",\n snippet: `${toolCallStart}${state.currentToolCallJson}${toolCallEnd}`,\n error,\n });\n const errorId = generateId();\n const errorContent = `${toolCallStart}${state.currentToolCallJson}${toolCallEnd}`;\n controller.enqueue({\n type: \"text-start\",\n id: errorId,\n } as LanguageModelV3StreamPart);\n controller.enqueue({\n type: \"text-delta\",\n id: errorId,\n delta: errorContent,\n } as LanguageModelV3StreamPart);\n controller.enqueue({\n type: \"text-end\",\n id: errorId,\n } as LanguageModelV3StreamPart);\n options?.onError?.(\n \"Could not process streaming JSON tool call; emitting original text.\",\n {\n toolCall: errorContent,\n }\n );\n }\n}\n\nfunction processTagMatch(context: TagProcessingContext) {\n const { state } = context;\n if (state.isInsideToolCall) {\n emitToolCall(context);\n state.currentToolCallJson = \"\";\n state.isInsideToolCall = false;\n } else {\n state.currentToolCallJson = \"\";\n state.isInsideToolCall = true;\n }\n}\n\nfunction processBufferTags(context: TagProcessingContext) {\n const { state, controller, toolCallStart, toolCallEnd } = context;\n let startIndex = getPotentialStartIndex(\n state.buffer,\n state.isInsideToolCall ? toolCallEnd : toolCallStart\n );\n\n while (startIndex != null) {\n const tag = state.isInsideToolCall ? toolCallEnd : toolCallStart;\n if (startIndex + tag.length > state.buffer.length) {\n break;\n }\n\n publishText(state.buffer.slice(0, startIndex), state, controller);\n state.buffer = state.buffer.slice(startIndex + tag.length);\n processTagMatch(context);\n\n startIndex = getPotentialStartIndex(\n state.buffer,\n state.isInsideToolCall ? toolCallEnd : toolCallStart\n );\n }\n}\n\nfunction handlePartialTag(\n state: StreamState,\n controller: StreamController,\n toolCallStart: string\n) {\n if (state.isInsideToolCall) {\n return;\n }\n\n const potentialIndex = getPotentialStartIndex(state.buffer, toolCallStart);\n if (\n potentialIndex != null &&\n potentialIndex + toolCallStart.length > state.buffer.length\n ) {\n publishText(state.buffer.slice(0, potentialIndex), state, controller);\n state.buffer = state.buffer.slice(potentialIndex);\n } else {\n publishText(state.buffer, state, controller);\n state.buffer = \"\";\n }\n}\n\nexport const jsonProtocol = ({\n toolCallStart = \"<tool_call>\",\n toolCallEnd = \"</tool_call>\",\n}: JsonProtocolOptions = {}): TCMProtocol => ({\n formatTools({\n tools,\n toolSystemPromptTemplate,\n }: {\n tools: LanguageModelV3FunctionTool[];\n toolSystemPromptTemplate: (tools: LanguageModelV3FunctionTool[]) => string;\n }) {\n return toolSystemPromptTemplate(tools || []);\n },\n\n formatToolCall(toolCall: LanguageModelV3ToolCall) {\n let args: unknown = {};\n if (toolCall.input != null) {\n try {\n args = JSON.parse(toolCall.input);\n } catch {\n args = toolCall.input;\n }\n }\n return `${toolCallStart}${JSON.stringify({\n name: toolCall.toolName,\n arguments: args,\n })}${toolCallEnd}`;\n },\n\n parseGeneratedText({\n text,\n options,\n }: {\n text: string;\n tools: LanguageModelV3FunctionTool[];\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n }) {\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: LanguageModelV3Content[] = [];\n let currentIndex = 0;\n let match = toolCallRegex.exec(text);\n\n while (match !== null) {\n currentIndex = processMatchedToolCall({\n match,\n text,\n currentIndex,\n processedElements,\n options,\n });\n match = toolCallRegex.exec(text);\n }\n\n if (currentIndex < text.length) {\n const remainingText = text.substring(currentIndex);\n addTextSegment(remainingText, processedElements);\n }\n\n return processedElements;\n },\n\n createStreamParser({\n options,\n }: {\n tools: LanguageModelV3FunctionTool[];\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n }) {\n const state: StreamState = {\n isInsideToolCall: false,\n buffer: \"\",\n currentToolCallJson: \"\",\n currentTextId: null,\n hasEmittedTextStart: false,\n };\n\n return new TransformStream<\n LanguageModelV3StreamPart,\n LanguageModelV3StreamPart\n >({\n transform(chunk, controller) {\n if (chunk.type === \"finish\") {\n handleFinishChunk(state, controller, toolCallStart, chunk);\n return;\n }\n\n if (chunk.type !== \"text-delta\") {\n controller.enqueue(chunk);\n return;\n }\n\n const textContent = (chunk as { delta?: string }).delta ?? \"\";\n state.buffer += textContent;\n processBufferTags({\n state,\n controller,\n toolCallStart,\n toolCallEnd,\n options,\n });\n handlePartialTag(state, controller, toolCallStart);\n },\n });\n },\n\n extractToolCallSegments({ text }: { text: string }) {\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 = regex.exec(text);\n while (m != null) {\n segments.push(m[0]);\n m = regex.exec(text);\n }\n return segments;\n },\n});\n","import type {\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\n\n/**\n * Options for parsing tool calls and handling errors\n */\nexport interface ParserOptions {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n}\n\nexport interface TCMProtocol {\n formatTools({\n tools,\n toolSystemPromptTemplate,\n }: {\n tools: LanguageModelV3FunctionTool[];\n toolSystemPromptTemplate: (tools: LanguageModelV3FunctionTool[]) => string;\n }): string;\n\n formatToolCall(toolCall: LanguageModelV3ToolCall): string;\n\n parseGeneratedText({\n text,\n tools,\n options,\n }: {\n text: string;\n tools: LanguageModelV3FunctionTool[];\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n }): LanguageModelV3Content[];\n\n createStreamParser({\n tools,\n options,\n }: {\n tools: LanguageModelV3FunctionTool[];\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n }): TransformStream<LanguageModelV3StreamPart, LanguageModelV3StreamPart>;\n\n extractToolCallSegments?: ({\n text,\n tools,\n }: {\n text: string;\n tools: LanguageModelV3FunctionTool[];\n }) => string[];\n}\n\nexport type TCMCoreProtocol = TCMProtocol;\n\nexport function isProtocolFactory(\n protocol: TCMProtocol | (() => TCMProtocol)\n): protocol is () => TCMProtocol {\n return typeof protocol === \"function\";\n}\n\nexport function isTCMProtocolFactory(\n protocol: TCMProtocol | (() => TCMProtocol)\n): protocol is () => TCMProtocol {\n return typeof protocol === \"function\";\n}\n","/**\n * Error classes for robust-xml parser\n */\n\nexport class RXMLParseError extends Error {\n cause?: unknown;\n line?: number;\n column?: number;\n\n constructor(\n message: string,\n cause?: unknown,\n line?: number,\n column?: number\n ) {\n super(message);\n this.name = \"RXMLParseError\";\n this.cause = cause;\n this.line = line;\n this.column = column;\n }\n}\n\nexport class RXMLDuplicateStringTagError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RXMLDuplicateStringTagError\";\n }\n}\n\nexport class RXMLCoercionError extends Error {\n cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"RXMLCoercionError\";\n this.cause = cause;\n }\n}\n\nexport class RXMLStringifyError extends Error {\n cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"RXMLStringifyError\";\n this.cause = cause;\n }\n}\n\nexport class RXMLStreamError extends Error {\n cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"RXMLStreamError\";\n this.cause = cause;\n }\n}\n","/**\n * Core types for the robust-xml parser\n * Based on TXML structure but enhanced for schema-aware parsing\n */\n\nexport type OnErrorFn = (\n message: string,\n metadata?: Record<string, unknown>\n) => void;\n\n/**\n * Represents a parsed XML node in the DOM tree\n */\nexport interface RXMLNode {\n tagName: string;\n attributes: Record<string, string | null>;\n children: (RXMLNode | string)[];\n}\n\n/**\n * Options for XML parsing\n */\nexport interface ParseOptions {\n /** Position to start parsing from (for streaming) */\n pos?: number;\n /** Array of tag names that don't have children and don't need to be closed */\n noChildNodes?: string[];\n /** Whether to set position information in result */\n setPos?: boolean;\n /** Keep comments in the parsed result */\n keepComments?: boolean;\n /** Keep whitespace like spaces, tabs and line breaks as string content */\n keepWhitespace?: boolean;\n /** Name of the text node property (default: \"#text\") */\n textNodeName?: string;\n /** Whether to throw on duplicate string tags */\n throwOnDuplicateStringTags?: boolean;\n /** Error handling callback */\n onError?: OnErrorFn;\n /**\n * Apply internal repair heuristics for fragment parsing.\n * When enabled, parsing attempts normalization/repair before throwing.\n */\n repair?: boolean;\n /** Maximum reparses when repair heuristics are enabled */\n maxReparses?: number;\n /** Whether to parse a single node instead of children */\n parseNode?: boolean;\n /** Filter function for nodes */\n filter?: (\n node: RXMLNode,\n index: number,\n depth: number,\n path: string\n ) => boolean;\n /** Simplify the result structure */\n simplify?: boolean;\n}\n\n/**\n * Options for XML stringification\n */\nexport interface StringifyOptions {\n /** Whether to format the output with indentation */\n format?: boolean;\n /** Whether to suppress empty nodes */\n suppressEmptyNode?: boolean;\n /**\n * Whether to use minimal escaping per XML 1.0:\n * - In character data: escape '&' and '<' (and '>' only in ']]>' sequence)\n * - In attribute values: escape '&', '<', and only the wrapping quote\n * Defaults to false (conservative escaping of &, <, >, \", ')\n */\n minimalEscaping?: boolean;\n /** Error handling callback */\n onError?: OnErrorFn;\n /**\n * Whether to serialize boolean-like attributes (value === null)\n * as name=\"name\" to follow strict XML attribute rules.\n * When false (default), serialize as a convenience flag without value\n * (e.g., <item checked>), for compatibility with existing outputs.\n */\n strictBooleanAttributes?: boolean;\n /**\n * Whether to include the XML declaration\n */\n declaration?: boolean;\n}\n\n/**\n * Result of parsing with position information\n */\nexport interface ParseResult {\n result: (RXMLNode | string)[];\n pos: number;\n}\n\n/**\n * Character code constants for efficient parsing\n */\nexport const CharCodes = {\n OPEN_BRACKET: \"<\".charCodeAt(0),\n CLOSE_BRACKET: \">\".charCodeAt(0),\n MINUS: \"-\".charCodeAt(0),\n SLASH: \"/\".charCodeAt(0),\n EXCLAMATION: \"!\".charCodeAt(0),\n QUESTION: \"?\".charCodeAt(0),\n SINGLE_QUOTE: \"'\".charCodeAt(0),\n DOUBLE_QUOTE: '\"'.charCodeAt(0),\n OPEN_CORNER_BRACKET: \"[\".charCodeAt(0),\n CLOSE_CORNER_BRACKET: \"]\".charCodeAt(0),\n SPACE: \" \".charCodeAt(0),\n TAB: \"\\t\".charCodeAt(0),\n NEWLINE: \"\\n\".charCodeAt(0),\n CARRIAGE_RETURN: \"\\r\".charCodeAt(0),\n} as const;\n\n/**\n * Default self-closing HTML tags\n */\nexport const DEFAULT_NO_CHILD_NODES = [\n \"img\",\n \"br\",\n \"input\",\n \"meta\",\n \"link\",\n \"hr\",\n \"area\",\n \"base\",\n \"col\",\n \"embed\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n] as const;\n\n/**\n * Name spacer characters for tag name parsing\n */\nexport const NAME_SPACER = \"\\r\\n\\t>/= \";\n","/**\n * Utility functions for XML parsing\n */\n\nimport { CharCodes, NAME_SPACER } from \"../core/types\";\n\nconst NAME_START_CHAR_REGEX = /[A-Za-z_:]/;\nconst NAME_CHAR_REGEX = /[A-Za-z0-9_.:-]/;\n\n/**\n * Check if a character is a valid XML name start character\n */\nexport function isNameStartChar(ch: string): boolean {\n return NAME_START_CHAR_REGEX.test(ch);\n}\n\n/**\n * Check if a character is a valid XML name character\n */\nexport function isNameChar(ch: string): boolean {\n return NAME_CHAR_REGEX.test(ch);\n}\n\n/**\n * Check if a character is whitespace\n */\nexport function isWhitespace(charCode: number): boolean {\n return (\n charCode === CharCodes.SPACE ||\n charCode === CharCodes.TAB ||\n charCode === CharCodes.NEWLINE ||\n charCode === CharCodes.CARRIAGE_RETURN\n );\n}\n\n/**\n * Skip over quoted string content in XML\n */\nexport function skipQuoted(s: string, i: number): number {\n const quote = s[i];\n let pos = i + 1;\n while (pos < s.length) {\n const ch = s[pos];\n if (ch === \"\\\\\") {\n pos += 2;\n continue;\n }\n if (ch === quote) {\n return pos + 1;\n }\n pos += 1;\n }\n return pos;\n}\n\n/**\n * Parse a tag name from the current position\n */\nexport function parseName(\n s: string,\n pos: number\n): { name: string; newPos: number } {\n const start = pos;\n let currentPos = pos;\n while (NAME_SPACER.indexOf(s[currentPos]) === -1 && s[currentPos]) {\n currentPos += 1;\n }\n return { name: s.slice(start, currentPos), newPos: currentPos };\n}\n\n/**\n * Parse a quoted string value\n */\nexport function parseString(\n s: string,\n pos: number\n): { value: string; newPos: number } {\n const startChar = s[pos];\n const startPos = pos + 1;\n const endPos = s.indexOf(startChar, startPos);\n if (endPos === -1) {\n // Unclosed string - find the next > to continue parsing\n const tagEnd = s.indexOf(\">\", startPos);\n if (tagEnd !== -1) {\n return { value: s.slice(startPos, tagEnd), newPos: tagEnd };\n }\n // If no > found, return what we have\n return { value: s.slice(startPos), newPos: s.length };\n }\n return { value: s.slice(startPos, endPos), newPos: endPos + 1 };\n}\n\n/**\n * Find elements by attribute value (used for getElementById, etc.)\n */\nexport function findElementsByAttr(\n xmlString: string,\n attrName: string,\n attrValue: string\n): number[] {\n const regex = new RegExp(`\\\\s${attrName}\\\\s*=['\"\"]${attrValue}['\"\"]`);\n const positions: number[] = [];\n let searchPos = 0;\n\n while (true) {\n const match = regex.exec(xmlString.slice(searchPos));\n if (!match) {\n break;\n }\n\n const pos = xmlString.lastIndexOf(\"<\", searchPos + match.index);\n if (pos !== -1) {\n positions.push(pos);\n }\n searchPos += match.index + match[0].length;\n }\n\n return positions;\n}\n\n/**\n * Calculate line and column from position in string\n */\nexport function getLineColumn(\n s: string,\n pos: number\n): { line: number; column: number } {\n let line = 1;\n let column = 1;\n\n for (let i = 0; i < pos && i < s.length; i += 1) {\n if (s[i] === \"\\n\") {\n line += 1;\n column = 1;\n } else {\n column += 1;\n }\n }\n\n return { line, column };\n}\n\n/**\n * Escape XML special characters used in element content and attribute values.\n *\n * References (W3C XML 1.0, Fifth Edition):\n * - 2.4 Character Data and Markup: '<' and '&' MUST NOT appear literally in content;\n * they MUST be escaped. '>' MUST be escaped in the sequence ']]>' and MAY be\n * escaped otherwise. Spec: https://www.w3.org/TR/2008/REC-xml-20081126/\n * - 3.1 Start-Tags, End-Tags, and Empty-Element Tags (AttValue [10]): attribute\n * values are quoted with ' or \", and the matching quote MUST be escaped inside.\n * - 4.6 Predefined Entities: amp, lt, gt, apos, quot MUST be recognized by all\n * XML processors. Spec: https://www.w3.org/TR/2008/REC-xml-20081126/#sec-predefined-ent\n *\n * We conservatively escape &, <, >, \", ' using the predefined entities.\n */\nexport function escapeXml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/**\n * Minimal escaping for character data per XML 1.0 §2.4.\n * - Escape '&' and '<' always\n * - Escape only the ']]>' sequence by turning '>' into '>' in that context\n */\nexport function escapeXmlMinimalText(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/]]>/g, \"]]>\");\n}\n\n/**\n * Minimal escaping for attribute values per XML 1.0 §3.1 (AttValue [10]).\n * - Escape '&' and '<' always\n * - Escape only the wrapper quote among ' or \"\n */\nexport function escapeXmlMinimalAttr(\n value: string,\n wrapper: '\"' | \"'\" = '\"'\n): string {\n let escaped = value.replace(/&/g, \"&\").replace(/</g, \"<\");\n if (wrapper === '\"') {\n escaped = escaped.replace(/\"/g, \""\");\n } else {\n escaped = escaped.replace(/'/g, \"'\");\n }\n return escaped;\n}\n\n/**\n * Unescape XML entities\n */\nexport function unescapeXml(text: string): string {\n return text\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\");\n}\n","/**\n * XML stringification based on TXML's stringify approach\n * Replaces the fast-xml-parser XMLBuilder with a native implementation\n */\n\nimport type { RXMLNode, StringifyOptions } from \"../core/types\";\nimport { RXMLStringifyError } from \"../errors/types\";\nimport {\n escapeXml,\n escapeXmlMinimalAttr,\n escapeXmlMinimalText,\n} from \"../utils/helpers\";\n\n/**\n * Stringify an object to XML\n */\nexport function stringify(\n rootTag: string,\n obj: unknown,\n options: StringifyOptions = {}\n): string {\n try {\n const format = options.format ?? true;\n const declaration = options.declaration ?? false;\n const minimalEscaping = options.minimalEscaping ?? false;\n const suppressEmptyNode = options.suppressEmptyNode ?? false;\n const strictBooleanAttributes = options.strictBooleanAttributes ?? false;\n\n let result = \"\";\n\n if (declaration) {\n result += '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n }\n\n result += stringifyValue(rootTag, obj, {\n depth: 0,\n format,\n suppressEmptyNode,\n minimalEscaping,\n strictBooleanAttributes,\n });\n\n if (result.endsWith(\"\\n\")) {\n return result.slice(0, -1);\n }\n\n return result;\n } catch (error) {\n throw new RXMLStringifyError(\"Failed to stringify XML\", error);\n }\n}\n\ninterface StringifyContext {\n depth: number;\n format: boolean;\n suppressEmptyNode: boolean;\n minimalEscaping: boolean;\n strictBooleanAttributes: boolean;\n}\n\n/**\n * Escape content based on escaping mode\n */\nfunction escapeContent(content: string, minimalEscaping: boolean): string {\n return minimalEscaping ? escapeXmlMinimalText(content) : escapeXml(content);\n}\n\n/**\n * Create self-closing tag\n */\nfunction createSelfClosingTag(\n tagName: string,\n indent: string,\n newline: string\n): string {\n return `${indent}<${tagName}/>${newline}`;\n}\n\n/**\n * Create element with text content\n */\nfunction createTextElement(\n tagName: string,\n content: string,\n indent: string,\n newline: string\n): string {\n return `${indent}<${tagName}>${content}</${tagName}>${newline}`;\n}\n\n/**\n * Check if value is a primitive type\n */\nfunction isPrimitive(value: unknown): boolean {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n );\n}\n\ninterface FormatOptions {\n indent: string;\n newline: string;\n}\n\n/**\n * Stringify a primitive value\n */\nfunction stringifyPrimitive(\n tagName: string,\n value: unknown,\n context: StringifyContext,\n format: FormatOptions\n): string {\n const { minimalEscaping, suppressEmptyNode } = context;\n const content = escapeContent(String(value), minimalEscaping);\n\n if (content === \"\" && suppressEmptyNode) {\n return \"\";\n }\n\n return createTextElement(tagName, content, format.indent, format.newline);\n}\n\n/**\n * Stringify an array value\n */\nfunction stringifyArray(\n tagName: string,\n value: unknown[],\n context: StringifyContext\n): string {\n let result = \"\";\n for (const item of value) {\n result += stringifyValue(tagName, item, context);\n }\n return result;\n}\n\n/**\n * Stringify a value to XML format\n */\nfunction stringifyValue(\n tagName: string,\n value: unknown,\n context: StringifyContext\n): string {\n const { format, suppressEmptyNode, minimalEscaping } = context;\n const indent = format ? \" \".repeat(context.depth) : \"\";\n const newline = format ? \"\\n\" : \"\";\n\n if (value === null || value === undefined) {\n if (suppressEmptyNode) {\n return \"\";\n }\n return createSelfClosingTag(tagName, indent, newline);\n }\n\n if (isPrimitive(value)) {\n return stringifyPrimitive(tagName, value, context, { indent, newline });\n }\n\n if (Array.isArray(value)) {\n return stringifyArray(tagName, value, context);\n }\n\n if (typeof value === \"object\") {\n return stringifyObject(tagName, value as Record<string, unknown>, context);\n }\n\n // Fallback for other types\n const content = escapeContent(String(value), minimalEscaping);\n if (content === \"\" && suppressEmptyNode) {\n return \"\";\n }\n return createTextElement(tagName, content, indent, newline);\n}\n\ninterface ObjectParts {\n attributes: Record<string, unknown>;\n elements: Record<string, unknown>;\n textContent: string | undefined;\n}\n\n/**\n * Extract attributes, elements, and text content from an object\n */\nfunction extractObjectParts(obj: Record<string, unknown>): ObjectParts {\n const attributes: Record<string, unknown> = {};\n const elements: Record<string, unknown> = {};\n let textContent: string | undefined;\n\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith(\"@\")) {\n attributes[key.substring(1)] = value;\n } else if (key === \"#text\" || key === \"_text\") {\n textContent = String(value);\n } else if (key === \"_attributes\") {\n if (typeof value === \"object\" && value !== null) {\n Object.assign(attributes, value as Record<string, unknown>);\n }\n } else {\n elements[key] = value;\n }\n }\n\n return { attributes, elements, textContent };\n}\n\n/**\n * Format a single attribute\n */\nfunction formatAttribute(\n attrName: string,\n attrValue: unknown,\n minimalEscaping: boolean,\n strictBooleanAttributes: boolean\n): string {\n if (attrValue === null) {\n return strictBooleanAttributes\n ? ` ${attrName}=\"${attrName}\"`\n : ` ${attrName}`;\n }\n\n const valueStr = String(attrValue);\n // Attribute quoting strategy per XML 1.0:\n // - 3.1 (AttValue [10]): attribute values MUST be quoted with ' or \".\n // If the same quote appears in the value, it MUST be escaped (via\n // predefined entities per 4.6). We choose the quote that minimizes\n // escaping: prefer \" unless value contains \", otherwise use '.\n // See: https://www.w3.org/TR/2008/REC-xml-20081126/\n if (valueStr.indexOf('\"') === -1) {\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(valueStr, '\"')\n : escapeXml(valueStr);\n return ` ${attrName}=\"${escaped}\"`;\n }\n\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(valueStr, \"'\")\n : escapeXml(valueStr);\n return ` ${attrName}='${escaped}'`;\n}\n\n/**\n * Build opening tag with attributes\n */\nfunction buildOpeningTag(\n tagName: string,\n attributes: Record<string, unknown>,\n context: StringifyContext\n): string {\n let openTag = `<${tagName}`;\n const { minimalEscaping, strictBooleanAttributes } = context;\n\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n openTag += formatAttribute(\n attrName,\n attrValue,\n minimalEscaping,\n strictBooleanAttributes\n );\n }\n\n return openTag;\n}\n\n/**\n * Stringify text-only content\n */\nfunction stringifyTextOnlyContent(options: {\n tagName: string;\n textContent: string;\n openTag: string;\n format: FormatOptions;\n minimalEscaping: boolean;\n}): string {\n const { tagName, textContent, openTag, format, minimalEscaping } = options;\n const content = escapeContent(textContent, minimalEscaping);\n return `${format.indent}${openTag}${content}</${tagName}>${format.newline}`;\n}\n\ninterface ComplexContentOptions {\n indent: string;\n newline: string;\n childIndent: string;\n openTag: string;\n}\n\n/**\n * Stringify complex content (text + elements)\n */\nfunction stringifyComplexContent(\n tagName: string,\n parts: ObjectParts,\n context: StringifyContext,\n options: ComplexContentOptions\n): string {\n const { format, minimalEscaping, depth } = context;\n const { textContent, elements } = parts;\n const hasElements = Object.keys(elements).length > 0;\n\n let result = `${options.indent}${options.openTag}`;\n\n if (textContent) {\n const content = escapeContent(textContent, minimalEscaping);\n result += format\n ? `${options.newline}${options.childIndent}${content}`\n : content;\n }\n\n if (hasElements) {\n if (format) {\n result += options.newline;\n }\n\n for (const [elementName, elementValue] of Object.entries(elements)) {\n result += stringifyValue(elementName, elementValue, {\n ...context,\n depth: depth + 1,\n });\n }\n\n if (format) {\n result += options.indent;\n }\n }\n\n result += `</${tagName}>${options.newline}`;\n return result;\n}\n\n/**\n * Stringify an object to XML\n */\nfunction stringifyObject(\n tagName: string,\n obj: Record<string, unknown>,\n context: StringifyContext\n): string {\n const { depth, format, suppressEmptyNode } = context;\n const indent = format ? \" \".repeat(depth) : \"\";\n const newline = format ? \"\\n\" : \"\";\n const childIndent = format ? \" \".repeat(depth + 1) : \"\";\n\n const parts = extractObjectParts(obj);\n const openTag = buildOpeningTag(tagName, parts.attributes, context);\n\n // Check if we have any content\n const hasElements = Object.keys(parts.elements).length > 0;\n const hasTextContent =\n parts.textContent !== undefined && parts.textContent !== \"\";\n\n if (!(hasElements || hasTextContent)) {\n if (suppressEmptyNode) {\n return \"\";\n }\n return `${indent}${openTag}/>${newline}`;\n }\n\n const fullOpenTag = `${openTag}>`;\n\n // Handle text-only content\n if (!hasElements && hasTextContent && parts.textContent) {\n return stringifyTextOnlyContent({\n tagName,\n textContent: parts.textContent,\n openTag: fullOpenTag,\n format: { indent, newline },\n minimalEscaping: context.minimalEscaping,\n });\n }\n\n // Handle complex content\n return stringifyComplexContent(tagName, parts, context, {\n indent,\n newline,\n childIndent,\n openTag: fullOpenTag,\n });\n}\n\n/**\n * Stringify parsed XML nodes back to XML string\n */\nexport function stringifyNodes(\n nodes: (RXMLNode | string)[],\n format = true,\n options: Pick<\n StringifyOptions,\n \"strictBooleanAttributes\" | \"minimalEscaping\"\n > = {}\n): string {\n let result = \"\";\n\n for (const node of nodes) {\n if (typeof node === \"string\") {\n result += node;\n } else {\n result += stringifyNode(node, 0, format, options);\n }\n }\n\n return result;\n}\n\ninterface NodeStringifyOptions {\n minimalEscaping: boolean;\n strictBooleanAttributes: boolean;\n indent: string;\n newline: string;\n}\n\n/**\n * Format a single node attribute\n */\nfunction formatNodeAttribute(\n attrName: string,\n attrValue: string | null,\n minimalEscaping: boolean,\n strictBooleanAttributes: boolean\n): string {\n if (attrValue === null) {\n if (strictBooleanAttributes) {\n return ` ${attrName}=\"${attrName}\"`;\n }\n return ` ${attrName}`;\n }\n\n if (attrValue.indexOf('\"') === -1) {\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(attrValue, '\"')\n : escapeXml(attrValue);\n return ` ${attrName}=\"${escaped}\"`;\n }\n\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(attrValue, \"'\")\n : escapeXml(attrValue);\n return ` ${attrName}='${escaped}'`;\n}\n\n/**\n * Build opening tag with attributes\n */\nfunction buildNodeOpeningTag(\n node: RXMLNode,\n opts: NodeStringifyOptions\n): string {\n let result = `${opts.indent}<${node.tagName}`;\n\n for (const [attrName, attrValue] of Object.entries(node.attributes)) {\n result += formatNodeAttribute(\n attrName,\n attrValue,\n opts.minimalEscaping,\n opts.strictBooleanAttributes\n );\n }\n\n return result;\n}\n\n/**\n * Stringify node children\n */\nfunction stringifyNodeChildren(options: {\n children: (RXMLNode | string)[];\n depth: number;\n format: boolean;\n stringifyOptions: Pick<\n StringifyOptions,\n \"strictBooleanAttributes\" | \"minimalEscaping\"\n >;\n minimalEscaping: boolean;\n newline: string;\n}): { content: string; hasElementChildren: boolean } {\n const {\n children,\n depth,\n format,\n stringifyOptions,\n minimalEscaping,\n newline,\n } = options;\n let content = \"\";\n let hasElementChildren = false;\n\n for (const child of children) {\n if (typeof child === \"string\") {\n content += minimalEscaping\n ? escapeXmlMinimalText(child)\n : escapeXml(child);\n } else {\n if (!hasElementChildren && format) {\n content += newline;\n hasElementChildren = true;\n }\n content += stringifyNode(child, depth + 1, format, stringifyOptions);\n }\n }\n\n return { content, hasElementChildren };\n}\n\n/**\n * Stringify a single XML node\n */\nexport function stringifyNode(\n node: RXMLNode,\n depth = 0,\n format = true,\n options: Pick<\n StringifyOptions,\n \"strictBooleanAttributes\" | \"minimalEscaping\"\n > = {}\n): string {\n const indent = format ? \" \".repeat(depth) : \"\";\n const newline = format ? \"\\n\" : \"\";\n const minimalEscaping = options.minimalEscaping ?? false;\n const strictBooleanAttributes = options.strictBooleanAttributes ?? false;\n\n const opts: NodeStringifyOptions = {\n minimalEscaping,\n strictBooleanAttributes,\n indent,\n newline,\n };\n\n let result = buildNodeOpeningTag(node, opts);\n\n // Handle processing instructions\n if (node.tagName[0] === \"?\") {\n return `${result}?>${newline}`;\n }\n\n // Handle self-closing tags\n if (node.children.length === 0) {\n return `${result}/>${newline}`;\n }\n\n result += \">\";\n\n // Handle children\n const { content, hasElementChildren } = stringifyNodeChildren({\n children: node.children,\n depth,\n format,\n stringifyOptions: options,\n minimalEscaping,\n newline,\n });\n\n result += content;\n\n if (hasElementChildren && format) {\n result += indent;\n }\n\n result += `</${node.tagName}>`;\n\n if (format) {\n result += newline;\n }\n\n return result;\n}\n\n/**\n * Convert content to a string representation (similar to TXML's toContentString)\n */\nexport function toContentString(nodes: (RXMLNode | string)[]): string {\n let result = \"\";\n\n for (const node of nodes) {\n if (typeof node === \"string\") {\n result += ` ${node}`;\n } else {\n result += ` ${toContentString(node.children)}`;\n }\n result = result.trim();\n }\n\n return result;\n}\n","// Regex constants for performance\nconst NUMERIC_REGEX = /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/;\nconst EMPTY_OBJECT_REGEX = /^\\{\\s*\\}$/s;\nconst NEWLINE_SPLIT_REGEX = /\\n+/;\nconst COMMA_SPLIT_REGEX = /,\\s*/;\nconst DIGIT_KEY_REGEX = /^\\d+$/;\n\nexport function unwrapJsonSchema(schema: unknown): unknown {\n if (!schema || typeof schema !== \"object\") {\n return schema;\n }\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\") {\n return;\n }\n const t: unknown = (unwrapped as Record<string, unknown>).type;\n if (typeof t === \"string\") {\n return t;\n }\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) {\n if (t.includes(p)) {\n return p;\n }\n }\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;\n}\n\n/**\n * Checks if a property is allowed through schema combinators (anyOf, oneOf, allOf).\n *\n * @param s - The schema object to check\n * @param key - The property key to look for\n * @param depth - Current recursion depth\n * @returns `true` if at least one combinator exists AND allows the property;\n * `false` if no combinators exist OR none allow the property.\n * When no combinators are present, returns `false` so the caller can\n * fall back to other property-checking methods.\n *\n * **oneOf semantics**: JSON Schema's `oneOf` requires exactly one schema to match,\n * but for coercion heuristics we treat it like `anyOf` (at least one allows).\n * This is intentional because:\n * 1. We're determining if a property CAN exist, not validating exact matches\n * 2. Coercion should be permissive - if any branch allows the property, we allow it\n * 3. Strict oneOf validation would require runtime value inspection, not just schema analysis\n */\nfunction schemaAllowsPropertyViaCombinators(\n s: Record<string, unknown>,\n key: string,\n depth: number\n): boolean {\n const anyOfValues = s.anyOf;\n const oneOfValues = s.oneOf;\n const allOfValues = s.allOf;\n\n let hasCombinator = false;\n let anyOfAllows = true;\n let oneOfAllows = true;\n let allOfAllows = true;\n\n if (Array.isArray(anyOfValues)) {\n hasCombinator = true;\n anyOfAllows = anyOfValues.some((sub) =>\n schemaHasProperty(sub, key, depth + 1)\n );\n }\n\n if (Array.isArray(oneOfValues)) {\n hasCombinator = true;\n oneOfAllows = oneOfValues.some((sub) =>\n schemaHasProperty(sub, key, depth + 1)\n );\n }\n\n if (Array.isArray(allOfValues)) {\n hasCombinator = true;\n allOfAllows = allOfValues.every((sub) =>\n schemaHasProperty(sub, key, depth + 1)\n );\n }\n\n if (!hasCombinator) {\n return false;\n }\n\n return anyOfAllows && oneOfAllows && allOfAllows;\n}\n\nfunction schemaHasPropertyDirectly(\n s: Record<string, unknown>,\n key: string\n): boolean {\n const props = s.properties;\n if (\n props &&\n typeof props === \"object\" &&\n !Array.isArray(props) &&\n Object.hasOwn(props, key) &&\n (props as Record<string, unknown>)[key] !== false\n ) {\n return true;\n }\n const required = s.required;\n if (Array.isArray(required) && required.includes(key)) {\n return true;\n }\n const patternSchemas = getPatternSchemasForKey(s.patternProperties, key);\n return patternSchemas.some((schema) => schema !== false);\n}\n\n/**\n * Checks if a schema allows additional properties beyond those explicitly defined.\n *\n * JSON Schema behavior for additionalProperties:\n * - `additionalProperties: true` or `additionalProperties: { schema }`: Explicitly allows additional properties\n * - `additionalProperties: false`: Explicitly disallows additional properties\n * - `additionalProperties` not specified: Defaults to allowing additional properties (JSON Schema spec)\n *\n * When `additionalProperties` is not explicitly set, this function returns `true` if the schema\n * appears to be an object schema (has `type: \"object\"`, `properties`, `patternProperties`, or `required`).\n * This follows the JSON Schema specification where omitting `additionalProperties` is equivalent to `true`.\n *\n * **Important**: This means schemas like `{ type: \"object\", properties: { foo: ... } }` without\n * `additionalProperties: false` will be treated as allowing any additional property, which affects\n * single-key object unwrapping behavior in array coercion.\n *\n * @param s - The schema object to check\n * @returns `true` if the schema allows additional properties, `false` otherwise\n */\nfunction schemaHasPropertyViaAdditional(s: Record<string, unknown>): boolean {\n const additional = s.additionalProperties;\n if (\n additional === true ||\n (additional && typeof additional === \"object\" && !Array.isArray(additional))\n ) {\n return true;\n }\n if (Object.hasOwn(s, \"additionalProperties\")) {\n return false;\n }\n const type = s.type;\n const isObjectType =\n type === \"object\" || (Array.isArray(type) && type.includes(\"object\"));\n const hasObjectKeywords =\n (s.properties &&\n typeof s.properties === \"object\" &&\n !Array.isArray(s.properties)) ||\n (s.patternProperties &&\n typeof s.patternProperties === \"object\" &&\n !Array.isArray(s.patternProperties)) ||\n (Array.isArray(s.required) && s.required.length > 0);\n return !!(isObjectType || hasObjectKeywords);\n}\n\nfunction schemaDisallowsPropertyDirectly(\n s: Record<string, unknown>,\n key: string\n): boolean {\n const props = s.properties;\n if (\n props &&\n typeof props === \"object\" &&\n !Array.isArray(props) &&\n Object.hasOwn(props, key) &&\n (props as Record<string, unknown>)[key] === false\n ) {\n return true;\n }\n const patternSchemas = getPatternSchemasForKey(s.patternProperties, key);\n return patternSchemas.some((schema) => schema === false);\n}\n\n/**\n * Checks if a schema allows a specific property key.\n *\n * Recursively checks through schema combinators (allOf, anyOf, oneOf) to determine\n * if the given key is allowed by the schema.\n *\n * @param schema - The JSON Schema to check\n * @param key - The property key to check for\n * @param depth - Current recursion depth (default: 0)\n * @returns `true` if the schema allows the property, `false` otherwise\n *\n * @remarks\n * The depth limit of 5 prevents infinite recursion in deeply nested or circular\n * schema references. This limit is sufficient for most real-world schemas while\n * protecting against pathological cases. When the limit is exceeded, the function\n * conservatively returns `true` to prevent unwrapping - it's safer to keep a\n * wrapper key than to incorrectly remove it and lose data.\n */\nfunction schemaHasProperty(schema: unknown, key: string, depth = 0): boolean {\n if (depth > 5) {\n return true;\n }\n const unwrapped = unwrapJsonSchema(schema);\n // Unconstrained schemas (true, null, {}) allow any property\n if (schemaIsUnconstrained(unwrapped)) {\n return true;\n }\n if (!unwrapped || typeof unwrapped !== \"object\") {\n return false;\n }\n const s = unwrapped as Record<string, unknown>;\n\n if (schemaDisallowsPropertyDirectly(s, key)) {\n return false;\n }\n if (schemaHasPropertyDirectly(s, key)) {\n return true;\n }\n if (schemaHasPropertyViaAdditional(s)) {\n return true;\n }\n return schemaAllowsPropertyViaCombinators(s, key, depth);\n}\n\nfunction schemaIsUnconstrained(schema: unknown): boolean {\n const unwrapped = unwrapJsonSchema(schema);\n if (unwrapped == null || unwrapped === true) {\n return true;\n }\n if (typeof unwrapped !== \"object\" || Array.isArray(unwrapped)) {\n return false;\n }\n return Object.keys(unwrapped).length === 0;\n}\n\n/**\n * Gets all schemas from patternProperties that match the given key.\n *\n * @param patternProperties - The patternProperties object from a JSON Schema\n * @param key - The property key to match against patterns\n * @returns Array of schemas whose patterns match the key\n *\n * @remarks\n * **Security consideration**: This function executes regex patterns from the schema.\n * In typical usage (AI SDK tool parsing), schemas come from trusted application code.\n * However, if schemas can originate from untrusted sources, be aware of potential\n * ReDoS (Regular Expression Denial of Service) with malicious patterns like `(a+)+$`.\n * Consider adding regex timeout or safe-regex validation if processing untrusted schemas.\n */\nfunction getPatternSchemasForKey(\n patternProperties: unknown,\n key: string\n): unknown[] {\n if (\n !patternProperties ||\n typeof patternProperties !== \"object\" ||\n Array.isArray(patternProperties)\n ) {\n return [];\n }\n const schemas: unknown[] = [];\n for (const [pattern, schema] of Object.entries(\n patternProperties as Record<string, unknown>\n )) {\n try {\n const regex = new RegExp(pattern);\n if (regex.test(key)) {\n schemas.push(schema);\n }\n } catch {\n // Ignore invalid regex patterns.\n }\n }\n return schemas;\n}\n\nfunction coerceValueForKey(\n value: unknown,\n key: string,\n unwrapped: Record<string, unknown>\n): unknown {\n const schemas: unknown[] = [];\n const props = unwrapped.properties as Record<string, unknown> | undefined;\n if (props && Object.hasOwn(props, key)) {\n schemas.push(props[key]);\n }\n const patternSchemas = getPatternSchemasForKey(\n unwrapped.patternProperties,\n key\n );\n if (patternSchemas.length > 0) {\n schemas.push(...patternSchemas);\n }\n\n if (schemas.length > 0) {\n let out = value;\n for (const schema of schemas) {\n if (typeof schema === \"boolean\") {\n continue;\n }\n out = coerceBySchema(out, schema);\n }\n return out;\n }\n\n const additional = unwrapped.additionalProperties;\n if (\n additional &&\n typeof additional === \"object\" &&\n !Array.isArray(additional)\n ) {\n return coerceBySchema(value, additional);\n }\n if (additional === true || additional === false) {\n return value;\n }\n\n return coerceBySchema(value, undefined);\n}\n\n/**\n * Coerce string value without schema information\n */\nfunction coerceStringWithoutSchema(value: string): unknown {\n const s = value.trim();\n const lower = s.toLowerCase();\n if (lower === \"true\") {\n return true;\n }\n if (lower === \"false\") {\n return false;\n }\n if (NUMERIC_REGEX.test(s)) {\n const num = Number(s);\n if (Number.isFinite(num)) {\n return num;\n }\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 return coerceBySchema(parsed, undefined);\n } catch {\n // If parsing fails, return original value\n }\n }\n return value;\n}\n\n/**\n * Coerce string to object using schema\n */\nfunction coerceStringToObject(\n s: string,\n unwrapped: Record<string, unknown>\n): unknown {\n try {\n let normalized = s.replace(/'/g, '\"');\n normalized = normalized.replace(EMPTY_OBJECT_REGEX, \"{}\");\n\n const obj = JSON.parse(normalized);\n if (obj && typeof obj === \"object\" && !Array.isArray(obj)) {\n return coerceObjectToObject(obj as Record<string, unknown>, unwrapped);\n }\n } catch {\n // fallthrough\n }\n return null;\n}\n\n/**\n * Coerce string to array using schema\n */\nfunction coerceStringToArray(\n s: string,\n unwrapped: Record<string, unknown>\n): unknown {\n const prefixItems = Array.isArray(unwrapped.prefixItems)\n ? (unwrapped.prefixItems as unknown[])\n : undefined;\n const itemsSchema = unwrapped.items as unknown;\n\n try {\n const normalized = s.replace(/'/g, '\"');\n const arr = JSON.parse(normalized);\n if (Array.isArray(arr)) {\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\")\n ? s.split(NEWLINE_SPLIT_REGEX)\n : s.split(COMMA_SPLIT_REGEX);\n const trimmed = csv.map((x) => x.trim()).filter((x) => x.length > 0);\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 return null;\n}\n\n/**\n * Coerce object to object using schema\n */\nfunction coerceObjectToObject(\n value: Record<string, unknown>,\n unwrapped: Record<string, unknown>\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n out[k] = coerceValueForKey(v, k, unwrapped);\n }\n return out;\n}\n\n/**\n * Coerce array to array using schema\n */\nfunction coerceArrayToArray(\n value: unknown[],\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown[] {\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/**\n * Coerce object to array using schema\n */\nfunction coerceObjectToArray(\n maybe: Record<string, unknown>,\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown {\n if (Object.hasOwn(maybe, \"item\")) {\n const items = maybe.item as unknown;\n const arr = Array.isArray(items) ? items : [items];\n return coerceArrayToArray(arr, prefixItems, itemsSchema);\n }\n\n const keys = Object.keys(maybe);\n\n // Check for numeric keys (traditional tuple handling)\n if (keys.length > 0 && keys.every((k) => DIGIT_KEY_REGEX.test(k))) {\n const arr = keys.sort((a, b) => Number(a) - Number(b)).map((k) => maybe[k]);\n return coerceArrayToArray(arr, prefixItems, itemsSchema);\n }\n\n // Check for single field that contains an array or object (common XML pattern)\n // This handles both: { user: [{ name: \"A\" }, { name: \"B\" }] } and { user: { name: \"A\" } }\n if (keys.length === 1) {\n const singleKey = keys[0];\n if (\n !(\n schemaIsUnconstrained(itemsSchema) ||\n schemaHasProperty(itemsSchema, singleKey)\n )\n ) {\n const singleValue = maybe[singleKey];\n if (Array.isArray(singleValue)) {\n return singleValue.map((v) => coerceBySchema(v, itemsSchema));\n }\n // Also extract when single key's value is an object and wrap in array (single/multiple element consistency)\n if (singleValue && typeof singleValue === \"object\") {\n return [coerceBySchema(singleValue, itemsSchema)];\n }\n }\n }\n\n return null;\n}\n\n/**\n * Coerce primitive to array using schema\n */\nfunction coercePrimitiveToArray(\n value: unknown,\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown[] {\n if (prefixItems && prefixItems.length > 0) {\n return [coerceBySchema(value, prefixItems[0])];\n }\n return [coerceBySchema(value, itemsSchema)];\n}\n\n/**\n * Coerce string to primitive type using schema\n */\nfunction coerceStringToPrimitive(\n s: string,\n schemaType: string | undefined\n): unknown {\n if (schemaType === \"boolean\") {\n const lower = s.toLowerCase();\n if (lower === \"true\") {\n return true;\n }\n if (lower === \"false\") {\n return false;\n }\n }\n if (\n (schemaType === \"number\" || schemaType === \"integer\") &&\n NUMERIC_REGEX.test(s)\n ) {\n const num = Number(s);\n if (Number.isFinite(num)) {\n return num;\n }\n }\n return null;\n}\n\nfunction coerceStringValue(\n value: string,\n schemaType: string | undefined,\n u: Record<string, unknown>\n): unknown {\n const s = value.trim();\n\n if (schemaType === \"object\") {\n const result = coerceStringToObject(s, u);\n if (result !== null) {\n return result;\n }\n }\n\n if (schemaType === \"array\") {\n const result = coerceStringToArray(s, u);\n if (result !== null) {\n return result;\n }\n }\n\n const primitiveResult = coerceStringToPrimitive(s, schemaType);\n if (primitiveResult !== null) {\n return primitiveResult;\n }\n\n return value;\n}\n\nfunction coerceArrayValue(\n value: unknown,\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown {\n if (Array.isArray(value)) {\n return coerceArrayToArray(value, prefixItems, itemsSchema);\n }\n\n if (value && typeof value === \"object\") {\n const result = coerceObjectToArray(\n value as Record<string, unknown>,\n prefixItems,\n itemsSchema\n );\n if (result !== null) {\n return result;\n }\n // To prevent infinite recursion, check if the itemsSchema is also for an array.\n // If so, just wrap the object. Otherwise, coerce it against the itemsSchema.\n if (getSchemaType(itemsSchema) === \"array\") {\n return [value];\n }\n return [coerceBySchema(value, itemsSchema)];\n }\n\n if (\n value == null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return coercePrimitiveToArray(value, prefixItems, itemsSchema);\n }\n\n return [value];\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 return coerceStringWithoutSchema(value);\n }\n return value;\n }\n\n const schemaType = getSchemaType(unwrapped);\n const u = unwrapped as Record<string, unknown>;\n\n // Handle string values\n if (typeof value === \"string\") {\n return coerceStringValue(value, schemaType, u);\n }\n\n // Handle object to object coercion\n if (\n schemaType === \"object\" &&\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n return coerceObjectToObject(value as Record<string, unknown>, u);\n }\n\n // Handle array coercion\n if (schemaType === \"array\") {\n const prefixItems = Array.isArray(u.prefixItems)\n ? (u.prefixItems as unknown[])\n : undefined;\n const itemsSchema = u.items as unknown;\n\n return coerceArrayValue(value, prefixItems, itemsSchema);\n }\n\n return value;\n}\n","/**\n * Schema-aware type coercion for robust-xml\n * Integrates with the existing coercion system but adds XML-specific handling\n */\n\nimport {\n coerceBySchema as baseCoerceBySchema,\n getSchemaType,\n unwrapJsonSchema,\n} from \"../../schema-coerce\";\nimport type { RXMLNode } from \"../core/types\";\nimport { RXMLCoercionError } from \"../errors/types\";\n\n/**\n * Get property schema from a parent schema\n */\nexport function getPropertySchema(toolSchema: unknown, key: string): unknown {\n const unwrapped = unwrapJsonSchema(toolSchema);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n return;\n }\n const u = unwrapped as Record<string, unknown>;\n const props = u.properties as Record<string, unknown> | undefined;\n if (props && Object.hasOwn(props, key)) {\n return (props as Record<string, unknown>)[key];\n }\n return;\n}\n\n/**\n * Get node value from children\n */\nfunction getNodeValue(\n children: (RXMLNode | string)[],\n schema: unknown,\n tagName: string,\n textNodeName: string\n): unknown {\n if (children.length === 0) {\n return \"\";\n }\n if (children.length === 1 && typeof children[0] === \"string\") {\n return children[0];\n }\n return processComplexContent(\n children,\n getPropertySchema(schema, tagName),\n textNodeName\n );\n}\n\n/**\n * Add attributes to value\n */\nfunction addAttributesToValue(\n value: unknown,\n attributes: Record<string, string | null>,\n textNodeName: string\n): unknown {\n if (Object.keys(attributes).length === 0) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const valueResult: Record<string, unknown> = { [textNodeName]: value };\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n valueResult[`@_${attrName}`] = attrValue;\n }\n return valueResult;\n }\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n (value as Record<string, unknown>)[`@_${attrName}`] = attrValue;\n }\n }\n\n return value;\n}\n\n/**\n * Add value to result, handling duplicates\n */\nfunction addToResult(\n result: Record<string, unknown>,\n tagName: string,\n value: unknown\n): void {\n if (result[tagName]) {\n if (!Array.isArray(result[tagName])) {\n result[tagName] = [result[tagName]];\n }\n (result[tagName] as unknown[]).push(value);\n } else {\n result[tagName] = value;\n }\n}\n\n/**\n * Convert TXML-style DOM to flat object structure for schema coercion\n */\nexport function domToObject(\n nodes: (RXMLNode | string)[],\n schema: unknown,\n textNodeName = \"#text\"\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const node of nodes) {\n if (typeof node === \"string\") {\n continue;\n }\n\n const { tagName, children, attributes } = node;\n let value = getNodeValue(children, schema, tagName, textNodeName);\n value = addAttributesToValue(value, attributes, textNodeName);\n addToResult(result, tagName, value);\n }\n\n return result;\n}\n\n/**\n * Process child element node\n */\nfunction processChildElement(\n child: RXMLNode,\n schema: unknown,\n textNodeName: string\n): unknown {\n let childValue: unknown;\n\n if (child.children.length === 0) {\n childValue = \"\";\n } else if (\n child.children.length === 1 &&\n typeof child.children[0] === \"string\"\n ) {\n childValue = child.children[0];\n } else {\n childValue = processComplexContent(\n child.children,\n getPropertySchema(schema, child.tagName),\n textNodeName\n );\n }\n\n return addAttributesToValue(childValue, child.attributes, textNodeName);\n}\n\n/**\n * Combine text and elements into result\n */\nfunction combineContent(\n textContent: string[],\n elements: Record<string, unknown>,\n textNodeName: string\n): unknown {\n const hasText = textContent.length > 0;\n const hasElements = Object.keys(elements).length > 0;\n\n if (hasText && hasElements) {\n return {\n [textNodeName]: textContent.join(\"\").trim(),\n ...elements,\n };\n }\n\n if (hasText) {\n return textContent.join(\"\").trim();\n }\n\n if (hasElements) {\n return elements;\n }\n\n return \"\";\n}\n\n/**\n * Process complex content (mixed text and elements)\n */\nfunction processComplexContent(\n children: (RXMLNode | string)[],\n schema: unknown,\n textNodeName: string\n): unknown {\n const textContent: string[] = [];\n const elements: Record<string, unknown> = {};\n\n for (const child of children) {\n if (typeof child === \"string\") {\n textContent.push(child);\n } else {\n const childValue = processChildElement(child, schema, textNodeName);\n addToResult(elements, child.tagName, childValue);\n }\n }\n\n return combineContent(textContent, elements, textNodeName);\n}\n\n/**\n * Coerce DOM object using schema information\n */\nexport function coerceDomBySchema(\n domObject: Record<string, unknown>,\n schema: unknown\n): Record<string, unknown> {\n try {\n return baseCoerceBySchema(domObject, schema) as Record<string, unknown>;\n } catch (error) {\n throw new RXMLCoercionError(\"Failed to coerce DOM object by schema\", error);\n }\n}\n\n/**\n * Visit object schema properties\n */\nfunction visitObjectProperties(\n props: Record<string, unknown>,\n collected: Set<string>,\n visit: (s: unknown) => void\n): void {\n for (const [key, propSchema] of Object.entries(props)) {\n const t = getSchemaType(propSchema);\n if (t === \"string\") {\n collected.add(key);\n } else if (t === \"object\" || t === \"array\") {\n visit(propSchema);\n }\n }\n}\n\n/**\n * Visit array schema items\n */\nfunction visitArrayItems(\n u: Record<string, unknown>,\n visit: (s: unknown) => void\n): void {\n const items = u.items as unknown;\n if (items) {\n visit(items);\n }\n const prefix = u.prefixItems as unknown[] | undefined;\n if (Array.isArray(prefix)) {\n for (const item of prefix) {\n visit(item);\n }\n }\n}\n\n/**\n * Extract string-typed property names from schema\n */\nexport function getStringTypedProperties(schema: unknown): Set<string> {\n const collected = new Set<string>();\n\n const visit = (s: unknown): void => {\n const unwrapped = unwrapJsonSchema(s);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n return;\n }\n const u = unwrapped as Record<string, unknown>;\n const type = getSchemaType(unwrapped);\n\n if (type === \"object\") {\n const props = u.properties as Record<string, unknown> | undefined;\n if (props && typeof props === \"object\") {\n visitObjectProperties(props, collected, visit);\n }\n } else if (type === \"array\") {\n visitArrayItems(u, visit);\n }\n };\n\n visit(schema);\n return collected;\n}\n\n/**\n * Process array-like structures from XML\n */\nexport function processArrayContent(\n value: unknown,\n schema: unknown,\n textNodeName: string\n): unknown {\n if (!Array.isArray(value)) {\n return value;\n }\n\n const schemaType = getSchemaType(schema);\n\n if (schemaType === \"string\") {\n // For string arrays, extract text content and take first item for duplicates\n return value.map((item) => {\n if (typeof item === \"string\") {\n return item.trim();\n }\n if (item && typeof item === \"object\" && textNodeName in item) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal.trim() : String(textVal);\n }\n return String(item);\n });\n }\n\n // For other types, process each item\n return value.map((item) => {\n if (typeof item === \"string\") {\n return item.trim();\n }\n if (item && typeof item === \"object\" && textNodeName in item) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal.trim() : textVal;\n }\n return item;\n });\n}\n\n/**\n * Handle indexed tuple structures (elements with numeric keys)\n */\nexport function processIndexedTuple(\n obj: Record<string, unknown>,\n textNodeName: string\n): unknown[] {\n const keys = Object.keys(obj);\n const indices = keys.map((k) => Number.parseInt(k, 10)).sort((a, b) => a - b);\n const isValidTuple =\n indices[0] === 0 && indices.every((val, idx) => val === idx);\n\n if (!isValidTuple) {\n return [obj];\n }\n\n const sortedKeys = keys.sort(\n (a, b) => Number.parseInt(a, 10) - Number.parseInt(b, 10)\n );\n return sortedKeys.map((key) => {\n const item = obj[key];\n if (item && typeof item === \"object\" && textNodeName in item) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal.trim() : textVal;\n }\n return typeof item === \"string\" ? item.trim() : item;\n });\n}\n","/**\n * Raw content extraction utilities for string-typed properties\n * This replaces the string-based extraction with DOM-based extraction\n */\n\nimport type { RXMLNode } from \"../core/types\";\nimport {\n isNameChar,\n isNameStartChar,\n parseName,\n skipQuoted,\n} from \"../utils/helpers\";\n\n/**\n * Helper to skip DOCTYPE declarations\n */\nfunction skipDoctype(xmlContent: string, i: number, len: number): number {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n}\n\n/**\n * Helper to skip comments\n */\nfunction skipComment(xmlContent: string, i: number, len: number): number {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n return close === -1 ? len : close + 3;\n}\n\n/**\n * Helper to skip CDATA sections\n */\nfunction skipCdata(xmlContent: string, i: number, len: number): number {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n return close === -1 ? len : close + 3;\n}\n\n/**\n * Helper to skip processing instructions\n */\nfunction skipProcessingInstruction(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n return close === -1 ? len : close + 2;\n}\n\n/**\n * Helper to skip special XML constructs (comments, CDATA, DOCTYPE, processing instructions)\n * Returns the new position after the construct, or -1 if not a special construct\n */\nfunction skipSpecialConstruct(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const ch = xmlContent[i];\n\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!DOCTYPE\", i + 1)) {\n return skipDoctype(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n return skipComment(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n return skipCdata(xmlContent, i, len);\n }\n // Other declarations\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n }\n\n if (ch === \"?\") {\n return skipProcessingInstruction(xmlContent, i, len);\n }\n\n return -1;\n}\n\n/**\n * Parse tag name starting at position i\n * Returns the tag name and position after the name\n */\nfunction parseTagName(\n xmlContent: string,\n i: number,\n len: number\n): { name: string; pos: number } {\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j += 1;\n while (j < len && isNameChar(xmlContent[j])) {\n j += 1;\n }\n }\n return { name: xmlContent.slice(i, j), pos: j };\n}\n\n/**\n * Skip to the end of a tag (finding the closing > or />)\n * Returns { pos: position after >, isSelfClosing: boolean }\n */\nfunction skipToTagEnd(\n xmlContent: string,\n start: number,\n len: number\n): { pos: number; isSelfClosing: boolean } {\n let k = start;\n let isSelfClosing = false;\n\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 += 1;\n break;\n }\n k += 1;\n }\n\n return { pos: k, isSelfClosing };\n}\n\n/**\n * Helper to process closing tag in findMatchingCloseTag\n */\nfunction processClosingTagMatch(options: {\n xmlContent: string;\n nx: number;\n len: number;\n tagName: string;\n depth: number;\n nextLt: number;\n}): { newPos: number; newDepth: number; found: boolean } {\n const { xmlContent, nx, len, tagName, depth, nextLt } = options;\n const tagInfo = parseTagName(xmlContent, nx + 1, len);\n const gt = xmlContent.indexOf(\">\", tagInfo.pos);\n\n if (tagInfo.name === tagName) {\n const newDepth = depth - 1;\n if (newDepth === 0) {\n return { newPos: nextLt, newDepth, found: true };\n }\n return { newPos: gt === -1 ? len : gt + 1, newDepth, found: false };\n }\n\n return { newPos: gt === -1 ? len : gt + 1, newDepth: depth, found: false };\n}\n\n/**\n * Helper to process opening tag in findMatchingCloseTag\n */\nfunction processOpeningTagMatch(options: {\n xmlContent: string;\n nx: number;\n len: number;\n tagName: string;\n depth: number;\n}): { newPos: number; newDepth: number } {\n const { xmlContent, nx, len, tagName, depth } = options;\n const tagInfo = parseTagName(xmlContent, nx, len);\n const tagEndInfo = skipToTagEnd(xmlContent, tagInfo.pos, len);\n\n const newDepth =\n tagInfo.name === tagName && !tagEndInfo.isSelfClosing ? depth + 1 : depth;\n\n const newPos =\n xmlContent[tagEndInfo.pos] === \">\"\n ? tagEndInfo.pos + 1\n : tagEndInfo.pos + 1;\n\n return { newPos, newDepth };\n}\n\n/**\n * Find the matching closing tag for a given opening tag\n * Returns the position of the start of the closing tag, or -1 if not found\n */\nfunction findMatchingCloseTag(\n xmlContent: string,\n startPos: number,\n tagName: string,\n len: number\n): number {\n let pos = startPos;\n let depth = 1;\n\n while (pos < len) {\n const nextLt = xmlContent.indexOf(\"<\", pos);\n if (nextLt === -1 || nextLt + 1 >= len) {\n break;\n }\n\n const nx = nextLt + 1;\n const h = xmlContent[nx];\n const specialPos = skipSpecialConstruct(xmlContent, nx, len);\n\n if (specialPos !== -1) {\n pos = specialPos;\n continue;\n }\n\n if (h === \"/\") {\n const result = processClosingTagMatch({\n xmlContent,\n nx,\n len,\n tagName,\n depth,\n nextLt,\n });\n if (result.found) {\n return result.newPos;\n }\n pos = result.newPos;\n depth = result.newDepth;\n } else {\n const result = processOpeningTagMatch({\n xmlContent,\n nx,\n len,\n tagName,\n depth,\n });\n pos = result.newPos;\n depth = result.newDepth;\n }\n }\n\n return -1;\n}\n\n/**\n * Helper to update best match if current depth is better\n */\nfunction updateBestMatch(\n depth: number,\n bestDepth: number,\n contentStart: number,\n contentEnd: number\n): { start: number; end: number; depth: number } | null {\n if (depth < bestDepth) {\n return { start: contentStart, end: contentEnd, depth };\n }\n return null;\n}\n\n/**\n * Helper to process target tag match\n */\nfunction processTargetTag(options: {\n xmlContent: string;\n tagEnd: number;\n isSelfClosing: boolean;\n target: string;\n len: number;\n depth: number;\n bestDepth: number;\n}): { start: number; end: number; depth: number } | null {\n const { xmlContent, tagEnd, isSelfClosing, target, len, depth, bestDepth } =\n options;\n const contentStart = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n\n if (isSelfClosing) {\n return updateBestMatch(depth, bestDepth, contentStart, contentStart);\n }\n\n const closePos = findMatchingCloseTag(xmlContent, contentStart, target, len);\n if (closePos !== -1) {\n return updateBestMatch(depth, bestDepth, contentStart, closePos);\n }\n return null;\n}\n\n/**\n * Helper to handle closing tag in extractRawInner\n */\nfunction handleClosingTagInExtract(\n xmlContent: string,\n i: number,\n len: number,\n depth: number\n): { newPos: number; newDepth: number } {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return {\n newPos: gt === -1 ? len : gt + 1,\n newDepth: Math.max(0, depth - 1),\n };\n}\n\n/**\n * Helper to process opening tag in extractRawInner\n */\nfunction processOpeningTagInExtract(options: {\n xmlContent: string;\n i: number;\n len: number;\n target: string;\n depth: number;\n bestDepth: number;\n}): {\n newPos: number;\n newDepth: number;\n bestMatch: { start: number; end: number; depth: number } | null;\n} {\n const { xmlContent, i, len, target, depth, bestDepth } = options;\n const tagInfo = parseTagName(xmlContent, i, len);\n const tagEndInfo = skipToTagEnd(xmlContent, tagInfo.pos, len);\n const tagEnd = tagEndInfo.pos;\n const isSelfClosing = tagEndInfo.isSelfClosing;\n\n let bestMatch: { start: number; end: number; depth: number } | null = null;\n if (tagInfo.name === target) {\n bestMatch = processTargetTag({\n xmlContent,\n tagEnd,\n isSelfClosing,\n target,\n len,\n depth,\n bestDepth,\n });\n }\n\n return {\n newPos: xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1,\n newDepth: depth + (isSelfClosing ? 0 : 1),\n bestMatch,\n };\n}\n\n/**\n * Extract raw inner content from XML string for a specific tag\n * This is used for string-typed properties to preserve exact content\n */\nexport function extractRawInner(\n xmlContent: string,\n tagName: string\n): string | undefined {\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 let i = 0;\n let depth = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1 || lt + 1 >= len) {\n return;\n }\n i = lt + 1;\n\n const ch = xmlContent[i];\n const specialPos = skipSpecialConstruct(xmlContent, i, len);\n if (specialPos !== -1) {\n i = specialPos;\n continue;\n }\n\n if (ch === \"/\") {\n const result = handleClosingTagInExtract(xmlContent, i, len, depth);\n i = result.newPos;\n depth = result.newDepth;\n continue;\n }\n\n const result = processOpeningTagInExtract({\n xmlContent,\n i,\n len,\n target,\n depth,\n bestDepth,\n });\n if (result.bestMatch) {\n bestStart = result.bestMatch.start;\n bestEnd = result.bestMatch.end;\n bestDepth = result.bestMatch.depth;\n }\n i = result.newPos;\n depth = result.newDepth;\n }\n\n if (bestStart !== -1) {\n return xmlContent.slice(bestStart, bestEnd);\n }\n return;\n}\n\n/**\n * Helper to process opening tag and add range if it's a target\n */\nfunction processOpeningTag(options: {\n xmlContent: string;\n tagEnd: number;\n isSelfClosing: boolean;\n target: string;\n len: number;\n ranges: Array<{ start: number; end: number }>;\n}): number {\n const { xmlContent, tagEnd, isSelfClosing, target, len, ranges } = options;\n const contentStart = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n\n if (isSelfClosing) {\n ranges.push({ start: contentStart, end: contentStart });\n return contentStart;\n }\n\n const closePos = findMatchingCloseTag(xmlContent, contentStart, target, len);\n if (closePos !== -1) {\n ranges.push({ start: contentStart, end: closePos });\n const gt = xmlContent.indexOf(\">\", closePos);\n return gt === -1 ? len : gt + 1;\n }\n\n // Unmatched tag\n return -1;\n}\n\n/**\n * Helper to handle closing tag in findAllInnerRanges\n */\nfunction handleClosingTagInFindAll(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n}\n\n/**\n * Find all inner content ranges for a given tag name at any depth.\n * Returns ranges for the inner content between <tagName ...> and </tagName>.\n */\nexport function findAllInnerRanges(\n xmlContent: string,\n tagName: string\n): Array<{ start: number; end: number }> {\n const len = xmlContent.length;\n const target = tagName;\n const ranges: Array<{ start: number; end: number }> = [];\n\n let i = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1 || lt + 1 >= len) {\n break;\n }\n i = lt + 1;\n\n const ch = xmlContent[i];\n const specialPos = skipSpecialConstruct(xmlContent, i, len);\n if (specialPos !== -1) {\n i = specialPos;\n continue;\n }\n\n if (ch === \"/\") {\n i = handleClosingTagInFindAll(xmlContent, i, len);\n continue;\n }\n\n // Opening tag\n const tagInfo = parseTagName(xmlContent, i, len);\n const tagEndInfo = skipToTagEnd(xmlContent, tagInfo.pos, len);\n const tagEnd = tagEndInfo.pos;\n const isSelfClosing = tagEndInfo.isSelfClosing;\n\n if (tagInfo.name !== target) {\n // Advance over this tag\n i = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n continue;\n }\n\n // Found a target start tag\n const nextPos = processOpeningTag({\n xmlContent,\n tagEnd,\n isSelfClosing,\n target,\n len,\n ranges,\n });\n if (nextPos === -1) {\n // Unmatched tag, stop to avoid infinite loops\n break;\n }\n i = nextPos;\n }\n\n return ranges;\n}\n\n/**\n * Helper to find range for top-level target tag\n */\nfunction findTopLevelTargetRange(options: {\n xmlContent: string;\n tagEnd: number;\n isSelfClosing: boolean;\n target: string;\n len: number;\n}): { start: number; end: number } | undefined {\n const { xmlContent, tagEnd, isSelfClosing, target, len } = options;\n const contentStart = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n\n if (isSelfClosing) {\n return { start: contentStart, end: contentStart };\n }\n\n const closePos = findMatchingCloseTag(xmlContent, contentStart, target, len);\n if (closePos !== -1) {\n return { start: contentStart, end: closePos };\n }\n return;\n}\n\n/**\n * Helper to handle closing tag in findFirstTopLevelRange\n */\nfunction handleClosingTagInFindFirst(\n xmlContent: string,\n i: number,\n len: number,\n depth: number\n): { newPos: number; newDepth: number } {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return {\n newPos: gt === -1 ? len : gt + 1,\n newDepth: Math.max(0, depth - 1),\n };\n}\n\n/**\n * Find the first top-level range for a tag\n */\nexport function findFirstTopLevelRange(\n xmlContent: string,\n tagName: string\n): { start: number; end: number } | undefined {\n const len = xmlContent.length;\n const target = tagName;\n\n let i = 0;\n let depth = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1 || lt + 1 >= len) {\n return;\n }\n i = lt + 1;\n\n const ch = xmlContent[i];\n const specialPos = skipSpecialConstruct(xmlContent, i, len);\n if (specialPos !== -1) {\n i = specialPos;\n continue;\n }\n\n if (ch === \"/\") {\n const result = handleClosingTagInFindFirst(xmlContent, i, len, depth);\n i = result.newPos;\n depth = result.newDepth;\n continue;\n }\n\n const tagInfo = parseTagName(xmlContent, i, len);\n const tagEndInfo = skipToTagEnd(xmlContent, tagInfo.pos, len);\n const tagEnd = tagEndInfo.pos;\n const isSelfClosing = tagEndInfo.isSelfClosing;\n\n if (depth === 0 && tagInfo.name === target) {\n return findTopLevelTargetRange({\n xmlContent,\n tagEnd,\n isSelfClosing,\n target,\n len,\n });\n }\n i = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n depth += isSelfClosing ? 0 : 1;\n }\n return;\n}\n\n/**\n * Helper to check if position is in excluded ranges\n */\nfunction isPositionExcluded(\n pos: number,\n excludeRanges?: Array<{ start: number; end: number }>\n): boolean {\n if (!excludeRanges || excludeRanges.length === 0) {\n return false;\n }\n for (const r of excludeRanges) {\n if (pos >= r.start && pos < r.end) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Helper to skip comment in counting\n */\nfunction skipCommentInCounting(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n return close === -1 ? len : close + 3;\n}\n\n/**\n * Helper to skip CDATA in counting\n */\nfunction skipCdataInCounting(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n return close === -1 ? len : close + 3;\n}\n\n/**\n * Helper to handle special constructs in counting\n */\nfunction skipSpecialInCounting(\n xmlContent: string,\n ch: string,\n i: number,\n len: number\n): number {\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n return skipCommentInCounting(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n return skipCdataInCounting(xmlContent, i, len);\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n }\n if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n return close === -1 ? len : close + 2;\n }\n if (ch === \"/\") {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n }\n return -1;\n}\n\n/**\n * Helper to parse and count opening tag\n */\nfunction parseAndCountTag(options: {\n xmlContent: string;\n i: number;\n len: number;\n target: string;\n lt: number;\n excludeRanges?: Array<{ start: number; end: number }>;\n}): { nextPos: number; shouldCount: boolean } {\n const { xmlContent, i, len, target, lt, excludeRanges } = options;\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j += 1;\n while (j < len && isNameChar(xmlContent[j])) {\n j += 1;\n }\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 === \">\") {\n break;\n }\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n k += 1;\n break;\n }\n k += 1;\n }\n const shouldCount = name === target && !isPositionExcluded(lt, excludeRanges);\n return { nextPos: k + 1, shouldCount };\n}\n\n/**\n * Count tag occurrences, excluding specified ranges\n */\nexport function countTagOccurrences(\n xmlContent: string,\n tagName: string,\n excludeRanges?: Array<{ start: number; end: number }>,\n shouldSkipFirst = true\n): number {\n const len = xmlContent.length;\n const target = tagName;\n\n let i = 0;\n let count = 0;\n let skipFirstLocal = shouldSkipFirst;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1) {\n break;\n }\n i = lt + 1;\n if (i >= len) {\n break;\n }\n\n const ch = xmlContent[i];\n const skipPos = skipSpecialInCounting(xmlContent, ch, i, len);\n if (skipPos !== -1) {\n i = skipPos;\n continue;\n }\n\n const result = parseAndCountTag({\n xmlContent,\n i,\n len,\n target,\n lt,\n excludeRanges,\n });\n if (result.shouldCount) {\n if (skipFirstLocal) {\n skipFirstLocal = false;\n } else {\n count += 1;\n }\n }\n i = result.nextPos;\n }\n\n return count;\n}\n\n/**\n * Helper to skip attributes and find tag end position\n */\nfunction skipAttributes(xmlContent: string, i: number, len: number): number {\n let k = i;\n while (k < len && xmlContent[k] !== \">\") {\n const c = xmlContent[k];\n if (c === '\"' || c === \"'\") {\n k = skipQuoted(xmlContent, k);\n continue;\n }\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n k += 1;\n break;\n }\n k += 1;\n }\n return k;\n}\n\n/**\n * Helper to update depth for closing tag\n */\nfunction updateDepthForClosingTag(\n xmlContent: string,\n nextLt: number,\n target: string,\n closeDepth: number\n): number {\n const { name: closeName } = parseName(xmlContent, nextLt + 2);\n return closeName === target ? closeDepth - 1 : closeDepth;\n}\n\n/**\n * Helper to update depth for opening tag\n */\nfunction updateDepthForOpeningTag(\n xmlContent: string,\n nextLt: number,\n target: string,\n closeDepth: number\n): number {\n const { name: openName } = parseName(xmlContent, nextLt + 1);\n return openName === target ? closeDepth + 1 : closeDepth;\n}\n\n/**\n * Helper to find closing tag for top-level range\n */\nfunction findClosingTagForRange(\n xmlContent: string,\n k: number,\n len: number,\n target: string\n): number {\n let closeDepth = 1;\n let j = k + 1;\n\n while (j < len && closeDepth > 0) {\n const nextLt = xmlContent.indexOf(\"<\", j);\n if (nextLt === -1) {\n break;\n }\n\n if (xmlContent[nextLt + 1] === \"/\") {\n closeDepth = updateDepthForClosingTag(\n xmlContent,\n nextLt,\n target,\n closeDepth\n );\n } else if (\n xmlContent[nextLt + 1] !== \"!\" &&\n xmlContent[nextLt + 1] !== \"?\"\n ) {\n closeDepth = updateDepthForOpeningTag(\n xmlContent,\n nextLt,\n target,\n closeDepth\n );\n }\n\n j = xmlContent.indexOf(\">\", nextLt + 1);\n if (j === -1) {\n break;\n }\n j += 1;\n }\n\n return closeDepth === 0 ? j : -1;\n}\n\n/**\n * Helper to process top-level target tag\n */\nfunction processTopLevelTarget(options: {\n xmlContent: string;\n tagStart: number;\n k: number;\n len: number;\n target: string;\n ranges: Array<{ start: number; end: number }>;\n}): { newDepth: number } {\n const { xmlContent, tagStart, k, len, target, ranges } = options;\n const isSelfClosing = xmlContent[k] === \"/\" || xmlContent.startsWith(\"/>\", k);\n\n if (isSelfClosing) {\n ranges.push({\n start: tagStart,\n end: k + (xmlContent[k] === \"/\" ? 2 : 1),\n });\n return { newDepth: 0 };\n }\n\n const endPos = findClosingTagForRange(xmlContent, k, len, target);\n if (endPos !== -1) {\n ranges.push({ start: tagStart, end: endPos });\n }\n return { newDepth: 0 };\n}\n\n/**\n * Helper to skip DOCTYPE declaration\n */\nfunction skipDoctypeInSpecial(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n}\n\n/**\n * Helper to handle special constructs for top-level ranges\n */\nfunction handleSpecialConstructs(\n xmlContent: string,\n ch: string,\n i: number,\n len: number\n): number {\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!DOCTYPE\", i + 1)) {\n return skipDoctypeInSpecial(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n return skipCommentInCounting(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n return skipCdataInCounting(xmlContent, i, len);\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n }\n if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n return close === -1 ? len : close + 2;\n }\n return -1;\n}\n\n/**\n * Helper to handle closing tag in findAllTopLevelRanges\n */\nfunction handleClosingTagInFindAllTop(\n xmlContent: string,\n i: number,\n target: string,\n depth: number\n): { newPos: number; newDepth: number } {\n const { name: closingName, newPos: closingPos } = parseName(\n xmlContent,\n i + 1\n );\n const newDepth = closingName === target ? depth - 1 : depth;\n const gt = xmlContent.indexOf(\">\", closingPos);\n return {\n newPos: gt === -1 ? -1 : gt + 1,\n newDepth,\n };\n}\n\n/**\n * Find all top-level ranges for a tag (for handling duplicates)\n */\nexport function findAllTopLevelRanges(\n xmlContent: string,\n tagName: string\n): Array<{ start: number; end: number }> {\n const ranges: Array<{ start: number; end: number }> = [];\n const len = xmlContent.length;\n const target = tagName;\n let i = 0;\n let depth = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1 || lt + 1 >= len) {\n break;\n }\n i = lt + 1;\n\n const ch = xmlContent[i];\n const specialPos = handleSpecialConstructs(xmlContent, ch, i, len);\n if (specialPos !== -1) {\n i = specialPos;\n continue;\n }\n\n if (ch === \"/\") {\n const result = handleClosingTagInFindAllTop(xmlContent, i, target, depth);\n if (result.newPos === -1) {\n break;\n }\n i = result.newPos;\n depth = result.newDepth;\n continue;\n }\n\n // Opening tag\n const { name, newPos } = parseName(xmlContent, i);\n i = newPos;\n\n const k = skipAttributes(xmlContent, i, len);\n\n if (name === target && depth === 0) {\n depth += 1;\n const result = processTopLevelTarget({\n xmlContent,\n tagStart: lt,\n k,\n len,\n target,\n ranges,\n });\n depth += result.newDepth;\n }\n\n i = k + 1;\n }\n\n return ranges;\n}\n\n/**\n * Extract raw content from DOM node\n */\nexport function extractRawFromNode(node: RXMLNode): string {\n if (node.children.length === 0) {\n return \"\";\n }\n if (node.children.length === 1 && typeof node.children[0] === \"string\") {\n return node.children[0];\n }\n\n // For complex content, concatenate all text nodes\n let result = \"\";\n for (const child of node.children) {\n if (typeof child === \"string\") {\n result += child;\n } else {\n result += extractRawFromNode(child);\n }\n }\n return result;\n}\n","/**\n * XML Tokenizer based on TXML's character-by-character parsing approach\n * with enhanced error tolerance and schema awareness\n */\n\nimport { RXMLParseError } from \"../errors/types\";\nimport { getLineColumn, parseName, parseString } from \"../utils/helpers\";\nimport type { ParseOptions, RXMLNode } from \"./types\";\nimport { CharCodes, DEFAULT_NO_CHILD_NODES } from \"./types\";\n\nexport class XMLTokenizer {\n private pos = 0;\n private readonly xmlString: string;\n private readonly options: ParseOptions;\n\n constructor(xmlString: string, options: ParseOptions = {}) {\n this.xmlString = xmlString;\n this.options = {\n keepComments: false,\n keepWhitespace: false,\n noChildNodes: DEFAULT_NO_CHILD_NODES.slice(),\n textNodeName: \"#text\",\n throwOnDuplicateStringTags: true,\n ...options,\n };\n this.pos = options.pos || 0;\n }\n\n /**\n * Handle closing tag parsing\n */\n private handleClosingTag(\n tagName: string | undefined,\n children: (RXMLNode | string)[]\n ): (RXMLNode | string)[] | null {\n const closeStart = this.pos + 2;\n this.pos = this.xmlString.indexOf(\">\", this.pos);\n\n const closeTag = this.xmlString.substring(closeStart, this.pos);\n if (tagName && closeTag.trim() !== tagName) {\n const { line, column } = getLineColumn(this.xmlString, this.pos);\n throw new RXMLParseError(\n `Unexpected close tag at line ${line}, column ${column}. Expected </${tagName}>, found </${closeTag}>`,\n undefined,\n line,\n column\n );\n }\n\n if (this.pos !== -1) {\n this.pos += 1;\n }\n return children;\n }\n\n /**\n * Check if we're at end of string and should throw unclosed tag error\n */\n private checkUnclosedTag(\n tagName: string | undefined,\n consumedToEnd: boolean\n ): void {\n if (tagName && this.pos >= this.xmlString.length && !consumedToEnd) {\n const { line, column } = getLineColumn(this.xmlString, this.pos - 1);\n throw new RXMLParseError(\n `Unclosed tag at line ${line}, column ${column}. Expected closing tag </${tagName}>`,\n undefined,\n line,\n column\n );\n }\n }\n\n /**\n * Process special content (comments, CDATA, DOCTYPE) and track if we consumed to end\n */\n private processSpecialContent(children: (RXMLNode | string)[]): boolean {\n const prevPos = this.pos;\n this.handleSpecialContent(children);\n return this.pos >= this.xmlString.length && prevPos < this.xmlString.length;\n }\n\n /**\n * Handle text content parsing\n */\n private handleTextContent(children: (RXMLNode | string)[]): void {\n const text = this.parseText();\n if (this.options.keepWhitespace) {\n if (text.length > 0) {\n children.push(text);\n }\n } else {\n const trimmed = text.trim();\n if (trimmed.length > 0) {\n children.push(trimmed);\n }\n }\n this.pos += 1;\n }\n\n /**\n * Handle regular element parsing\n */\n private handleRegularElement(children: (RXMLNode | string)[]): void {\n const node = this.parseNode();\n children.push(node);\n\n // Handle processing instructions differently\n if (node.tagName[0] === \"?\") {\n children.push(...node.children);\n node.children = [];\n }\n }\n\n /**\n * Process a single child element based on the current character\n */\n private processSingleChild(\n children: (RXMLNode | string)[],\n tagName: string | undefined\n ): { shouldReturn: boolean; consumedToEnd: boolean } {\n if (this.xmlString.charCodeAt(this.pos) !== CharCodes.OPEN_BRACKET) {\n // Text content\n this.handleTextContent(children);\n return { shouldReturn: false, consumedToEnd: false };\n }\n\n const nextChar = this.xmlString.charCodeAt(this.pos + 1);\n\n if (nextChar === CharCodes.SLASH) {\n // Closing tag\n const result = this.handleClosingTag(tagName, children);\n if (result !== null) {\n return { shouldReturn: true, consumedToEnd: false };\n }\n return { shouldReturn: false, consumedToEnd: false };\n }\n\n if (nextChar === CharCodes.EXCLAMATION) {\n // Comment, CDATA, or DOCTYPE\n const wasConsumedToEnd = this.processSpecialContent(children);\n return { shouldReturn: false, consumedToEnd: wasConsumedToEnd };\n }\n\n // Regular element\n this.handleRegularElement(children);\n return { shouldReturn: false, consumedToEnd: false };\n }\n\n /**\n * Parse XML children recursively\n */\n parseChildren(tagName?: string): (RXMLNode | string)[] {\n const children: (RXMLNode | string)[] = [];\n let consumedToEnd = false;\n\n while (this.xmlString[this.pos]) {\n const result = this.processSingleChild(children, tagName);\n if (result.shouldReturn) {\n return children;\n }\n if (result.consumedToEnd) {\n consumedToEnd = true;\n }\n }\n\n // Check for unclosed tags\n this.checkUnclosedTag(tagName, consumedToEnd);\n\n return children;\n }\n\n /**\n * Check if character is whitespace\n */\n private isWhitespace(code: number): boolean {\n return (\n code === CharCodes.SPACE ||\n code === CharCodes.TAB ||\n code === CharCodes.NEWLINE ||\n code === CharCodes.CARRIAGE_RETURN\n );\n }\n\n /**\n * Skip whitespace characters\n */\n private skipWhitespace(): void {\n while (\n this.pos < this.xmlString.length &&\n this.isWhitespace(this.xmlString.charCodeAt(this.pos))\n ) {\n this.pos += 1;\n }\n }\n\n /**\n * Parse attribute value\n */\n private parseAttributeValue(): string | null {\n if (this.pos >= this.xmlString.length || this.xmlString[this.pos] !== \"=\") {\n return null;\n }\n\n this.pos += 1; // Skip =\n this.skipWhitespace();\n\n const code = this.xmlString.charCodeAt(this.pos);\n if (code === CharCodes.SINGLE_QUOTE || code === CharCodes.DOUBLE_QUOTE) {\n const { value: parsedValue, newPos: valueEnd } = parseString(\n this.xmlString,\n this.pos\n );\n this.pos = valueEnd;\n return parsedValue;\n }\n\n return null;\n }\n\n /**\n * Parse single attribute\n */\n private parseAttribute(attributes: Record<string, string | null>): void {\n const { name: attrName, newPos: nameEnd } = parseName(\n this.xmlString,\n this.pos\n );\n this.pos = nameEnd;\n this.skipWhitespace();\n\n const value = this.parseAttributeValue();\n attributes[attrName] = value;\n }\n\n /**\n * Parse all attributes\n */\n private parseAttributes(): Record<string, string | null> {\n const attributes: Record<string, string | null> = {};\n\n while (\n this.xmlString.charCodeAt(this.pos) !== CharCodes.CLOSE_BRACKET &&\n this.xmlString[this.pos]\n ) {\n const c = this.xmlString.charCodeAt(this.pos);\n\n if (this.isWhitespace(c)) {\n this.pos += 1;\n continue;\n }\n\n if ((c > 64 && c < 91) || (c > 96 && c < 123)) {\n this.parseAttribute(attributes);\n } else {\n this.pos += 1;\n }\n }\n\n return attributes;\n }\n\n /**\n * Parse special tag content (script, style)\n */\n private parseSpecialTagContent(\n _tagName: string,\n closingTag: string\n ): (RXMLNode | string)[] {\n const start = this.pos + 1;\n this.pos = this.xmlString.indexOf(closingTag, this.pos);\n\n if (this.pos === -1) {\n const children = [this.xmlString.slice(start)];\n this.pos = this.xmlString.length;\n return children;\n }\n\n const children = [this.xmlString.slice(start, this.pos)];\n this.pos += closingTag.length;\n return children;\n }\n\n /**\n * Parse node children based on tag type\n */\n private parseNodeChildren(\n tagName: string,\n isSelfClosing: boolean\n ): (RXMLNode | string)[] {\n if (isSelfClosing) {\n this.pos += 1;\n return [];\n }\n\n if (tagName === \"script\") {\n return this.parseSpecialTagContent(tagName, \"</script>\");\n }\n\n if (tagName === \"style\") {\n return this.parseSpecialTagContent(tagName, \"</style>\");\n }\n\n if (this.options.noChildNodes?.indexOf(tagName) === -1) {\n this.pos += 1;\n return this.parseChildren(tagName);\n }\n\n // Tag is in noChildNodes\n this.pos += 1;\n if ((DEFAULT_NO_CHILD_NODES as readonly string[]).includes(tagName)) {\n return [];\n }\n\n // Custom noChildNodes tags might have closing tags to skip\n const closingTag = `</${tagName}>`;\n const closingPos = this.xmlString.indexOf(closingTag, this.pos);\n if (closingPos !== -1) {\n this.pos = closingPos + closingTag.length;\n }\n\n return [];\n }\n\n /**\n * Parse a single XML node\n */\n parseNode(): RXMLNode {\n this.pos += 1; // Skip opening <\n\n const { name: tagName, newPos } = parseName(this.xmlString, this.pos);\n this.pos = newPos;\n\n const attributes = this.parseAttributes();\n\n // Check for self-closing tag or processing instruction\n const isSelfClosing =\n this.xmlString.charCodeAt(this.pos - 1) === CharCodes.SLASH ||\n (tagName[0] === \"?\" &&\n this.xmlString.charCodeAt(this.pos - 1) === CharCodes.QUESTION);\n\n const children = this.parseNodeChildren(tagName, isSelfClosing);\n\n return { tagName, attributes, children };\n }\n\n /**\n * Parse text content until next tag\n */\n private parseText(): string {\n const start = this.pos;\n this.pos = this.xmlString.indexOf(\"<\", this.pos) - 1;\n if (this.pos === -2) {\n this.pos = this.xmlString.length;\n }\n return this.xmlString.slice(start, this.pos + 1);\n }\n\n /**\n * Handle comments, CDATA, and DOCTYPE declarations\n */\n private handleSpecialContent(children: (RXMLNode | string)[]): void {\n if (this.xmlString.charCodeAt(this.pos + 2) === CharCodes.MINUS) {\n // Comment\n this.handleComment(children);\n } else if (\n this.xmlString.charCodeAt(this.pos + 2) ===\n CharCodes.OPEN_CORNER_BRACKET &&\n this.xmlString.charCodeAt(this.pos + 8) ===\n CharCodes.OPEN_CORNER_BRACKET &&\n this.xmlString.substr(this.pos + 3, 5).toLowerCase() === \"cdata\"\n ) {\n // CDATA\n this.handleCData(children);\n } else {\n // DOCTYPE or other declaration\n this.handleDoctype(children);\n }\n }\n\n /**\n * Handle XML comments\n */\n private handleComment(children: (RXMLNode | string)[]): void {\n const startCommentPos = this.pos;\n\n // Find comment end\n while (\n this.pos !== -1 &&\n !(\n this.xmlString.charCodeAt(this.pos) === CharCodes.CLOSE_BRACKET &&\n this.xmlString.charCodeAt(this.pos - 1) === CharCodes.MINUS &&\n this.xmlString.charCodeAt(this.pos - 2) === CharCodes.MINUS\n )\n ) {\n this.pos = this.xmlString.indexOf(\">\", this.pos + 1);\n }\n\n if (this.pos === -1) {\n this.pos = this.xmlString.length;\n }\n\n if (this.options.keepComments) {\n children.push(this.xmlString.substring(startCommentPos, this.pos + 1));\n }\n\n this.pos += 1;\n }\n\n /**\n * Handle CDATA sections\n */\n private handleCData(children: (RXMLNode | string)[]): void {\n const cdataEndIndex = this.xmlString.indexOf(\"]]>\", this.pos);\n if (cdataEndIndex === -1) {\n // Unclosed CDATA - consume everything to the end\n children.push(this.xmlString.substr(this.pos + 9));\n this.pos = this.xmlString.length;\n } else {\n children.push(this.xmlString.substring(this.pos + 9, cdataEndIndex));\n this.pos = cdataEndIndex + 3;\n }\n }\n\n /**\n * Handle DOCTYPE declarations\n */\n private handleDoctype(children: (RXMLNode | string)[]): void {\n const startDoctype = this.pos + 1;\n this.pos += 2;\n let encapsulated = false;\n\n while (\n (this.xmlString.charCodeAt(this.pos) !== CharCodes.CLOSE_BRACKET ||\n encapsulated) &&\n this.xmlString[this.pos]\n ) {\n if (\n this.xmlString.charCodeAt(this.pos) === CharCodes.OPEN_CORNER_BRACKET\n ) {\n encapsulated = true;\n } else if (\n encapsulated &&\n this.xmlString.charCodeAt(this.pos) === CharCodes.CLOSE_CORNER_BRACKET\n ) {\n encapsulated = false;\n }\n this.pos += 1;\n }\n\n children.push(this.xmlString.substring(startDoctype, this.pos));\n this.pos += 1;\n }\n\n /**\n * Get current position\n */\n getPosition(): number {\n return this.pos;\n }\n\n /**\n * Set position\n */\n setPosition(pos: number): void {\n this.pos = pos;\n }\n}\n","/**\n * Main XML parser that integrates tokenization, schema awareness, and error tolerance\n * This replaces the fast-xml-parser dependency with a TXML-based implementation\n */\n\nimport { getSchemaType, unwrapJsonSchema } from \"../../schema-coerce\";\nimport {\n RXMLCoercionError,\n RXMLDuplicateStringTagError,\n RXMLParseError,\n} from \"../errors/types\";\n\n// Regex constants for performance\nconst WHITESPACE_REGEX = /\\s/;\nconst NUMERIC_STRING_REGEX = /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/;\nconst DIGIT_KEY_REGEX = /^\\d+$/;\n\n/**\n * Extract top-level string-typed properties from a schema\n */\nfunction getTopLevelStringProps(s: unknown): Set<string> {\n const set = new Set<string>();\n const unwrapped = unwrapJsonSchema(s);\n if (unwrapped && typeof unwrapped === \"object\") {\n const props = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n if (props && typeof props === \"object\") {\n for (const [k, v] of Object.entries(props)) {\n if (getSchemaType(v) === \"string\") {\n set.add(k);\n }\n }\n }\n }\n return set;\n}\n\n/**\n * Restore a single string value from placeholder if needed\n */\nfunction restorePlaceholderString(\n val: string,\n placeholderMap: Map<string, string>\n): string {\n if (val.startsWith(\"__RXML_PLACEHOLDER_\")) {\n const orig = placeholderMap.get(val);\n return orig !== undefined ? orig : val;\n }\n return val;\n}\n\n/**\n * Restore placeholders in an object\n */\nfunction restorePlaceholdersInObject(\n obj: Record<string, unknown>,\n _placeholderMap: Map<string, string>,\n textNodeName: string,\n restorer: (val: unknown) => unknown\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n const restored = restorer(v);\n // Trim when restoring into text node field to match tokenizer's default trimming\n if (k === textNodeName && typeof restored === \"string\") {\n out[k] = restored.trim();\n } else {\n out[k] = restored;\n }\n }\n return out;\n}\n\n/**\n * Create a function to restore placeholders deeply in parsed structure\n */\nfunction createPlaceholderRestorer(\n placeholderMap: Map<string, string>,\n textNodeName: string\n): (val: unknown) => unknown {\n const restorer = (val: unknown): unknown => {\n if (val == null) {\n return val;\n }\n if (typeof val === \"string\") {\n return restorePlaceholderString(val, placeholderMap);\n }\n if (Array.isArray(val)) {\n return val.map(restorer);\n }\n if (typeof val === \"object\") {\n return restorePlaceholdersInObject(\n val as Record<string, unknown>,\n placeholderMap,\n textNodeName,\n restorer\n );\n }\n return val;\n };\n return restorer;\n}\n\n/**\n * Convert a value to a number if it matches numeric pattern\n */\nfunction tryConvertToNumber(val: unknown): unknown {\n if (typeof val !== \"string\") {\n return val;\n }\n const trimmed = val.trim();\n if (NUMERIC_STRING_REGEX.test(trimmed)) {\n const num = Number(trimmed);\n if (Number.isFinite(num)) {\n return num;\n }\n }\n return trimmed;\n}\n\n/**\n * Process a single item value, extracting text content and converting numbers\n */\nfunction processItemValue(item: unknown, textNodeName: string): unknown {\n let currentVal: unknown = item;\n if (item && typeof item === \"object\" && Object.hasOwn(item, textNodeName)) {\n currentVal = (item as Record<string, unknown>)[textNodeName];\n }\n const trimmed =\n typeof currentVal === \"string\" ? currentVal.trim() : currentVal;\n return tryConvertToNumber(trimmed);\n}\n\n/**\n * Process item wrapper pattern values\n */\nfunction processItemWrapper(itemValue: unknown, textNodeName: string): unknown {\n if (Array.isArray(itemValue)) {\n return itemValue.map((item) => processItemValue(item, textNodeName));\n }\n const trimmed = typeof itemValue === \"string\" ? itemValue.trim() : itemValue;\n return tryConvertToNumber(trimmed);\n}\n\n/**\n * Check if error should be re-thrown based on error type and XML simplicity\n */\nfunction shouldRethrowParseError(\n error: unknown,\n xmlString: string\n): error is RXMLParseError {\n if (!(error instanceof RXMLParseError)) {\n return false;\n }\n const isSimple = xmlString.split(\"<\").length < 6;\n return (\n (error.message.includes(\"Unexpected close tag\") && isSimple) ||\n (error.message.includes(\"Unclosed tag\") && isSimple)\n );\n}\n\n/**\n * Try to extract partial XML results from malformed XML\n */\nfunction extractPartialXmlResults(\n xmlString: string,\n options: ParseOptions\n): (RXMLNode | string)[] {\n const partialResults: (RXMLNode | string)[] = [];\n const xmlPattern = /<([a-zA-Z_][\\w.-]*)[^>]*>.*?<\\/\\1>/gs;\n let match: RegExpExecArray | null = null;\n\n match = xmlPattern.exec(xmlString);\n while (match !== null) {\n try {\n const elementXml = match[0];\n const tokenizer = new XMLTokenizer(elementXml, options);\n const parsed = tokenizer.parseChildren();\n partialResults.push(...parsed);\n } catch {\n // Ignore parse errors for individual elements\n }\n match = xmlPattern.exec(xmlString);\n }\n\n return partialResults;\n}\n\nimport {\n coerceDomBySchema,\n domToObject,\n getPropertySchema,\n getStringTypedProperties,\n processArrayContent,\n processIndexedTuple,\n} from \"../schema/coercion\";\nimport {\n countTagOccurrences,\n extractRawInner,\n findAllInnerRanges,\n findFirstTopLevelRange,\n} from \"../schema/extraction\";\nimport { unescapeXml } from \"../utils/helpers\";\nimport { XMLTokenizer } from \"./tokenizer\";\nimport type { ParseOptions, RXMLNode } from \"./types\";\n\n// Internal: schema-guided deep XML entity decoding\nfunction deepDecodeStringsBySchema(input: unknown, schema: unknown): unknown {\n if (input == null || schema == null) {\n return input;\n }\n\n const type = getSchemaType(schema);\n\n if (type === \"string\" && typeof input === \"string\") {\n return unescapeXml(input);\n }\n\n if (type === \"array\" && Array.isArray(input)) {\n const unwrapped = unwrapJsonSchema(schema) as\n | { items?: unknown }\n | undefined;\n const itemSchema = unwrapped?.items ?? {};\n return input.map((item) => deepDecodeStringsBySchema(item, itemSchema));\n }\n\n if (type === \"object\" && input && typeof input === \"object\") {\n const obj = input as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n const childSchema = getPropertySchema(schema, key);\n out[key] = deepDecodeStringsBySchema(obj[key], childSchema);\n }\n return out;\n }\n\n // Fallback: decode any string when schema typing is ambiguous/missing\n if (typeof input === \"string\") {\n return unescapeXml(input);\n }\n return input;\n}\n\n/**\n * Parse XML with schema-aware type coercion\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: This function handles complex XML parsing logic that is difficult to break down further without losing clarity\nexport function parse(\n xmlInner: string,\n schema: unknown,\n options: ParseOptions = {}\n): Record<string, unknown> {\n const textNodeName = options.textNodeName ?? \"#text\";\n const throwDup = options.throwOnDuplicateStringTags ?? true;\n\n // If xmlInner looks like a full XML document (single root element), extract its inner content\n // But only if the schema doesn't expect that root element. Use a parser-style scan for robustness.\n let actualXmlInner = xmlInner.trim();\n if (actualXmlInner.startsWith(\"<\") && actualXmlInner.endsWith(\">\")) {\n const s = actualXmlInner;\n let i = 0;\n let rootStart = -1;\n let rootName = \"\";\n\n while (i < s.length) {\n const lt = s.indexOf(\"<\", i);\n if (lt === -1) {\n break;\n }\n const next = s[lt + 1];\n if (next === \"?\") {\n const end = s.indexOf(\"?>\", lt + 2);\n i = end === -1 ? s.length : end + 2;\n continue;\n }\n if (next === \"!\") {\n if (s.startsWith(\"!--\", lt + 2)) {\n const end = s.indexOf(\"-->\", lt + 5);\n i = end === -1 ? s.length : end + 3;\n continue;\n }\n if (s.startsWith(\"![CDATA[\", lt + 2)) {\n const end = s.indexOf(\"]]>\", lt + 9);\n i = end === -1 ? s.length : end + 3;\n continue;\n }\n const end = s.indexOf(\">\", lt + 2);\n i = end === -1 ? s.length : end + 1;\n continue;\n }\n if (next === \"/\") {\n // unexpected close before open; treat as not-a-root document\n break;\n }\n // Found a start tag; parse name until whitespace, '/', or '>'\n let j = lt + 1;\n while (\n j < s.length &&\n s[j] !== \" \" &&\n s[j] !== \"\\n\" &&\n s[j] !== \"\\r\" &&\n s[j] !== \"\\t\" &&\n s[j] !== \"/\" &&\n s[j] !== \">\"\n ) {\n j += 1;\n }\n rootStart = lt;\n rootName = s.slice(lt + 1, j);\n break;\n }\n\n if (rootStart === 0 && rootName) {\n const range = findFirstTopLevelRange(s, rootName);\n if (range) {\n // Compute full closing tag end index allowing whitespace before '>'\n let fullEnd = range.end + `</${rootName}>`.length;\n const closeHead = s.indexOf(`</${rootName}`, range.end);\n if (closeHead === range.end) {\n let p = closeHead + 2 + rootName.length;\n while (p < s.length && WHITESPACE_REGEX.test(s[p])) {\n p += 1;\n }\n if (s[p] === \">\") {\n fullEnd = p + 1;\n }\n }\n\n if (fullEnd === s.length) {\n // Check if the schema expects this root tag\n const unwrapped = unwrapJsonSchema(schema);\n const schemaProps =\n unwrapped && typeof unwrapped === \"object\"\n ? ((unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined)\n : undefined;\n\n if (schemaProps && !Object.hasOwn(schemaProps, rootName)) {\n actualXmlInner = s.slice(range.start, range.end);\n }\n }\n }\n }\n }\n\n // Identify string-typed properties for special handling\n // Use top-level keys for duplicate detection/backfill, deep keys for placeholder shielding\n const topLevelStringProps = getTopLevelStringProps(schema);\n const deepStringTypedProps = getStringTypedProperties(schema);\n\n // First, check for duplicates before doing any placeholder replacement\n const duplicateKeys = new Set<string>();\n for (const key of topLevelStringProps) {\n const excludeRanges: Array<{ start: number; end: number }> = [];\n for (const other of topLevelStringProps) {\n if (other === key) {\n continue;\n }\n const range = findFirstTopLevelRange(actualXmlInner, other);\n if (range) {\n excludeRanges.push(range);\n }\n }\n\n const occurrences = countTagOccurrences(\n actualXmlInner,\n key,\n excludeRanges,\n true\n );\n\n if (occurrences > 0 && throwDup) {\n throw new RXMLDuplicateStringTagError(\n `Duplicate string tags for <${key}> detected`\n );\n }\n if (occurrences > 0 && !throwDup) {\n duplicateKeys.add(key);\n if (options.onError) {\n options.onError(\n `RXML: Duplicate string tags for <${key}> detected; using first occurrence.`,\n { tag: key, occurrences }\n );\n }\n }\n }\n\n // Replace inner content of string-typed tags with placeholders to avoid\n // XML parsing errors from constructs like <!DOCTYPE ...> within element bodies\n let xmlInnerForParsing = actualXmlInner;\n const originalContentMap = new Map<string, string>();\n try {\n // Collect ranges of all occurrences for each string-typed tag name (at any depth)\n const ranges: Array<{ start: number; end: number; key: string }> = [];\n for (const key of deepStringTypedProps) {\n const innerRanges = findAllInnerRanges(actualXmlInner, key);\n for (const r of innerRanges) {\n if (r.end > r.start) {\n ranges.push({ ...r, key });\n }\n }\n }\n\n if (ranges.length > 0) {\n // Sort by start index and replace from left to right\n const sorted = [...ranges].sort((a, b) => a.start - b.start);\n let rebuilt = \"\";\n let cursor = 0;\n for (const r of sorted) {\n if (r.start < cursor) {\n // Overlapping range (nested); skip, as outer replacement already handled it\n continue;\n }\n if (cursor < r.start) {\n rebuilt += actualXmlInner.slice(cursor, r.start);\n }\n const placeholder = `__RXML_PLACEHOLDER_${r.key}_${r.start}_${r.end}__`;\n const originalContent = actualXmlInner.slice(r.start, r.end);\n originalContentMap.set(placeholder, originalContent);\n rebuilt += placeholder;\n cursor = r.end;\n }\n if (cursor < actualXmlInner.length) {\n rebuilt += actualXmlInner.slice(cursor);\n }\n xmlInnerForParsing = rebuilt;\n }\n } catch (error) {\n // Non-fatal: fall back to original XML; allow caller to handle via onError\n if (options.onError) {\n options.onError(\n \"RXML: Failed to replace string placeholders, falling back to original XML.\",\n { error }\n );\n }\n xmlInnerForParsing = actualXmlInner;\n }\n\n // Parse XML using our TXML-based tokenizer\n let parsedNodes: (RXMLNode | string)[];\n try {\n const wrappedXml = `<root>${xmlInnerForParsing}</root>`;\n const tokenizer = new XMLTokenizer(wrappedXml, {\n ...options,\n textNodeName,\n });\n const rootNode = tokenizer.parseNode();\n\n // Extract content from root wrapper\n parsedNodes = rootNode.children;\n } catch (cause) {\n throw new RXMLParseError(\"Failed to parse XML\", cause);\n }\n\n // Convert DOM to flat object structure\n const parsedArgs = domToObject(parsedNodes, schema, textNodeName);\n\n // Restore any placeholders across the entire parsed structure before schema-aware processing\n const restorePlaceholdersDeep = createPlaceholderRestorer(\n originalContentMap,\n textNodeName\n );\n const parsedArgsRestored = restorePlaceholdersDeep(parsedArgs) as Record<\n string,\n unknown\n >;\n const args: Record<string, unknown> = {};\n\n // Process each property with schema-aware handling\n for (const k of Object.keys(parsedArgsRestored || {})) {\n const v = parsedArgsRestored[k];\n let val: unknown = v;\n const propSchema = getPropertySchema(schema, k);\n const propType = getSchemaType(propSchema);\n\n // Handle duplicates when throwOnDuplicateStringTags is false\n if (propType === \"string\" && duplicateKeys.has(k) && Array.isArray(v)) {\n // For duplicates, use the first occurrence\n const firstValue = v[0];\n if (\n typeof firstValue === \"string\" &&\n firstValue.startsWith(\"__RXML_PLACEHOLDER_\")\n ) {\n // Restore from placeholder\n const originalContent = originalContentMap.get(firstValue);\n if (originalContent !== undefined) {\n args[k] = originalContent;\n continue;\n }\n } else {\n args[k] = firstValue;\n continue;\n }\n }\n\n if (propType === \"string\" && !Array.isArray(v)) {\n // First, check if this is a placeholder value and restore original content\n const placeholderUsed =\n (typeof v === \"string\" && v.startsWith(\"__RXML_PLACEHOLDER_\")) ||\n (v &&\n typeof v === \"object\" &&\n Object.hasOwn(v, textNodeName) &&\n typeof (v as Record<string, unknown>)[textNodeName] === \"string\" &&\n ((v as Record<string, unknown>)[textNodeName] as string).startsWith(\n \"__RXML_PLACEHOLDER_\"\n ));\n\n if (placeholderUsed) {\n // Extract the original content from the placeholder map\n let placeholderKey: string;\n if (typeof v === \"string\") {\n placeholderKey = v;\n } else {\n placeholderKey = (v as Record<string, unknown>)[\n textNodeName\n ] as string;\n }\n\n const originalContent = originalContentMap.get(placeholderKey);\n if (originalContent !== undefined) {\n args[k] = originalContent;\n continue;\n }\n }\n\n // Try to extract raw content (duplicates already handled earlier)\n const raw = extractRawInner(actualXmlInner, k);\n if (typeof raw === \"string\") {\n args[k] = raw;\n continue;\n }\n }\n\n // Extract text content from wrapped objects\n if (v && typeof v === \"object\" && Object.hasOwn(v, textNodeName)) {\n val = (v as Record<string, unknown>)[textNodeName];\n }\n\n // Handle array content\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.hasOwn(item, textNodeName)\n ) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal : String(textVal);\n }\n return typeof item === \"string\" ? item : String(item);\n });\n\n if (mapped.length > 1 && throwDup) {\n throw new RXMLDuplicateStringTagError(\n `Duplicate string tags for <${k}> detected`\n );\n }\n if (mapped.length > 1 && !throwDup && options.onError) {\n options.onError(\n `RXML: Duplicate string tags for <${k}> detected; using first occurrence.`,\n { tag: k, occurrences: mapped.length }\n );\n }\n\n args[k] = mapped[0] ?? \"\";\n continue;\n }\n val = processArrayContent(v, propSchema, textNodeName);\n } else if (v && typeof v === \"object\" && !Object.hasOwn(v, textNodeName)) {\n const obj = v as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n // Handle <item> wrapper pattern\n if (keys.length === 1 && keys[0] === \"item\") {\n val = processItemWrapper(obj.item, textNodeName);\n } else {\n // Check for indexed tuple pattern (numeric keys)\n let isIndexedTuple = false;\n if (keys.length > 0 && keys.every((key) => DIGIT_KEY_REGEX.test(key))) {\n const indices = keys\n .map((keyStr) => Number.parseInt(keyStr, 10))\n .sort((a, b) => a - b);\n isIndexedTuple =\n indices[0] === 0 &&\n indices.every((indexVal, idx) => indexVal === idx);\n }\n\n if (isIndexedTuple) {\n val = processIndexedTuple(obj, textNodeName);\n } else {\n val = v;\n }\n }\n }\n\n args[k] = typeof val === \"string\" ? val.trim() : val;\n }\n\n // Ensure missing string-typed properties are populated from original XML\n for (const key of topLevelStringProps) {\n if (!Object.hasOwn(args, key)) {\n const raw = extractRawInner(actualXmlInner, key);\n if (typeof raw === \"string\") {\n args[key] = raw;\n }\n }\n }\n\n // Auto-unwrap single root element if schema doesn't expect it (before coercion)\n let dataToCoerce = args;\n const keys = Object.keys(args);\n if (keys.length === 1) {\n const rootKey = keys[0];\n const rootValue = args[rootKey];\n\n // Check if schema expects the root key\n const unwrapped = unwrapJsonSchema(schema);\n if (unwrapped && typeof unwrapped === \"object\") {\n const schemaProps = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n if (schemaProps && !Object.hasOwn(schemaProps, rootKey)) {\n // Schema doesn't expect the root key, so unwrap it before coercion\n dataToCoerce = rootValue as Record<string, unknown>;\n }\n }\n }\n\n // Apply schema-based coercion\n try {\n const coerced = coerceDomBySchema(dataToCoerce, schema);\n const decoded = deepDecodeStringsBySchema(coerced, schema) as Record<\n string,\n unknown\n >;\n return decoded;\n } catch (error) {\n throw new RXMLCoercionError(\"Failed to coerce by schema\", error);\n }\n}\n\n/**\n * Parse XML without schema (similar to TXML's parse function)\n */\nexport function parseWithoutSchema(\n xmlString: string,\n options: ParseOptions = {}\n): (RXMLNode | string)[] {\n try {\n const tokenizer = new XMLTokenizer(xmlString, options);\n return tokenizer.parseChildren();\n } catch (error) {\n // Check if this is a specific type of error that should be re-thrown\n if (shouldRethrowParseError(error, xmlString)) {\n // Preserve the original error message and line/column information\n throw new RXMLParseError(\n error.message,\n error.cause,\n error.line,\n error.column\n );\n }\n\n // For other types of malformed XML, try to be more tolerant and return partial results\n if (options.onError) {\n options.onError(\"Failed to parse XML without schema\", { error });\n }\n\n // Try to extract any valid XML elements that we can parse\n try {\n const partialResults = extractPartialXmlResults(xmlString, options);\n if (partialResults.length > 0) {\n return partialResults;\n }\n } catch {\n // Fallback failed too\n }\n\n // Last resort: return the input as text content\n return [xmlString.trim()];\n }\n}\n\n/**\n * Parse a single XML node\n */\nexport function parseNode(\n xmlString: string,\n options: ParseOptions = {}\n): RXMLNode {\n try {\n const tokenizer = new XMLTokenizer(xmlString, options);\n return tokenizer.parseNode();\n } catch (error) {\n throw new RXMLParseError(\"Failed to parse XML node\", error);\n }\n}\n\n/**\n * Build node value with attributes if present\n */\nfunction buildNodeValue(child: RXMLNode): unknown {\n const kids = simplify(child.children);\n let nodeValue: unknown = kids;\n\n // Add attributes if present\n if (Object.keys(child.attributes).length) {\n if (typeof kids === \"string\") {\n nodeValue = kids;\n // For string content with attributes, we need to preserve both\n if (kids !== \"\") {\n nodeValue = { _attributes: child.attributes, value: kids };\n } else {\n nodeValue = { _attributes: child.attributes };\n }\n } else if (typeof kids === \"object\" && kids !== null) {\n (kids as Record<string, unknown>)._attributes = child.attributes;\n nodeValue = kids;\n } else {\n nodeValue = { _attributes: child.attributes };\n }\n }\n\n return nodeValue;\n}\n\n/**\n * Simplify parsed XML structure (similar to TXML's simplify)\n */\nexport function simplify(children: (RXMLNode | string)[]): unknown {\n if (!children.length) {\n return \"\";\n }\n\n if (children.length === 1 && typeof children[0] === \"string\") {\n return children[0];\n }\n\n const out: Record<string, unknown> = {};\n\n // Map each object\n for (const child of children) {\n if (typeof child !== \"object\") {\n continue;\n }\n\n if (!out[child.tagName]) {\n out[child.tagName] = [];\n }\n\n const nodeValue = buildNodeValue(child);\n (out[child.tagName] as unknown[]).push(nodeValue);\n }\n\n // Flatten single-item arrays\n for (const key in out) {\n if (!Object.hasOwn(out, key)) {\n continue;\n }\n const value = out[key];\n if (Array.isArray(value) && value.length === 1) {\n out[key] = value[0];\n }\n }\n\n return out;\n}\n\n/**\n * Filter XML nodes (similar to TXML's filter)\n */\nexport function filter(\n children: (RXMLNode | string)[],\n filterFn: (\n node: RXMLNode,\n index: number,\n currentDepth: number,\n currentPath: string\n ) => boolean,\n depth = 0,\n path = \"\"\n): RXMLNode[] {\n const out: RXMLNode[] = [];\n\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i];\n if (typeof child === \"object\" && filterFn(child, i, depth, path)) {\n out.push(child);\n }\n if (typeof child === \"object\" && child.children) {\n const childPath = `${path ? `${path}.` : \"\"}${i}.${child.tagName}`;\n const kids = filter(child.children, filterFn, depth + 1, childPath);\n out.push(...kids);\n }\n }\n\n return out;\n}\n","/**\n * Heuristic Engine for XML Tool-Call Parsing\n *\n * Pluggable pipeline for text normalization, repair, and object coercion.\n *\n * Phases:\n * 1. pre-parse: Text normalization before initial parse\n * 2. fallback-reparse: Text repair when initial parse fails\n * 3. post-parse: Object repair/coercion after successful parse\n */\n\nexport type HeuristicPhase = \"pre-parse\" | \"fallback-reparse\" | \"post-parse\";\n\nexport interface IntermediateCall {\n toolName: string;\n schema: unknown;\n rawSegment: string;\n parsed: unknown | null;\n errors: unknown[];\n meta?: Record<string, unknown>;\n}\n\nexport interface HeuristicResult {\n rawSegment?: string;\n parsed?: unknown;\n reparse?: boolean;\n stop?: boolean;\n warnings?: string[];\n}\n\nexport interface ToolCallHeuristic {\n id: string;\n phase: HeuristicPhase;\n applies(ctx: IntermediateCall): boolean;\n run(ctx: IntermediateCall): HeuristicResult;\n}\n\nexport interface PipelineConfig {\n preParse?: ToolCallHeuristic[];\n fallbackReparse?: ToolCallHeuristic[];\n postParse?: ToolCallHeuristic[];\n}\n\nexport interface HeuristicEngineOptions {\n parse: (xml: string, schema: unknown) => unknown;\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n maxReparses?: number;\n}\n\nfunction applyRawSegmentUpdate(\n current: IntermediateCall,\n result: HeuristicResult\n): IntermediateCall {\n if (result.rawSegment !== undefined) {\n return { ...current, rawSegment: result.rawSegment };\n }\n return current;\n}\n\nfunction applyParsedUpdate(\n current: IntermediateCall,\n result: HeuristicResult\n): IntermediateCall {\n if (result.parsed !== undefined) {\n return { ...current, parsed: result.parsed };\n }\n return current;\n}\n\nfunction applyWarningsUpdate(\n current: IntermediateCall,\n result: HeuristicResult\n): IntermediateCall {\n if (result.warnings && result.warnings.length > 0) {\n const meta = current.meta ?? {};\n const existingWarnings = (meta.warnings as string[] | undefined) ?? [];\n return {\n ...current,\n meta: { ...meta, warnings: [...existingWarnings, ...result.warnings] },\n };\n }\n return current;\n}\n\nfunction attemptReparse(\n current: IntermediateCall,\n result: HeuristicResult,\n reparseCount: number,\n maxReparses: number,\n parse: (xml: string, schema: unknown) => unknown\n): { state: IntermediateCall; newCount: number } {\n if (\n !result.reparse ||\n result.rawSegment === undefined ||\n reparseCount >= maxReparses\n ) {\n return { state: current, newCount: reparseCount };\n }\n\n try {\n const reparsed = parse(result.rawSegment, current.schema);\n return {\n state: { ...current, parsed: reparsed, errors: [] },\n newCount: reparseCount + 1,\n };\n } catch (error) {\n return {\n state: { ...current, errors: [...current.errors, error] },\n newCount: reparseCount + 1,\n };\n }\n}\n\nfunction executePhase(\n ctx: IntermediateCall,\n heuristics: ToolCallHeuristic[],\n options: HeuristicEngineOptions\n): IntermediateCall {\n let current = ctx;\n let reparseCount = 0;\n const maxReparses = options.maxReparses ?? 2;\n\n for (const heuristic of heuristics) {\n if (!heuristic.applies(current)) {\n continue;\n }\n\n const result = heuristic.run(current);\n\n current = applyRawSegmentUpdate(current, result);\n current = applyParsedUpdate(current, result);\n current = applyWarningsUpdate(current, result);\n\n const reparseResult = attemptReparse(\n current,\n result,\n reparseCount,\n maxReparses,\n options.parse\n );\n current = reparseResult.state;\n reparseCount = reparseResult.newCount;\n\n if (result.stop) {\n break;\n }\n }\n\n return current;\n}\n\nexport function applyHeuristicPipeline(\n ctx: IntermediateCall,\n config: PipelineConfig,\n options: HeuristicEngineOptions\n): IntermediateCall {\n let current = ctx;\n\n if (config.preParse && config.preParse.length > 0) {\n current = executePhase(current, config.preParse, options);\n }\n\n if (current.parsed === null && current.errors.length === 0) {\n try {\n const parsed = options.parse(current.rawSegment, current.schema);\n current = { ...current, parsed, errors: [] };\n } catch (error) {\n current = { ...current, errors: [error] };\n }\n }\n\n if (\n current.errors.length > 0 &&\n config.fallbackReparse &&\n config.fallbackReparse.length > 0\n ) {\n current = executePhase(current, config.fallbackReparse, options);\n }\n\n if (\n current.parsed !== null &&\n config.postParse &&\n config.postParse.length > 0\n ) {\n current = executePhase(current, config.postParse, options);\n }\n\n return current;\n}\n\nexport function createIntermediateCall(\n toolName: string,\n rawSegment: string,\n schema: unknown\n): IntermediateCall {\n return {\n toolName,\n schema,\n rawSegment,\n parsed: null,\n errors: [],\n meta: { originalContent: rawSegment },\n };\n}\n\nexport function mergePipelineConfigs(\n ...configs: PipelineConfig[]\n): PipelineConfig {\n const result: PipelineConfig = {\n preParse: [],\n fallbackReparse: [],\n postParse: [],\n };\n\n for (const config of configs) {\n if (config.preParse) {\n result.preParse = [...(result.preParse ?? []), ...config.preParse];\n }\n if (config.fallbackReparse) {\n result.fallbackReparse = [\n ...(result.fallbackReparse ?? []),\n ...config.fallbackReparse,\n ];\n }\n if (config.postParse) {\n result.postParse = [...(result.postParse ?? []), ...config.postParse];\n }\n }\n\n return result;\n}\n","/**\n * Default heuristics for XML fragment parsing.\n * Modular, reusable versions of normalization/repair logic from morph-xml-protocol.\n */\n\nimport { escapeRegExp } from \"../../core/utils/regex\";\nimport { unwrapJsonSchema } from \"../../schema-coerce\";\nimport { parse } from \"../core/parser\";\nimport type {\n HeuristicResult,\n IntermediateCall,\n PipelineConfig,\n ToolCallHeuristic,\n} from \"./engine\";\n\nconst MALFORMED_CLOSE_RE_G = /<\\/\\s+([A-Za-z0-9_:-]+)\\s*>/g;\nconst MALFORMED_CLOSE_RE = /<\\/\\s+([A-Za-z0-9_:-]+)\\s*>/;\nconst STATUS_TO_STEP_BOUNDARY_RE = /<\\/status>\\s*<step>/g;\nconst WHITESPACE_REGEX = /\\s/;\nconst NAME_CHAR_RE = /[A-Za-z0-9_:-]/;\n// NameStartChar per XML 1.0 spec: letter, underscore, or colon (digits NOT allowed as first char)\nconst NAME_START_CHAR_RE = /[A-Za-z_:]/;\nconst STEP_TAG_RE = /<step>([\\s\\S]*?)<\\/step>/i;\nconst STATUS_TAG_RE = /<status>([\\s\\S]*?)<\\/status>/i;\n\nexport const normalizeCloseTagsHeuristic: ToolCallHeuristic = {\n id: \"normalize-close-tags\",\n phase: \"pre-parse\",\n applies: () => true,\n run: (ctx: IntermediateCall): HeuristicResult => {\n const normalized = ctx.rawSegment.replace(MALFORMED_CLOSE_RE_G, \"</$1>\");\n if (normalized !== ctx.rawSegment) {\n return { rawSegment: normalized };\n }\n return {};\n },\n};\n\nexport const escapeInvalidLtHeuristic: ToolCallHeuristic = {\n id: \"escape-invalid-lt\",\n phase: \"pre-parse\",\n applies: () => true,\n run: (ctx: IntermediateCall): HeuristicResult => {\n const escaped = escapeInvalidLt(ctx.rawSegment);\n if (escaped !== ctx.rawSegment) {\n return { rawSegment: escaped };\n }\n return {};\n },\n};\n\nexport const balanceTagsHeuristic: ToolCallHeuristic = {\n id: \"balance-tags\",\n phase: \"fallback-reparse\",\n applies: (ctx: IntermediateCall): boolean => {\n const original = (ctx.meta?.originalContent as string) || ctx.rawSegment;\n const normalized = original.replace(MALFORMED_CLOSE_RE_G, \"</$1>\");\n const balanced = balanceTags(original);\n const hasMalformedClose = MALFORMED_CLOSE_RE.test(original);\n\n if (\n !hasMalformedClose &&\n balanced.length > normalized.length &&\n ctx.errors.length === 0\n ) {\n return false;\n }\n return balanced !== normalized;\n },\n run: (ctx: IntermediateCall): HeuristicResult => {\n const original = (ctx.meta?.originalContent as string) || ctx.rawSegment;\n const balanced = balanceTags(original);\n const escaped = escapeInvalidLt(balanced);\n return { rawSegment: escaped, reparse: true };\n },\n};\n\nexport const dedupeShellStringTagsHeuristic: ToolCallHeuristic = {\n id: \"dedupe-shell-string-tags\",\n phase: \"fallback-reparse\",\n applies: (ctx: IntermediateCall): boolean =>\n shouldDeduplicateStringTags(ctx.schema),\n run: (ctx: IntermediateCall): HeuristicResult => {\n const names = getStringPropertyNames(ctx.schema);\n let deduped = ctx.rawSegment;\n for (const key of names) {\n deduped = dedupeSingleTag(deduped, key);\n }\n if (deduped !== ctx.rawSegment) {\n return { rawSegment: deduped, reparse: true };\n }\n return {};\n },\n};\n\nexport const repairAgainstSchemaHeuristic: ToolCallHeuristic = {\n id: \"repair-against-schema\",\n phase: \"post-parse\",\n applies: (ctx: IntermediateCall): boolean =>\n ctx.parsed !== null && typeof ctx.parsed === \"object\",\n run: (ctx: IntermediateCall): HeuristicResult => {\n const repaired = repairParsedAgainstSchema(ctx.parsed, ctx.schema);\n if (repaired !== ctx.parsed) {\n return { parsed: repaired };\n }\n return {};\n },\n};\n\nexport const defaultPipelineConfig: PipelineConfig = {\n preParse: [normalizeCloseTagsHeuristic, escapeInvalidLtHeuristic],\n fallbackReparse: [balanceTagsHeuristic, dedupeShellStringTagsHeuristic],\n postParse: [repairAgainstSchemaHeuristic],\n};\n\nconst INDEX_TAG_RE = /^<(\\d+)(?:>|\\/?>)/;\n\nfunction isIndexTagAt(xml: string, pos: number): boolean {\n const remaining = xml.slice(pos);\n return INDEX_TAG_RE.test(remaining);\n}\n\nfunction escapeInvalidLt(xml: string): string {\n const len = xml.length;\n let out = \"\";\n for (let i = 0; i < len; i += 1) {\n const ch = xml[i];\n if (ch === \"<\") {\n const next = i + 1 < len ? xml[i + 1] : \"\";\n const isValidStart =\n NAME_START_CHAR_RE.test(next) ||\n next === \"/\" ||\n next === \"!\" ||\n next === \"?\";\n const isIndexTag = !isValidStart && isIndexTagAt(xml, i);\n if (!(isValidStart || isIndexTag)) {\n out += \"<\";\n continue;\n }\n }\n out += ch;\n }\n return out;\n}\n\nfunction balanceTags(xml: string): string {\n const src = xml\n .replace(MALFORMED_CLOSE_RE_G, \"</$1>\")\n .replace(STATUS_TO_STEP_BOUNDARY_RE, \"</status></step><step>\");\n let i = 0;\n const len = src.length;\n const out: string[] = [];\n const stack: string[] = [];\n\n while (i < len) {\n const lt = src.indexOf(\"<\", i);\n if (lt === -1) {\n out.push(src.slice(i));\n break;\n }\n out.push(src.slice(i, lt));\n if (lt + 1 >= len) {\n break;\n }\n const next = src[lt + 1];\n if (next === \"!\" || next === \"?\") {\n i = handleSpecialTagSegment(src, lt, out);\n continue;\n }\n if (next === \"/\") {\n i = handleClosingTagSegment(src, lt, out, stack);\n continue;\n }\n i = handleOpeningTagSegment(src, lt, out, stack);\n }\n\n for (let k = stack.length - 1; k >= 0; k -= 1) {\n out.push(`</${stack[k]}>`);\n }\n return out.join(\"\");\n}\n\nfunction skipWs(s: string, p: number, len: number): number {\n let idx = p;\n while (idx < len && WHITESPACE_REGEX.test(s[idx])) {\n idx += 1;\n }\n return idx;\n}\n\nfunction parseTagNameAt(\n s: string,\n p: number,\n len: number\n): { name: string; pos: number } {\n let idx = p;\n const start = idx;\n while (idx < len && NAME_CHAR_RE.test(s[idx])) {\n idx += 1;\n }\n return { name: s.slice(start, idx), pos: idx };\n}\n\nfunction handleSpecialTagSegment(\n src: string,\n lt: number,\n out: string[]\n): number {\n const gt = src.indexOf(\">\", lt + 1);\n if (gt === -1) {\n out.push(src.slice(lt));\n return src.length;\n }\n out.push(src.slice(lt, gt + 1));\n return gt + 1;\n}\n\nfunction handleClosingTagSegment(\n src: string,\n lt: number,\n out: string[],\n stack: string[]\n): number {\n const len = src.length;\n let p = skipWs(src, lt + 2, len);\n const { name, pos } = parseTagNameAt(src, p, len);\n p = pos;\n const gt = src.indexOf(\">\", p);\n const closingText = gt === -1 ? src.slice(lt) : src.slice(lt, gt + 1);\n const idx = stack.lastIndexOf(name);\n if (idx !== -1) {\n for (let k = stack.length - 1; k > idx; k -= 1) {\n out.push(`</${stack[k]}>`);\n stack.pop();\n }\n out.push(closingText);\n stack.pop();\n }\n return gt === -1 ? len : gt + 1;\n}\n\nfunction handleOpeningTagSegment(\n src: string,\n lt: number,\n out: string[],\n stack: string[]\n): number {\n const len = src.length;\n let p = skipWs(src, lt + 1, len);\n const nameStart = p;\n const parsed = parseTagNameAt(src, p, len);\n p = parsed.pos;\n const name = src.slice(nameStart, p);\n const q = src.indexOf(\">\", p);\n if (q === -1) {\n out.push(src.slice(lt));\n return len;\n }\n let r = q - 1;\n while (r >= nameStart && WHITESPACE_REGEX.test(src[r])) {\n r -= 1;\n }\n const selfClosing = src[r] === \"/\";\n out.push(src.slice(lt, q + 1));\n if (!selfClosing && name) {\n stack.push(name);\n }\n return q + 1;\n}\n\n/**\n * Extract properties from a JSON schema, handling $ref unwrapping.\n * Returns undefined if schema is invalid or has no properties.\n */\nfunction extractSchemaProperties(\n schema: unknown\n): Record<string, unknown> | undefined {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n return undefined;\n }\n return (unwrapped as { properties?: Record<string, unknown> }).properties;\n}\n\nfunction shouldDeduplicateStringTags(schema: unknown): boolean {\n const props = extractSchemaProperties(schema);\n if (!props) {\n return false;\n }\n const commandRaw = props.command;\n if (!commandRaw) {\n return false;\n }\n const command = unwrapJsonSchema(commandRaw) as { type?: string } | undefined;\n return command?.type === \"array\";\n}\n\nfunction getStringPropertyNames(schema: unknown): string[] {\n const props = extractSchemaProperties(schema);\n if (!props) {\n return [];\n }\n const names: string[] = [];\n for (const key of Object.keys(props)) {\n const prop = unwrapJsonSchema(props[key]) as { type?: string } | undefined;\n if (prop?.type === \"string\") {\n names.push(key);\n }\n }\n return names;\n}\n\nfunction dedupeSingleTag(xml: string, key: string): string {\n const escaped = escapeRegExp(key);\n const re = new RegExp(`<${escaped}>([\\\\s\\\\S]*?)<\\\\/${escaped}>`, \"g\");\n const matches = Array.from(xml.matchAll(re));\n if (matches.length <= 1) {\n return xml;\n }\n const last = matches.at(-1);\n let result = \"\";\n let cursor = 0;\n for (const m of matches) {\n const idx = m.index ?? 0;\n result += xml.slice(cursor, idx);\n if (last && idx === (last.index ?? -1)) {\n result += m[0];\n }\n cursor = idx + m[0].length;\n }\n result += xml.slice(cursor);\n return result;\n}\n\nfunction repairParsedAgainstSchema(input: unknown, schema: unknown): unknown {\n if (!input || typeof input !== \"object\") {\n return input;\n }\n const properties = extractSchemaProperties(schema);\n if (!properties) {\n return input;\n }\n applySchemaProps(input as Record<string, unknown>, properties);\n return input;\n}\n\ninterface PropSchema {\n type?: string;\n items?: unknown;\n}\n\nfunction applySchemaProps(\n obj: Record<string, unknown>,\n properties: Record<string, unknown>\n): void {\n for (const key of Object.keys(obj)) {\n const propSchema = properties[key];\n if (!propSchema) {\n continue;\n }\n const prop = unwrapJsonSchema(propSchema) as PropSchema | undefined;\n if (prop?.type === \"array\" && prop.items) {\n const itemSchema = unwrapJsonSchema(prop.items);\n obj[key] = coerceArrayItems(obj[key], itemSchema);\n continue;\n }\n if (prop?.type === \"object\") {\n const val = obj[key];\n if (val && typeof val === \"object\") {\n obj[key] = repairParsedAgainstSchema(val, prop);\n }\n }\n }\n}\n\nfunction coerceArrayItems(\n val: unknown,\n itemSchema: unknown\n): unknown[] | unknown {\n if (!Array.isArray(val)) {\n return val;\n }\n return val.map((v) => coerceArrayItem(v, itemSchema));\n}\n\nfunction coerceArrayItem(v: unknown, itemSchema: unknown): unknown {\n const itemType = (itemSchema as { type?: string })?.type;\n if (typeof v === \"string\" && itemType === \"object\") {\n const parsed = tryParseStringToSchemaObject(v, itemSchema);\n if (parsed !== null) {\n return parsed;\n }\n const fallback = extractStepStatusFromString(\n v.replace(MALFORMED_CLOSE_RE_G, \"</$1>\")\n );\n if (fallback) {\n return fallback;\n }\n return v;\n }\n if (v && typeof v === \"object\" && itemType === \"object\") {\n return repairParsedAgainstSchema(v, itemSchema);\n }\n return v;\n}\n\nfunction tryParseStringToSchemaObject(\n xml: string,\n itemSchema: unknown\n): unknown | null {\n try {\n const normalized = xml.replace(MALFORMED_CLOSE_RE_G, \"</$1>\");\n const fixed = parse(normalized, itemSchema, { noChildNodes: [] });\n return typeof fixed === \"string\" ? null : (fixed as unknown);\n } catch {\n return null;\n }\n}\n\nfunction extractStepStatusFromString(\n normXml: string\n): Record<string, string> | null {\n const stepMatch = normXml.match(STEP_TAG_RE);\n const statusMatch = normXml.match(STATUS_TAG_RE);\n if (stepMatch && statusMatch) {\n return { step: stepMatch[1], status: statusMatch[1] };\n }\n return null;\n}\n\nexport {\n escapeInvalidLt,\n balanceTags,\n shouldDeduplicateStringTags,\n getStringPropertyNames,\n dedupeSingleTag,\n repairParsedAgainstSchema,\n};\n","import { parse as parseCore } from \"./core/parser\";\nimport type { ParseOptions } from \"./core/types\";\nimport { RXMLParseError } from \"./errors/types\";\nimport {\n applyHeuristicPipeline,\n createIntermediateCall,\n defaultPipelineConfig,\n} from \"./heuristics\";\n\nexport function parse(\n xml: string,\n schema: unknown,\n options: ParseOptions = {}\n): Record<string, unknown> {\n if (!options.repair) {\n return parseCore(xml, schema, options);\n }\n\n const baseOptions: ParseOptions = {\n ...options,\n repair: false,\n };\n\n const ctx = createIntermediateCall(\"\", xml, schema);\n const result = applyHeuristicPipeline(ctx, defaultPipelineConfig, {\n parse: (raw, s) => parseCore(raw, s, baseOptions),\n onError: options.onError,\n maxReparses: options.maxReparses,\n });\n\n if (result.parsed !== null) {\n return result.parsed as Record<string, unknown>;\n }\n\n const error = result.errors[0];\n throw new RXMLParseError(\"Failed to parse XML with repair heuristics\", error);\n}\n","/**\n * Shared regex constants used across protocol implementations\n */\n\n/**\n * Matches valid XML name characters (letters, digits, underscore, colon, hyphen)\n */\nexport const NAME_CHAR_RE = /[A-Za-z0-9_:-]/;\n\n/**\n * Matches any whitespace character\n */\nexport const WHITESPACE_REGEX = /\\s/;\n","import type {\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport { parse, stringify } from \"../../rxml\";\nimport { generateId } from \"../utils/id\";\nimport { escapeRegExp } from \"../utils/regex\";\nimport { NAME_CHAR_RE, WHITESPACE_REGEX } from \"../utils/regex-constants\";\nimport type { ParserOptions, TCMCoreProtocol } from \"./protocol-interface\";\n\nexport interface XmlProtocolOptions {\n parseOptions?: {\n repair?: boolean;\n maxReparses?: number;\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n noChildNodes?: string[];\n [key: string]: unknown;\n };\n}\n\ntype FlushTextFn = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n text?: string\n) => void;\n\nfunction getToolSchema(tools: LanguageModelV3FunctionTool[], toolName: string) {\n return tools.find((t) => t.name === toolName)?.inputSchema;\n}\n\ninterface ProcessToolCallParams {\n toolCall: {\n toolName: string;\n content: string;\n startIndex: number;\n endIndex: number;\n };\n tools: LanguageModelV3FunctionTool[];\n options?: ParserOptions;\n text: string;\n processedElements: LanguageModelV3Content[];\n parseOptions?: Record<string, unknown>;\n}\n\nfunction processToolCall(params: ProcessToolCallParams): void {\n const { toolCall, tools, options, text, processedElements, parseOptions } =\n params;\n const toolSchema = getToolSchema(tools, toolCall.toolName);\n\n const parseConfig = {\n ...(parseOptions ?? {}),\n onError:\n options?.onError ??\n (parseOptions as { onError?: ParserOptions[\"onError\"] } | undefined)\n ?.onError,\n };\n\n try {\n const parsed = parse(toolCall.content, toolSchema, parseConfig);\n processedElements.push({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: toolCall.toolName,\n input: JSON.stringify(parsed),\n });\n } catch (error) {\n const originalCallText = text.substring(\n toolCall.startIndex,\n toolCall.endIndex\n );\n options?.onError?.(\n `Could not process XML tool call: ${toolCall.toolName}`,\n { toolCall: originalCallText, error }\n );\n processedElements.push({ type: \"text\", text: originalCallText });\n }\n}\n\ninterface HandleStreamingToolCallEndParams {\n toolContent: string;\n currentToolCall: { name: string; content?: string };\n tools: LanguageModelV3FunctionTool[];\n options?: ParserOptions;\n ctrl: TransformStreamDefaultController<LanguageModelV3StreamPart>;\n flushText: FlushTextFn;\n parseOptions?: Record<string, unknown>;\n}\n\nfunction handleStreamingToolCallEnd(\n params: HandleStreamingToolCallEndParams\n): void {\n const {\n toolContent,\n currentToolCall,\n tools,\n options,\n ctrl,\n flushText,\n parseOptions,\n } = params;\n const toolSchema = getToolSchema(tools, currentToolCall.name);\n const parseConfig = {\n ...(parseOptions ?? {}),\n onError:\n options?.onError ??\n (parseOptions as { onError?: ParserOptions[\"onError\"] } | undefined)\n ?.onError,\n };\n\n flushText(ctrl);\n try {\n const parsedResult = parse(toolContent, toolSchema, parseConfig);\n ctrl.enqueue({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: currentToolCall.name,\n input: JSON.stringify(parsedResult),\n });\n } catch (error) {\n const original = `<${currentToolCall.name}>${toolContent}</${currentToolCall.name}>`;\n options?.onError?.(\"Could not process streaming XML tool call\", {\n toolCall: original,\n error,\n });\n flushText(ctrl, original);\n }\n}\n\nfunction findClosingTagEndFlexible(\n text: string,\n contentStart: number,\n toolName: string\n): number {\n let pos = contentStart;\n let depth = 1;\n\n while (pos < text.length) {\n const tok = nextTagToken(text, pos);\n if (tok.kind === \"eof\") {\n break;\n }\n const result = updateDepthWithToken(tok, toolName, depth);\n depth = result.depth;\n if (result.closedAt !== undefined) {\n return result.closedAt;\n }\n pos = tok.nextPos;\n }\n return -1;\n}\n\nfunction skipSpecialSegment(text: string, lt: number): number | null {\n const next = text[lt + 1];\n if (next === \"!\" || next === \"?\") {\n const gt = text.indexOf(\">\", lt + 1);\n if (gt !== -1) {\n return gt + 1;\n }\n }\n return null;\n}\n\nfunction consumeClosingTag(\n text: string,\n lt: number\n): { matched: boolean; endPos: number } {\n const gt = text.indexOf(\">\", lt + 1);\n const endPos = gt === -1 ? text.length : gt + 1;\n return { matched: false, endPos };\n}\n\nfunction consumeOpenTag(\n text: string,\n lt: number\n): { name: string; selfClosing: boolean; nextPos: number } | null {\n let p = lt + 1;\n while (p < text.length && WHITESPACE_REGEX.test(text[p])) {\n p += 1;\n }\n const nameStart = p;\n while (p < text.length && NAME_CHAR_RE.test(text.charAt(p))) {\n p += 1;\n }\n const name = text.slice(nameStart, p);\n const q = text.indexOf(\">\", p);\n if (q === -1) {\n return null;\n }\n let r = q - 1;\n while (r >= nameStart && WHITESPACE_REGEX.test(text[r])) {\n r -= 1;\n }\n const selfClosing = text[r] === \"/\";\n return { name, selfClosing, nextPos: q + 1 };\n}\n\nfunction updateDepthWithToken(\n tok:\n | { kind: \"special\"; nextPos: number }\n | { kind: \"close\"; name: string; nextPos: number }\n | { kind: \"open\"; name: string; selfClosing: boolean; nextPos: number },\n toolName: string,\n depth: number\n): { depth: number; closedAt?: number } {\n if (tok.kind === \"close\" && tok.name === toolName) {\n const newDepth = depth - 1;\n return newDepth === 0\n ? { depth: newDepth, closedAt: tok.nextPos }\n : { depth: newDepth };\n }\n if (tok.kind === \"open\" && tok.name === toolName && !tok.selfClosing) {\n return { depth: depth + 1 };\n }\n return { depth };\n}\n\nfunction nextTagToken(\n text: string,\n fromPos: number\n):\n | { kind: \"eof\"; nextPos: number }\n | { kind: \"special\"; nextPos: number }\n | { kind: \"close\"; name: string; nextPos: number }\n | { kind: \"open\"; name: string; selfClosing: boolean; nextPos: number } {\n const lt = text.indexOf(\"<\", fromPos);\n if (lt === -1 || lt + 1 >= text.length) {\n return { kind: \"eof\", nextPos: text.length };\n }\n const next = text[lt + 1];\n const specialEnd = skipSpecialSegment(text, lt);\n if (specialEnd !== null) {\n return { kind: \"special\", nextPos: specialEnd };\n }\n if (next === \"/\") {\n const closing = consumeClosingTag(text, lt);\n let p = lt + 2;\n while (p < text.length && WHITESPACE_REGEX.test(text[p])) {\n p += 1;\n }\n const nameStart = p;\n while (p < text.length && NAME_CHAR_RE.test(text.charAt(p))) {\n p += 1;\n }\n const name = text.slice(nameStart, p);\n return { kind: \"close\", name, nextPos: closing.endPos };\n }\n const open = consumeOpenTag(text, lt);\n if (open === null) {\n return { kind: \"eof\", nextPos: text.length };\n }\n return {\n kind: \"open\",\n name: open.name,\n selfClosing: open.selfClosing,\n nextPos: open.nextPos,\n };\n}\n\ninterface ToolTagMatch {\n tagStart: number;\n isSelfClosing: boolean;\n tagLength: number;\n}\n\nfunction findNextToolTag(\n text: string,\n searchIndex: number,\n toolName: string\n): ToolTagMatch | null {\n const startTag = `<${toolName}>`;\n const openIdx = text.indexOf(startTag, searchIndex);\n const selfMatch = findSelfClosingTag(text, toolName, searchIndex);\n const selfIdx = selfMatch?.index ?? -1;\n if (openIdx === -1 && selfIdx === -1) {\n return null;\n }\n const isSelfClosing = selfIdx !== -1 && (openIdx === -1 || selfIdx < openIdx);\n return {\n tagStart: isSelfClosing ? selfIdx : openIdx,\n isSelfClosing,\n tagLength: isSelfClosing ? (selfMatch?.length ?? 0) : startTag.length,\n };\n}\n\nfunction findLastCloseTagStart(segment: string, toolName: string): number {\n const closeTagPattern = new RegExp(\n `</\\\\s*${escapeRegExp(toolName)}\\\\s*>`,\n \"g\"\n );\n let closeTagStart = -1;\n let match = closeTagPattern.exec(segment);\n while (match !== null) {\n closeTagStart = match.index;\n match = closeTagPattern.exec(segment);\n }\n if (closeTagStart === -1) {\n return segment.lastIndexOf(\"<\");\n }\n return closeTagStart;\n}\n\nfunction pushSelfClosingToolCall(\n toolCalls: Array<{\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n }>,\n toolName: string,\n text: string,\n tagStart: number,\n tagLength: number\n): number {\n const endIndex = tagStart + tagLength;\n toolCalls.push({\n toolName,\n startIndex: tagStart,\n endIndex,\n content: \"\",\n segment: text.substring(tagStart, endIndex),\n });\n return endIndex;\n}\n\n/**\n * Cache for self-closing tag regex patterns.\n * This cache grows with the number of unique tool names but is bounded\n * in practice since tools are defined at configuration time, not dynamically.\n */\nconst selfClosingTagCache = new Map<string, RegExp>();\n\nfunction getSelfClosingTagPattern(toolName: string): RegExp {\n let pattern = selfClosingTagCache.get(toolName);\n if (!pattern) {\n pattern = new RegExp(`<\\\\s*${escapeRegExp(toolName)}\\\\s*/>`, \"g\");\n selfClosingTagCache.set(toolName, pattern);\n }\n return pattern;\n}\n\nfunction findSelfClosingTag(\n text: string,\n toolName: string,\n fromIndex: number\n): { index: number; length: number } | null {\n const pattern = getSelfClosingTagPattern(toolName);\n pattern.lastIndex = fromIndex;\n const match = pattern.exec(text);\n if (!match || match.index === undefined) {\n return null;\n }\n return { index: match.index, length: match[0].length };\n}\n\nfunction appendOpenToolCallIfComplete(\n toolCalls: Array<{\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n }>,\n text: string,\n toolName: string,\n tagStart: number,\n startTag: string\n): number {\n const contentStart = tagStart + startTag.length;\n const fullTagEnd = findClosingTagEndFlexible(text, contentStart, toolName);\n if (fullTagEnd === -1 || fullTagEnd <= contentStart) {\n return contentStart;\n }\n const segment = text.substring(tagStart, fullTagEnd);\n const closeTagStart = findLastCloseTagStart(segment, toolName);\n const inner =\n closeTagStart === -1\n ? segment.slice(startTag.length)\n : segment.slice(startTag.length, closeTagStart);\n toolCalls.push({\n toolName,\n startIndex: tagStart,\n endIndex: fullTagEnd,\n content: inner,\n segment,\n });\n return fullTagEnd;\n}\n\nfunction findToolCallsForName(\n text: string,\n toolName: string\n): Array<{\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n}> {\n const toolCalls: Array<{\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n }> = [];\n const startTag = `<${toolName}>`;\n let searchIndex = 0;\n\n while (searchIndex < text.length) {\n const match = findNextToolTag(text, searchIndex, toolName);\n if (match === null) {\n break;\n }\n if (match.isSelfClosing) {\n searchIndex = pushSelfClosingToolCall(\n toolCalls,\n toolName,\n text,\n match.tagStart,\n match.tagLength\n );\n continue;\n }\n searchIndex = appendOpenToolCallIfComplete(\n toolCalls,\n text,\n toolName,\n match.tagStart,\n startTag\n );\n }\n\n return toolCalls;\n}\n\nfunction findToolCalls(\n text: string,\n toolNames: string[]\n): Array<{\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n}> {\n const toolCalls: Array<{\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n }> = [];\n\n for (const toolName of toolNames) {\n const calls = findToolCallsForName(text, toolName);\n toolCalls.push(...calls);\n }\n\n return toolCalls.sort((a, b) => a.startIndex - b.startIndex);\n}\n\nfunction findEarliestToolTag(\n buffer: string,\n toolNames: string[]\n): { index: number; name: string; selfClosing: boolean; tagLength: number } {\n let bestIndex = -1;\n let bestName = \"\";\n let bestSelfClosing = false;\n let bestTagLength = 0;\n\n if (toolNames.length > 0) {\n for (const name of toolNames) {\n const openTag = `<${name}>`;\n const idxOpen = buffer.indexOf(openTag);\n const selfMatch = findSelfClosingTag(buffer, name, 0);\n const idxSelf = selfMatch?.index ?? -1;\n\n if (idxOpen !== -1 && (bestIndex === -1 || idxOpen < bestIndex)) {\n bestIndex = idxOpen;\n bestName = name;\n bestSelfClosing = false;\n bestTagLength = openTag.length;\n }\n if (idxSelf !== -1 && (bestIndex === -1 || idxSelf < bestIndex)) {\n bestIndex = idxSelf;\n bestName = name;\n bestSelfClosing = true;\n bestTagLength = selfMatch?.length ?? 0;\n }\n }\n }\n\n return {\n index: bestIndex,\n name: bestName,\n selfClosing: bestSelfClosing,\n tagLength: bestTagLength,\n };\n}\n\nfunction isOpenTagPrefix(suffix: string, toolName: string): boolean {\n return `${toolName}>`.startsWith(suffix);\n}\n\nfunction consumeWhitespace(text: string, index: number): number {\n let i = index;\n while (i < text.length && WHITESPACE_REGEX.test(text.charAt(i))) {\n i += 1;\n }\n return i;\n}\n\nfunction consumeToolNamePrefix(\n text: string,\n index: number,\n toolName: string\n): { index: number; done: boolean; valid: boolean } {\n let i = index;\n let nameIndex = 0;\n\n while (i < text.length && nameIndex < toolName.length) {\n if (text.charAt(i) !== toolName.charAt(nameIndex)) {\n return { index: i, done: false, valid: false };\n }\n i += 1;\n nameIndex += 1;\n }\n\n return { index: i, done: nameIndex === toolName.length, valid: true };\n}\n\n/**\n * Checks if the remainder of text at index is a valid self-closing tag suffix.\n * Returns true if:\n * - text[index] is \"/\" and we're at the end (incomplete \"/\")\n * - text[index..] is \"/>\" at the end of the string\n */\nfunction isSelfClosingSuffixRemainder(text: string, index: number): boolean {\n if (text.charAt(index) !== \"/\") {\n return false;\n }\n if (index + 1 >= text.length) {\n return true;\n }\n return index + 1 === text.length - 1 && text.charAt(index + 1) === \">\";\n}\n\nfunction isSelfClosingTagPrefix(suffix: string, toolName: string): boolean {\n let i = consumeWhitespace(suffix, 0);\n if (i >= suffix.length) {\n return true;\n }\n\n const nameRemainder = suffix.slice(i);\n if (toolName.startsWith(nameRemainder)) {\n return true;\n }\n\n const nameResult = consumeToolNamePrefix(suffix, i, toolName);\n if (!nameResult.valid) {\n return false;\n }\n\n i = nameResult.index;\n if (i >= suffix.length) {\n return true;\n }\n if (!nameResult.done) {\n return false;\n }\n\n i = consumeWhitespace(suffix, i);\n if (i >= suffix.length) {\n return true;\n }\n\n return isSelfClosingSuffixRemainder(suffix, i);\n}\n\nfunction findPotentialToolTagStart(\n buffer: string,\n toolNames: string[]\n): number {\n if (toolNames.length === 0 || buffer.length === 0) {\n return -1;\n }\n\n const lastGt = buffer.lastIndexOf(\">\");\n const offset = lastGt === -1 ? 0 : lastGt + 1;\n const trailing = buffer.slice(offset);\n\n for (let i = trailing.length - 1; i >= 0; i -= 1) {\n if (trailing.charAt(i) !== \"<\") {\n continue;\n }\n const suffix = trailing.slice(i + 1);\n for (const name of toolNames) {\n if (\n isOpenTagPrefix(suffix, name) ||\n isSelfClosingTagPrefix(suffix, name)\n ) {\n return offset + i;\n }\n }\n }\n\n return -1;\n}\n\nfunction createFlushTextHandler(\n getCurrentTextId: () => string | null,\n setCurrentTextId: (id: string | null) => void,\n getHasEmittedTextStart: () => boolean,\n setHasEmittedTextStart: (value: boolean) => void\n) {\n return (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n text?: string\n ) => {\n const content = text;\n if (content) {\n if (!getCurrentTextId()) {\n const newId = generateId();\n setCurrentTextId(newId);\n controller.enqueue({\n type: \"text-start\",\n id: newId,\n });\n setHasEmittedTextStart(true);\n }\n controller.enqueue({\n type: \"text-delta\",\n id: getCurrentTextId() as string,\n delta: content,\n });\n }\n\n const currentTextId = getCurrentTextId();\n if (currentTextId && !text) {\n if (getHasEmittedTextStart()) {\n controller.enqueue({\n type: \"text-end\",\n id: currentTextId,\n });\n setHasEmittedTextStart(false);\n }\n setCurrentTextId(null);\n }\n };\n}\n\ninterface ProcessToolCallInBufferParams {\n buffer: string;\n currentToolCall: { name: string; content: string };\n tools: LanguageModelV3FunctionTool[];\n options?: ParserOptions;\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>;\n flushText: FlushTextFn;\n setBuffer: (buffer: string) => void;\n parseOptions?: Record<string, unknown>;\n}\n\nfunction processToolCallInBuffer(params: ProcessToolCallInBufferParams): {\n buffer: string;\n currentToolCall: { name: string; content: string } | null;\n shouldBreak: boolean;\n} {\n const {\n buffer,\n currentToolCall,\n tools,\n options,\n controller,\n flushText,\n setBuffer,\n parseOptions,\n } = params;\n const endTagPattern = new RegExp(\n `</\\\\s*${escapeRegExp(currentToolCall.name)}\\\\s*>`\n );\n const endMatch = endTagPattern.exec(buffer);\n if (!endMatch || endMatch.index === undefined) {\n return { buffer, currentToolCall, shouldBreak: true };\n }\n\n const endIdx = endMatch.index;\n const endPos = endIdx + endMatch[0].length;\n const content = buffer.substring(0, endIdx);\n const remainder = buffer.substring(endPos);\n setBuffer(remainder);\n\n handleStreamingToolCallEnd({\n toolContent: content,\n currentToolCall,\n tools,\n options,\n ctrl: controller,\n flushText,\n parseOptions,\n });\n\n return {\n buffer: remainder,\n currentToolCall: null,\n shouldBreak: false,\n };\n}\n\ninterface ProcessNoToolCallInBufferParams {\n buffer: string;\n toolNames: string[];\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>;\n flushText: FlushTextFn;\n tools: LanguageModelV3FunctionTool[];\n options?: ParserOptions;\n parseOptions?: Record<string, unknown>;\n setBuffer: (buffer: string) => void;\n}\n\nfunction processNoToolCallInBuffer(params: ProcessNoToolCallInBufferParams): {\n buffer: string;\n currentToolCall: { name: string; content: string } | null;\n shouldBreak: boolean;\n shouldContinue: boolean;\n} {\n const {\n buffer,\n toolNames,\n controller,\n flushText,\n tools,\n options,\n parseOptions,\n setBuffer,\n } = params;\n const {\n index: earliestStartTagIndex,\n name: earliestToolName,\n selfClosing,\n tagLength,\n } = findEarliestToolTag(buffer, toolNames);\n\n if (earliestStartTagIndex === -1) {\n const potentialStart = findPotentialToolTagStart(buffer, toolNames);\n const safeLen = Math.max(\n 0,\n potentialStart === -1 ? buffer.length : potentialStart\n );\n const remaining = buffer.slice(safeLen);\n if (safeLen > 0) {\n flushText(controller, buffer.slice(0, safeLen));\n setBuffer(remaining);\n }\n return {\n buffer: remaining,\n currentToolCall: null,\n shouldBreak: true,\n shouldContinue: false,\n };\n }\n\n flushText(controller, buffer.substring(0, earliestStartTagIndex));\n\n if (selfClosing) {\n const newBuffer = buffer.substring(earliestStartTagIndex + tagLength);\n setBuffer(newBuffer);\n handleStreamingToolCallEnd({\n toolContent: \"\",\n currentToolCall: { name: earliestToolName, content: \"\" },\n tools,\n options,\n ctrl: controller,\n flushText,\n parseOptions,\n });\n return {\n buffer: newBuffer,\n currentToolCall: null,\n shouldBreak: false,\n shouldContinue: false,\n };\n }\n\n const startTag = `<${earliestToolName}>`;\n const newBuffer = buffer.substring(earliestStartTagIndex + startTag.length);\n setBuffer(newBuffer);\n return {\n buffer: newBuffer,\n currentToolCall: { name: earliestToolName, content: \"\" },\n shouldBreak: false,\n shouldContinue: true,\n };\n}\n\nfunction createProcessBufferHandler(\n getBuffer: () => string,\n setBuffer: (buffer: string) => void,\n getCurrentToolCall: () => { name: string; content: string } | null,\n setCurrentToolCall: (\n toolCall: { name: string; content: string } | null\n ) => void,\n tools: LanguageModelV3FunctionTool[],\n options: ParserOptions | undefined,\n toolNames: string[],\n flushText: FlushTextFn,\n parseOptions?: Record<string, unknown>\n) {\n return (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>\n ) => {\n while (true) {\n const currentToolCall = getCurrentToolCall();\n if (currentToolCall) {\n const result = processToolCallInBuffer({\n buffer: getBuffer(),\n currentToolCall,\n tools,\n options,\n controller,\n flushText,\n setBuffer,\n parseOptions,\n });\n setBuffer(result.buffer);\n setCurrentToolCall(result.currentToolCall);\n if (result.shouldBreak) {\n break;\n }\n } else {\n const result = processNoToolCallInBuffer({\n buffer: getBuffer(),\n toolNames,\n controller,\n flushText,\n tools,\n options,\n parseOptions,\n setBuffer,\n });\n setBuffer(result.buffer);\n setCurrentToolCall(result.currentToolCall);\n if (result.shouldBreak) {\n break;\n }\n if (result.shouldContinue) {\n continue;\n }\n break;\n }\n }\n };\n}\n\nexport const xmlProtocol = (\n protocolOptions?: XmlProtocolOptions\n): TCMCoreProtocol => {\n const parseOptions = {\n repair: true,\n noChildNodes: [],\n ...(protocolOptions?.parseOptions ?? {}),\n };\n\n return {\n formatTools({ tools, toolSystemPromptTemplate }) {\n return toolSystemPromptTemplate(tools || []);\n },\n\n formatToolCall(toolCall: LanguageModelV3ToolCall): string {\n let args: unknown = {};\n if (toolCall.input != null) {\n try {\n args = JSON.parse(toolCall.input);\n } catch {\n args = toolCall.input;\n }\n }\n return stringify(toolCall.toolName, args, {\n suppressEmptyNode: false,\n format: true,\n minimalEscaping: true,\n });\n },\n\n parseGeneratedText({ text, tools, options }) {\n const toolNames = tools.map((t) => t.name).filter(Boolean) as string[];\n if (toolNames.length === 0) {\n return [{ type: \"text\", text }];\n }\n\n const processedElements: LanguageModelV3Content[] = [];\n let currentIndex = 0;\n\n const toolCalls = findToolCalls(text, toolNames);\n\n for (const tc of toolCalls) {\n if (tc.startIndex > currentIndex) {\n processedElements.push({\n type: \"text\",\n text: text.substring(currentIndex, tc.startIndex),\n });\n }\n processToolCall({\n toolCall: tc,\n tools,\n options,\n text,\n processedElements,\n parseOptions,\n });\n currentIndex = tc.endIndex;\n }\n\n if (currentIndex < text.length) {\n processedElements.push({\n type: \"text\",\n text: text.substring(currentIndex),\n });\n }\n\n return processedElements;\n },\n\n createStreamParser({ tools, options }) {\n const toolNames = tools.map((t) => t.name).filter(Boolean) as string[];\n let buffer = \"\";\n // biome-ignore lint/suspicious/noExplicitAny: internal state\n let currentToolCall: any = null;\n let currentTextId: string | null = null;\n let hasEmittedTextStart = false;\n\n const flushText = createFlushTextHandler(\n () => currentTextId,\n (newId: string | null) => {\n currentTextId = newId;\n },\n () => hasEmittedTextStart,\n (value: boolean) => {\n hasEmittedTextStart = value;\n }\n );\n\n const processBuffer = createProcessBufferHandler(\n () => buffer,\n (newBuffer: string) => {\n buffer = newBuffer;\n },\n () => currentToolCall,\n (newToolCall: { name: string; content: string } | null) => {\n currentToolCall = newToolCall;\n },\n tools,\n options,\n toolNames,\n flushText,\n parseOptions\n );\n\n return new TransformStream({\n transform(chunk, controller) {\n if (chunk.type !== \"text-delta\") {\n if (buffer) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n controller.enqueue(chunk);\n return;\n }\n\n const textContent =\n (chunk as unknown as { delta?: string }).delta ?? \"\";\n buffer += textContent;\n processBuffer(controller);\n },\n flush(controller) {\n if (currentToolCall) {\n const unfinishedContent = `<${currentToolCall.name}>${currentToolCall.content || \"\"}${buffer}`;\n flushText(controller, unfinishedContent);\n buffer = \"\";\n currentToolCall = null;\n } else if (buffer) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n if (currentTextId && hasEmittedTextStart) {\n controller.enqueue({\n type: \"text-end\",\n id: currentTextId,\n });\n hasEmittedTextStart = false;\n currentTextId = null;\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) {\n return [];\n }\n\n return findToolCalls(text, toolNames).map((tc) => tc.segment);\n },\n };\n};\n","import type {\n LanguageModelV3Content,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport YAML from \"yaml\";\nimport { generateId } from \"../utils/id\";\nimport { addTextSegment } from \"../utils/protocol-utils\";\nimport { NAME_CHAR_RE, WHITESPACE_REGEX } from \"../utils/regex-constants\";\nimport type { ParserOptions, TCMCoreProtocol } from \"./protocol-interface\";\n\nexport interface YamlProtocolOptions {\n /**\n * Whether to include a system prompt example showing YAML multiline syntax.\n * @default true\n */\n includeMultilineExample?: boolean;\n}\n\nconst LEADING_WHITESPACE_RE = /^(\\s*)/;\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: XML tag parsing with nested tag tracking inherently requires complex state management\nfunction findClosingTagEnd(\n text: string,\n contentStart: number,\n toolName: string\n): number {\n let pos = contentStart;\n let depth = 1;\n\n while (pos < text.length) {\n const ltIdx = text.indexOf(\"<\", pos);\n if (ltIdx === -1) {\n break;\n }\n\n const next = text[ltIdx + 1];\n if (next === \"/\") {\n const gtIdx = text.indexOf(\">\", ltIdx);\n if (gtIdx === -1) {\n break;\n }\n\n let p = ltIdx + 2;\n while (p < gtIdx && WHITESPACE_REGEX.test(text[p])) {\n p++;\n }\n const nameStart = p;\n while (p < gtIdx && NAME_CHAR_RE.test(text.charAt(p))) {\n p++;\n }\n const name = text.slice(nameStart, p);\n\n if (name === toolName) {\n depth--;\n if (depth === 0) {\n return gtIdx + 1;\n }\n }\n pos = gtIdx + 1;\n } else if (next === \"!\" || next === \"?\") {\n const gtIdx = text.indexOf(\">\", ltIdx);\n pos = gtIdx === -1 ? text.length : gtIdx + 1;\n } else {\n let p = ltIdx + 1;\n while (p < text.length && WHITESPACE_REGEX.test(text[p])) {\n p++;\n }\n const nameStart = p;\n while (p < text.length && NAME_CHAR_RE.test(text.charAt(p))) {\n p++;\n }\n const name = text.slice(nameStart, p);\n\n const gtIdx = text.indexOf(\">\", p);\n if (gtIdx === -1) {\n break;\n }\n\n let r = gtIdx - 1;\n while (r >= nameStart && WHITESPACE_REGEX.test(text[r])) {\n r--;\n }\n const selfClosing = text[r] === \"/\";\n\n if (name === toolName && !selfClosing) {\n depth++;\n }\n pos = gtIdx + 1;\n }\n }\n\n return -1;\n}\n\nfunction findEarliestTagPosition(\n openIdx: number,\n selfIdx: number\n): { tagStart: number; isSelfClosing: boolean } {\n const hasSelf = selfIdx !== -1;\n const hasOpen = openIdx !== -1;\n\n if (hasSelf && (!hasOpen || selfIdx < openIdx)) {\n return { tagStart: selfIdx, isSelfClosing: true };\n }\n return { tagStart: openIdx, isSelfClosing: false };\n}\n\n/**\n * Find all tool calls in the text for the given tool names.\n */\ninterface ToolCallMatch {\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n}\n\nfunction collectToolCallsForName(\n text: string,\n toolName: string\n): ToolCallMatch[] {\n const toolCalls: ToolCallMatch[] = [];\n let searchIndex = 0;\n const selfTagRegex = new RegExp(`<${toolName}\\\\s*/>`, \"g\");\n\n while (searchIndex < text.length) {\n const startTag = `<${toolName}>`;\n const openIdx = text.indexOf(startTag, searchIndex);\n\n selfTagRegex.lastIndex = searchIndex;\n const selfMatch = selfTagRegex.exec(text);\n const selfIdx = selfMatch ? selfMatch.index : -1;\n const selfTagLength = selfMatch ? selfMatch[0].length : 0;\n\n if (openIdx === -1 && selfIdx === -1) {\n break;\n }\n\n const { tagStart, isSelfClosing } = findEarliestTagPosition(\n openIdx,\n selfIdx\n );\n\n if (isSelfClosing) {\n const endIndex = tagStart + selfTagLength;\n toolCalls.push({\n toolName,\n startIndex: tagStart,\n endIndex,\n content: \"\",\n });\n searchIndex = endIndex;\n continue;\n }\n\n const contentStart = tagStart + startTag.length;\n const fullTagEnd = findClosingTagEnd(text, contentStart, toolName);\n if (fullTagEnd !== -1 && fullTagEnd > contentStart) {\n const endTag = `</${toolName}>`;\n const endTagStart = fullTagEnd - endTag.length;\n const content = text.substring(contentStart, endTagStart);\n toolCalls.push({\n toolName,\n startIndex: tagStart,\n endIndex: fullTagEnd,\n content,\n });\n searchIndex = fullTagEnd;\n } else {\n searchIndex = contentStart;\n }\n }\n\n return toolCalls;\n}\n\nfunction findToolCalls(text: string, toolNames: string[]): ToolCallMatch[] {\n const toolCalls = toolNames.flatMap((toolName) =>\n collectToolCallsForName(text, toolName)\n );\n return toolCalls.sort((a, b) => a.startIndex - b.startIndex);\n}\n\n/**\n * Parse YAML content from inside an XML tag.\n * Handles common LLM output issues like inconsistent indentation.\n */\nfunction parseYamlContent(\n yamlContent: string,\n options?: ParserOptions\n): Record<string, unknown> | null {\n let normalized = yamlContent;\n if (normalized.startsWith(\"\\n\")) {\n normalized = normalized.slice(1);\n }\n\n const lines = normalized.split(\"\\n\");\n const nonEmptyLines = lines.filter((line) => line.trim().length > 0);\n\n if (nonEmptyLines.length === 0) {\n return {};\n }\n\n const minIndent = Math.min(\n ...nonEmptyLines.map((line) => {\n const match = line.match(LEADING_WHITESPACE_RE);\n return match ? match[1].length : 0;\n })\n );\n if (minIndent > 0) {\n normalized = lines.map((line) => line.slice(minIndent)).join(\"\\n\");\n }\n\n try {\n const doc = YAML.parseDocument(normalized);\n\n if (doc.errors && doc.errors.length > 0) {\n options?.onError?.(\"YAML parse error\", {\n errors: doc.errors.map((e: { message: string }) => e.message),\n });\n return null;\n }\n\n const result = doc.toJSON();\n\n if (result === null) {\n return {};\n }\n\n if (typeof result !== \"object\" || Array.isArray(result)) {\n options?.onError?.(\"YAML content must be a key-value mapping\", {\n got: typeof result,\n });\n return null;\n }\n\n return result as Record<string, unknown>;\n } catch (error) {\n options?.onError?.(\"Failed to parse YAML content\", { error });\n return null;\n }\n}\n\nfunction processToolCallMatch(\n text: string,\n tc: ToolCallMatch,\n currentIndex: number,\n processedElements: LanguageModelV3Content[],\n options?: ParserOptions\n): number {\n if (tc.startIndex < currentIndex) {\n return currentIndex;\n }\n\n addTextSegment(\n text.substring(currentIndex, tc.startIndex),\n processedElements\n );\n\n const parsedArgs = parseYamlContent(tc.content, options);\n if (parsedArgs !== null) {\n processedElements.push({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: tc.toolName,\n input: JSON.stringify(parsedArgs),\n });\n } else {\n const originalText = text.substring(tc.startIndex, tc.endIndex);\n options?.onError?.(\"Could not parse YAML tool call\", {\n toolCall: originalText,\n });\n processedElements.push({ type: \"text\", text: originalText });\n }\n\n return tc.endIndex;\n}\n\nfunction createFlushTextHandler(\n getCurrentTextId: () => string | null,\n setCurrentTextId: (id: string | null) => void,\n getHasEmittedTextStart: () => boolean,\n setHasEmittedTextStart: (value: boolean) => void\n) {\n return (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n text?: string\n ) => {\n const content = text;\n if (content) {\n if (!getCurrentTextId()) {\n const newId = generateId();\n setCurrentTextId(newId);\n controller.enqueue({\n type: \"text-start\",\n id: newId,\n });\n setHasEmittedTextStart(true);\n }\n controller.enqueue({\n type: \"text-delta\",\n id: getCurrentTextId() as string,\n delta: content,\n });\n }\n\n const currentTextId = getCurrentTextId();\n if (currentTextId && !text) {\n if (getHasEmittedTextStart()) {\n controller.enqueue({\n type: \"text-end\",\n id: currentTextId,\n });\n setHasEmittedTextStart(false);\n }\n setCurrentTextId(null);\n }\n };\n}\n\nfunction findEarliestToolTag(\n buffer: string,\n toolNames: string[]\n): { index: number; name: string; selfClosing: boolean; tagLength: number } {\n let bestIndex = -1;\n let bestName = \"\";\n let bestSelfClosing = false;\n let bestTagLength = 0;\n\n for (const name of toolNames) {\n const openTag = `<${name}>`;\n const selfTagRegex = new RegExp(`<${name}\\\\s*/>`);\n const idxOpen = buffer.indexOf(openTag);\n const selfMatch = selfTagRegex.exec(buffer);\n const idxSelf = selfMatch ? selfMatch.index : -1;\n\n if (idxOpen !== -1 && (bestIndex === -1 || idxOpen < bestIndex)) {\n bestIndex = idxOpen;\n bestName = name;\n bestSelfClosing = false;\n bestTagLength = openTag.length;\n }\n if (idxSelf !== -1 && (bestIndex === -1 || idxSelf < bestIndex)) {\n bestIndex = idxSelf;\n bestName = name;\n bestSelfClosing = true;\n bestTagLength = selfMatch ? selfMatch[0].length : 0;\n }\n }\n\n return {\n index: bestIndex,\n name: bestName,\n selfClosing: bestSelfClosing,\n tagLength: bestTagLength,\n };\n}\n\nexport const yamlProtocol = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- reserved for future extensibility\n _protocolOptions?: YamlProtocolOptions\n): TCMCoreProtocol => {\n return {\n formatTools({ tools, toolSystemPromptTemplate }) {\n return toolSystemPromptTemplate(tools || []);\n },\n\n formatToolCall(toolCall: LanguageModelV3ToolCall): string {\n let args: Record<string, unknown> = {};\n if (toolCall.input != null) {\n try {\n args = JSON.parse(toolCall.input) as Record<string, unknown>;\n } catch {\n args = { value: toolCall.input };\n }\n }\n const yamlContent = YAML.stringify(args);\n return `<${toolCall.toolName}>\\n${yamlContent}</${toolCall.toolName}>`;\n },\n\n parseGeneratedText({ text, tools, options }) {\n const toolNames = tools.map((t) => t.name).filter(Boolean) as string[];\n if (toolNames.length === 0) {\n return [{ type: \"text\", text }];\n }\n\n const processedElements: LanguageModelV3Content[] = [];\n let currentIndex = 0;\n\n const toolCalls = findToolCalls(text, toolNames);\n\n for (const tc of toolCalls) {\n currentIndex = processToolCallMatch(\n text,\n tc,\n currentIndex,\n processedElements,\n options\n );\n }\n\n if (currentIndex < text.length) {\n addTextSegment(text.substring(currentIndex), processedElements);\n }\n\n return processedElements;\n },\n\n createStreamParser({ tools, options }) {\n const toolNames = tools.map((t) => t.name).filter(Boolean) as string[];\n let buffer = \"\";\n let currentToolCall: { name: string; content: string } | null = null;\n let currentTextId: string | null = null;\n let hasEmittedTextStart = false;\n\n const flushText = createFlushTextHandler(\n () => currentTextId,\n (newId: string | null) => {\n currentTextId = newId;\n },\n () => hasEmittedTextStart,\n (value: boolean) => {\n hasEmittedTextStart = value;\n }\n );\n\n const processToolCallEnd = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolContent: string,\n toolName: string\n ) => {\n const parsedArgs = parseYamlContent(toolContent, options);\n flushText(controller);\n\n if (parsedArgs !== null) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName,\n input: JSON.stringify(parsedArgs),\n });\n } else {\n const original = `<${toolName}>${toolContent}</${toolName}>`;\n options?.onError?.(\"Could not parse streaming YAML tool call\", {\n toolCall: original,\n });\n flushText(controller, original);\n }\n };\n\n const handlePendingToolCall = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n endTag: string,\n toolName: string\n ): boolean => {\n const endIdx = buffer.indexOf(endTag);\n if (endIdx === -1) {\n return false;\n }\n\n const content = buffer.substring(0, endIdx);\n buffer = buffer.substring(endIdx + endTag.length);\n processToolCallEnd(controller, content, toolName);\n currentToolCall = null;\n return true;\n };\n\n const flushSafeText = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>\n ): void => {\n const maxTagLen = toolNames.length\n ? Math.max(...toolNames.map((n) => `<${n} />`.length))\n : 0;\n const tail = Math.max(0, maxTagLen - 1);\n const safeLen = Math.max(0, buffer.length - tail);\n if (safeLen > 0) {\n flushText(controller, buffer.slice(0, safeLen));\n buffer = buffer.slice(safeLen);\n }\n };\n\n const handleNewToolTag = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n tagIndex: number,\n tagName: string,\n selfClosing: boolean,\n tagLength: number\n ): void => {\n if (tagIndex > 0) {\n flushText(controller, buffer.substring(0, tagIndex));\n }\n\n if (selfClosing) {\n buffer = buffer.substring(tagIndex + tagLength);\n processToolCallEnd(controller, \"\", tagName);\n } else {\n const startTag = `<${tagName}>`;\n buffer = buffer.substring(tagIndex + startTag.length);\n currentToolCall = { name: tagName, content: \"\" };\n }\n };\n\n const processBuffer = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>\n ) => {\n while (true) {\n if (currentToolCall) {\n const toolName = currentToolCall.name;\n const endTag = `</${toolName}>`;\n if (!handlePendingToolCall(controller, endTag, toolName)) {\n break;\n }\n } else {\n const { index, name, selfClosing, tagLength } = findEarliestToolTag(\n buffer,\n toolNames\n );\n\n if (index === -1) {\n flushSafeText(controller);\n break;\n }\n\n handleNewToolTag(controller, index, name, selfClosing, tagLength);\n }\n }\n };\n\n return new TransformStream({\n transform(chunk, controller) {\n if (chunk.type !== \"text-delta\") {\n if (buffer) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n controller.enqueue(chunk);\n return;\n }\n\n const textContent =\n (chunk as unknown as { delta?: string }).delta ?? \"\";\n buffer += textContent;\n processBuffer(controller);\n },\n flush(controller) {\n if (currentToolCall) {\n const unfinishedContent = `<${currentToolCall.name}>${buffer}`;\n flushText(controller, unfinishedContent);\n buffer = \"\";\n currentToolCall = null;\n } else if (buffer) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n if (currentTextId && hasEmittedTextStart) {\n controller.enqueue({\n type: \"text-end\",\n id: currentTextId,\n });\n hasEmittedTextStart = false;\n currentTextId = null;\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) {\n return [];\n }\n\n return findToolCalls(text, toolNames).map(\n (tc) => `<${tc.toolName}>${tc.content}</${tc.toolName}>`\n );\n },\n };\n};\n","import type {\n JSONSchema7,\n LanguageModelV3FunctionTool,\n LanguageModelV3ProviderTool,\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 (LanguageModelV3FunctionTool or LanguageModelV3ProviderTool).\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' tool is encountered, as they are not supported by this middleware.\n */\nexport function createDynamicIfThenElseSchema(\n tools: (LanguageModelV3FunctionTool | LanguageModelV3ProviderTool)[]\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 -= 1) {\n const tool = tools[i];\n\n if (tool.type === \"provider\") {\n throw new Error(\n \"Provider tools are not supported by this middleware. Please use function tools.\"\n );\n }\n\n toolNames.unshift(tool.name);\n\n const toolCondition: JSONSchema7 = {\n if: {\n properties: {\n name: {\n const: tool.name,\n },\n },\n required: [\"name\"],\n },\n // biome-ignore lint/suspicious/noThenProperty: JSON Schema uses 'then' as a keyword\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","export type OnErrorFn = (\n message: string,\n metadata?: Record<string, unknown>\n) => void;\n\ninterface 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;\n}\n","import type {\n JSONSchema7,\n LanguageModelV3FunctionTool,\n} from \"@ai-sdk/provider\";\n\nexport interface ToolCallMiddlewareProviderOptions {\n toolCallMiddleware?: {\n // onError?: (message: string, metadata?: Record<string, unknown>) => void;\n // Optional debug summary container that middleware can populate.\n // Values must be JSON-safe.\n debugSummary?: {\n originalText?: string;\n toolCalls?: string; // JSON string of array of { toolName, input }\n };\n\n // INTERNAL: Set by transform-handler. Used for internal propagation of tool-choice.\n toolChoice?: { type: string; toolName?: string };\n // INTERNAL: Set by transform-handler. Used for internal propagation of params.tools.\n originalTools?: Array<{\n name: string;\n inputSchema: string; // Stringified JSONSchema7\n }>;\n };\n}\n\nexport const originalToolsSchema = {\n encode: encodeOriginalTools,\n decode: decodeOriginalTools,\n};\n\nexport function encodeOriginalTools(\n tools: LanguageModelV3FunctionTool[] | undefined\n): Array<{ name: string; inputSchema: string }> {\n return (\n tools?.map((t) => ({\n name: t.name,\n inputSchema: JSON.stringify(t.inputSchema),\n })) || []\n );\n}\n\nexport function decodeOriginalTools(\n originalTools:\n | Array<{\n name: string;\n inputSchema: string; // stringified JSONSchema7\n }>\n | undefined\n): LanguageModelV3FunctionTool[] {\n if (!originalTools) {\n return [];\n }\n\n return originalTools.map(\n (t): LanguageModelV3FunctionTool => ({\n type: \"function\",\n name: t.name,\n inputSchema: JSON.parse(t.inputSchema) as JSONSchema7,\n })\n );\n}\n\nexport function extractToolNamesFromOriginalTools(\n originalTools:\n | Array<{\n name: string;\n inputSchema: string; // stringified JSONSchema7\n }>\n | undefined\n): string[] {\n return originalTools?.map((t) => t.name) || [];\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","import type { ToolResultPart } from \"@ai-sdk/provider-utils\";\n\nexport function isToolResultPart(content: unknown): content is ToolResultPart {\n if (!content || typeof content !== \"object\") {\n return false;\n }\n const c = content as Record<string, unknown>;\n return (\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 type {\n LanguageModelV3,\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport { generateId } from \"@ai-sdk/provider-utils\";\nimport type { TCMCoreProtocol } from \"./core/protocols/protocol-interface\";\nimport {\n getDebugLevel,\n logParsedChunk,\n logParsedSummary,\n logRawChunk,\n} from \"./core/utils/debug\";\nimport { extractOnErrorOption } from \"./core/utils/on-error\";\nimport {\n isToolChoiceActive,\n originalToolsSchema,\n type ToolCallMiddlewareProviderOptions,\n} from \"./core/utils/provider-options\";\nimport { coerceBySchema } from \"./schema-coerce\";\n\nfunction parseToolChoiceJson(\n text: string,\n providerOptions?: ToolCallMiddlewareProviderOptions\n): { name?: string; arguments?: Record<string, unknown> } {\n try {\n return JSON.parse(text);\n } catch (error) {\n const options = extractOnErrorOption(providerOptions);\n options?.onError?.(\n \"Failed to parse toolChoice JSON from generated model output\",\n {\n text,\n error: error instanceof Error ? error.message : String(error),\n }\n );\n return {};\n }\n}\n\nfunction logDebugSummary(\n debugSummary: { originalText?: string; toolCalls?: string } | undefined,\n toolCall: LanguageModelV3ToolCall,\n originText: string\n) {\n if (debugSummary) {\n debugSummary.originalText = originText;\n try {\n debugSummary.toolCalls = JSON.stringify([\n { toolName: toolCall.toolName, input: toolCall.input },\n ]);\n } catch {\n // ignore\n }\n } else if (getDebugLevel() === \"parse\") {\n logParsedSummary({ toolCalls: [toolCall], originalText: originText });\n }\n}\n\nasync function handleToolChoice(\n doGenerate: () => ReturnType<LanguageModelV3[\"doGenerate\"]>,\n params: { providerOptions?: ToolCallMiddlewareProviderOptions }\n) {\n const result = await doGenerate();\n const first = result.content?.[0];\n\n let parsed: { name?: string; arguments?: Record<string, unknown> } = {};\n if (first && first.type === \"text\") {\n if (getDebugLevel() === \"parse\") {\n logRawChunk(first.text);\n }\n parsed = parseToolChoiceJson(first.text, params.providerOptions);\n }\n\n const toolCall: LanguageModelV3ToolCall = {\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: parsed.name || \"unknown\",\n input: JSON.stringify(parsed.arguments || {}),\n };\n\n const originText = first && first.type === \"text\" ? first.text : \"\";\n const debugSummary = params.providerOptions?.toolCallMiddleware?.debugSummary;\n logDebugSummary(debugSummary, toolCall, originText);\n\n return {\n ...result,\n content: [toolCall],\n };\n}\n\nfunction parseContent(\n content: LanguageModelV3Content[],\n protocol: TCMCoreProtocol,\n tools: LanguageModelV3FunctionTool[],\n providerOptions?: ToolCallMiddlewareProviderOptions\n): LanguageModelV3Content[] {\n const parsed = content.flatMap((contentItem): LanguageModelV3Content[] => {\n if (contentItem.type !== \"text\") {\n return [contentItem];\n }\n if (getDebugLevel() === \"stream\") {\n logRawChunk(contentItem.text);\n }\n return protocol.parseGeneratedText({\n text: contentItem.text,\n tools,\n options: {\n ...extractOnErrorOption(providerOptions),\n ...((providerOptions as { toolCallMiddleware?: unknown } | undefined)\n ?.toolCallMiddleware as Record<string, unknown>),\n },\n }) as LanguageModelV3Content[];\n });\n\n return parsed.map((part) =>\n fixToolCallWithSchema(part as LanguageModelV3Content, tools)\n );\n}\n\nfunction logParsedContent(content: LanguageModelV3Content[]) {\n if (getDebugLevel() === \"stream\") {\n for (const part of content) {\n logParsedChunk(part);\n }\n }\n}\n\nfunction computeDebugSummary(options: {\n result: { content: LanguageModelV3Content[] };\n newContent: LanguageModelV3Content[];\n protocol: TCMCoreProtocol;\n tools: LanguageModelV3FunctionTool[];\n providerOptions?: ToolCallMiddlewareProviderOptions;\n}) {\n const { result, newContent, protocol, tools, providerOptions } = options;\n const allText = result.content\n .filter(\n (c): c is Extract<LanguageModelV3Content, { type: \"text\" }> =>\n c.type === \"text\"\n )\n .map((c) => c.text)\n .join(\"\\n\\n\");\n\n const segments = protocol.extractToolCallSegments\n ? protocol.extractToolCallSegments({ text: allText, tools })\n : [];\n const originalText = segments.join(\"\\n\\n\");\n\n const toolCalls = newContent.filter(\n (p): p is Extract<LanguageModelV3Content, { type: \"tool-call\" }> =>\n p.type === \"tool-call\"\n );\n\n const dbg = providerOptions?.toolCallMiddleware?.debugSummary;\n if (dbg) {\n dbg.originalText = originalText;\n try {\n dbg.toolCalls = JSON.stringify(\n toolCalls.map((tc) => ({\n toolName: tc.toolName,\n input: tc.input as unknown,\n }))\n );\n } catch {\n // ignore JSON failure\n }\n } else if (getDebugLevel() === \"parse\") {\n logParsedSummary({ toolCalls, originalText });\n }\n}\n\nexport async function wrapGenerate({\n protocol,\n doGenerate,\n params,\n}: {\n protocol: TCMCoreProtocol;\n doGenerate: () => ReturnType<LanguageModelV3[\"doGenerate\"]>;\n params: {\n providerOptions?: ToolCallMiddlewareProviderOptions;\n };\n}) {\n if (isToolChoiceActive(params)) {\n return handleToolChoice(doGenerate, params);\n }\n\n const tools = originalToolsSchema.decode(\n params.providerOptions?.toolCallMiddleware?.originalTools\n );\n\n const result = await doGenerate();\n\n if (result.content.length === 0) {\n return result;\n }\n\n const newContent = parseContent(\n result.content,\n protocol,\n tools,\n params.providerOptions\n );\n\n logParsedContent(newContent);\n computeDebugSummary({\n result,\n newContent,\n protocol,\n tools,\n providerOptions: params.providerOptions,\n });\n\n return {\n ...result,\n content: newContent,\n };\n}\n\nfunction fixToolCallWithSchema(\n part: LanguageModelV3Content,\n tools: LanguageModelV3FunctionTool[]\n): LanguageModelV3Content {\n if (part.type !== \"tool-call\") {\n return part;\n }\n let args: unknown = {};\n if (typeof part.input === \"string\") {\n try {\n args = JSON.parse(part.input);\n } catch {\n return part;\n }\n } else if (part.input && typeof part.input === \"object\") {\n args = part.input;\n }\n const schema = tools.find((t) => t.name === part.toolName)?.inputSchema;\n const coerced = coerceBySchema(args, schema);\n return {\n ...part,\n input: JSON.stringify(coerced ?? {}),\n };\n}\n","import type { LanguageModelV3FunctionTool } from \"@ai-sdk/provider\";\n\nexport function hermesSystemPromptTemplate(\n tools: LanguageModelV3FunctionTool[]\n): string {\n const toolsJson = JSON.stringify(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>${toolsJson}</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","import type { JSONValue } from \"@ai-sdk/provider\";\nimport type { ToolResultOutput, ToolResultPart } from \"@ai-sdk/provider-utils\";\n\n/**\n * Common tool response to text conversion utilities\n * Used by all protocols to format tool responses consistently\n */\n\n/**\n * Unwraps tool result output into a display/serialization-friendly value.\n *\n * For successful outputs (e.g. \"text\", \"json\") the underlying value is preserved.\n * For error/denial/content outputs (e.g. \"execution-denied\", \"error-text\",\n * \"error-json\", \"content\") this function returns a human-readable string\n * representation suitable for display or embedding in JSON/XML, rather than\n * the original raw tool result.\n */\nexport function unwrapToolResult(result: ToolResultOutput): JSONValue {\n switch (result.type) {\n case \"text\":\n return result.value ?? \"\";\n case \"json\":\n return result.value;\n case \"execution-denied\": {\n const reason = result.reason;\n return reason ? `[Execution Denied: ${reason}]` : \"[Execution Denied]\";\n }\n case \"error-text\":\n return `[Error: ${result.value ?? \"\"}]`;\n case \"error-json\":\n return `[Error: ${JSON.stringify(result.value)}]`;\n case \"content\": {\n return result.value\n .map((part) => {\n const contentPart = part as { type?: string };\n switch (contentPart.type) {\n case \"text\":\n return (contentPart as { text?: string }).text ?? \"\";\n case \"image-data\":\n return `[Image: ${\n (contentPart as { mediaType?: string }).mediaType\n }]`;\n case \"image-url\":\n return `[Image URL: ${(contentPart as { url?: string }).url}]`;\n case \"image-file-id\": {\n const fileId = (contentPart as { fileId?: unknown }).fileId;\n const displayId =\n typeof fileId === \"string\" ? fileId : JSON.stringify(fileId);\n return `[Image ID: ${displayId}]`;\n }\n case \"file-data\": {\n const filePart = contentPart as {\n filename?: string;\n mediaType?: string;\n };\n if (filePart.filename) {\n return `[File: ${filePart.filename} (${filePart.mediaType})]`;\n }\n return `[File: ${filePart.mediaType}]`;\n }\n case \"file-url\":\n return `[File URL: ${(contentPart as { url?: string }).url}]`;\n case \"file-id\": {\n const fileId = (contentPart as { fileId?: unknown }).fileId;\n const displayId =\n typeof fileId === \"string\" ? fileId : JSON.stringify(fileId);\n return `[File ID: ${displayId}]`;\n }\n case \"media\":\n return `[Media: ${\n (contentPart as { mediaType?: string }).mediaType\n }]`;\n case \"custom\":\n return \"[Custom content]\";\n default:\n return \"[Unknown content]\";\n }\n })\n .join(\"\\n\");\n }\n default: {\n const _exhaustive: never = result;\n return _exhaustive;\n }\n }\n}\n\n/**\n * Formats a tool response as JSON inside XML tags\n * Used by JSON protocol for tool response formatting\n */\nexport function formatToolResponseAsJsonInXml(\n toolResult: ToolResultPart\n): string {\n const unwrappedResult = unwrapToolResult(toolResult.output);\n return `<tool_response>${JSON.stringify({\n toolName: toolResult.toolName,\n result: unwrappedResult,\n })}</tool_response>`;\n}\n\n/**\n * Formats a tool response as XML\n * Used by XML and YAML protocols for tool response formatting\n */\nexport function formatToolResponseAsXml(toolResult: ToolResultPart): string {\n const unwrappedResult = unwrapToolResult(toolResult.output);\n\n const toolNameXml = `<tool_name>${toolResult.toolName}</tool_name>`;\n const resultLines = formatXmlNode(\"result\", unwrappedResult, 1);\n\n return [\n \"<tool_response>\",\n ` ${toolNameXml}`,\n ...resultLines,\n \"</tool_response>\",\n ].join(\"\\n\");\n}\n\nfunction formatXmlNode(\n tagName: string,\n value: JSONValue,\n depth: number\n): string[] {\n const indent = \" \".repeat(depth);\n\n if (value === null || value === undefined) {\n return [`${indent}<${tagName}></${tagName}>`];\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return [`${indent}<${tagName}>${String(value)}</${tagName}>`];\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return [`${indent}<${tagName}></${tagName}>`];\n }\n const lines = [`${indent}<${tagName}>`];\n for (const item of value) {\n lines.push(...formatXmlNode(\"item\", item as JSONValue, depth + 1));\n }\n lines.push(`${indent}</${tagName}>`);\n return lines;\n }\n\n const entries = Object.entries(value as Record<string, JSONValue>);\n if (entries.length === 0) {\n return [`${indent}<${tagName}></${tagName}>`];\n }\n\n const lines = [`${indent}<${tagName}>`];\n for (const [key, entryValue] of entries) {\n lines.push(...formatXmlNode(key, entryValue, depth + 1));\n }\n lines.push(`${indent}</${tagName}>`);\n return lines;\n}\n","import type {\n JSONSchema7,\n LanguageModelV3FunctionTool,\n} from \"@ai-sdk/provider\";\nimport dedent from \"dedent\";\n\nexport function xmlSystemPromptTemplate(\n tools: LanguageModelV3FunctionTool[]\n): string {\n const toolsText = renderToolsForXmlPrompt(tools);\n\n const header = dedent`\n # Tools\n You may call one or more functions to assist with the user query.\n `;\n\n const definitions = [\n \"You have access to the following functions:\",\n \"<tools>\",\n toolsText,\n \"</tools>\",\n ].join(\"\\n\");\n\n const rules = dedent`\n <rules>\n - Use exactly one XML element whose tag name is the function name.\n - Put each parameter as a child element.\n - Values must follow the schema exactly (numbers, arrays, objects, enums → copy as-is).\n - Do not add or remove functions or parameters.\n - Each required parameter must appear once.\n - Output nothing before or after the function call.\n - It is also possible to call multiple types of functions in one turn or to call a single function multiple times.\n </rules>\n `;\n\n const examples = dedent`\n For each function call, output the function name and parameter in the following format:\n <example_function_name>\n <example_parameter_1>value_1</example_parameter_1>\n <example_parameter_2>This is the value for the second parameter\n that can span\n multiple lines</example_parameter_2>\n </example_function_name>\n `;\n\n return [header, definitions, rules, examples].join(\"\\n\\n\");\n}\n\nconst INDENT = \" \";\n\nfunction renderToolsForXmlPrompt(tools: LanguageModelV3FunctionTool[]): string {\n if (!tools.length) {\n return \"none\";\n }\n\n return tools.map(renderToolForXmlPrompt).join(\"\\n\\n\");\n}\n\nfunction renderToolForXmlPrompt(tool: LanguageModelV3FunctionTool): string {\n const lines: string[] = [`name: ${tool.name}`];\n\n if (tool.description) {\n lines.push(`description: ${tool.description}`);\n }\n\n lines.push(\"parameters:\");\n const normalizedSchema = normalizeSchema(tool.inputSchema);\n lines.push(...renderParametersSummary(normalizedSchema, 1));\n lines.push(`schema: ${stringifySchema(normalizedSchema)}`);\n\n return lines.join(\"\\n\");\n}\n\nfunction normalizeSchema(\n schema: JSONSchema7 | boolean | string | undefined\n): JSONSchema7 | boolean | undefined {\n if (typeof schema === \"string\") {\n try {\n return JSON.parse(schema) as JSONSchema7;\n } catch {\n return { type: \"string\", const: schema };\n }\n }\n\n return schema;\n}\n\nfunction renderParametersSummary(\n schema: JSONSchema7 | boolean | undefined,\n indentLevel: number\n): string[] {\n const indent = INDENT.repeat(indentLevel);\n\n if (schema === undefined || schema === null) {\n return [`${indent}(none)`];\n }\n\n if (schema === true) {\n return [`${indent}(any)`];\n }\n\n if (schema === false) {\n return [`${indent}(no valid parameters)`];\n }\n\n if (typeof schema !== \"object\") {\n return [`${indent}- value (${String(schema)})`];\n }\n\n const schemaType: NonNullable<JSONSchema7[\"type\"]>[] = [];\n\n if (Array.isArray(schema.type)) {\n schemaType.push(...schema.type);\n } else if (schema.type) {\n schemaType.push(schema.type);\n }\n const isObjectLike = schemaType.includes(\"object\") || !!schema.properties;\n\n if (isObjectLike) {\n const properties = schema.properties ?? {};\n const requiredSet = new Set(schema.required ?? []);\n const propertyNames = Object.keys(properties).sort();\n if (propertyNames.length === 0) {\n return [`${indent}(no named parameters)`];\n }\n\n const lines: string[] = [];\n for (const propName of propertyNames) {\n const propSchema = properties[propName] as\n | JSONSchema7\n | boolean\n | undefined;\n lines.push(\n renderPropertySummaryLine({\n indent,\n propName,\n propSchema,\n required: requiredSet.has(propName),\n })\n );\n }\n\n return lines.length ? lines : [`${indent}(no parameters)`];\n }\n\n return [`${indent}- value (${summarizeType(schema)})`];\n}\n\nfunction renderPropertySummaryLine({\n indent,\n propName,\n propSchema,\n required,\n}: {\n indent: string;\n propName: string;\n propSchema: JSONSchema7 | boolean | undefined;\n required: boolean;\n}): string {\n const typeLabel = summarizeType(propSchema);\n const requiredLabel = required ? \"required\" : \"optional\";\n const extras = collectPropertyExtras(propSchema);\n const extraText = extras.length ? ` - ${extras.join(\"; \")}` : \"\";\n\n return `${indent}- ${propName} (${typeLabel}, ${requiredLabel})${extraText}`;\n}\n\nfunction collectPropertyExtras(\n propSchema: JSONSchema7 | boolean | undefined\n): string[] {\n if (!propSchema || typeof propSchema !== \"object\") {\n return [];\n }\n\n const extras: string[] = [];\n\n if (propSchema.enum) {\n extras.push(`enum: ${formatEnumForSummary(propSchema.enum)}`);\n }\n\n if (propSchema.default !== undefined) {\n extras.push(`default: ${formatValue(propSchema.default)}`);\n }\n\n if (propSchema.description) {\n extras.push(propSchema.description);\n }\n\n return extras;\n}\n\nfunction summarizeType(schema: JSONSchema7 | boolean | undefined): string {\n if (schema === undefined || schema === null) {\n return \"unknown\";\n }\n\n if (schema === true) {\n return \"any\";\n }\n\n if (schema === false) {\n return \"never\";\n }\n\n if (typeof schema !== \"object\") {\n return String(schema);\n }\n\n const schemaType = schema.type;\n let baseType = \"\";\n\n if (Array.isArray(schemaType) && schemaType.length) {\n baseType = schemaType.join(\" | \");\n } else if (typeof schemaType === \"string\") {\n baseType = schemaType;\n } else if (schema.enum) {\n const inferred: string[] = Array.from(\n new Set(schema.enum.map((value: unknown) => typeof value))\n );\n if (inferred.length === 1) {\n baseType = inferred[0] ?? \"\";\n }\n } else if (schema.const !== undefined) {\n baseType = typeof schema.const;\n }\n\n if (!baseType) {\n baseType = \"any\";\n }\n\n if (baseType === \"array\" && schema.items) {\n const itemType = Array.isArray(schema.items)\n ? schema.items\n .map((item: JSONSchema7 | boolean) => summarizeType(item))\n .join(\" | \")\n : summarizeType(schema.items);\n return `array<${itemType}>`;\n }\n\n if (baseType === \"string\" && schema.format) {\n return `string (${schema.format})`;\n }\n\n return baseType;\n}\n\nconst ENUM_MAX_INLINE = 6;\nconst ENUM_PREVIEW_LIMIT = 5;\n\nfunction formatEnumForSummary(values: unknown[]): string {\n if (values.length <= ENUM_MAX_INLINE) {\n return formatValue(values);\n }\n\n const preview = values\n .slice(0, ENUM_PREVIEW_LIMIT)\n .map((value) => formatValue(value));\n return `[${preview.join(\", \")}, ... (${values.length} total)]`;\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (value === null) {\n return \"null\";\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(formatValue).join(\", \")}]`;\n }\n\n return JSON.stringify(value);\n}\n\nfunction stringifySchema(schema: JSONSchema7 | boolean | undefined): string {\n if (schema === undefined) {\n return \"null\";\n }\n\n return JSON.stringify(stripSchemaKeys(schema));\n}\n\nfunction stripSchemaKeys(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => stripSchemaKeys(entry));\n }\n\n if (value && typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n const cleaned: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(record)) {\n if (key === \"$schema\") {\n continue;\n }\n cleaned[key] = stripSchemaKeys(entry);\n }\n\n return cleaned;\n }\n\n return value;\n}\n","import type { LanguageModelV3FunctionTool } from \"@ai-sdk/provider\";\n\nexport function yamlSystemPromptTemplate(\n tools: LanguageModelV3FunctionTool[],\n includeMultilineExample = true\n): string {\n const toolsJson = JSON.stringify(tools);\n const multilineExample = includeMultilineExample\n ? `\n\nFor multiline values, use YAML's literal block syntax:\n<write_file>\nfile_path: /tmp/example.txt\ncontents: |\n First line\n Second line\n Third line\n</write_file>`\n : \"\";\n\n return `# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>${toolsJson}</tools>\n\n# Format\n\nUse exactly one XML element whose tag name is the function name.\nInside the XML element, specify parameters using YAML syntax (key: value pairs).\n\n# Example\n<get_weather>\nlocation: New York\nunit: celsius\n</get_weather>${multilineExample}\n\n# Rules\n- Parameter names and values must follow the schema exactly.\n- Use proper YAML syntax for values (strings, numbers, booleans, arrays, objects).\n- Each required parameter must appear once.\n- Do not add functions or parameters not in the schema.\n- After calling a tool, you will receive a response. Use this result to answer the user.\n- Do NOT ask clarifying questions. Use reasonable defaults for optional parameters.\n- If a task requires multiple function calls, make ALL of them at once.`;\n}\n","import type {\n LanguageModelV3,\n LanguageModelV3StreamPart,\n} from \"@ai-sdk/provider\";\nimport { generateId } from \"@ai-sdk/provider-utils\";\nimport type { TCMCoreProtocol } from \"./core/protocols/protocol-interface\";\nimport { getDebugLevel, logParsedChunk, logRawChunk } from \"./core/utils/debug\";\nimport { extractOnErrorOption } from \"./core/utils/on-error\";\nimport {\n isToolChoiceActive,\n originalToolsSchema,\n type ToolCallMiddlewareProviderOptions,\n} from \"./core/utils/provider-options\";\n\nexport async function wrapStream({\n protocol,\n doStream,\n doGenerate,\n params,\n}: {\n protocol: TCMCoreProtocol;\n doStream: () => ReturnType<LanguageModelV3[\"doStream\"]>;\n doGenerate: () => ReturnType<LanguageModelV3[\"doGenerate\"]>;\n params: {\n providerOptions?: ToolCallMiddlewareProviderOptions;\n };\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 const debugLevel = getDebugLevel();\n const tools = originalToolsSchema.decode(\n params.providerOptions?.toolCallMiddleware?.originalTools\n );\n const options = {\n ...extractOnErrorOption(params.providerOptions),\n ...((params.providerOptions as Record<string, unknown>)\n ?.toolCallMiddleware || {}),\n };\n\n const coreStream = stream\n .pipeThrough(\n new TransformStream<LanguageModelV3StreamPart, LanguageModelV3StreamPart>(\n {\n transform(part, controller) {\n if (debugLevel === \"stream\") {\n logRawChunk(part);\n }\n controller.enqueue(part);\n },\n }\n )\n )\n .pipeThrough(protocol.createStreamParser({ tools, options }));\n\n const v3Stream = coreStream.pipeThrough(\n new TransformStream<LanguageModelV3StreamPart, LanguageModelV3StreamPart>({\n transform(part, controller) {\n if (debugLevel === \"stream\") {\n logParsedChunk(part);\n }\n controller.enqueue(part);\n },\n })\n );\n\n return {\n ...rest,\n stream: v3Stream,\n };\n}\n\nexport async function toolChoiceStream({\n doGenerate,\n options,\n}: {\n doGenerate: () => ReturnType<LanguageModelV3[\"doGenerate\"]>;\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n}) {\n const result = await doGenerate();\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 stream = new ReadableStream<LanguageModelV3StreamPart>({\n start(controller) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: generateId(),\n toolName: toolJson.name || \"unknown\",\n input: JSON.stringify(toolJson.arguments || {}),\n });\n controller.enqueue({\n type: \"finish\",\n usage: result?.usage || {\n inputTokens: 0,\n outputTokens: 0,\n },\n finishReason: \"tool-calls\",\n } as unknown as LanguageModelV3StreamPart);\n controller.close();\n },\n });\n\n return {\n request: result?.request || {},\n response: result?.response || {},\n stream,\n };\n}\n","import type {\n JSONSchema7,\n LanguageModelV3Content,\n LanguageModelV3FilePart,\n LanguageModelV3FunctionTool,\n LanguageModelV3Message,\n LanguageModelV3Prompt,\n LanguageModelV3ReasoningPart,\n LanguageModelV3TextPart,\n LanguageModelV3ToolCallPart,\n LanguageModelV3ToolResultPart,\n SharedV3ProviderOptions,\n} from \"@ai-sdk/provider\";\nimport type {\n ToolApprovalResponse,\n ToolContent,\n ToolResultPart,\n} from \"@ai-sdk/provider-utils\";\nimport type { TCMCoreProtocol } from \"./core/protocols/protocol-interface\";\nimport { isTCMProtocolFactory } from \"./core/protocols/protocol-interface\";\nimport { createDynamicIfThenElseSchema } from \"./core/utils/dynamic-tool-schema\";\nimport { extractOnErrorOption } from \"./core/utils/on-error\";\nimport { originalToolsSchema } from \"./core/utils/provider-options\";\n\n/**\n * Build final prompt by merging system prompt with existing prompt\n */\nfunction buildFinalPrompt(\n systemPrompt: string,\n processedPrompt: LanguageModelV3Prompt,\n placement: \"first\" | \"last\"\n): LanguageModelV3Prompt {\n const systemIndex = processedPrompt.findIndex((m) => m.role === \"system\");\n if (systemIndex !== -1) {\n const existing = processedPrompt[systemIndex].content as unknown;\n let existingText = \"\";\n if (typeof existing === \"string\") {\n existingText = existing;\n } else if (Array.isArray(existing)) {\n existingText = (existing as { type?: string; text?: string }[])\n .map((p) => (p?.type === \"text\" ? (p.text ?? \"\") : \"\"))\n .filter(Boolean)\n .join(\"\\n\");\n } else {\n existingText = String(existing ?? \"\");\n }\n\n const mergedContent =\n placement === \"first\"\n ? `${systemPrompt}\\n\\n${existingText}`\n : `${existingText}\\n\\n${systemPrompt}`;\n\n return processedPrompt.map((m, idx) =>\n idx === systemIndex\n ? {\n ...m,\n content: mergedContent,\n }\n : m\n ) as LanguageModelV3Prompt;\n }\n if (placement === \"first\") {\n return [\n {\n role: \"system\",\n content: systemPrompt,\n },\n ...processedPrompt,\n ];\n }\n // placement === 'last'\n return [\n ...processedPrompt,\n {\n role: \"system\",\n content: systemPrompt,\n },\n ];\n}\n\n/**\n * Build base return parameters with middleware options\n */\nfunction buildBaseReturnParams(\n params: {\n prompt?: LanguageModelV3Prompt;\n tools?: Array<LanguageModelV3FunctionTool | { type: string }>;\n providerOptions?: unknown;\n toolChoice?: { type: string; toolName?: string };\n },\n finalPrompt: LanguageModelV3Prompt,\n functionTools: LanguageModelV3FunctionTool[]\n) {\n return {\n ...params,\n prompt: finalPrompt,\n tools: [] as never[],\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 originalTools: originalToolsSchema.encode(functionTools),\n },\n } as unknown as SharedV3ProviderOptions,\n };\n}\n\n/**\n * Find provider-defined tool matching the selected tool name\n */\nfunction findProviderDefinedTool(\n tools: Array<LanguageModelV3FunctionTool | { type: string }>,\n selectedToolName: string\n) {\n return tools.find((t) => {\n if (t.type === \"function\") {\n return false;\n }\n const anyTool = t as unknown as { id?: string; name?: string };\n return anyTool.id === selectedToolName || anyTool.name === selectedToolName;\n });\n}\n\n/**\n * Handle tool choice type 'tool'\n */\nfunction handleToolChoiceTool(\n params: {\n tools?: Array<LanguageModelV3FunctionTool | { type: string }>;\n toolChoice?: { type: string; toolName?: string };\n },\n baseReturnParams: ReturnType<typeof buildBaseReturnParams>\n) {\n const selectedToolName = params.toolChoice?.toolName;\n if (!selectedToolName) {\n throw new Error(\"Tool name is required for 'tool' toolChoice type.\");\n }\n\n const providerDefinedMatch = findProviderDefinedTool(\n params.tools ?? [],\n selectedToolName\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 LanguageModelV3FunctionTool =>\n t.type === \"function\" &&\n (t as LanguageModelV3FunctionTool).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 ...(params.toolChoice ? { toolChoice: params.toolChoice } : {}),\n },\n },\n };\n}\n\n/**\n * Handle tool choice type 'required'\n */\nfunction handleToolChoiceRequired(\n params: {\n tools?: Array<LanguageModelV3FunctionTool | { type: string }>;\n toolChoice?: { type: string; toolName?: string };\n },\n baseReturnParams: ReturnType<typeof buildBaseReturnParams>,\n functionTools: LanguageModelV3FunctionTool[]\n) {\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 toolChoice: { type: \"required\" as const },\n },\n },\n };\n}\n\nexport function transformParams({\n params,\n protocol,\n toolSystemPromptTemplate,\n toolResponsePromptTemplate,\n placement = \"first\",\n}: {\n params: {\n prompt?: LanguageModelV3Prompt;\n tools?: Array<LanguageModelV3FunctionTool | { type: string }>;\n providerOptions?: {\n toolCallMiddleware?: {\n toolChoice?: { type: string };\n };\n };\n toolChoice?: { type: string; toolName?: string };\n };\n protocol: TCMCoreProtocol | (() => TCMCoreProtocol);\n toolSystemPromptTemplate: (tools: LanguageModelV3FunctionTool[]) => string;\n toolResponsePromptTemplate?: (toolResult: ToolResultPart) => string;\n placement?: \"first\" | \"last\";\n}) {\n const resolvedProtocol = isTCMProtocolFactory(protocol)\n ? protocol()\n : protocol;\n\n const functionTools = (params.tools ?? []).filter(\n (t): t is LanguageModelV3FunctionTool => t.type === \"function\"\n );\n\n const systemPrompt = resolvedProtocol.formatTools({\n tools: functionTools,\n toolSystemPromptTemplate,\n });\n\n let normalizedPrompt: LanguageModelV3Message[];\n if (Array.isArray(params.prompt)) {\n normalizedPrompt = params.prompt;\n } else if (params.prompt) {\n normalizedPrompt = [params.prompt];\n } else {\n normalizedPrompt = [];\n }\n const processedPrompt = convertToolPrompt(\n normalizedPrompt,\n resolvedProtocol,\n toolResponsePromptTemplate,\n extractOnErrorOption(params.providerOptions)\n );\n\n const finalPrompt = buildFinalPrompt(\n systemPrompt,\n processedPrompt,\n placement\n );\n const baseReturnParams = buildBaseReturnParams(\n params,\n finalPrompt,\n functionTools\n );\n\n if (params.toolChoice?.type === \"none\") {\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 return handleToolChoiceTool(params, baseReturnParams);\n }\n\n if (params.toolChoice?.type === \"required\") {\n return handleToolChoiceRequired(params, baseReturnParams, functionTools);\n }\n\n return baseReturnParams;\n}\n\n/**\n * Process assistant message content\n */\nfunction processAssistantContent(\n content: LanguageModelV3Content[],\n resolvedProtocol: TCMCoreProtocol,\n providerOptions?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n }\n): LanguageModelV3Content[] {\n const newContent: LanguageModelV3Content[] = [];\n for (const item of content) {\n switch (item.type) {\n case \"tool-call\":\n newContent.push({\n type: \"text\",\n text: resolvedProtocol.formatToolCall(item),\n });\n break;\n case \"text\":\n case \"reasoning\":\n newContent.push(item);\n break;\n default: {\n const options = extractOnErrorOption(providerOptions);\n options?.onError?.(\n \"tool-call-middleware: unknown assistant content; stringifying for provider compatibility\",\n { content: item }\n );\n newContent.push({\n type: \"text\",\n text: JSON.stringify(item),\n });\n }\n }\n }\n\n // Condense if all content is text\n const onlyText = newContent.every((c) => c.type === \"text\");\n return onlyText\n ? [\n {\n type: \"text\" as const,\n text: newContent.map((c) => (c as { text: string }).text).join(\"\\n\"),\n },\n ]\n : newContent;\n}\n\n/**\n * Process tool message content\n */\nfunction formatApprovalResponse(part: ToolApprovalResponse): string {\n const status = part.approved ? \"Approved\" : \"Denied\";\n const reason = part.reason ? `: ${part.reason}` : \"\";\n return `[Tool Approval ${status}${reason}]`;\n}\n\nfunction processToolMessage(\n toolResults: ToolResultPart[],\n approvalResponses: ToolApprovalResponse[],\n toolResponsePromptTemplate: (toolResult: ToolResultPart) => string\n): LanguageModelV3Prompt[number] {\n const resultTexts = toolResults.map((toolResult) => {\n return toolResponsePromptTemplate(toolResult);\n });\n\n const approvalTexts = approvalResponses.map(formatApprovalResponse);\n\n const allTexts = [...resultTexts, ...approvalTexts];\n\n return {\n role: \"user\" as const,\n content: [\n {\n type: \"text\" as const,\n text: allTexts.join(\"\\n\"),\n },\n ],\n };\n}\n\n/**\n * Process a single message in the prompt\n */\nfunction processMessage(\n message: LanguageModelV3Prompt[number],\n resolvedProtocol: TCMCoreProtocol,\n providerOptions?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n },\n toolResponsePromptTemplate?: (toolResult: ToolResultPart) => string\n): LanguageModelV3Prompt[number] {\n if (message.role === \"assistant\") {\n const condensedContent = processAssistantContent(\n message.content as LanguageModelV3Content[],\n resolvedProtocol,\n providerOptions\n );\n return {\n role: \"assistant\" as const,\n content: condensedContent as Array<\n | LanguageModelV3TextPart\n | LanguageModelV3FilePart\n | LanguageModelV3ReasoningPart\n | LanguageModelV3ToolCallPart\n | LanguageModelV3ToolResultPart\n >,\n };\n }\n if (message.role === \"tool\") {\n const toolContent = message.content as ToolContent;\n const toolResultParts = toolContent.filter(\n (part): part is ToolResultPart => part.type === \"tool-result\"\n );\n const approvalResponseParts = toolContent.filter(\n (part): part is ToolApprovalResponse =>\n part.type === \"tool-approval-response\"\n );\n if (!toolResponsePromptTemplate) {\n throw new Error(\n 'toolResponsePromptTemplate is required when processing messages with role \"tool\". ' +\n \"This parameter is optional for other roles but is required here so tool-result content can be \" +\n \"converted into a prompt. Ensure your middleware or transform configuration passes a toolResponsePromptTemplate \" +\n \"when tool message processing is enabled.\"\n );\n }\n return processToolMessage(\n toolResultParts,\n approvalResponseParts,\n toolResponsePromptTemplate\n );\n }\n return message;\n}\n\n/**\n * Check if all content parts are text\n */\nfunction isAllTextContent(content: unknown): boolean {\n if (!Array.isArray(content)) {\n return false;\n }\n return (content as { type: string }[]).every(\n (c: { type: string }) => c?.type === \"text\"\n );\n}\n\n/**\n * Join text content parts into a single string\n */\nfunction joinTextContent(content: { text: string }[]): string {\n return content.map((c) => c.text).join(\"\\n\");\n}\n\n/**\n * Create condensed message based on role\n */\nfunction createCondensedMessage(role: string, joinedText: string) {\n if (role === \"system\") {\n return {\n role: \"system\" as const,\n content: joinedText,\n };\n }\n\n return {\n role: role as \"assistant\" | \"user\",\n content: [\n {\n type: \"text\" as const,\n text: joinedText,\n },\n ],\n };\n}\n\n/**\n * Condense multi-part text content into single text part\n */\nfunction condenseTextContent(\n processedPrompt: LanguageModelV3Prompt\n): LanguageModelV3Prompt {\n for (let i = 0; i < processedPrompt.length; i += 1) {\n const msg = processedPrompt[i] as unknown as {\n role: string;\n content: unknown;\n };\n\n if (!Array.isArray(msg.content)) {\n continue;\n }\n\n const shouldCondense =\n isAllTextContent(msg.content) && msg.content.length > 1;\n if (shouldCondense) {\n const joinedText = joinTextContent(msg.content as { text: string }[]);\n processedPrompt[i] = createCondensedMessage(msg.role, joinedText);\n }\n }\n return processedPrompt;\n}\n\n/**\n * Merge consecutive user messages\n */\nfunction mergeConsecutiveUserMessages(\n processedPrompt: LanguageModelV3Prompt\n): LanguageModelV3Prompt {\n for (let i = processedPrompt.length - 1; i > 0; i -= 1) {\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;\n}\n\nfunction convertToolPrompt(\n prompt: LanguageModelV3Message[],\n resolvedProtocol: TCMCoreProtocol,\n toolResponsePromptTemplate?: (toolResult: ToolResultPart) => string,\n providerOptions?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n }\n): LanguageModelV3Message[] {\n let processedPrompt = prompt.map((message: LanguageModelV3Message) =>\n processMessage(\n message,\n resolvedProtocol,\n providerOptions,\n toolResponsePromptTemplate\n )\n );\n\n processedPrompt = condenseTextContent(processedPrompt);\n processedPrompt = mergeConsecutiveUserMessages(processedPrompt);\n return processedPrompt as LanguageModelV3Prompt;\n}\n","import type {\n LanguageModelV3CallOptions,\n LanguageModelV3FunctionTool,\n LanguageModelV3Middleware,\n} from \"@ai-sdk/provider\";\nimport type { ToolResultPart } from \"@ai-sdk/provider-utils\";\nimport type { TCMCoreProtocol } from \"./core/protocols/protocol-interface\";\nimport { isTCMProtocolFactory } from \"./core/protocols/protocol-interface\";\nimport { wrapGenerate as wrapGenerateHandler } from \"./generate-handler\";\nimport { wrapStream as wrapStreamHandler } from \"./stream-handler\";\nimport { transformParams } from \"./transform-handler\";\n\nexport function createToolMiddleware({\n protocol,\n toolSystemPromptTemplate,\n toolResponsePromptTemplate,\n placement = \"last\",\n}: {\n protocol: TCMCoreProtocol | (() => TCMCoreProtocol);\n toolSystemPromptTemplate: (tools: LanguageModelV3FunctionTool[]) => string;\n toolResponsePromptTemplate?: (toolResult: ToolResultPart) => string;\n placement?: \"first\" | \"last\";\n}): LanguageModelV3Middleware {\n const resolvedProtocol = isTCMProtocolFactory(protocol)\n ? protocol()\n : protocol;\n\n return {\n specificationVersion: \"v3\",\n wrapStream: ({ doStream, doGenerate, params }) =>\n wrapStreamHandler({\n protocol: resolvedProtocol,\n doStream,\n doGenerate,\n params,\n }),\n wrapGenerate: async ({ doGenerate, params }) =>\n wrapGenerateHandler({\n protocol: resolvedProtocol,\n doGenerate,\n params,\n }),\n transformParams: async ({ params }): Promise<LanguageModelV3CallOptions> =>\n transformParams({\n protocol: resolvedProtocol,\n toolSystemPromptTemplate,\n toolResponsePromptTemplate,\n placement,\n params,\n }),\n };\n}\n","import { hermesSystemPromptTemplate } from \"./core/prompts/hermes-system-prompt\";\nimport {\n formatToolResponseAsJsonInXml,\n formatToolResponseAsXml,\n} from \"./core/prompts/tool-response\";\nimport { xmlSystemPromptTemplate } from \"./core/prompts/xml-system-prompt\";\nimport { yamlSystemPromptTemplate } from \"./core/prompts/yaml-system-prompt\";\nimport { jsonProtocol } from \"./core/protocols/json-protocol\";\nimport { xmlProtocol } from \"./core/protocols/xml-protocol\";\nimport { yamlProtocol } from \"./core/protocols/yaml-protocol\";\nimport { createToolMiddleware } from \"./tool-call-middleware\";\n\nexport const hermesToolMiddleware = createToolMiddleware({\n protocol: jsonProtocol({}),\n toolSystemPromptTemplate: hermesSystemPromptTemplate,\n toolResponsePromptTemplate: formatToolResponseAsJsonInXml,\n});\n\nexport const xmlToolMiddleware = createToolMiddleware({\n protocol: xmlProtocol({}),\n toolSystemPromptTemplate: xmlSystemPromptTemplate,\n toolResponsePromptTemplate: formatToolResponseAsXml,\n});\n\nexport const yamlToolMiddleware = createToolMiddleware({\n protocol: yamlProtocol({}),\n toolSystemPromptTemplate: yamlSystemPromptTemplate,\n toolResponsePromptTemplate: formatToolResponseAsXml,\n});\n"],"mappings":"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","names":["stringify","escaped","result","children","WHITESPACE_REGEX","DIGIT_KEY_REGEX","parse","end","WHITESPACE_REGEX","keys","DIGIT_KEY_REGEX","parse","WHITESPACE_REGEX","parse","parse","NAME_CHAR_RE","WHITESPACE_REGEX","parse","WHITESPACE_REGEX","NAME_CHAR_RE","newBuffer","stringify","_a","WHITESPACE_REGEX","NAME_CHAR_RE","findToolCalls","YAML","createFlushTextHandler","findEarliestToolTag","_a","lines","dedent","import_provider_utils"]}
|