@ai-sdk-tool/parser 4.1.1 → 4.1.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../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/streamed-tool-input-delta.ts","../src/core/utils/tool-call-coercion.ts","../src/core/utils/tool-input-streaming.ts","../src/core/protocols/hermes-protocol.ts","../src/core/utils/regex-constants.ts","../src/core/utils/xml-root-repair.ts","../src/core/utils/xml-tool-tag-scanner.ts","../src/core/protocols/morph-xml-stream-state-machine.ts","../src/core/protocols/morph-xml-protocol.ts","../src/core/protocols/protocol-interface.ts","../src/core/protocols/qwen3coder-stream-call-content.ts","../src/core/protocols/qwen3coder-protocol.ts","../src/core/protocols/yaml-xml-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/core/utils/generated-text-json-recovery.ts","../src/core/utils/tool-choice.ts","../src/generate-handler.ts","../src/core/prompts/shared/text-part.ts","../src/core/prompts/shared/tool-result-normalizer.ts","../src/core/prompts/hermes-prompt.ts","../src/core/prompts/morph-xml-prompt.ts","../src/core/prompts/qwen3coder-prompt.ts","../src/core/prompts/yaml-xml-prompt.ts","../src/stream-handler.ts","../src/core/prompts/shared/assistant-tool-calls-to-text.ts","../src/core/prompts/shared/tool-role-to-user-message.ts","../src/transform-handler.ts","../src/tool-call-middleware.ts","../src/preconfigured-middleware.ts"],"sourcesContent":["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 const textLength = text.length;\n const searchedTextLength = searchedText.length;\n\n // Performance optimization:\n // 1. Limit the loop to searchedTextLength - 1. Any suffix longer than this\n // cannot be a prefix of searchedText (and full matches were caught by indexOf).\n // This prevents O(N²) complexity in growing buffers.\n // 2. Use character-by-character comparison to avoid string allocation overhead\n // from substring() or startsWith().\n // 3. Find the longest suffix (earliest index) first, which is more correct\n // for streaming overlapping patterns (e.g., text \"ababa\", search \"ababax\").\n const startAt = Math.max(0, textLength - searchedTextLength + 1);\n\n for (let i = startAt; i < textLength; i++) {\n let match = true;\n const currentSuffixLength = textLength - i;\n\n for (let j = 0; j < currentSuffixLength; j++) {\n if (text[i + j] !== searchedText[j]) {\n match = false;\n break;\n }\n }\n\n if (match) {\n return i;\n }\n }\n\n return null;\n}\n","export function generateId(): string {\n return crypto.randomUUID().replace(/-/g, \"\").slice(0, 13);\n}\n\nconst TOOL_CALL_ID_PREFIX = \"call_\";\nconst TOOL_CALL_ID_BODY_LENGTH = 24;\nconst TOOL_CALL_ID_ALPHANUM =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\nfunction randomAlphaNumeric(length: number): string {\n const bytes = new Uint8Array(length);\n crypto.getRandomValues(bytes);\n let out = \"\";\n for (let i = 0; i < length; i += 1) {\n const byte = bytes[i];\n const index = (byte ?? 0) % TOOL_CALL_ID_ALPHANUM.length;\n out += TOOL_CALL_ID_ALPHANUM[index] ?? \"0\";\n }\n return out;\n}\n\nexport function generateToolCallId(): string {\n return `${TOOL_CALL_ID_PREFIX}${randomAlphaNumeric(TOOL_CALL_ID_BODY_LENGTH)}`;\n}\n","import type {\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n} from \"@ai-sdk/provider\";\nimport { generateId } from \"./id\";\n\nexport function formatToolsWithPromptTemplate(options: {\n tools: LanguageModelV3FunctionTool[];\n toolSystemPromptTemplate: (tools: LanguageModelV3FunctionTool[]) => string;\n}): string {\n return options.toolSystemPromptTemplate(options.tools || []);\n}\n\nexport function extractToolNames(\n tools: LanguageModelV3FunctionTool[]\n): string[] {\n return tools.map((tool) => tool.name).filter(Boolean) as string[];\n}\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\nexport function 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","import type { LanguageModelV3StreamPart } from \"@ai-sdk/provider\";\n\nexport interface EmittedToolInputState {\n emittedInput: string;\n}\n\ninterface EmitToolInputDeltaBaseParams {\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>;\n id: string;\n state: EmittedToolInputState;\n}\n\ninterface EmitPrefixDeltaParams extends EmitToolInputDeltaBaseParams {\n candidate: string;\n}\n\ninterface EmitChunkedPrefixDeltaParams extends EmitPrefixDeltaParams {\n maxChunkChars?: number;\n}\n\ninterface EmitFinalRemainderParams extends EmitToolInputDeltaBaseParams {\n finalFullJson: string;\n onMismatch?: (message: string, metadata?: Record<string, unknown>) => void;\n}\n\nfunction emitDelta({\n controller,\n id,\n state,\n nextInput,\n}: EmitToolInputDeltaBaseParams & {\n nextInput: string;\n}): boolean {\n if (!nextInput.startsWith(state.emittedInput)) {\n return false;\n }\n\n const delta = nextInput.slice(state.emittedInput.length);\n if (delta.length === 0) {\n return false;\n }\n\n controller.enqueue({\n type: \"tool-input-delta\",\n id,\n delta,\n });\n state.emittedInput = nextInput;\n return true;\n}\n\n/**\n * Converts a complete JSON string to an incomplete prefix suitable for streaming.\n * Handles object, array, and string root types correctly.\n */\nexport function toIncompleteJsonPrefix(fullJson: string): string {\n const trimmed = fullJson.trim();\n let prefix = trimmed;\n\n while (prefix.endsWith(\"}\") || prefix.endsWith(\"]\")) {\n prefix = prefix.slice(0, -1);\n }\n\n prefix = prefix.trimEnd();\n\n if (prefix.endsWith('\"')) {\n prefix = prefix.slice(0, -1);\n }\n\n if (prefix.length === 0) {\n if (trimmed.startsWith(\"[\") || trimmed.startsWith(\"{\")) {\n return trimmed.startsWith(\"{\") ? \"{\" : \"[\";\n }\n if (trimmed.startsWith(\"]\")) {\n return \"[\";\n }\n if (trimmed.startsWith(\"}\")) {\n return \"{\";\n }\n if (trimmed.startsWith('\"')) {\n return '\"';\n }\n return \"{\";\n }\n\n return prefix;\n}\n\nexport function emitPrefixDelta(params: EmitPrefixDeltaParams): boolean {\n return emitDelta({\n ...params,\n nextInput: params.candidate,\n });\n}\n\nconst DEFAULT_TOOL_INPUT_DELTA_CHUNK_CHARS = 512;\n\nexport function emitChunkedPrefixDelta(\n params: EmitChunkedPrefixDeltaParams\n): boolean {\n const { maxChunkChars = DEFAULT_TOOL_INPUT_DELTA_CHUNK_CHARS } = params;\n if (maxChunkChars <= 0) {\n return emitPrefixDelta(params);\n }\n\n const growth = params.candidate.length - params.state.emittedInput.length;\n if (growth <= 0) {\n return false;\n }\n\n if (growth <= maxChunkChars) {\n return emitPrefixDelta(params);\n }\n\n let emittedAny = false;\n let cursor = params.state.emittedInput.length + maxChunkChars;\n while (cursor < params.candidate.length) {\n const didEmit = emitPrefixDelta({\n controller: params.controller,\n id: params.id,\n state: params.state,\n candidate: params.candidate.slice(0, cursor),\n });\n if (!didEmit) {\n return emittedAny;\n }\n emittedAny = true;\n cursor += maxChunkChars;\n }\n\n return (\n emitPrefixDelta({\n controller: params.controller,\n id: params.id,\n state: params.state,\n candidate: params.candidate,\n }) || emittedAny\n );\n}\n\nexport function emitFinalRemainder(params: EmitFinalRemainderParams): boolean {\n const result = emitDelta({\n ...params,\n nextInput: params.finalFullJson,\n });\n\n if (!result && params.state.emittedInput.length > 0) {\n params.onMismatch?.(\n \"Final JSON does not extend emitted tool-input prefix\",\n {\n emittedLength: params.state.emittedInput.length,\n finalLength: params.finalFullJson.length,\n }\n );\n }\n\n return result;\n}\n","import type {\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n} from \"@ai-sdk/provider\";\nimport { coerceBySchema } from \"../../schema-coerce\";\n\ntype ToolCallLike = Extract<\n LanguageModelV3Content | LanguageModelV3StreamPart,\n { type: \"tool-call\" }\n>;\n\nexport function coerceToolCallInput(\n toolName: string,\n input: unknown,\n tools: LanguageModelV3FunctionTool[]\n): string | undefined {\n let args: unknown = {};\n if (typeof input === \"string\") {\n try {\n args = JSON.parse(input);\n } catch {\n return;\n }\n } else if (input && typeof input === \"object\") {\n args = input;\n } else {\n return;\n }\n\n const schema = tools.find((t) => t.name === toolName)?.inputSchema;\n const coerced = coerceBySchema(args, schema);\n return JSON.stringify(coerced ?? {});\n}\n\nexport function coerceToolCallPart<T extends ToolCallLike>(\n part: T,\n tools: LanguageModelV3FunctionTool[]\n): T {\n const coercedInput = coerceToolCallInput(part.toolName, part.input, tools);\n if (coercedInput === undefined) {\n return part;\n }\n\n return {\n ...part,\n input: coercedInput,\n };\n}\n","import type {\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n} from \"@ai-sdk/provider\";\nimport {\n type EmittedToolInputState,\n emitChunkedPrefixDelta,\n emitFinalRemainder,\n toIncompleteJsonPrefix,\n} from \"./streamed-tool-input-delta\";\nimport { coerceToolCallInput } from \"./tool-call-coercion\";\n\ntype StreamController =\n TransformStreamDefaultController<LanguageModelV3StreamPart>;\n\ninterface RawFallbackOptions {\n emitRawToolCallTextOnError?: boolean;\n}\n\ntype OnMismatch = (message: string, metadata?: Record<string, unknown>) => void;\n\nexport function stringifyToolInputWithSchema(options: {\n toolName: string;\n args: unknown;\n tools: LanguageModelV3FunctionTool[];\n fallback?: (args: unknown) => string;\n}): string {\n const coerced = coerceToolCallInput(\n options.toolName,\n options.args,\n options.tools\n );\n if (coerced !== undefined) {\n return coerced;\n }\n\n if (options.fallback) {\n return options.fallback(options.args);\n }\n\n return JSON.stringify(options.args ?? {});\n}\n\nexport function emitToolInputProgressDelta(options: {\n controller: StreamController;\n id: string;\n state: EmittedToolInputState;\n fullInput: string;\n mode?: \"full-json\" | \"incomplete-json-prefix\";\n}): boolean {\n const mode = options.mode ?? \"incomplete-json-prefix\";\n const candidate =\n mode === \"full-json\"\n ? options.fullInput\n : toIncompleteJsonPrefix(options.fullInput);\n\n return emitChunkedPrefixDelta({\n controller: options.controller,\n id: options.id,\n state: options.state,\n candidate,\n });\n}\n\nexport function enqueueToolInputEndAndCall(options: {\n controller: StreamController;\n id: string;\n toolName: string;\n input: string;\n}): void {\n enqueueToolInputEnd({\n controller: options.controller,\n id: options.id,\n });\n options.controller.enqueue({\n type: \"tool-call\",\n toolCallId: options.id,\n toolName: options.toolName,\n input: options.input,\n });\n}\n\nexport function enqueueToolInputEnd(options: {\n controller: StreamController;\n id: string;\n}): void {\n options.controller.enqueue({\n type: \"tool-input-end\",\n id: options.id,\n });\n}\n\nexport function emitFailedToolInputLifecycle(options: {\n controller: StreamController;\n id: string;\n emitRawToolCallTextOnError: boolean;\n emitRawText?: (rawText: string) => void;\n endInput?: boolean;\n rawToolCallText?: string | null;\n}): void {\n if (options.endInput !== false) {\n enqueueToolInputEnd({\n controller: options.controller,\n id: options.id,\n });\n }\n\n if (\n options.emitRawToolCallTextOnError &&\n typeof options.rawToolCallText === \"string\" &&\n options.rawToolCallText.length > 0\n ) {\n options.emitRawText?.(options.rawToolCallText);\n }\n}\n\nexport function emitFinalizedToolInputLifecycle(options: {\n controller: StreamController;\n id: string;\n state: EmittedToolInputState;\n toolName: string;\n finalInput: string;\n onMismatch?: OnMismatch;\n}): void {\n emitFinalRemainder({\n controller: options.controller,\n id: options.id,\n state: options.state,\n finalFullJson: options.finalInput,\n onMismatch: options.onMismatch,\n });\n\n enqueueToolInputEndAndCall({\n controller: options.controller,\n id: options.id,\n toolName: options.toolName,\n input: options.finalInput,\n });\n}\n\nexport function shouldEmitRawToolCallTextOnError(\n options?: RawFallbackOptions\n): boolean {\n return options?.emitRawToolCallTextOnError === true;\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, generateToolCallId } from \"../utils/id\";\nimport {\n addTextSegment,\n formatToolsWithPromptTemplate,\n} from \"../utils/protocol-utils\";\nimport { escapeRegExp } from \"../utils/regex\";\nimport {\n emitToolInputProgressDelta,\n shouldEmitRawToolCallTextOnError,\n stringifyToolInputWithSchema,\n} from \"../utils/tool-input-streaming\";\nimport type { ParserOptions, TCMProtocol } from \"./protocol-interface\";\n\ninterface HermesProtocolOptions {\n toolCallEnd?: string;\n toolCallStart?: string;\n}\n\nfunction canonicalizeToolInput(argumentsValue: unknown): string {\n return JSON.stringify(argumentsValue ?? {});\n}\n\nfunction processToolCallJson(\n toolCallJson: string,\n fullMatch: string,\n processedElements: LanguageModelV3Content[],\n options?: ParserOptions\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: generateToolCallId(),\n toolName: parsedToolCall.name,\n input: canonicalizeToolInput(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 currentIndex: number;\n match: RegExpExecArray;\n options?: ParserOptions;\n processedElements: LanguageModelV3Content[];\n text: string;\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 activeToolInput: {\n id: string;\n toolName: string;\n emittedInput: string;\n } | null;\n buffer: string;\n currentTextId: string | null;\n currentToolCallJson: string;\n hasEmittedTextStart: boolean;\n isInsideToolCall: boolean;\n}\n\ntype StreamController =\n TransformStreamDefaultController<LanguageModelV3StreamPart>;\n\ninterface TagProcessingContext {\n controller: StreamController;\n options?: ParserOptions;\n state: StreamState;\n toolCallEnd: string;\n toolCallStart: string;\n tools: LanguageModelV3FunctionTool[];\n}\n\nconst WHITESPACE_JSON_REGEX = /\\s/;\n\nfunction skipJsonWhitespace(text: string, fromIndex: number): number {\n let index = fromIndex;\n while (index < text.length && WHITESPACE_JSON_REGEX.test(text[index])) {\n index += 1;\n }\n return index;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Streaming JSON key/value scanning requires explicit string-depth state tracking.\nfunction findTopLevelPropertyValueStart(\n text: string,\n property: string\n): number | null {\n const objectStart = skipJsonWhitespace(text, 0);\n if (objectStart >= text.length || text.charAt(objectStart) !== \"{\") {\n return null;\n }\n\n let depth = 0;\n let inString = false;\n let escaping = false;\n\n for (let index = objectStart; index < text.length; index += 1) {\n const char = text.charAt(index);\n\n if (inString) {\n if (escaping) {\n escaping = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaping = true;\n continue;\n }\n if (char === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (char === \"{\") {\n depth += 1;\n continue;\n }\n if (char === \"}\") {\n depth = Math.max(0, depth - 1);\n continue;\n }\n\n if (char !== '\"') {\n continue;\n }\n\n if (depth !== 1) {\n inString = true;\n continue;\n }\n\n const keyStart = index + 1;\n let keyEnd = keyStart;\n let keyEscaped = false;\n while (keyEnd < text.length) {\n const keyChar = text.charAt(keyEnd);\n if (keyEscaped) {\n keyEscaped = false;\n } else if (keyChar === \"\\\\\") {\n keyEscaped = true;\n } else if (keyChar === '\"') {\n break;\n }\n keyEnd += 1;\n }\n\n if (keyEnd >= text.length || text.charAt(keyEnd) !== '\"') {\n return null;\n }\n\n const key = text.slice(keyStart, keyEnd);\n let valueCursor = skipJsonWhitespace(text, keyEnd + 1);\n if (valueCursor >= text.length || text.charAt(valueCursor) !== \":\") {\n index = keyEnd;\n continue;\n }\n\n valueCursor = skipJsonWhitespace(text, valueCursor + 1);\n if (key === property) {\n return valueCursor < text.length ? valueCursor : null;\n }\n\n index = valueCursor - 1;\n }\n\n return null;\n}\n\nfunction extractTopLevelStringProperty(\n text: string,\n property: string\n): string | undefined {\n const valueStart = findTopLevelPropertyValueStart(text, property);\n if (valueStart == null || valueStart >= text.length) {\n return undefined;\n }\n if (text.charAt(valueStart) !== '\"') {\n return undefined;\n }\n\n let valueEnd = valueStart + 1;\n let escaped = false;\n while (valueEnd < text.length) {\n const char = text.charAt(valueEnd);\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === '\"') {\n return text.slice(valueStart + 1, valueEnd);\n }\n valueEnd += 1;\n }\n\n return undefined;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Streaming JSON value slicing must handle nested arrays/objects and escaped strings.\nfunction extractJsonValueSlice(\n text: string,\n valueStart: number\n): {\n text: string;\n complete: boolean;\n} | null {\n if (valueStart >= text.length) {\n return null;\n }\n\n const first = text.charAt(valueStart);\n if (first === \"{\" || first === \"[\") {\n const stack: string[] = [first];\n let inString = false;\n let escaped = false;\n\n for (let index = valueStart + 1; index < text.length; index += 1) {\n const char = text.charAt(index);\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n continue;\n }\n\n if (char === \"{\" || char === \"[\") {\n stack.push(char);\n continue;\n }\n\n if (char === \"}\" || char === \"]\") {\n const open = stack.at(-1);\n if ((open === \"{\" && char === \"}\") || (open === \"[\" && char === \"]\")) {\n stack.pop();\n if (stack.length === 0) {\n return {\n text: text.slice(valueStart, index + 1),\n complete: true,\n };\n }\n }\n }\n }\n\n return {\n text: text.slice(valueStart),\n complete: false,\n };\n }\n\n if (first === '\"') {\n let escaped = false;\n for (let index = valueStart + 1; index < text.length; index += 1) {\n const char = text.charAt(index);\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === '\"') {\n return {\n text: text.slice(valueStart, index + 1),\n complete: true,\n };\n }\n }\n return {\n text: text.slice(valueStart),\n complete: false,\n };\n }\n\n let index = valueStart;\n while (index < text.length) {\n const char = text.charAt(index);\n if (char === \",\" || char === \"}\" || WHITESPACE_JSON_REGEX.test(char)) {\n break;\n }\n index += 1;\n }\n\n return {\n text: text.slice(valueStart, index),\n complete: index < text.length,\n };\n}\n\nfunction extractStreamingToolCallProgress(toolCallJson: string): {\n toolName: string | undefined;\n argumentsText: string | undefined;\n argumentsComplete: boolean;\n} {\n const toolName = extractTopLevelStringProperty(toolCallJson, \"name\");\n const argsValueStart = findTopLevelPropertyValueStart(\n toolCallJson,\n \"arguments\"\n );\n if (argsValueStart == null) {\n return {\n toolName,\n argumentsText: undefined,\n argumentsComplete: false,\n };\n }\n\n const argsSlice = extractJsonValueSlice(toolCallJson, argsValueStart);\n return {\n toolName,\n argumentsText: argsSlice?.text,\n argumentsComplete: argsSlice?.complete ?? false,\n };\n}\n\nfunction ensureToolInputStart(\n state: StreamState,\n controller: StreamController,\n toolName: string\n) {\n if (!state.activeToolInput) {\n const id = generateToolCallId();\n state.activeToolInput = {\n id,\n toolName,\n emittedInput: \"\",\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id,\n toolName,\n } as LanguageModelV3StreamPart);\n }\n}\n\nfunction emitToolInputDelta(\n state: StreamState,\n controller: StreamController,\n fullInput: string\n) {\n const active = state.activeToolInput;\n if (!active) {\n return;\n }\n\n emitToolInputProgressDelta({\n controller,\n id: active.id,\n state: active,\n fullInput,\n mode: \"full-json\",\n });\n}\n\nfunction closeToolInput(state: StreamState, controller: StreamController) {\n if (!state.activeToolInput) {\n return;\n }\n controller.enqueue({\n type: \"tool-input-end\",\n id: state.activeToolInput.id,\n } as LanguageModelV3StreamPart);\n state.activeToolInput = null;\n}\n\nfunction emitToolCallFromParsed(\n state: StreamState,\n controller: StreamController,\n parsedToolCall: { name: string; arguments: unknown },\n tools: LanguageModelV3FunctionTool[]\n) {\n closeTextBlock(state, controller);\n const toolName =\n typeof parsedToolCall.name === \"string\"\n ? parsedToolCall.name\n : (state.activeToolInput?.toolName ?? \"unknown\");\n const input = stringifyToolInputWithSchema({\n toolName,\n args: parsedToolCall.arguments,\n tools,\n fallback: canonicalizeToolInput,\n });\n ensureToolInputStart(state, controller, toolName);\n emitToolInputDelta(state, controller, input);\n const toolCallId = state.activeToolInput?.id ?? generateToolCallId();\n closeToolInput(state, controller);\n controller.enqueue({\n type: \"tool-call\",\n toolCallId,\n toolName,\n input,\n } as LanguageModelV3StreamPart);\n}\n\nfunction canonicalizeArgumentsProgressInput(\n progress: {\n argumentsText: string | undefined;\n argumentsComplete: boolean;\n },\n toolName: string,\n tools: LanguageModelV3FunctionTool[]\n): string | undefined {\n if (progress.argumentsText === undefined || !progress.argumentsComplete) {\n return undefined;\n }\n\n try {\n const parsedArguments = parseRJSON(progress.argumentsText);\n return stringifyToolInputWithSchema({\n toolName,\n args: parsedArguments,\n tools,\n fallback: canonicalizeToolInput,\n });\n } catch {\n return undefined;\n }\n}\n\nfunction emitToolInputProgress(\n state: StreamState,\n controller: StreamController,\n tools: LanguageModelV3FunctionTool[]\n) {\n if (!(state.isInsideToolCall && state.currentToolCallJson)) {\n return;\n }\n\n const progress = extractStreamingToolCallProgress(state.currentToolCallJson);\n if (!progress.toolName) {\n return;\n }\n\n ensureToolInputStart(state, controller, progress.toolName);\n const canonicalProgressInput = canonicalizeArgumentsProgressInput(\n progress,\n progress.toolName,\n tools\n );\n if (canonicalProgressInput !== undefined) {\n emitToolInputDelta(state, controller, canonicalProgressInput);\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 trailingBuffer: string,\n tools: LanguageModelV3FunctionTool[],\n options?: ParserOptions\n) {\n if (!state.currentToolCallJson && trailingBuffer.length === 0) {\n state.isInsideToolCall = false;\n return;\n }\n\n if (state.currentToolCallJson) {\n try {\n const parsedToolCall = parseRJSON(state.currentToolCallJson) as {\n name: string;\n arguments: unknown;\n };\n emitToolCallFromParsed(state, controller, parsedToolCall, tools);\n state.currentToolCallJson = \"\";\n state.isInsideToolCall = false;\n return;\n } catch {\n // fall through to text fallback\n }\n }\n\n const rawToolCallContent = `${state.currentToolCallJson}${trailingBuffer}`;\n const errorContent = `${toolCallStart}${rawToolCallContent}`;\n const shouldEmitRawFallback = shouldEmitRawToolCallTextOnError(options);\n\n logParseFailure({\n phase: \"stream\",\n reason: shouldEmitRawFallback\n ? \"Incomplete streaming tool call segment emitted as text\"\n : \"Incomplete streaming tool call segment suppressed without raw text fallback\",\n snippet: errorContent,\n });\n\n if (shouldEmitRawFallback) {\n const errorId = generateId();\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 }\n closeToolInput(state, controller);\n options?.onError?.(\n shouldEmitRawFallback\n ? \"Could not complete streaming JSON tool call at finish; emitting original text.\"\n : \"Could not complete streaming JSON tool call at finish.\",\n { toolCall: errorContent }\n );\n state.currentToolCallJson = \"\";\n state.isInsideToolCall = false;\n}\n\nfunction handleFinishChunk(\n state: StreamState,\n controller: StreamController,\n toolCallStart: string,\n tools: LanguageModelV3FunctionTool[],\n options: ParserOptions | undefined,\n chunk: LanguageModelV3StreamPart\n) {\n if (state.isInsideToolCall) {\n const trailingBuffer = state.buffer;\n state.buffer = \"\";\n emitIncompleteToolCall(\n state,\n controller,\n toolCallStart,\n trailingBuffer,\n tools,\n options\n );\n } else if (state.buffer.length > 0) {\n flushBuffer(state, controller, toolCallStart);\n }\n closeTextBlock(state, controller);\n controller.enqueue(chunk);\n}\n\nfunction publishText(\n text: string,\n state: StreamState,\n controller: StreamController,\n tools: LanguageModelV3FunctionTool[]\n) {\n if (state.isInsideToolCall) {\n closeTextBlock(state, controller);\n state.currentToolCallJson += text;\n emitToolInputProgress(state, controller, tools);\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, tools } =\n context;\n try {\n const parsedToolCall = parseRJSON(state.currentToolCallJson) as {\n name: string;\n arguments: unknown;\n };\n emitToolCallFromParsed(state, controller, parsedToolCall, tools);\n } catch (error) {\n const errorContent = `${toolCallStart}${state.currentToolCallJson}${toolCallEnd}`;\n const shouldEmitRawFallback = shouldEmitRawToolCallTextOnError(options);\n\n logParseFailure({\n phase: \"stream\",\n reason: \"Failed to parse streaming tool call JSON segment\",\n snippet: errorContent,\n error,\n });\n if (shouldEmitRawFallback) {\n const errorId = generateId();\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 }\n closeToolInput(state, controller);\n options?.onError?.(\n shouldEmitRawFallback\n ? \"Could not process streaming JSON tool call; emitting original text.\"\n : \"Could not process streaming JSON tool call.\",\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 state.activeToolInput = null;\n }\n}\n\nfunction processBufferTags(context: TagProcessingContext) {\n const { state, controller, toolCallStart, toolCallEnd, tools } = 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, tools);\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 toolCallEnd: string,\n tools: LanguageModelV3FunctionTool[]\n) {\n if (state.isInsideToolCall) {\n const potentialEndIndex = getPotentialStartIndex(state.buffer, toolCallEnd);\n if (\n potentialEndIndex != null &&\n potentialEndIndex + toolCallEnd.length > state.buffer.length\n ) {\n publishText(\n state.buffer.slice(0, potentialEndIndex),\n state,\n controller,\n tools\n );\n state.buffer = state.buffer.slice(potentialEndIndex);\n } else {\n publishText(state.buffer, state, controller, tools);\n state.buffer = \"\";\n }\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(\n state.buffer.slice(0, potentialIndex),\n state,\n controller,\n tools\n );\n state.buffer = state.buffer.slice(potentialIndex);\n } else {\n publishText(state.buffer, state, controller, tools);\n state.buffer = \"\";\n }\n}\n\nexport const hermesProtocol = ({\n toolCallStart = \"<tool_call>\",\n toolCallEnd = \"</tool_call>\",\n}: HermesProtocolOptions = {}): TCMProtocol => ({\n formatTools({\n tools,\n toolSystemPromptTemplate,\n }: {\n tools: LanguageModelV3FunctionTool[];\n toolSystemPromptTemplate: (tools: LanguageModelV3FunctionTool[]) => string;\n }) {\n return formatToolsWithPromptTemplate({ tools, toolSystemPromptTemplate });\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?: ParserOptions;\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 tools,\n options,\n }: {\n tools: LanguageModelV3FunctionTool[];\n options?: ParserOptions;\n }) {\n const state: StreamState = {\n isInsideToolCall: false,\n buffer: \"\",\n currentToolCallJson: \"\",\n currentTextId: null,\n hasEmittedTextStart: false,\n activeToolInput: null,\n };\n\n return new TransformStream<\n LanguageModelV3StreamPart,\n LanguageModelV3StreamPart\n >({\n transform(chunk, controller) {\n if (chunk.type === \"finish\") {\n handleFinishChunk(\n state,\n controller,\n toolCallStart,\n tools,\n options,\n chunk\n );\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 tools,\n });\n handlePartialTag(state, controller, toolCallStart, toolCallEnd, tools);\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","/**\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","const XML_SELF_CLOSING_ROOT_WITH_BODY_REGEX =\n /^<([A-Za-z_][A-Za-z0-9_-]*)\\s*\\r?\\n([\\s\\S]+?)\\r?\\n\\s*\\/>\\s*$/;\n\nexport function tryRepairXmlSelfClosingRootWithBody(\n rawText: string,\n toolNames: string[]\n): string | null {\n const trimmed = rawText.trim();\n if (trimmed.length === 0) {\n return null;\n }\n\n const match = trimmed.match(XML_SELF_CLOSING_ROOT_WITH_BODY_REGEX);\n if (!match) {\n return null;\n }\n\n const rootTag = match[1];\n if (!toolNames.includes(rootTag)) {\n return null;\n }\n\n // Keep leading indentation intact for YAML payloads.\n const body = match[2].trimEnd();\n if (body.trim().length === 0 || body.includes(`</${rootTag}>`)) {\n return null;\n }\n\n return `<${rootTag}>\\n${body}\\n</${rootTag}>`;\n}\n","import { escapeRegExp } from \"./regex\";\n\ninterface EarliestToolTag {\n index: number;\n name: string;\n selfClosing: boolean;\n tagLength: number;\n}\n\ninterface ToolTagMatch {\n isSelfClosing: boolean;\n tagLength: number;\n tagStart: number;\n}\n\nconst selfClosingTagCache = new Map<string, RegExp>();\n\nexport function 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\nexport function 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\nexport function 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\n if (openIdx === -1 && selfIdx === -1) {\n return null;\n }\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\nexport function findEarliestToolTag(\n buffer: string,\n toolNames: string[]\n): EarliestToolTag {\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 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\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 return {\n index: bestIndex,\n name: bestName,\n selfClosing: bestSelfClosing,\n tagLength: bestTagLength,\n };\n}\n","import type {\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n} from \"@ai-sdk/provider\";\nimport { escapeRegExp } from \"../utils/regex\";\nimport { findEarliestToolTag } from \"../utils/xml-tool-tag-scanner\";\nimport type { ParserOptions } from \"./protocol-interface\";\n\nexport interface StreamingToolCallState {\n emittedInput: string;\n lastProgressContentLength: number | null;\n lastProgressFullInput: string | null;\n lastProgressGtIndex: number | null;\n name: string;\n toolCallId: string;\n}\n\ntype StreamController =\n TransformStreamDefaultController<LanguageModelV3StreamPart>;\n\nexport type FlushTextFn = (controller: StreamController, text?: string) => void;\n\ntype HandleStreamingToolCallEnd = (params: {\n ctrl: StreamController;\n currentToolCall: StreamingToolCallState;\n flushText: FlushTextFn;\n options?: ParserOptions;\n parseOptions?: Record<string, unknown>;\n toolContent: string;\n tools: LanguageModelV3FunctionTool[];\n}) => void;\n\ninterface ProcessToolCallInBufferParams {\n buffer: string;\n controller: StreamController;\n currentToolCall: StreamingToolCallState;\n emitToolInputProgress: (\n controller: StreamController,\n currentToolCall: StreamingToolCallState,\n toolContent: string\n ) => void;\n flushText: FlushTextFn;\n handleStreamingToolCallEnd: HandleStreamingToolCallEnd;\n options?: ParserOptions;\n parseOptions?: Record<string, unknown>;\n setBuffer: (buffer: string) => void;\n tools: LanguageModelV3FunctionTool[];\n}\n\nfunction processToolCallInBuffer(params: ProcessToolCallInBufferParams): {\n buffer: string;\n currentToolCall: StreamingToolCallState | null;\n shouldBreak: boolean;\n} {\n const {\n buffer,\n currentToolCall,\n tools,\n options,\n controller,\n flushText,\n setBuffer,\n parseOptions,\n emitToolInputProgress,\n handleStreamingToolCallEnd,\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 emitToolInputProgress(controller, currentToolCall, buffer);\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 emitToolInputProgress(controller, currentToolCall, content);\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 controller: StreamController;\n emitToolInputStart: (\n controller: StreamController,\n toolName: string\n ) => StreamingToolCallState;\n findPotentialToolTagStart: (buffer: string, toolNames: string[]) => number;\n flushText: FlushTextFn;\n handleStreamingToolCallEnd: HandleStreamingToolCallEnd;\n options?: ParserOptions;\n parseOptions?: Record<string, unknown>;\n setBuffer: (buffer: string) => void;\n toolNames: string[];\n tools: LanguageModelV3FunctionTool[];\n}\n\nfunction processNoToolCallInBuffer(params: ProcessNoToolCallInBufferParams): {\n buffer: string;\n currentToolCall: StreamingToolCallState | 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 emitToolInputStart,\n findPotentialToolTagStart,\n handleStreamingToolCallEnd,\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 const currentToolCall = emitToolInputStart(controller, earliestToolName);\n handleStreamingToolCallEnd({\n toolContent: \"\",\n currentToolCall,\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: emitToolInputStart(controller, earliestToolName),\n shouldBreak: false,\n shouldContinue: true,\n };\n}\n\nexport function createProcessBufferHandler(options: {\n getBuffer: () => string;\n setBuffer: (buffer: string) => void;\n getCurrentToolCall: () => StreamingToolCallState | null;\n setCurrentToolCall: (toolCall: StreamingToolCallState | null) => void;\n tools: LanguageModelV3FunctionTool[];\n parserOptions: ParserOptions | undefined;\n toolNames: string[];\n flushText: FlushTextFn;\n parseOptions: Record<string, unknown> | undefined;\n emitToolInputProgress: (\n controller: StreamController,\n currentToolCall: StreamingToolCallState,\n toolContent: string\n ) => void;\n emitToolInputStart: (\n controller: StreamController,\n toolName: string\n ) => StreamingToolCallState;\n findPotentialToolTagStart: (buffer: string, toolNames: string[]) => number;\n handleStreamingToolCallEnd: HandleStreamingToolCallEnd;\n}): (controller: StreamController) => void {\n return (controller: StreamController) => {\n while (true) {\n const currentToolCall = options.getCurrentToolCall();\n if (currentToolCall) {\n const result = processToolCallInBuffer({\n buffer: options.getBuffer(),\n currentToolCall,\n tools: options.tools,\n options: options.parserOptions,\n controller,\n flushText: options.flushText,\n setBuffer: options.setBuffer,\n parseOptions: options.parseOptions,\n emitToolInputProgress: options.emitToolInputProgress,\n handleStreamingToolCallEnd: options.handleStreamingToolCallEnd,\n });\n options.setBuffer(result.buffer);\n options.setCurrentToolCall(result.currentToolCall);\n if (result.shouldBreak) {\n break;\n }\n } else {\n const result = processNoToolCallInBuffer({\n buffer: options.getBuffer(),\n toolNames: options.toolNames,\n controller,\n flushText: options.flushText,\n tools: options.tools,\n options: options.parserOptions,\n parseOptions: options.parseOptions,\n setBuffer: options.setBuffer,\n emitToolInputStart: options.emitToolInputStart,\n findPotentialToolTagStart: options.findPotentialToolTagStart,\n handleStreamingToolCallEnd: options.handleStreamingToolCallEnd,\n });\n options.setBuffer(result.buffer);\n options.setCurrentToolCall(result.currentToolCall);\n if (result.shouldBreak) {\n break;\n }\n if (result.shouldContinue) {\n continue;\n }\n break;\n }\n }\n };\n}\n","import type {\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport { parse, stringify } from \"../../rxml\";\nimport { generateToolCallId } from \"../utils/id\";\nimport {\n createFlushTextHandler,\n extractToolNames,\n formatToolsWithPromptTemplate,\n} from \"../utils/protocol-utils\";\nimport { escapeRegExp } from \"../utils/regex\";\nimport { NAME_CHAR_RE, WHITESPACE_REGEX } from \"../utils/regex-constants\";\nimport {\n emitFailedToolInputLifecycle,\n emitFinalizedToolInputLifecycle,\n emitToolInputProgressDelta,\n shouldEmitRawToolCallTextOnError,\n stringifyToolInputWithSchema,\n} from \"../utils/tool-input-streaming\";\nimport { tryRepairXmlSelfClosingRootWithBody } from \"../utils/xml-root-repair\";\nimport { findNextToolTag } from \"../utils/xml-tool-tag-scanner\";\nimport {\n createProcessBufferHandler,\n type FlushTextFn,\n type StreamingToolCallState,\n} from \"./morph-xml-stream-state-machine\";\nimport type { ParserOptions, TCMCoreProtocol } from \"./protocol-interface\";\n\nexport interface MorphXmlProtocolOptions {\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\nfunction getToolSchema(tools: LanguageModelV3FunctionTool[], toolName: string) {\n return tools.find((t) => t.name === toolName)?.inputSchema;\n}\n\ninterface ProcessToolCallParams {\n options?: ParserOptions;\n parseOptions?: Record<string, unknown>;\n processedElements: LanguageModelV3Content[];\n text: string;\n toolCall: {\n toolName: string;\n content: string;\n startIndex: number;\n endIndex: number;\n };\n tools: LanguageModelV3FunctionTool[];\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: generateToolCallId(),\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 ctrl: TransformStreamDefaultController<LanguageModelV3StreamPart>;\n currentToolCall: {\n name: string;\n toolCallId: string;\n emittedInput: string;\n };\n flushText: FlushTextFn;\n options?: ParserOptions;\n parseOptions?: Record<string, unknown>;\n toolContent: string;\n tools: LanguageModelV3FunctionTool[];\n}\n\nfunction parseXmlTagName(rawTagBody: string): string {\n let index = 0;\n while (\n index < rawTagBody.length &&\n WHITESPACE_REGEX.test(rawTagBody[index])\n ) {\n index += 1;\n }\n const nameStart = index;\n while (\n index < rawTagBody.length &&\n NAME_CHAR_RE.test(rawTagBody.charAt(index))\n ) {\n index += 1;\n }\n return rawTagBody.slice(nameStart, index);\n}\n\ntype XmlSpecialConsumeResult =\n | { kind: \"none\" }\n | { kind: \"incomplete\" }\n | { kind: \"consumed\"; nextPos: number };\n\nfunction consumeXmlSpecialSection(\n fragment: string,\n ltIndex: number\n): XmlSpecialConsumeResult {\n if (fragment.startsWith(\"<!--\", ltIndex)) {\n const commentEnd = fragment.indexOf(\"-->\", ltIndex + 4);\n return commentEnd === -1\n ? { kind: \"incomplete\" }\n : { kind: \"consumed\", nextPos: commentEnd + 3 };\n }\n if (fragment.startsWith(\"<![CDATA[\", ltIndex)) {\n const cdataEnd = fragment.indexOf(\"]]>\", ltIndex + 9);\n return cdataEnd === -1\n ? { kind: \"incomplete\" }\n : { kind: \"consumed\", nextPos: cdataEnd + 3 };\n }\n if (fragment.startsWith(\"<?\", ltIndex)) {\n const processingEnd = fragment.indexOf(\"?>\", ltIndex + 2);\n return processingEnd === -1\n ? { kind: \"incomplete\" }\n : { kind: \"consumed\", nextPos: processingEnd + 2 };\n }\n if (fragment.startsWith(\"<!\", ltIndex)) {\n const declarationEnd = fragment.indexOf(\">\", ltIndex + 2);\n return declarationEnd === -1\n ? { kind: \"incomplete\" }\n : { kind: \"consumed\", nextPos: declarationEnd + 1 };\n }\n return { kind: \"none\" };\n}\n\ntype XmlTagToken =\n | { kind: \"close\"; name: string; nextPos: number }\n | { kind: \"open\"; name: string; selfClosing: boolean; nextPos: number };\n\nfunction parseXmlTagToken(\n fragment: string,\n ltIndex: number\n): XmlTagToken | null {\n const gtIndex = fragment.indexOf(\">\", ltIndex + 1);\n if (gtIndex === -1) {\n return null;\n }\n\n const tagBody = fragment.slice(ltIndex + 1, gtIndex).trim();\n if (tagBody.length === 0) {\n return null;\n }\n\n if (tagBody.startsWith(\"/\")) {\n const closeName = parseXmlTagName(tagBody.slice(1));\n if (closeName.length === 0) {\n return null;\n }\n return { kind: \"close\", name: closeName, nextPos: gtIndex + 1 };\n }\n\n const selfClosing = tagBody.endsWith(\"/\");\n const openBody = selfClosing ? tagBody.slice(0, -1).trimEnd() : tagBody;\n const openName = parseXmlTagName(openBody);\n if (openName.length === 0) {\n return null;\n }\n return {\n kind: \"open\",\n name: openName,\n selfClosing,\n nextPos: gtIndex + 1,\n };\n}\n\nfunction analyzeXmlFragmentForProgress(\n fragment: string\n): { topLevelTagNames: string[] } | null {\n const stack: string[] = [];\n const topLevelTagNames: string[] = [];\n let position = 0;\n\n while (position < fragment.length) {\n const ltIndex = fragment.indexOf(\"<\", position);\n if (ltIndex === -1) {\n break;\n }\n\n const special = consumeXmlSpecialSection(fragment, ltIndex);\n if (special.kind === \"incomplete\") {\n return null;\n }\n if (special.kind === \"consumed\") {\n position = special.nextPos;\n continue;\n }\n\n const token = parseXmlTagToken(fragment, ltIndex);\n if (token === null) {\n return null;\n }\n\n if (token.kind === \"close\") {\n const openName = stack.pop();\n if (!openName || openName !== token.name) {\n return null;\n }\n position = token.nextPos;\n continue;\n }\n\n if (stack.length === 0) {\n topLevelTagNames.push(token.name);\n }\n if (!token.selfClosing) {\n stack.push(token.name);\n }\n position = token.nextPos;\n }\n\n if (stack.length > 0) {\n return null;\n }\n\n return { topLevelTagNames };\n}\n\ntype XmlTopLevelTextScanResult =\n | { kind: \"found\" }\n | { kind: \"invalid\" }\n | { kind: \"next\"; nextPos: number }\n | { kind: \"done\"; value: boolean };\n\nfunction scanXmlFragmentTopLevelTextStep(options: {\n fragment: string;\n position: number;\n stack: string[];\n}): XmlTopLevelTextScanResult {\n const { fragment, position, stack } = options;\n\n const ltIndex = fragment.indexOf(\"<\", position);\n if (ltIndex === -1) {\n const trailingText = fragment.slice(position);\n return {\n kind: \"done\",\n value: stack.length === 0 && trailingText.trim().length > 0,\n };\n }\n\n const textBetweenTags = fragment.slice(position, ltIndex);\n if (stack.length === 0 && textBetweenTags.trim().length > 0) {\n return { kind: \"found\" };\n }\n\n const special = consumeXmlSpecialSection(fragment, ltIndex);\n if (special.kind === \"incomplete\") {\n return { kind: \"invalid\" };\n }\n if (special.kind === \"consumed\") {\n return { kind: \"next\", nextPos: special.nextPos };\n }\n\n const token = parseXmlTagToken(fragment, ltIndex);\n if (token === null) {\n return { kind: \"invalid\" };\n }\n\n if (token.kind === \"close\") {\n const openName = stack.pop();\n if (!openName || openName !== token.name) {\n return { kind: \"invalid\" };\n }\n } else if (!token.selfClosing) {\n stack.push(token.name);\n }\n\n return { kind: \"next\", nextPos: token.nextPos };\n}\n\nfunction hasNonWhitespaceTopLevelText(fragment: string): boolean {\n if (!fragment.includes(\"<\")) {\n return fragment.trim().length > 0;\n }\n\n const stack: string[] = [];\n let position = 0;\n\n while (position < fragment.length) {\n const step = scanXmlFragmentTopLevelTextStep({ fragment, position, stack });\n if (step.kind === \"found\") {\n return true;\n }\n if (step.kind === \"invalid\") {\n return false;\n }\n if (step.kind === \"done\") {\n return step.value;\n }\n\n position = step.nextPos;\n }\n\n return false;\n}\n\nfunction getObjectSchemaPropertyNames(schema: unknown): Set<string> | null {\n if (!schema || typeof schema !== \"object\") {\n return null;\n }\n\n const schemaObject = schema as {\n type?: unknown;\n properties?: unknown;\n };\n const typeValue = schemaObject.type;\n if (typeValue != null) {\n const isObjectType =\n typeValue === \"object\" ||\n (Array.isArray(typeValue) && typeValue.includes(\"object\"));\n if (!isObjectType) {\n return null;\n }\n }\n if (!schemaObject.properties || typeof schemaObject.properties !== \"object\") {\n return new Set<string>();\n }\n\n return new Set(\n Object.keys(schemaObject.properties as Record<string, unknown>)\n );\n}\n\nfunction schemaAllowsArrayType(schema: unknown): boolean {\n if (!schema || typeof schema !== \"object\") {\n return false;\n }\n\n const schemaRecord = schema as Record<string, unknown>;\n const typeValue = schemaRecord.type;\n if (typeValue === \"array\") {\n return true;\n }\n if (Array.isArray(typeValue) && typeValue.includes(\"array\")) {\n return true;\n }\n\n const unions = [schemaRecord.anyOf, schemaRecord.oneOf, schemaRecord.allOf];\n for (const union of unions) {\n if (!Array.isArray(union)) {\n continue;\n }\n if (union.some((entry) => schemaAllowsArrayType(entry))) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction schemaAllowsStringType(schema: unknown): boolean {\n if (!schema || typeof schema !== \"object\") {\n return false;\n }\n\n const schemaRecord = schema as Record<string, unknown>;\n const typeValue = schemaRecord.type;\n if (typeValue === \"string\") {\n return true;\n }\n if (Array.isArray(typeValue) && typeValue.includes(\"string\")) {\n return true;\n }\n\n const unions = [schemaRecord.anyOf, schemaRecord.oneOf, schemaRecord.allOf];\n for (const union of unions) {\n if (!Array.isArray(union)) {\n continue;\n }\n if (union.some((entry) => schemaAllowsStringType(entry))) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getObjectSchemaStringPropertyNames(\n schema: unknown\n): Set<string> | null {\n const propertyNames = getObjectSchemaPropertyNames(schema);\n if (!propertyNames) {\n return null;\n }\n\n const out = new Set<string>();\n for (const name of propertyNames) {\n const property = getSchemaObjectProperty(schema, name);\n if (schemaAllowsStringType(property)) {\n out.add(name);\n }\n }\n return out;\n}\n\nfunction findTrailingUnclosedStringTag(options: {\n toolContent: string;\n stringPropertyNames: Set<string>;\n}): string | null {\n let bestName: string | null = null;\n let bestOpenIndex = -1;\n\n for (const name of options.stringPropertyNames) {\n const openPattern = new RegExp(\n `<${escapeRegExp(name)}(?:\\\\s[^>]*)?>`,\n \"gi\"\n );\n const closePattern = new RegExp(`</\\\\s*${escapeRegExp(name)}\\\\s*>`, \"gi\");\n\n let lastOpen = -1;\n for (const match of options.toolContent.matchAll(openPattern)) {\n const index = match.index;\n if (index !== undefined) {\n lastOpen = index;\n }\n }\n\n if (lastOpen === -1) {\n continue;\n }\n\n let lastClose = -1;\n for (const match of options.toolContent.matchAll(closePattern)) {\n const index = match.index;\n if (index !== undefined) {\n lastClose = index;\n }\n }\n\n if (lastOpen > lastClose && lastOpen > bestOpenIndex) {\n bestOpenIndex = lastOpen;\n bestName = name;\n }\n }\n\n return bestName;\n}\n\nfunction getSchemaObjectProperty(\n schema: unknown,\n propertyName: string\n): unknown | null {\n if (!schema || typeof schema !== \"object\") {\n return null;\n }\n\n const schemaObject = schema as Record<string, unknown>;\n const properties = schemaObject.properties;\n if (!properties || typeof properties !== \"object\") {\n return null;\n }\n\n const property = (properties as Record<string, unknown>)[propertyName];\n if (!property) {\n return null;\n }\n\n return property;\n}\n\nfunction isStableXmlProgressCandidate(options: {\n candidate: string;\n parsed: unknown;\n toolSchema: unknown;\n}): boolean {\n const { candidate, parsed, toolSchema } = options;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return false;\n }\n\n const structure = analyzeXmlFragmentForProgress(candidate);\n if (!structure) {\n return false;\n }\n\n const schemaProperties = getObjectSchemaPropertyNames(toolSchema);\n if (!schemaProperties || schemaProperties.size === 0) {\n return false;\n }\n\n const parsedObject = parsed as Record<string, unknown>;\n const uniqueTopLevelTags = new Set(structure.topLevelTagNames);\n for (const tagName of uniqueTopLevelTags) {\n if (!schemaProperties.has(tagName)) {\n continue;\n }\n const schemaProperty = getSchemaObjectProperty(toolSchema, tagName);\n if (\n schemaProperty &&\n schemaAllowsArrayType(schemaProperty) &&\n !Array.isArray(parsedObject[tagName])\n ) {\n return false;\n }\n }\n\n if (structure.topLevelTagNames.length === 1) {\n const onlyTopLevelTag = structure.topLevelTagNames[0];\n if (\n !schemaProperties ||\n schemaProperties.size === 0 ||\n !schemaProperties.has(onlyTopLevelTag)\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction parseXmlContentForStreamProgress({\n toolContent,\n toolName,\n toolSchema,\n parseOptions,\n tools,\n}: {\n toolContent: string;\n toolName: string;\n toolSchema: unknown;\n parseOptions?: Record<string, unknown>;\n tools: LanguageModelV3FunctionTool[];\n}): string | null {\n const tryParse = (content: string): unknown | null => {\n try {\n return parse(content, toolSchema, {\n ...(parseOptions ?? {}),\n repair: false,\n onError: undefined,\n });\n } catch {\n return null;\n }\n };\n\n const strictFull = tryParse(toolContent);\n if (\n strictFull !== null &&\n isStableXmlProgressCandidate({\n candidate: toolContent,\n parsed: strictFull,\n toolSchema,\n })\n ) {\n return stringifyToolInputWithSchema({\n toolName,\n args: strictFull,\n tools,\n });\n }\n\n const stringPropertyNames = getObjectSchemaStringPropertyNames(toolSchema);\n if (stringPropertyNames && stringPropertyNames.size > 0) {\n const trailingStringTag = findTrailingUnclosedStringTag({\n toolContent,\n stringPropertyNames,\n });\n if (trailingStringTag) {\n const repaired = `${toolContent}</${trailingStringTag}>`;\n const parsedRepaired = tryParse(repaired);\n if (parsedRepaired !== null) {\n return stringifyToolInputWithSchema({\n toolName,\n args: parsedRepaired,\n tools,\n });\n }\n }\n }\n\n let searchEnd = toolContent.length;\n while (searchEnd > 0) {\n const gtIndex = toolContent.lastIndexOf(\">\", searchEnd - 1);\n if (gtIndex === -1) {\n break;\n }\n const candidate = toolContent.slice(0, gtIndex + 1);\n if (!analyzeXmlFragmentForProgress(candidate)) {\n searchEnd = gtIndex;\n continue;\n }\n const parsedCandidate = tryParse(candidate);\n if (\n parsedCandidate !== null &&\n isStableXmlProgressCandidate({\n candidate,\n parsed: parsedCandidate,\n toolSchema,\n })\n ) {\n return stringifyToolInputWithSchema({\n toolName,\n args: parsedCandidate,\n tools,\n });\n }\n searchEnd = gtIndex;\n }\n\n return null;\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 const finalInput = stringifyToolInputWithSchema({\n toolName: currentToolCall.name,\n args: parsedResult,\n tools,\n });\n emitFinalizedToolInputLifecycle({\n controller: ctrl,\n id: currentToolCall.toolCallId,\n state: currentToolCall,\n toolName: currentToolCall.name,\n finalInput,\n onMismatch: options?.onError,\n });\n } catch (error) {\n const original = `<${currentToolCall.name}>${toolContent}</${currentToolCall.name}>`;\n const emitRawFallback = shouldEmitRawToolCallTextOnError(options);\n emitFailedToolInputLifecycle({\n controller: ctrl,\n id: currentToolCall.toolCallId,\n emitRawToolCallTextOnError: emitRawFallback,\n rawToolCallText: original,\n emitRawText: (rawText) => {\n flushText(ctrl, rawText);\n },\n });\n options?.onError?.(\"Could not process streaming XML tool call\", {\n toolCall: original,\n error,\n });\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\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\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\ninterface TokenHandlerResult {\n depth: number;\n lastCompleteEnd: number;\n shouldBreak: boolean;\n}\n\nfunction handleSpecialToken(depth: number): TokenHandlerResult {\n return { depth, lastCompleteEnd: -1, shouldBreak: false };\n}\n\nfunction handleOpenToken(\n token: { selfClosing: boolean; nextPos: number },\n depth: number,\n lastCompleteEnd: number\n): TokenHandlerResult {\n if (token.selfClosing) {\n return {\n depth,\n lastCompleteEnd: depth === 0 ? token.nextPos : lastCompleteEnd,\n shouldBreak: false,\n };\n }\n return { depth: depth + 1, lastCompleteEnd, shouldBreak: false };\n}\n\nfunction handleCloseToken(\n token: { nextPos: number },\n depth: number\n): TokenHandlerResult {\n if (depth <= 0) {\n return { depth, lastCompleteEnd: -1, shouldBreak: true };\n }\n const newDepth = depth - 1;\n return {\n depth: newDepth,\n lastCompleteEnd: newDepth === 0 ? token.nextPos : -1,\n shouldBreak: false,\n };\n}\n\nfunction findLinePrefixedXmlBodyEnd(\n text: string,\n bodyStartIndex: number\n): number {\n let cursor = bodyStartIndex;\n let depth = 0;\n let lastCompleteEnd = -1;\n\n while (cursor < text.length) {\n if (depth === 0) {\n cursor = consumeWhitespace(text, cursor);\n if (cursor >= text.length || text.charAt(cursor) !== \"<\") {\n break;\n }\n }\n\n const token = nextTagToken(text, cursor);\n if (token.kind === \"eof\") {\n break;\n }\n\n let result: TokenHandlerResult;\n if (token.kind === \"special\") {\n result = handleSpecialToken(depth);\n } else if (token.kind === \"open\") {\n result = handleOpenToken(token, depth, lastCompleteEnd);\n } else {\n result = handleCloseToken(token, depth);\n }\n\n depth = result.depth;\n if (result.lastCompleteEnd !== -1) {\n lastCompleteEnd = result.lastCompleteEnd;\n }\n if (result.shouldBreak) {\n break;\n }\n cursor = token.nextPos;\n }\n\n return lastCompleteEnd;\n}\n\nfunction findLinePrefixedToolCall(\n text: string,\n toolNames: string[]\n): {\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n} | null {\n let best: {\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n } | null = null;\n\n for (const toolName of toolNames) {\n const linePattern = new RegExp(\n `(^|\\\\n)[\\\\t ]*${escapeRegExp(toolName)}[\\\\t ]*:?[\\\\t ]*(?:\\\\r?\\\\n|$)`,\n \"g\"\n );\n\n let match = linePattern.exec(text);\n while (match !== null) {\n const prefix = match[1] ?? \"\";\n const startIndex = match.index + prefix.length;\n const contentStart = consumeWhitespace(text, linePattern.lastIndex);\n if (contentStart >= text.length || text.charAt(contentStart) !== \"<\") {\n match = linePattern.exec(text);\n continue;\n }\n const contentEnd = findLinePrefixedXmlBodyEnd(text, contentStart);\n if (contentEnd === -1 || contentEnd <= contentStart) {\n match = linePattern.exec(text);\n continue;\n }\n const content = text.slice(contentStart, contentEnd);\n\n const candidate = {\n toolName,\n startIndex,\n endIndex: contentEnd,\n content,\n segment: text.slice(startIndex, contentEnd),\n };\n if (best === null || candidate.startIndex < best.startIndex) {\n best = candidate;\n }\n break;\n }\n }\n\n return best;\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 findToolCallsWithFallbacks(\n text: string,\n toolNames: string[]\n): { parseText: string; toolCalls: ReturnType<typeof findToolCalls> } {\n let parseText = text;\n let toolCalls = findToolCalls(parseText, toolNames);\n\n if (toolCalls.length === 0) {\n const fallbackToolCall = findLinePrefixedToolCall(parseText, toolNames);\n if (fallbackToolCall !== null) {\n toolCalls.push(fallbackToolCall);\n }\n }\n\n if (toolCalls.length === 0) {\n const repaired = tryRepairXmlSelfClosingRootWithBody(parseText, toolNames);\n if (repaired) {\n const repairedCalls = findToolCalls(repaired, toolNames);\n if (repairedCalls.length > 0) {\n parseText = repaired;\n toolCalls = repairedCalls;\n }\n }\n }\n\n return { parseText, toolCalls };\n}\n\nexport const morphXmlProtocol = (\n protocolOptions?: MorphXmlProtocolOptions\n): TCMCoreProtocol => {\n const parseOptions = {\n repair: true,\n noChildNodes: [],\n ...(protocolOptions?.parseOptions ?? {}),\n };\n\n return {\n formatTools({ tools, toolSystemPromptTemplate }) {\n return formatToolsWithPromptTemplate({ tools, toolSystemPromptTemplate });\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 = extractToolNames(tools);\n if (toolNames.length === 0) {\n return [{ type: \"text\", text }];\n }\n\n const processedElements: LanguageModelV3Content[] = [];\n let currentIndex = 0;\n\n const { parseText, toolCalls } = findToolCallsWithFallbacks(\n text,\n toolNames\n );\n\n for (const tc of toolCalls) {\n if (tc.startIndex > currentIndex) {\n processedElements.push({\n type: \"text\",\n text: parseText.substring(currentIndex, tc.startIndex),\n });\n }\n processToolCall({\n toolCall: tc,\n tools,\n options,\n text: parseText,\n processedElements,\n parseOptions,\n });\n currentIndex = tc.endIndex;\n }\n\n if (currentIndex < parseText.length) {\n processedElements.push({\n type: \"text\",\n text: parseText.substring(currentIndex),\n });\n }\n\n return processedElements;\n },\n\n createStreamParser({ tools, options }) {\n const toolNames = extractToolNames(tools);\n let buffer = \"\";\n let currentToolCall: StreamingToolCallState | 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 emitToolInputStart = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolName: string\n ): StreamingToolCallState => {\n flushText(controller);\n const next: StreamingToolCallState = {\n name: toolName,\n toolCallId: generateToolCallId(),\n emittedInput: \"\",\n lastProgressContentLength: null,\n lastProgressGtIndex: null,\n lastProgressFullInput: null,\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: next.toolCallId,\n toolName,\n });\n return next;\n };\n\n const emitToolInputProgress = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolCall: StreamingToolCallState,\n toolContent: string\n ) => {\n const progressGtIndex = toolContent.lastIndexOf(\">\");\n const progressContentLength = toolContent.length;\n if (\n toolCall.lastProgressGtIndex === progressGtIndex &&\n toolCall.lastProgressContentLength === progressContentLength\n ) {\n const cached = toolCall.lastProgressFullInput;\n if (cached == null) {\n return;\n }\n if (cached === \"{}\" && toolContent.trim().length === 0) {\n return;\n }\n emitToolInputProgressDelta({\n controller,\n id: toolCall.toolCallId,\n state: toolCall,\n fullInput: cached,\n });\n return;\n }\n\n const toolSchema = getToolSchema(tools, toolCall.name);\n const fullInput = parseXmlContentForStreamProgress({\n toolContent,\n toolName: toolCall.name,\n toolSchema,\n parseOptions,\n tools,\n });\n toolCall.lastProgressGtIndex = progressGtIndex;\n toolCall.lastProgressContentLength = progressContentLength;\n toolCall.lastProgressFullInput = fullInput;\n if (fullInput == null) {\n return;\n }\n if (fullInput === \"{}\" && toolContent.trim().length === 0) {\n return;\n }\n emitToolInputProgressDelta({\n controller,\n id: toolCall.toolCallId,\n state: toolCall,\n fullInput,\n });\n };\n\n const finalizeUnclosedToolCall = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>\n ) => {\n if (!currentToolCall) {\n return;\n }\n\n emitToolInputProgress(controller, currentToolCall, buffer);\n const parseConfig = {\n ...parseOptions,\n onError:\n options?.onError ??\n (parseOptions as { onError?: ParserOptions[\"onError\"] } | undefined)\n ?.onError,\n };\n\n const toolSchema = getToolSchema(tools, currentToolCall.name);\n flushText(controller);\n try {\n if (hasNonWhitespaceTopLevelText(buffer)) {\n throw new Error(\n \"Cannot reconcile unclosed XML tool call with top-level plain text.\"\n );\n }\n const parsedResult = parse(buffer, toolSchema, parseConfig);\n const finalInput = stringifyToolInputWithSchema({\n toolName: currentToolCall.name,\n args: parsedResult,\n tools,\n });\n emitFinalizedToolInputLifecycle({\n controller,\n id: currentToolCall.toolCallId,\n state: currentToolCall,\n toolName: currentToolCall.name,\n finalInput,\n onMismatch: options?.onError,\n });\n } catch (error) {\n const unfinishedContent = `<${currentToolCall.name}>${buffer}`;\n const emitRawFallback = shouldEmitRawToolCallTextOnError(options);\n emitFailedToolInputLifecycle({\n controller,\n id: currentToolCall.toolCallId,\n emitRawToolCallTextOnError: emitRawFallback,\n rawToolCallText: unfinishedContent,\n emitRawText: (rawText) => {\n flushText(controller, rawText);\n },\n });\n options?.onError?.(\n \"Could not complete streaming XML tool call at finish.\",\n { toolCall: unfinishedContent, error }\n );\n }\n\n buffer = \"\";\n currentToolCall = null;\n };\n\n const processBuffer = createProcessBufferHandler({\n getBuffer: () => buffer,\n setBuffer: (newBuffer: string) => {\n buffer = newBuffer;\n },\n getCurrentToolCall: () => currentToolCall,\n setCurrentToolCall: (newToolCall: StreamingToolCallState | null) => {\n currentToolCall = newToolCall;\n },\n tools,\n parserOptions: options,\n toolNames,\n flushText,\n parseOptions,\n emitToolInputProgress,\n emitToolInputStart,\n findPotentialToolTagStart,\n handleStreamingToolCallEnd,\n });\n\n return new TransformStream({\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Stateful stream parsing requires branching over chunk lifecycle and parser states.\n transform(chunk, controller) {\n if (chunk.type === \"finish\") {\n if (currentToolCall) {\n finalizeUnclosedToolCall(controller);\n } else if (buffer) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n flushText(controller);\n controller.enqueue(chunk);\n return;\n }\n\n if (chunk.type !== \"text-delta\") {\n if (currentToolCall) {\n // Keep an open XML tool call alive across non-text stream chunks\n // so mixed-mode streams (e.g. reasoning) can continue to complete it.\n } else 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 finalizeUnclosedToolCall(controller);\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 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 /**\n * When true, stream parsers may emit malformed raw tool-call text as\n * `text-delta` fallback on parse failure. Defaults to false to avoid leaking\n * protocol/internal markup to end users.\n */\n emitRawToolCallTextOnError?: boolean;\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n}\n\nexport interface TCMProtocol {\n createStreamParser({\n tools,\n options,\n }: {\n tools: LanguageModelV3FunctionTool[];\n options?: ParserOptions;\n }): TransformStream<LanguageModelV3StreamPart, LanguageModelV3StreamPart>;\n\n extractToolCallSegments?: ({\n text,\n tools,\n }: {\n text: string;\n tools: LanguageModelV3FunctionTool[];\n }) => string[];\n\n formatToolCall(toolCall: LanguageModelV3ToolCall): string;\n formatTools({\n tools,\n toolSystemPromptTemplate,\n }: {\n tools: LanguageModelV3FunctionTool[];\n toolSystemPromptTemplate: (tools: LanguageModelV3FunctionTool[]) => string;\n }): string;\n\n parseGeneratedText({\n text,\n tools,\n options,\n }: {\n text: string;\n tools: LanguageModelV3FunctionTool[];\n options?: ParserOptions;\n }): LanguageModelV3Content[];\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 const isTCMProtocolFactory = isProtocolFactory;\n","export interface QwenStreamCallState {\n args: Record<string, unknown>;\n buffer: string;\n emittedInput: string;\n endTagName: string;\n hasEmittedStart: boolean;\n partialParam: { name: string; value: string } | null;\n raw: string;\n toolCallId: string;\n toolName: string | null;\n}\n\ntype QwenParamTagParseResult =\n | {\n kind: \"match\";\n start: number;\n end: number;\n name: string;\n value: string;\n }\n | {\n kind: \"partial\";\n start: number;\n openEnd: number | null;\n name?: string;\n value?: string;\n };\n\nfunction consumeToolNameTag(options: {\n callState: QwenStreamCallState;\n work: string;\n nameTagRe: RegExp;\n normalizeXmlTextValue: (value: string) => string;\n maybeEmitToolInputStart: () => void;\n}): string {\n if (options.callState.toolName) {\n return options.work;\n }\n\n const match = options.nameTagRe.exec(options.work);\n if (!match) {\n return options.work;\n }\n\n const value = options.normalizeXmlTextValue(match[2] ?? \"\");\n if (value.trim().length > 0) {\n options.callState.toolName = value;\n }\n\n const start = match.index ?? 0;\n const consumedLength = match[0]?.length ?? 0;\n const nextWork =\n options.work.slice(0, start) + options.work.slice(start + consumedLength);\n\n options.maybeEmitToolInputStart();\n return nextWork;\n}\n\nfunction consumeSingleParamTag(options: {\n allowEndOfString: boolean;\n callState: QwenStreamCallState;\n lastKept: number;\n lower: string;\n lt: number;\n work: string;\n parseParamTagAt: (\n text: string,\n lowerText: string,\n startIndex: number,\n options?: {\n allowEndOfString?: boolean;\n callEndTagNameLower?: string | null;\n }\n ) => QwenParamTagParseResult | null;\n mergeParamValue: (\n args: Record<string, unknown>,\n name: string,\n value: string\n ) => void;\n}): {\n keepSlice?: string;\n nextIndex: number;\n nextLastKept: number;\n shouldStop: boolean;\n} {\n const parsed = options.parseParamTagAt(\n options.work,\n options.lower,\n options.lt,\n {\n allowEndOfString: options.allowEndOfString,\n callEndTagNameLower: options.callState.endTagName,\n }\n );\n\n if (!parsed) {\n return {\n nextIndex: options.lt + 1,\n nextLastKept: options.lastKept,\n shouldStop: false,\n };\n }\n\n if (parsed.kind === \"partial\") {\n if (parsed.name !== undefined) {\n options.callState.partialParam = {\n name: parsed.name,\n value: parsed.value ?? \"\",\n };\n }\n return {\n nextIndex: options.lt + 1,\n nextLastKept: options.lastKept,\n shouldStop: true,\n };\n }\n\n options.callState.partialParam = null;\n options.mergeParamValue(options.callState.args, parsed.name, parsed.value);\n return {\n keepSlice: options.work.slice(options.lastKept, parsed.start),\n nextIndex: parsed.end,\n nextLastKept: parsed.end,\n shouldStop: false,\n };\n}\n\nfunction consumeParamTags(options: {\n callState: QwenStreamCallState;\n work: string;\n allowEndOfString: boolean;\n parseParamTagAt: (\n text: string,\n lowerText: string,\n startIndex: number,\n options?: {\n allowEndOfString?: boolean;\n callEndTagNameLower?: string | null;\n }\n ) => QwenParamTagParseResult | null;\n mergeParamValue: (\n args: Record<string, unknown>,\n name: string,\n value: string\n ) => void;\n maybeEmitToolInputStart: () => void;\n}): string {\n const lower = options.work.toLowerCase();\n let index = 0;\n let lastKept = 0;\n let pieces: string[] | null = null;\n\n while (true) {\n const lt = lower.indexOf(\"<\", index);\n if (lt === -1) {\n break;\n }\n\n const step = consumeSingleParamTag({\n allowEndOfString: options.allowEndOfString,\n callState: options.callState,\n lower,\n lt,\n work: options.work,\n lastKept,\n parseParamTagAt: options.parseParamTagAt,\n mergeParamValue: options.mergeParamValue,\n });\n\n if (step.keepSlice !== undefined) {\n pieces ??= [];\n pieces.push(step.keepSlice);\n }\n\n index = step.nextIndex;\n lastKept = step.nextLastKept;\n if (step.shouldStop) {\n break;\n }\n }\n\n options.maybeEmitToolInputStart();\n if (!pieces) {\n return options.work;\n }\n pieces.push(options.work.slice(lastKept));\n return pieces.join(\"\");\n}\n\nexport function parseCallContent(options: {\n callState: QwenStreamCallState;\n content: string;\n allowEndOfString: boolean;\n nameTagRe: RegExp;\n normalizeXmlTextValue: (value: string) => string;\n parseParamTagAt: (\n text: string,\n lowerText: string,\n startIndex: number,\n options?: {\n allowEndOfString?: boolean;\n callEndTagNameLower?: string | null;\n }\n ) => QwenParamTagParseResult | null;\n mergeParamValue: (\n args: Record<string, unknown>,\n name: string,\n value: string\n ) => void;\n maybeEmitToolInputStart: () => void;\n maybeEmitToolInputProgress: () => void;\n}): string {\n let work = options.content;\n work = consumeToolNameTag({\n callState: options.callState,\n work,\n nameTagRe: options.nameTagRe,\n normalizeXmlTextValue: options.normalizeXmlTextValue,\n maybeEmitToolInputStart: options.maybeEmitToolInputStart,\n });\n\n work = consumeParamTags({\n callState: options.callState,\n work,\n allowEndOfString: options.allowEndOfString,\n parseParamTagAt: options.parseParamTagAt,\n mergeParamValue: options.mergeParamValue,\n maybeEmitToolInputStart: options.maybeEmitToolInputStart,\n });\n\n options.maybeEmitToolInputStart();\n options.maybeEmitToolInputProgress();\n return work;\n}\n","import type {\n LanguageModelV3Content,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport {\n escapeXmlMinimalAttr,\n escapeXmlMinimalText,\n unescapeXml,\n} from \"../../rxml/utils/helpers\";\nimport { getPotentialStartIndex } from \"../utils/get-potential-start-index\";\nimport { generateToolCallId } from \"../utils/id\";\nimport {\n createFlushTextHandler,\n formatToolsWithPromptTemplate,\n} from \"../utils/protocol-utils\";\nimport { escapeRegExp } from \"../utils/regex\";\nimport {\n emitFailedToolInputLifecycle,\n emitFinalizedToolInputLifecycle,\n emitToolInputProgressDelta,\n shouldEmitRawToolCallTextOnError,\n stringifyToolInputWithSchema,\n} from \"../utils/tool-input-streaming\";\nimport type { TCMProtocol } from \"./protocol-interface\";\nimport type { QwenStreamCallState } from \"./qwen3coder-stream-call-content\";\nimport { parseCallContent } from \"./qwen3coder-stream-call-content\";\n\nconst TOOL_CALL_OPEN_RE = /<tool_call\\b[^>]*>/i;\nconst TOOL_CALL_CLOSE_RE = /<\\/tool_call\\s*>/i;\nconst TOOL_CALL_CLOSE_TRAILING_RE = /<\\/tool_call\\s*>\\s*$/i;\nconst TOOL_CALL_BLOCK_RE = /<tool_call\\b[^>]*>[\\s\\S]*?<\\/tool_call\\s*>/gi;\nconst LEADING_CALL_CLOSE_TAG_RE =\n /^\\s*<\\s*\\/\\s*(?:tool_call|function|call|tool|invoke)\\s*>/i;\n\nconst CALL_BLOCK_RE = /<(call|function|tool|invoke)\\b[^>]*>[\\s\\S]*?<\\/\\1\\s*>/gi;\n\nconst QWEN3CODER_TOOL_PARSER_PARAM_TAG_NAMES = new Set([\n \"parameter\",\n \"param\",\n \"argument\",\n \"arg\",\n]);\n\nconst QWEN3CODER_TOOL_PARSER_CALL_TAG_NAMES = new Set([\n \"function\",\n \"call\",\n \"tool\",\n \"invoke\",\n \"tool_call\",\n]);\n\nconst CALL_SHORTHAND_VALUE_RE =\n /^<\\s*(call|function|tool|invoke)\\b\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s>/]+))/i;\n\n// Non-global variants for streaming parsing (avoids `lastIndex` state).\nconst QWEN3CODER_TOOL_PARSER_STREAM_CALL_OPEN_START_RE =\n /<\\s*(?!\\/)\\s*(call|function|tool|invoke)\\b/i;\nconst QWEN3CODER_TOOL_PARSER_STREAM_CALL_OPEN_TAG_RE =\n /<\\s*(?!\\/)\\s*(call|function|tool|invoke)\\b[^>]*>/i;\nconst QWEN3CODER_TOOL_PARSER_STREAM_TOOL_CALL_CLOSE_TAG_RE =\n /<\\s*\\/\\s*tool_call\\s*>/i;\nconst QWEN3CODER_TOOL_PARSER_STREAM_NAME_OR_PARAM_SIGNAL_RE =\n /<\\s*(?!\\/)\\s*(name|tool_name|parameter|param|argument|arg)\\b/i;\nconst QWEN3CODER_TOOL_PARSER_STREAM_NAME_TAG_RE =\n /<\\s*(name|tool_name)\\b[^>]*>([\\s\\S]*?)<\\s*\\/\\s*\\1\\s*>/i;\nconst QWEN3CODER_TOOL_PARSER_STREAM_SELF_CLOSING_TAG_RE = /\\/\\s*>$/;\n\nfunction isAsciiWhitespace(ch: string): boolean {\n return ch === \" \" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\t\" || ch === \"\\f\";\n}\n\nfunction skipAsciiWhitespace(text: string, index: number): number {\n let i = index;\n while (i < text.length && isAsciiWhitespace(text[i] ?? \"\")) {\n i += 1;\n }\n return i;\n}\n\nfunction stripLeadingToolCallCloseTags(text: string): string {\n let out = text;\n while (true) {\n const start = skipAsciiWhitespace(out, 0);\n const trimmed = out.slice(start);\n const match = TOOL_CALL_CLOSE_RE.exec(trimmed);\n if (!match || match.index !== 0 || !match[0]) {\n return out;\n }\n out = out.slice(start + match[0].length);\n }\n}\n\nfunction stripTrailingToolCallCloseTags(text: string): string {\n let out = text;\n while (true) {\n const next = out.replace(TOOL_CALL_CLOSE_TRAILING_RE, \"\");\n if (next === out) {\n return out;\n }\n out = next;\n }\n}\n\nfunction isTagBoundaryChar(ch: string): boolean {\n return ch === \"\" || isAsciiWhitespace(ch) || ch === \">\" || ch === \"/\";\n}\n\nfunction findTagEndIndex(text: string, startIndex: number): number | null {\n let quote: '\"' | \"'\" | null = null;\n for (let i = startIndex; i < text.length; i += 1) {\n const ch = text[i] ?? \"\";\n if (quote) {\n if (ch === quote) {\n quote = null;\n }\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === \">\") {\n return i;\n }\n }\n return null;\n}\n\nfunction parseShorthandValue(\n openTag: string,\n tagNameLower: string\n): string | null {\n let i = 1;\n i = skipAsciiWhitespace(openTag, i);\n if (!openTag.toLowerCase().startsWith(tagNameLower, i)) {\n return null;\n }\n i += tagNameLower.length;\n i = skipAsciiWhitespace(openTag, i);\n if (openTag[i] !== \"=\") {\n return null;\n }\n i += 1;\n i = skipAsciiWhitespace(openTag, i);\n\n const quote = openTag[i] ?? \"\";\n if (quote === '\"' || quote === \"'\") {\n const end = openTag.indexOf(quote, i + 1);\n if (end === -1) {\n return null;\n }\n return openTag.slice(i + 1, end);\n }\n\n const start = i;\n while (i < openTag.length) {\n const ch = openTag[i] ?? \"\";\n if (isAsciiWhitespace(ch) || ch === \">\" || ch === \"/\") {\n break;\n }\n i += 1;\n }\n const value = openTag.slice(start, i);\n return value.length > 0 ? value : null;\n}\n\nfunction parseQwen3CoderToolParserParamName(\n openTag: string,\n tagNameLower: string\n): string | null {\n const shorthand = parseShorthandValue(openTag, tagNameLower);\n if (shorthand != null) {\n return unescapeXml(shorthand);\n }\n\n return getAttributeValue(openTag, \"name\");\n}\n\nfunction getCdataSectionNextIndex(\n textLower: string,\n startIndex: number\n): number | null {\n if (!textLower.startsWith(\"<![cdata[\", startIndex)) {\n return startIndex;\n }\n const cdataEnd = textLower.indexOf(\"]]>\", startIndex + \"<![cdata[\".length);\n if (cdataEnd === -1) {\n return null;\n }\n return cdataEnd + 3;\n}\n\nfunction parseMatchingTagHeader(\n textLower: string,\n lt: number,\n tagNameLower: string\n): { isClosing: boolean; afterName: number } | null {\n let i = skipAsciiWhitespace(textLower, lt + 1);\n const isClosing = textLower[i] === \"/\";\n if (isClosing) {\n i += 1;\n i = skipAsciiWhitespace(textLower, i);\n }\n if (!textLower.startsWith(tagNameLower, i)) {\n return null;\n }\n\n const afterName = i + tagNameLower.length;\n const boundary = textLower[afterName] ?? \"\";\n const validBoundary = isClosing\n ? isTagBoundaryChar(boundary)\n : isTagBoundaryChar(boundary) || boundary === \"=\";\n if (boundary && !validBoundary) {\n return null;\n }\n\n return { isClosing, afterName };\n}\n\nfunction isSelfClosingXmlTag(\n textLower: string,\n lt: number,\n gt: number\n): boolean {\n return textLower\n .slice(lt, gt + 1)\n .trimEnd()\n .endsWith(\"/>\");\n}\n\nfunction findClosingTagEnd(\n textLower: string,\n startIndex: number,\n tagNameLower: string\n): { start: number; end: number } | null {\n let depth = 1;\n let index = startIndex;\n while (true) {\n const lt = textLower.indexOf(\"<\", index);\n if (lt === -1) {\n return null;\n }\n\n const cdataNextIndex = getCdataSectionNextIndex(textLower, lt);\n if (cdataNextIndex == null) {\n return null;\n }\n if (cdataNextIndex !== lt) {\n index = cdataNextIndex;\n continue;\n }\n\n const header = parseMatchingTagHeader(textLower, lt, tagNameLower);\n if (!header) {\n index = lt + 1;\n continue;\n }\n\n const gt = textLower.indexOf(\">\", header.afterName);\n if (gt === -1) {\n return null;\n }\n\n if (header.isClosing) {\n depth -= 1;\n if (depth === 0) {\n return { start: lt, end: gt + 1 };\n }\n index = gt + 1;\n continue;\n }\n\n const isSelfClosing = isSelfClosingXmlTag(textLower, lt, gt);\n if (!isSelfClosing) {\n depth += 1;\n }\n index = gt + 1;\n }\n}\n\nfunction findClosingTagStartWithBoundary(\n lowerText: string,\n valueStart: number,\n tagNameLower: string,\n allowEndOfStringBoundary: boolean\n): number {\n const needle = `</${tagNameLower}`;\n let searchIndex = valueStart;\n\n while (searchIndex < lowerText.length) {\n const found = lowerText.indexOf(needle, searchIndex);\n if (found === -1) {\n return -1;\n }\n const nextChar = lowerText[found + needle.length] ?? \"\";\n if (nextChar === \"\" && !allowEndOfStringBoundary) {\n searchIndex = found + needle.length;\n continue;\n }\n if (isTagBoundaryChar(nextChar)) {\n return found;\n }\n searchIndex = found + needle.length;\n }\n\n return -1;\n}\n\nfunction toSupportedCallEndTagName(\n tagNameLower: string | null | undefined\n): string | null {\n const normalized = tagNameLower?.trim().toLowerCase() ?? \"\";\n if (!normalized) {\n return null;\n }\n return QWEN3CODER_TOOL_PARSER_CALL_TAG_NAMES.has(normalized)\n ? normalized\n : null;\n}\n\n// vLLM reference (Qwen3CoderToolParser): tolerate missing </parameter> by treating\n// the next <parameter=...> / </function> boundary as an implicit close.\n// https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/vllm/tool_parsers/qwen3coder_tool_parser.py#L65-L68\n// https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/vllm/tool_parsers/qwen3coder_tool_parser.py#L612-L636\n// https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/tests/tool_parsers/test_qwen3coder_tool_parser.py#L686-L764\nfunction findUnclosedParamBoundaryIndex(\n lowerText: string,\n valueStart: number,\n callEndTagNameLower: string | null,\n allowEndOfString: boolean\n): number | null {\n const normalizedCallEndTag = toSupportedCallEndTagName(callEndTagNameLower);\n const callCloseIndex = normalizedCallEndTag\n ? findClosingTagStartWithBoundary(\n lowerText,\n valueStart,\n normalizedCallEndTag,\n allowEndOfString\n )\n : findClosingTagStartWithBoundary(\n lowerText,\n valueStart,\n \"function\",\n allowEndOfString\n );\n\n const indices = [\n lowerText.indexOf(\"<parameter\", valueStart),\n lowerText.indexOf(\"<param\", valueStart),\n lowerText.indexOf(\"<argument\", valueStart),\n lowerText.indexOf(\"<arg\", valueStart),\n callCloseIndex,\n findClosingTagStartWithBoundary(\n lowerText,\n valueStart,\n \"tool_call\",\n allowEndOfString\n ),\n lowerText.indexOf(\"<function\", valueStart),\n ].filter((index) => index !== -1);\n\n if (indices.length === 0) {\n return null;\n }\n return Math.min(...indices);\n}\n\ntype Qwen3CoderToolParserParamTagParseResult =\n | {\n kind: \"match\";\n start: number;\n end: number;\n name: string;\n value: string;\n }\n | {\n kind: \"partial\";\n start: number;\n openEnd: number | null;\n name?: string;\n value?: string;\n };\n\nfunction parseQwen3CoderToolParserParamTagNameLower(\n lowerText: string,\n startIndex: number\n): { kind: \"match\"; tagNameLower: string } | { kind: \"partial\" } | null {\n let i = skipAsciiWhitespace(lowerText, startIndex + 1);\n if (i >= lowerText.length) {\n return { kind: \"partial\" };\n }\n if (lowerText[i] === \"/\") {\n return null;\n }\n\n const nameStart = i;\n while (i < lowerText.length) {\n const ch = lowerText[i] ?? \"\";\n if (isAsciiWhitespace(ch) || ch === \">\" || ch === \"/\" || ch === \"=\") {\n break;\n }\n i += 1;\n }\n\n const tagNameLower = lowerText.slice(nameStart, i);\n if (!QWEN3CODER_TOOL_PARSER_PARAM_TAG_NAMES.has(tagNameLower)) {\n return null;\n }\n return { kind: \"match\", tagNameLower };\n}\n\nfunction parseQwen3CoderToolParserUnclosedParamValue(options: {\n text: string;\n lowerText: string;\n startIndex: number;\n openEnd: number;\n paramName: string;\n allowEndOfString: boolean;\n callEndTagNameLower?: string | null;\n}): Qwen3CoderToolParserParamTagParseResult {\n const valueStart = options.openEnd + 1;\n const boundaryIndex = findUnclosedParamBoundaryIndex(\n options.lowerText,\n valueStart,\n options.callEndTagNameLower ?? null,\n options.allowEndOfString\n );\n if (boundaryIndex == null) {\n if (!options.allowEndOfString) {\n const rawProgressValue = options.text.slice(valueStart);\n return {\n kind: \"partial\",\n start: options.startIndex,\n openEnd: options.openEnd,\n name: options.paramName,\n value: rawProgressValue ? normalizeXmlTextValue(rawProgressValue) : \"\",\n };\n }\n\n const rawValue = options.text.slice(valueStart);\n return {\n kind: \"match\",\n start: options.startIndex,\n end: options.text.length,\n name: options.paramName,\n value: rawValue ? normalizeXmlTextValue(rawValue) : \"\",\n };\n }\n\n const rawValue = options.text.slice(valueStart, boundaryIndex);\n return {\n kind: \"match\",\n start: options.startIndex,\n end: boundaryIndex,\n name: options.paramName,\n value: rawValue ? normalizeXmlTextValue(rawValue) : \"\",\n };\n}\n\nfunction parseQwen3CoderToolParserParamTagAt(\n text: string,\n lowerText: string,\n startIndex: number,\n options?: {\n allowEndOfString?: boolean;\n callEndTagNameLower?: string | null;\n }\n): Qwen3CoderToolParserParamTagParseResult | null {\n const tagNameParse = parseQwen3CoderToolParserParamTagNameLower(\n lowerText,\n startIndex\n );\n if (!tagNameParse) {\n return null;\n }\n if (tagNameParse.kind === \"partial\") {\n return { kind: \"partial\", start: startIndex, openEnd: null };\n }\n\n const tagNameLower = tagNameParse.tagNameLower;\n\n const openEnd = findTagEndIndex(text, startIndex);\n if (openEnd == null) {\n return { kind: \"partial\", start: startIndex, openEnd: null };\n }\n\n const openTag = text.slice(startIndex, openEnd + 1);\n const paramNameRaw = parseQwen3CoderToolParserParamName(\n openTag,\n tagNameLower\n );\n const paramName = paramNameRaw?.trim() ?? \"\";\n if (paramName.length === 0) {\n return null;\n }\n\n const selfClosing = openTag.trimEnd().endsWith(\"/>\");\n if (selfClosing) {\n return {\n kind: \"match\",\n start: startIndex,\n end: openEnd + 1,\n name: paramName,\n value: \"\",\n };\n }\n\n const valueStart = openEnd + 1;\n const close = findClosingTagEnd(lowerText, valueStart, tagNameLower);\n if (!close) {\n return parseQwen3CoderToolParserUnclosedParamValue({\n text,\n lowerText,\n startIndex,\n openEnd,\n paramName,\n allowEndOfString: options?.allowEndOfString === true,\n callEndTagNameLower: options?.callEndTagNameLower,\n });\n }\n\n const rawValue = text.slice(openEnd + 1, close.start);\n return {\n kind: \"match\",\n start: startIndex,\n end: close.end,\n name: paramName,\n value: rawValue ? normalizeXmlTextValue(rawValue) : \"\",\n };\n}\n\nfunction normalizeXmlTextValue(raw: string): string {\n let out = raw.trim();\n if (out.startsWith(\"<![CDATA[\") && out.endsWith(\"]]>\")) {\n out = out.slice(\"<![CDATA[\".length, -\"]]>\".length).trim();\n }\n return unescapeXml(out);\n}\n\nfunction getOpeningTag(xml: string): string | null {\n const gt = xml.indexOf(\">\");\n if (gt === -1) {\n return null;\n }\n return xml.slice(0, gt + 1);\n}\n\nconst attrValueRegExpCache = new Map<string, RegExp>();\n\nfunction getAttributeValue(openTag: string, attrName: string): string | null {\n let re = attrValueRegExpCache.get(attrName);\n if (!re) {\n // Since the regex has no 'g' flag, re.exec resets automatically — safe.\n re = new RegExp(\n `\\\\b${escapeRegExp(attrName)}\\\\s*=\\\\s*([\"'])([\\\\s\\\\S]*?)\\\\1`,\n \"i\"\n );\n attrValueRegExpCache.set(attrName, re);\n }\n const match = re.exec(openTag);\n if (!match) {\n return null;\n }\n return unescapeXml(match[2] ?? \"\");\n}\n\nfunction getShorthandValue(openTag: string): string | null {\n const match = CALL_SHORTHAND_VALUE_RE.exec(openTag);\n if (!match) {\n return null;\n }\n const value = match[2] ?? match[3] ?? match[4];\n if (!value) {\n return null;\n }\n return unescapeXml(value);\n}\n\nfunction extractFirstTagText(xml: string, tagName: string): string | null {\n const lower = xml.toLowerCase();\n const tagLower = tagName.toLowerCase();\n\n let index = 0;\n while (true) {\n const lt = lower.indexOf(\"<\", index);\n if (lt === -1) {\n return null;\n }\n\n const i = skipAsciiWhitespace(lower, lt + 1);\n if (i >= lower.length || lower[i] === \"/\") {\n index = lt + 1;\n continue;\n }\n\n if (!lower.startsWith(tagLower, i)) {\n index = lt + 1;\n continue;\n }\n\n const afterName = i + tagLower.length;\n const boundary = lower[afterName] ?? \"\";\n if (boundary && !isTagBoundaryChar(boundary)) {\n index = lt + 1;\n continue;\n }\n\n const openEnd = findTagEndIndex(xml, lt);\n if (openEnd == null) {\n return null;\n }\n const contentStart = openEnd + 1;\n const close = findClosingTagEnd(lower, contentStart, tagLower);\n if (!close) {\n return null;\n }\n return normalizeXmlTextValue(xml.slice(contentStart, close.start));\n }\n}\n\nfunction extractToolCallInnerXml(segment: string): {\n inner: string;\n outerOpenTag: string;\n} | null {\n const openMatch = TOOL_CALL_OPEN_RE.exec(segment);\n const closeMatch = TOOL_CALL_CLOSE_RE.exec(segment);\n if (!(openMatch && closeMatch)) {\n return null;\n }\n\n const openIndex = openMatch.index;\n const openTag = openMatch[0];\n const openEnd = openIndex + openTag.length;\n\n // Prefer the last closing tag to avoid early matches if nested content\n // includes a literal \"</tool_call>\" string.\n const closeIndex = segment.toLowerCase().lastIndexOf(\"</tool_call\");\n if (closeIndex === -1) {\n return null;\n }\n const closeGt = segment.indexOf(\">\", closeIndex);\n if (closeGt === -1) {\n return null;\n }\n\n return {\n outerOpenTag: openTag,\n inner: segment.slice(openEnd, closeIndex),\n };\n}\n\nfunction mergeParamValue(\n args: Record<string, unknown>,\n key: string,\n value: string\n): void {\n const existing = args[key];\n if (existing === undefined) {\n args[key] = value;\n return;\n }\n if (Array.isArray(existing)) {\n existing.push(value);\n return;\n }\n args[key] = [existing, value];\n}\n\nfunction mergeArgsWithPartialParam(\n args: Record<string, unknown>,\n partialParam: { name: string; value: string } | null\n): Record<string, unknown> {\n if (!partialParam) {\n return args;\n }\n\n const existing = args[partialParam.name];\n if (existing === undefined) {\n return {\n ...args,\n [partialParam.name]: partialParam.value,\n };\n }\n\n if (Array.isArray(existing)) {\n return {\n ...args,\n [partialParam.name]: [...existing, partialParam.value],\n };\n }\n\n return {\n ...args,\n [partialParam.name]: [existing, partialParam.value],\n };\n}\n\nfunction extractParameters(\n xml: string,\n options?: {\n callEndTagNameLower?: string | null;\n }\n): Record<string, unknown> {\n const args: Record<string, unknown> = {};\n\n const lower = xml.toLowerCase();\n let index = 0;\n while (true) {\n const lt = lower.indexOf(\"<\", index);\n if (lt === -1) {\n break;\n }\n const parsed = parseQwen3CoderToolParserParamTagAt(xml, lower, lt, {\n allowEndOfString: true,\n callEndTagNameLower: options?.callEndTagNameLower,\n });\n if (!parsed) {\n index = lt + 1;\n continue;\n }\n\n if (parsed.kind === \"match\") {\n mergeParamValue(args, parsed.name, parsed.value);\n index = parsed.end;\n continue;\n }\n\n index = (parsed.openEnd ?? lt) + 1;\n }\n\n return args;\n}\n\nfunction parseSingleFunctionCallXml(\n xml: string,\n fallbackToolName: string | null\n): { toolName: string; args: Record<string, unknown> } | null {\n const openingTag = getOpeningTag(xml);\n const toolNameAttr = openingTag\n ? getAttributeValue(openingTag, \"name\")\n : null;\n const shorthandName = openingTag ? getShorthandValue(openingTag) : null;\n const toolName =\n toolNameAttr ??\n shorthandName ??\n extractFirstTagText(xml, \"name\") ??\n extractFirstTagText(xml, \"tool_name\") ??\n fallbackToolName;\n const callEndTagNameLower = toSupportedCallEndTagName(\n openingTag ? getOpenTagNameLower(openingTag) : null\n );\n\n if (!toolName || toolName.trim().length === 0) {\n return null;\n }\n\n return {\n toolName,\n args: extractParameters(xml, { callEndTagNameLower }),\n };\n}\n\nfunction findImplicitCallOpenIndices(lowerText: string): number[] {\n const indices: number[] = [];\n let index = 0;\n while (true) {\n const lt = lowerText.indexOf(\"<\", index);\n if (lt === -1) {\n break;\n }\n\n const i = skipAsciiWhitespace(lowerText, lt + 1);\n if (i >= lowerText.length) {\n break;\n }\n if (lowerText[i] === \"/\") {\n index = lt + 1;\n continue;\n }\n\n const tagNames = [\"call\", \"function\", \"tool\", \"invoke\"] as const;\n for (const tagName of tagNames) {\n if (!lowerText.startsWith(tagName, i)) {\n continue;\n }\n const after = i + tagName.length;\n const boundary = lowerText[after] ?? \"\";\n if (boundary && !isTagBoundaryChar(boundary) && boundary !== \"=\") {\n continue;\n }\n indices.push(lt);\n break;\n }\n\n index = lt + 1;\n }\n return indices;\n}\n\nfunction splitImplicitCallBlocks(xml: string): string[] {\n const lower = xml.toLowerCase();\n const starts = findImplicitCallOpenIndices(lower);\n if (starts.length === 0) {\n return [];\n }\n\n const blocks: string[] = [];\n for (let i = 0; i < starts.length; i += 1) {\n const start = starts[i] ?? 0;\n const end = starts[i + 1] ?? xml.length;\n blocks.push(xml.slice(start, end));\n }\n return blocks;\n}\n\nfunction stripLeadingCallCloseTags(text: string): string {\n let out = text;\n while (true) {\n const match = LEADING_CALL_CLOSE_TAG_RE.exec(out);\n if (!match) {\n return out;\n }\n out = out.slice(match[0].length);\n }\n}\n\nfunction getOpenTagNameLower(openTag: string): string | null {\n const lowerOpenTag = openTag.toLowerCase();\n const lt = lowerOpenTag.indexOf(\"<\");\n if (lt === -1) {\n return null;\n }\n\n let i = skipAsciiWhitespace(lowerOpenTag, lt + 1);\n if (i >= lowerOpenTag.length || lowerOpenTag[i] === \"/\") {\n return null;\n }\n\n const start = i;\n while (i < lowerOpenTag.length) {\n const ch = lowerOpenTag[i] ?? \"\";\n if (isAsciiWhitespace(ch) || ch === \">\" || ch === \"/\" || ch === \"=\") {\n break;\n }\n i += 1;\n }\n\n const tagName = lowerOpenTag.slice(start, i);\n return tagName.length > 0 ? tagName : null;\n}\n\nfunction splitImplicitCallAndTail(callBlock: string): {\n callContent: string;\n trailingText: string;\n} {\n const openingTag = getOpeningTag(callBlock);\n const openingTagName = toSupportedCallEndTagName(\n openingTag ? getOpenTagNameLower(openingTag) : null\n );\n const lowerCallBlock = callBlock.toLowerCase();\n let consumed = 0;\n\n if (openingTag) {\n consumed = openingTag.length;\n if (openingTagName) {\n const close = findClosingTagEnd(lowerCallBlock, consumed, openingTagName);\n if (close) {\n consumed = Math.max(consumed, close.end);\n }\n }\n }\n\n let index = 0;\n while (true) {\n const lt = lowerCallBlock.indexOf(\"<\", index);\n if (lt === -1) {\n break;\n }\n\n const parsed = parseQwen3CoderToolParserParamTagAt(\n callBlock,\n lowerCallBlock,\n lt,\n {\n allowEndOfString: true,\n callEndTagNameLower: openingTagName,\n }\n );\n if (!parsed) {\n index = lt + 1;\n continue;\n }\n\n if (parsed.kind === \"partial\") {\n index = (parsed.openEnd ?? lt) + 1;\n continue;\n }\n\n consumed = Math.max(consumed, parsed.end);\n index = parsed.end;\n }\n\n const clamped = Math.max(0, Math.min(consumed, callBlock.length));\n return {\n callContent: callBlock.slice(0, clamped),\n trailingText: callBlock.slice(clamped),\n };\n}\n\nfunction parseQwen3CoderToolParserCallBlocks(\n blocks: string[],\n outerNameAttr: string | null\n): Array<{ toolName: string; args: Record<string, unknown> }> | null {\n const calls: Array<{ toolName: string; args: Record<string, unknown> }> = [];\n for (const block of blocks) {\n const parsed = parseSingleFunctionCallXml(block, outerNameAttr);\n if (!parsed) {\n return null;\n }\n calls.push(parsed);\n }\n return calls;\n}\n\nfunction parseQwen3CoderToolParserClosedMatches(\n inner: string,\n outerNameAttr: string | null\n):\n | Array<{ toolName: string; args: Record<string, unknown> }>\n | null\n | undefined {\n const callBlockMatches = Array.from(inner.matchAll(CALL_BLOCK_RE));\n if (callBlockMatches.length === 0) {\n return undefined;\n }\n\n const closedBlocks: string[] = [];\n let lastClosedEnd = 0;\n for (const match of callBlockMatches) {\n const callBlock = match[0] ?? \"\";\n const startIndex = match.index ?? -1;\n if (!callBlock || startIndex < 0) {\n continue;\n }\n closedBlocks.push(callBlock);\n lastClosedEnd = startIndex + callBlock.length;\n }\n\n const closedCalls = parseQwen3CoderToolParserCallBlocks(\n closedBlocks,\n outerNameAttr\n );\n if (!closedCalls) {\n return null;\n }\n\n const trailingInner = inner.slice(lastClosedEnd);\n if (trailingInner.trim().length === 0) {\n return closedCalls;\n }\n\n const trailingBlocks = splitImplicitCallBlocks(trailingInner).filter(\n (b) => b.trim().length > 0\n );\n if (trailingBlocks.length === 0) {\n return closedCalls;\n }\n\n const trailingCalls = parseQwen3CoderToolParserCallBlocks(\n trailingBlocks,\n outerNameAttr\n );\n if (!trailingCalls) {\n return closedCalls;\n }\n\n return closedCalls.concat(trailingCalls);\n}\n\nfunction parseQwen3CoderToolParserToolCallSegment(\n segment: string\n): Array<{ toolName: string; args: Record<string, unknown> }> | null {\n const extracted = extractToolCallInnerXml(segment);\n if (!extracted) {\n return null;\n }\n\n const { inner, outerOpenTag } = extracted;\n const outerNameAttr = getAttributeValue(outerOpenTag, \"name\");\n\n const closedCalls = parseQwen3CoderToolParserClosedMatches(\n inner,\n outerNameAttr\n );\n if (closedCalls) {\n return closedCalls;\n }\n if (closedCalls === null) {\n return null;\n }\n\n // Some models omit the closing </function> and go straight to </tool_call>.\n // When that happens, CALL_BLOCK_RE matches nothing; fall back to splitting\n // by call-opening tags (<function=...>, etc.) and treating the next opening\n // tag or end-of-container as an implicit terminator.\n const implicitBlocks = splitImplicitCallBlocks(inner).filter(\n (b) => b.trim().length > 0\n );\n if (implicitBlocks.length > 0) {\n return parseQwen3CoderToolParserCallBlocks(implicitBlocks, outerNameAttr);\n }\n\n const single =\n parseSingleFunctionCallXml(inner, outerNameAttr) ??\n parseSingleFunctionCallXml(segment, outerNameAttr);\n if (!single) {\n return null;\n }\n return [single];\n}\n\ntype StreamController =\n TransformStreamDefaultController<LanguageModelV3StreamPart>;\n\nfunction parseToolCallInput(input: string | null | undefined): unknown {\n if (input == null) {\n return {};\n }\n try {\n return JSON.parse(input);\n } catch {\n return input;\n }\n}\n\nfunction toQwen3CoderToolParserParamText(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value === null) {\n return \"None\";\n }\n if (typeof value === \"boolean\") {\n return value ? \"True\" : \"False\";\n }\n if (value === undefined) {\n return \"\";\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nfunction appendQwen3CoderToolParserParameter(\n lines: string[],\n key: string,\n value: unknown\n): void {\n const nameAttr = escapeXmlMinimalAttr(key, '\"');\n const text = escapeXmlMinimalText(toQwen3CoderToolParserParamText(value));\n lines.push(` <parameter=\"${nameAttr}\">${text}</parameter>`);\n}\n\nfunction appendQwen3CoderToolParserArgs(lines: string[], args: unknown): void {\n if (args && typeof args === \"object\" && !Array.isArray(args)) {\n for (const [key, value] of Object.entries(args)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n appendQwen3CoderToolParserParameter(lines, key, item);\n }\n } else {\n appendQwen3CoderToolParserParameter(lines, key, value);\n }\n }\n return;\n }\n\n if (args !== undefined && args !== null && args !== \"\") {\n appendQwen3CoderToolParserParameter(lines, \"input\", args);\n }\n}\n\nexport const qwen3CoderProtocol = (): TCMProtocol => ({\n formatTools({ tools, toolSystemPromptTemplate }) {\n return formatToolsWithPromptTemplate({ tools, toolSystemPromptTemplate });\n },\n\n formatToolCall(toolCall: LanguageModelV3ToolCall): string {\n const args = parseToolCallInput(toolCall.input);\n const lines: string[] = [\"<tool_call>\"];\n lines.push(\n ` <function=\"${escapeXmlMinimalAttr(toolCall.toolName, '\"')}\">`\n );\n appendQwen3CoderToolParserArgs(lines, args);\n lines.push(\" </function>\");\n lines.push(\"</tool_call>\");\n return lines.join(\"\\n\");\n },\n\n parseGeneratedText({ text, tools, options }) {\n const processedElements: LanguageModelV3Content[] = [];\n\n const emitToolCalls = (\n calls: Array<{ toolName: string; args: Record<string, unknown> }>\n ) => {\n for (const call of calls) {\n processedElements.push({\n type: \"tool-call\",\n toolCallId: generateToolCallId(),\n toolName: call.toolName,\n input: stringifyToolInputWithSchema({\n tools,\n toolName: call.toolName,\n args: call.args,\n }),\n });\n }\n };\n\n const pushText = (value: string) => {\n if (value.length === 0) {\n return;\n }\n processedElements.push({ type: \"text\", text: value });\n };\n\n const tryEmitToolCallSegment = (\n segment: string,\n fallbackText: string = segment\n ): boolean => {\n const parsedCalls = parseQwen3CoderToolParserToolCallSegment(segment);\n if (!parsedCalls) {\n options?.onError?.(\n \"Could not process Qwen3CoderToolParser XML tool call; keeping original text.\",\n { toolCall: fallbackText }\n );\n processedElements.push({ type: \"text\", text: fallbackText });\n return false;\n }\n emitToolCalls(parsedCalls);\n return true;\n };\n\n const emitWrapperlessCallParseFailureAsText = (raw: string) => {\n options?.onError?.(\n \"Could not process Qwen3CoderToolParser <function> call; keeping original text.\",\n { toolCall: raw }\n );\n processedElements.push({ type: \"text\", text: raw });\n };\n\n const tryParseCallBlocksWithoutWrapperByImplicitStarts = (\n sourceText: string,\n starts: number[]\n ): boolean => {\n let index = 0;\n for (let i = 0; i < starts.length; i += 1) {\n const startIndex = starts[i] ?? -1;\n if (startIndex < 0) {\n continue;\n }\n const endIndex = starts[i + 1] ?? sourceText.length;\n\n pushText(\n stripTrailingToolCallCloseTags(\n stripLeadingToolCallCloseTags(sourceText.slice(index, startIndex))\n )\n );\n\n const full = sourceText.slice(startIndex, endIndex);\n const { callContent, trailingText } = splitImplicitCallAndTail(full);\n const parsed = parseSingleFunctionCallXml(callContent, null);\n if (parsed) {\n emitToolCalls([parsed]);\n pushText(\n stripTrailingToolCallCloseTags(\n stripLeadingToolCallCloseTags(trailingText)\n )\n );\n } else {\n emitWrapperlessCallParseFailureAsText(full);\n }\n\n index = endIndex;\n }\n\n pushText(\n stripTrailingToolCallCloseTags(\n stripLeadingToolCallCloseTags(sourceText.slice(index))\n )\n );\n return true;\n };\n\n const tryParseCallBlocksWithoutWrapperByMatches = (\n sourceText: string,\n matches: RegExpMatchArray[]\n ): boolean => {\n let index = 0;\n for (const match of matches) {\n const full = match[0];\n const startIndex = match.index ?? -1;\n if (!full || startIndex < 0) {\n continue;\n }\n\n pushText(\n stripTrailingToolCallCloseTags(\n stripLeadingToolCallCloseTags(sourceText.slice(index, startIndex))\n )\n );\n\n const parsed = parseSingleFunctionCallXml(full, null);\n if (parsed) {\n emitToolCalls([parsed]);\n } else {\n emitWrapperlessCallParseFailureAsText(full);\n }\n index = startIndex + full.length;\n }\n\n const trailing = sourceText.slice(index);\n const trailingStarts = findImplicitCallOpenIndices(\n trailing.toLowerCase()\n );\n if (trailingStarts.length > 0) {\n return tryParseCallBlocksWithoutWrapperByImplicitStarts(\n trailing,\n trailingStarts\n );\n }\n\n pushText(\n stripTrailingToolCallCloseTags(stripLeadingToolCallCloseTags(trailing))\n );\n return true;\n };\n\n // vLLM reference (Qwen3CoderToolParser): fallback extraction still attempts to\n // parse when XML wrapper tags are missing (raw output starts with <function=...>).\n // https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/vllm/tool_parsers/qwen3coder_tool_parser.py#L271-L289\n // https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/tests/tool_parsers/test_qwen3coder_tool_parser.py#L356-L377\n const tryParseCallBlocksWithoutWrapperText = (\n sourceText: string\n ): boolean => {\n const matches = Array.from(sourceText.matchAll(CALL_BLOCK_RE));\n if (matches.length > 0) {\n return tryParseCallBlocksWithoutWrapperByMatches(sourceText, matches);\n }\n\n const starts = findImplicitCallOpenIndices(sourceText.toLowerCase());\n if (starts.length === 0) {\n return false;\n }\n return tryParseCallBlocksWithoutWrapperByImplicitStarts(\n sourceText,\n starts\n );\n };\n\n const pushTextOrParseWrapperlessCalls = (segment: string) => {\n if (segment.length === 0) {\n return;\n }\n if (!tryParseCallBlocksWithoutWrapperText(segment)) {\n pushText(segment);\n }\n };\n\n // vLLM reference (Qwen3CoderToolParser): allow trailing, incomplete <tool_call>\n // blocks (\"<tool_call>...$\"), and still attempt best-effort parsing.\n // https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/vllm/tool_parsers/qwen3coder_tool_parser.py#L55-L61\n const handleCompleteToolCallRemainder = (remainder: string) => {\n if (!remainder) {\n return;\n }\n const lowerRemainder = remainder.toLowerCase();\n const trailingIndex = lowerRemainder.indexOf(\"<tool_call\");\n if (trailingIndex === -1) {\n pushTextOrParseWrapperlessCalls(remainder);\n return;\n }\n\n pushTextOrParseWrapperlessCalls(remainder.slice(0, trailingIndex));\n const trailing = remainder.slice(trailingIndex);\n const synthetic = TOOL_CALL_CLOSE_RE.test(trailing)\n ? trailing\n : `${trailing}</tool_call>`;\n tryEmitToolCallSegment(synthetic, trailing);\n };\n\n const tryParseCompleteToolCallBlocks = (): boolean => {\n const matches = Array.from(text.matchAll(TOOL_CALL_BLOCK_RE));\n if (matches.length === 0) {\n return false;\n }\n\n let index = 0;\n for (const match of matches) {\n const full = match[0];\n const startIndex = match.index ?? -1;\n if (!full || startIndex < 0) {\n continue;\n }\n\n pushTextOrParseWrapperlessCalls(text.slice(index, startIndex));\n tryEmitToolCallSegment(full);\n index = startIndex + full.length;\n }\n\n handleCompleteToolCallRemainder(text.slice(index));\n return true;\n };\n\n const tryParseIncompleteToolCall = (): boolean => {\n const lowerText = text.toLowerCase();\n const startIndex = lowerText.indexOf(\"<tool_call\");\n if (startIndex === -1) {\n return false;\n }\n\n pushTextOrParseWrapperlessCalls(text.slice(0, startIndex));\n const trailing = text.slice(startIndex);\n const synthetic = TOOL_CALL_CLOSE_RE.test(trailing)\n ? trailing\n : `${trailing}</tool_call>`;\n tryEmitToolCallSegment(synthetic, trailing);\n return true;\n };\n\n const tryParseCallBlocksWithoutWrapper = (): boolean => {\n return tryParseCallBlocksWithoutWrapperText(text);\n };\n\n const tryParseSingleFunctionCall = (): boolean => {\n const lowerText = text.toLowerCase();\n const startIndex = lowerText.indexOf(\"<function\");\n if (startIndex === -1) {\n return false;\n }\n\n pushText(stripTrailingToolCallCloseTags(text.slice(0, startIndex)));\n const trailing = stripLeadingToolCallCloseTags(text.slice(startIndex));\n const parsed = parseSingleFunctionCallXml(trailing, null);\n if (!parsed) {\n processedElements.push({ type: \"text\", text: trailing });\n return true;\n }\n\n emitToolCalls([parsed]);\n return true;\n };\n\n if (tryParseCompleteToolCallBlocks()) {\n return processedElements;\n }\n if (tryParseIncompleteToolCall()) {\n return processedElements;\n }\n if (tryParseCallBlocksWithoutWrapper()) {\n return processedElements;\n }\n if (tryParseSingleFunctionCall()) {\n return processedElements;\n }\n\n return [{ type: \"text\", text }];\n },\n\n extractToolCallSegments({ text }) {\n return Array.from(text.matchAll(TOOL_CALL_BLOCK_RE))\n .map((m) => m[0])\n .filter((s): s is string => Boolean(s));\n },\n\n createStreamParser({ tools, options }) {\n const toolCallStartPrefixLower = \"<tool_call\";\n\n // vLLM reference (Qwen3XMLToolParser): streaming tool calls can start directly\n // with <function=...> (missing opening <tool_call>), and the parser implicitly\n // starts a tool_call container.\n // https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/vllm/tool_parsers/qwen3xml_tool_parser.py#L595-L642\n // https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/tests/tool_parsers/test_qwen3coder_tool_parser.py#L901-L922\n const implicitCallPrefixesLower = [\n \"<function\",\n \"<call\",\n \"<tool\",\n \"<invoke\",\n ];\n\n type ToolCallMode = \"unknown\" | \"single\" | \"multi\";\n\n type StreamingCallState = QwenStreamCallState;\n\n interface ToolCallContainerState {\n activeCall: StreamingCallState | null;\n emittedToolCallCount: number;\n innerBuffer: string;\n mode: ToolCallMode;\n outerNameAttr: string | null;\n outerOpenTag: string;\n raw: string;\n }\n\n let buffer = \"\";\n let toolCall: ToolCallContainerState | null = null;\n let implicitCall: StreamingCallState | null = null;\n let implicitCallOpenTag: string | null = null;\n let currentTextId: string | null = null;\n let hasEmittedTextStart = false;\n\n const flushText = createFlushTextHandler(\n () => currentTextId,\n (id) => {\n currentTextId = id;\n },\n () => hasEmittedTextStart,\n (value) => {\n hasEmittedTextStart = value;\n }\n );\n\n const maybeEmitToolInputStart = (\n controller: StreamController,\n callState: StreamingCallState\n ) => {\n if (callState.hasEmittedStart) {\n return;\n }\n const toolName = callState.toolName;\n if (!toolName || toolName.trim().length === 0) {\n return;\n }\n flushText(controller);\n controller.enqueue({\n type: \"tool-input-start\",\n id: callState.toolCallId,\n toolName,\n });\n callState.hasEmittedStart = true;\n };\n\n const maybeEmitToolInputProgress = (\n controller: StreamController,\n callState: StreamingCallState\n ) => {\n if (!callState.hasEmittedStart) {\n return;\n }\n const toolName = callState.toolName;\n if (!toolName) {\n return;\n }\n const argsForProgress = mergeArgsWithPartialParam(\n callState.args,\n callState.partialParam\n );\n const fullInput = stringifyToolInputWithSchema({\n tools,\n toolName,\n args: argsForProgress,\n });\n if (fullInput === \"{}\") {\n return;\n }\n emitToolInputProgressDelta({\n controller,\n id: callState.toolCallId,\n state: callState,\n fullInput,\n });\n };\n\n const finalizeCall = (\n controller: StreamController,\n callState: StreamingCallState,\n fallbackToolName: string | null,\n rawToolCallText: string | null = null\n ): boolean => {\n const resolvedToolName = callState.toolName ?? fallbackToolName;\n if (!resolvedToolName || resolvedToolName.trim().length === 0) {\n const shouldEmitRaw = shouldEmitRawToolCallTextOnError(options);\n emitFailedToolInputLifecycle({\n controller,\n id: callState.toolCallId,\n endInput: callState.hasEmittedStart,\n emitRawToolCallTextOnError: shouldEmitRaw,\n rawToolCallText,\n emitRawText: (rawText) => {\n flushText(controller, rawText);\n },\n });\n options?.onError?.(\n shouldEmitRaw && rawToolCallText\n ? \"Could not resolve Qwen3CoderToolParser tool name for tool call; emitting original text.\"\n : \"Could not resolve Qwen3CoderToolParser tool name for tool call\",\n {\n toolCallId: callState.toolCallId,\n toolCall: rawToolCallText,\n }\n );\n return false;\n }\n\n callState.toolName = resolvedToolName;\n\n maybeEmitToolInputStart(controller, callState);\n maybeEmitToolInputProgress(controller, callState);\n\n const finalInput = stringifyToolInputWithSchema({\n tools,\n toolName: resolvedToolName,\n args: callState.args,\n });\n emitFinalizedToolInputLifecycle({\n controller,\n id: callState.toolCallId,\n state: callState,\n toolName: resolvedToolName,\n finalInput,\n onMismatch: options?.onError,\n });\n return true;\n };\n\n const parseStreamingCallContent = (\n controller: StreamController,\n callState: StreamingCallState,\n content: string,\n allowEndOfString: boolean\n ): string =>\n parseCallContent({\n callState,\n content,\n allowEndOfString,\n nameTagRe: QWEN3CODER_TOOL_PARSER_STREAM_NAME_TAG_RE,\n normalizeXmlTextValue,\n parseParamTagAt: parseQwen3CoderToolParserParamTagAt,\n mergeParamValue,\n maybeEmitToolInputStart: () => {\n maybeEmitToolInputStart(controller, callState);\n },\n maybeEmitToolInputProgress: () => {\n maybeEmitToolInputProgress(controller, callState);\n },\n });\n\n // This cache is scoped to createStreamParser (per-stream), so it cannot outlive\n // one stream invocation.\n // It is bounded by the small set of endTagName values {call, function, tool,\n // invoke, tool_call}, so this is effectively ~5 entries max.\n // Eviction is unnecessary because the keyspace is fixed and tiny.\n const closeTagCache = new Map<string, RegExp>();\n\n const getCloseTagPattern = (endTagName: string): RegExp => {\n const cached = closeTagCache.get(endTagName);\n if (cached) {\n return cached;\n }\n\n const created = new RegExp(\n `<\\\\s*\\\\/\\\\s*${escapeRegExp(endTagName)}\\\\s*>`,\n \"i\"\n );\n closeTagCache.set(endTagName, created);\n return created;\n };\n\n const getNextCallStartInBuffer = (\n callState: StreamingCallState\n ): number => {\n if (callState.endTagName === \"tool_call\") {\n return -1;\n }\n const match = QWEN3CODER_TOOL_PARSER_STREAM_CALL_OPEN_TAG_RE.exec(\n callState.buffer\n );\n return match?.index ?? -1;\n };\n\n const finalizeStreamingCall = (\n controller: StreamController,\n callState: StreamingCallState,\n fallbackToolName: string | null,\n remainder: string\n ) => {\n const rawToolCallText =\n remainder.length > 0 && callState.raw.endsWith(remainder)\n ? callState.raw.slice(0, -remainder.length)\n : callState.raw;\n const ok = finalizeCall(\n controller,\n callState,\n fallbackToolName,\n rawToolCallText\n );\n if (ok && toolCall) {\n toolCall.emittedToolCallCount += 1;\n }\n };\n\n const consumeCallAtNextBoundary = (\n controller: StreamController,\n callState: StreamingCallState,\n fallbackToolName: string | null,\n nextCallStart: number\n ): { done: true; remainder: string } => {\n const beforeNextCall = callState.buffer.slice(0, nextCallStart);\n const afterNextCall = callState.buffer.slice(nextCallStart);\n\n callState.buffer = parseStreamingCallContent(\n controller,\n callState,\n beforeNextCall,\n true\n );\n finalizeStreamingCall(\n controller,\n callState,\n fallbackToolName,\n afterNextCall\n );\n return { done: true, remainder: afterNextCall };\n };\n\n const consumeCall = (\n controller: StreamController,\n callState: StreamingCallState,\n incoming: string,\n fallbackToolName: string | null\n ): { done: boolean; remainder: string } => {\n callState.buffer += incoming;\n callState.raw += incoming;\n\n const closeMatch = getCloseTagPattern(callState.endTagName).exec(\n callState.buffer\n );\n const closeStart = closeMatch?.index ?? -1;\n const nextCallStart = getNextCallStartInBuffer(callState);\n const shouldCloseAtNextBoundary =\n nextCallStart !== -1 &&\n (closeStart === -1 || nextCallStart < closeStart);\n\n if (shouldCloseAtNextBoundary) {\n return consumeCallAtNextBoundary(\n controller,\n callState,\n fallbackToolName,\n nextCallStart\n );\n }\n\n if (!closeMatch) {\n callState.buffer = parseStreamingCallContent(\n controller,\n callState,\n callState.buffer,\n false\n );\n return { done: false, remainder: \"\" };\n }\n\n const closeEnd = closeStart + (closeMatch[0]?.length ?? 0);\n const beforeClose = callState.buffer.slice(0, closeStart);\n const afterClose = callState.buffer.slice(closeEnd);\n\n parseStreamingCallContent(controller, callState, beforeClose, true);\n callState.buffer = \"\";\n finalizeStreamingCall(\n controller,\n callState,\n fallbackToolName,\n afterClose\n );\n return { done: true, remainder: afterClose };\n };\n\n const finalizeCallAtFinish = (\n controller: StreamController,\n callState: StreamingCallState,\n fallbackToolName: string | null\n ): { ok: boolean; trailingText: string } => {\n callState.buffer = parseStreamingCallContent(\n controller,\n callState,\n callState.buffer,\n true\n );\n const trailingText = stripLeadingCallCloseTags(callState.buffer);\n callState.buffer = \"\";\n const ok = finalizeCall(controller, callState, fallbackToolName, null);\n return {\n ok,\n trailingText,\n };\n };\n\n const flushSafeTextPrefix = (controller: StreamController) => {\n const lower = buffer.toLowerCase();\n\n const potentialIndices = [\n getPotentialStartIndex(lower, toolCallStartPrefixLower),\n ...implicitCallPrefixesLower.map((prefix) =>\n getPotentialStartIndex(lower, prefix)\n ),\n ].filter((value): value is number => value != null);\n\n const potentialIndex =\n potentialIndices.length > 0 ? Math.min(...potentialIndices) : null;\n if (potentialIndex == null) {\n if (buffer.length > 0) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n return;\n }\n\n if (potentialIndex > 0) {\n flushText(controller, buffer.slice(0, potentialIndex));\n buffer = buffer.slice(potentialIndex);\n }\n };\n\n const stripLeadingToolCallCloseTagsFromBuffer = () => {\n if (!buffer) {\n return;\n }\n const stripped = stripLeadingToolCallCloseTags(buffer);\n if (stripped !== buffer) {\n buffer = stripped;\n }\n };\n\n const startToolCallIfPresent = (_controller: StreamController) => {\n if (toolCall) {\n return;\n }\n\n if (implicitCall) {\n return;\n }\n\n const lower = buffer.toLowerCase();\n const startIndex = getPotentialStartIndex(\n lower,\n toolCallStartPrefixLower\n );\n if (startIndex == null || startIndex !== 0) {\n return;\n }\n\n const gtIndex = buffer.indexOf(\">\");\n if (gtIndex === -1) {\n return;\n }\n\n const openTag = buffer.slice(0, gtIndex + 1);\n if (!TOOL_CALL_OPEN_RE.test(openTag)) {\n return;\n }\n\n toolCall = {\n outerOpenTag: openTag,\n outerNameAttr: getAttributeValue(openTag, \"name\"),\n raw: openTag,\n mode: \"unknown\",\n innerBuffer: \"\",\n activeCall: null,\n emittedToolCallCount: 0,\n };\n\n const remainder = buffer.slice(gtIndex + 1);\n buffer = \"\";\n if (remainder.length > 0) {\n toolCall.raw += remainder;\n toolCall.innerBuffer += remainder;\n }\n };\n\n const startImplicitCallIfPresent = (controller: StreamController) => {\n if (toolCall || implicitCall) {\n return;\n }\n\n const match = QWEN3CODER_TOOL_PARSER_STREAM_CALL_OPEN_TAG_RE.exec(buffer);\n const startIndex = match?.index ?? -1;\n const openTag = match?.[0] ?? \"\";\n const callTagName = (match?.[1] ?? \"\").toLowerCase();\n if (!match || startIndex !== 0 || !openTag || !callTagName) {\n return;\n }\n\n const inlineToolName =\n getAttributeValue(openTag, \"name\") ?? getShorthandValue(openTag);\n if (!inlineToolName || inlineToolName.trim().length === 0) {\n return;\n }\n const selfClosing =\n QWEN3CODER_TOOL_PARSER_STREAM_SELF_CLOSING_TAG_RE.test(openTag);\n\n buffer = buffer.slice(openTag.length);\n\n const newCall: StreamingCallState = {\n endTagName: callTagName,\n toolCallId: generateToolCallId(),\n toolName: inlineToolName,\n hasEmittedStart: false,\n partialParam: null,\n emittedInput: \"\",\n raw: openTag,\n args: {},\n buffer: \"\",\n };\n\n maybeEmitToolInputStart(controller, newCall);\n\n if (selfClosing) {\n finalizeCall(controller, newCall, inlineToolName, newCall.raw);\n return;\n }\n\n implicitCall = newCall;\n implicitCallOpenTag = openTag;\n };\n\n const processImplicitCall = (controller: StreamController) => {\n while (implicitCall) {\n const callState = implicitCall;\n const { done, remainder } = consumeCall(\n controller,\n callState,\n buffer,\n null\n );\n buffer = \"\";\n if (!done) {\n return;\n }\n\n implicitCall = null;\n implicitCallOpenTag = null;\n if (remainder.length > 0) {\n buffer = remainder;\n }\n\n stripLeadingToolCallCloseTagsFromBuffer();\n flushSafeTextPrefix(controller);\n startToolCallIfPresent(controller);\n if (toolCall) {\n processToolCall(controller);\n return;\n }\n startImplicitCallIfPresent(controller);\n }\n };\n\n const drainStarts = (controller: StreamController) => {\n while (true) {\n if (toolCall || implicitCall) {\n return;\n }\n\n const before = buffer;\n startToolCallIfPresent(controller);\n if (toolCall) {\n processToolCall(controller);\n return;\n }\n\n startImplicitCallIfPresent(controller);\n if (implicitCall) {\n processImplicitCall(controller);\n return;\n }\n\n if (buffer === before) {\n return;\n }\n stripLeadingToolCallCloseTagsFromBuffer();\n flushSafeTextPrefix(controller);\n }\n };\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Stream tool-call parsing is a nested state machine.\n const processToolCall = (controller: StreamController) => {\n while (toolCall) {\n if (toolCall.mode === \"unknown\") {\n const callMatch =\n QWEN3CODER_TOOL_PARSER_STREAM_CALL_OPEN_START_RE.exec(\n toolCall.innerBuffer\n );\n const signalMatch =\n QWEN3CODER_TOOL_PARSER_STREAM_NAME_OR_PARAM_SIGNAL_RE.exec(\n toolCall.innerBuffer\n );\n if (\n callMatch &&\n (!signalMatch || (callMatch.index ?? 0) < (signalMatch.index ?? 0))\n ) {\n toolCall.mode = \"multi\";\n } else if (signalMatch) {\n toolCall.mode = \"single\";\n const activeCall: StreamingCallState = {\n endTagName: \"tool_call\",\n toolCallId: generateToolCallId(),\n toolName: toolCall.outerNameAttr,\n hasEmittedStart: false,\n partialParam: null,\n emittedInput: \"\",\n raw: toolCall.outerOpenTag,\n args: {},\n buffer: \"\",\n };\n toolCall.activeCall = activeCall;\n if (toolCall.outerNameAttr) {\n maybeEmitToolInputStart(controller, activeCall);\n }\n } else {\n return;\n }\n }\n\n if (toolCall.mode === \"single\") {\n const callState = toolCall.activeCall;\n if (!callState) {\n return;\n }\n\n const { done, remainder } = consumeCall(\n controller,\n callState,\n toolCall.innerBuffer,\n toolCall.outerNameAttr\n );\n toolCall.innerBuffer = \"\";\n\n if (!done) {\n return;\n }\n\n toolCall = null;\n if (remainder.length > 0) {\n buffer = remainder + buffer;\n }\n flushSafeTextPrefix(controller);\n startToolCallIfPresent(controller);\n continue;\n }\n\n if (toolCall.mode === \"multi\") {\n if (toolCall.activeCall) {\n const callState = toolCall.activeCall;\n const { done, remainder } = consumeCall(\n controller,\n callState,\n toolCall.innerBuffer,\n toolCall.outerNameAttr\n );\n toolCall.innerBuffer = \"\";\n\n if (!done) {\n return;\n }\n\n toolCall.activeCall = null;\n toolCall.innerBuffer = remainder;\n continue;\n }\n\n const closeMatch =\n QWEN3CODER_TOOL_PARSER_STREAM_TOOL_CALL_CLOSE_TAG_RE.exec(\n toolCall.innerBuffer\n );\n const callOpenMatch =\n QWEN3CODER_TOOL_PARSER_STREAM_CALL_OPEN_TAG_RE.exec(\n toolCall.innerBuffer\n );\n\n if (!(closeMatch || callOpenMatch)) {\n return;\n }\n\n const closeIndex = closeMatch?.index ?? -1;\n const callIndex = callOpenMatch?.index ?? -1;\n const hasClose = closeIndex !== -1;\n const hasCall = callIndex !== -1;\n\n const chooseClose = hasClose && (!hasCall || closeIndex < callIndex);\n const nextIndex = chooseClose ? closeIndex : callIndex;\n if (nextIndex > 0) {\n toolCall.innerBuffer = toolCall.innerBuffer.slice(nextIndex);\n }\n\n if (chooseClose) {\n const matchLen = closeMatch?.[0]?.length ?? 0;\n const remainder = toolCall.innerBuffer.slice(matchLen);\n toolCall = null;\n if (remainder.length > 0) {\n buffer = remainder + buffer;\n }\n flushSafeTextPrefix(controller);\n startToolCallIfPresent(controller);\n continue;\n }\n\n if (!callOpenMatch) {\n return;\n }\n\n const openTag = callOpenMatch[0] ?? \"\";\n const callTagName = (callOpenMatch[1] ?? \"\").toLowerCase();\n const rest = toolCall.innerBuffer.slice(openTag.length);\n\n const selfClosing =\n QWEN3CODER_TOOL_PARSER_STREAM_SELF_CLOSING_TAG_RE.test(openTag);\n if (selfClosing) {\n const toolNameAttr =\n getAttributeValue(openTag, \"name\") ??\n getShorthandValue(openTag) ??\n toolCall.outerNameAttr;\n const immediateCall: StreamingCallState = {\n endTagName: callTagName,\n toolCallId: generateToolCallId(),\n toolName: toolNameAttr,\n hasEmittedStart: false,\n partialParam: null,\n emittedInput: \"\",\n raw: openTag,\n args: {},\n buffer: \"\",\n };\n const ok = finalizeCall(\n controller,\n immediateCall,\n toolNameAttr,\n immediateCall.raw\n );\n if (ok) {\n toolCall.emittedToolCallCount += 1;\n }\n toolCall.innerBuffer = rest;\n continue;\n }\n\n const toolNameAttr =\n getAttributeValue(openTag, \"name\") ?? getShorthandValue(openTag);\n const newCall: StreamingCallState = {\n endTagName: callTagName,\n toolCallId: generateToolCallId(),\n toolName: toolNameAttr,\n hasEmittedStart: false,\n partialParam: null,\n emittedInput: \"\",\n raw: openTag,\n args: {},\n buffer: \"\",\n };\n\n if (toolNameAttr) {\n maybeEmitToolInputStart(controller, newCall);\n }\n\n toolCall.activeCall = newCall;\n toolCall.innerBuffer = rest;\n }\n }\n };\n\n const reportUnfinishedToolCallAtFinish = (\n controller: StreamController,\n rawToolCall: string\n ) => {\n const shouldEmitRaw = shouldEmitRawToolCallTextOnError(options);\n options?.onError?.(\n shouldEmitRaw\n ? \"Could not complete streaming Qwen3CoderToolParser XML tool call at finish; emitting original text.\"\n : \"Could not complete streaming Qwen3CoderToolParser XML tool call at finish.\",\n { toolCall: rawToolCall }\n );\n if (shouldEmitRaw) {\n flushText(controller, rawToolCall);\n }\n };\n\n const reportUnfinishedImplicitCallAtFinish = (\n controller: StreamController,\n rawCallText: string\n ) => {\n const shouldEmitRaw = shouldEmitRawToolCallTextOnError(options);\n options?.onError?.(\n shouldEmitRaw\n ? \"Could not complete streaming Qwen3CoderToolParser call block at finish; emitting original text.\"\n : \"Could not complete streaming Qwen3CoderToolParser call block at finish.\",\n { toolCall: rawCallText }\n );\n if (shouldEmitRaw) {\n flushText(controller, rawCallText);\n }\n };\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Stream finish reconciliation is a best-effort state machine cleanup.\n const handleFinish = (controller: StreamController) => {\n if (toolCall) {\n // Process any remaining complete structures first.\n processToolCall(controller);\n\n if (toolCall) {\n // Best-effort reconciliation on incomplete tool-call markup at finish.\n if (toolCall.mode === \"unknown\") {\n const callMatch =\n QWEN3CODER_TOOL_PARSER_STREAM_CALL_OPEN_START_RE.exec(\n toolCall.innerBuffer\n );\n const signalMatch =\n QWEN3CODER_TOOL_PARSER_STREAM_NAME_OR_PARAM_SIGNAL_RE.exec(\n toolCall.innerBuffer\n );\n if (\n callMatch &&\n (!signalMatch ||\n (callMatch.index ?? 0) < (signalMatch.index ?? 0))\n ) {\n toolCall.mode = \"multi\";\n } else if (signalMatch) {\n toolCall.mode = \"single\";\n toolCall.activeCall = {\n endTagName: \"tool_call\",\n toolCallId: generateToolCallId(),\n toolName: toolCall.outerNameAttr,\n hasEmittedStart: false,\n partialParam: null,\n emittedInput: \"\",\n raw: toolCall.outerOpenTag,\n args: {},\n buffer: \"\",\n };\n }\n }\n\n if (toolCall.mode === \"single\" && toolCall.activeCall) {\n toolCall.activeCall.buffer += toolCall.innerBuffer;\n toolCall.innerBuffer = \"\";\n const result = finalizeCallAtFinish(\n controller,\n toolCall.activeCall,\n toolCall.outerNameAttr\n );\n if (result.ok) {\n toolCall.emittedToolCallCount += 1;\n }\n const shouldFlushTrailingText =\n result.ok || !shouldEmitRawToolCallTextOnError(options);\n if (shouldFlushTrailingText && result.trailingText.length > 0) {\n flushText(controller, result.trailingText);\n }\n if (!result.ok && toolCall.emittedToolCallCount === 0) {\n reportUnfinishedToolCallAtFinish(controller, toolCall.raw);\n }\n } else if (toolCall.mode === \"multi\") {\n if (toolCall.activeCall) {\n const result = finalizeCallAtFinish(\n controller,\n toolCall.activeCall,\n toolCall.outerNameAttr\n );\n if (result.ok) {\n toolCall.emittedToolCallCount += 1;\n }\n const shouldFlushTrailingText =\n result.ok || !shouldEmitRawToolCallTextOnError(options);\n if (shouldFlushTrailingText && result.trailingText.length > 0) {\n flushText(controller, result.trailingText);\n }\n if (!result.ok && toolCall.emittedToolCallCount === 0) {\n reportUnfinishedToolCallAtFinish(controller, toolCall.raw);\n }\n toolCall.activeCall = null;\n } else if (toolCall.emittedToolCallCount === 0) {\n reportUnfinishedToolCallAtFinish(controller, toolCall.raw);\n }\n } else {\n reportUnfinishedToolCallAtFinish(controller, toolCall.raw);\n }\n\n toolCall = null;\n }\n }\n\n if (implicitCall) {\n const callState = implicitCall;\n const openTag = implicitCallOpenTag;\n implicitCall = null;\n implicitCallOpenTag = null;\n\n const result = finalizeCallAtFinish(controller, callState, null);\n const shouldFlushTrailingText =\n result.ok || !shouldEmitRawToolCallTextOnError(options);\n if (shouldFlushTrailingText && result.trailingText.length > 0) {\n flushText(controller, result.trailingText);\n }\n if (!result.ok && openTag) {\n reportUnfinishedImplicitCallAtFinish(\n controller,\n callState.raw || openTag + callState.buffer\n );\n }\n } else {\n stripLeadingToolCallCloseTagsFromBuffer();\n flushSafeTextPrefix(controller);\n drainStarts(controller);\n }\n\n if (buffer.length > 0) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n\n flushText(controller);\n };\n\n const handlePassthroughChunk = (\n controller: StreamController,\n chunk: LanguageModelV3StreamPart\n ) => {\n if (!toolCall && buffer) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n controller.enqueue(chunk);\n };\n\n const handleTextDeltaChunk = (\n controller: StreamController,\n delta: string\n ) => {\n if (toolCall) {\n toolCall.raw += delta;\n toolCall.innerBuffer += delta;\n processToolCall(controller);\n return;\n }\n\n if (implicitCall) {\n const callState = implicitCall;\n const { done, remainder } = consumeCall(\n controller,\n callState,\n delta,\n null\n );\n if (!done) {\n return;\n }\n implicitCall = null;\n implicitCallOpenTag = null;\n if (remainder.length > 0) {\n buffer = remainder + buffer;\n }\n stripLeadingToolCallCloseTagsFromBuffer();\n flushSafeTextPrefix(controller);\n drainStarts(controller);\n return;\n }\n\n buffer += delta;\n stripLeadingToolCallCloseTagsFromBuffer();\n flushSafeTextPrefix(controller);\n drainStarts(controller);\n };\n\n const handleTransformChunk = (\n controller: StreamController,\n chunk: LanguageModelV3StreamPart\n ) => {\n if (chunk.type === \"finish\") {\n handleFinish(controller);\n controller.enqueue(chunk);\n return;\n }\n if (chunk.type !== \"text-delta\") {\n handlePassthroughChunk(controller, chunk);\n return;\n }\n const delta = chunk.delta;\n if (!delta) {\n return;\n }\n handleTextDeltaChunk(controller, delta);\n };\n\n return new TransformStream({\n transform(chunk, controller) {\n handleTransformChunk(controller, chunk);\n },\n flush(controller) {\n handleFinish(controller);\n },\n });\n },\n});\n\nexport const uiTarsXmlProtocol = qwen3CoderProtocol;\n\nexport const Qwen3CoderToolParser = qwen3CoderProtocol;\n","import type {\n LanguageModelV3Content,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport YAML from \"yaml\";\nimport { generateToolCallId } from \"../utils/id\";\nimport {\n addTextSegment,\n createFlushTextHandler,\n extractToolNames,\n formatToolsWithPromptTemplate,\n} from \"../utils/protocol-utils\";\nimport { NAME_CHAR_RE, WHITESPACE_REGEX } from \"../utils/regex-constants\";\nimport {\n emitFailedToolInputLifecycle,\n emitFinalizedToolInputLifecycle,\n emitToolInputProgressDelta,\n enqueueToolInputEndAndCall,\n shouldEmitRawToolCallTextOnError,\n stringifyToolInputWithSchema,\n} from \"../utils/tool-input-streaming\";\nimport { tryRepairXmlSelfClosingRootWithBody } from \"../utils/xml-root-repair\";\nimport {\n findEarliestToolTag,\n findNextToolTag,\n} from \"../utils/xml-tool-tag-scanner\";\nimport type { ParserOptions, TCMCoreProtocol } from \"./protocol-interface\";\n\nexport interface YamlXmlProtocolOptions {\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*)/;\nconst INCOMPLETE_MAPPING_TAIL_RE = /^[^:[\\]{}-][^:]*:\\s*$/;\nconst INCOMPLETE_SEQUENCE_TAIL_RE = /^-\\s*$/;\nconst BLOCK_SCALAR_KEY_RE = /:\\s*[|>][-+0-9]*\\s*$/;\nconst PLAIN_MAPPING_VALUE_RE = /^[^:[\\]{}-][^:]*:\\s*(.+)$/;\nconst PLAIN_SEQUENCE_VALUE_RE = /^-\\s+(.+)$/;\n\ninterface LastMeaningfulLineInfo {\n indent: number;\n index: number;\n raw: string;\n trimmed: string;\n}\n\nfunction normalizeYamlContent(yamlContent: string): {\n normalized: string;\n nonEmptyLines: string[];\n} {\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 if (nonEmptyLines.length === 0) {\n return { normalized: \"\", nonEmptyLines };\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 return { normalized, nonEmptyLines };\n}\n\nfunction parseYamlDocumentAsMapping(normalized: string): {\n value: Record<string, unknown> | null;\n errors: string[];\n} {\n try {\n const doc = YAML.parseDocument(normalized);\n const errors = doc.errors.map((e: { message: string }) => e.message);\n const result = doc.toJSON();\n\n if (result === null) {\n return { value: {}, errors };\n }\n if (typeof result !== \"object\" || Array.isArray(result)) {\n return { value: null, errors };\n }\n return { value: result as Record<string, unknown>, errors };\n } catch (error) {\n return {\n value: null,\n errors: [\n error instanceof Error ? error.message : \"Unknown YAML parsing error\",\n ],\n };\n }\n}\n\nfunction getLastMeaningfulLineInfo(\n input: string\n): LastMeaningfulLineInfo | null {\n const lines = input.split(\"\\n\");\n let index = lines.length - 1;\n while (index >= 0) {\n const raw = lines[index] ?? \"\";\n const trimmed = raw.trim();\n if (trimmed.length > 0 && !trimmed.startsWith(\"#\")) {\n return {\n index,\n raw,\n trimmed,\n indent: raw.length - raw.trimStart().length,\n };\n }\n index -= 1;\n }\n return null;\n}\n\nfunction dropLastMeaningfulLine(input: string): string | null {\n const lineInfo = getLastMeaningfulLineInfo(input);\n if (!lineInfo) {\n return null;\n }\n\n return input.split(\"\\n\").slice(0, lineInfo.index).join(\"\\n\").trimEnd();\n}\n\nfunction hasIncompleteMappingTail(normalized: string): boolean {\n const lineInfo = getLastMeaningfulLineInfo(normalized);\n if (!lineInfo) {\n return false;\n }\n return INCOMPLETE_MAPPING_TAIL_RE.test(lineInfo.trimmed);\n}\n\nfunction hasIncompleteSequenceTail(normalized: string): boolean {\n const lineInfo = getLastMeaningfulLineInfo(normalized);\n if (!lineInfo) {\n return false;\n }\n return INCOMPLETE_SEQUENCE_TAIL_RE.test(lineInfo.trimmed);\n}\n\nfunction hasSplitNestedKeyTail(normalized: string): boolean {\n const lineInfo = getLastMeaningfulLineInfo(normalized);\n if (!lineInfo) {\n return false;\n }\n\n const { trimmed, indent, index } = lineInfo;\n if (indent === 0) {\n return false;\n }\n if (\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"-\") ||\n trimmed.includes(\":\")\n ) {\n return false;\n }\n\n const lines = normalized.split(\"\\n\");\n let parentIndex = index - 1;\n while (parentIndex >= 0) {\n const parentRaw = lines[parentIndex] ?? \"\";\n const parentTrimmed = parentRaw.trim();\n if (parentTrimmed.length === 0 || parentTrimmed.startsWith(\"#\")) {\n parentIndex -= 1;\n continue;\n }\n\n const parentIndent = parentRaw.length - parentRaw.trimStart().length;\n if (parentIndent >= indent) {\n parentIndex -= 1;\n continue;\n }\n\n if (!parentTrimmed.endsWith(\":\")) {\n return false;\n }\n if (BLOCK_SCALAR_KEY_RE.test(parentTrimmed)) {\n return false;\n }\n return true;\n }\n\n return false;\n}\n\nfunction extractTrailingPlainScalarValue(line: string): string | null {\n if (BLOCK_SCALAR_KEY_RE.test(line)) {\n return null;\n }\n\n const mappingMatch = line.match(PLAIN_MAPPING_VALUE_RE);\n const sequenceMatch = line.match(PLAIN_SEQUENCE_VALUE_RE);\n const value = mappingMatch?.[1] ?? sequenceMatch?.[1];\n if (!value) {\n return null;\n }\n\n const trimmedValue = value.trim();\n if (trimmedValue.length === 0) {\n return null;\n }\n if (trimmedValue.startsWith('\"') || trimmedValue.startsWith(\"'\")) {\n return null;\n }\n if (\n trimmedValue.startsWith(\"{\") ||\n trimmedValue.startsWith(\"[\") ||\n trimmedValue.startsWith(\"|\") ||\n trimmedValue.startsWith(\">\")\n ) {\n return null;\n }\n\n return trimmedValue;\n}\n\nfunction hasUnterminatedPlainScalarTail(normalized: string): boolean {\n if (normalized.endsWith(\"\\n\")) {\n return false;\n }\n\n const lineInfo = getLastMeaningfulLineInfo(normalized);\n if (!lineInfo) {\n return false;\n }\n\n return extractTrailingPlainScalarValue(lineInfo.trimmed) != null;\n}\n\nfunction hasUnstableProgressTail(normalized: string): boolean {\n return (\n hasIncompleteMappingTail(normalized) ||\n hasIncompleteSequenceTail(normalized) ||\n hasSplitNestedKeyTail(normalized) ||\n hasUnterminatedPlainScalarTail(normalized)\n );\n}\n\nfunction trimTrailingNewlineInUnknown(value: unknown): unknown {\n if (typeof value === \"string\") {\n if (value.endsWith(\"\\n\")) {\n return value.slice(0, -1);\n }\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => trimTrailingNewlineInUnknown(item));\n }\n\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, item]) => [\n key,\n trimTrailingNewlineInUnknown(item),\n ])\n );\n }\n\n return value;\n}\n\nfunction stabilizeParsedValueForStreamProgress<T>(value: T, source: string): T {\n if (source.endsWith(\"\\n\")) {\n return value;\n }\n\n return trimTrailingNewlineInUnknown(value) as T;\n}\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\n/**\n * Find all tool calls in the text for the given tool names.\n */\ninterface ToolCallMatch {\n content: string;\n endIndex: number;\n startIndex: number;\n toolName: string;\n}\n\nfunction collectToolCallsForName(\n text: string,\n toolName: string\n): ToolCallMatch[] {\n const toolCalls: ToolCallMatch[] = [];\n let searchIndex = 0;\n const startTag = `<${toolName}>`;\n\n while (searchIndex < text.length) {\n const match = findNextToolTag(text, searchIndex, toolName);\n if (match === null) {\n break;\n }\n\n const tagStart = match.tagStart;\n const isSelfClosing = match.isSelfClosing;\n\n if (isSelfClosing) {\n const endIndex = tagStart + match.tagLength;\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 const { normalized, nonEmptyLines } = normalizeYamlContent(yamlContent);\n if (nonEmptyLines.length === 0) {\n return {};\n }\n\n const parsed = parseYamlDocumentAsMapping(normalized);\n if (parsed.errors.length > 0) {\n options?.onError?.(\"YAML parse error\", {\n errors: parsed.errors,\n });\n return null;\n }\n\n if (parsed.value === null) {\n options?.onError?.(\"YAML content must be a key-value mapping\", {\n got: \"non-mapping\",\n });\n return null;\n }\n\n return parsed.value;\n}\n\nfunction parseYamlContentForStreamProgress(\n yamlContent: string\n): Record<string, unknown> | null {\n const { normalized, nonEmptyLines } = normalizeYamlContent(yamlContent);\n if (nonEmptyLines.length === 0) {\n return {};\n }\n\n let candidate = normalized;\n while (true) {\n const parsed = parseYamlDocumentAsMapping(candidate);\n if (parsed.errors.length === 0 && !hasUnstableProgressTail(candidate)) {\n if (candidate.trim().length === 0 && normalized.trim().length > 0) {\n return null;\n }\n return stabilizeParsedValueForStreamProgress(parsed.value, candidate);\n }\n\n const truncated = dropLastMeaningfulLine(candidate);\n if (truncated == null) {\n return null;\n }\n if (truncated === candidate) {\n return null;\n }\n candidate = truncated;\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: generateToolCallId(),\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 stripTrailingPartialCloseTag(\n content: string,\n toolName: string\n): string {\n const closeTag = `</${toolName}>`;\n const lastLineBreakIndex = Math.max(\n content.lastIndexOf(\"\\n\"),\n content.lastIndexOf(\"\\r\")\n );\n const lineStartIndex = lastLineBreakIndex === -1 ? 0 : lastLineBreakIndex + 1;\n const trailingLine = content.slice(lineStartIndex);\n const trimmedTrailingLine = trailingLine.trim();\n\n if (\n trimmedTrailingLine.length === 0 ||\n !trimmedTrailingLine.startsWith(\"</\") ||\n trimmedTrailingLine === closeTag ||\n !closeTag.startsWith(trimmedTrailingLine)\n ) {\n return content;\n }\n\n const leadingWhitespaceLength =\n trailingLine.length - trailingLine.trimStart().length;\n const preservedLeadingWhitespace = trailingLine.slice(\n 0,\n leadingWhitespaceLength\n );\n const contentWithoutPartial = `${content.slice(\n 0,\n lineStartIndex\n )}${preservedLeadingWhitespace}`;\n\n return contentWithoutPartial.trimEnd();\n}\n\nexport const yamlXmlProtocol = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- reserved for future extensibility\n _protocolOptions?: YamlXmlProtocolOptions\n): TCMCoreProtocol => {\n return {\n formatTools({ tools, toolSystemPromptTemplate }) {\n return formatToolsWithPromptTemplate({ tools, toolSystemPromptTemplate });\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 = extractToolNames(tools);\n if (toolNames.length === 0) {\n return [{ type: \"text\", text }];\n }\n\n const processedElements: LanguageModelV3Content[] = [];\n let currentIndex = 0;\n let parseText = text;\n\n let toolCalls = findToolCalls(parseText, toolNames);\n if (toolCalls.length === 0) {\n const repaired = tryRepairXmlSelfClosingRootWithBody(\n parseText,\n toolNames\n );\n if (repaired) {\n const repairedCalls = findToolCalls(repaired, toolNames);\n if (repairedCalls.length > 0) {\n parseText = repaired;\n toolCalls = repairedCalls;\n }\n }\n }\n\n for (const tc of toolCalls) {\n currentIndex = processToolCallMatch(\n parseText,\n tc,\n currentIndex,\n processedElements,\n options\n );\n }\n\n if (currentIndex < parseText.length) {\n addTextSegment(parseText.substring(currentIndex), processedElements);\n }\n\n return processedElements;\n },\n\n createStreamParser({ tools, options }) {\n const toolNames = extractToolNames(tools);\n\n let buffer = \"\";\n let currentToolCall: {\n name: string;\n toolCallId: string;\n emittedInput: string;\n } | 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 emitToolInputProgress = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolContent: string\n ) => {\n if (!currentToolCall) {\n return;\n }\n const parsedArgs = parseYamlContentForStreamProgress(toolContent);\n if (parsedArgs === null) {\n return;\n }\n const fullInput = stringifyToolInputWithSchema({\n toolName: currentToolCall.name,\n args: parsedArgs,\n tools,\n });\n if (fullInput === \"{}\" && toolContent.trim().length === 0) {\n return;\n }\n emitToolInputProgressDelta({\n controller,\n id: currentToolCall.toolCallId,\n state: currentToolCall,\n fullInput,\n });\n };\n\n const processToolCallEnd = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolContent: string,\n toolName: string,\n toolCallId: string\n ) => {\n const parsedArgs = parseYamlContent(toolContent, options);\n flushText(controller);\n if (parsedArgs !== null) {\n const finalInput = stringifyToolInputWithSchema({\n toolName,\n args: parsedArgs,\n tools,\n });\n if (currentToolCall && currentToolCall.toolCallId === toolCallId) {\n emitFinalizedToolInputLifecycle({\n controller,\n id: toolCallId,\n state: currentToolCall,\n toolName,\n finalInput,\n onMismatch: options?.onError,\n });\n } else {\n enqueueToolInputEndAndCall({\n controller,\n id: toolCallId,\n toolName,\n input: finalInput,\n });\n }\n } else {\n const original = `<${toolName}>${toolContent}</${toolName}>`;\n const emitRawFallback = shouldEmitRawToolCallTextOnError(options);\n emitFailedToolInputLifecycle({\n controller,\n id: toolCallId,\n emitRawToolCallTextOnError: emitRawFallback,\n rawToolCallText: original,\n emitRawText: (rawText) => {\n flushText(controller, rawText);\n },\n });\n options?.onError?.(\"Could not parse streaming YAML tool call\", {\n toolCall: original,\n });\n }\n };\n\n const finalizeUnclosedToolCall = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>\n ) => {\n if (!currentToolCall) {\n return;\n }\n\n emitToolInputProgress(controller, buffer);\n const { name: toolName, toolCallId } = currentToolCall;\n const reconciledBuffer = stripTrailingPartialCloseTag(buffer, toolName);\n const parsedArgs = parseYamlContent(reconciledBuffer, options);\n flushText(controller);\n if (parsedArgs !== null) {\n const finalInput = stringifyToolInputWithSchema({\n toolName,\n args: parsedArgs,\n tools,\n });\n emitFinalizedToolInputLifecycle({\n controller,\n id: toolCallId,\n state: currentToolCall,\n toolName,\n finalInput,\n onMismatch: options?.onError,\n });\n } else {\n const unfinishedContent = `<${toolName}>${buffer}`;\n const emitRawFallback = shouldEmitRawToolCallTextOnError(options);\n emitFailedToolInputLifecycle({\n controller,\n id: toolCallId,\n emitRawToolCallTextOnError: emitRawFallback,\n rawToolCallText: unfinishedContent,\n emitRawText: (rawText) => {\n flushText(controller, rawText);\n },\n });\n options?.onError?.(\n \"Could not complete streaming YAML tool call at finish.\",\n { toolCall: unfinishedContent }\n );\n }\n\n buffer = \"\";\n currentToolCall = null;\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 emitToolInputProgress(controller, buffer);\n return false;\n }\n\n const content = buffer.substring(0, endIdx);\n emitToolInputProgress(controller, content);\n buffer = buffer.substring(endIdx + endTag.length);\n processToolCallEnd(\n controller,\n content,\n toolName,\n currentToolCall?.toolCallId ?? generateToolCallId()\n );\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 flushText(controller);\n\n if (selfClosing) {\n buffer = buffer.substring(tagIndex + tagLength);\n const toolCallId = generateToolCallId();\n currentToolCall = {\n name: tagName,\n toolCallId,\n emittedInput: \"\",\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallId,\n toolName: tagName,\n });\n processToolCallEnd(controller, \"\", tagName, toolCallId);\n currentToolCall = null;\n } else {\n const startTag = `<${tagName}>`;\n buffer = buffer.substring(tagIndex + startTag.length);\n currentToolCall = {\n name: tagName,\n toolCallId: generateToolCallId(),\n emittedInput: \"\",\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: currentToolCall.toolCallId,\n toolName: tagName,\n });\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 === \"finish\") {\n if (currentToolCall) {\n finalizeUnclosedToolCall(controller);\n } else if (buffer) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n flushText(controller);\n controller.enqueue(chunk);\n return;\n }\n\n if (chunk.type !== \"text-delta\") {\n if (!currentToolCall && 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 finalizeUnclosedToolCall(controller);\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 SharedV3ProviderOptions,\n} from \"@ai-sdk/provider\";\nimport type { OnErrorFn } from \"./on-error\";\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\ninterface EncodedOriginalTool {\n inputSchema: string; // stringified JSONSchema7\n name: string;\n}\n\ninterface DecodeOriginalToolsOptions {\n onError?: OnErrorFn;\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: EncodedOriginalTool[] | undefined,\n options?: DecodeOriginalToolsOptions\n): LanguageModelV3FunctionTool[] {\n if (!originalTools) {\n return [];\n }\n\n const decodedTools: LanguageModelV3FunctionTool[] = [];\n\n for (const [index, tool] of originalTools.entries()) {\n if (!tool || typeof tool.name !== \"string\") {\n options?.onError?.(\"Invalid originalTools entry: missing tool name\", {\n index,\n tool,\n });\n continue;\n }\n\n if (typeof tool.inputSchema !== \"string\") {\n options?.onError?.(\n \"Invalid originalTools entry: inputSchema must be a string\",\n {\n index,\n toolName: tool.name,\n }\n );\n continue;\n }\n\n try {\n decodedTools.push({\n type: \"function\",\n name: tool.name,\n inputSchema: JSON.parse(tool.inputSchema) as JSONSchema7,\n });\n } catch (error) {\n options?.onError?.(\n \"Failed to decode originalTools input schema, using permissive fallback schema\",\n {\n index,\n toolName: tool.name,\n inputSchema: tool.inputSchema,\n error: error instanceof Error ? error.message : String(error),\n }\n );\n decodedTools.push({\n type: \"function\",\n name: tool.name,\n inputSchema: { type: \"object\" },\n });\n }\n }\n\n return decodedTools;\n}\n\nexport function decodeOriginalToolsFromProviderOptions(\n providerOptions: ToolCallMiddlewareProviderOptions | undefined,\n options?: DecodeOriginalToolsOptions\n): LanguageModelV3FunctionTool[] {\n return decodeOriginalTools(\n providerOptions?.toolCallMiddleware?.originalTools,\n options\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\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function getToolCallMiddlewareOptions(\n providerOptions?: unknown\n): Record<string, unknown> {\n if (!isRecord(providerOptions)) {\n return {};\n }\n\n const toolCallMiddleware = providerOptions.toolCallMiddleware;\n if (!isRecord(toolCallMiddleware)) {\n return {};\n }\n\n return toolCallMiddleware;\n}\n\nexport function mergeToolCallMiddlewareOptions(\n providerOptions: unknown,\n overrides: Record<string, unknown>\n): SharedV3ProviderOptions {\n return {\n ...(isRecord(providerOptions) ? providerOptions : {}),\n toolCallMiddleware: {\n ...getToolCallMiddlewareOptions(providerOptions),\n ...overrides,\n },\n } as SharedV3ProviderOptions;\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 LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n} from \"@ai-sdk/provider\";\nimport { parse as parseRJSON } from \"../../rjson\";\nimport { getSchemaType, unwrapJsonSchema } from \"../../schema-coerce\";\nimport { generateToolCallId } from \"./id\";\n\ninterface ToolCallCandidate {\n input: string;\n toolName: string;\n}\n\ninterface JsonCandidate {\n endIndex: number;\n startIndex: number;\n text: string;\n}\n\ninterface JsonScanState {\n depth: number;\n escaping: boolean;\n inString: boolean;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value ?? {});\n } catch {\n return \"{}\";\n }\n}\n\nfunction parseJsonCandidate(candidateText: string): unknown {\n try {\n return parseRJSON(candidateText);\n } catch {\n return undefined;\n }\n}\n\nfunction extractCodeBlockCandidates(text: string): JsonCandidate[] {\n const codeBlockRegex = /```(?:json|yaml|xml)?\\s*([\\s\\S]*?)```/gi;\n const candidates: JsonCandidate[] = [];\n let match: RegExpExecArray | null;\n while (true) {\n match = codeBlockRegex.exec(text);\n if (!match) {\n break;\n }\n const body = match[1]?.trim();\n if (body) {\n const startIndex = match.index ?? 0;\n const endIndex = startIndex + match[0].length;\n candidates.push({\n text: body,\n startIndex,\n endIndex,\n });\n }\n }\n return candidates;\n}\n\nfunction scanJsonChar(state: JsonScanState, char: string): JsonScanState {\n if (state.inString) {\n if (state.escaping) {\n return { ...state, escaping: false };\n }\n if (char === \"\\\\\") {\n return { ...state, escaping: true };\n }\n if (char === '\"') {\n return { ...state, inString: false };\n }\n return state;\n }\n\n if (char === '\"') {\n return { ...state, inString: true };\n }\n if (char === \"{\") {\n return { ...state, depth: state.depth + 1 };\n }\n if (char === \"}\") {\n return { ...state, depth: Math.max(0, state.depth - 1) };\n }\n return state;\n}\n\nfunction extractBalancedJsonObjects(text: string): JsonCandidate[] {\n const maxCandidateLength = 10_000;\n const candidates: JsonCandidate[] = [];\n let state: JsonScanState = { depth: 0, inString: false, escaping: false };\n let currentStart: number | null = null;\n let ignoreCurrent = false;\n\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n\n if (!state.inString && char === \"{\" && state.depth === 0) {\n currentStart = index;\n ignoreCurrent = false;\n }\n\n state = scanJsonChar(state, char);\n\n if (\n currentStart !== null &&\n !ignoreCurrent &&\n index - currentStart + 1 > maxCandidateLength\n ) {\n ignoreCurrent = true;\n }\n\n if (!state.inString && char === \"}\" && state.depth === 0) {\n if (currentStart !== null && !ignoreCurrent) {\n const endIndex = index + 1;\n const candidate = text.slice(currentStart, endIndex);\n if (candidate.length > 1) {\n candidates.push({\n text: candidate,\n startIndex: currentStart,\n endIndex,\n });\n }\n }\n currentStart = null;\n ignoreCurrent = false;\n }\n }\n\n return candidates;\n}\n\nfunction extractTaggedToolCallCandidates(rawText: string): JsonCandidate[] {\n const toolCallRegex = /<tool_call>([\\s\\S]*?)<\\/tool_call>/gi;\n const candidates: JsonCandidate[] = [];\n let match: RegExpExecArray | null;\n while (true) {\n match = toolCallRegex.exec(rawText);\n if (!match) {\n break;\n }\n const body = match[1]?.trim();\n if (!body) {\n continue;\n }\n const startIndex = match.index ?? 0;\n const endIndex = startIndex + match[0].length;\n candidates.push({\n text: body,\n startIndex,\n endIndex,\n });\n }\n return candidates;\n}\n\nfunction extractJsonLikeCandidates(rawText: string): JsonCandidate[] {\n return mergeJsonCandidatesByStart(\n extractTaggedToolCallCandidates(rawText),\n extractCodeBlockCandidates(rawText),\n extractBalancedJsonObjects(rawText)\n );\n}\n\nfunction mergeJsonCandidatesByStart(\n tagged: JsonCandidate[],\n codeBlocks: JsonCandidate[],\n balanced: JsonCandidate[]\n): JsonCandidate[] {\n return [...tagged, ...codeBlocks, ...balanced].sort((a, b) =>\n a.startIndex !== b.startIndex\n ? a.startIndex - b.startIndex\n : b.endIndex - a.endIndex\n );\n}\n\nfunction toToolCallPart(candidate: ToolCallCandidate): LanguageModelV3Content {\n return {\n type: \"tool-call\",\n toolCallId: generateToolCallId(),\n toolName: candidate.toolName,\n input: candidate.input,\n };\n}\n\nfunction toRecoveredParts(\n text: string,\n candidate: JsonCandidate,\n toolCallPart: LanguageModelV3Content\n): LanguageModelV3Content[] {\n const out: LanguageModelV3Content[] = [];\n const prefix = text.slice(0, candidate.startIndex);\n if (prefix.length > 0) {\n out.push({ type: \"text\", text: prefix });\n }\n\n out.push(toolCallPart);\n\n const suffix = text.slice(candidate.endIndex);\n if (suffix.length > 0) {\n out.push({ type: \"text\", text: suffix });\n }\n return out;\n}\n\nfunction parseAsToolPayload(\n payload: unknown,\n tools: LanguageModelV3FunctionTool[]\n): ToolCallCandidate | null {\n if (!isRecord(payload)) {\n return null;\n }\n\n const toolName =\n typeof payload.name === \"string\" && payload.name.trim().length > 0\n ? payload.name.trim()\n : null;\n if (!toolName) {\n return null;\n }\n\n if (!tools.some((tool) => tool.name === toolName)) {\n return null;\n }\n\n const rawArgs = Object.hasOwn(payload, \"arguments\") ? payload.arguments : {};\n if (!isRecord(rawArgs)) {\n return null;\n }\n\n return {\n toolName,\n input: safeStringify(rawArgs),\n };\n}\n\nfunction isLikelyArgumentsShapeForTool(\n args: Record<string, unknown>,\n tool: LanguageModelV3FunctionTool\n): boolean {\n const unwrapped = unwrapJsonSchema(tool.inputSchema);\n if (!isRecord(unwrapped)) {\n return false;\n }\n if (getSchemaType(unwrapped) !== \"object\") {\n return false;\n }\n\n const properties = unwrapped.properties;\n if (!isRecord(properties)) {\n return false;\n }\n\n const keys = Object.keys(args);\n if (keys.length === 0) {\n return false;\n }\n\n const knownKeys = keys.filter((key) => Object.hasOwn(properties, key));\n if (knownKeys.length === 0) {\n return false;\n }\n\n if (\n unwrapped.additionalProperties === false &&\n knownKeys.length !== keys.length\n ) {\n return false;\n }\n\n return true;\n}\n\nfunction parseAsArgumentsOnly(\n payload: unknown,\n tools: LanguageModelV3FunctionTool[]\n): ToolCallCandidate | null {\n if (tools.length !== 1) {\n return null;\n }\n if (!isRecord(payload)) {\n return null;\n }\n const hasNameEnvelope =\n Object.hasOwn(payload, \"name\") &&\n typeof payload.name === \"string\" &&\n payload.name.length > 0;\n const hasArgumentsEnvelope =\n Object.hasOwn(payload, \"arguments\") &&\n (typeof payload.arguments === \"string\" || isRecord(payload.arguments));\n if (hasNameEnvelope || hasArgumentsEnvelope) {\n return null;\n }\n\n const tool = tools[0];\n if (!isLikelyArgumentsShapeForTool(payload, tool)) {\n return null;\n }\n\n return {\n toolName: tool.name,\n input: safeStringify(payload),\n };\n}\n\nexport function recoverToolCallFromJsonCandidates(\n text: string,\n tools: LanguageModelV3FunctionTool[]\n): LanguageModelV3Content[] | null {\n if (tools.length === 0) {\n return null;\n }\n\n const jsonCandidates = extractJsonLikeCandidates(text);\n for (const jsonCandidate of jsonCandidates) {\n const parsed = parseJsonCandidate(jsonCandidate.text);\n if (parsed === undefined) {\n continue;\n }\n\n const toolPayload = parseAsToolPayload(parsed, tools);\n if (toolPayload) {\n return toRecoveredParts(text, jsonCandidate, toToolCallPart(toolPayload));\n }\n\n const argsPayload = parseAsArgumentsOnly(parsed, tools);\n if (argsPayload) {\n return toRecoveredParts(text, jsonCandidate, toToolCallPart(argsPayload));\n }\n }\n\n return null;\n}\n","import type { LanguageModelV3FunctionTool } from \"@ai-sdk/provider\";\nimport type { OnErrorFn } from \"./on-error\";\nimport { coerceToolCallInput } from \"./tool-call-coercion\";\n\ninterface ParseToolChoiceOptions {\n errorMessage: string;\n onError?: OnErrorFn;\n text: string;\n tools: LanguageModelV3FunctionTool[];\n}\n\ninterface ResolveToolChoiceSelectionOptions {\n errorMessage: string;\n onError?: OnErrorFn;\n text?: string;\n tools: LanguageModelV3FunctionTool[];\n}\n\nfunction ensureNonEmptyToolName(name: unknown): string {\n if (typeof name !== \"string\") {\n return \"unknown\";\n }\n const trimmed = name.trim();\n return trimmed.length > 0 ? trimmed : \"unknown\";\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value ?? {});\n } catch {\n return \"{}\";\n }\n}\n\nexport function parseToolChoicePayload({\n text,\n tools,\n onError,\n errorMessage,\n}: ParseToolChoiceOptions): { toolName: string; input: string } {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch (error) {\n onError?.(errorMessage, {\n text,\n error: error instanceof Error ? error.message : String(error),\n });\n return { toolName: \"unknown\", input: \"{}\" };\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n onError?.(\"toolChoice JSON payload must be an object\", {\n parsedType: typeof parsed,\n parsed,\n });\n return { toolName: \"unknown\", input: \"{}\" };\n }\n\n const payload = parsed as Record<string, unknown>;\n const toolName = ensureNonEmptyToolName(payload.name);\n const rawArgs = Object.hasOwn(payload, \"arguments\") ? payload.arguments : {};\n\n if (\n rawArgs == null ||\n typeof rawArgs !== \"object\" ||\n Array.isArray(rawArgs)\n ) {\n onError?.(\"toolChoice arguments must be a JSON object\", {\n toolName,\n arguments: rawArgs,\n });\n return { toolName, input: \"{}\" };\n }\n\n const coercedInput = coerceToolCallInput(toolName, rawArgs, tools);\n\n return {\n toolName,\n input: coercedInput ?? safeStringify(rawArgs),\n };\n}\n\nexport function resolveToolChoiceSelection({\n text,\n tools,\n onError,\n errorMessage,\n}: ResolveToolChoiceSelectionOptions): {\n input: string;\n originText: string;\n toolName: string;\n} {\n if (typeof text !== \"string\") {\n return {\n toolName: \"unknown\",\n input: \"{}\",\n originText: \"\",\n };\n }\n\n const parsed = parseToolChoicePayload({\n text,\n tools,\n onError,\n errorMessage,\n });\n\n return {\n ...parsed,\n originText: text,\n };\n}\n","import type {\n LanguageModelV3,\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport type { TCMCoreProtocol } from \"./core/protocols/protocol-interface\";\nimport {\n getDebugLevel,\n logParsedChunk,\n logParsedSummary,\n logRawChunk,\n} from \"./core/utils/debug\";\nimport { recoverToolCallFromJsonCandidates } from \"./core/utils/generated-text-json-recovery\";\nimport { generateToolCallId } from \"./core/utils/id\";\nimport { extractOnErrorOption } from \"./core/utils/on-error\";\nimport {\n decodeOriginalToolsFromProviderOptions,\n getToolCallMiddlewareOptions,\n isToolChoiceActive,\n type ToolCallMiddlewareProviderOptions,\n} from \"./core/utils/provider-options\";\nimport { coerceToolCallPart } from \"./core/utils/tool-call-coercion\";\nimport { resolveToolChoiceSelection } from \"./core/utils/tool-choice\";\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 tools: LanguageModelV3FunctionTool[]\n) {\n const result = await doGenerate();\n const first = result.content?.[0];\n const firstText = first?.type === \"text\" ? first.text : undefined;\n const onError = extractOnErrorOption(params.providerOptions)?.onError;\n\n if (typeof firstText === \"string\" && getDebugLevel() === \"parse\") {\n logRawChunk(firstText);\n }\n\n const { toolName, input, originText } = resolveToolChoiceSelection({\n text: firstText,\n tools,\n onError,\n errorMessage: \"Failed to parse toolChoice JSON from generated model output\",\n });\n\n const toolCall: LanguageModelV3ToolCall = {\n type: \"tool-call\",\n toolCallId: generateToolCallId(),\n toolName,\n input,\n };\n\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 const parsedByProtocol = protocol.parseGeneratedText({\n text: contentItem.text,\n tools,\n options: {\n ...extractOnErrorOption(providerOptions),\n ...getToolCallMiddlewareOptions(providerOptions),\n },\n });\n\n const hasToolCall = parsedByProtocol.some(\n (part): part is Extract<LanguageModelV3Content, { type: \"tool-call\" }> =>\n part.type === \"tool-call\"\n );\n if (hasToolCall) {\n return parsedByProtocol;\n }\n\n const recoveredFromJson = recoverToolCallFromJsonCandidates(\n contentItem.text,\n tools\n );\n return recoveredFromJson ?? parsedByProtocol;\n });\n\n return parsed.map((part) =>\n part.type === \"tool-call\" ? coerceToolCallPart(part, tools) : part\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 const onError = extractOnErrorOption(params.providerOptions);\n const tools = decodeOriginalToolsFromProviderOptions(\n params.providerOptions,\n onError\n );\n\n if (isToolChoiceActive(params)) {\n return handleToolChoice(doGenerate, params, tools);\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","import type { LanguageModelV3TextPart } from \"@ai-sdk/provider\";\n\nexport function toTextPart(\n text: string,\n providerOptions?: LanguageModelV3TextPart[\"providerOptions\"]\n): LanguageModelV3TextPart {\n if (providerOptions === undefined) {\n return {\n type: \"text\",\n text,\n };\n }\n\n return {\n type: \"text\",\n text,\n providerOptions,\n };\n}\n","import type {\n JSONValue,\n LanguageModelV3FilePart,\n LanguageModelV3TextPart,\n} from \"@ai-sdk/provider\";\nimport type { ToolResultOutput } from \"@ai-sdk/provider-utils\";\nimport { toTextPart } from \"./text-part\";\n\ntype ToolResponseMediaType = \"image\" | \"audio\" | \"video\" | \"file\";\n\nexport interface ToolResponseMediaCapabilities {\n audio?: boolean;\n file?: boolean;\n image?: boolean;\n video?: boolean;\n}\n\nexport type ToolResponseMediaMode = \"placeholder\" | \"raw\" | \"auto\" | \"model\";\n\nexport interface ToolResponseMediaStrategy {\n capabilities?: ToolResponseMediaCapabilities;\n mode?: ToolResponseMediaMode;\n}\n\nexport type ToolResponseUserContentPart =\n | LanguageModelV3TextPart\n | LanguageModelV3FilePart;\n\nfunction isMapping(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getMediaKindFromMediaType(mediaType: string): ToolResponseMediaType {\n if (mediaType.startsWith(\"image/\")) {\n return \"image\";\n }\n if (mediaType.startsWith(\"audio/\")) {\n return \"audio\";\n }\n if (mediaType.startsWith(\"video/\")) {\n return \"video\";\n }\n return \"file\";\n}\n\nfunction getContentPartMediaKind(part: unknown): ToolResponseMediaType | null {\n const contentPart = isMapping(part) ? part : undefined;\n const type = contentPart?.type;\n\n switch (type) {\n case \"image-data\":\n case \"image-url\":\n case \"image-file-id\":\n return \"image\";\n case \"file-data\":\n case \"file-url\":\n case \"file-id\": {\n const mediaType = contentPart?.mediaType;\n if (typeof mediaType === \"string\") {\n return getMediaKindFromMediaType(mediaType);\n }\n return \"file\";\n }\n case \"media\": {\n const mediaType = contentPart?.mediaType;\n if (typeof mediaType === \"string\") {\n return getMediaKindFromMediaType(mediaType);\n }\n return \"file\";\n }\n default:\n return null;\n }\n}\n\nfunction shouldPassRawByStrategy(\n mediaKind: ToolResponseMediaType,\n strategy?: ToolResponseMediaStrategy\n): boolean {\n const mode = getMediaMode(strategy);\n if (mode === \"raw\") {\n return true;\n }\n if (mode === \"placeholder\") {\n return false;\n }\n if (mode === \"model\") {\n return false;\n }\n\n return strategy?.capabilities?.[mediaKind] === true;\n}\n\nfunction getMediaMode(\n strategy?: ToolResponseMediaStrategy\n): ToolResponseMediaMode {\n return strategy?.mode ?? \"placeholder\";\n}\n\nfunction shouldPassRawContent(\n contentParts: unknown[],\n strategy?: ToolResponseMediaStrategy\n): boolean {\n const mode = getMediaMode(strategy);\n if (mode === \"raw\") {\n return true;\n }\n if (mode === \"placeholder\") {\n return false;\n }\n if (mode === \"model\") {\n return false;\n }\n\n let hasSupportedMediaContent = false;\n\n for (const part of contentParts) {\n const mediaKind = getContentPartMediaKind(part);\n if (!mediaKind) {\n continue;\n }\n hasSupportedMediaContent = true;\n if (!shouldPassRawByStrategy(mediaKind, strategy)) {\n return false;\n }\n }\n\n return hasSupportedMediaContent;\n}\n\nfunction formatIdPlaceholder(\n label: \"Image ID\" | \"File ID\",\n fileId: unknown\n): string {\n const displayId =\n typeof fileId === \"string\" ? fileId : JSON.stringify(fileId);\n return `[${label}: ${displayId}]`;\n}\n\nfunction formatContentPartPlaceholder(part: unknown): string {\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: ${(contentPart as { mediaType?: string }).mediaType}]`;\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 return formatIdPlaceholder(\"Image ID\", fileId);\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 return formatIdPlaceholder(\"File ID\", fileId);\n }\n case \"media\":\n return `[Media: ${(contentPart as { mediaType?: string }).mediaType}]`;\n case \"custom\":\n return \"[Custom content]\";\n default:\n return \"[Unknown content]\";\n }\n}\n\nfunction toFilePart(options: {\n data: string;\n mediaType: string;\n filename?: string;\n providerOptions?: LanguageModelV3FilePart[\"providerOptions\"];\n}): LanguageModelV3FilePart {\n return {\n type: \"file\",\n data: options.data,\n mediaType: options.mediaType,\n ...(options.filename !== undefined ? { filename: options.filename } : {}),\n ...(options.providerOptions !== undefined\n ? { providerOptions: options.providerOptions }\n : {}),\n };\n}\n\nfunction toModelContentPart(part: unknown): ToolResponseUserContentPart {\n const contentPart = part as {\n type?: string;\n text?: string;\n data?: string;\n mediaType?: string;\n url?: string;\n filename?: string;\n providerOptions?: LanguageModelV3TextPart[\"providerOptions\"];\n };\n\n switch (contentPart.type) {\n case \"text\":\n return toTextPart(contentPart.text ?? \"\", contentPart.providerOptions);\n case \"image-data\":\n return toFilePart({\n data: contentPart.data ?? \"\",\n mediaType: contentPart.mediaType ?? \"image/*\",\n providerOptions: contentPart.providerOptions,\n });\n case \"image-url\":\n return toFilePart({\n data: contentPart.url ?? \"\",\n mediaType: \"image/*\",\n providerOptions: contentPart.providerOptions,\n });\n case \"file-data\":\n return toFilePart({\n data: contentPart.data ?? \"\",\n mediaType: contentPart.mediaType ?? \"application/octet-stream\",\n filename: contentPart.filename,\n providerOptions: contentPart.providerOptions,\n });\n case \"file-url\":\n return toFilePart({\n data: contentPart.url ?? \"\",\n mediaType: \"application/octet-stream\",\n providerOptions: contentPart.providerOptions,\n });\n case \"media\":\n return toFilePart({\n data: contentPart.data ?? \"\",\n mediaType: contentPart.mediaType ?? \"application/octet-stream\",\n providerOptions: contentPart.providerOptions,\n });\n case \"image-file-id\":\n case \"file-id\":\n case \"custom\":\n return toTextPart(\n formatContentPartPlaceholder(part),\n contentPart.providerOptions\n );\n default:\n return toTextPart(\n formatContentPartPlaceholder(part),\n contentPart.providerOptions\n );\n }\n}\n\nfunction stringifyJsonValue(value: JSONValue): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n return JSON.stringify(value);\n}\n\nexport function unwrapToolResult(\n result: ToolResultOutput,\n mediaStrategy?: ToolResponseMediaStrategy\n): 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 const parts = result.value as unknown[];\n if (shouldPassRawContent(parts, mediaStrategy)) {\n return parts as JSONValue;\n }\n\n return parts.map(formatContentPartPlaceholder).join(\"\\n\");\n }\n default: {\n const _exhaustive: never = result;\n return _exhaustive;\n }\n }\n}\n\nexport function normalizeToolResultForUserContent(\n result: ToolResultOutput,\n mediaStrategy?: ToolResponseMediaStrategy\n): ToolResponseUserContentPart[] {\n if (result.type === \"content\" && mediaStrategy?.mode === \"model\") {\n return (result.value as unknown[]).map(toModelContentPart);\n }\n\n const unwrapped = unwrapToolResult(result, mediaStrategy);\n const providerOptions = (\n result as {\n providerOptions?: LanguageModelV3TextPart[\"providerOptions\"];\n }\n ).providerOptions;\n\n return [toTextPart(stringifyJsonValue(unwrapped), providerOptions)];\n}\n","import type { LanguageModelV3FunctionTool } from \"@ai-sdk/provider\";\nimport type { ToolResultPart } from \"@ai-sdk/provider-utils\";\nimport {\n type ToolResponseMediaStrategy,\n unwrapToolResult,\n} from \"./shared/tool-result-normalizer\";\n\ninterface HermesToolResponseFormatterOptions {\n mediaStrategy?: ToolResponseMediaStrategy;\n}\n\nfunction formatToolResponseAsHermesWithOptions(\n toolResult: ToolResultPart,\n options?: HermesToolResponseFormatterOptions\n): string {\n const unwrappedResult = unwrapToolResult(\n toolResult.output,\n options?.mediaStrategy\n );\n return `<tool_response>${JSON.stringify({\n name: toolResult.toolName,\n content: unwrappedResult,\n })}</tool_response>`;\n}\n\nexport function createHermesToolResponseFormatter(\n options?: HermesToolResponseFormatterOptions\n): (toolResult: ToolResultPart) => string {\n return (toolResult) =>\n formatToolResponseAsHermesWithOptions(toolResult, options);\n}\n\nexport function formatToolResponseAsHermes(toolResult: ToolResultPart): string {\n return formatToolResponseAsHermesWithOptions(toolResult);\n}\n\n// Maps JSON Schema type to Python type string (matches vLLM json_to_python_type macro)\nexport function jsonSchemaToPythonType(\n schema: Record<string, unknown>\n): string {\n const type = schema.type;\n\n if (type === \"string\") {\n return \"str\";\n }\n if (type === \"number\") {\n return \"float\";\n }\n if (type === \"integer\") {\n return \"int\";\n }\n if (type === \"boolean\") {\n return \"bool\";\n }\n\n if (type === \"array\") {\n const items = schema.items as Record<string, unknown> | undefined;\n if (items) {\n return `list[${jsonSchemaToPythonType(items)}]`;\n }\n return \"list[Any]\";\n }\n\n if (type === \"object\") {\n const additionalProperties = schema.additionalProperties as\n | Record<string, unknown>\n | undefined;\n if (additionalProperties) {\n return `dict[str, ${jsonSchemaToPythonType(additionalProperties)}]`;\n }\n return \"dict\";\n }\n\n if (Array.isArray(type)) {\n return `Union[${type.map((t: string) => jsonSchemaToPythonType({ type: t })).join(\",\")}]`;\n }\n\n return \"Any\";\n}\n\nexport function renderToolDefinition(\n tool: LanguageModelV3FunctionTool\n): string {\n const schema = tool.inputSchema as Record<string, unknown>;\n const properties = schema.properties as\n | Record<string, Record<string, unknown>>\n | undefined;\n\n const paramSignature = properties\n ? Object.entries(properties)\n .map(([name, field]) => `${name}: ${jsonSchemaToPythonType(field)}`)\n .join(\", \")\n : \"\";\n\n const desc = tool.description ?? \"\";\n let description = `${tool.name}(${paramSignature}) - ${desc}\\n\\n`;\n\n if (properties && Object.keys(properties).length > 0) {\n description += \" Args:\\n\";\n for (const [paramName, paramFields] of Object.entries(properties)) {\n const paramDesc = (paramFields.description as string | undefined) ?? \"\";\n description += ` ${paramName}(${jsonSchemaToPythonType(paramFields)}): ${paramDesc.trim()}\\n`;\n }\n }\n\n const parametersJson = JSON.stringify(schema);\n const descJson = JSON.stringify(description);\n const nameJson = JSON.stringify(tool.name);\n\n return `{\"type\": \"function\", \"function\": {\"name\": ${nameJson}, \"description\": ${descJson}, \"parameters\": ${parametersJson}}}`;\n}\n\nexport function hermesSystemPromptTemplate(\n tools: LanguageModelV3FunctionTool[]\n): string {\n const toolsRendered = tools.map(renderToolDefinition).join(\"\\n\");\n return `You are a function calling AI model. You are provided with function signatures within <tools></tools> XML tags. You may call one or more functions to assist with the user query. Don't make assumptions about what values to plug into functions. Here are the available tools: <tools> ${toolsRendered} </tools>\nUse the following pydantic model json schema for each tool call you will make: {\"properties\": {\"name\": {\"title\": \"Name\", \"type\": \"string\"}, \"arguments\": {\"title\": \"Arguments\", \"type\": \"object\"}}, \"required\": [\"name\", \"arguments\"], \"title\": \"FunctionCall\", \"type\": \"object\"}\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 {\n JSONSchema7,\n JSONValue,\n LanguageModelV3FunctionTool,\n} from \"@ai-sdk/provider\";\nimport type { ToolResultPart } from \"@ai-sdk/provider-utils\";\nimport dedent from \"dedent\";\nimport {\n type ToolResponseMediaStrategy,\n unwrapToolResult,\n} from \"./shared/tool-result-normalizer\";\n\nexport function morphXmlSystemPromptTemplate(\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\ninterface MorphXmlToolResponseFormatterOptions {\n mediaStrategy?: ToolResponseMediaStrategy;\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\nfunction morphFormatToolResponseAsXmlWithOptions(\n toolResult: ToolResultPart,\n options?: MorphXmlToolResponseFormatterOptions\n): string {\n const unwrappedResult = unwrapToolResult(\n toolResult.output,\n options?.mediaStrategy\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\nexport function createMorphXmlToolResponseFormatter(\n options?: MorphXmlToolResponseFormatterOptions\n): (toolResult: ToolResultPart) => string {\n return (toolResult) =>\n morphFormatToolResponseAsXmlWithOptions(toolResult, options);\n}\n\nexport function morphFormatToolResponseAsXml(\n toolResult: ToolResultPart\n): string {\n return morphFormatToolResponseAsXmlWithOptions(toolResult);\n}\n","import type { JSONValue, LanguageModelV3FunctionTool } from \"@ai-sdk/provider\";\nimport type { ToolResultPart } from \"@ai-sdk/provider-utils\";\nimport {\n escapeXmlMinimalAttr,\n escapeXmlMinimalText,\n} from \"../../rxml/utils/helpers\";\nimport {\n type ToolResponseMediaStrategy,\n unwrapToolResult,\n} from \"./shared/tool-result-normalizer\";\n\nconst QWEN3CODER_TOOL_HEADER =\n \"# Tools\\n\\nYou have access to the following functions:\\n\\n\";\n\nconst QWEN3CODER_TOOL_CALL_INSTRUCTIONS =\n \"\\n\\nIf you choose to call a function ONLY reply in the following format with NO suffix:\\n\\n<tool_call>\\n<function=example_function_name>\\n<parameter=example_parameter_1>\\nvalue_1\\n</parameter>\\n<parameter=example_parameter_2>\\nThis is the value for the second parameter\\nthat can span\\nmultiple lines\\n</parameter>\\n</function>\\n</tool_call>\\n\\n<IMPORTANT>\\nReminder:\\n- Function calls MUST follow the specified format: an inner <function=...></function> block must be nested within <tool_call></tool_call> XML tags\\n- Required parameters MUST be specified\\n- You may provide optional reasoning for your function call in natural language BEFORE the function call, but NOT after\\n- If there is no function call available, answer the question like normal with your current knowledge and do not tell the user about function calls\\n</IMPORTANT>\";\n\ntype Mapping = Record<string, unknown>;\n\ninterface Qwen3CoderToolShape extends Mapping {\n description?: unknown;\n name?: unknown;\n parameters?: unknown;\n}\n\nconst XML_PROMPT_TAG_NAME_RE = /^[A-Za-z_][A-Za-z0-9_.-]*$/;\n\nfunction isMapping(value: unknown): value is Mapping {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isSequence(value: unknown): value is unknown[] {\n return Array.isArray(value);\n}\n\nfunction toJinjaString(value: unknown): string {\n if (value === undefined) {\n return \"\";\n }\n if (value === null) {\n return \"None\";\n }\n if (typeof value === \"boolean\") {\n return value ? \"True\" : \"False\";\n }\n return String(value);\n}\n\nfunction toJinjaTrimmedString(value: unknown): string {\n return toJinjaString(value).trim();\n}\n\nfunction toEscapedXmlText(value: unknown): string {\n return escapeXmlMinimalText(toJinjaString(value));\n}\n\nfunction toEscapedTrimmedXmlText(value: unknown): string {\n return escapeXmlMinimalText(toJinjaTrimmedString(value));\n}\n\nfunction renderXmlPromptField(key: string, escapedValue: string): string {\n if (XML_PROMPT_TAG_NAME_RE.test(key)) {\n return `\\n<${key}>${escapedValue}</${key}>`;\n }\n\n return `\\n<property name=\"${escapeXmlMinimalAttr(\n key,\n '\"'\n )}\">${escapedValue}</property>`;\n}\n\nfunction renderExtraKeys(\n jsonDict: unknown,\n handledKeys: readonly string[]\n): string {\n if (!isMapping(jsonDict)) {\n return \"\";\n }\n\n const handled = new Set(handledKeys);\n let out = \"\";\n\n for (const [jsonKey, jsonValue] of Object.entries(jsonDict)) {\n if (handled.has(jsonKey)) {\n continue;\n }\n\n const renderedValue =\n isMapping(jsonValue) || isSequence(jsonValue)\n ? JSON.stringify(jsonValue)\n : toJinjaString(jsonValue);\n out += renderXmlPromptField(jsonKey, escapeXmlMinimalText(renderedValue));\n }\n\n return out;\n}\n\nfunction normalizeInputSchema(inputSchema: unknown): unknown {\n if (typeof inputSchema !== \"string\") {\n return inputSchema;\n }\n\n try {\n return JSON.parse(inputSchema) as unknown;\n } catch {\n return inputSchema;\n }\n}\n\nfunction normalizeTool(\n rawTool: LanguageModelV3FunctionTool\n): Qwen3CoderToolShape {\n return {\n name: rawTool.name,\n description: rawTool.description,\n parameters: normalizeInputSchema(rawTool.inputSchema),\n };\n}\n\nfunction renderParameter(paramName: string, paramFieldsRaw: unknown): string {\n const paramFields = isMapping(paramFieldsRaw)\n ? (paramFieldsRaw as Mapping)\n : undefined;\n\n let out = \"\\n<parameter>\";\n out += `\\n<name>${toEscapedXmlText(paramName)}</name>`;\n\n if (paramFields?.type !== undefined) {\n out += `\\n<type>${toEscapedXmlText(paramFields.type)}</type>`;\n }\n\n if (paramFields?.description !== undefined) {\n out += `\\n<description>${toEscapedTrimmedXmlText(paramFields.description)}</description>`;\n }\n\n out += renderExtraKeys(paramFieldsRaw, [\"name\", \"type\", \"description\"]);\n out += \"\\n</parameter>\";\n return out;\n}\n\nfunction renderTool(tool: Qwen3CoderToolShape): string {\n let out = `\\n<function>\\n<name>${toEscapedXmlText(tool.name)}</name>`;\n\n if (tool.description !== undefined) {\n out += `\\n<description>${toEscapedTrimmedXmlText(tool.description)}</description>`;\n }\n\n out += \"\\n<parameters>\";\n\n const parameters = tool.parameters;\n if (isMapping(parameters) && isMapping((parameters as Mapping).properties)) {\n for (const [paramName, paramFieldsRaw] of Object.entries(\n (parameters as Mapping).properties as Mapping\n )) {\n out += renderParameter(paramName, paramFieldsRaw);\n }\n }\n\n out += renderExtraKeys(parameters, [\"type\", \"properties\"]);\n out += \"\\n</parameters>\";\n out += renderExtraKeys(tool, [\"type\", \"name\", \"description\", \"parameters\"]);\n out += \"\\n</function>\";\n return out;\n}\n\nexport function qwen3coderSystemPromptTemplate(\n tools: LanguageModelV3FunctionTool[]\n): string {\n if (!tools.length) {\n return \"\";\n }\n\n let out = `${QWEN3CODER_TOOL_HEADER}<tools>`;\n for (const tool of tools) {\n out += renderTool(normalizeTool(tool));\n }\n out += \"\\n</tools>\";\n out += QWEN3CODER_TOOL_CALL_INSTRUCTIONS;\n return out;\n}\n\ninterface Qwen3CoderToolResponseFormatterOptions {\n mediaStrategy?: ToolResponseMediaStrategy;\n}\n\nfunction stringifyToolResponseContent(value: JSONValue): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n return JSON.stringify(value);\n}\n\nfunction formatToolResponseAsQwen3CoderXmlWithOptions(\n toolResult: ToolResultPart,\n options?: Qwen3CoderToolResponseFormatterOptions\n): string {\n const unwrappedResult = unwrapToolResult(\n toolResult.output,\n options?.mediaStrategy\n );\n const content = stringifyToolResponseContent(unwrappedResult);\n return `<tool_response>\\n${content}\\n</tool_response>`;\n}\n\nexport function createQwen3CoderXmlToolResponseFormatter(\n options?: Qwen3CoderToolResponseFormatterOptions\n): (toolResult: ToolResultPart) => string {\n return (toolResult) =>\n formatToolResponseAsQwen3CoderXmlWithOptions(toolResult, options);\n}\n\nexport function formatToolResponseAsQwen3CoderXml(\n toolResult: ToolResultPart\n): string {\n return formatToolResponseAsQwen3CoderXmlWithOptions(toolResult);\n}\n","import type { LanguageModelV3FunctionTool } from \"@ai-sdk/provider\";\nimport type { ToolResultPart } from \"@ai-sdk/provider-utils\";\nimport { morphFormatToolResponseAsXml } from \"./morph-xml-prompt\";\n\nexport function yamlXmlSystemPromptTemplate(\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\nexport function formatToolResponseAsYaml(toolResult: ToolResultPart): string {\n return morphFormatToolResponseAsXml(toolResult);\n}\n","import type {\n LanguageModelV3,\n LanguageModelV3FinishReason,\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n LanguageModelV3Usage,\n} from \"@ai-sdk/provider\";\nimport type { TCMCoreProtocol } from \"./core/protocols/protocol-interface\";\nimport { getDebugLevel, logParsedChunk, logRawChunk } from \"./core/utils/debug\";\nimport { generateToolCallId } from \"./core/utils/id\";\nimport { extractOnErrorOption } from \"./core/utils/on-error\";\nimport {\n decodeOriginalToolsFromProviderOptions,\n getToolCallMiddlewareOptions,\n isToolChoiceActive,\n type ToolCallMiddlewareProviderOptions,\n} from \"./core/utils/provider-options\";\nimport { coerceToolCallPart } from \"./core/utils/tool-call-coercion\";\nimport { resolveToolChoiceSelection } from \"./core/utils/tool-choice\";\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 const onErrorOptions = extractOnErrorOption(params.providerOptions);\n const tools = decodeOriginalToolsFromProviderOptions(\n params.providerOptions,\n onErrorOptions\n );\n\n if (isToolChoiceActive(params)) {\n return toolChoiceStream({\n doGenerate,\n tools,\n options: onErrorOptions,\n });\n }\n\n const { stream, ...rest } = await doStream();\n const debugLevel = getDebugLevel();\n const options = {\n ...onErrorOptions,\n ...getToolCallMiddlewareOptions(params.providerOptions),\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 let seenToolCall = false;\n const v3Stream = coreStream.pipeThrough(\n new TransformStream<LanguageModelV3StreamPart, LanguageModelV3StreamPart>({\n transform(part, controller) {\n let normalizedPart =\n part.type === \"tool-call\" ? coerceToolCallPart(part, tools) : part;\n\n if (normalizedPart.type === \"tool-call\") {\n seenToolCall = true;\n }\n\n if (\n normalizedPart.type === \"finish\" &&\n seenToolCall &&\n normalizedPart.finishReason.unified === \"stop\"\n ) {\n normalizedPart = {\n ...normalizedPart,\n finishReason: normalizeToolCallsFinishReason(\n normalizedPart.finishReason\n ),\n };\n }\n\n if (debugLevel === \"stream\") {\n logParsedChunk(normalizedPart);\n }\n controller.enqueue(normalizedPart);\n },\n })\n );\n\n return {\n ...rest,\n stream: v3Stream,\n };\n}\n\nexport async function toolChoiceStream({\n doGenerate,\n tools,\n options,\n}: {\n doGenerate: () => ReturnType<LanguageModelV3[\"doGenerate\"]>;\n tools?: LanguageModelV3FunctionTool[];\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n}) {\n const normalizedTools = Array.isArray(tools) ? tools : [];\n const result = await doGenerate();\n const first = result?.content?.[0];\n const firstText = first?.type === \"text\" ? first.text : undefined;\n const { toolName, input } = resolveToolChoiceSelection({\n text: firstText,\n tools: normalizedTools,\n onError: options?.onError,\n errorMessage: \"Failed to parse toolChoice JSON from streamed model output\",\n });\n\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n start(controller) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: generateToolCallId(),\n toolName,\n input,\n });\n controller.enqueue({\n type: \"finish\",\n usage: normalizeUsage(result?.usage),\n finishReason: normalizeToolCallsFinishReason(result?.finishReason),\n });\n controller.close();\n },\n });\n\n return {\n request: result?.request || {},\n response: result?.response || {},\n stream,\n };\n}\n\nconst ZERO_USAGE: LanguageModelV3Usage = {\n inputTokens: {\n total: 0,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: 0,\n text: undefined,\n reasoning: undefined,\n },\n};\n\nfunction normalizeToolCallsFinishReason(\n finishReason: unknown\n): LanguageModelV3FinishReason {\n let raw = \"tool-calls\";\n if (typeof finishReason === \"string\") {\n raw = finishReason;\n } else if (\n finishReason &&\n typeof finishReason === \"object\" &&\n \"raw\" in finishReason &&\n typeof (finishReason as { raw?: unknown }).raw === \"string\"\n ) {\n raw = (finishReason as { raw: string }).raw;\n } else if (\n finishReason &&\n typeof finishReason === \"object\" &&\n \"unified\" in finishReason &&\n typeof (finishReason as { unified?: unknown }).unified === \"string\"\n ) {\n raw = (finishReason as { unified: string }).unified;\n }\n\n return {\n unified: \"tool-calls\",\n raw,\n };\n}\n\nfunction normalizeUsage(usage: unknown): LanguageModelV3Usage {\n if (!usage || typeof usage !== \"object\") {\n return ZERO_USAGE;\n }\n\n const usageRecord = usage as Record<string, unknown>;\n const input = usageRecord.inputTokens;\n const output = usageRecord.outputTokens;\n if (\n input &&\n typeof input === \"object\" &&\n output &&\n typeof output === \"object\"\n ) {\n return usage as LanguageModelV3Usage;\n }\n\n if (typeof input === \"number\" && typeof output === \"number\") {\n return {\n inputTokens: {\n total: input,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: output,\n text: undefined,\n reasoning: undefined,\n },\n };\n }\n\n return ZERO_USAGE;\n}\n","import type { LanguageModelV3Content } from \"@ai-sdk/provider\";\nimport type { TCMCoreProtocol } from \"../../protocols/protocol-interface\";\n\ninterface AssistantToolCallTextConversionOptions {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n}\n\nexport function assistantToolCallsToTextContent(options: {\n content: LanguageModelV3Content[];\n protocol: TCMCoreProtocol;\n conversionOptions?: AssistantToolCallTextConversionOptions;\n}): LanguageModelV3Content[] {\n const newContent: LanguageModelV3Content[] = [];\n for (const item of options.content) {\n switch (item.type) {\n case \"tool-call\":\n newContent.push({\n type: \"text\",\n text: options.protocol.formatToolCall(item),\n });\n break;\n case \"text\":\n case \"reasoning\":\n newContent.push(item);\n break;\n default:\n options.conversionOptions?.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 if (!newContent.every((entry) => entry.type === \"text\")) {\n return newContent;\n }\n\n return [\n {\n type: \"text\",\n text: newContent\n .map((entry) => (entry as { text: string }).text)\n .join(\"\\n\"),\n },\n ];\n}\n","import type {\n LanguageModelV3FilePart,\n LanguageModelV3Prompt,\n LanguageModelV3TextPart,\n} from \"@ai-sdk/provider\";\nimport type {\n ToolApprovalResponse,\n ToolContent,\n ToolResultPart,\n} from \"@ai-sdk/provider-utils\";\nimport { toTextPart } from \"./text-part\";\nimport {\n normalizeToolResultForUserContent,\n type ToolResponseMediaStrategy,\n type ToolResponseUserContentPart,\n} from \"./tool-result-normalizer\";\n\nexport type ToolResponsePromptTemplateResult =\n | string\n | ToolResponseUserContentPart[];\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 normalizeTemplateResult(\n result: ToolResponsePromptTemplateResult\n): ToolResponseUserContentPart[] {\n if (typeof result === \"string\") {\n return [toTextPart(result)];\n }\n\n return result;\n}\n\nfunction appendSection(\n target: ToolResponseUserContentPart[],\n section: ToolResponseUserContentPart[]\n): void {\n if (section.length === 0) {\n return;\n }\n\n if (target.length > 0) {\n target.push(toTextPart(\"\\n\"));\n }\n\n target.push(...section);\n}\n\nfunction mergeAdjacentTextParts(\n parts: ToolResponseUserContentPart[]\n): Array<LanguageModelV3TextPart | LanguageModelV3FilePart> {\n const merged: Array<LanguageModelV3TextPart | LanguageModelV3FilePart> = [];\n\n for (const part of parts) {\n const last = merged.at(-1);\n const canMergeTextParts =\n part.type === \"text\" &&\n last?.type === \"text\" &&\n part.providerOptions === undefined &&\n last.providerOptions === undefined;\n if (canMergeTextParts) {\n last.text += part.text;\n continue;\n }\n merged.push(part);\n }\n\n return merged;\n}\n\nexport function createUserContentToolResponseTemplate(options?: {\n mediaStrategy?: ToolResponseMediaStrategy;\n}): (toolResult: ToolResultPart) => ToolResponsePromptTemplateResult {\n return (toolResult) =>\n normalizeToolResultForUserContent(\n toolResult.output,\n options?.mediaStrategy\n );\n}\n\nexport function toolRoleContentToUserTextMessage(options: {\n toolContent: ToolContent;\n toolResponsePromptTemplate: (\n toolResult: ToolResultPart\n ) => ToolResponsePromptTemplateResult;\n}): LanguageModelV3Prompt[number] {\n const toolResultParts = options.toolContent.filter(\n (part): part is ToolResultPart => part.type === \"tool-result\"\n );\n const approvalResponseParts = options.toolContent.filter(\n (part): part is ToolApprovalResponse =>\n part.type === \"tool-approval-response\"\n );\n\n const sections: ToolResponseUserContentPart[] = [];\n\n for (const toolResult of toolResultParts) {\n const result = options.toolResponsePromptTemplate(toolResult);\n appendSection(sections, normalizeTemplateResult(result));\n }\n\n for (const approvalResponse of approvalResponseParts) {\n appendSection(sections, [\n toTextPart(formatApprovalResponse(approvalResponse)),\n ]);\n }\n\n const normalizedSections = sections.length > 0 ? sections : [toTextPart(\"\")];\n\n return {\n role: \"user\",\n content: mergeAdjacentTextParts(normalizedSections),\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} from \"@ai-sdk/provider\";\nimport type { ToolContent, ToolResultPart } from \"@ai-sdk/provider-utils\";\nimport { assistantToolCallsToTextContent } from \"./core/prompts/shared/assistant-tool-calls-to-text\";\nimport {\n type ToolResponsePromptTemplateResult,\n toolRoleContentToUserTextMessage,\n} from \"./core/prompts/shared/tool-role-to-user-message\";\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 {\n mergeToolCallMiddlewareOptions,\n originalToolsSchema,\n} 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 if (systemPrompt.trim().length === 0) {\n return processedPrompt;\n }\n\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: mergeToolCallMiddlewareOptions(params.providerOptions, {\n originalTools: originalToolsSchema.encode(functionTools),\n }),\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: mergeToolCallMiddlewareOptions(\n baseReturnParams.providerOptions,\n params.toolChoice ? { toolChoice: params.toolChoice } : {}\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 if (functionTools.length === 0) {\n throw new Error(\n \"Tool choice type 'required' is set, but no function tools are provided. Provider-defined tools are not supported by this middleware.\"\n );\n }\n\n return {\n ...baseReturnParams,\n responseFormat: {\n type: \"json\" as const,\n schema: createDynamicIfThenElseSchema(functionTools),\n },\n providerOptions: mergeToolCallMiddlewareOptions(\n baseReturnParams.providerOptions,\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?: (\n toolResult: ToolResultPart\n ) => ToolResponsePromptTemplateResult;\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 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?: (\n toolResult: ToolResultPart\n ) => ToolResponsePromptTemplateResult\n): LanguageModelV3Prompt[number] {\n if (message.role === \"assistant\") {\n const condensedContent = assistantToolCallsToTextContent({\n content: message.content as LanguageModelV3Content[],\n protocol: resolvedProtocol,\n conversionOptions: {\n onError: providerOptions?.onError,\n },\n });\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 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\n return toolRoleContentToUserTextMessage({\n toolContent: message.content as ToolContent,\n toolResponsePromptTemplate,\n });\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 if (\n !(isAllTextContent(prev.content) && isAllTextContent(current.content))\n ) {\n continue;\n }\n\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?: (\n toolResult: ToolResultPart\n ) => ToolResponsePromptTemplateResult,\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 { ToolResponsePromptTemplateResult } from \"./core/prompts/shared/tool-role-to-user-message\";\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?: (\n toolResult: ToolResultPart\n ) => ToolResponsePromptTemplateResult;\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 {\n formatToolResponseAsHermes,\n hermesSystemPromptTemplate,\n} from \"./core/prompts/hermes-prompt\";\nimport {\n morphFormatToolResponseAsXml,\n morphXmlSystemPromptTemplate,\n} from \"./core/prompts/morph-xml-prompt\";\nimport {\n formatToolResponseAsQwen3CoderXml,\n qwen3coderSystemPromptTemplate,\n} from \"./core/prompts/qwen3coder-prompt\";\nimport {\n formatToolResponseAsYaml,\n yamlXmlSystemPromptTemplate,\n} from \"./core/prompts/yaml-xml-prompt\";\nimport { hermesProtocol } from \"./core/protocols/hermes-protocol\";\nimport { morphXmlProtocol } from \"./core/protocols/morph-xml-protocol\";\nimport { qwen3CoderProtocol } from \"./core/protocols/qwen3coder-protocol\";\nimport { yamlXmlProtocol } from \"./core/protocols/yaml-xml-protocol\";\nimport { createToolMiddleware } from \"./tool-call-middleware\";\n\nexport const hermesToolMiddleware = createToolMiddleware({\n protocol: hermesProtocol(),\n toolSystemPromptTemplate: hermesSystemPromptTemplate,\n toolResponsePromptTemplate: formatToolResponseAsHermes,\n});\n\nexport const qwen3CoderToolMiddleware = createToolMiddleware({\n protocol: qwen3CoderProtocol,\n toolSystemPromptTemplate: qwen3coderSystemPromptTemplate,\n toolResponsePromptTemplate: formatToolResponseAsQwen3CoderXml,\n});\n\nexport const morphXmlToolMiddleware = createToolMiddleware({\n protocol: morphXmlProtocol({}),\n toolSystemPromptTemplate: morphXmlSystemPromptTemplate,\n toolResponsePromptTemplate: morphFormatToolResponseAsXml,\n});\n\nexport const yamlXmlToolMiddleware = createToolMiddleware({\n protocol: yamlXmlProtocol({}),\n toolSystemPromptTemplate: yamlXmlSystemPromptTemplate,\n toolResponsePromptTemplate: formatToolResponseAsYaml,\n});\n"],"mappings":"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","names":["index","emitToolInputProgress","handleStreamingToolCallEnd","findPotentialToolTagStart","newBuffer","parse","emitToolInputProgress","_a","rawValue","processToolCall","toolNameAttr","findClosingTagEnd","findToolCalls","emitToolInputProgress","isRecord","safeStringify","safeStringify","lines","isMapping"]}
1
+ {"version":3,"sources":["../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/streamed-tool-input-delta.ts","../src/core/utils/tool-call-coercion.ts","../src/core/utils/tool-input-streaming.ts","../src/core/protocols/hermes-protocol.ts","../src/core/utils/regex-constants.ts","../src/core/utils/xml-root-repair.ts","../src/core/utils/xml-tool-tag-scanner.ts","../src/core/protocols/morph-xml-stream-state-machine.ts","../src/core/protocols/morph-xml-protocol.ts","../src/core/protocols/protocol-interface.ts","../src/core/protocols/qwen3coder-stream-call-content.ts","../src/core/protocols/qwen3coder-protocol.ts","../src/core/protocols/yaml-xml-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/core/utils/generated-text-json-recovery.ts","../src/core/utils/tool-choice.ts","../src/generate-handler.ts","../src/core/prompts/shared/text-part.ts","../src/core/prompts/shared/tool-result-normalizer.ts","../src/core/prompts/hermes-prompt.ts","../src/core/prompts/morph-xml-prompt.ts","../src/core/prompts/qwen3coder-prompt.ts","../src/core/prompts/yaml-xml-prompt.ts","../src/stream-handler.ts","../src/core/prompts/shared/assistant-tool-calls-to-text.ts","../src/core/prompts/shared/tool-role-to-user-message.ts","../src/transform-handler.ts","../src/tool-call-middleware.ts","../src/preconfigured-middleware.ts"],"sourcesContent":["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 const textLength = text.length;\n const searchedTextLength = searchedText.length;\n\n // Performance optimization:\n // 1. Limit the loop to searchedTextLength - 1. Any suffix longer than this\n // cannot be a prefix of searchedText (and full matches were caught by indexOf).\n // This prevents O(N²) complexity in growing buffers.\n // 2. Use character-by-character comparison to avoid string allocation overhead\n // from substring() or startsWith().\n // 3. Find the longest suffix (earliest index) first, which is more correct\n // for streaming overlapping patterns (e.g., text \"ababa\", search \"ababax\").\n const startAt = Math.max(0, textLength - searchedTextLength + 1);\n\n for (let i = startAt; i < textLength; i++) {\n let match = true;\n const currentSuffixLength = textLength - i;\n\n for (let j = 0; j < currentSuffixLength; j++) {\n if (text[i + j] !== searchedText[j]) {\n match = false;\n break;\n }\n }\n\n if (match) {\n return i;\n }\n }\n\n return null;\n}\n","export function generateId(): string {\n return crypto.randomUUID().replace(/-/g, \"\").slice(0, 13);\n}\n\nconst TOOL_CALL_ID_PREFIX = \"call_\";\nconst TOOL_CALL_ID_BODY_LENGTH = 24;\nconst TOOL_CALL_ID_ALPHANUM =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\nfunction randomAlphaNumeric(length: number): string {\n const bytes = new Uint8Array(length);\n crypto.getRandomValues(bytes);\n let out = \"\";\n for (let i = 0; i < length; i += 1) {\n const byte = bytes[i];\n const index = (byte ?? 0) % TOOL_CALL_ID_ALPHANUM.length;\n out += TOOL_CALL_ID_ALPHANUM[index] ?? \"0\";\n }\n return out;\n}\n\nexport function generateToolCallId(): string {\n return `${TOOL_CALL_ID_PREFIX}${randomAlphaNumeric(TOOL_CALL_ID_BODY_LENGTH)}`;\n}\n","import type {\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n} from \"@ai-sdk/provider\";\nimport { generateId } from \"./id\";\n\nexport function formatToolsWithPromptTemplate(options: {\n tools: LanguageModelV3FunctionTool[];\n toolSystemPromptTemplate: (tools: LanguageModelV3FunctionTool[]) => string;\n}): string {\n return options.toolSystemPromptTemplate(options.tools || []);\n}\n\nexport function extractToolNames(\n tools: LanguageModelV3FunctionTool[]\n): string[] {\n return tools.map((tool) => tool.name).filter(Boolean) as string[];\n}\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\nexport function 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","import type { LanguageModelV3StreamPart } from \"@ai-sdk/provider\";\n\nexport interface EmittedToolInputState {\n emittedInput: string;\n}\n\ninterface EmitToolInputDeltaBaseParams {\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>;\n id: string;\n state: EmittedToolInputState;\n}\n\ninterface EmitPrefixDeltaParams extends EmitToolInputDeltaBaseParams {\n candidate: string;\n}\n\ninterface EmitChunkedPrefixDeltaParams extends EmitPrefixDeltaParams {\n maxChunkChars?: number;\n}\n\ninterface EmitFinalRemainderParams extends EmitToolInputDeltaBaseParams {\n finalFullJson: string;\n onMismatch?: (message: string, metadata?: Record<string, unknown>) => void;\n}\n\nfunction emitDelta({\n controller,\n id,\n state,\n nextInput,\n}: EmitToolInputDeltaBaseParams & {\n nextInput: string;\n}): boolean {\n if (!nextInput.startsWith(state.emittedInput)) {\n return false;\n }\n\n const delta = nextInput.slice(state.emittedInput.length);\n if (delta.length === 0) {\n return false;\n }\n\n controller.enqueue({\n type: \"tool-input-delta\",\n id,\n delta,\n });\n state.emittedInput = nextInput;\n return true;\n}\n\n/**\n * Converts a complete JSON string to an incomplete prefix suitable for streaming.\n * Handles object, array, and string root types correctly.\n */\nexport function toIncompleteJsonPrefix(fullJson: string): string {\n const trimmed = fullJson.trim();\n let prefix = trimmed;\n\n while (prefix.endsWith(\"}\") || prefix.endsWith(\"]\")) {\n prefix = prefix.slice(0, -1);\n }\n\n prefix = prefix.trimEnd();\n\n if (prefix.endsWith('\"')) {\n prefix = prefix.slice(0, -1);\n }\n\n if (prefix.length === 0) {\n if (trimmed.startsWith(\"[\") || trimmed.startsWith(\"{\")) {\n return trimmed.startsWith(\"{\") ? \"{\" : \"[\";\n }\n if (trimmed.startsWith(\"]\")) {\n return \"[\";\n }\n if (trimmed.startsWith(\"}\")) {\n return \"{\";\n }\n if (trimmed.startsWith('\"')) {\n return '\"';\n }\n return \"{\";\n }\n\n return prefix;\n}\n\nexport function emitPrefixDelta(params: EmitPrefixDeltaParams): boolean {\n return emitDelta({\n ...params,\n nextInput: params.candidate,\n });\n}\n\nconst DEFAULT_TOOL_INPUT_DELTA_CHUNK_CHARS = 512;\n\nexport function emitChunkedPrefixDelta(\n params: EmitChunkedPrefixDeltaParams\n): boolean {\n const { maxChunkChars = DEFAULT_TOOL_INPUT_DELTA_CHUNK_CHARS } = params;\n if (maxChunkChars <= 0) {\n return emitPrefixDelta(params);\n }\n\n const growth = params.candidate.length - params.state.emittedInput.length;\n if (growth <= 0) {\n return false;\n }\n\n if (growth <= maxChunkChars) {\n return emitPrefixDelta(params);\n }\n\n let emittedAny = false;\n let cursor = params.state.emittedInput.length + maxChunkChars;\n while (cursor < params.candidate.length) {\n const didEmit = emitPrefixDelta({\n controller: params.controller,\n id: params.id,\n state: params.state,\n candidate: params.candidate.slice(0, cursor),\n });\n if (!didEmit) {\n return emittedAny;\n }\n emittedAny = true;\n cursor += maxChunkChars;\n }\n\n return (\n emitPrefixDelta({\n controller: params.controller,\n id: params.id,\n state: params.state,\n candidate: params.candidate,\n }) || emittedAny\n );\n}\n\nexport function emitFinalRemainder(params: EmitFinalRemainderParams): boolean {\n const result = emitDelta({\n ...params,\n nextInput: params.finalFullJson,\n });\n\n if (!result && params.state.emittedInput.length > 0) {\n params.onMismatch?.(\n \"Final JSON does not extend emitted tool-input prefix\",\n {\n emittedLength: params.state.emittedInput.length,\n finalLength: params.finalFullJson.length,\n }\n );\n }\n\n return result;\n}\n","import type {\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n} from \"@ai-sdk/provider\";\nimport { coerceBySchema } from \"../../schema-coerce\";\n\ntype ToolCallLike = Extract<\n LanguageModelV3Content | LanguageModelV3StreamPart,\n { type: \"tool-call\" }\n>;\n\nexport function coerceToolCallInput(\n toolName: string,\n input: unknown,\n tools: LanguageModelV3FunctionTool[]\n): string | undefined {\n let args: unknown = {};\n if (typeof input === \"string\") {\n try {\n args = JSON.parse(input);\n } catch {\n return;\n }\n } else if (input && typeof input === \"object\") {\n args = input;\n } else {\n return;\n }\n\n const schema = tools.find((t) => t.name === toolName)?.inputSchema;\n const coerced = coerceBySchema(args, schema);\n return JSON.stringify(coerced ?? {});\n}\n\nexport function coerceToolCallPart<T extends ToolCallLike>(\n part: T,\n tools: LanguageModelV3FunctionTool[]\n): T {\n const coercedInput = coerceToolCallInput(part.toolName, part.input, tools);\n if (coercedInput === undefined) {\n return part;\n }\n\n return {\n ...part,\n input: coercedInput,\n };\n}\n","import type {\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n} from \"@ai-sdk/provider\";\nimport {\n type EmittedToolInputState,\n emitChunkedPrefixDelta,\n emitFinalRemainder,\n toIncompleteJsonPrefix,\n} from \"./streamed-tool-input-delta\";\nimport { coerceToolCallInput } from \"./tool-call-coercion\";\n\ntype StreamController =\n TransformStreamDefaultController<LanguageModelV3StreamPart>;\n\ninterface RawFallbackOptions {\n emitRawToolCallTextOnError?: boolean;\n}\n\ntype OnMismatch = (message: string, metadata?: Record<string, unknown>) => void;\n\nexport function stringifyToolInputWithSchema(options: {\n toolName: string;\n args: unknown;\n tools: LanguageModelV3FunctionTool[];\n fallback?: (args: unknown) => string;\n}): string {\n const coerced = coerceToolCallInput(\n options.toolName,\n options.args,\n options.tools\n );\n if (coerced !== undefined) {\n return coerced;\n }\n\n if (options.fallback) {\n return options.fallback(options.args);\n }\n\n return JSON.stringify(options.args ?? {});\n}\n\nexport function emitToolInputProgressDelta(options: {\n controller: StreamController;\n id: string;\n state: EmittedToolInputState;\n fullInput: string;\n mode?: \"full-json\" | \"incomplete-json-prefix\";\n}): boolean {\n const mode = options.mode ?? \"incomplete-json-prefix\";\n const candidate =\n mode === \"full-json\"\n ? options.fullInput\n : toIncompleteJsonPrefix(options.fullInput);\n\n return emitChunkedPrefixDelta({\n controller: options.controller,\n id: options.id,\n state: options.state,\n candidate,\n });\n}\n\nexport function enqueueToolInputEndAndCall(options: {\n controller: StreamController;\n id: string;\n toolName: string;\n input: string;\n}): void {\n enqueueToolInputEnd({\n controller: options.controller,\n id: options.id,\n });\n options.controller.enqueue({\n type: \"tool-call\",\n toolCallId: options.id,\n toolName: options.toolName,\n input: options.input,\n });\n}\n\nexport function enqueueToolInputEnd(options: {\n controller: StreamController;\n id: string;\n}): void {\n options.controller.enqueue({\n type: \"tool-input-end\",\n id: options.id,\n });\n}\n\nexport function emitFailedToolInputLifecycle(options: {\n controller: StreamController;\n id: string;\n emitRawToolCallTextOnError: boolean;\n emitRawText?: (rawText: string) => void;\n endInput?: boolean;\n rawToolCallText?: string | null;\n}): void {\n if (options.endInput !== false) {\n enqueueToolInputEnd({\n controller: options.controller,\n id: options.id,\n });\n }\n\n if (\n options.emitRawToolCallTextOnError &&\n typeof options.rawToolCallText === \"string\" &&\n options.rawToolCallText.length > 0\n ) {\n options.emitRawText?.(options.rawToolCallText);\n }\n}\n\nexport function emitFinalizedToolInputLifecycle(options: {\n controller: StreamController;\n id: string;\n state: EmittedToolInputState;\n toolName: string;\n finalInput: string;\n onMismatch?: OnMismatch;\n}): void {\n emitFinalRemainder({\n controller: options.controller,\n id: options.id,\n state: options.state,\n finalFullJson: options.finalInput,\n onMismatch: options.onMismatch,\n });\n\n enqueueToolInputEndAndCall({\n controller: options.controller,\n id: options.id,\n toolName: options.toolName,\n input: options.finalInput,\n });\n}\n\nexport function shouldEmitRawToolCallTextOnError(\n options?: RawFallbackOptions\n): boolean {\n return options?.emitRawToolCallTextOnError === true;\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, generateToolCallId } from \"../utils/id\";\nimport {\n addTextSegment,\n formatToolsWithPromptTemplate,\n} from \"../utils/protocol-utils\";\nimport { escapeRegExp } from \"../utils/regex\";\nimport {\n emitToolInputProgressDelta,\n shouldEmitRawToolCallTextOnError,\n stringifyToolInputWithSchema,\n} from \"../utils/tool-input-streaming\";\nimport type { ParserOptions, TCMProtocol } from \"./protocol-interface\";\n\ninterface HermesProtocolOptions {\n toolCallEnd?: string;\n toolCallStart?: string;\n}\n\nfunction canonicalizeToolInput(argumentsValue: unknown): string {\n return JSON.stringify(argumentsValue ?? {});\n}\n\nfunction processToolCallJson(\n toolCallJson: string,\n fullMatch: string,\n processedElements: LanguageModelV3Content[],\n options?: ParserOptions\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: generateToolCallId(),\n toolName: parsedToolCall.name,\n input: canonicalizeToolInput(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 currentIndex: number;\n match: RegExpExecArray;\n options?: ParserOptions;\n processedElements: LanguageModelV3Content[];\n text: string;\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 activeToolInput: {\n id: string;\n toolName: string;\n emittedInput: string;\n } | null;\n buffer: string;\n currentTextId: string | null;\n currentToolCallJson: string;\n hasEmittedTextStart: boolean;\n isInsideToolCall: boolean;\n}\n\ntype StreamController =\n TransformStreamDefaultController<LanguageModelV3StreamPart>;\n\ninterface TagProcessingContext {\n controller: StreamController;\n options?: ParserOptions;\n state: StreamState;\n toolCallEnd: string;\n toolCallStart: string;\n tools: LanguageModelV3FunctionTool[];\n}\n\nconst WHITESPACE_JSON_REGEX = /\\s/;\n\nfunction skipJsonWhitespace(text: string, fromIndex: number): number {\n let index = fromIndex;\n while (index < text.length && WHITESPACE_JSON_REGEX.test(text[index])) {\n index += 1;\n }\n return index;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Streaming JSON key/value scanning requires explicit string-depth state tracking.\nfunction findTopLevelPropertyValueStart(\n text: string,\n property: string\n): number | null {\n const objectStart = skipJsonWhitespace(text, 0);\n if (objectStart >= text.length || text.charAt(objectStart) !== \"{\") {\n return null;\n }\n\n let depth = 0;\n let inString = false;\n let escaping = false;\n\n for (let index = objectStart; index < text.length; index += 1) {\n const char = text.charAt(index);\n\n if (inString) {\n if (escaping) {\n escaping = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaping = true;\n continue;\n }\n if (char === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (char === \"{\") {\n depth += 1;\n continue;\n }\n if (char === \"}\") {\n depth = Math.max(0, depth - 1);\n continue;\n }\n\n if (char !== '\"') {\n continue;\n }\n\n if (depth !== 1) {\n inString = true;\n continue;\n }\n\n const keyStart = index + 1;\n let keyEnd = keyStart;\n let keyEscaped = false;\n while (keyEnd < text.length) {\n const keyChar = text.charAt(keyEnd);\n if (keyEscaped) {\n keyEscaped = false;\n } else if (keyChar === \"\\\\\") {\n keyEscaped = true;\n } else if (keyChar === '\"') {\n break;\n }\n keyEnd += 1;\n }\n\n if (keyEnd >= text.length || text.charAt(keyEnd) !== '\"') {\n return null;\n }\n\n const key = text.slice(keyStart, keyEnd);\n let valueCursor = skipJsonWhitespace(text, keyEnd + 1);\n if (valueCursor >= text.length || text.charAt(valueCursor) !== \":\") {\n index = keyEnd;\n continue;\n }\n\n valueCursor = skipJsonWhitespace(text, valueCursor + 1);\n if (key === property) {\n return valueCursor < text.length ? valueCursor : null;\n }\n\n index = valueCursor - 1;\n }\n\n return null;\n}\n\nfunction extractTopLevelStringProperty(\n text: string,\n property: string\n): string | undefined {\n const valueStart = findTopLevelPropertyValueStart(text, property);\n if (valueStart == null || valueStart >= text.length) {\n return undefined;\n }\n if (text.charAt(valueStart) !== '\"') {\n return undefined;\n }\n\n let valueEnd = valueStart + 1;\n let escaped = false;\n while (valueEnd < text.length) {\n const char = text.charAt(valueEnd);\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === '\"') {\n return text.slice(valueStart + 1, valueEnd);\n }\n valueEnd += 1;\n }\n\n return undefined;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Streaming JSON value slicing must handle nested arrays/objects and escaped strings.\nfunction extractJsonValueSlice(\n text: string,\n valueStart: number\n): {\n text: string;\n complete: boolean;\n} | null {\n if (valueStart >= text.length) {\n return null;\n }\n\n const first = text.charAt(valueStart);\n if (first === \"{\" || first === \"[\") {\n const stack: string[] = [first];\n let inString = false;\n let escaped = false;\n\n for (let index = valueStart + 1; index < text.length; index += 1) {\n const char = text.charAt(index);\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n continue;\n }\n\n if (char === \"{\" || char === \"[\") {\n stack.push(char);\n continue;\n }\n\n if (char === \"}\" || char === \"]\") {\n const open = stack.at(-1);\n if ((open === \"{\" && char === \"}\") || (open === \"[\" && char === \"]\")) {\n stack.pop();\n if (stack.length === 0) {\n return {\n text: text.slice(valueStart, index + 1),\n complete: true,\n };\n }\n }\n }\n }\n\n return {\n text: text.slice(valueStart),\n complete: false,\n };\n }\n\n if (first === '\"') {\n let escaped = false;\n for (let index = valueStart + 1; index < text.length; index += 1) {\n const char = text.charAt(index);\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === '\"') {\n return {\n text: text.slice(valueStart, index + 1),\n complete: true,\n };\n }\n }\n return {\n text: text.slice(valueStart),\n complete: false,\n };\n }\n\n let index = valueStart;\n while (index < text.length) {\n const char = text.charAt(index);\n if (char === \",\" || char === \"}\" || WHITESPACE_JSON_REGEX.test(char)) {\n break;\n }\n index += 1;\n }\n\n return {\n text: text.slice(valueStart, index),\n complete: index < text.length,\n };\n}\n\nfunction extractStreamingToolCallProgress(toolCallJson: string): {\n toolName: string | undefined;\n argumentsText: string | undefined;\n argumentsComplete: boolean;\n} {\n const toolName = extractTopLevelStringProperty(toolCallJson, \"name\");\n const argsValueStart = findTopLevelPropertyValueStart(\n toolCallJson,\n \"arguments\"\n );\n if (argsValueStart == null) {\n return {\n toolName,\n argumentsText: undefined,\n argumentsComplete: false,\n };\n }\n\n const argsSlice = extractJsonValueSlice(toolCallJson, argsValueStart);\n return {\n toolName,\n argumentsText: argsSlice?.text,\n argumentsComplete: argsSlice?.complete ?? false,\n };\n}\n\nfunction ensureToolInputStart(\n state: StreamState,\n controller: StreamController,\n toolName: string\n) {\n if (!state.activeToolInput) {\n const id = generateToolCallId();\n state.activeToolInput = {\n id,\n toolName,\n emittedInput: \"\",\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id,\n toolName,\n } as LanguageModelV3StreamPart);\n }\n}\n\nfunction emitToolInputDelta(\n state: StreamState,\n controller: StreamController,\n fullInput: string\n) {\n const active = state.activeToolInput;\n if (!active) {\n return;\n }\n\n emitToolInputProgressDelta({\n controller,\n id: active.id,\n state: active,\n fullInput,\n mode: \"full-json\",\n });\n}\n\nfunction closeToolInput(state: StreamState, controller: StreamController) {\n if (!state.activeToolInput) {\n return;\n }\n controller.enqueue({\n type: \"tool-input-end\",\n id: state.activeToolInput.id,\n } as LanguageModelV3StreamPart);\n state.activeToolInput = null;\n}\n\nfunction emitToolCallFromParsed(\n state: StreamState,\n controller: StreamController,\n parsedToolCall: { name: string; arguments: unknown },\n tools: LanguageModelV3FunctionTool[]\n) {\n closeTextBlock(state, controller);\n const toolName =\n typeof parsedToolCall.name === \"string\"\n ? parsedToolCall.name\n : (state.activeToolInput?.toolName ?? \"unknown\");\n const input = stringifyToolInputWithSchema({\n toolName,\n args: parsedToolCall.arguments,\n tools,\n fallback: canonicalizeToolInput,\n });\n ensureToolInputStart(state, controller, toolName);\n emitToolInputDelta(state, controller, input);\n const toolCallId = state.activeToolInput?.id ?? generateToolCallId();\n closeToolInput(state, controller);\n controller.enqueue({\n type: \"tool-call\",\n toolCallId,\n toolName,\n input,\n } as LanguageModelV3StreamPart);\n}\n\nfunction canonicalizeArgumentsProgressInput(\n progress: {\n argumentsText: string | undefined;\n argumentsComplete: boolean;\n },\n toolName: string,\n tools: LanguageModelV3FunctionTool[]\n): string | undefined {\n if (progress.argumentsText === undefined || !progress.argumentsComplete) {\n return undefined;\n }\n\n try {\n const parsedArguments = parseRJSON(progress.argumentsText);\n return stringifyToolInputWithSchema({\n toolName,\n args: parsedArguments,\n tools,\n fallback: canonicalizeToolInput,\n });\n } catch {\n return undefined;\n }\n}\n\nfunction emitToolInputProgress(\n state: StreamState,\n controller: StreamController,\n tools: LanguageModelV3FunctionTool[]\n) {\n if (!(state.isInsideToolCall && state.currentToolCallJson)) {\n return;\n }\n\n const progress = extractStreamingToolCallProgress(state.currentToolCallJson);\n if (!progress.toolName) {\n return;\n }\n\n ensureToolInputStart(state, controller, progress.toolName);\n const canonicalProgressInput = canonicalizeArgumentsProgressInput(\n progress,\n progress.toolName,\n tools\n );\n if (canonicalProgressInput !== undefined) {\n emitToolInputDelta(state, controller, canonicalProgressInput);\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 trailingBuffer: string,\n tools: LanguageModelV3FunctionTool[],\n options?: ParserOptions\n) {\n if (!state.currentToolCallJson && trailingBuffer.length === 0) {\n state.isInsideToolCall = false;\n return;\n }\n\n if (state.currentToolCallJson) {\n try {\n const parsedToolCall = parseRJSON(state.currentToolCallJson) as {\n name: string;\n arguments: unknown;\n };\n emitToolCallFromParsed(state, controller, parsedToolCall, tools);\n state.currentToolCallJson = \"\";\n state.isInsideToolCall = false;\n return;\n } catch {\n // fall through to text fallback\n }\n }\n\n const rawToolCallContent = `${state.currentToolCallJson}${trailingBuffer}`;\n const errorContent = `${toolCallStart}${rawToolCallContent}`;\n const shouldEmitRawFallback = shouldEmitRawToolCallTextOnError(options);\n\n logParseFailure({\n phase: \"stream\",\n reason: shouldEmitRawFallback\n ? \"Incomplete streaming tool call segment emitted as text\"\n : \"Incomplete streaming tool call segment suppressed without raw text fallback\",\n snippet: errorContent,\n });\n\n if (shouldEmitRawFallback) {\n const errorId = generateId();\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 }\n closeToolInput(state, controller);\n options?.onError?.(\n shouldEmitRawFallback\n ? \"Could not complete streaming JSON tool call at finish; emitting original text.\"\n : \"Could not complete streaming JSON tool call at finish.\",\n { toolCall: errorContent }\n );\n state.currentToolCallJson = \"\";\n state.isInsideToolCall = false;\n}\n\nfunction handleFinishChunk(\n state: StreamState,\n controller: StreamController,\n toolCallStart: string,\n tools: LanguageModelV3FunctionTool[],\n options: ParserOptions | undefined,\n chunk: LanguageModelV3StreamPart\n) {\n if (state.isInsideToolCall) {\n const trailingBuffer = state.buffer;\n state.buffer = \"\";\n emitIncompleteToolCall(\n state,\n controller,\n toolCallStart,\n trailingBuffer,\n tools,\n options\n );\n } else if (state.buffer.length > 0) {\n flushBuffer(state, controller, toolCallStart);\n }\n closeTextBlock(state, controller);\n controller.enqueue(chunk);\n}\n\nfunction publishText(\n text: string,\n state: StreamState,\n controller: StreamController,\n tools: LanguageModelV3FunctionTool[]\n) {\n if (state.isInsideToolCall) {\n closeTextBlock(state, controller);\n state.currentToolCallJson += text;\n emitToolInputProgress(state, controller, tools);\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, tools } =\n context;\n try {\n const parsedToolCall = parseRJSON(state.currentToolCallJson) as {\n name: string;\n arguments: unknown;\n };\n emitToolCallFromParsed(state, controller, parsedToolCall, tools);\n } catch (error) {\n const errorContent = `${toolCallStart}${state.currentToolCallJson}${toolCallEnd}`;\n const shouldEmitRawFallback = shouldEmitRawToolCallTextOnError(options);\n\n logParseFailure({\n phase: \"stream\",\n reason: \"Failed to parse streaming tool call JSON segment\",\n snippet: errorContent,\n error,\n });\n if (shouldEmitRawFallback) {\n const errorId = generateId();\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 }\n closeToolInput(state, controller);\n options?.onError?.(\n shouldEmitRawFallback\n ? \"Could not process streaming JSON tool call; emitting original text.\"\n : \"Could not process streaming JSON tool call.\",\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 state.activeToolInput = null;\n }\n}\n\nfunction processBufferTags(context: TagProcessingContext) {\n const { state, controller, toolCallStart, toolCallEnd, tools } = 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, tools);\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 toolCallEnd: string,\n tools: LanguageModelV3FunctionTool[]\n) {\n if (state.isInsideToolCall) {\n const potentialEndIndex = getPotentialStartIndex(state.buffer, toolCallEnd);\n if (\n potentialEndIndex != null &&\n potentialEndIndex + toolCallEnd.length > state.buffer.length\n ) {\n publishText(\n state.buffer.slice(0, potentialEndIndex),\n state,\n controller,\n tools\n );\n state.buffer = state.buffer.slice(potentialEndIndex);\n } else {\n publishText(state.buffer, state, controller, tools);\n state.buffer = \"\";\n }\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(\n state.buffer.slice(0, potentialIndex),\n state,\n controller,\n tools\n );\n state.buffer = state.buffer.slice(potentialIndex);\n } else {\n publishText(state.buffer, state, controller, tools);\n state.buffer = \"\";\n }\n}\n\nexport const hermesProtocol = ({\n toolCallStart = \"<tool_call>\",\n toolCallEnd = \"</tool_call>\",\n}: HermesProtocolOptions = {}): TCMProtocol => ({\n formatTools({\n tools,\n toolSystemPromptTemplate,\n }: {\n tools: LanguageModelV3FunctionTool[];\n toolSystemPromptTemplate: (tools: LanguageModelV3FunctionTool[]) => string;\n }) {\n return formatToolsWithPromptTemplate({ tools, toolSystemPromptTemplate });\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?: ParserOptions;\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 tools,\n options,\n }: {\n tools: LanguageModelV3FunctionTool[];\n options?: ParserOptions;\n }) {\n const state: StreamState = {\n isInsideToolCall: false,\n buffer: \"\",\n currentToolCallJson: \"\",\n currentTextId: null,\n hasEmittedTextStart: false,\n activeToolInput: null,\n };\n\n return new TransformStream<\n LanguageModelV3StreamPart,\n LanguageModelV3StreamPart\n >({\n transform(chunk, controller) {\n if (chunk.type === \"finish\") {\n handleFinishChunk(\n state,\n controller,\n toolCallStart,\n tools,\n options,\n chunk\n );\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 tools,\n });\n handlePartialTag(state, controller, toolCallStart, toolCallEnd, tools);\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","/**\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","const XML_SELF_CLOSING_ROOT_WITH_BODY_REGEX =\n /^<([A-Za-z_][A-Za-z0-9_-]*)\\s*\\r?\\n([\\s\\S]+?)\\r?\\n\\s*\\/>\\s*$/;\n\nexport function tryRepairXmlSelfClosingRootWithBody(\n rawText: string,\n toolNames: string[]\n): string | null {\n const trimmed = rawText.trim();\n if (trimmed.length === 0) {\n return null;\n }\n\n const match = trimmed.match(XML_SELF_CLOSING_ROOT_WITH_BODY_REGEX);\n if (!match) {\n return null;\n }\n\n const rootTag = match[1];\n if (!toolNames.includes(rootTag)) {\n return null;\n }\n\n // Keep leading indentation intact for YAML payloads.\n const body = match[2].trimEnd();\n if (body.trim().length === 0 || body.includes(`</${rootTag}>`)) {\n return null;\n }\n\n return `<${rootTag}>\\n${body}\\n</${rootTag}>`;\n}\n","import { escapeRegExp } from \"./regex\";\n\ninterface EarliestToolTag {\n index: number;\n name: string;\n selfClosing: boolean;\n tagLength: number;\n}\n\ninterface ToolTagMatch {\n isSelfClosing: boolean;\n tagLength: number;\n tagStart: number;\n}\n\nconst selfClosingTagCache = new Map<string, RegExp>();\n\nexport function 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\nexport function 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\nexport function 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\n if (openIdx === -1 && selfIdx === -1) {\n return null;\n }\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\nexport function findEarliestToolTag(\n buffer: string,\n toolNames: string[]\n): EarliestToolTag {\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 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\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 return {\n index: bestIndex,\n name: bestName,\n selfClosing: bestSelfClosing,\n tagLength: bestTagLength,\n };\n}\n","import type {\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n} from \"@ai-sdk/provider\";\nimport { escapeRegExp } from \"../utils/regex\";\nimport { findEarliestToolTag } from \"../utils/xml-tool-tag-scanner\";\nimport type { ParserOptions } from \"./protocol-interface\";\n\nexport interface StreamingToolCallState {\n emittedInput: string;\n lastProgressContentLength: number | null;\n lastProgressFullInput: string | null;\n lastProgressGtIndex: number | null;\n name: string;\n toolCallId: string;\n}\n\ntype StreamController =\n TransformStreamDefaultController<LanguageModelV3StreamPart>;\n\nexport type FlushTextFn = (controller: StreamController, text?: string) => void;\n\ntype HandleStreamingToolCallEnd = (params: {\n ctrl: StreamController;\n currentToolCall: StreamingToolCallState;\n flushText: FlushTextFn;\n options?: ParserOptions;\n parseOptions?: Record<string, unknown>;\n toolContent: string;\n tools: LanguageModelV3FunctionTool[];\n}) => void;\n\ninterface ProcessToolCallInBufferParams {\n buffer: string;\n controller: StreamController;\n currentToolCall: StreamingToolCallState;\n emitToolInputProgress: (\n controller: StreamController,\n currentToolCall: StreamingToolCallState,\n toolContent: string\n ) => void;\n flushText: FlushTextFn;\n handleStreamingToolCallEnd: HandleStreamingToolCallEnd;\n options?: ParserOptions;\n parseOptions?: Record<string, unknown>;\n setBuffer: (buffer: string) => void;\n tools: LanguageModelV3FunctionTool[];\n}\n\nfunction processToolCallInBuffer(params: ProcessToolCallInBufferParams): {\n buffer: string;\n currentToolCall: StreamingToolCallState | null;\n shouldBreak: boolean;\n} {\n const {\n buffer,\n currentToolCall,\n tools,\n options,\n controller,\n flushText,\n setBuffer,\n parseOptions,\n emitToolInputProgress,\n handleStreamingToolCallEnd,\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 emitToolInputProgress(controller, currentToolCall, buffer);\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 emitToolInputProgress(controller, currentToolCall, content);\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 controller: StreamController;\n emitToolInputStart: (\n controller: StreamController,\n toolName: string\n ) => StreamingToolCallState;\n findPotentialToolTagStart: (buffer: string, toolNames: string[]) => number;\n flushText: FlushTextFn;\n handleStreamingToolCallEnd: HandleStreamingToolCallEnd;\n options?: ParserOptions;\n parseOptions?: Record<string, unknown>;\n setBuffer: (buffer: string) => void;\n toolNames: string[];\n tools: LanguageModelV3FunctionTool[];\n}\n\nfunction processNoToolCallInBuffer(params: ProcessNoToolCallInBufferParams): {\n buffer: string;\n currentToolCall: StreamingToolCallState | 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 emitToolInputStart,\n findPotentialToolTagStart,\n handleStreamingToolCallEnd,\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 const currentToolCall = emitToolInputStart(controller, earliestToolName);\n handleStreamingToolCallEnd({\n toolContent: \"\",\n currentToolCall,\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: emitToolInputStart(controller, earliestToolName),\n shouldBreak: false,\n shouldContinue: true,\n };\n}\n\nexport function createProcessBufferHandler(options: {\n getBuffer: () => string;\n setBuffer: (buffer: string) => void;\n getCurrentToolCall: () => StreamingToolCallState | null;\n setCurrentToolCall: (toolCall: StreamingToolCallState | null) => void;\n tools: LanguageModelV3FunctionTool[];\n parserOptions: ParserOptions | undefined;\n toolNames: string[];\n flushText: FlushTextFn;\n parseOptions: Record<string, unknown> | undefined;\n emitToolInputProgress: (\n controller: StreamController,\n currentToolCall: StreamingToolCallState,\n toolContent: string\n ) => void;\n emitToolInputStart: (\n controller: StreamController,\n toolName: string\n ) => StreamingToolCallState;\n findPotentialToolTagStart: (buffer: string, toolNames: string[]) => number;\n handleStreamingToolCallEnd: HandleStreamingToolCallEnd;\n}): (controller: StreamController) => void {\n return (controller: StreamController) => {\n while (true) {\n const currentToolCall = options.getCurrentToolCall();\n if (currentToolCall) {\n const result = processToolCallInBuffer({\n buffer: options.getBuffer(),\n currentToolCall,\n tools: options.tools,\n options: options.parserOptions,\n controller,\n flushText: options.flushText,\n setBuffer: options.setBuffer,\n parseOptions: options.parseOptions,\n emitToolInputProgress: options.emitToolInputProgress,\n handleStreamingToolCallEnd: options.handleStreamingToolCallEnd,\n });\n options.setBuffer(result.buffer);\n options.setCurrentToolCall(result.currentToolCall);\n if (result.shouldBreak) {\n break;\n }\n } else {\n const result = processNoToolCallInBuffer({\n buffer: options.getBuffer(),\n toolNames: options.toolNames,\n controller,\n flushText: options.flushText,\n tools: options.tools,\n options: options.parserOptions,\n parseOptions: options.parseOptions,\n setBuffer: options.setBuffer,\n emitToolInputStart: options.emitToolInputStart,\n findPotentialToolTagStart: options.findPotentialToolTagStart,\n handleStreamingToolCallEnd: options.handleStreamingToolCallEnd,\n });\n options.setBuffer(result.buffer);\n options.setCurrentToolCall(result.currentToolCall);\n if (result.shouldBreak) {\n break;\n }\n if (result.shouldContinue) {\n continue;\n }\n break;\n }\n }\n };\n}\n","import type {\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport { parse, stringify } from \"../../rxml\";\nimport { generateToolCallId } from \"../utils/id\";\nimport {\n createFlushTextHandler,\n extractToolNames,\n formatToolsWithPromptTemplate,\n} from \"../utils/protocol-utils\";\nimport { escapeRegExp } from \"../utils/regex\";\nimport { NAME_CHAR_RE, WHITESPACE_REGEX } from \"../utils/regex-constants\";\nimport {\n emitFailedToolInputLifecycle,\n emitFinalizedToolInputLifecycle,\n emitToolInputProgressDelta,\n shouldEmitRawToolCallTextOnError,\n stringifyToolInputWithSchema,\n} from \"../utils/tool-input-streaming\";\nimport { tryRepairXmlSelfClosingRootWithBody } from \"../utils/xml-root-repair\";\nimport { findNextToolTag } from \"../utils/xml-tool-tag-scanner\";\nimport {\n createProcessBufferHandler,\n type FlushTextFn,\n type StreamingToolCallState,\n} from \"./morph-xml-stream-state-machine\";\nimport type { ParserOptions, TCMCoreProtocol } from \"./protocol-interface\";\n\nexport interface MorphXmlProtocolOptions {\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\nfunction getToolSchema(tools: LanguageModelV3FunctionTool[], toolName: string) {\n return tools.find((t) => t.name === toolName)?.inputSchema;\n}\n\ninterface ProcessToolCallParams {\n options?: ParserOptions;\n parseOptions?: Record<string, unknown>;\n processedElements: LanguageModelV3Content[];\n text: string;\n toolCall: {\n toolName: string;\n content: string;\n startIndex: number;\n endIndex: number;\n };\n tools: LanguageModelV3FunctionTool[];\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: generateToolCallId(),\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 ctrl: TransformStreamDefaultController<LanguageModelV3StreamPart>;\n currentToolCall: {\n name: string;\n toolCallId: string;\n emittedInput: string;\n };\n flushText: FlushTextFn;\n options?: ParserOptions;\n parseOptions?: Record<string, unknown>;\n toolContent: string;\n tools: LanguageModelV3FunctionTool[];\n}\n\nfunction parseXmlTagName(rawTagBody: string): string {\n let index = 0;\n while (\n index < rawTagBody.length &&\n WHITESPACE_REGEX.test(rawTagBody[index])\n ) {\n index += 1;\n }\n const nameStart = index;\n while (\n index < rawTagBody.length &&\n NAME_CHAR_RE.test(rawTagBody.charAt(index))\n ) {\n index += 1;\n }\n return rawTagBody.slice(nameStart, index);\n}\n\ntype XmlSpecialConsumeResult =\n | { kind: \"none\" }\n | { kind: \"incomplete\" }\n | { kind: \"consumed\"; nextPos: number };\n\nfunction consumeXmlSpecialSection(\n fragment: string,\n ltIndex: number\n): XmlSpecialConsumeResult {\n if (fragment.startsWith(\"<!--\", ltIndex)) {\n const commentEnd = fragment.indexOf(\"-->\", ltIndex + 4);\n return commentEnd === -1\n ? { kind: \"incomplete\" }\n : { kind: \"consumed\", nextPos: commentEnd + 3 };\n }\n if (fragment.startsWith(\"<![CDATA[\", ltIndex)) {\n const cdataEnd = fragment.indexOf(\"]]>\", ltIndex + 9);\n return cdataEnd === -1\n ? { kind: \"incomplete\" }\n : { kind: \"consumed\", nextPos: cdataEnd + 3 };\n }\n if (fragment.startsWith(\"<?\", ltIndex)) {\n const processingEnd = fragment.indexOf(\"?>\", ltIndex + 2);\n return processingEnd === -1\n ? { kind: \"incomplete\" }\n : { kind: \"consumed\", nextPos: processingEnd + 2 };\n }\n if (fragment.startsWith(\"<!\", ltIndex)) {\n const declarationEnd = fragment.indexOf(\">\", ltIndex + 2);\n return declarationEnd === -1\n ? { kind: \"incomplete\" }\n : { kind: \"consumed\", nextPos: declarationEnd + 1 };\n }\n return { kind: \"none\" };\n}\n\ntype XmlTagToken =\n | { kind: \"close\"; name: string; nextPos: number }\n | { kind: \"open\"; name: string; selfClosing: boolean; nextPos: number };\n\nfunction parseXmlTagToken(\n fragment: string,\n ltIndex: number\n): XmlTagToken | null {\n const gtIndex = fragment.indexOf(\">\", ltIndex + 1);\n if (gtIndex === -1) {\n return null;\n }\n\n const tagBody = fragment.slice(ltIndex + 1, gtIndex).trim();\n if (tagBody.length === 0) {\n return null;\n }\n\n if (tagBody.startsWith(\"/\")) {\n const closeName = parseXmlTagName(tagBody.slice(1));\n if (closeName.length === 0) {\n return null;\n }\n return { kind: \"close\", name: closeName, nextPos: gtIndex + 1 };\n }\n\n const selfClosing = tagBody.endsWith(\"/\");\n const openBody = selfClosing ? tagBody.slice(0, -1).trimEnd() : tagBody;\n const openName = parseXmlTagName(openBody);\n if (openName.length === 0) {\n return null;\n }\n return {\n kind: \"open\",\n name: openName,\n selfClosing,\n nextPos: gtIndex + 1,\n };\n}\n\nfunction analyzeXmlFragmentForProgress(\n fragment: string\n): { topLevelTagNames: string[] } | null {\n const stack: string[] = [];\n const topLevelTagNames: string[] = [];\n let position = 0;\n\n while (position < fragment.length) {\n const ltIndex = fragment.indexOf(\"<\", position);\n if (ltIndex === -1) {\n break;\n }\n\n const special = consumeXmlSpecialSection(fragment, ltIndex);\n if (special.kind === \"incomplete\") {\n return null;\n }\n if (special.kind === \"consumed\") {\n position = special.nextPos;\n continue;\n }\n\n const token = parseXmlTagToken(fragment, ltIndex);\n if (token === null) {\n return null;\n }\n\n if (token.kind === \"close\") {\n const openName = stack.pop();\n if (!openName || openName !== token.name) {\n return null;\n }\n position = token.nextPos;\n continue;\n }\n\n if (stack.length === 0) {\n topLevelTagNames.push(token.name);\n }\n if (!token.selfClosing) {\n stack.push(token.name);\n }\n position = token.nextPos;\n }\n\n if (stack.length > 0) {\n return null;\n }\n\n return { topLevelTagNames };\n}\n\ntype XmlTopLevelTextScanResult =\n | { kind: \"found\" }\n | { kind: \"invalid\" }\n | { kind: \"next\"; nextPos: number }\n | { kind: \"done\"; value: boolean };\n\nfunction scanXmlFragmentTopLevelTextStep(options: {\n fragment: string;\n position: number;\n stack: string[];\n}): XmlTopLevelTextScanResult {\n const { fragment, position, stack } = options;\n\n const ltIndex = fragment.indexOf(\"<\", position);\n if (ltIndex === -1) {\n const trailingText = fragment.slice(position);\n return {\n kind: \"done\",\n value: stack.length === 0 && trailingText.trim().length > 0,\n };\n }\n\n const textBetweenTags = fragment.slice(position, ltIndex);\n if (stack.length === 0 && textBetweenTags.trim().length > 0) {\n return { kind: \"found\" };\n }\n\n const special = consumeXmlSpecialSection(fragment, ltIndex);\n if (special.kind === \"incomplete\") {\n return { kind: \"invalid\" };\n }\n if (special.kind === \"consumed\") {\n return { kind: \"next\", nextPos: special.nextPos };\n }\n\n const token = parseXmlTagToken(fragment, ltIndex);\n if (token === null) {\n return { kind: \"invalid\" };\n }\n\n if (token.kind === \"close\") {\n const openName = stack.pop();\n if (!openName || openName !== token.name) {\n return { kind: \"invalid\" };\n }\n } else if (!token.selfClosing) {\n stack.push(token.name);\n }\n\n return { kind: \"next\", nextPos: token.nextPos };\n}\n\nfunction hasNonWhitespaceTopLevelText(fragment: string): boolean {\n if (!fragment.includes(\"<\")) {\n return fragment.trim().length > 0;\n }\n\n const stack: string[] = [];\n let position = 0;\n\n while (position < fragment.length) {\n const step = scanXmlFragmentTopLevelTextStep({ fragment, position, stack });\n if (step.kind === \"found\") {\n return true;\n }\n if (step.kind === \"invalid\") {\n return false;\n }\n if (step.kind === \"done\") {\n return step.value;\n }\n\n position = step.nextPos;\n }\n\n return false;\n}\n\nfunction getObjectSchemaPropertyNames(schema: unknown): Set<string> | null {\n if (!schema || typeof schema !== \"object\") {\n return null;\n }\n\n const schemaObject = schema as {\n type?: unknown;\n properties?: unknown;\n };\n const typeValue = schemaObject.type;\n if (typeValue != null) {\n const isObjectType =\n typeValue === \"object\" ||\n (Array.isArray(typeValue) && typeValue.includes(\"object\"));\n if (!isObjectType) {\n return null;\n }\n }\n if (!schemaObject.properties || typeof schemaObject.properties !== \"object\") {\n return new Set<string>();\n }\n\n return new Set(\n Object.keys(schemaObject.properties as Record<string, unknown>)\n );\n}\n\nfunction schemaAllowsArrayType(schema: unknown): boolean {\n if (!schema || typeof schema !== \"object\") {\n return false;\n }\n\n const schemaRecord = schema as Record<string, unknown>;\n const typeValue = schemaRecord.type;\n if (typeValue === \"array\") {\n return true;\n }\n if (Array.isArray(typeValue) && typeValue.includes(\"array\")) {\n return true;\n }\n\n const unions = [schemaRecord.anyOf, schemaRecord.oneOf, schemaRecord.allOf];\n for (const union of unions) {\n if (!Array.isArray(union)) {\n continue;\n }\n if (union.some((entry) => schemaAllowsArrayType(entry))) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction schemaAllowsStringType(schema: unknown): boolean {\n if (!schema || typeof schema !== \"object\") {\n return false;\n }\n\n const schemaRecord = schema as Record<string, unknown>;\n const typeValue = schemaRecord.type;\n if (typeValue === \"string\") {\n return true;\n }\n if (Array.isArray(typeValue) && typeValue.includes(\"string\")) {\n return true;\n }\n\n const unions = [schemaRecord.anyOf, schemaRecord.oneOf, schemaRecord.allOf];\n for (const union of unions) {\n if (!Array.isArray(union)) {\n continue;\n }\n if (union.some((entry) => schemaAllowsStringType(entry))) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getObjectSchemaStringPropertyNames(\n schema: unknown\n): Set<string> | null {\n const propertyNames = getObjectSchemaPropertyNames(schema);\n if (!propertyNames) {\n return null;\n }\n\n const out = new Set<string>();\n for (const name of propertyNames) {\n const property = getSchemaObjectProperty(schema, name);\n if (schemaAllowsStringType(property)) {\n out.add(name);\n }\n }\n return out;\n}\n\nfunction findTrailingUnclosedStringTag(options: {\n toolContent: string;\n stringPropertyNames: Set<string>;\n}): string | null {\n let bestName: string | null = null;\n let bestOpenIndex = -1;\n\n for (const name of options.stringPropertyNames) {\n const openPattern = new RegExp(\n `<${escapeRegExp(name)}(?:\\\\s[^>]*)?>`,\n \"gi\"\n );\n const closePattern = new RegExp(`</\\\\s*${escapeRegExp(name)}\\\\s*>`, \"gi\");\n\n let lastOpen = -1;\n for (const match of options.toolContent.matchAll(openPattern)) {\n const index = match.index;\n if (index !== undefined) {\n lastOpen = index;\n }\n }\n\n if (lastOpen === -1) {\n continue;\n }\n\n let lastClose = -1;\n for (const match of options.toolContent.matchAll(closePattern)) {\n const index = match.index;\n if (index !== undefined) {\n lastClose = index;\n }\n }\n\n if (lastOpen > lastClose && lastOpen > bestOpenIndex) {\n bestOpenIndex = lastOpen;\n bestName = name;\n }\n }\n\n return bestName;\n}\n\nfunction getSchemaObjectProperty(\n schema: unknown,\n propertyName: string\n): unknown | null {\n if (!schema || typeof schema !== \"object\") {\n return null;\n }\n\n const schemaObject = schema as Record<string, unknown>;\n const properties = schemaObject.properties;\n if (!properties || typeof properties !== \"object\") {\n return null;\n }\n\n const property = (properties as Record<string, unknown>)[propertyName];\n if (!property) {\n return null;\n }\n\n return property;\n}\n\nfunction isStableXmlProgressCandidate(options: {\n candidate: string;\n parsed: unknown;\n toolSchema: unknown;\n}): boolean {\n const { candidate, parsed, toolSchema } = options;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return false;\n }\n\n const structure = analyzeXmlFragmentForProgress(candidate);\n if (!structure) {\n return false;\n }\n\n const schemaProperties = getObjectSchemaPropertyNames(toolSchema);\n if (!schemaProperties || schemaProperties.size === 0) {\n return false;\n }\n\n const parsedObject = parsed as Record<string, unknown>;\n const uniqueTopLevelTags = new Set(structure.topLevelTagNames);\n for (const tagName of uniqueTopLevelTags) {\n if (!schemaProperties.has(tagName)) {\n continue;\n }\n const schemaProperty = getSchemaObjectProperty(toolSchema, tagName);\n if (\n schemaProperty &&\n schemaAllowsArrayType(schemaProperty) &&\n !Array.isArray(parsedObject[tagName])\n ) {\n return false;\n }\n }\n\n if (structure.topLevelTagNames.length === 1) {\n const onlyTopLevelTag = structure.topLevelTagNames[0];\n if (\n !schemaProperties ||\n schemaProperties.size === 0 ||\n !schemaProperties.has(onlyTopLevelTag)\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction parseXmlContentForStreamProgress({\n toolContent,\n toolName,\n toolSchema,\n parseOptions,\n tools,\n}: {\n toolContent: string;\n toolName: string;\n toolSchema: unknown;\n parseOptions?: Record<string, unknown>;\n tools: LanguageModelV3FunctionTool[];\n}): string | null {\n const tryParse = (content: string): unknown | null => {\n try {\n return parse(content, toolSchema, {\n ...(parseOptions ?? {}),\n repair: false,\n onError: undefined,\n });\n } catch {\n return null;\n }\n };\n\n const strictFull = tryParse(toolContent);\n if (\n strictFull !== null &&\n isStableXmlProgressCandidate({\n candidate: toolContent,\n parsed: strictFull,\n toolSchema,\n })\n ) {\n return stringifyToolInputWithSchema({\n toolName,\n args: strictFull,\n tools,\n });\n }\n\n const stringPropertyNames = getObjectSchemaStringPropertyNames(toolSchema);\n if (stringPropertyNames && stringPropertyNames.size > 0) {\n const trailingStringTag = findTrailingUnclosedStringTag({\n toolContent,\n stringPropertyNames,\n });\n if (trailingStringTag) {\n const repaired = `${toolContent}</${trailingStringTag}>`;\n const parsedRepaired = tryParse(repaired);\n if (parsedRepaired !== null) {\n return stringifyToolInputWithSchema({\n toolName,\n args: parsedRepaired,\n tools,\n });\n }\n }\n }\n\n let searchEnd = toolContent.length;\n while (searchEnd > 0) {\n const gtIndex = toolContent.lastIndexOf(\">\", searchEnd - 1);\n if (gtIndex === -1) {\n break;\n }\n const candidate = toolContent.slice(0, gtIndex + 1);\n if (!analyzeXmlFragmentForProgress(candidate)) {\n searchEnd = gtIndex;\n continue;\n }\n const parsedCandidate = tryParse(candidate);\n if (\n parsedCandidate !== null &&\n isStableXmlProgressCandidate({\n candidate,\n parsed: parsedCandidate,\n toolSchema,\n })\n ) {\n return stringifyToolInputWithSchema({\n toolName,\n args: parsedCandidate,\n tools,\n });\n }\n searchEnd = gtIndex;\n }\n\n return null;\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 const finalInput = stringifyToolInputWithSchema({\n toolName: currentToolCall.name,\n args: parsedResult,\n tools,\n });\n emitFinalizedToolInputLifecycle({\n controller: ctrl,\n id: currentToolCall.toolCallId,\n state: currentToolCall,\n toolName: currentToolCall.name,\n finalInput,\n onMismatch: options?.onError,\n });\n } catch (error) {\n const original = `<${currentToolCall.name}>${toolContent}</${currentToolCall.name}>`;\n const emitRawFallback = shouldEmitRawToolCallTextOnError(options);\n emitFailedToolInputLifecycle({\n controller: ctrl,\n id: currentToolCall.toolCallId,\n emitRawToolCallTextOnError: emitRawFallback,\n rawToolCallText: original,\n emitRawText: (rawText) => {\n flushText(ctrl, rawText);\n },\n });\n options?.onError?.(\"Could not process streaming XML tool call\", {\n toolCall: original,\n error,\n });\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\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\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\ninterface TokenHandlerResult {\n depth: number;\n lastCompleteEnd: number;\n shouldBreak: boolean;\n}\n\nfunction handleSpecialToken(depth: number): TokenHandlerResult {\n return { depth, lastCompleteEnd: -1, shouldBreak: false };\n}\n\nfunction handleOpenToken(\n token: { selfClosing: boolean; nextPos: number },\n depth: number,\n lastCompleteEnd: number\n): TokenHandlerResult {\n if (token.selfClosing) {\n return {\n depth,\n lastCompleteEnd: depth === 0 ? token.nextPos : lastCompleteEnd,\n shouldBreak: false,\n };\n }\n return { depth: depth + 1, lastCompleteEnd, shouldBreak: false };\n}\n\nfunction handleCloseToken(\n token: { nextPos: number },\n depth: number\n): TokenHandlerResult {\n if (depth <= 0) {\n return { depth, lastCompleteEnd: -1, shouldBreak: true };\n }\n const newDepth = depth - 1;\n return {\n depth: newDepth,\n lastCompleteEnd: newDepth === 0 ? token.nextPos : -1,\n shouldBreak: false,\n };\n}\n\nfunction findLinePrefixedXmlBodyEnd(\n text: string,\n bodyStartIndex: number\n): number {\n let cursor = bodyStartIndex;\n let depth = 0;\n let lastCompleteEnd = -1;\n\n while (cursor < text.length) {\n if (depth === 0) {\n cursor = consumeWhitespace(text, cursor);\n if (cursor >= text.length || text.charAt(cursor) !== \"<\") {\n break;\n }\n }\n\n const token = nextTagToken(text, cursor);\n if (token.kind === \"eof\") {\n break;\n }\n\n let result: TokenHandlerResult;\n if (token.kind === \"special\") {\n result = handleSpecialToken(depth);\n } else if (token.kind === \"open\") {\n result = handleOpenToken(token, depth, lastCompleteEnd);\n } else {\n result = handleCloseToken(token, depth);\n }\n\n depth = result.depth;\n if (result.lastCompleteEnd !== -1) {\n lastCompleteEnd = result.lastCompleteEnd;\n }\n if (result.shouldBreak) {\n break;\n }\n cursor = token.nextPos;\n }\n\n return lastCompleteEnd;\n}\n\nfunction findLinePrefixedToolCall(\n text: string,\n toolNames: string[]\n): {\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n} | null {\n let best: {\n toolName: string;\n startIndex: number;\n endIndex: number;\n content: string;\n segment: string;\n } | null = null;\n\n for (const toolName of toolNames) {\n const linePattern = new RegExp(\n `(^|\\\\n)[\\\\t ]*${escapeRegExp(toolName)}[\\\\t ]*:?[\\\\t ]*(?:\\\\r?\\\\n|$)`,\n \"g\"\n );\n\n let match = linePattern.exec(text);\n while (match !== null) {\n const prefix = match[1] ?? \"\";\n const startIndex = match.index + prefix.length;\n const contentStart = consumeWhitespace(text, linePattern.lastIndex);\n if (contentStart >= text.length || text.charAt(contentStart) !== \"<\") {\n match = linePattern.exec(text);\n continue;\n }\n const contentEnd = findLinePrefixedXmlBodyEnd(text, contentStart);\n if (contentEnd === -1 || contentEnd <= contentStart) {\n match = linePattern.exec(text);\n continue;\n }\n const content = text.slice(contentStart, contentEnd);\n\n const candidate = {\n toolName,\n startIndex,\n endIndex: contentEnd,\n content,\n segment: text.slice(startIndex, contentEnd),\n };\n if (best === null || candidate.startIndex < best.startIndex) {\n best = candidate;\n }\n break;\n }\n }\n\n return best;\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 findToolCallsWithFallbacks(\n text: string,\n toolNames: string[]\n): { parseText: string; toolCalls: ReturnType<typeof findToolCalls> } {\n let parseText = text;\n let toolCalls = findToolCalls(parseText, toolNames);\n\n if (toolCalls.length === 0) {\n const fallbackToolCall = findLinePrefixedToolCall(parseText, toolNames);\n if (fallbackToolCall !== null) {\n toolCalls.push(fallbackToolCall);\n }\n }\n\n if (toolCalls.length === 0) {\n const repaired = tryRepairXmlSelfClosingRootWithBody(parseText, toolNames);\n if (repaired) {\n const repairedCalls = findToolCalls(repaired, toolNames);\n if (repairedCalls.length > 0) {\n parseText = repaired;\n toolCalls = repairedCalls;\n }\n }\n }\n\n return { parseText, toolCalls };\n}\n\nexport const morphXmlProtocol = (\n protocolOptions?: MorphXmlProtocolOptions\n): TCMCoreProtocol => {\n const parseOptions = {\n repair: true,\n noChildNodes: [],\n ...(protocolOptions?.parseOptions ?? {}),\n };\n\n return {\n formatTools({ tools, toolSystemPromptTemplate }) {\n return formatToolsWithPromptTemplate({ tools, toolSystemPromptTemplate });\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 = extractToolNames(tools);\n if (toolNames.length === 0) {\n return [{ type: \"text\", text }];\n }\n\n const processedElements: LanguageModelV3Content[] = [];\n let currentIndex = 0;\n\n const { parseText, toolCalls } = findToolCallsWithFallbacks(\n text,\n toolNames\n );\n\n for (const tc of toolCalls) {\n if (tc.startIndex > currentIndex) {\n processedElements.push({\n type: \"text\",\n text: parseText.substring(currentIndex, tc.startIndex),\n });\n }\n processToolCall({\n toolCall: tc,\n tools,\n options,\n text: parseText,\n processedElements,\n parseOptions,\n });\n currentIndex = tc.endIndex;\n }\n\n if (currentIndex < parseText.length) {\n processedElements.push({\n type: \"text\",\n text: parseText.substring(currentIndex),\n });\n }\n\n return processedElements;\n },\n\n createStreamParser({ tools, options }) {\n const toolNames = extractToolNames(tools);\n let buffer = \"\";\n let currentToolCall: StreamingToolCallState | 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 emitToolInputStart = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolName: string\n ): StreamingToolCallState => {\n flushText(controller);\n const next: StreamingToolCallState = {\n name: toolName,\n toolCallId: generateToolCallId(),\n emittedInput: \"\",\n lastProgressContentLength: null,\n lastProgressGtIndex: null,\n lastProgressFullInput: null,\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: next.toolCallId,\n toolName,\n });\n return next;\n };\n\n const emitToolInputProgress = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolCall: StreamingToolCallState,\n toolContent: string\n ) => {\n const progressGtIndex = toolContent.lastIndexOf(\">\");\n const progressContentLength = toolContent.length;\n if (\n toolCall.lastProgressGtIndex === progressGtIndex &&\n toolCall.lastProgressContentLength === progressContentLength\n ) {\n const cached = toolCall.lastProgressFullInput;\n if (cached == null) {\n return;\n }\n if (cached === \"{}\" && toolContent.trim().length === 0) {\n return;\n }\n emitToolInputProgressDelta({\n controller,\n id: toolCall.toolCallId,\n state: toolCall,\n fullInput: cached,\n });\n return;\n }\n\n const toolSchema = getToolSchema(tools, toolCall.name);\n const fullInput = parseXmlContentForStreamProgress({\n toolContent,\n toolName: toolCall.name,\n toolSchema,\n parseOptions,\n tools,\n });\n toolCall.lastProgressGtIndex = progressGtIndex;\n toolCall.lastProgressContentLength = progressContentLength;\n toolCall.lastProgressFullInput = fullInput;\n if (fullInput == null) {\n return;\n }\n if (fullInput === \"{}\" && toolContent.trim().length === 0) {\n return;\n }\n emitToolInputProgressDelta({\n controller,\n id: toolCall.toolCallId,\n state: toolCall,\n fullInput,\n });\n };\n\n const finalizeUnclosedToolCall = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>\n ) => {\n if (!currentToolCall) {\n return;\n }\n\n emitToolInputProgress(controller, currentToolCall, buffer);\n const parseConfig = {\n ...parseOptions,\n onError:\n options?.onError ??\n (parseOptions as { onError?: ParserOptions[\"onError\"] } | undefined)\n ?.onError,\n };\n\n const toolSchema = getToolSchema(tools, currentToolCall.name);\n flushText(controller);\n try {\n if (hasNonWhitespaceTopLevelText(buffer)) {\n throw new Error(\n \"Cannot reconcile unclosed XML tool call with top-level plain text.\"\n );\n }\n const parsedResult = parse(buffer, toolSchema, parseConfig);\n const finalInput = stringifyToolInputWithSchema({\n toolName: currentToolCall.name,\n args: parsedResult,\n tools,\n });\n emitFinalizedToolInputLifecycle({\n controller,\n id: currentToolCall.toolCallId,\n state: currentToolCall,\n toolName: currentToolCall.name,\n finalInput,\n onMismatch: options?.onError,\n });\n } catch (error) {\n const unfinishedContent = `<${currentToolCall.name}>${buffer}`;\n const emitRawFallback = shouldEmitRawToolCallTextOnError(options);\n emitFailedToolInputLifecycle({\n controller,\n id: currentToolCall.toolCallId,\n emitRawToolCallTextOnError: emitRawFallback,\n rawToolCallText: unfinishedContent,\n emitRawText: (rawText) => {\n flushText(controller, rawText);\n },\n });\n options?.onError?.(\n \"Could not complete streaming XML tool call at finish.\",\n { toolCall: unfinishedContent, error }\n );\n }\n\n buffer = \"\";\n currentToolCall = null;\n };\n\n const processBuffer = createProcessBufferHandler({\n getBuffer: () => buffer,\n setBuffer: (newBuffer: string) => {\n buffer = newBuffer;\n },\n getCurrentToolCall: () => currentToolCall,\n setCurrentToolCall: (newToolCall: StreamingToolCallState | null) => {\n currentToolCall = newToolCall;\n },\n tools,\n parserOptions: options,\n toolNames,\n flushText,\n parseOptions,\n emitToolInputProgress,\n emitToolInputStart,\n findPotentialToolTagStart,\n handleStreamingToolCallEnd,\n });\n\n return new TransformStream({\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Stateful stream parsing requires branching over chunk lifecycle and parser states.\n transform(chunk, controller) {\n if (chunk.type === \"finish\") {\n if (currentToolCall) {\n finalizeUnclosedToolCall(controller);\n } else if (buffer) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n flushText(controller);\n controller.enqueue(chunk);\n return;\n }\n\n if (chunk.type !== \"text-delta\") {\n if (currentToolCall) {\n // Keep an open XML tool call alive across non-text stream chunks\n // so mixed-mode streams (e.g. reasoning) can continue to complete it.\n } else 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 finalizeUnclosedToolCall(controller);\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 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 /**\n * When true, stream parsers may emit malformed raw tool-call text as\n * `text-delta` fallback on parse failure. Defaults to false to avoid leaking\n * protocol/internal markup to end users.\n */\n emitRawToolCallTextOnError?: boolean;\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n}\n\nexport interface TCMProtocol {\n createStreamParser({\n tools,\n options,\n }: {\n tools: LanguageModelV3FunctionTool[];\n options?: ParserOptions;\n }): TransformStream<LanguageModelV3StreamPart, LanguageModelV3StreamPart>;\n\n extractToolCallSegments?: ({\n text,\n tools,\n }: {\n text: string;\n tools: LanguageModelV3FunctionTool[];\n }) => string[];\n\n formatToolCall(toolCall: LanguageModelV3ToolCall): string;\n formatTools({\n tools,\n toolSystemPromptTemplate,\n }: {\n tools: LanguageModelV3FunctionTool[];\n toolSystemPromptTemplate: (tools: LanguageModelV3FunctionTool[]) => string;\n }): string;\n\n parseGeneratedText({\n text,\n tools,\n options,\n }: {\n text: string;\n tools: LanguageModelV3FunctionTool[];\n options?: ParserOptions;\n }): LanguageModelV3Content[];\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 const isTCMProtocolFactory = isProtocolFactory;\n","export interface QwenStreamCallState {\n args: Record<string, unknown>;\n buffer: string;\n emittedInput: string;\n endTagName: string;\n hasEmittedStart: boolean;\n partialParam: { name: string; value: string } | null;\n raw: string;\n toolCallId: string;\n toolName: string | null;\n}\n\ntype QwenParamTagParseResult =\n | {\n kind: \"match\";\n start: number;\n end: number;\n name: string;\n value: string;\n }\n | {\n kind: \"partial\";\n start: number;\n openEnd: number | null;\n name?: string;\n value?: string;\n };\n\nfunction consumeToolNameTag(options: {\n callState: QwenStreamCallState;\n work: string;\n nameTagRe: RegExp;\n normalizeXmlTextValue: (value: string) => string;\n maybeEmitToolInputStart: () => void;\n}): string {\n if (options.callState.toolName) {\n return options.work;\n }\n\n const match = options.nameTagRe.exec(options.work);\n if (!match) {\n return options.work;\n }\n\n const value = options.normalizeXmlTextValue(match[2] ?? \"\");\n if (value.trim().length > 0) {\n options.callState.toolName = value;\n }\n\n const start = match.index ?? 0;\n const consumedLength = match[0]?.length ?? 0;\n const nextWork =\n options.work.slice(0, start) + options.work.slice(start + consumedLength);\n\n options.maybeEmitToolInputStart();\n return nextWork;\n}\n\nfunction consumeSingleParamTag(options: {\n allowEndOfString: boolean;\n callState: QwenStreamCallState;\n lastKept: number;\n lower: string;\n lt: number;\n work: string;\n parseParamTagAt: (\n text: string,\n lowerText: string,\n startIndex: number,\n options?: {\n allowEndOfString?: boolean;\n callEndTagNameLower?: string | null;\n }\n ) => QwenParamTagParseResult | null;\n mergeParamValue: (\n args: Record<string, unknown>,\n name: string,\n value: string\n ) => void;\n}): {\n keepSlice?: string;\n nextIndex: number;\n nextLastKept: number;\n shouldStop: boolean;\n} {\n const parsed = options.parseParamTagAt(\n options.work,\n options.lower,\n options.lt,\n {\n allowEndOfString: options.allowEndOfString,\n callEndTagNameLower: options.callState.endTagName,\n }\n );\n\n if (!parsed) {\n return {\n nextIndex: options.lt + 1,\n nextLastKept: options.lastKept,\n shouldStop: false,\n };\n }\n\n if (parsed.kind === \"partial\") {\n if (parsed.name !== undefined) {\n options.callState.partialParam = {\n name: parsed.name,\n value: parsed.value ?? \"\",\n };\n }\n return {\n nextIndex: options.lt + 1,\n nextLastKept: options.lastKept,\n shouldStop: true,\n };\n }\n\n options.callState.partialParam = null;\n options.mergeParamValue(options.callState.args, parsed.name, parsed.value);\n return {\n keepSlice: options.work.slice(options.lastKept, parsed.start),\n nextIndex: parsed.end,\n nextLastKept: parsed.end,\n shouldStop: false,\n };\n}\n\nfunction consumeParamTags(options: {\n callState: QwenStreamCallState;\n work: string;\n allowEndOfString: boolean;\n parseParamTagAt: (\n text: string,\n lowerText: string,\n startIndex: number,\n options?: {\n allowEndOfString?: boolean;\n callEndTagNameLower?: string | null;\n }\n ) => QwenParamTagParseResult | null;\n mergeParamValue: (\n args: Record<string, unknown>,\n name: string,\n value: string\n ) => void;\n maybeEmitToolInputStart: () => void;\n}): string {\n const lower = options.work.toLowerCase();\n let index = 0;\n let lastKept = 0;\n let pieces: string[] | null = null;\n\n while (true) {\n const lt = lower.indexOf(\"<\", index);\n if (lt === -1) {\n break;\n }\n\n const step = consumeSingleParamTag({\n allowEndOfString: options.allowEndOfString,\n callState: options.callState,\n lower,\n lt,\n work: options.work,\n lastKept,\n parseParamTagAt: options.parseParamTagAt,\n mergeParamValue: options.mergeParamValue,\n });\n\n if (step.keepSlice !== undefined) {\n pieces ??= [];\n pieces.push(step.keepSlice);\n }\n\n index = step.nextIndex;\n lastKept = step.nextLastKept;\n if (step.shouldStop) {\n break;\n }\n }\n\n options.maybeEmitToolInputStart();\n if (!pieces) {\n return options.work;\n }\n pieces.push(options.work.slice(lastKept));\n return pieces.join(\"\");\n}\n\nexport function parseCallContent(options: {\n callState: QwenStreamCallState;\n content: string;\n allowEndOfString: boolean;\n nameTagRe: RegExp;\n normalizeXmlTextValue: (value: string) => string;\n parseParamTagAt: (\n text: string,\n lowerText: string,\n startIndex: number,\n options?: {\n allowEndOfString?: boolean;\n callEndTagNameLower?: string | null;\n }\n ) => QwenParamTagParseResult | null;\n mergeParamValue: (\n args: Record<string, unknown>,\n name: string,\n value: string\n ) => void;\n maybeEmitToolInputStart: () => void;\n maybeEmitToolInputProgress: () => void;\n}): string {\n let work = options.content;\n work = consumeToolNameTag({\n callState: options.callState,\n work,\n nameTagRe: options.nameTagRe,\n normalizeXmlTextValue: options.normalizeXmlTextValue,\n maybeEmitToolInputStart: options.maybeEmitToolInputStart,\n });\n\n work = consumeParamTags({\n callState: options.callState,\n work,\n allowEndOfString: options.allowEndOfString,\n parseParamTagAt: options.parseParamTagAt,\n mergeParamValue: options.mergeParamValue,\n maybeEmitToolInputStart: options.maybeEmitToolInputStart,\n });\n\n options.maybeEmitToolInputStart();\n options.maybeEmitToolInputProgress();\n return work;\n}\n","import type {\n LanguageModelV3Content,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport {\n escapeXmlMinimalAttr,\n escapeXmlMinimalText,\n unescapeXml,\n} from \"../../rxml/utils/helpers\";\nimport { getPotentialStartIndex } from \"../utils/get-potential-start-index\";\nimport { generateToolCallId } from \"../utils/id\";\nimport {\n createFlushTextHandler,\n formatToolsWithPromptTemplate,\n} from \"../utils/protocol-utils\";\nimport { escapeRegExp } from \"../utils/regex\";\nimport {\n emitFailedToolInputLifecycle,\n emitFinalizedToolInputLifecycle,\n emitToolInputProgressDelta,\n shouldEmitRawToolCallTextOnError,\n stringifyToolInputWithSchema,\n} from \"../utils/tool-input-streaming\";\nimport type { TCMProtocol } from \"./protocol-interface\";\nimport type { QwenStreamCallState } from \"./qwen3coder-stream-call-content\";\nimport { parseCallContent } from \"./qwen3coder-stream-call-content\";\n\nconst TOOL_CALL_OPEN_RE = /<tool_call\\b[^>]*>/i;\nconst TOOL_CALL_CLOSE_RE = /<\\/tool_call\\s*>/i;\nconst TOOL_CALL_CLOSE_TRAILING_RE = /<\\/tool_call\\s*>\\s*$/i;\nconst TOOL_CALL_BLOCK_RE = /<tool_call\\b[^>]*>[\\s\\S]*?<\\/tool_call\\s*>/gi;\nconst LEADING_CALL_CLOSE_TAG_RE =\n /^\\s*<\\s*\\/\\s*(?:tool_call|function|call|tool|invoke)\\s*>/i;\n\nconst CALL_BLOCK_RE = /<(call|function|tool|invoke)\\b[^>]*>[\\s\\S]*?<\\/\\1\\s*>/gi;\n\nconst QWEN3CODER_TOOL_PARSER_PARAM_TAG_NAMES = new Set([\n \"parameter\",\n \"param\",\n \"argument\",\n \"arg\",\n]);\n\nconst QWEN3CODER_TOOL_PARSER_CALL_TAG_NAMES = new Set([\n \"function\",\n \"call\",\n \"tool\",\n \"invoke\",\n \"tool_call\",\n]);\n\nconst CALL_SHORTHAND_VALUE_RE =\n /^<\\s*(call|function|tool|invoke)\\b\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s>/]+))/i;\n\n// Non-global variants for streaming parsing (avoids `lastIndex` state).\nconst QWEN3CODER_TOOL_PARSER_STREAM_CALL_OPEN_START_RE =\n /<\\s*(?!\\/)\\s*(call|function|tool|invoke)\\b/i;\nconst QWEN3CODER_TOOL_PARSER_STREAM_CALL_OPEN_TAG_RE =\n /<\\s*(?!\\/)\\s*(call|function|tool|invoke)\\b[^>]*>/i;\nconst QWEN3CODER_TOOL_PARSER_STREAM_TOOL_CALL_CLOSE_TAG_RE =\n /<\\s*\\/\\s*tool_call\\s*>/i;\nconst QWEN3CODER_TOOL_PARSER_STREAM_NAME_OR_PARAM_SIGNAL_RE =\n /<\\s*(?!\\/)\\s*(name|tool_name|parameter|param|argument|arg)\\b/i;\nconst QWEN3CODER_TOOL_PARSER_STREAM_NAME_TAG_RE =\n /<\\s*(name|tool_name)\\b[^>]*>([\\s\\S]*?)<\\s*\\/\\s*\\1\\s*>/i;\nconst QWEN3CODER_TOOL_PARSER_STREAM_SELF_CLOSING_TAG_RE = /\\/\\s*>$/;\n\nfunction isAsciiWhitespace(ch: string): boolean {\n return ch === \" \" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\t\" || ch === \"\\f\";\n}\n\nfunction skipAsciiWhitespace(text: string, index: number): number {\n let i = index;\n while (i < text.length && isAsciiWhitespace(text[i] ?? \"\")) {\n i += 1;\n }\n return i;\n}\n\nfunction stripLeadingToolCallCloseTags(text: string): string {\n let out = text;\n while (true) {\n const start = skipAsciiWhitespace(out, 0);\n const trimmed = out.slice(start);\n const match = TOOL_CALL_CLOSE_RE.exec(trimmed);\n if (!match || match.index !== 0 || !match[0]) {\n return out;\n }\n out = out.slice(start + match[0].length);\n }\n}\n\nfunction stripTrailingToolCallCloseTags(text: string): string {\n let out = text;\n while (true) {\n const next = out.replace(TOOL_CALL_CLOSE_TRAILING_RE, \"\");\n if (next === out) {\n return out;\n }\n out = next;\n }\n}\n\nfunction isTagBoundaryChar(ch: string): boolean {\n return ch === \"\" || isAsciiWhitespace(ch) || ch === \">\" || ch === \"/\";\n}\n\nfunction findTagEndIndex(text: string, startIndex: number): number | null {\n let quote: '\"' | \"'\" | null = null;\n for (let i = startIndex; i < text.length; i += 1) {\n const ch = text[i] ?? \"\";\n if (quote) {\n if (ch === quote) {\n quote = null;\n }\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === \">\") {\n return i;\n }\n }\n return null;\n}\n\nfunction parseShorthandValue(\n openTag: string,\n tagNameLower: string\n): string | null {\n let i = 1;\n i = skipAsciiWhitespace(openTag, i);\n if (!openTag.toLowerCase().startsWith(tagNameLower, i)) {\n return null;\n }\n i += tagNameLower.length;\n i = skipAsciiWhitespace(openTag, i);\n if (openTag[i] !== \"=\") {\n return null;\n }\n i += 1;\n i = skipAsciiWhitespace(openTag, i);\n\n const quote = openTag[i] ?? \"\";\n if (quote === '\"' || quote === \"'\") {\n const end = openTag.indexOf(quote, i + 1);\n if (end === -1) {\n return null;\n }\n return openTag.slice(i + 1, end);\n }\n\n const start = i;\n while (i < openTag.length) {\n const ch = openTag[i] ?? \"\";\n if (isAsciiWhitespace(ch) || ch === \">\" || ch === \"/\") {\n break;\n }\n i += 1;\n }\n const value = openTag.slice(start, i);\n return value.length > 0 ? value : null;\n}\n\nfunction parseQwen3CoderToolParserParamName(\n openTag: string,\n tagNameLower: string\n): string | null {\n const shorthand = parseShorthandValue(openTag, tagNameLower);\n if (shorthand != null) {\n return unescapeXml(shorthand);\n }\n\n return getAttributeValue(openTag, \"name\");\n}\n\nfunction getCdataSectionNextIndex(\n textLower: string,\n startIndex: number\n): number | null {\n if (!textLower.startsWith(\"<![cdata[\", startIndex)) {\n return startIndex;\n }\n const cdataEnd = textLower.indexOf(\"]]>\", startIndex + \"<![cdata[\".length);\n if (cdataEnd === -1) {\n return null;\n }\n return cdataEnd + 3;\n}\n\nfunction parseMatchingTagHeader(\n textLower: string,\n lt: number,\n tagNameLower: string\n): { isClosing: boolean; afterName: number } | null {\n let i = skipAsciiWhitespace(textLower, lt + 1);\n const isClosing = textLower[i] === \"/\";\n if (isClosing) {\n i += 1;\n i = skipAsciiWhitespace(textLower, i);\n }\n if (!textLower.startsWith(tagNameLower, i)) {\n return null;\n }\n\n const afterName = i + tagNameLower.length;\n const boundary = textLower[afterName] ?? \"\";\n const validBoundary = isClosing\n ? isTagBoundaryChar(boundary)\n : isTagBoundaryChar(boundary) || boundary === \"=\";\n if (boundary && !validBoundary) {\n return null;\n }\n\n return { isClosing, afterName };\n}\n\nfunction isSelfClosingXmlTag(\n textLower: string,\n lt: number,\n gt: number\n): boolean {\n return textLower\n .slice(lt, gt + 1)\n .trimEnd()\n .endsWith(\"/>\");\n}\n\nfunction findClosingTagEnd(\n textLower: string,\n startIndex: number,\n tagNameLower: string\n): { start: number; end: number } | null {\n let depth = 1;\n let index = startIndex;\n while (true) {\n const lt = textLower.indexOf(\"<\", index);\n if (lt === -1) {\n return null;\n }\n\n const cdataNextIndex = getCdataSectionNextIndex(textLower, lt);\n if (cdataNextIndex == null) {\n return null;\n }\n if (cdataNextIndex !== lt) {\n index = cdataNextIndex;\n continue;\n }\n\n const header = parseMatchingTagHeader(textLower, lt, tagNameLower);\n if (!header) {\n index = lt + 1;\n continue;\n }\n\n const gt = textLower.indexOf(\">\", header.afterName);\n if (gt === -1) {\n return null;\n }\n\n if (header.isClosing) {\n depth -= 1;\n if (depth === 0) {\n return { start: lt, end: gt + 1 };\n }\n index = gt + 1;\n continue;\n }\n\n const isSelfClosing = isSelfClosingXmlTag(textLower, lt, gt);\n if (!isSelfClosing) {\n depth += 1;\n }\n index = gt + 1;\n }\n}\n\nfunction findClosingTagStartWithBoundary(\n lowerText: string,\n valueStart: number,\n tagNameLower: string,\n allowEndOfStringBoundary: boolean\n): number {\n const needle = `</${tagNameLower}`;\n let searchIndex = valueStart;\n\n while (searchIndex < lowerText.length) {\n const found = lowerText.indexOf(needle, searchIndex);\n if (found === -1) {\n return -1;\n }\n const nextChar = lowerText[found + needle.length] ?? \"\";\n if (nextChar === \"\" && !allowEndOfStringBoundary) {\n searchIndex = found + needle.length;\n continue;\n }\n if (isTagBoundaryChar(nextChar)) {\n return found;\n }\n searchIndex = found + needle.length;\n }\n\n return -1;\n}\n\nfunction toSupportedCallEndTagName(\n tagNameLower: string | null | undefined\n): string | null {\n const normalized = tagNameLower?.trim().toLowerCase() ?? \"\";\n if (!normalized) {\n return null;\n }\n return QWEN3CODER_TOOL_PARSER_CALL_TAG_NAMES.has(normalized)\n ? normalized\n : null;\n}\n\n// vLLM reference (Qwen3CoderToolParser): tolerate missing </parameter> by treating\n// the next <parameter=...> / </function> boundary as an implicit close.\n// https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/vllm/tool_parsers/qwen3coder_tool_parser.py#L65-L68\n// https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/vllm/tool_parsers/qwen3coder_tool_parser.py#L612-L636\n// https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/tests/tool_parsers/test_qwen3coder_tool_parser.py#L686-L764\nfunction findUnclosedParamBoundaryIndex(\n lowerText: string,\n valueStart: number,\n callEndTagNameLower: string | null,\n allowEndOfString: boolean\n): number | null {\n const normalizedCallEndTag = toSupportedCallEndTagName(callEndTagNameLower);\n const callCloseIndex = normalizedCallEndTag\n ? findClosingTagStartWithBoundary(\n lowerText,\n valueStart,\n normalizedCallEndTag,\n allowEndOfString\n )\n : findClosingTagStartWithBoundary(\n lowerText,\n valueStart,\n \"function\",\n allowEndOfString\n );\n\n const indices = [\n lowerText.indexOf(\"<parameter\", valueStart),\n lowerText.indexOf(\"<param\", valueStart),\n lowerText.indexOf(\"<argument\", valueStart),\n lowerText.indexOf(\"<arg\", valueStart),\n callCloseIndex,\n findClosingTagStartWithBoundary(\n lowerText,\n valueStart,\n \"tool_call\",\n allowEndOfString\n ),\n lowerText.indexOf(\"<function\", valueStart),\n ].filter((index) => index !== -1);\n\n if (indices.length === 0) {\n return null;\n }\n return Math.min(...indices);\n}\n\ntype Qwen3CoderToolParserParamTagParseResult =\n | {\n kind: \"match\";\n start: number;\n end: number;\n name: string;\n value: string;\n }\n | {\n kind: \"partial\";\n start: number;\n openEnd: number | null;\n name?: string;\n value?: string;\n };\n\nfunction parseQwen3CoderToolParserParamTagNameLower(\n lowerText: string,\n startIndex: number\n): { kind: \"match\"; tagNameLower: string } | { kind: \"partial\" } | null {\n let i = skipAsciiWhitespace(lowerText, startIndex + 1);\n if (i >= lowerText.length) {\n return { kind: \"partial\" };\n }\n if (lowerText[i] === \"/\") {\n return null;\n }\n\n const nameStart = i;\n while (i < lowerText.length) {\n const ch = lowerText[i] ?? \"\";\n if (isAsciiWhitespace(ch) || ch === \">\" || ch === \"/\" || ch === \"=\") {\n break;\n }\n i += 1;\n }\n\n const tagNameLower = lowerText.slice(nameStart, i);\n if (!QWEN3CODER_TOOL_PARSER_PARAM_TAG_NAMES.has(tagNameLower)) {\n return null;\n }\n return { kind: \"match\", tagNameLower };\n}\n\nfunction parseQwen3CoderToolParserUnclosedParamValue(options: {\n text: string;\n lowerText: string;\n startIndex: number;\n openEnd: number;\n paramName: string;\n allowEndOfString: boolean;\n callEndTagNameLower?: string | null;\n}): Qwen3CoderToolParserParamTagParseResult {\n const valueStart = options.openEnd + 1;\n const boundaryIndex = findUnclosedParamBoundaryIndex(\n options.lowerText,\n valueStart,\n options.callEndTagNameLower ?? null,\n options.allowEndOfString\n );\n if (boundaryIndex == null) {\n if (!options.allowEndOfString) {\n const rawProgressValue = options.text.slice(valueStart);\n return {\n kind: \"partial\",\n start: options.startIndex,\n openEnd: options.openEnd,\n name: options.paramName,\n value: rawProgressValue ? normalizeXmlTextValue(rawProgressValue) : \"\",\n };\n }\n\n const rawValue = options.text.slice(valueStart);\n return {\n kind: \"match\",\n start: options.startIndex,\n end: options.text.length,\n name: options.paramName,\n value: rawValue ? normalizeXmlTextValue(rawValue) : \"\",\n };\n }\n\n const rawValue = options.text.slice(valueStart, boundaryIndex);\n return {\n kind: \"match\",\n start: options.startIndex,\n end: boundaryIndex,\n name: options.paramName,\n value: rawValue ? normalizeXmlTextValue(rawValue) : \"\",\n };\n}\n\nfunction parseQwen3CoderToolParserParamTagAt(\n text: string,\n lowerText: string,\n startIndex: number,\n options?: {\n allowEndOfString?: boolean;\n callEndTagNameLower?: string | null;\n }\n): Qwen3CoderToolParserParamTagParseResult | null {\n const tagNameParse = parseQwen3CoderToolParserParamTagNameLower(\n lowerText,\n startIndex\n );\n if (!tagNameParse) {\n return null;\n }\n if (tagNameParse.kind === \"partial\") {\n return { kind: \"partial\", start: startIndex, openEnd: null };\n }\n\n const tagNameLower = tagNameParse.tagNameLower;\n\n const openEnd = findTagEndIndex(text, startIndex);\n if (openEnd == null) {\n return { kind: \"partial\", start: startIndex, openEnd: null };\n }\n\n const openTag = text.slice(startIndex, openEnd + 1);\n const paramNameRaw = parseQwen3CoderToolParserParamName(\n openTag,\n tagNameLower\n );\n const paramName = paramNameRaw?.trim() ?? \"\";\n if (paramName.length === 0) {\n return null;\n }\n\n const selfClosing = openTag.trimEnd().endsWith(\"/>\");\n if (selfClosing) {\n return {\n kind: \"match\",\n start: startIndex,\n end: openEnd + 1,\n name: paramName,\n value: \"\",\n };\n }\n\n const valueStart = openEnd + 1;\n const close = findClosingTagEnd(lowerText, valueStart, tagNameLower);\n if (!close) {\n return parseQwen3CoderToolParserUnclosedParamValue({\n text,\n lowerText,\n startIndex,\n openEnd,\n paramName,\n allowEndOfString: options?.allowEndOfString === true,\n callEndTagNameLower: options?.callEndTagNameLower,\n });\n }\n\n const rawValue = text.slice(openEnd + 1, close.start);\n return {\n kind: \"match\",\n start: startIndex,\n end: close.end,\n name: paramName,\n value: rawValue ? normalizeXmlTextValue(rawValue) : \"\",\n };\n}\n\nfunction normalizeXmlTextValue(raw: string): string {\n let out = raw.trim();\n if (out.startsWith(\"<![CDATA[\") && out.endsWith(\"]]>\")) {\n out = out.slice(\"<![CDATA[\".length, -\"]]>\".length).trim();\n }\n return unescapeXml(out);\n}\n\nfunction getOpeningTag(xml: string): string | null {\n const gt = xml.indexOf(\">\");\n if (gt === -1) {\n return null;\n }\n return xml.slice(0, gt + 1);\n}\n\nconst attrValueRegExpCache = new Map<string, RegExp>();\n\nfunction getAttributeValue(openTag: string, attrName: string): string | null {\n let re = attrValueRegExpCache.get(attrName);\n if (!re) {\n // Since the regex has no 'g' flag, re.exec resets automatically — safe.\n re = new RegExp(\n `\\\\b${escapeRegExp(attrName)}\\\\s*=\\\\s*([\"'])([\\\\s\\\\S]*?)\\\\1`,\n \"i\"\n );\n attrValueRegExpCache.set(attrName, re);\n }\n const match = re.exec(openTag);\n if (!match) {\n return null;\n }\n return unescapeXml(match[2] ?? \"\");\n}\n\nfunction getShorthandValue(openTag: string): string | null {\n const match = CALL_SHORTHAND_VALUE_RE.exec(openTag);\n if (!match) {\n return null;\n }\n const value = match[2] ?? match[3] ?? match[4];\n if (!value) {\n return null;\n }\n return unescapeXml(value);\n}\n\nfunction extractFirstTagText(xml: string, tagName: string): string | null {\n const lower = xml.toLowerCase();\n const tagLower = tagName.toLowerCase();\n\n let index = 0;\n while (true) {\n const lt = lower.indexOf(\"<\", index);\n if (lt === -1) {\n return null;\n }\n\n const i = skipAsciiWhitespace(lower, lt + 1);\n if (i >= lower.length || lower[i] === \"/\") {\n index = lt + 1;\n continue;\n }\n\n if (!lower.startsWith(tagLower, i)) {\n index = lt + 1;\n continue;\n }\n\n const afterName = i + tagLower.length;\n const boundary = lower[afterName] ?? \"\";\n if (boundary && !isTagBoundaryChar(boundary)) {\n index = lt + 1;\n continue;\n }\n\n const openEnd = findTagEndIndex(xml, lt);\n if (openEnd == null) {\n return null;\n }\n const contentStart = openEnd + 1;\n const close = findClosingTagEnd(lower, contentStart, tagLower);\n if (!close) {\n return null;\n }\n return normalizeXmlTextValue(xml.slice(contentStart, close.start));\n }\n}\n\nfunction extractToolCallInnerXml(segment: string): {\n inner: string;\n outerOpenTag: string;\n} | null {\n const openMatch = TOOL_CALL_OPEN_RE.exec(segment);\n const closeMatch = TOOL_CALL_CLOSE_RE.exec(segment);\n if (!(openMatch && closeMatch)) {\n return null;\n }\n\n const openIndex = openMatch.index;\n const openTag = openMatch[0];\n const openEnd = openIndex + openTag.length;\n\n // Prefer the last closing tag to avoid early matches if nested content\n // includes a literal \"</tool_call>\" string.\n const closeIndex = segment.toLowerCase().lastIndexOf(\"</tool_call\");\n if (closeIndex === -1) {\n return null;\n }\n const closeGt = segment.indexOf(\">\", closeIndex);\n if (closeGt === -1) {\n return null;\n }\n\n return {\n outerOpenTag: openTag,\n inner: segment.slice(openEnd, closeIndex),\n };\n}\n\nfunction mergeParamValue(\n args: Record<string, unknown>,\n key: string,\n value: string\n): void {\n const existing = args[key];\n if (existing === undefined) {\n args[key] = value;\n return;\n }\n if (Array.isArray(existing)) {\n existing.push(value);\n return;\n }\n args[key] = [existing, value];\n}\n\nfunction mergeArgsWithPartialParam(\n args: Record<string, unknown>,\n partialParam: { name: string; value: string } | null\n): Record<string, unknown> {\n if (!partialParam) {\n return args;\n }\n\n const existing = args[partialParam.name];\n if (existing === undefined) {\n return {\n ...args,\n [partialParam.name]: partialParam.value,\n };\n }\n\n if (Array.isArray(existing)) {\n return {\n ...args,\n [partialParam.name]: [...existing, partialParam.value],\n };\n }\n\n return {\n ...args,\n [partialParam.name]: [existing, partialParam.value],\n };\n}\n\nfunction extractParameters(\n xml: string,\n options?: {\n callEndTagNameLower?: string | null;\n }\n): Record<string, unknown> {\n const args: Record<string, unknown> = {};\n\n const lower = xml.toLowerCase();\n let index = 0;\n while (true) {\n const lt = lower.indexOf(\"<\", index);\n if (lt === -1) {\n break;\n }\n const parsed = parseQwen3CoderToolParserParamTagAt(xml, lower, lt, {\n allowEndOfString: true,\n callEndTagNameLower: options?.callEndTagNameLower,\n });\n if (!parsed) {\n index = lt + 1;\n continue;\n }\n\n if (parsed.kind === \"match\") {\n mergeParamValue(args, parsed.name, parsed.value);\n index = parsed.end;\n continue;\n }\n\n index = (parsed.openEnd ?? lt) + 1;\n }\n\n return args;\n}\n\nfunction parseSingleFunctionCallXml(\n xml: string,\n fallbackToolName: string | null\n): { toolName: string; args: Record<string, unknown> } | null {\n const openingTag = getOpeningTag(xml);\n const toolNameAttr = openingTag\n ? getAttributeValue(openingTag, \"name\")\n : null;\n const shorthandName = openingTag ? getShorthandValue(openingTag) : null;\n const toolName =\n toolNameAttr ??\n shorthandName ??\n extractFirstTagText(xml, \"name\") ??\n extractFirstTagText(xml, \"tool_name\") ??\n fallbackToolName;\n const callEndTagNameLower = toSupportedCallEndTagName(\n openingTag ? getOpenTagNameLower(openingTag) : null\n );\n\n if (!toolName || toolName.trim().length === 0) {\n return null;\n }\n\n return {\n toolName,\n args: extractParameters(xml, { callEndTagNameLower }),\n };\n}\n\nfunction findImplicitCallOpenIndices(lowerText: string): number[] {\n const indices: number[] = [];\n let index = 0;\n while (true) {\n const lt = lowerText.indexOf(\"<\", index);\n if (lt === -1) {\n break;\n }\n\n const i = skipAsciiWhitespace(lowerText, lt + 1);\n if (i >= lowerText.length) {\n break;\n }\n if (lowerText[i] === \"/\") {\n index = lt + 1;\n continue;\n }\n\n const tagNames = [\"call\", \"function\", \"tool\", \"invoke\"] as const;\n for (const tagName of tagNames) {\n if (!lowerText.startsWith(tagName, i)) {\n continue;\n }\n const after = i + tagName.length;\n const boundary = lowerText[after] ?? \"\";\n if (boundary && !isTagBoundaryChar(boundary) && boundary !== \"=\") {\n continue;\n }\n indices.push(lt);\n break;\n }\n\n index = lt + 1;\n }\n return indices;\n}\n\nfunction splitImplicitCallBlocks(xml: string): string[] {\n const lower = xml.toLowerCase();\n const starts = findImplicitCallOpenIndices(lower);\n if (starts.length === 0) {\n return [];\n }\n\n const blocks: string[] = [];\n for (let i = 0; i < starts.length; i += 1) {\n const start = starts[i] ?? 0;\n const end = starts[i + 1] ?? xml.length;\n blocks.push(xml.slice(start, end));\n }\n return blocks;\n}\n\nfunction stripLeadingCallCloseTags(text: string): string {\n let out = text;\n while (true) {\n const match = LEADING_CALL_CLOSE_TAG_RE.exec(out);\n if (!match) {\n return out;\n }\n out = out.slice(match[0].length);\n }\n}\n\nfunction getOpenTagNameLower(openTag: string): string | null {\n const lowerOpenTag = openTag.toLowerCase();\n const lt = lowerOpenTag.indexOf(\"<\");\n if (lt === -1) {\n return null;\n }\n\n let i = skipAsciiWhitespace(lowerOpenTag, lt + 1);\n if (i >= lowerOpenTag.length || lowerOpenTag[i] === \"/\") {\n return null;\n }\n\n const start = i;\n while (i < lowerOpenTag.length) {\n const ch = lowerOpenTag[i] ?? \"\";\n if (isAsciiWhitespace(ch) || ch === \">\" || ch === \"/\" || ch === \"=\") {\n break;\n }\n i += 1;\n }\n\n const tagName = lowerOpenTag.slice(start, i);\n return tagName.length > 0 ? tagName : null;\n}\n\nfunction splitImplicitCallAndTail(callBlock: string): {\n callContent: string;\n trailingText: string;\n} {\n const openingTag = getOpeningTag(callBlock);\n const openingTagName = toSupportedCallEndTagName(\n openingTag ? getOpenTagNameLower(openingTag) : null\n );\n const lowerCallBlock = callBlock.toLowerCase();\n let consumed = 0;\n\n if (openingTag) {\n consumed = openingTag.length;\n if (openingTagName) {\n const close = findClosingTagEnd(lowerCallBlock, consumed, openingTagName);\n if (close) {\n consumed = Math.max(consumed, close.end);\n }\n }\n }\n\n let index = 0;\n while (true) {\n const lt = lowerCallBlock.indexOf(\"<\", index);\n if (lt === -1) {\n break;\n }\n\n const parsed = parseQwen3CoderToolParserParamTagAt(\n callBlock,\n lowerCallBlock,\n lt,\n {\n allowEndOfString: true,\n callEndTagNameLower: openingTagName,\n }\n );\n if (!parsed) {\n index = lt + 1;\n continue;\n }\n\n if (parsed.kind === \"partial\") {\n index = (parsed.openEnd ?? lt) + 1;\n continue;\n }\n\n consumed = Math.max(consumed, parsed.end);\n index = parsed.end;\n }\n\n const clamped = Math.max(0, Math.min(consumed, callBlock.length));\n return {\n callContent: callBlock.slice(0, clamped),\n trailingText: callBlock.slice(clamped),\n };\n}\n\nfunction parseQwen3CoderToolParserCallBlocks(\n blocks: string[],\n outerNameAttr: string | null\n): Array<{ toolName: string; args: Record<string, unknown> }> | null {\n const calls: Array<{ toolName: string; args: Record<string, unknown> }> = [];\n for (const block of blocks) {\n const parsed = parseSingleFunctionCallXml(block, outerNameAttr);\n if (!parsed) {\n return null;\n }\n calls.push(parsed);\n }\n return calls;\n}\n\nfunction parseQwen3CoderToolParserClosedMatches(\n inner: string,\n outerNameAttr: string | null\n):\n | Array<{ toolName: string; args: Record<string, unknown> }>\n | null\n | undefined {\n const callBlockMatches = Array.from(inner.matchAll(CALL_BLOCK_RE));\n if (callBlockMatches.length === 0) {\n return undefined;\n }\n\n const closedBlocks: string[] = [];\n let lastClosedEnd = 0;\n for (const match of callBlockMatches) {\n const callBlock = match[0] ?? \"\";\n const startIndex = match.index ?? -1;\n if (!callBlock || startIndex < 0) {\n continue;\n }\n closedBlocks.push(callBlock);\n lastClosedEnd = startIndex + callBlock.length;\n }\n\n const closedCalls = parseQwen3CoderToolParserCallBlocks(\n closedBlocks,\n outerNameAttr\n );\n if (!closedCalls) {\n return null;\n }\n\n const trailingInner = inner.slice(lastClosedEnd);\n if (trailingInner.trim().length === 0) {\n return closedCalls;\n }\n\n const trailingBlocks = splitImplicitCallBlocks(trailingInner).filter(\n (b) => b.trim().length > 0\n );\n if (trailingBlocks.length === 0) {\n return closedCalls;\n }\n\n const trailingCalls = parseQwen3CoderToolParserCallBlocks(\n trailingBlocks,\n outerNameAttr\n );\n if (!trailingCalls) {\n return closedCalls;\n }\n\n return closedCalls.concat(trailingCalls);\n}\n\nfunction parseQwen3CoderToolParserToolCallSegment(\n segment: string\n): Array<{ toolName: string; args: Record<string, unknown> }> | null {\n const extracted = extractToolCallInnerXml(segment);\n if (!extracted) {\n return null;\n }\n\n const { inner, outerOpenTag } = extracted;\n const outerNameAttr = getAttributeValue(outerOpenTag, \"name\");\n\n const closedCalls = parseQwen3CoderToolParserClosedMatches(\n inner,\n outerNameAttr\n );\n if (closedCalls) {\n return closedCalls;\n }\n if (closedCalls === null) {\n return null;\n }\n\n // Some models omit the closing </function> and go straight to </tool_call>.\n // When that happens, CALL_BLOCK_RE matches nothing; fall back to splitting\n // by call-opening tags (<function=...>, etc.) and treating the next opening\n // tag or end-of-container as an implicit terminator.\n const implicitBlocks = splitImplicitCallBlocks(inner).filter(\n (b) => b.trim().length > 0\n );\n if (implicitBlocks.length > 0) {\n return parseQwen3CoderToolParserCallBlocks(implicitBlocks, outerNameAttr);\n }\n\n const single =\n parseSingleFunctionCallXml(inner, outerNameAttr) ??\n parseSingleFunctionCallXml(segment, outerNameAttr);\n if (!single) {\n return null;\n }\n return [single];\n}\n\ntype StreamController =\n TransformStreamDefaultController<LanguageModelV3StreamPart>;\n\nfunction parseToolCallInput(input: string | null | undefined): unknown {\n if (input == null) {\n return {};\n }\n try {\n return JSON.parse(input);\n } catch {\n return input;\n }\n}\n\nfunction toQwen3CoderToolParserParamText(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value === null) {\n return \"None\";\n }\n if (typeof value === \"boolean\") {\n return value ? \"True\" : \"False\";\n }\n if (value === undefined) {\n return \"\";\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nfunction appendQwen3CoderToolParserParameter(\n lines: string[],\n key: string,\n value: unknown\n): void {\n const nameAttr = escapeXmlMinimalAttr(key, '\"');\n const text = escapeXmlMinimalText(toQwen3CoderToolParserParamText(value));\n lines.push(` <parameter=\"${nameAttr}\">${text}</parameter>`);\n}\n\nfunction appendQwen3CoderToolParserArgs(lines: string[], args: unknown): void {\n if (args && typeof args === \"object\" && !Array.isArray(args)) {\n for (const [key, value] of Object.entries(args)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n appendQwen3CoderToolParserParameter(lines, key, item);\n }\n } else {\n appendQwen3CoderToolParserParameter(lines, key, value);\n }\n }\n return;\n }\n\n if (args !== undefined && args !== null && args !== \"\") {\n appendQwen3CoderToolParserParameter(lines, \"input\", args);\n }\n}\n\nexport const qwen3CoderProtocol = (): TCMProtocol => ({\n formatTools({ tools, toolSystemPromptTemplate }) {\n return formatToolsWithPromptTemplate({ tools, toolSystemPromptTemplate });\n },\n\n formatToolCall(toolCall: LanguageModelV3ToolCall): string {\n const args = parseToolCallInput(toolCall.input);\n const lines: string[] = [\"<tool_call>\"];\n lines.push(\n ` <function=\"${escapeXmlMinimalAttr(toolCall.toolName, '\"')}\">`\n );\n appendQwen3CoderToolParserArgs(lines, args);\n lines.push(\" </function>\");\n lines.push(\"</tool_call>\");\n return lines.join(\"\\n\");\n },\n\n parseGeneratedText({ text, tools, options }) {\n const processedElements: LanguageModelV3Content[] = [];\n\n const emitToolCalls = (\n calls: Array<{ toolName: string; args: Record<string, unknown> }>\n ) => {\n for (const call of calls) {\n processedElements.push({\n type: \"tool-call\",\n toolCallId: generateToolCallId(),\n toolName: call.toolName,\n input: stringifyToolInputWithSchema({\n tools,\n toolName: call.toolName,\n args: call.args,\n }),\n });\n }\n };\n\n const pushText = (value: string) => {\n if (value.length === 0) {\n return;\n }\n processedElements.push({ type: \"text\", text: value });\n };\n\n const tryEmitToolCallSegment = (\n segment: string,\n fallbackText: string = segment\n ): boolean => {\n const parsedCalls = parseQwen3CoderToolParserToolCallSegment(segment);\n if (!parsedCalls) {\n options?.onError?.(\n \"Could not process Qwen3CoderToolParser XML tool call; keeping original text.\",\n { toolCall: fallbackText }\n );\n processedElements.push({ type: \"text\", text: fallbackText });\n return false;\n }\n emitToolCalls(parsedCalls);\n return true;\n };\n\n const emitWrapperlessCallParseFailureAsText = (raw: string) => {\n options?.onError?.(\n \"Could not process Qwen3CoderToolParser <function> call; keeping original text.\",\n { toolCall: raw }\n );\n processedElements.push({ type: \"text\", text: raw });\n };\n\n const tryParseCallBlocksWithoutWrapperByImplicitStarts = (\n sourceText: string,\n starts: number[]\n ): boolean => {\n let index = 0;\n for (let i = 0; i < starts.length; i += 1) {\n const startIndex = starts[i] ?? -1;\n if (startIndex < 0) {\n continue;\n }\n const endIndex = starts[i + 1] ?? sourceText.length;\n\n pushText(\n stripTrailingToolCallCloseTags(\n stripLeadingToolCallCloseTags(sourceText.slice(index, startIndex))\n )\n );\n\n const full = sourceText.slice(startIndex, endIndex);\n const { callContent, trailingText } = splitImplicitCallAndTail(full);\n const parsed = parseSingleFunctionCallXml(callContent, null);\n if (parsed) {\n emitToolCalls([parsed]);\n pushText(\n stripTrailingToolCallCloseTags(\n stripLeadingToolCallCloseTags(trailingText)\n )\n );\n } else {\n emitWrapperlessCallParseFailureAsText(full);\n }\n\n index = endIndex;\n }\n\n pushText(\n stripTrailingToolCallCloseTags(\n stripLeadingToolCallCloseTags(sourceText.slice(index))\n )\n );\n return true;\n };\n\n const tryParseCallBlocksWithoutWrapperByMatches = (\n sourceText: string,\n matches: RegExpMatchArray[]\n ): boolean => {\n let index = 0;\n for (const match of matches) {\n const full = match[0];\n const startIndex = match.index ?? -1;\n if (!full || startIndex < 0) {\n continue;\n }\n\n pushText(\n stripTrailingToolCallCloseTags(\n stripLeadingToolCallCloseTags(sourceText.slice(index, startIndex))\n )\n );\n\n const parsed = parseSingleFunctionCallXml(full, null);\n if (parsed) {\n emitToolCalls([parsed]);\n } else {\n emitWrapperlessCallParseFailureAsText(full);\n }\n index = startIndex + full.length;\n }\n\n const trailing = sourceText.slice(index);\n const trailingStarts = findImplicitCallOpenIndices(\n trailing.toLowerCase()\n );\n if (trailingStarts.length > 0) {\n return tryParseCallBlocksWithoutWrapperByImplicitStarts(\n trailing,\n trailingStarts\n );\n }\n\n pushText(\n stripTrailingToolCallCloseTags(stripLeadingToolCallCloseTags(trailing))\n );\n return true;\n };\n\n // vLLM reference (Qwen3CoderToolParser): fallback extraction still attempts to\n // parse when XML wrapper tags are missing (raw output starts with <function=...>).\n // https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/vllm/tool_parsers/qwen3coder_tool_parser.py#L271-L289\n // https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/tests/tool_parsers/test_qwen3coder_tool_parser.py#L356-L377\n const tryParseCallBlocksWithoutWrapperText = (\n sourceText: string\n ): boolean => {\n const matches = Array.from(sourceText.matchAll(CALL_BLOCK_RE));\n if (matches.length > 0) {\n return tryParseCallBlocksWithoutWrapperByMatches(sourceText, matches);\n }\n\n const starts = findImplicitCallOpenIndices(sourceText.toLowerCase());\n if (starts.length === 0) {\n return false;\n }\n return tryParseCallBlocksWithoutWrapperByImplicitStarts(\n sourceText,\n starts\n );\n };\n\n const pushTextOrParseWrapperlessCalls = (segment: string) => {\n if (segment.length === 0) {\n return;\n }\n if (!tryParseCallBlocksWithoutWrapperText(segment)) {\n pushText(segment);\n }\n };\n\n // vLLM reference (Qwen3CoderToolParser): allow trailing, incomplete <tool_call>\n // blocks (\"<tool_call>...$\"), and still attempt best-effort parsing.\n // https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/vllm/tool_parsers/qwen3coder_tool_parser.py#L55-L61\n const handleCompleteToolCallRemainder = (remainder: string) => {\n if (!remainder) {\n return;\n }\n const lowerRemainder = remainder.toLowerCase();\n const trailingIndex = lowerRemainder.indexOf(\"<tool_call\");\n if (trailingIndex === -1) {\n pushTextOrParseWrapperlessCalls(remainder);\n return;\n }\n\n pushTextOrParseWrapperlessCalls(remainder.slice(0, trailingIndex));\n const trailing = remainder.slice(trailingIndex);\n const synthetic = TOOL_CALL_CLOSE_RE.test(trailing)\n ? trailing\n : `${trailing}</tool_call>`;\n tryEmitToolCallSegment(synthetic, trailing);\n };\n\n const tryParseCompleteToolCallBlocks = (): boolean => {\n const matches = Array.from(text.matchAll(TOOL_CALL_BLOCK_RE));\n if (matches.length === 0) {\n return false;\n }\n\n let index = 0;\n for (const match of matches) {\n const full = match[0];\n const startIndex = match.index ?? -1;\n if (!full || startIndex < 0) {\n continue;\n }\n\n pushTextOrParseWrapperlessCalls(text.slice(index, startIndex));\n tryEmitToolCallSegment(full);\n index = startIndex + full.length;\n }\n\n handleCompleteToolCallRemainder(text.slice(index));\n return true;\n };\n\n const tryParseIncompleteToolCall = (): boolean => {\n const lowerText = text.toLowerCase();\n const startIndex = lowerText.indexOf(\"<tool_call\");\n if (startIndex === -1) {\n return false;\n }\n\n pushTextOrParseWrapperlessCalls(text.slice(0, startIndex));\n const trailing = text.slice(startIndex);\n const synthetic = TOOL_CALL_CLOSE_RE.test(trailing)\n ? trailing\n : `${trailing}</tool_call>`;\n tryEmitToolCallSegment(synthetic, trailing);\n return true;\n };\n\n const tryParseCallBlocksWithoutWrapper = (): boolean => {\n return tryParseCallBlocksWithoutWrapperText(text);\n };\n\n const tryParseSingleFunctionCall = (): boolean => {\n const lowerText = text.toLowerCase();\n const startIndex = lowerText.indexOf(\"<function\");\n if (startIndex === -1) {\n return false;\n }\n\n pushText(stripTrailingToolCallCloseTags(text.slice(0, startIndex)));\n const trailing = stripLeadingToolCallCloseTags(text.slice(startIndex));\n const parsed = parseSingleFunctionCallXml(trailing, null);\n if (!parsed) {\n processedElements.push({ type: \"text\", text: trailing });\n return true;\n }\n\n emitToolCalls([parsed]);\n return true;\n };\n\n if (tryParseCompleteToolCallBlocks()) {\n return processedElements;\n }\n if (tryParseIncompleteToolCall()) {\n return processedElements;\n }\n if (tryParseCallBlocksWithoutWrapper()) {\n return processedElements;\n }\n if (tryParseSingleFunctionCall()) {\n return processedElements;\n }\n\n return [{ type: \"text\", text }];\n },\n\n extractToolCallSegments({ text }) {\n return Array.from(text.matchAll(TOOL_CALL_BLOCK_RE))\n .map((m) => m[0])\n .filter((s): s is string => Boolean(s));\n },\n\n createStreamParser({ tools, options }) {\n const toolCallStartPrefixLower = \"<tool_call\";\n\n // vLLM reference (Qwen3XMLToolParser): streaming tool calls can start directly\n // with <function=...> (missing opening <tool_call>), and the parser implicitly\n // starts a tool_call container.\n // https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/vllm/tool_parsers/qwen3xml_tool_parser.py#L595-L642\n // https://github.com/vllm-project/vllm/blob/f13e86d8ddf81c638bacce6f8876cf6acf421d58/tests/tool_parsers/test_qwen3coder_tool_parser.py#L901-L922\n const implicitCallPrefixesLower = [\n \"<function\",\n \"<call\",\n \"<tool\",\n \"<invoke\",\n ];\n\n type ToolCallMode = \"unknown\" | \"single\" | \"multi\";\n\n type StreamingCallState = QwenStreamCallState;\n\n interface ToolCallContainerState {\n activeCall: StreamingCallState | null;\n emittedToolCallCount: number;\n innerBuffer: string;\n mode: ToolCallMode;\n outerNameAttr: string | null;\n outerOpenTag: string;\n raw: string;\n }\n\n let buffer = \"\";\n let toolCall: ToolCallContainerState | null = null;\n let implicitCall: StreamingCallState | null = null;\n let implicitCallOpenTag: string | null = null;\n let currentTextId: string | null = null;\n let hasEmittedTextStart = false;\n\n const flushText = createFlushTextHandler(\n () => currentTextId,\n (id) => {\n currentTextId = id;\n },\n () => hasEmittedTextStart,\n (value) => {\n hasEmittedTextStart = value;\n }\n );\n\n const maybeEmitToolInputStart = (\n controller: StreamController,\n callState: StreamingCallState\n ) => {\n if (callState.hasEmittedStart) {\n return;\n }\n const toolName = callState.toolName;\n if (!toolName || toolName.trim().length === 0) {\n return;\n }\n flushText(controller);\n controller.enqueue({\n type: \"tool-input-start\",\n id: callState.toolCallId,\n toolName,\n });\n callState.hasEmittedStart = true;\n };\n\n const maybeEmitToolInputProgress = (\n controller: StreamController,\n callState: StreamingCallState\n ) => {\n if (!callState.hasEmittedStart) {\n return;\n }\n const toolName = callState.toolName;\n if (!toolName) {\n return;\n }\n const argsForProgress = mergeArgsWithPartialParam(\n callState.args,\n callState.partialParam\n );\n const fullInput = stringifyToolInputWithSchema({\n tools,\n toolName,\n args: argsForProgress,\n });\n if (fullInput === \"{}\") {\n return;\n }\n emitToolInputProgressDelta({\n controller,\n id: callState.toolCallId,\n state: callState,\n fullInput,\n });\n };\n\n const finalizeCall = (\n controller: StreamController,\n callState: StreamingCallState,\n fallbackToolName: string | null,\n rawToolCallText: string | null = null\n ): boolean => {\n const resolvedToolName = callState.toolName ?? fallbackToolName;\n if (!resolvedToolName || resolvedToolName.trim().length === 0) {\n const shouldEmitRaw = shouldEmitRawToolCallTextOnError(options);\n emitFailedToolInputLifecycle({\n controller,\n id: callState.toolCallId,\n endInput: callState.hasEmittedStart,\n emitRawToolCallTextOnError: shouldEmitRaw,\n rawToolCallText,\n emitRawText: (rawText) => {\n flushText(controller, rawText);\n },\n });\n options?.onError?.(\n shouldEmitRaw && rawToolCallText\n ? \"Could not resolve Qwen3CoderToolParser tool name for tool call; emitting original text.\"\n : \"Could not resolve Qwen3CoderToolParser tool name for tool call\",\n {\n toolCallId: callState.toolCallId,\n toolCall: rawToolCallText,\n }\n );\n return false;\n }\n\n callState.toolName = resolvedToolName;\n\n maybeEmitToolInputStart(controller, callState);\n maybeEmitToolInputProgress(controller, callState);\n\n const finalInput = stringifyToolInputWithSchema({\n tools,\n toolName: resolvedToolName,\n args: callState.args,\n });\n emitFinalizedToolInputLifecycle({\n controller,\n id: callState.toolCallId,\n state: callState,\n toolName: resolvedToolName,\n finalInput,\n onMismatch: options?.onError,\n });\n return true;\n };\n\n const parseStreamingCallContent = (\n controller: StreamController,\n callState: StreamingCallState,\n content: string,\n allowEndOfString: boolean\n ): string =>\n parseCallContent({\n callState,\n content,\n allowEndOfString,\n nameTagRe: QWEN3CODER_TOOL_PARSER_STREAM_NAME_TAG_RE,\n normalizeXmlTextValue,\n parseParamTagAt: parseQwen3CoderToolParserParamTagAt,\n mergeParamValue,\n maybeEmitToolInputStart: () => {\n maybeEmitToolInputStart(controller, callState);\n },\n maybeEmitToolInputProgress: () => {\n maybeEmitToolInputProgress(controller, callState);\n },\n });\n\n // This cache is scoped to createStreamParser (per-stream), so it cannot outlive\n // one stream invocation.\n // It is bounded by the small set of endTagName values {call, function, tool,\n // invoke, tool_call}, so this is effectively ~5 entries max.\n // Eviction is unnecessary because the keyspace is fixed and tiny.\n const closeTagCache = new Map<string, RegExp>();\n\n const getCloseTagPattern = (endTagName: string): RegExp => {\n const cached = closeTagCache.get(endTagName);\n if (cached) {\n return cached;\n }\n\n const created = new RegExp(\n `<\\\\s*\\\\/\\\\s*${escapeRegExp(endTagName)}\\\\s*>`,\n \"i\"\n );\n closeTagCache.set(endTagName, created);\n return created;\n };\n\n const getNextCallStartInBuffer = (\n callState: StreamingCallState\n ): number => {\n if (callState.endTagName === \"tool_call\") {\n return -1;\n }\n const match = QWEN3CODER_TOOL_PARSER_STREAM_CALL_OPEN_TAG_RE.exec(\n callState.buffer\n );\n return match?.index ?? -1;\n };\n\n const finalizeStreamingCall = (\n controller: StreamController,\n callState: StreamingCallState,\n fallbackToolName: string | null,\n remainder: string\n ) => {\n const rawToolCallText =\n remainder.length > 0 && callState.raw.endsWith(remainder)\n ? callState.raw.slice(0, -remainder.length)\n : callState.raw;\n const ok = finalizeCall(\n controller,\n callState,\n fallbackToolName,\n rawToolCallText\n );\n if (ok && toolCall) {\n toolCall.emittedToolCallCount += 1;\n }\n };\n\n const consumeCallAtNextBoundary = (\n controller: StreamController,\n callState: StreamingCallState,\n fallbackToolName: string | null,\n nextCallStart: number\n ): { done: true; remainder: string } => {\n const beforeNextCall = callState.buffer.slice(0, nextCallStart);\n const afterNextCall = callState.buffer.slice(nextCallStart);\n\n callState.buffer = parseStreamingCallContent(\n controller,\n callState,\n beforeNextCall,\n true\n );\n finalizeStreamingCall(\n controller,\n callState,\n fallbackToolName,\n afterNextCall\n );\n return { done: true, remainder: afterNextCall };\n };\n\n const consumeCall = (\n controller: StreamController,\n callState: StreamingCallState,\n incoming: string,\n fallbackToolName: string | null\n ): { done: boolean; remainder: string } => {\n callState.buffer += incoming;\n callState.raw += incoming;\n\n const closeMatch = getCloseTagPattern(callState.endTagName).exec(\n callState.buffer\n );\n const closeStart = closeMatch?.index ?? -1;\n const nextCallStart = getNextCallStartInBuffer(callState);\n const shouldCloseAtNextBoundary =\n nextCallStart !== -1 &&\n (closeStart === -1 || nextCallStart < closeStart);\n\n if (shouldCloseAtNextBoundary) {\n return consumeCallAtNextBoundary(\n controller,\n callState,\n fallbackToolName,\n nextCallStart\n );\n }\n\n if (!closeMatch) {\n callState.buffer = parseStreamingCallContent(\n controller,\n callState,\n callState.buffer,\n false\n );\n return { done: false, remainder: \"\" };\n }\n\n const closeEnd = closeStart + (closeMatch[0]?.length ?? 0);\n const beforeClose = callState.buffer.slice(0, closeStart);\n const afterClose = callState.buffer.slice(closeEnd);\n\n parseStreamingCallContent(controller, callState, beforeClose, true);\n callState.buffer = \"\";\n finalizeStreamingCall(\n controller,\n callState,\n fallbackToolName,\n afterClose\n );\n return { done: true, remainder: afterClose };\n };\n\n const finalizeCallAtFinish = (\n controller: StreamController,\n callState: StreamingCallState,\n fallbackToolName: string | null\n ): { ok: boolean; trailingText: string } => {\n callState.buffer = parseStreamingCallContent(\n controller,\n callState,\n callState.buffer,\n true\n );\n const trailingText = stripLeadingCallCloseTags(callState.buffer);\n callState.buffer = \"\";\n const ok = finalizeCall(controller, callState, fallbackToolName, null);\n return {\n ok,\n trailingText,\n };\n };\n\n const flushSafeTextPrefix = (controller: StreamController) => {\n const lower = buffer.toLowerCase();\n\n const potentialIndices = [\n getPotentialStartIndex(lower, toolCallStartPrefixLower),\n ...implicitCallPrefixesLower.map((prefix) =>\n getPotentialStartIndex(lower, prefix)\n ),\n ].filter((value): value is number => value != null);\n\n const potentialIndex =\n potentialIndices.length > 0 ? Math.min(...potentialIndices) : null;\n if (potentialIndex == null) {\n if (buffer.length > 0) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n return;\n }\n\n if (potentialIndex > 0) {\n flushText(controller, buffer.slice(0, potentialIndex));\n buffer = buffer.slice(potentialIndex);\n }\n };\n\n const stripLeadingToolCallCloseTagsFromBuffer = () => {\n if (!buffer) {\n return;\n }\n const stripped = stripLeadingToolCallCloseTags(buffer);\n if (stripped !== buffer) {\n buffer = stripped;\n }\n };\n\n const startToolCallIfPresent = (_controller: StreamController) => {\n if (toolCall) {\n return;\n }\n\n if (implicitCall) {\n return;\n }\n\n const lower = buffer.toLowerCase();\n const startIndex = getPotentialStartIndex(\n lower,\n toolCallStartPrefixLower\n );\n if (startIndex == null || startIndex !== 0) {\n return;\n }\n\n const gtIndex = buffer.indexOf(\">\");\n if (gtIndex === -1) {\n return;\n }\n\n const openTag = buffer.slice(0, gtIndex + 1);\n if (!TOOL_CALL_OPEN_RE.test(openTag)) {\n return;\n }\n\n toolCall = {\n outerOpenTag: openTag,\n outerNameAttr: getAttributeValue(openTag, \"name\"),\n raw: openTag,\n mode: \"unknown\",\n innerBuffer: \"\",\n activeCall: null,\n emittedToolCallCount: 0,\n };\n\n const remainder = buffer.slice(gtIndex + 1);\n buffer = \"\";\n if (remainder.length > 0) {\n toolCall.raw += remainder;\n toolCall.innerBuffer += remainder;\n }\n };\n\n const startImplicitCallIfPresent = (controller: StreamController) => {\n if (toolCall || implicitCall) {\n return;\n }\n\n const match = QWEN3CODER_TOOL_PARSER_STREAM_CALL_OPEN_TAG_RE.exec(buffer);\n const startIndex = match?.index ?? -1;\n const openTag = match?.[0] ?? \"\";\n const callTagName = (match?.[1] ?? \"\").toLowerCase();\n if (!match || startIndex !== 0 || !openTag || !callTagName) {\n return;\n }\n\n const inlineToolName =\n getAttributeValue(openTag, \"name\") ?? getShorthandValue(openTag);\n if (!inlineToolName || inlineToolName.trim().length === 0) {\n return;\n }\n const selfClosing =\n QWEN3CODER_TOOL_PARSER_STREAM_SELF_CLOSING_TAG_RE.test(openTag);\n\n buffer = buffer.slice(openTag.length);\n\n const newCall: StreamingCallState = {\n endTagName: callTagName,\n toolCallId: generateToolCallId(),\n toolName: inlineToolName,\n hasEmittedStart: false,\n partialParam: null,\n emittedInput: \"\",\n raw: openTag,\n args: {},\n buffer: \"\",\n };\n\n maybeEmitToolInputStart(controller, newCall);\n\n if (selfClosing) {\n finalizeCall(controller, newCall, inlineToolName, newCall.raw);\n return;\n }\n\n implicitCall = newCall;\n implicitCallOpenTag = openTag;\n };\n\n const processImplicitCall = (controller: StreamController) => {\n while (implicitCall) {\n const callState = implicitCall;\n const { done, remainder } = consumeCall(\n controller,\n callState,\n buffer,\n null\n );\n buffer = \"\";\n if (!done) {\n return;\n }\n\n implicitCall = null;\n implicitCallOpenTag = null;\n if (remainder.length > 0) {\n buffer = remainder;\n }\n\n stripLeadingToolCallCloseTagsFromBuffer();\n flushSafeTextPrefix(controller);\n startToolCallIfPresent(controller);\n if (toolCall) {\n processToolCall(controller);\n return;\n }\n startImplicitCallIfPresent(controller);\n }\n };\n\n const drainStarts = (controller: StreamController) => {\n while (true) {\n if (toolCall || implicitCall) {\n return;\n }\n\n const before = buffer;\n startToolCallIfPresent(controller);\n if (toolCall) {\n processToolCall(controller);\n return;\n }\n\n startImplicitCallIfPresent(controller);\n if (implicitCall) {\n processImplicitCall(controller);\n return;\n }\n\n if (buffer === before) {\n return;\n }\n stripLeadingToolCallCloseTagsFromBuffer();\n flushSafeTextPrefix(controller);\n }\n };\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Stream tool-call parsing is a nested state machine.\n const processToolCall = (controller: StreamController) => {\n while (toolCall) {\n if (toolCall.mode === \"unknown\") {\n const callMatch =\n QWEN3CODER_TOOL_PARSER_STREAM_CALL_OPEN_START_RE.exec(\n toolCall.innerBuffer\n );\n const signalMatch =\n QWEN3CODER_TOOL_PARSER_STREAM_NAME_OR_PARAM_SIGNAL_RE.exec(\n toolCall.innerBuffer\n );\n if (\n callMatch &&\n (!signalMatch || (callMatch.index ?? 0) < (signalMatch.index ?? 0))\n ) {\n toolCall.mode = \"multi\";\n } else if (signalMatch) {\n toolCall.mode = \"single\";\n const activeCall: StreamingCallState = {\n endTagName: \"tool_call\",\n toolCallId: generateToolCallId(),\n toolName: toolCall.outerNameAttr,\n hasEmittedStart: false,\n partialParam: null,\n emittedInput: \"\",\n raw: toolCall.outerOpenTag,\n args: {},\n buffer: \"\",\n };\n toolCall.activeCall = activeCall;\n if (toolCall.outerNameAttr) {\n maybeEmitToolInputStart(controller, activeCall);\n }\n } else {\n return;\n }\n }\n\n if (toolCall.mode === \"single\") {\n const callState = toolCall.activeCall;\n if (!callState) {\n return;\n }\n\n const { done, remainder } = consumeCall(\n controller,\n callState,\n toolCall.innerBuffer,\n toolCall.outerNameAttr\n );\n toolCall.innerBuffer = \"\";\n\n if (!done) {\n return;\n }\n\n toolCall = null;\n if (remainder.length > 0) {\n buffer = remainder + buffer;\n }\n flushSafeTextPrefix(controller);\n startToolCallIfPresent(controller);\n continue;\n }\n\n if (toolCall.mode === \"multi\") {\n if (toolCall.activeCall) {\n const callState = toolCall.activeCall;\n const { done, remainder } = consumeCall(\n controller,\n callState,\n toolCall.innerBuffer,\n toolCall.outerNameAttr\n );\n toolCall.innerBuffer = \"\";\n\n if (!done) {\n return;\n }\n\n toolCall.activeCall = null;\n toolCall.innerBuffer = remainder;\n continue;\n }\n\n const closeMatch =\n QWEN3CODER_TOOL_PARSER_STREAM_TOOL_CALL_CLOSE_TAG_RE.exec(\n toolCall.innerBuffer\n );\n const callOpenMatch =\n QWEN3CODER_TOOL_PARSER_STREAM_CALL_OPEN_TAG_RE.exec(\n toolCall.innerBuffer\n );\n\n if (!(closeMatch || callOpenMatch)) {\n return;\n }\n\n const closeIndex = closeMatch?.index ?? -1;\n const callIndex = callOpenMatch?.index ?? -1;\n const hasClose = closeIndex !== -1;\n const hasCall = callIndex !== -1;\n\n const chooseClose = hasClose && (!hasCall || closeIndex < callIndex);\n const nextIndex = chooseClose ? closeIndex : callIndex;\n if (nextIndex > 0) {\n toolCall.innerBuffer = toolCall.innerBuffer.slice(nextIndex);\n }\n\n if (chooseClose) {\n const matchLen = closeMatch?.[0]?.length ?? 0;\n const remainder = toolCall.innerBuffer.slice(matchLen);\n toolCall = null;\n if (remainder.length > 0) {\n buffer = remainder + buffer;\n }\n flushSafeTextPrefix(controller);\n startToolCallIfPresent(controller);\n continue;\n }\n\n if (!callOpenMatch) {\n return;\n }\n\n const openTag = callOpenMatch[0] ?? \"\";\n const callTagName = (callOpenMatch[1] ?? \"\").toLowerCase();\n const rest = toolCall.innerBuffer.slice(openTag.length);\n\n const selfClosing =\n QWEN3CODER_TOOL_PARSER_STREAM_SELF_CLOSING_TAG_RE.test(openTag);\n if (selfClosing) {\n const toolNameAttr =\n getAttributeValue(openTag, \"name\") ??\n getShorthandValue(openTag) ??\n toolCall.outerNameAttr;\n const immediateCall: StreamingCallState = {\n endTagName: callTagName,\n toolCallId: generateToolCallId(),\n toolName: toolNameAttr,\n hasEmittedStart: false,\n partialParam: null,\n emittedInput: \"\",\n raw: openTag,\n args: {},\n buffer: \"\",\n };\n const ok = finalizeCall(\n controller,\n immediateCall,\n toolNameAttr,\n immediateCall.raw\n );\n if (ok) {\n toolCall.emittedToolCallCount += 1;\n }\n toolCall.innerBuffer = rest;\n continue;\n }\n\n const toolNameAttr =\n getAttributeValue(openTag, \"name\") ?? getShorthandValue(openTag);\n const newCall: StreamingCallState = {\n endTagName: callTagName,\n toolCallId: generateToolCallId(),\n toolName: toolNameAttr,\n hasEmittedStart: false,\n partialParam: null,\n emittedInput: \"\",\n raw: openTag,\n args: {},\n buffer: \"\",\n };\n\n if (toolNameAttr) {\n maybeEmitToolInputStart(controller, newCall);\n }\n\n toolCall.activeCall = newCall;\n toolCall.innerBuffer = rest;\n }\n }\n };\n\n const reportUnfinishedToolCallAtFinish = (\n controller: StreamController,\n rawToolCall: string\n ) => {\n const shouldEmitRaw = shouldEmitRawToolCallTextOnError(options);\n options?.onError?.(\n shouldEmitRaw\n ? \"Could not complete streaming Qwen3CoderToolParser XML tool call at finish; emitting original text.\"\n : \"Could not complete streaming Qwen3CoderToolParser XML tool call at finish.\",\n { toolCall: rawToolCall }\n );\n if (shouldEmitRaw) {\n flushText(controller, rawToolCall);\n }\n };\n\n const reportUnfinishedImplicitCallAtFinish = (\n controller: StreamController,\n rawCallText: string\n ) => {\n const shouldEmitRaw = shouldEmitRawToolCallTextOnError(options);\n options?.onError?.(\n shouldEmitRaw\n ? \"Could not complete streaming Qwen3CoderToolParser call block at finish; emitting original text.\"\n : \"Could not complete streaming Qwen3CoderToolParser call block at finish.\",\n { toolCall: rawCallText }\n );\n if (shouldEmitRaw) {\n flushText(controller, rawCallText);\n }\n };\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Stream finish reconciliation is a best-effort state machine cleanup.\n const handleFinish = (controller: StreamController) => {\n if (toolCall) {\n // Process any remaining complete structures first.\n processToolCall(controller);\n\n if (toolCall) {\n // Best-effort reconciliation on incomplete tool-call markup at finish.\n if (toolCall.mode === \"unknown\") {\n const callMatch =\n QWEN3CODER_TOOL_PARSER_STREAM_CALL_OPEN_START_RE.exec(\n toolCall.innerBuffer\n );\n const signalMatch =\n QWEN3CODER_TOOL_PARSER_STREAM_NAME_OR_PARAM_SIGNAL_RE.exec(\n toolCall.innerBuffer\n );\n if (\n callMatch &&\n (!signalMatch ||\n (callMatch.index ?? 0) < (signalMatch.index ?? 0))\n ) {\n toolCall.mode = \"multi\";\n } else if (signalMatch) {\n toolCall.mode = \"single\";\n toolCall.activeCall = {\n endTagName: \"tool_call\",\n toolCallId: generateToolCallId(),\n toolName: toolCall.outerNameAttr,\n hasEmittedStart: false,\n partialParam: null,\n emittedInput: \"\",\n raw: toolCall.outerOpenTag,\n args: {},\n buffer: \"\",\n };\n }\n }\n\n if (toolCall.mode === \"single\" && toolCall.activeCall) {\n toolCall.activeCall.buffer += toolCall.innerBuffer;\n toolCall.innerBuffer = \"\";\n const result = finalizeCallAtFinish(\n controller,\n toolCall.activeCall,\n toolCall.outerNameAttr\n );\n if (result.ok) {\n toolCall.emittedToolCallCount += 1;\n }\n const shouldFlushTrailingText =\n result.ok || !shouldEmitRawToolCallTextOnError(options);\n if (shouldFlushTrailingText && result.trailingText.length > 0) {\n flushText(controller, result.trailingText);\n }\n if (!result.ok && toolCall.emittedToolCallCount === 0) {\n reportUnfinishedToolCallAtFinish(controller, toolCall.raw);\n }\n } else if (toolCall.mode === \"multi\") {\n if (toolCall.activeCall) {\n const result = finalizeCallAtFinish(\n controller,\n toolCall.activeCall,\n toolCall.outerNameAttr\n );\n if (result.ok) {\n toolCall.emittedToolCallCount += 1;\n }\n const shouldFlushTrailingText =\n result.ok || !shouldEmitRawToolCallTextOnError(options);\n if (shouldFlushTrailingText && result.trailingText.length > 0) {\n flushText(controller, result.trailingText);\n }\n if (!result.ok && toolCall.emittedToolCallCount === 0) {\n reportUnfinishedToolCallAtFinish(controller, toolCall.raw);\n }\n toolCall.activeCall = null;\n } else if (toolCall.emittedToolCallCount === 0) {\n reportUnfinishedToolCallAtFinish(controller, toolCall.raw);\n }\n } else {\n reportUnfinishedToolCallAtFinish(controller, toolCall.raw);\n }\n\n toolCall = null;\n }\n }\n\n if (implicitCall) {\n const callState = implicitCall;\n const openTag = implicitCallOpenTag;\n implicitCall = null;\n implicitCallOpenTag = null;\n\n const result = finalizeCallAtFinish(controller, callState, null);\n const shouldFlushTrailingText =\n result.ok || !shouldEmitRawToolCallTextOnError(options);\n if (shouldFlushTrailingText && result.trailingText.length > 0) {\n flushText(controller, result.trailingText);\n }\n if (!result.ok && openTag) {\n reportUnfinishedImplicitCallAtFinish(\n controller,\n callState.raw || openTag + callState.buffer\n );\n }\n } else {\n stripLeadingToolCallCloseTagsFromBuffer();\n flushSafeTextPrefix(controller);\n drainStarts(controller);\n }\n\n if (buffer.length > 0) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n\n flushText(controller);\n };\n\n const handlePassthroughChunk = (\n controller: StreamController,\n chunk: LanguageModelV3StreamPart\n ) => {\n if (!toolCall && buffer) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n controller.enqueue(chunk);\n };\n\n const handleTextDeltaChunk = (\n controller: StreamController,\n delta: string\n ) => {\n if (toolCall) {\n toolCall.raw += delta;\n toolCall.innerBuffer += delta;\n processToolCall(controller);\n return;\n }\n\n if (implicitCall) {\n const callState = implicitCall;\n const { done, remainder } = consumeCall(\n controller,\n callState,\n delta,\n null\n );\n if (!done) {\n return;\n }\n implicitCall = null;\n implicitCallOpenTag = null;\n if (remainder.length > 0) {\n buffer = remainder + buffer;\n }\n stripLeadingToolCallCloseTagsFromBuffer();\n flushSafeTextPrefix(controller);\n drainStarts(controller);\n return;\n }\n\n buffer += delta;\n stripLeadingToolCallCloseTagsFromBuffer();\n flushSafeTextPrefix(controller);\n drainStarts(controller);\n };\n\n const handleTransformChunk = (\n controller: StreamController,\n chunk: LanguageModelV3StreamPart\n ) => {\n if (chunk.type === \"finish\") {\n handleFinish(controller);\n controller.enqueue(chunk);\n return;\n }\n if (chunk.type !== \"text-delta\") {\n handlePassthroughChunk(controller, chunk);\n return;\n }\n const delta = chunk.delta;\n if (!delta) {\n return;\n }\n handleTextDeltaChunk(controller, delta);\n };\n\n return new TransformStream({\n transform(chunk, controller) {\n handleTransformChunk(controller, chunk);\n },\n flush(controller) {\n handleFinish(controller);\n },\n });\n },\n});\n\nexport const uiTarsXmlProtocol = qwen3CoderProtocol;\n\nexport const Qwen3CoderToolParser = qwen3CoderProtocol;\n","import type {\n LanguageModelV3Content,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport YAML from \"yaml\";\nimport { generateToolCallId } from \"../utils/id\";\nimport {\n addTextSegment,\n createFlushTextHandler,\n extractToolNames,\n formatToolsWithPromptTemplate,\n} from \"../utils/protocol-utils\";\nimport { NAME_CHAR_RE, WHITESPACE_REGEX } from \"../utils/regex-constants\";\nimport {\n emitFailedToolInputLifecycle,\n emitFinalizedToolInputLifecycle,\n emitToolInputProgressDelta,\n enqueueToolInputEndAndCall,\n shouldEmitRawToolCallTextOnError,\n stringifyToolInputWithSchema,\n} from \"../utils/tool-input-streaming\";\nimport { tryRepairXmlSelfClosingRootWithBody } from \"../utils/xml-root-repair\";\nimport {\n findEarliestToolTag,\n findNextToolTag,\n} from \"../utils/xml-tool-tag-scanner\";\nimport type { ParserOptions, TCMCoreProtocol } from \"./protocol-interface\";\n\nexport interface YamlXmlProtocolOptions {\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*)/;\nconst INCOMPLETE_MAPPING_TAIL_RE = /^[^:[\\]{}-][^:]*:\\s*$/;\nconst INCOMPLETE_SEQUENCE_TAIL_RE = /^-\\s*$/;\nconst BLOCK_SCALAR_KEY_RE = /:\\s*[|>][-+0-9]*\\s*$/;\nconst PLAIN_MAPPING_VALUE_RE = /^[^:[\\]{}-][^:]*:\\s*(.+)$/;\nconst PLAIN_SEQUENCE_VALUE_RE = /^-\\s+(.+)$/;\n\ninterface LastMeaningfulLineInfo {\n indent: number;\n index: number;\n raw: string;\n trimmed: string;\n}\n\nfunction normalizeYamlContent(yamlContent: string): {\n normalized: string;\n nonEmptyLines: string[];\n} {\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 if (nonEmptyLines.length === 0) {\n return { normalized: \"\", nonEmptyLines };\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 return { normalized, nonEmptyLines };\n}\n\nfunction parseYamlDocumentAsMapping(normalized: string): {\n value: Record<string, unknown> | null;\n errors: string[];\n} {\n try {\n const doc = YAML.parseDocument(normalized);\n const errors = doc.errors.map((e: { message: string }) => e.message);\n const result = doc.toJSON();\n\n if (result === null) {\n return { value: {}, errors };\n }\n if (typeof result !== \"object\" || Array.isArray(result)) {\n return { value: null, errors };\n }\n return { value: result as Record<string, unknown>, errors };\n } catch (error) {\n return {\n value: null,\n errors: [\n error instanceof Error ? error.message : \"Unknown YAML parsing error\",\n ],\n };\n }\n}\n\nfunction getLastMeaningfulLineInfo(\n input: string\n): LastMeaningfulLineInfo | null {\n const lines = input.split(\"\\n\");\n let index = lines.length - 1;\n while (index >= 0) {\n const raw = lines[index] ?? \"\";\n const trimmed = raw.trim();\n if (trimmed.length > 0 && !trimmed.startsWith(\"#\")) {\n return {\n index,\n raw,\n trimmed,\n indent: raw.length - raw.trimStart().length,\n };\n }\n index -= 1;\n }\n return null;\n}\n\nfunction dropLastMeaningfulLine(input: string): string | null {\n const lineInfo = getLastMeaningfulLineInfo(input);\n if (!lineInfo) {\n return null;\n }\n\n return input.split(\"\\n\").slice(0, lineInfo.index).join(\"\\n\").trimEnd();\n}\n\nfunction hasIncompleteMappingTail(normalized: string): boolean {\n const lineInfo = getLastMeaningfulLineInfo(normalized);\n if (!lineInfo) {\n return false;\n }\n return INCOMPLETE_MAPPING_TAIL_RE.test(lineInfo.trimmed);\n}\n\nfunction hasIncompleteSequenceTail(normalized: string): boolean {\n const lineInfo = getLastMeaningfulLineInfo(normalized);\n if (!lineInfo) {\n return false;\n }\n return INCOMPLETE_SEQUENCE_TAIL_RE.test(lineInfo.trimmed);\n}\n\nfunction hasSplitNestedKeyTail(normalized: string): boolean {\n const lineInfo = getLastMeaningfulLineInfo(normalized);\n if (!lineInfo) {\n return false;\n }\n\n const { trimmed, indent, index } = lineInfo;\n if (indent === 0) {\n return false;\n }\n if (\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"-\") ||\n trimmed.includes(\":\")\n ) {\n return false;\n }\n\n const lines = normalized.split(\"\\n\");\n let parentIndex = index - 1;\n while (parentIndex >= 0) {\n const parentRaw = lines[parentIndex] ?? \"\";\n const parentTrimmed = parentRaw.trim();\n if (parentTrimmed.length === 0 || parentTrimmed.startsWith(\"#\")) {\n parentIndex -= 1;\n continue;\n }\n\n const parentIndent = parentRaw.length - parentRaw.trimStart().length;\n if (parentIndent >= indent) {\n parentIndex -= 1;\n continue;\n }\n\n if (!parentTrimmed.endsWith(\":\")) {\n return false;\n }\n if (BLOCK_SCALAR_KEY_RE.test(parentTrimmed)) {\n return false;\n }\n return true;\n }\n\n return false;\n}\n\nfunction extractTrailingPlainScalarValue(line: string): string | null {\n if (BLOCK_SCALAR_KEY_RE.test(line)) {\n return null;\n }\n\n const mappingMatch = line.match(PLAIN_MAPPING_VALUE_RE);\n const sequenceMatch = line.match(PLAIN_SEQUENCE_VALUE_RE);\n const value = mappingMatch?.[1] ?? sequenceMatch?.[1];\n if (!value) {\n return null;\n }\n\n const trimmedValue = value.trim();\n if (trimmedValue.length === 0) {\n return null;\n }\n if (trimmedValue.startsWith('\"') || trimmedValue.startsWith(\"'\")) {\n return null;\n }\n if (\n trimmedValue.startsWith(\"{\") ||\n trimmedValue.startsWith(\"[\") ||\n trimmedValue.startsWith(\"|\") ||\n trimmedValue.startsWith(\">\")\n ) {\n return null;\n }\n\n return trimmedValue;\n}\n\nfunction hasUnterminatedPlainScalarTail(normalized: string): boolean {\n if (normalized.endsWith(\"\\n\")) {\n return false;\n }\n\n const lineInfo = getLastMeaningfulLineInfo(normalized);\n if (!lineInfo) {\n return false;\n }\n\n return extractTrailingPlainScalarValue(lineInfo.trimmed) != null;\n}\n\nfunction hasUnstableProgressTail(normalized: string): boolean {\n return (\n hasIncompleteMappingTail(normalized) ||\n hasIncompleteSequenceTail(normalized) ||\n hasSplitNestedKeyTail(normalized) ||\n hasUnterminatedPlainScalarTail(normalized)\n );\n}\n\nfunction trimTrailingNewlineInUnknown(value: unknown): unknown {\n if (typeof value === \"string\") {\n if (value.endsWith(\"\\n\")) {\n return value.slice(0, -1);\n }\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => trimTrailingNewlineInUnknown(item));\n }\n\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, item]) => [\n key,\n trimTrailingNewlineInUnknown(item),\n ])\n );\n }\n\n return value;\n}\n\nfunction stabilizeParsedValueForStreamProgress<T>(value: T, source: string): T {\n if (source.endsWith(\"\\n\")) {\n return value;\n }\n\n return trimTrailingNewlineInUnknown(value) as T;\n}\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\n/**\n * Find all tool calls in the text for the given tool names.\n */\ninterface ToolCallMatch {\n content: string;\n endIndex: number;\n startIndex: number;\n toolName: string;\n}\n\nfunction collectToolCallsForName(\n text: string,\n toolName: string\n): ToolCallMatch[] {\n const toolCalls: ToolCallMatch[] = [];\n let searchIndex = 0;\n const startTag = `<${toolName}>`;\n\n while (searchIndex < text.length) {\n const match = findNextToolTag(text, searchIndex, toolName);\n if (match === null) {\n break;\n }\n\n const tagStart = match.tagStart;\n const isSelfClosing = match.isSelfClosing;\n\n if (isSelfClosing) {\n const endIndex = tagStart + match.tagLength;\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 const { normalized, nonEmptyLines } = normalizeYamlContent(yamlContent);\n if (nonEmptyLines.length === 0) {\n return {};\n }\n\n const parsed = parseYamlDocumentAsMapping(normalized);\n if (parsed.errors.length > 0) {\n options?.onError?.(\"YAML parse error\", {\n errors: parsed.errors,\n });\n return null;\n }\n\n if (parsed.value === null) {\n options?.onError?.(\"YAML content must be a key-value mapping\", {\n got: \"non-mapping\",\n });\n return null;\n }\n\n return parsed.value;\n}\n\nfunction parseYamlContentForStreamProgress(\n yamlContent: string\n): Record<string, unknown> | null {\n const { normalized, nonEmptyLines } = normalizeYamlContent(yamlContent);\n if (nonEmptyLines.length === 0) {\n return {};\n }\n\n let candidate = normalized;\n while (true) {\n const parsed = parseYamlDocumentAsMapping(candidate);\n if (parsed.errors.length === 0 && !hasUnstableProgressTail(candidate)) {\n if (candidate.trim().length === 0 && normalized.trim().length > 0) {\n return null;\n }\n return stabilizeParsedValueForStreamProgress(parsed.value, candidate);\n }\n\n const truncated = dropLastMeaningfulLine(candidate);\n if (truncated == null) {\n return null;\n }\n if (truncated === candidate) {\n return null;\n }\n candidate = truncated;\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: generateToolCallId(),\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 stripTrailingPartialCloseTag(\n content: string,\n toolName: string\n): string {\n const closeTag = `</${toolName}>`;\n const lastLineBreakIndex = Math.max(\n content.lastIndexOf(\"\\n\"),\n content.lastIndexOf(\"\\r\")\n );\n const lineStartIndex = lastLineBreakIndex === -1 ? 0 : lastLineBreakIndex + 1;\n const trailingLine = content.slice(lineStartIndex);\n const trimmedTrailingLine = trailingLine.trim();\n\n if (\n trimmedTrailingLine.length === 0 ||\n !trimmedTrailingLine.startsWith(\"</\") ||\n trimmedTrailingLine === closeTag ||\n !closeTag.startsWith(trimmedTrailingLine)\n ) {\n return content;\n }\n\n const leadingWhitespaceLength =\n trailingLine.length - trailingLine.trimStart().length;\n const preservedLeadingWhitespace = trailingLine.slice(\n 0,\n leadingWhitespaceLength\n );\n const contentWithoutPartial = `${content.slice(\n 0,\n lineStartIndex\n )}${preservedLeadingWhitespace}`;\n\n return contentWithoutPartial.trimEnd();\n}\n\nexport const yamlXmlProtocol = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- reserved for future extensibility\n _protocolOptions?: YamlXmlProtocolOptions\n): TCMCoreProtocol => {\n return {\n formatTools({ tools, toolSystemPromptTemplate }) {\n return formatToolsWithPromptTemplate({ tools, toolSystemPromptTemplate });\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 = extractToolNames(tools);\n if (toolNames.length === 0) {\n return [{ type: \"text\", text }];\n }\n\n const processedElements: LanguageModelV3Content[] = [];\n let currentIndex = 0;\n let parseText = text;\n\n let toolCalls = findToolCalls(parseText, toolNames);\n if (toolCalls.length === 0) {\n const repaired = tryRepairXmlSelfClosingRootWithBody(\n parseText,\n toolNames\n );\n if (repaired) {\n const repairedCalls = findToolCalls(repaired, toolNames);\n if (repairedCalls.length > 0) {\n parseText = repaired;\n toolCalls = repairedCalls;\n }\n }\n }\n\n for (const tc of toolCalls) {\n currentIndex = processToolCallMatch(\n parseText,\n tc,\n currentIndex,\n processedElements,\n options\n );\n }\n\n if (currentIndex < parseText.length) {\n addTextSegment(parseText.substring(currentIndex), processedElements);\n }\n\n return processedElements;\n },\n\n createStreamParser({ tools, options }) {\n const toolNames = extractToolNames(tools);\n\n let buffer = \"\";\n let currentToolCall: {\n name: string;\n toolCallId: string;\n emittedInput: string;\n } | 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 emitToolInputProgress = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolContent: string\n ) => {\n if (!currentToolCall) {\n return;\n }\n const parsedArgs = parseYamlContentForStreamProgress(toolContent);\n if (parsedArgs === null) {\n return;\n }\n const fullInput = stringifyToolInputWithSchema({\n toolName: currentToolCall.name,\n args: parsedArgs,\n tools,\n });\n if (fullInput === \"{}\" && toolContent.trim().length === 0) {\n return;\n }\n emitToolInputProgressDelta({\n controller,\n id: currentToolCall.toolCallId,\n state: currentToolCall,\n fullInput,\n });\n };\n\n const processToolCallEnd = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n toolContent: string,\n toolName: string,\n toolCallId: string\n ) => {\n const parsedArgs = parseYamlContent(toolContent, options);\n flushText(controller);\n if (parsedArgs !== null) {\n const finalInput = stringifyToolInputWithSchema({\n toolName,\n args: parsedArgs,\n tools,\n });\n if (currentToolCall && currentToolCall.toolCallId === toolCallId) {\n emitFinalizedToolInputLifecycle({\n controller,\n id: toolCallId,\n state: currentToolCall,\n toolName,\n finalInput,\n onMismatch: options?.onError,\n });\n } else {\n enqueueToolInputEndAndCall({\n controller,\n id: toolCallId,\n toolName,\n input: finalInput,\n });\n }\n } else {\n const original = `<${toolName}>${toolContent}</${toolName}>`;\n const emitRawFallback = shouldEmitRawToolCallTextOnError(options);\n emitFailedToolInputLifecycle({\n controller,\n id: toolCallId,\n emitRawToolCallTextOnError: emitRawFallback,\n rawToolCallText: original,\n emitRawText: (rawText) => {\n flushText(controller, rawText);\n },\n });\n options?.onError?.(\"Could not parse streaming YAML tool call\", {\n toolCall: original,\n });\n }\n };\n\n const finalizeUnclosedToolCall = (\n controller: TransformStreamDefaultController<LanguageModelV3StreamPart>\n ) => {\n if (!currentToolCall) {\n return;\n }\n\n emitToolInputProgress(controller, buffer);\n const { name: toolName, toolCallId } = currentToolCall;\n const reconciledBuffer = stripTrailingPartialCloseTag(buffer, toolName);\n const parsedArgs = parseYamlContent(reconciledBuffer, options);\n flushText(controller);\n if (parsedArgs !== null) {\n const finalInput = stringifyToolInputWithSchema({\n toolName,\n args: parsedArgs,\n tools,\n });\n emitFinalizedToolInputLifecycle({\n controller,\n id: toolCallId,\n state: currentToolCall,\n toolName,\n finalInput,\n onMismatch: options?.onError,\n });\n } else {\n const unfinishedContent = `<${toolName}>${buffer}`;\n const emitRawFallback = shouldEmitRawToolCallTextOnError(options);\n emitFailedToolInputLifecycle({\n controller,\n id: toolCallId,\n emitRawToolCallTextOnError: emitRawFallback,\n rawToolCallText: unfinishedContent,\n emitRawText: (rawText) => {\n flushText(controller, rawText);\n },\n });\n options?.onError?.(\n \"Could not complete streaming YAML tool call at finish.\",\n { toolCall: unfinishedContent }\n );\n }\n\n buffer = \"\";\n currentToolCall = null;\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 emitToolInputProgress(controller, buffer);\n return false;\n }\n\n const content = buffer.substring(0, endIdx);\n emitToolInputProgress(controller, content);\n buffer = buffer.substring(endIdx + endTag.length);\n processToolCallEnd(\n controller,\n content,\n toolName,\n currentToolCall?.toolCallId ?? generateToolCallId()\n );\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 flushText(controller);\n\n if (selfClosing) {\n buffer = buffer.substring(tagIndex + tagLength);\n const toolCallId = generateToolCallId();\n currentToolCall = {\n name: tagName,\n toolCallId,\n emittedInput: \"\",\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallId,\n toolName: tagName,\n });\n processToolCallEnd(controller, \"\", tagName, toolCallId);\n currentToolCall = null;\n } else {\n const startTag = `<${tagName}>`;\n buffer = buffer.substring(tagIndex + startTag.length);\n currentToolCall = {\n name: tagName,\n toolCallId: generateToolCallId(),\n emittedInput: \"\",\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: currentToolCall.toolCallId,\n toolName: tagName,\n });\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 === \"finish\") {\n if (currentToolCall) {\n finalizeUnclosedToolCall(controller);\n } else if (buffer) {\n flushText(controller, buffer);\n buffer = \"\";\n }\n flushText(controller);\n controller.enqueue(chunk);\n return;\n }\n\n if (chunk.type !== \"text-delta\") {\n if (!currentToolCall && 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 finalizeUnclosedToolCall(controller);\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 SharedV3ProviderOptions,\n} from \"@ai-sdk/provider\";\nimport type { OnErrorFn } from \"./on-error\";\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\ninterface EncodedOriginalTool {\n inputSchema: string; // stringified JSONSchema7\n name: string;\n}\n\ninterface DecodeOriginalToolsOptions {\n onError?: OnErrorFn;\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: EncodedOriginalTool[] | undefined,\n options?: DecodeOriginalToolsOptions\n): LanguageModelV3FunctionTool[] {\n if (!originalTools) {\n return [];\n }\n\n const decodedTools: LanguageModelV3FunctionTool[] = [];\n\n for (const [index, tool] of originalTools.entries()) {\n if (!tool || typeof tool.name !== \"string\") {\n options?.onError?.(\"Invalid originalTools entry: missing tool name\", {\n index,\n tool,\n });\n continue;\n }\n\n if (typeof tool.inputSchema !== \"string\") {\n options?.onError?.(\n \"Invalid originalTools entry: inputSchema must be a string\",\n {\n index,\n toolName: tool.name,\n }\n );\n continue;\n }\n\n try {\n decodedTools.push({\n type: \"function\",\n name: tool.name,\n inputSchema: JSON.parse(tool.inputSchema) as JSONSchema7,\n });\n } catch (error) {\n options?.onError?.(\n \"Failed to decode originalTools input schema, using permissive fallback schema\",\n {\n index,\n toolName: tool.name,\n inputSchema: tool.inputSchema,\n error: error instanceof Error ? error.message : String(error),\n }\n );\n decodedTools.push({\n type: \"function\",\n name: tool.name,\n inputSchema: { type: \"object\" },\n });\n }\n }\n\n return decodedTools;\n}\n\nexport function decodeOriginalToolsFromProviderOptions(\n providerOptions: ToolCallMiddlewareProviderOptions | undefined,\n options?: DecodeOriginalToolsOptions\n): LanguageModelV3FunctionTool[] {\n return decodeOriginalTools(\n providerOptions?.toolCallMiddleware?.originalTools,\n options\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\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function getToolCallMiddlewareOptions(\n providerOptions?: unknown\n): Record<string, unknown> {\n if (!isRecord(providerOptions)) {\n return {};\n }\n\n const toolCallMiddleware = providerOptions.toolCallMiddleware;\n if (!isRecord(toolCallMiddleware)) {\n return {};\n }\n\n return toolCallMiddleware;\n}\n\nexport function mergeToolCallMiddlewareOptions(\n providerOptions: unknown,\n overrides: Record<string, unknown>\n): SharedV3ProviderOptions {\n return {\n ...(isRecord(providerOptions) ? providerOptions : {}),\n toolCallMiddleware: {\n ...getToolCallMiddlewareOptions(providerOptions),\n ...overrides,\n },\n } as SharedV3ProviderOptions;\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 LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n} from \"@ai-sdk/provider\";\nimport { parse as parseRJSON } from \"../../rjson\";\nimport { getSchemaType, unwrapJsonSchema } from \"../../schema-coerce\";\nimport { generateToolCallId } from \"./id\";\n\ninterface ToolCallCandidate {\n input: string;\n toolName: string;\n}\n\ninterface JsonCandidate {\n endIndex: number;\n startIndex: number;\n text: string;\n}\n\ninterface JsonScanState {\n depth: number;\n escaping: boolean;\n inString: boolean;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value ?? {});\n } catch {\n return \"{}\";\n }\n}\n\nfunction parseJsonCandidate(candidateText: string): unknown {\n try {\n return parseRJSON(candidateText);\n } catch {\n return undefined;\n }\n}\n\nfunction extractCodeBlockCandidates(text: string): JsonCandidate[] {\n const codeBlockRegex = /```(?:json|yaml|xml)?\\s*([\\s\\S]*?)```/gi;\n const candidates: JsonCandidate[] = [];\n let match: RegExpExecArray | null;\n while (true) {\n match = codeBlockRegex.exec(text);\n if (!match) {\n break;\n }\n const body = match[1]?.trim();\n if (body) {\n const startIndex = match.index ?? 0;\n const endIndex = startIndex + match[0].length;\n candidates.push({\n text: body,\n startIndex,\n endIndex,\n });\n }\n }\n return candidates;\n}\n\nfunction scanJsonChar(state: JsonScanState, char: string): JsonScanState {\n if (state.inString) {\n if (state.escaping) {\n return { ...state, escaping: false };\n }\n if (char === \"\\\\\") {\n return { ...state, escaping: true };\n }\n if (char === '\"') {\n return { ...state, inString: false };\n }\n return state;\n }\n\n if (char === '\"') {\n return { ...state, inString: true };\n }\n if (char === \"{\") {\n return { ...state, depth: state.depth + 1 };\n }\n if (char === \"}\") {\n return { ...state, depth: Math.max(0, state.depth - 1) };\n }\n return state;\n}\n\nfunction extractBalancedJsonObjects(text: string): JsonCandidate[] {\n const maxCandidateLength = 10_000;\n const candidates: JsonCandidate[] = [];\n let state: JsonScanState = { depth: 0, inString: false, escaping: false };\n let currentStart: number | null = null;\n let ignoreCurrent = false;\n\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n\n if (!state.inString && char === \"{\" && state.depth === 0) {\n currentStart = index;\n ignoreCurrent = false;\n }\n\n state = scanJsonChar(state, char);\n\n if (\n currentStart !== null &&\n !ignoreCurrent &&\n index - currentStart + 1 > maxCandidateLength\n ) {\n ignoreCurrent = true;\n }\n\n if (!state.inString && char === \"}\" && state.depth === 0) {\n if (currentStart !== null && !ignoreCurrent) {\n const endIndex = index + 1;\n const candidate = text.slice(currentStart, endIndex);\n if (candidate.length > 1) {\n candidates.push({\n text: candidate,\n startIndex: currentStart,\n endIndex,\n });\n }\n }\n currentStart = null;\n ignoreCurrent = false;\n }\n }\n\n return candidates;\n}\n\nfunction extractTaggedToolCallCandidates(rawText: string): JsonCandidate[] {\n const toolCallRegex = /<tool_call>([\\s\\S]*?)<\\/tool_call>/gi;\n const candidates: JsonCandidate[] = [];\n let match: RegExpExecArray | null;\n while (true) {\n match = toolCallRegex.exec(rawText);\n if (!match) {\n break;\n }\n const body = match[1]?.trim();\n if (!body) {\n continue;\n }\n const startIndex = match.index ?? 0;\n const endIndex = startIndex + match[0].length;\n candidates.push({\n text: body,\n startIndex,\n endIndex,\n });\n }\n return candidates;\n}\n\nfunction extractJsonLikeCandidates(rawText: string): JsonCandidate[] {\n return mergeJsonCandidatesByStart(\n extractTaggedToolCallCandidates(rawText),\n extractCodeBlockCandidates(rawText),\n extractBalancedJsonObjects(rawText)\n );\n}\n\nfunction mergeJsonCandidatesByStart(\n tagged: JsonCandidate[],\n codeBlocks: JsonCandidate[],\n balanced: JsonCandidate[]\n): JsonCandidate[] {\n return [...tagged, ...codeBlocks, ...balanced].sort((a, b) =>\n a.startIndex !== b.startIndex\n ? a.startIndex - b.startIndex\n : b.endIndex - a.endIndex\n );\n}\n\nfunction toToolCallPart(candidate: ToolCallCandidate): LanguageModelV3Content {\n return {\n type: \"tool-call\",\n toolCallId: generateToolCallId(),\n toolName: candidate.toolName,\n input: candidate.input,\n };\n}\n\nfunction toRecoveredParts(\n text: string,\n candidate: JsonCandidate,\n toolCallPart: LanguageModelV3Content\n): LanguageModelV3Content[] {\n const out: LanguageModelV3Content[] = [];\n const prefix = text.slice(0, candidate.startIndex);\n if (prefix.length > 0) {\n out.push({ type: \"text\", text: prefix });\n }\n\n out.push(toolCallPart);\n\n const suffix = text.slice(candidate.endIndex);\n if (suffix.length > 0) {\n out.push({ type: \"text\", text: suffix });\n }\n return out;\n}\n\nfunction parseAsToolPayload(\n payload: unknown,\n tools: LanguageModelV3FunctionTool[]\n): ToolCallCandidate | null {\n if (!isRecord(payload)) {\n return null;\n }\n\n const toolName =\n typeof payload.name === \"string\" && payload.name.trim().length > 0\n ? payload.name.trim()\n : null;\n if (!toolName) {\n return null;\n }\n\n if (!tools.some((tool) => tool.name === toolName)) {\n return null;\n }\n\n const rawArgs = Object.hasOwn(payload, \"arguments\") ? payload.arguments : {};\n if (!isRecord(rawArgs)) {\n return null;\n }\n\n return {\n toolName,\n input: safeStringify(rawArgs),\n };\n}\n\nfunction isLikelyArgumentsShapeForTool(\n args: Record<string, unknown>,\n tool: LanguageModelV3FunctionTool\n): boolean {\n const unwrapped = unwrapJsonSchema(tool.inputSchema);\n if (!isRecord(unwrapped)) {\n return false;\n }\n if (getSchemaType(unwrapped) !== \"object\") {\n return false;\n }\n\n const properties = unwrapped.properties;\n if (!isRecord(properties)) {\n return false;\n }\n\n const keys = Object.keys(args);\n if (keys.length === 0) {\n return false;\n }\n\n const knownKeys = keys.filter((key) => Object.hasOwn(properties, key));\n if (knownKeys.length === 0) {\n return false;\n }\n\n if (\n unwrapped.additionalProperties === false &&\n knownKeys.length !== keys.length\n ) {\n return false;\n }\n\n return true;\n}\n\nfunction parseAsArgumentsOnly(\n payload: unknown,\n tools: LanguageModelV3FunctionTool[]\n): ToolCallCandidate | null {\n if (tools.length !== 1) {\n return null;\n }\n if (!isRecord(payload)) {\n return null;\n }\n const hasNameEnvelope =\n Object.hasOwn(payload, \"name\") &&\n typeof payload.name === \"string\" &&\n payload.name.length > 0;\n const hasArgumentsEnvelope =\n Object.hasOwn(payload, \"arguments\") &&\n (typeof payload.arguments === \"string\" || isRecord(payload.arguments));\n if (hasNameEnvelope || hasArgumentsEnvelope) {\n return null;\n }\n\n const tool = tools[0];\n if (!isLikelyArgumentsShapeForTool(payload, tool)) {\n return null;\n }\n\n return {\n toolName: tool.name,\n input: safeStringify(payload),\n };\n}\n\nexport function recoverToolCallFromJsonCandidates(\n text: string,\n tools: LanguageModelV3FunctionTool[]\n): LanguageModelV3Content[] | null {\n if (tools.length === 0) {\n return null;\n }\n\n const jsonCandidates = extractJsonLikeCandidates(text);\n for (const jsonCandidate of jsonCandidates) {\n const parsed = parseJsonCandidate(jsonCandidate.text);\n if (parsed === undefined) {\n continue;\n }\n\n const toolPayload = parseAsToolPayload(parsed, tools);\n if (toolPayload) {\n return toRecoveredParts(text, jsonCandidate, toToolCallPart(toolPayload));\n }\n\n const argsPayload = parseAsArgumentsOnly(parsed, tools);\n if (argsPayload) {\n return toRecoveredParts(text, jsonCandidate, toToolCallPart(argsPayload));\n }\n }\n\n return null;\n}\n","import type { LanguageModelV3FunctionTool } from \"@ai-sdk/provider\";\nimport type { OnErrorFn } from \"./on-error\";\nimport { coerceToolCallInput } from \"./tool-call-coercion\";\n\ninterface ParseToolChoiceOptions {\n errorMessage: string;\n onError?: OnErrorFn;\n text: string;\n tools: LanguageModelV3FunctionTool[];\n}\n\ninterface ResolveToolChoiceSelectionOptions {\n errorMessage: string;\n onError?: OnErrorFn;\n text?: string;\n tools: LanguageModelV3FunctionTool[];\n}\n\nfunction ensureNonEmptyToolName(name: unknown): string {\n if (typeof name !== \"string\") {\n return \"unknown\";\n }\n const trimmed = name.trim();\n return trimmed.length > 0 ? trimmed : \"unknown\";\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value ?? {});\n } catch {\n return \"{}\";\n }\n}\n\nexport function parseToolChoicePayload({\n text,\n tools,\n onError,\n errorMessage,\n}: ParseToolChoiceOptions): { toolName: string; input: string } {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch (error) {\n onError?.(errorMessage, {\n text,\n error: error instanceof Error ? error.message : String(error),\n });\n return { toolName: \"unknown\", input: \"{}\" };\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n onError?.(\"toolChoice JSON payload must be an object\", {\n parsedType: typeof parsed,\n parsed,\n });\n return { toolName: \"unknown\", input: \"{}\" };\n }\n\n const payload = parsed as Record<string, unknown>;\n const toolName = ensureNonEmptyToolName(payload.name);\n const rawArgs = Object.hasOwn(payload, \"arguments\") ? payload.arguments : {};\n\n if (\n rawArgs == null ||\n typeof rawArgs !== \"object\" ||\n Array.isArray(rawArgs)\n ) {\n onError?.(\"toolChoice arguments must be a JSON object\", {\n toolName,\n arguments: rawArgs,\n });\n return { toolName, input: \"{}\" };\n }\n\n const coercedInput = coerceToolCallInput(toolName, rawArgs, tools);\n\n return {\n toolName,\n input: coercedInput ?? safeStringify(rawArgs),\n };\n}\n\nexport function resolveToolChoiceSelection({\n text,\n tools,\n onError,\n errorMessage,\n}: ResolveToolChoiceSelectionOptions): {\n input: string;\n originText: string;\n toolName: string;\n} {\n if (typeof text !== \"string\") {\n return {\n toolName: \"unknown\",\n input: \"{}\",\n originText: \"\",\n };\n }\n\n const parsed = parseToolChoicePayload({\n text,\n tools,\n onError,\n errorMessage,\n });\n\n return {\n ...parsed,\n originText: text,\n };\n}\n","import type {\n LanguageModelV3,\n LanguageModelV3Content,\n LanguageModelV3FunctionTool,\n LanguageModelV3ToolCall,\n} from \"@ai-sdk/provider\";\nimport type { TCMCoreProtocol } from \"./core/protocols/protocol-interface\";\nimport {\n getDebugLevel,\n logParsedChunk,\n logParsedSummary,\n logRawChunk,\n} from \"./core/utils/debug\";\nimport { recoverToolCallFromJsonCandidates } from \"./core/utils/generated-text-json-recovery\";\nimport { generateToolCallId } from \"./core/utils/id\";\nimport { extractOnErrorOption } from \"./core/utils/on-error\";\nimport {\n decodeOriginalToolsFromProviderOptions,\n getToolCallMiddlewareOptions,\n isToolChoiceActive,\n type ToolCallMiddlewareProviderOptions,\n} from \"./core/utils/provider-options\";\nimport { coerceToolCallPart } from \"./core/utils/tool-call-coercion\";\nimport { resolveToolChoiceSelection } from \"./core/utils/tool-choice\";\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 tools: LanguageModelV3FunctionTool[]\n) {\n const result = await doGenerate();\n const first = result.content?.[0];\n const firstText = first?.type === \"text\" ? first.text : undefined;\n const onError = extractOnErrorOption(params.providerOptions)?.onError;\n\n if (typeof firstText === \"string\" && getDebugLevel() === \"parse\") {\n logRawChunk(firstText);\n }\n\n const { toolName, input, originText } = resolveToolChoiceSelection({\n text: firstText,\n tools,\n onError,\n errorMessage: \"Failed to parse toolChoice JSON from generated model output\",\n });\n\n const toolCall: LanguageModelV3ToolCall = {\n type: \"tool-call\",\n toolCallId: generateToolCallId(),\n toolName,\n input,\n };\n\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 const parsedByProtocol = protocol.parseGeneratedText({\n text: contentItem.text,\n tools,\n options: {\n ...extractOnErrorOption(providerOptions),\n ...getToolCallMiddlewareOptions(providerOptions),\n },\n });\n\n const hasToolCall = parsedByProtocol.some(\n (part): part is Extract<LanguageModelV3Content, { type: \"tool-call\" }> =>\n part.type === \"tool-call\"\n );\n if (hasToolCall) {\n return parsedByProtocol;\n }\n\n const recoveredFromJson = recoverToolCallFromJsonCandidates(\n contentItem.text,\n tools\n );\n return recoveredFromJson ?? parsedByProtocol;\n });\n\n return parsed.map((part) =>\n part.type === \"tool-call\" ? coerceToolCallPart(part, tools) : part\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 const onError = extractOnErrorOption(params.providerOptions);\n const tools = decodeOriginalToolsFromProviderOptions(\n params.providerOptions,\n onError\n );\n\n if (isToolChoiceActive(params)) {\n return handleToolChoice(doGenerate, params, tools);\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","import type { LanguageModelV3TextPart } from \"@ai-sdk/provider\";\n\nexport function toTextPart(\n text: string,\n providerOptions?: LanguageModelV3TextPart[\"providerOptions\"]\n): LanguageModelV3TextPart {\n if (providerOptions === undefined) {\n return {\n type: \"text\",\n text,\n };\n }\n\n return {\n type: \"text\",\n text,\n providerOptions,\n };\n}\n","import type {\n JSONValue,\n LanguageModelV3FilePart,\n LanguageModelV3TextPart,\n} from \"@ai-sdk/provider\";\nimport type { ToolResultOutput } from \"@ai-sdk/provider-utils\";\nimport { toTextPart } from \"./text-part\";\n\ntype ToolResponseMediaType = \"image\" | \"audio\" | \"video\" | \"file\";\n\nexport interface ToolResponseMediaCapabilities {\n audio?: boolean;\n file?: boolean;\n image?: boolean;\n video?: boolean;\n}\n\nexport type ToolResponseMediaMode = \"placeholder\" | \"raw\" | \"auto\" | \"model\";\n\nexport interface ToolResponseMediaStrategy {\n capabilities?: ToolResponseMediaCapabilities;\n mode?: ToolResponseMediaMode;\n}\n\nexport type ToolResponseUserContentPart =\n | LanguageModelV3TextPart\n | LanguageModelV3FilePart;\n\nfunction isMapping(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getMediaKindFromMediaType(mediaType: string): ToolResponseMediaType {\n if (mediaType.startsWith(\"image/\")) {\n return \"image\";\n }\n if (mediaType.startsWith(\"audio/\")) {\n return \"audio\";\n }\n if (mediaType.startsWith(\"video/\")) {\n return \"video\";\n }\n return \"file\";\n}\n\nfunction getContentPartMediaKind(part: unknown): ToolResponseMediaType | null {\n const contentPart = isMapping(part) ? part : undefined;\n const type = contentPart?.type;\n\n switch (type) {\n case \"image-data\":\n case \"image-url\":\n case \"image-file-id\":\n return \"image\";\n case \"file-data\":\n case \"file-url\":\n case \"file-id\": {\n const mediaType = contentPart?.mediaType;\n if (typeof mediaType === \"string\") {\n return getMediaKindFromMediaType(mediaType);\n }\n return \"file\";\n }\n case \"media\": {\n const mediaType = contentPart?.mediaType;\n if (typeof mediaType === \"string\") {\n return getMediaKindFromMediaType(mediaType);\n }\n return \"file\";\n }\n default:\n return null;\n }\n}\n\nfunction shouldPassRawByStrategy(\n mediaKind: ToolResponseMediaType,\n strategy?: ToolResponseMediaStrategy\n): boolean {\n const mode = getMediaMode(strategy);\n if (mode === \"raw\") {\n return true;\n }\n if (mode === \"placeholder\") {\n return false;\n }\n if (mode === \"model\") {\n return false;\n }\n\n return strategy?.capabilities?.[mediaKind] === true;\n}\n\nfunction getMediaMode(\n strategy?: ToolResponseMediaStrategy\n): ToolResponseMediaMode {\n return strategy?.mode ?? \"placeholder\";\n}\n\nfunction shouldPassRawContent(\n contentParts: unknown[],\n strategy?: ToolResponseMediaStrategy\n): boolean {\n const mode = getMediaMode(strategy);\n if (mode === \"raw\") {\n return true;\n }\n if (mode === \"placeholder\") {\n return false;\n }\n if (mode === \"model\") {\n return false;\n }\n\n let hasSupportedMediaContent = false;\n\n for (const part of contentParts) {\n const mediaKind = getContentPartMediaKind(part);\n if (!mediaKind) {\n continue;\n }\n hasSupportedMediaContent = true;\n if (!shouldPassRawByStrategy(mediaKind, strategy)) {\n return false;\n }\n }\n\n return hasSupportedMediaContent;\n}\n\nfunction formatIdPlaceholder(\n label: \"Image ID\" | \"File ID\",\n fileId: unknown\n): string {\n const displayId =\n typeof fileId === \"string\" ? fileId : JSON.stringify(fileId);\n return `[${label}: ${displayId}]`;\n}\n\nfunction formatContentPartPlaceholder(part: unknown): string {\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: ${(contentPart as { mediaType?: string }).mediaType}]`;\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 return formatIdPlaceholder(\"Image ID\", fileId);\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 return formatIdPlaceholder(\"File ID\", fileId);\n }\n case \"media\":\n return `[Media: ${(contentPart as { mediaType?: string }).mediaType}]`;\n case \"custom\":\n return \"[Custom content]\";\n default:\n return \"[Unknown content]\";\n }\n}\n\nfunction toFilePart(options: {\n data: string;\n mediaType: string;\n filename?: string;\n providerOptions?: LanguageModelV3FilePart[\"providerOptions\"];\n}): LanguageModelV3FilePart {\n return {\n type: \"file\",\n data: options.data,\n mediaType: options.mediaType,\n ...(options.filename !== undefined ? { filename: options.filename } : {}),\n ...(options.providerOptions !== undefined\n ? { providerOptions: options.providerOptions }\n : {}),\n };\n}\n\nfunction toModelContentPart(part: unknown): ToolResponseUserContentPart {\n const contentPart = part as {\n type?: string;\n text?: string;\n data?: string;\n mediaType?: string;\n url?: string;\n filename?: string;\n providerOptions?: LanguageModelV3TextPart[\"providerOptions\"];\n };\n\n switch (contentPart.type) {\n case \"text\":\n return toTextPart(contentPart.text ?? \"\", contentPart.providerOptions);\n case \"image-data\":\n return toFilePart({\n data: contentPart.data ?? \"\",\n mediaType: contentPart.mediaType ?? \"image/*\",\n providerOptions: contentPart.providerOptions,\n });\n case \"image-url\":\n return toFilePart({\n data: contentPart.url ?? \"\",\n mediaType: \"image/*\",\n providerOptions: contentPart.providerOptions,\n });\n case \"file-data\":\n return toFilePart({\n data: contentPart.data ?? \"\",\n mediaType: contentPart.mediaType ?? \"application/octet-stream\",\n filename: contentPart.filename,\n providerOptions: contentPart.providerOptions,\n });\n case \"file-url\":\n return toFilePart({\n data: contentPart.url ?? \"\",\n mediaType: \"application/octet-stream\",\n providerOptions: contentPart.providerOptions,\n });\n case \"media\":\n return toFilePart({\n data: contentPart.data ?? \"\",\n mediaType: contentPart.mediaType ?? \"application/octet-stream\",\n providerOptions: contentPart.providerOptions,\n });\n case \"image-file-id\":\n case \"file-id\":\n case \"custom\":\n return toTextPart(\n formatContentPartPlaceholder(part),\n contentPart.providerOptions\n );\n default:\n return toTextPart(\n formatContentPartPlaceholder(part),\n contentPart.providerOptions\n );\n }\n}\n\nfunction stringifyJsonValue(value: JSONValue): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n return JSON.stringify(value);\n}\n\nexport function unwrapToolResult(\n result: ToolResultOutput,\n mediaStrategy?: ToolResponseMediaStrategy\n): 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 const parts = result.value as unknown[];\n if (shouldPassRawContent(parts, mediaStrategy)) {\n return parts as JSONValue;\n }\n\n return parts.map(formatContentPartPlaceholder).join(\"\\n\");\n }\n default: {\n const _exhaustive: never = result;\n return _exhaustive;\n }\n }\n}\n\nexport function normalizeToolResultForUserContent(\n result: ToolResultOutput,\n mediaStrategy?: ToolResponseMediaStrategy\n): ToolResponseUserContentPart[] {\n if (result.type === \"content\" && mediaStrategy?.mode === \"model\") {\n return (result.value as unknown[]).map(toModelContentPart);\n }\n\n const unwrapped = unwrapToolResult(result, mediaStrategy);\n const providerOptions = (\n result as {\n providerOptions?: LanguageModelV3TextPart[\"providerOptions\"];\n }\n ).providerOptions;\n\n return [toTextPart(stringifyJsonValue(unwrapped), providerOptions)];\n}\n","import type { LanguageModelV3FunctionTool } from \"@ai-sdk/provider\";\nimport type { ToolResultPart } from \"@ai-sdk/provider-utils\";\nimport {\n type ToolResponseMediaStrategy,\n unwrapToolResult,\n} from \"./shared/tool-result-normalizer\";\n\ninterface HermesToolResponseFormatterOptions {\n mediaStrategy?: ToolResponseMediaStrategy;\n}\n\nfunction formatToolResponseAsHermesWithOptions(\n toolResult: ToolResultPart,\n options?: HermesToolResponseFormatterOptions\n): string {\n const unwrappedResult = unwrapToolResult(\n toolResult.output,\n options?.mediaStrategy\n );\n return `<tool_response>${JSON.stringify({\n name: toolResult.toolName,\n content: unwrappedResult,\n })}</tool_response>`;\n}\n\nexport function createHermesToolResponseFormatter(\n options?: HermesToolResponseFormatterOptions\n): (toolResult: ToolResultPart) => string {\n return (toolResult) =>\n formatToolResponseAsHermesWithOptions(toolResult, options);\n}\n\nexport function formatToolResponseAsHermes(toolResult: ToolResultPart): string {\n return formatToolResponseAsHermesWithOptions(toolResult);\n}\n\n// Maps JSON Schema type to Python type string (matches vLLM json_to_python_type macro)\nexport function jsonSchemaToPythonType(\n schema: Record<string, unknown>\n): string {\n const type = schema.type;\n\n if (type === \"string\") {\n return \"str\";\n }\n if (type === \"number\") {\n return \"float\";\n }\n if (type === \"integer\") {\n return \"int\";\n }\n if (type === \"boolean\") {\n return \"bool\";\n }\n\n if (type === \"array\") {\n const items = schema.items as Record<string, unknown> | undefined;\n if (items) {\n return `list[${jsonSchemaToPythonType(items)}]`;\n }\n return \"list[Any]\";\n }\n\n if (type === \"object\") {\n const additionalProperties = schema.additionalProperties as\n | Record<string, unknown>\n | undefined;\n if (additionalProperties) {\n return `dict[str, ${jsonSchemaToPythonType(additionalProperties)}]`;\n }\n return \"dict\";\n }\n\n if (Array.isArray(type)) {\n return `Union[${type.map((t: string) => jsonSchemaToPythonType({ type: t })).join(\",\")}]`;\n }\n\n return \"Any\";\n}\n\nexport function renderToolDefinition(\n tool: LanguageModelV3FunctionTool\n): string {\n const schema = tool.inputSchema as Record<string, unknown>;\n const properties = schema.properties as\n | Record<string, Record<string, unknown>>\n | undefined;\n\n const paramSignature = properties\n ? Object.entries(properties)\n .map(([name, field]) => `${name}: ${jsonSchemaToPythonType(field)}`)\n .join(\", \")\n : \"\";\n\n const desc = tool.description ?? \"\";\n let description = `${tool.name}(${paramSignature}) - ${desc}\\n\\n`;\n\n if (properties && Object.keys(properties).length > 0) {\n description += \" Args:\\n\";\n for (const [paramName, paramFields] of Object.entries(properties)) {\n const paramDesc = (paramFields.description as string | undefined) ?? \"\";\n description += ` ${paramName}(${jsonSchemaToPythonType(paramFields)}): ${paramDesc.trim()}\\n`;\n }\n }\n\n const parametersJson = JSON.stringify(schema);\n const descJson = JSON.stringify(description);\n const nameJson = JSON.stringify(tool.name);\n\n return `{\"type\": \"function\", \"function\": {\"name\": ${nameJson}, \"description\": ${descJson}, \"parameters\": ${parametersJson}}}`;\n}\n\nexport function hermesSystemPromptTemplate(\n tools: LanguageModelV3FunctionTool[]\n): string {\n const toolsRendered = tools.map(renderToolDefinition).join(\"\\n\");\n return `You are a function calling AI model. You are provided with function signatures within <tools></tools> XML tags. You may call one or more functions to assist with the user query. Don't make assumptions about what values to plug into functions. Here are the available tools: <tools> ${toolsRendered} </tools>\nUse the following pydantic model json schema for each tool call you will make: {\"properties\": {\"name\": {\"title\": \"Name\", \"type\": \"string\"}, \"arguments\": {\"title\": \"Arguments\", \"type\": \"object\"}}, \"required\": [\"name\", \"arguments\"], \"title\": \"FunctionCall\", \"type\": \"object\"}\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 {\n JSONSchema7,\n JSONValue,\n LanguageModelV3FunctionTool,\n} from \"@ai-sdk/provider\";\nimport type { ToolResultPart } from \"@ai-sdk/provider-utils\";\nimport dedent from \"dedent\";\nimport { stringify } from \"../../rxml\";\nimport { escapeXmlMinimalText } from \"../../rxml/utils/helpers\";\nimport {\n type ToolResponseMediaStrategy,\n unwrapToolResult,\n} from \"./shared/tool-result-normalizer\";\n\nexport function morphXmlSystemPromptTemplate(\n tools: LanguageModelV3FunctionTool[]\n): string {\n const toolsText = renderToolsForXmlPrompt(tools);\n const inputExamplesText = renderInputExamplesForXmlPrompt(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, inputExamplesText]\n .filter((section) => section.trim().length > 0)\n .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 getToolInputExamples(\n tool: LanguageModelV3FunctionTool\n): Array<{ input: unknown }> {\n const inputExamples = (\n tool as LanguageModelV3FunctionTool & {\n inputExamples?: Array<{ input: unknown }>;\n }\n ).inputExamples;\n\n if (!Array.isArray(inputExamples)) {\n return [];\n }\n\n return inputExamples.filter(\n (example) =>\n typeof example === \"object\" &&\n example !== null &&\n \"input\" in example &&\n example.input !== undefined\n );\n}\n\nfunction safeStringifyInputExample(\n input: unknown,\n sourceError?: unknown\n): string {\n try {\n const serialized = JSON.stringify(input);\n return serialized ?? \"null\";\n } catch (stringifyError) {\n let reason = \"\";\n\n if (sourceError instanceof Error) {\n reason = sourceError.message;\n } else if (stringifyError instanceof Error) {\n reason = stringifyError.message;\n }\n\n return reason.length > 0\n ? `[unserializable input: ${reason}]`\n : \"[unserializable input]\";\n }\n}\n\nfunction renderMorphXmlInputExample(toolName: string, input: unknown): string {\n try {\n return stringify(toolName, input as JSONValue, {\n suppressEmptyNode: false,\n format: true,\n minimalEscaping: true,\n });\n } catch (error) {\n const fallbackContent = safeStringifyInputExample(input, error);\n const escapedFallback = escapeXmlMinimalText(fallbackContent);\n return `<${toolName}>${escapedFallback}</${toolName}>`;\n }\n}\n\nfunction renderInputExamplesForXmlPrompt(\n tools: LanguageModelV3FunctionTool[]\n): string {\n const renderedTools = tools\n .map((tool) => {\n const inputExamples = getToolInputExamples(tool);\n if (inputExamples.length === 0) {\n return \"\";\n }\n\n const renderedExamples = inputExamples\n .map((example, index) => {\n const xml = renderMorphXmlInputExample(tool.name, example.input);\n return `Example ${index + 1}:\\n${xml}`;\n })\n .join(\"\\n\\n\");\n\n return `Tool: ${tool.name}\\n${renderedExamples}`;\n })\n .filter((text) => text.length > 0)\n .join(\"\\n\\n\");\n\n if (renderedTools.length === 0) {\n return \"\";\n }\n\n return [\n \"# Input Examples\",\n \"Treat these as canonical tool-call patterns.\",\n \"Reuse the closest structure and nesting, change only values, and do not invent parameters.\",\n \"Do not copy example values unless they match the user's request.\",\n renderedTools,\n ].join(\"\\n\\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\ninterface MorphXmlToolResponseFormatterOptions {\n mediaStrategy?: ToolResponseMediaStrategy;\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\nfunction morphFormatToolResponseAsXmlWithOptions(\n toolResult: ToolResultPart,\n options?: MorphXmlToolResponseFormatterOptions\n): string {\n const unwrappedResult = unwrapToolResult(\n toolResult.output,\n options?.mediaStrategy\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\nexport function createMorphXmlToolResponseFormatter(\n options?: MorphXmlToolResponseFormatterOptions\n): (toolResult: ToolResultPart) => string {\n return (toolResult) =>\n morphFormatToolResponseAsXmlWithOptions(toolResult, options);\n}\n\nexport function morphFormatToolResponseAsXml(\n toolResult: ToolResultPart\n): string {\n return morphFormatToolResponseAsXmlWithOptions(toolResult);\n}\n","import type { JSONValue, LanguageModelV3FunctionTool } from \"@ai-sdk/provider\";\nimport type { ToolResultPart } from \"@ai-sdk/provider-utils\";\nimport {\n escapeXmlMinimalAttr,\n escapeXmlMinimalText,\n} from \"../../rxml/utils/helpers\";\nimport {\n type ToolResponseMediaStrategy,\n unwrapToolResult,\n} from \"./shared/tool-result-normalizer\";\n\nconst QWEN3CODER_TOOL_HEADER =\n \"# Tools\\n\\nYou have access to the following functions:\\n\\n\";\n\nconst QWEN3CODER_TOOL_CALL_INSTRUCTIONS =\n \"\\n\\nIf you choose to call a function ONLY reply in the following format with NO suffix:\\n\\n<tool_call>\\n<function=example_function_name>\\n<parameter=example_parameter_1>\\nvalue_1\\n</parameter>\\n<parameter=example_parameter_2>\\nThis is the value for the second parameter\\nthat can span\\nmultiple lines\\n</parameter>\\n</function>\\n</tool_call>\\n\\n<IMPORTANT>\\nReminder:\\n- Function calls MUST follow the specified format: an inner <function=...></function> block must be nested within <tool_call></tool_call> XML tags\\n- Required parameters MUST be specified\\n- You may provide optional reasoning for your function call in natural language BEFORE the function call, but NOT after\\n- If there is no function call available, answer the question like normal with your current knowledge and do not tell the user about function calls\\n</IMPORTANT>\";\n\ntype Mapping = Record<string, unknown>;\n\ninterface Qwen3CoderToolShape extends Mapping {\n description?: unknown;\n name?: unknown;\n parameters?: unknown;\n}\n\nconst XML_PROMPT_TAG_NAME_RE = /^[A-Za-z_][A-Za-z0-9_.-]*$/;\n\nfunction isMapping(value: unknown): value is Mapping {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isSequence(value: unknown): value is unknown[] {\n return Array.isArray(value);\n}\n\nfunction toJinjaString(value: unknown): string {\n if (value === undefined) {\n return \"\";\n }\n if (value === null) {\n return \"None\";\n }\n if (typeof value === \"boolean\") {\n return value ? \"True\" : \"False\";\n }\n return String(value);\n}\n\nfunction toJinjaTrimmedString(value: unknown): string {\n return toJinjaString(value).trim();\n}\n\nfunction toEscapedXmlText(value: unknown): string {\n return escapeXmlMinimalText(toJinjaString(value));\n}\n\nfunction toEscapedTrimmedXmlText(value: unknown): string {\n return escapeXmlMinimalText(toJinjaTrimmedString(value));\n}\n\nfunction renderXmlPromptField(key: string, escapedValue: string): string {\n if (XML_PROMPT_TAG_NAME_RE.test(key)) {\n return `\\n<${key}>${escapedValue}</${key}>`;\n }\n\n return `\\n<property name=\"${escapeXmlMinimalAttr(\n key,\n '\"'\n )}\">${escapedValue}</property>`;\n}\n\nfunction renderExtraKeys(\n jsonDict: unknown,\n handledKeys: readonly string[]\n): string {\n if (!isMapping(jsonDict)) {\n return \"\";\n }\n\n const handled = new Set(handledKeys);\n let out = \"\";\n\n for (const [jsonKey, jsonValue] of Object.entries(jsonDict)) {\n if (handled.has(jsonKey)) {\n continue;\n }\n\n const renderedValue =\n isMapping(jsonValue) || isSequence(jsonValue)\n ? JSON.stringify(jsonValue)\n : toJinjaString(jsonValue);\n out += renderXmlPromptField(jsonKey, escapeXmlMinimalText(renderedValue));\n }\n\n return out;\n}\n\nfunction normalizeInputSchema(inputSchema: unknown): unknown {\n if (typeof inputSchema !== \"string\") {\n return inputSchema;\n }\n\n try {\n return JSON.parse(inputSchema) as unknown;\n } catch {\n return inputSchema;\n }\n}\n\nfunction normalizeTool(\n rawTool: LanguageModelV3FunctionTool\n): Qwen3CoderToolShape {\n return {\n name: rawTool.name,\n description: rawTool.description,\n parameters: normalizeInputSchema(rawTool.inputSchema),\n };\n}\n\nfunction renderParameter(paramName: string, paramFieldsRaw: unknown): string {\n const paramFields = isMapping(paramFieldsRaw)\n ? (paramFieldsRaw as Mapping)\n : undefined;\n\n let out = \"\\n<parameter>\";\n out += `\\n<name>${toEscapedXmlText(paramName)}</name>`;\n\n if (paramFields?.type !== undefined) {\n out += `\\n<type>${toEscapedXmlText(paramFields.type)}</type>`;\n }\n\n if (paramFields?.description !== undefined) {\n out += `\\n<description>${toEscapedTrimmedXmlText(paramFields.description)}</description>`;\n }\n\n out += renderExtraKeys(paramFieldsRaw, [\"name\", \"type\", \"description\"]);\n out += \"\\n</parameter>\";\n return out;\n}\n\nfunction renderTool(tool: Qwen3CoderToolShape): string {\n let out = `\\n<function>\\n<name>${toEscapedXmlText(tool.name)}</name>`;\n\n if (tool.description !== undefined) {\n out += `\\n<description>${toEscapedTrimmedXmlText(tool.description)}</description>`;\n }\n\n out += \"\\n<parameters>\";\n\n const parameters = tool.parameters;\n if (isMapping(parameters) && isMapping((parameters as Mapping).properties)) {\n for (const [paramName, paramFieldsRaw] of Object.entries(\n (parameters as Mapping).properties as Mapping\n )) {\n out += renderParameter(paramName, paramFieldsRaw);\n }\n }\n\n out += renderExtraKeys(parameters, [\"type\", \"properties\"]);\n out += \"\\n</parameters>\";\n out += renderExtraKeys(tool, [\"type\", \"name\", \"description\", \"parameters\"]);\n out += \"\\n</function>\";\n return out;\n}\n\nexport function qwen3coderSystemPromptTemplate(\n tools: LanguageModelV3FunctionTool[]\n): string {\n if (!tools.length) {\n return \"\";\n }\n\n let out = `${QWEN3CODER_TOOL_HEADER}<tools>`;\n for (const tool of tools) {\n out += renderTool(normalizeTool(tool));\n }\n out += \"\\n</tools>\";\n out += QWEN3CODER_TOOL_CALL_INSTRUCTIONS;\n return out;\n}\n\ninterface Qwen3CoderToolResponseFormatterOptions {\n mediaStrategy?: ToolResponseMediaStrategy;\n}\n\nfunction stringifyToolResponseContent(value: JSONValue): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n return JSON.stringify(value);\n}\n\nfunction formatToolResponseAsQwen3CoderXmlWithOptions(\n toolResult: ToolResultPart,\n options?: Qwen3CoderToolResponseFormatterOptions\n): string {\n const unwrappedResult = unwrapToolResult(\n toolResult.output,\n options?.mediaStrategy\n );\n const content = stringifyToolResponseContent(unwrappedResult);\n return `<tool_response>\\n${content}\\n</tool_response>`;\n}\n\nexport function createQwen3CoderXmlToolResponseFormatter(\n options?: Qwen3CoderToolResponseFormatterOptions\n): (toolResult: ToolResultPart) => string {\n return (toolResult) =>\n formatToolResponseAsQwen3CoderXmlWithOptions(toolResult, options);\n}\n\nexport function formatToolResponseAsQwen3CoderXml(\n toolResult: ToolResultPart\n): string {\n return formatToolResponseAsQwen3CoderXmlWithOptions(toolResult);\n}\n","import type { LanguageModelV3FunctionTool } from \"@ai-sdk/provider\";\nimport type { ToolResultPart } from \"@ai-sdk/provider-utils\";\nimport { morphFormatToolResponseAsXml } from \"./morph-xml-prompt\";\n\nexport function yamlXmlSystemPromptTemplate(\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\nexport function formatToolResponseAsYaml(toolResult: ToolResultPart): string {\n return morphFormatToolResponseAsXml(toolResult);\n}\n","import type {\n LanguageModelV3,\n LanguageModelV3FinishReason,\n LanguageModelV3FunctionTool,\n LanguageModelV3StreamPart,\n LanguageModelV3Usage,\n} from \"@ai-sdk/provider\";\nimport type { TCMCoreProtocol } from \"./core/protocols/protocol-interface\";\nimport { getDebugLevel, logParsedChunk, logRawChunk } from \"./core/utils/debug\";\nimport { generateToolCallId } from \"./core/utils/id\";\nimport { extractOnErrorOption } from \"./core/utils/on-error\";\nimport {\n decodeOriginalToolsFromProviderOptions,\n getToolCallMiddlewareOptions,\n isToolChoiceActive,\n type ToolCallMiddlewareProviderOptions,\n} from \"./core/utils/provider-options\";\nimport { coerceToolCallPart } from \"./core/utils/tool-call-coercion\";\nimport { resolveToolChoiceSelection } from \"./core/utils/tool-choice\";\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 const onErrorOptions = extractOnErrorOption(params.providerOptions);\n const tools = decodeOriginalToolsFromProviderOptions(\n params.providerOptions,\n onErrorOptions\n );\n\n if (isToolChoiceActive(params)) {\n return toolChoiceStream({\n doGenerate,\n tools,\n options: onErrorOptions,\n });\n }\n\n const { stream, ...rest } = await doStream();\n const debugLevel = getDebugLevel();\n const options = {\n ...onErrorOptions,\n ...getToolCallMiddlewareOptions(params.providerOptions),\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 let seenToolCall = false;\n const v3Stream = coreStream.pipeThrough(\n new TransformStream<LanguageModelV3StreamPart, LanguageModelV3StreamPart>({\n transform(part, controller) {\n let normalizedPart =\n part.type === \"tool-call\" ? coerceToolCallPart(part, tools) : part;\n\n if (normalizedPart.type === \"tool-call\") {\n seenToolCall = true;\n }\n\n if (\n normalizedPart.type === \"finish\" &&\n seenToolCall &&\n normalizedPart.finishReason.unified === \"stop\"\n ) {\n normalizedPart = {\n ...normalizedPart,\n finishReason: normalizeToolCallsFinishReason(\n normalizedPart.finishReason\n ),\n };\n }\n\n if (debugLevel === \"stream\") {\n logParsedChunk(normalizedPart);\n }\n controller.enqueue(normalizedPart);\n },\n })\n );\n\n return {\n ...rest,\n stream: v3Stream,\n };\n}\n\nexport async function toolChoiceStream({\n doGenerate,\n tools,\n options,\n}: {\n doGenerate: () => ReturnType<LanguageModelV3[\"doGenerate\"]>;\n tools?: LanguageModelV3FunctionTool[];\n options?: {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n };\n}) {\n const normalizedTools = Array.isArray(tools) ? tools : [];\n const result = await doGenerate();\n const first = result?.content?.[0];\n const firstText = first?.type === \"text\" ? first.text : undefined;\n const { toolName, input } = resolveToolChoiceSelection({\n text: firstText,\n tools: normalizedTools,\n onError: options?.onError,\n errorMessage: \"Failed to parse toolChoice JSON from streamed model output\",\n });\n\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n start(controller) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: generateToolCallId(),\n toolName,\n input,\n });\n controller.enqueue({\n type: \"finish\",\n usage: normalizeUsage(result?.usage),\n finishReason: normalizeToolCallsFinishReason(result?.finishReason),\n });\n controller.close();\n },\n });\n\n return {\n request: result?.request || {},\n response: result?.response || {},\n stream,\n };\n}\n\nconst ZERO_USAGE: LanguageModelV3Usage = {\n inputTokens: {\n total: 0,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: 0,\n text: undefined,\n reasoning: undefined,\n },\n};\n\nfunction normalizeToolCallsFinishReason(\n finishReason: unknown\n): LanguageModelV3FinishReason {\n let raw = \"tool-calls\";\n if (typeof finishReason === \"string\") {\n raw = finishReason;\n } else if (\n finishReason &&\n typeof finishReason === \"object\" &&\n \"raw\" in finishReason &&\n typeof (finishReason as { raw?: unknown }).raw === \"string\"\n ) {\n raw = (finishReason as { raw: string }).raw;\n } else if (\n finishReason &&\n typeof finishReason === \"object\" &&\n \"unified\" in finishReason &&\n typeof (finishReason as { unified?: unknown }).unified === \"string\"\n ) {\n raw = (finishReason as { unified: string }).unified;\n }\n\n return {\n unified: \"tool-calls\",\n raw,\n };\n}\n\nfunction normalizeUsage(usage: unknown): LanguageModelV3Usage {\n if (!usage || typeof usage !== \"object\") {\n return ZERO_USAGE;\n }\n\n const usageRecord = usage as Record<string, unknown>;\n const input = usageRecord.inputTokens;\n const output = usageRecord.outputTokens;\n if (\n input &&\n typeof input === \"object\" &&\n output &&\n typeof output === \"object\"\n ) {\n return usage as LanguageModelV3Usage;\n }\n\n if (typeof input === \"number\" && typeof output === \"number\") {\n return {\n inputTokens: {\n total: input,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: output,\n text: undefined,\n reasoning: undefined,\n },\n };\n }\n\n return ZERO_USAGE;\n}\n","import type { LanguageModelV3Content } from \"@ai-sdk/provider\";\nimport type { TCMCoreProtocol } from \"../../protocols/protocol-interface\";\n\ninterface AssistantToolCallTextConversionOptions {\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n}\n\nexport function assistantToolCallsToTextContent(options: {\n content: LanguageModelV3Content[];\n protocol: TCMCoreProtocol;\n conversionOptions?: AssistantToolCallTextConversionOptions;\n}): LanguageModelV3Content[] {\n const newContent: LanguageModelV3Content[] = [];\n for (const item of options.content) {\n switch (item.type) {\n case \"tool-call\":\n newContent.push({\n type: \"text\",\n text: options.protocol.formatToolCall(item),\n });\n break;\n case \"text\":\n case \"reasoning\":\n newContent.push(item);\n break;\n default:\n options.conversionOptions?.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 if (!newContent.every((entry) => entry.type === \"text\")) {\n return newContent;\n }\n\n return [\n {\n type: \"text\",\n text: newContent\n .map((entry) => (entry as { text: string }).text)\n .join(\"\\n\"),\n },\n ];\n}\n","import type {\n LanguageModelV3FilePart,\n LanguageModelV3Prompt,\n LanguageModelV3TextPart,\n} from \"@ai-sdk/provider\";\nimport type {\n ToolApprovalResponse,\n ToolContent,\n ToolResultPart,\n} from \"@ai-sdk/provider-utils\";\nimport { toTextPart } from \"./text-part\";\nimport {\n normalizeToolResultForUserContent,\n type ToolResponseMediaStrategy,\n type ToolResponseUserContentPart,\n} from \"./tool-result-normalizer\";\n\nexport type ToolResponsePromptTemplateResult =\n | string\n | ToolResponseUserContentPart[];\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 normalizeTemplateResult(\n result: ToolResponsePromptTemplateResult\n): ToolResponseUserContentPart[] {\n if (typeof result === \"string\") {\n return [toTextPart(result)];\n }\n\n return result;\n}\n\nfunction appendSection(\n target: ToolResponseUserContentPart[],\n section: ToolResponseUserContentPart[]\n): void {\n if (section.length === 0) {\n return;\n }\n\n if (target.length > 0) {\n target.push(toTextPart(\"\\n\"));\n }\n\n target.push(...section);\n}\n\nfunction mergeAdjacentTextParts(\n parts: ToolResponseUserContentPart[]\n): Array<LanguageModelV3TextPart | LanguageModelV3FilePart> {\n const merged: Array<LanguageModelV3TextPart | LanguageModelV3FilePart> = [];\n\n for (const part of parts) {\n const last = merged.at(-1);\n const canMergeTextParts =\n part.type === \"text\" &&\n last?.type === \"text\" &&\n part.providerOptions === undefined &&\n last.providerOptions === undefined;\n if (canMergeTextParts) {\n last.text += part.text;\n continue;\n }\n merged.push(part);\n }\n\n return merged;\n}\n\nexport function createUserContentToolResponseTemplate(options?: {\n mediaStrategy?: ToolResponseMediaStrategy;\n}): (toolResult: ToolResultPart) => ToolResponsePromptTemplateResult {\n return (toolResult) =>\n normalizeToolResultForUserContent(\n toolResult.output,\n options?.mediaStrategy\n );\n}\n\nexport function toolRoleContentToUserTextMessage(options: {\n toolContent: ToolContent;\n toolResponsePromptTemplate: (\n toolResult: ToolResultPart\n ) => ToolResponsePromptTemplateResult;\n}): LanguageModelV3Prompt[number] {\n const toolResultParts = options.toolContent.filter(\n (part): part is ToolResultPart => part.type === \"tool-result\"\n );\n const approvalResponseParts = options.toolContent.filter(\n (part): part is ToolApprovalResponse =>\n part.type === \"tool-approval-response\"\n );\n\n const sections: ToolResponseUserContentPart[] = [];\n\n for (const toolResult of toolResultParts) {\n const result = options.toolResponsePromptTemplate(toolResult);\n appendSection(sections, normalizeTemplateResult(result));\n }\n\n for (const approvalResponse of approvalResponseParts) {\n appendSection(sections, [\n toTextPart(formatApprovalResponse(approvalResponse)),\n ]);\n }\n\n const normalizedSections = sections.length > 0 ? sections : [toTextPart(\"\")];\n\n return {\n role: \"user\",\n content: mergeAdjacentTextParts(normalizedSections),\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} from \"@ai-sdk/provider\";\nimport type { ToolContent, ToolResultPart } from \"@ai-sdk/provider-utils\";\nimport { assistantToolCallsToTextContent } from \"./core/prompts/shared/assistant-tool-calls-to-text\";\nimport {\n type ToolResponsePromptTemplateResult,\n toolRoleContentToUserTextMessage,\n} from \"./core/prompts/shared/tool-role-to-user-message\";\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 {\n mergeToolCallMiddlewareOptions,\n originalToolsSchema,\n} 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 if (systemPrompt.trim().length === 0) {\n return processedPrompt;\n }\n\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: mergeToolCallMiddlewareOptions(params.providerOptions, {\n originalTools: originalToolsSchema.encode(functionTools),\n }),\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: mergeToolCallMiddlewareOptions(\n baseReturnParams.providerOptions,\n params.toolChoice ? { toolChoice: params.toolChoice } : {}\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 if (functionTools.length === 0) {\n throw new Error(\n \"Tool choice type 'required' is set, but no function tools are provided. Provider-defined tools are not supported by this middleware.\"\n );\n }\n\n return {\n ...baseReturnParams,\n responseFormat: {\n type: \"json\" as const,\n schema: createDynamicIfThenElseSchema(functionTools),\n },\n providerOptions: mergeToolCallMiddlewareOptions(\n baseReturnParams.providerOptions,\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?: (\n toolResult: ToolResultPart\n ) => ToolResponsePromptTemplateResult;\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 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?: (\n toolResult: ToolResultPart\n ) => ToolResponsePromptTemplateResult\n): LanguageModelV3Prompt[number] {\n if (message.role === \"assistant\") {\n const condensedContent = assistantToolCallsToTextContent({\n content: message.content as LanguageModelV3Content[],\n protocol: resolvedProtocol,\n conversionOptions: {\n onError: providerOptions?.onError,\n },\n });\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 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\n return toolRoleContentToUserTextMessage({\n toolContent: message.content as ToolContent,\n toolResponsePromptTemplate,\n });\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 if (\n !(isAllTextContent(prev.content) && isAllTextContent(current.content))\n ) {\n continue;\n }\n\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?: (\n toolResult: ToolResultPart\n ) => ToolResponsePromptTemplateResult,\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 { ToolResponsePromptTemplateResult } from \"./core/prompts/shared/tool-role-to-user-message\";\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?: (\n toolResult: ToolResultPart\n ) => ToolResponsePromptTemplateResult;\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 {\n formatToolResponseAsHermes,\n hermesSystemPromptTemplate,\n} from \"./core/prompts/hermes-prompt\";\nimport {\n morphFormatToolResponseAsXml,\n morphXmlSystemPromptTemplate,\n} from \"./core/prompts/morph-xml-prompt\";\nimport {\n formatToolResponseAsQwen3CoderXml,\n qwen3coderSystemPromptTemplate,\n} from \"./core/prompts/qwen3coder-prompt\";\nimport {\n formatToolResponseAsYaml,\n yamlXmlSystemPromptTemplate,\n} from \"./core/prompts/yaml-xml-prompt\";\nimport { hermesProtocol } from \"./core/protocols/hermes-protocol\";\nimport { morphXmlProtocol } from \"./core/protocols/morph-xml-protocol\";\nimport { qwen3CoderProtocol } from \"./core/protocols/qwen3coder-protocol\";\nimport { yamlXmlProtocol } from \"./core/protocols/yaml-xml-protocol\";\nimport { createToolMiddleware } from \"./tool-call-middleware\";\n\nexport const hermesToolMiddleware = createToolMiddleware({\n protocol: hermesProtocol(),\n toolSystemPromptTemplate: hermesSystemPromptTemplate,\n toolResponsePromptTemplate: formatToolResponseAsHermes,\n});\n\nexport const qwen3CoderToolMiddleware = createToolMiddleware({\n protocol: qwen3CoderProtocol,\n toolSystemPromptTemplate: qwen3coderSystemPromptTemplate,\n toolResponsePromptTemplate: formatToolResponseAsQwen3CoderXml,\n});\n\nexport const morphXmlToolMiddleware = createToolMiddleware({\n protocol: morphXmlProtocol({}),\n toolSystemPromptTemplate: morphXmlSystemPromptTemplate,\n toolResponsePromptTemplate: morphFormatToolResponseAsXml,\n});\n\nexport const yamlXmlToolMiddleware = createToolMiddleware({\n protocol: yamlXmlProtocol({}),\n toolSystemPromptTemplate: yamlXmlSystemPromptTemplate,\n toolResponsePromptTemplate: formatToolResponseAsYaml,\n});\n"],"mappings":"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","names":["index","emitToolInputProgress","handleStreamingToolCallEnd","findPotentialToolTagStart","newBuffer","parse","emitToolInputProgress","_a","rawValue","processToolCall","toolNameAttr","findClosingTagEnd","findToolCalls","emitToolInputProgress","isRecord","safeStringify","safeStringify","lines","isMapping"]}