@boostecom/provider 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -0
- package/dist/index.cjs +2522 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +848 -0
- package/dist/index.d.ts +848 -0
- package/dist/index.js +2484 -0
- package/dist/index.js.map +1 -0
- package/docs/content/README.md +337 -0
- package/docs/content/agent-teams.mdx +324 -0
- package/docs/content/api.mdx +757 -0
- package/docs/content/best-practices.mdx +624 -0
- package/docs/content/examples.mdx +675 -0
- package/docs/content/guide.mdx +516 -0
- package/docs/content/index.mdx +99 -0
- package/docs/content/installation.mdx +246 -0
- package/docs/content/skills.mdx +548 -0
- package/docs/content/troubleshooting.mdx +588 -0
- package/docs/examples/README.md +499 -0
- package/docs/examples/abort-signal.ts +125 -0
- package/docs/examples/agent-teams.ts +122 -0
- package/docs/examples/basic-usage.ts +73 -0
- package/docs/examples/check-cli.ts +51 -0
- package/docs/examples/conversation-history.ts +69 -0
- package/docs/examples/custom-config.ts +90 -0
- package/docs/examples/generate-object-constraints.ts +209 -0
- package/docs/examples/generate-object.ts +211 -0
- package/docs/examples/hooks-callbacks.ts +63 -0
- package/docs/examples/images.ts +76 -0
- package/docs/examples/integration-test.ts +241 -0
- package/docs/examples/limitations.ts +150 -0
- package/docs/examples/logging-custom-logger.ts +99 -0
- package/docs/examples/logging-default.ts +55 -0
- package/docs/examples/logging-disabled.ts +74 -0
- package/docs/examples/logging-verbose.ts +64 -0
- package/docs/examples/long-running-tasks.ts +179 -0
- package/docs/examples/message-injection.ts +210 -0
- package/docs/examples/mid-stream-injection.ts +126 -0
- package/docs/examples/run-all-examples.sh +48 -0
- package/docs/examples/sdk-tools-callbacks.ts +49 -0
- package/docs/examples/skills-discovery.ts +144 -0
- package/docs/examples/skills-management.ts +140 -0
- package/docs/examples/stream-object.ts +80 -0
- package/docs/examples/streaming.ts +52 -0
- package/docs/examples/structured-output-repro.ts +227 -0
- package/docs/examples/tool-management.ts +215 -0
- package/docs/examples/tool-streaming.ts +132 -0
- package/docs/examples/zod4-compatibility-test.ts +290 -0
- package/docs/src/claude-code-language-model.test.ts +3883 -0
- package/docs/src/claude-code-language-model.ts +2586 -0
- package/docs/src/claude-code-provider.test.ts +97 -0
- package/docs/src/claude-code-provider.ts +179 -0
- package/docs/src/convert-to-claude-code-messages.images.test.ts +104 -0
- package/docs/src/convert-to-claude-code-messages.test.ts +193 -0
- package/docs/src/convert-to-claude-code-messages.ts +419 -0
- package/docs/src/errors.test.ts +213 -0
- package/docs/src/errors.ts +216 -0
- package/docs/src/index.test.ts +49 -0
- package/docs/src/index.ts +98 -0
- package/docs/src/logger.integration.test.ts +164 -0
- package/docs/src/logger.test.ts +184 -0
- package/docs/src/logger.ts +65 -0
- package/docs/src/map-claude-code-finish-reason.test.ts +120 -0
- package/docs/src/map-claude-code-finish-reason.ts +60 -0
- package/docs/src/mcp-helpers.test.ts +71 -0
- package/docs/src/mcp-helpers.ts +123 -0
- package/docs/src/message-injection.test.ts +460 -0
- package/docs/src/types.ts +447 -0
- package/docs/src/validation.test.ts +558 -0
- package/docs/src/validation.ts +360 -0
- package/package.json +124 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../docs/src/claude-code-provider.ts","../docs/src/claude-code-language-model.ts","../docs/src/convert-to-claude-code-messages.ts","../docs/src/errors.ts","../docs/src/map-claude-code-finish-reason.ts","../docs/src/validation.ts","../docs/src/logger.ts","../docs/src/index.ts","../docs/src/mcp-helpers.ts"],"sourcesContent":["import type { LanguageModelV3, ProviderV3 } from '@ai-sdk/provider';\nimport { NoSuchModelError } from '@ai-sdk/provider';\nimport { ClaudeCodeLanguageModel, type ClaudeCodeModelId } from './claude-code-language-model.js';\nimport type { ClaudeCodeSettings } from './types.js';\nimport { validateSettings } from './validation.js';\nimport { getLogger } from './logger.js';\n\n/**\n * Claude Code provider interface that extends the AI SDK's ProviderV3.\n * Provides methods to create language models for interacting with Claude via the CLI.\n *\n * @example\n * ```typescript\n * import { claudeCode } from '@boostecom/provider';\n *\n * // Create a model instance\n * const model = claudeCode('opus');\n *\n * // Or use the explicit methods\n * const chatModel = claudeCode.chat('sonnet');\n * const languageModel = claudeCode.languageModel('opus', { maxTurns: 10 });\n * ```\n */\nexport interface ClaudeCodeProvider extends ProviderV3 {\n /**\n * Creates a language model instance for the specified model ID.\n * This is a shorthand for calling `languageModel()`.\n *\n * @param modelId - The Claude model to use ('opus' or 'sonnet')\n * @param settings - Optional settings to configure the model\n * @returns A language model instance\n */\n (modelId: ClaudeCodeModelId, settings?: ClaudeCodeSettings): LanguageModelV3;\n\n /**\n * Creates a language model instance for text generation.\n *\n * @param modelId - The Claude model to use ('opus' or 'sonnet')\n * @param settings - Optional settings to configure the model\n * @returns A language model instance\n */\n languageModel(modelId: ClaudeCodeModelId, settings?: ClaudeCodeSettings): LanguageModelV3;\n\n /**\n * Alias for `languageModel()` to maintain compatibility with AI SDK patterns.\n *\n * @param modelId - The Claude model to use ('opus' or 'sonnet')\n * @param settings - Optional settings to configure the model\n * @returns A language model instance\n */\n chat(modelId: ClaudeCodeModelId, settings?: ClaudeCodeSettings): LanguageModelV3;\n\n imageModel(modelId: string): never;\n}\n\n/**\n * Configuration options for creating a Claude Code provider instance.\n * These settings will be applied as defaults to all models created by the provider.\n *\n * @example\n * ```typescript\n * const provider = createClaudeCode({\n * defaultSettings: {\n * maxTurns: 5,\n * cwd: '/path/to/project'\n * }\n * });\n * ```\n */\nexport interface ClaudeCodeProviderSettings {\n /**\n * Default settings to use for all models created by this provider.\n * Individual model settings will override these defaults.\n */\n defaultSettings?: ClaudeCodeSettings;\n}\n\n/**\n * Creates a Claude Code provider instance with the specified configuration.\n * The provider can be used to create language models for interacting with Claude 4 models.\n *\n * @param options - Provider configuration options\n * @returns Claude Code provider instance\n *\n * @example\n * ```typescript\n * const provider = createClaudeCode({\n * defaultSettings: {\n * permissionMode: 'bypassPermissions',\n * maxTurns: 10\n * }\n * });\n *\n * const model = provider('opus');\n * ```\n */\nexport function createClaudeCode(options: ClaudeCodeProviderSettings = {}): ClaudeCodeProvider {\n // Get logger from default settings if provided\n const logger = getLogger(options.defaultSettings?.logger);\n\n // Validate default settings if provided\n if (options.defaultSettings) {\n const validation = validateSettings(options.defaultSettings);\n if (!validation.valid) {\n throw new Error(`Invalid default settings: ${validation.errors.join(', ')}`);\n }\n if (validation.warnings.length > 0) {\n validation.warnings.forEach((warning) => logger.warn(`Claude Code Provider: ${warning}`));\n }\n }\n\n const createModel = (\n modelId: ClaudeCodeModelId,\n settings: ClaudeCodeSettings = {}\n ): LanguageModelV3 => {\n const mergedSettings = {\n ...options.defaultSettings,\n ...settings,\n };\n\n // Validate merged settings\n const validation = validateSettings(mergedSettings);\n if (!validation.valid) {\n throw new Error(`Invalid settings: ${validation.errors.join(', ')}`);\n }\n\n return new ClaudeCodeLanguageModel({\n id: modelId,\n settings: mergedSettings,\n settingsValidationWarnings: validation.warnings,\n });\n };\n\n const provider = function (modelId: ClaudeCodeModelId, settings?: ClaudeCodeSettings) {\n if (new.target) {\n throw new Error('The Claude Code model function cannot be called with the new keyword.');\n }\n\n return createModel(modelId, settings);\n };\n\n provider.languageModel = createModel;\n provider.chat = createModel; // Alias for languageModel\n provider.specificationVersion = 'v3' as const;\n\n // Add embeddingModel method that throws NoSuchModelError\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\n };\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'imageModel',\n });\n };\n\n return provider as ClaudeCodeProvider;\n}\n\n/**\n * Default Claude Code provider instance.\n * Pre-configured provider for quick usage without custom settings.\n *\n * @example\n * ```typescript\n * import { claudeCode } from '@boostecom/provider';\n * import { generateText } from 'ai';\n *\n * const { text } = await generateText({\n * model: claudeCode('sonnet'),\n * prompt: 'Hello, Claude!'\n * });\n * ```\n */\nexport const claudeCode = createClaudeCode();\n","import type {\n LanguageModelV3,\n LanguageModelV3FinishReason,\n LanguageModelV3StreamPart,\n LanguageModelV3Usage,\n SharedV3Warning,\n JSONValue,\n JSONObject,\n} from '@ai-sdk/provider';\nimport { NoSuchModelError, APICallError, LoadAPIKeyError } from '@ai-sdk/provider';\nimport { generateId } from '@ai-sdk/provider-utils';\nimport type { ClaudeCodeSettings, Logger, MessageInjector } from './types.js';\nimport { convertToClaudeCodeMessages } from './convert-to-claude-code-messages.js';\nimport { createAPICallError, createAuthenticationError, createTimeoutError } from './errors.js';\nimport { mapClaudeCodeFinishReason } from './map-claude-code-finish-reason.js';\nimport { validateModelId, validatePrompt, validateSessionId } from './validation.js';\nimport { getLogger, createVerboseLogger } from './logger.js';\n\nimport { query, type Options } from '@anthropic-ai/claude-agent-sdk';\nimport type { SDKUserMessage, SDKPartialAssistantMessage } from '@anthropic-ai/claude-agent-sdk';\n\nconst CLAUDE_CODE_TRUNCATION_WARNING =\n 'Claude Code SDK output ended unexpectedly; returning truncated response from buffered text. Await upstream fix to avoid data loss.';\n\nconst MIN_TRUNCATION_LENGTH = 512;\n\n/**\n * Detects if an error represents a truncated SDK JSON stream.\n *\n * The Claude Code SDK can truncate JSON responses mid-stream, producing a SyntaxError.\n * This function distinguishes genuine truncation from normal JSON syntax errors by:\n * 1. Verifying the error is a SyntaxError with truncation-specific messages\n * 2. Ensuring we received meaningful content (>= MIN_TRUNCATION_LENGTH characters)\n * 3. Avoiding false positives from unrelated parse errors\n *\n * Note: We compare against `bufferedText` (assistant text content) rather than the raw\n * JSON buffer length, since the SDK layer doesn't expose buffer positions. The position\n * reported in SyntaxError messages measures the full JSON payload (metadata + content),\n * which is typically much larger than extracted text. Therefore, we cannot reliably use\n * position proximity checks and instead rely on message patterns and content length.\n *\n * @param error - The caught error (expected to be SyntaxError for truncation)\n * @param bufferedText - Accumulated assistant text content (measured in UTF-16 code units)\n * @returns true if error indicates SDK truncation; false otherwise\n */\nfunction isClaudeCodeTruncationError(error: unknown, bufferedText: string): boolean {\n // Check for SyntaxError by instanceof or by name (for cross-realm errors)\n const isSyntaxError =\n error instanceof SyntaxError ||\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (typeof (error as any)?.name === 'string' &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).name.toLowerCase() === 'syntaxerror');\n\n if (!isSyntaxError) {\n return false;\n }\n\n if (!bufferedText) {\n return false;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const rawMessage = typeof (error as any)?.message === 'string' ? (error as any).message : '';\n const message = rawMessage.toLowerCase();\n\n // Only match actual truncation patterns, not normal JSON parsing errors.\n // Real truncation: \"Unexpected end of JSON input\" or \"Unterminated string in JSON...\"\n // Normal errors: \"Unexpected token X in JSON at position N\" (should be surfaced as errors)\n const truncationIndicators = [\n 'unexpected end of json input',\n 'unexpected end of input',\n 'unexpected end of string',\n 'unexpected eof',\n 'end of file',\n 'unterminated string',\n 'unterminated string constant',\n ];\n\n if (!truncationIndicators.some((indicator) => message.includes(indicator))) {\n return false;\n }\n\n // Require meaningful content before treating as truncation.\n // Short responses with \"end of input\" errors are likely genuine syntax errors.\n // Note: bufferedText.length measures UTF-16 code units, not byte length.\n if (bufferedText.length < MIN_TRUNCATION_LENGTH) {\n return false;\n }\n\n // If we have a truncation indicator AND meaningful content, treat as truncation.\n return true;\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (err && typeof err === 'object') {\n const e = err as { name?: unknown; code?: unknown };\n if (typeof e.name === 'string' && e.name === 'AbortError') return true;\n if (typeof e.code === 'string' && e.code.toUpperCase() === 'ABORT_ERR') return true;\n }\n return false;\n}\n\nconst DEFAULT_INHERITED_ENV_VARS =\n process.platform === 'win32'\n ? [\n 'APPDATA',\n 'HOMEDRIVE',\n 'HOMEPATH',\n 'LOCALAPPDATA',\n 'PATH',\n 'PATHEXT',\n 'SYSTEMDRIVE',\n 'SYSTEMROOT',\n 'TEMP',\n 'TMP',\n 'USERNAME',\n 'USERPROFILE',\n 'WINDIR',\n ]\n : ['HOME', 'LOGNAME', 'PATH', 'SHELL', 'TERM', 'USER', 'LANG', 'LC_ALL', 'TMPDIR'];\n\nconst CLAUDE_ENV_VARS = ['CLAUDE_CONFIG_DIR'];\n\nfunction getBaseProcessEnv(): Record<string, string> {\n const env: Record<string, string> = {};\n const allowedKeys = new Set([...DEFAULT_INHERITED_ENV_VARS, ...CLAUDE_ENV_VARS]);\n\n for (const key of allowedKeys) {\n const value = process.env[key];\n if (typeof value !== 'string') {\n continue;\n }\n\n if (value.startsWith('()')) {\n continue;\n }\n\n env[key] = value;\n }\n\n return env;\n}\n\nconst STREAMING_FEATURE_WARNING =\n \"Claude Agent SDK features (hooks/MCP/images) require streaming input. Set `streamingInput: 'always'` or provide `canUseTool` (auto streams only when canUseTool is set).\";\n\nconst SDK_OPTIONS_BLOCKLIST = new Set(['model', 'abortController', 'prompt', 'outputFormat']);\n\ntype ClaudeToolUse = {\n id: string;\n name: string;\n input: unknown;\n parentToolUseId?: string | null;\n};\n\ntype ClaudeToolResult = {\n id: string;\n name?: string;\n result: unknown;\n isError: boolean;\n};\n\n// Provider extension for tool-error stream parts.\ntype ToolErrorPart = {\n type: 'tool-error';\n toolCallId: string;\n toolName: string;\n error: string;\n providerExecuted: true;\n providerMetadata?: Record<string, JSONValue>;\n};\n\n// Local extension of the AI SDK stream part union to include tool-error.\ntype ExtendedStreamPart = LanguageModelV3StreamPart | ToolErrorPart;\n\n/**\n * Usage data from Claude Code SDK.\n */\ntype ClaudeCodeUsage = {\n input_tokens?: number | null;\n output_tokens?: number | null;\n cache_creation_input_tokens?: number | null;\n cache_read_input_tokens?: number | null;\n};\n\n/**\n * Creates a zero-initialized usage object for AI SDK v6 stable.\n */\nfunction createEmptyUsage(): LanguageModelV3Usage {\n return {\n inputTokens: {\n total: 0,\n noCache: 0,\n cacheRead: 0,\n cacheWrite: 0,\n },\n outputTokens: {\n total: 0,\n text: undefined,\n reasoning: undefined,\n },\n raw: undefined,\n };\n}\n\n/**\n * Converts Claude Code SDK usage to AI SDK v6 stable usage format.\n *\n * Maps Claude's flat token counts to the nested structure required by AI SDK v6:\n * - `cache_creation_input_tokens` → `inputTokens.cacheWrite`\n * - `cache_read_input_tokens` → `inputTokens.cacheRead`\n * - `input_tokens` → `inputTokens.noCache`\n * - `inputTokens.total` = sum of all input tokens\n * - `output_tokens` → `outputTokens.total`\n *\n * @param usage - Raw usage data from Claude Code SDK\n * @returns Formatted usage object for AI SDK v6\n */\nfunction convertClaudeCodeUsage(usage: ClaudeCodeUsage): LanguageModelV3Usage {\n const inputTokens = usage.input_tokens ?? 0;\n const outputTokens = usage.output_tokens ?? 0;\n const cacheWrite = usage.cache_creation_input_tokens ?? 0;\n const cacheRead = usage.cache_read_input_tokens ?? 0;\n\n return {\n inputTokens: {\n total: inputTokens + cacheWrite + cacheRead,\n noCache: inputTokens,\n cacheRead,\n cacheWrite,\n },\n outputTokens: {\n total: outputTokens,\n text: undefined,\n reasoning: undefined,\n },\n raw: usage as JSONObject,\n };\n}\n\n/**\n * Tracks the streaming lifecycle state for a single tool invocation.\n *\n * The tool streaming lifecycle follows this sequence:\n * 1. Tool use detected → state created with all flags false\n * 2. First input seen → `inputStarted` = true, emit `tool-input-start`\n * 3. Input deltas streamed → emit `tool-input-delta` (may be skipped for large/non-prefix updates)\n * 4. Input finalized → `inputClosed` = true, emit `tool-input-end`\n * 5. Tool call formed → `callEmitted` = true, emit `tool-call`\n * 6. Tool results/errors arrive → emit `tool-result` or `tool-error` (may occur multiple times)\n * 7. Stream ends → state cleaned up by `finalizeToolCalls()`\n *\n * @property name - Tool name from SDK (e.g., \"Bash\", \"Read\")\n * @property lastSerializedInput - Most recent serialized input, used for delta calculation\n * @property inputStarted - True after `tool-input-start` emitted; prevents duplicate start events\n * @property inputClosed - True after `tool-input-end` emitted; ensures proper event ordering\n * @property callEmitted - True after `tool-call` emitted; prevents duplicate call events when\n * multiple result/error chunks arrive for the same tool invocation\n */\ntype ToolStreamState = {\n name: string;\n lastSerializedInput?: string;\n inputStarted: boolean;\n inputClosed: boolean;\n callEmitted: boolean;\n parentToolCallId?: string | null;\n};\n\n/**\n * Queued injection item with content and optional delivery callback.\n */\ntype QueuedInjection = {\n content: string;\n onResult?: (delivered: boolean) => void;\n};\n\n/**\n * Creates a MessageInjector implementation that can queue messages for mid-session injection.\n * The injector uses a queue and signals to coordinate between the producer (user code)\n * and consumer (async generator).\n *\n * Note: getNextItem returns the full QueuedInjection so the consumer can call onResult\n * AFTER successfully yielding, avoiding a race condition with outputStreamEnded.\n */\nfunction createMessageInjector(): {\n injector: MessageInjector;\n getNextItem: () => Promise<QueuedInjection | null>;\n notifySessionEnded: () => void;\n} {\n const queue: QueuedInjection[] = [];\n let closed = false;\n let resolver: ((item: QueuedInjection | null) => void) | null = null;\n\n const injector: MessageInjector = {\n inject(content, onResult) {\n if (closed) {\n // Already closed - immediately notify not delivered\n onResult?.(false);\n return;\n }\n const item: QueuedInjection = { content, onResult };\n if (resolver) {\n // Consumer is waiting, resolve immediately\n const r = resolver;\n resolver = null;\n r(item);\n } else {\n // Queue for later consumption\n queue.push(item);\n }\n },\n close() {\n // Stop accepting new messages, but don't cancel pending ones\n // Pending messages can still be delivered until session ends\n closed = true;\n if (resolver && queue.length === 0) {\n // No pending messages and consumer is waiting - signal done\n resolver(null);\n resolver = null;\n }\n },\n };\n\n const getNextItem = (): Promise<QueuedInjection | null> => {\n if (queue.length > 0) {\n const item = queue.shift();\n if (!item) {\n return Promise.resolve(null);\n }\n // Return the full item - caller is responsible for calling onResult after yielding\n return Promise.resolve(item);\n }\n if (closed) {\n // Closed and queue is empty - no more messages\n return Promise.resolve(null);\n }\n return new Promise((resolve) => {\n resolver = (item) => {\n // Return the full item (or null) - caller handles onResult\n resolve(item);\n };\n });\n };\n\n const notifySessionEnded = () => {\n // Session ended - any remaining queued messages won't be delivered\n for (const item of queue) {\n item.onResult?.(false);\n }\n queue.length = 0;\n closed = true;\n if (resolver) {\n resolver(null);\n resolver = null;\n }\n };\n\n return { injector, getNextItem, notifySessionEnded };\n}\n\nfunction toAsyncIterablePrompt(\n messagesPrompt: string,\n outputStreamEnded: Promise<unknown>,\n sessionId?: string,\n contentParts?: SDKUserMessage['message']['content'],\n onStreamStart?: (injector: MessageInjector) => void\n): AsyncIterable<SDKUserMessage> {\n const content = (\n contentParts && contentParts.length > 0\n ? contentParts\n : [{ type: 'text', text: messagesPrompt }]\n ) as SDKUserMessage['message']['content'];\n\n const initialMsg: SDKUserMessage = {\n type: 'user',\n message: {\n role: 'user',\n content,\n },\n parent_tool_use_id: null,\n session_id: sessionId ?? '',\n };\n\n // If no callback, use simple behavior (backwards compatible)\n if (!onStreamStart) {\n return {\n async *[Symbol.asyncIterator]() {\n yield initialMsg;\n await outputStreamEnded;\n },\n };\n }\n\n // With injection support: create injector and yield messages as they arrive\n const { injector, getNextItem, notifySessionEnded } = createMessageInjector();\n\n return {\n async *[Symbol.asyncIterator]() {\n // Yield initial message\n yield initialMsg;\n\n // Notify consumer that streaming has started\n onStreamStart(injector);\n\n // Race between output ending and new messages arriving\n let streamEnded = false;\n void outputStreamEnded.then(() => {\n streamEnded = true;\n // Notify any pending injections that the session ended\n notifySessionEnded();\n });\n\n // Keep yielding injected messages until stream ends or injector closes\n while (!streamEnded) {\n // Race getNextItem against outputStreamEnded\n // We get the full item so we can call onResult AFTER yielding\n const item = await Promise.race([getNextItem(), outputStreamEnded.then(() => null)]);\n\n if (item === null) {\n // Ensure we don't close the input stream prematurely.\n // Wait for output to complete to avoid truncation issues.\n await outputStreamEnded;\n break;\n }\n\n const sdkMsg: SDKUserMessage = {\n type: 'user',\n message: {\n role: 'user',\n content: [{ type: 'text', text: item.content }],\n },\n parent_tool_use_id: null,\n session_id: sessionId ?? '',\n };\n yield sdkMsg;\n\n // Only report delivery AFTER successfully yielding\n item.onResult?.(true);\n }\n },\n };\n}\n\n/**\n * Options for creating a Claude Code language model instance.\n *\n * @example\n * ```typescript\n * const model = new ClaudeCodeLanguageModel({\n * id: 'opus',\n * settings: {\n * maxTurns: 10,\n * permissionMode: 'auto'\n * }\n * });\n * ```\n */\nexport interface ClaudeCodeLanguageModelOptions {\n /**\n * The model identifier to use.\n * Can be 'opus', 'sonnet', 'haiku', or a custom model string.\n */\n id: ClaudeCodeModelId;\n\n /**\n * Optional settings to configure the model behavior.\n */\n settings?: ClaudeCodeSettings;\n\n /**\n * Validation warnings from settings validation.\n * Used internally to pass warnings from provider.\n */\n settingsValidationWarnings?: string[];\n}\n\n/**\n * Supported Claude model identifiers.\n * - 'opus': Claude Opus (most capable)\n * - 'sonnet': Claude Sonnet (balanced performance)\n * - 'haiku': Claude Haiku (fastest, most cost-effective)\n * - Custom string: Any full model identifier (e.g., 'claude-opus-4-5', 'claude-sonnet-4-5-20250514')\n *\n * @example\n * ```typescript\n * const opusModel = claudeCode('opus');\n * const sonnetModel = claudeCode('sonnet');\n * const haikuModel = claudeCode('haiku');\n * const customModel = claudeCode('claude-opus-4-5');\n * ```\n */\nexport type ClaudeCodeModelId = 'opus' | 'sonnet' | 'haiku' | (string & {});\n\nconst modelMap: Record<string, string> = {\n opus: 'opus',\n sonnet: 'sonnet',\n haiku: 'haiku',\n};\n\n/**\n * Maximum size for tool results sent to the client stream.\n * Interior Claude Code process has full data; this only affects client stream.\n */\nconst MAX_TOOL_RESULT_SIZE = 10000;\n\n/**\n * Truncates large tool results to prevent stream bloat.\n * Only the largest string value in an object/array is truncated.\n * Preserves the original type (array stays array, object stays object).\n */\nfunction truncateToolResultForStream(\n result: unknown,\n maxSize: number = MAX_TOOL_RESULT_SIZE\n): unknown {\n if (typeof result === 'string') {\n if (result.length <= maxSize) return result;\n return result.slice(0, maxSize) + `\\n...[truncated ${result.length - maxSize} chars]`;\n }\n\n if (typeof result !== 'object' || result === null) return result;\n\n // Handle arrays separately to preserve array type\n if (Array.isArray(result)) {\n let largestIndex = -1;\n let largestSize = 0;\n\n for (let i = 0; i < result.length; i++) {\n const value = result[i];\n if (typeof value === 'string' && value.length > largestSize) {\n largestIndex = i;\n largestSize = value.length;\n }\n }\n\n if (largestIndex >= 0 && largestSize > maxSize) {\n const truncatedValue =\n (result[largestIndex] as string).slice(0, maxSize) +\n `\\n...[truncated ${largestSize - maxSize} chars]`;\n const cloned = [...result];\n cloned[largestIndex] = truncatedValue;\n return cloned;\n }\n\n return result;\n }\n\n // For objects, find and truncate only the largest string value\n const obj = result as Record<string, unknown>;\n let largestKey: string | null = null;\n let largestSize = 0;\n\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'string' && value.length > largestSize) {\n largestKey = key;\n largestSize = value.length;\n }\n }\n\n if (largestKey && largestSize > maxSize) {\n const truncatedValue =\n (obj[largestKey] as string).slice(0, maxSize) +\n `\\n...[truncated ${largestSize - maxSize} chars]`;\n return { ...obj, [largestKey]: truncatedValue };\n }\n\n return result;\n}\n\n/**\n * Language model implementation for Claude Code SDK.\n * This class implements the AI SDK's LanguageModelV3 interface to provide\n * integration with Claude models through the Claude Agent SDK.\n *\n * Features:\n * - Supports streaming and non-streaming generation\n * - Native structured outputs via SDK's outputFormat (guaranteed schema compliance)\n * - Manages CLI sessions for conversation continuity\n * - Provides detailed error handling and retry logic\n *\n * Limitations:\n * - Image inputs require streaming mode\n * - Some parameters like temperature and max tokens are not supported by the CLI\n *\n * @example\n * ```typescript\n * const model = new ClaudeCodeLanguageModel({\n * id: 'opus',\n * settings: { maxTurns: 5 }\n * });\n *\n * const result = await model.doGenerate({\n * prompt: [{ role: 'user', content: 'Hello!' }],\n * mode: { type: 'regular' }\n * });\n * ```\n */\n\nexport class ClaudeCodeLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3' as const;\n readonly defaultObjectGenerationMode = 'json' as const;\n readonly supportsImageUrls = false;\n readonly supportedUrls = {};\n readonly supportsStructuredOutputs = true;\n\n // Fallback/magic string constants\n static readonly UNKNOWN_TOOL_NAME = 'unknown-tool';\n\n // Tool input safety limits\n private static readonly MAX_TOOL_INPUT_SIZE = 1_048_576; // 1MB hard limit\n private static readonly MAX_TOOL_INPUT_WARN = 102_400; // 100KB warning threshold\n private static readonly MAX_DELTA_CALC_SIZE = 10_000; // 10KB delta computation threshold\n\n readonly modelId: ClaudeCodeModelId;\n readonly settings: ClaudeCodeSettings;\n\n private sessionId?: string;\n private modelValidationWarning?: string;\n private settingsValidationWarnings: string[];\n private logger: Logger;\n\n constructor(options: ClaudeCodeLanguageModelOptions) {\n this.modelId = options.id;\n this.settings = options.settings ?? {};\n this.settingsValidationWarnings = options.settingsValidationWarnings ?? [];\n\n // Create logger that respects verbose setting\n const baseLogger = getLogger(this.settings.logger);\n this.logger = createVerboseLogger(baseLogger, this.settings.verbose ?? false);\n\n // Validate model ID format\n if (!this.modelId || typeof this.modelId !== 'string' || this.modelId.trim() === '') {\n throw new NoSuchModelError({\n modelId: this.modelId,\n modelType: 'languageModel',\n });\n }\n\n // Additional model ID validation\n this.modelValidationWarning = validateModelId(this.modelId);\n if (this.modelValidationWarning) {\n this.logger.warn(`Claude Code Model: ${this.modelValidationWarning}`);\n }\n }\n\n get provider(): string {\n return 'claude-code';\n }\n\n private getModel(): string {\n const mapped = modelMap[this.modelId];\n return mapped ?? this.modelId;\n }\n\n private getSanitizedSdkOptions(): Partial<Options> | undefined {\n if (!this.settings.sdkOptions || typeof this.settings.sdkOptions !== 'object') {\n return undefined;\n }\n\n const sanitized = { ...(this.settings.sdkOptions as Record<string, unknown>) };\n const blockedKeys = Array.from(SDK_OPTIONS_BLOCKLIST).filter((key) => key in sanitized);\n\n if (blockedKeys.length > 0) {\n this.logger.warn(\n `[claude-code] sdkOptions includes provider-managed fields (${blockedKeys.join(\n ', '\n )}); these will be ignored.`\n );\n blockedKeys.forEach((key) => delete sanitized[key]);\n }\n\n return sanitized as Partial<Options>;\n }\n\n private getEffectiveResume(sdkOptions?: Partial<Options>): string | undefined {\n return sdkOptions?.resume ?? this.settings.resume ?? this.sessionId;\n }\n\n private extractToolUses(content: unknown): ClaudeToolUse[] {\n if (!Array.isArray(content)) {\n return [];\n }\n\n return content\n .filter(\n (item): item is { type: string; id?: unknown; name?: unknown; input?: unknown } =>\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n (item as { type: unknown }).type === 'tool_use'\n )\n .map((item) => {\n const { id, name, input, parent_tool_use_id } = item as {\n id?: unknown;\n name?: unknown;\n input?: unknown;\n parent_tool_use_id?: unknown;\n };\n return {\n id: typeof id === 'string' && id.length > 0 ? id : generateId(),\n name:\n typeof name === 'string' && name.length > 0\n ? name\n : ClaudeCodeLanguageModel.UNKNOWN_TOOL_NAME,\n input,\n parentToolUseId: typeof parent_tool_use_id === 'string' ? parent_tool_use_id : null,\n } satisfies ClaudeToolUse;\n });\n }\n\n private extractToolResults(content: unknown): ClaudeToolResult[] {\n if (!Array.isArray(content)) {\n return [];\n }\n\n return content\n .filter(\n (\n item\n ): item is {\n type: string;\n tool_use_id?: unknown;\n content?: unknown;\n is_error?: unknown;\n name?: unknown;\n } =>\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n (item as { type: unknown }).type === 'tool_result'\n )\n .map((item) => {\n const { tool_use_id, content, is_error, name } = item;\n return {\n id:\n typeof tool_use_id === 'string' && tool_use_id.length > 0 ? tool_use_id : generateId(),\n name: typeof name === 'string' && name.length > 0 ? name : undefined,\n result: content,\n isError: Boolean(is_error),\n } satisfies ClaudeToolResult;\n });\n }\n\n private extractToolErrors(content: unknown): Array<{\n id: string;\n name?: string;\n error: unknown;\n }> {\n if (!Array.isArray(content)) {\n return [];\n }\n\n return content\n .filter(\n (\n item\n ): item is {\n type: string;\n tool_use_id?: unknown;\n error?: unknown;\n name?: unknown;\n } =>\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n (item as { type: unknown }).type === 'tool_error'\n )\n .map((item) => {\n const { tool_use_id, error, name } = item as {\n tool_use_id?: unknown;\n error?: unknown;\n name?: unknown;\n };\n return {\n id:\n typeof tool_use_id === 'string' && tool_use_id.length > 0 ? tool_use_id : generateId(),\n name: typeof name === 'string' && name.length > 0 ? name : undefined,\n error,\n };\n });\n }\n\n private serializeToolInput(input: unknown): string {\n if (typeof input === 'string') {\n return this.checkInputSize(input);\n }\n\n if (input === undefined) {\n return '';\n }\n\n try {\n const serialized = JSON.stringify(input);\n return this.checkInputSize(serialized);\n } catch {\n const fallback = String(input);\n return this.checkInputSize(fallback);\n }\n }\n\n private checkInputSize(str: string): string {\n const length = str.length;\n\n if (length > ClaudeCodeLanguageModel.MAX_TOOL_INPUT_SIZE) {\n throw new Error(\n `Tool input exceeds maximum size of ${ClaudeCodeLanguageModel.MAX_TOOL_INPUT_SIZE} bytes (got ${length} bytes). This may indicate a malformed request or an attempt to process excessively large data.`\n );\n }\n\n if (length > ClaudeCodeLanguageModel.MAX_TOOL_INPUT_WARN) {\n this.logger.warn(\n `[claude-code] Large tool input detected: ${length} bytes. Performance may be impacted. Consider chunking or reducing input size.`\n );\n }\n\n return str;\n }\n\n private normalizeToolResult(result: unknown): unknown {\n if (typeof result === 'string') {\n try {\n return JSON.parse(result);\n } catch {\n return result;\n }\n }\n // Handle MCP content format: [{type: 'text', text: '...'}, ...]\n // MCP tools can return multiple content blocks; only normalize when all blocks are text.\n if (Array.isArray(result) && result.length > 0) {\n // Collect all text content from text blocks\n const textBlocks = result\n .filter(\n (block): block is { type: 'text'; text: string } =>\n block?.type === 'text' && typeof block.text === 'string'\n )\n .map((block) => block.text);\n\n if (textBlocks.length !== result.length) {\n return result;\n }\n\n // If single text block, try to parse as JSON\n if (textBlocks.length === 1) {\n try {\n return JSON.parse(textBlocks[0]);\n } catch {\n return textBlocks[0];\n }\n }\n\n // Multiple text blocks: join them and try to parse as JSON\n const combined = textBlocks.join('\\n');\n try {\n return JSON.parse(combined);\n } catch {\n return combined;\n }\n }\n\n return result;\n }\n\n private generateAllWarnings(\n options:\n | Parameters<LanguageModelV3['doGenerate']>[0]\n | Parameters<LanguageModelV3['doStream']>[0],\n prompt: string\n ): SharedV3Warning[] {\n const warnings: SharedV3Warning[] = [];\n const unsupportedParams: string[] = [];\n\n // Check for unsupported parameters\n if (options.temperature !== undefined) unsupportedParams.push('temperature');\n if (options.topP !== undefined) unsupportedParams.push('topP');\n if (options.topK !== undefined) unsupportedParams.push('topK');\n if (options.presencePenalty !== undefined) unsupportedParams.push('presencePenalty');\n if (options.frequencyPenalty !== undefined) unsupportedParams.push('frequencyPenalty');\n if (options.stopSequences !== undefined && options.stopSequences.length > 0)\n unsupportedParams.push('stopSequences');\n if (options.seed !== undefined) unsupportedParams.push('seed');\n\n if (unsupportedParams.length > 0) {\n // Add a warning for each unsupported parameter\n for (const param of unsupportedParams) {\n warnings.push({\n type: 'unsupported',\n feature: param,\n details: `Claude Code SDK does not support the ${param} parameter. It will be ignored.`,\n });\n }\n }\n\n // Add model validation warning if present\n if (this.modelValidationWarning) {\n warnings.push({\n type: 'other',\n message: this.modelValidationWarning,\n });\n }\n\n // Add settings validation warnings\n this.settingsValidationWarnings.forEach((warning) => {\n warnings.push({\n type: 'other',\n message: warning,\n });\n });\n\n // Warn if JSON response format is requested without a schema\n // Claude Code only supports structured outputs with schemas (like Anthropic's API)\n if (options.responseFormat?.type === 'json' && !options.responseFormat.schema) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details:\n 'JSON response format requires a schema for the Claude Code provider. The JSON responseFormat is ignored and the call is treated as plain text.',\n });\n }\n\n // Validate prompt\n const promptWarning = validatePrompt(prompt);\n if (promptWarning) {\n warnings.push({\n type: 'other',\n message: promptWarning,\n });\n }\n\n return warnings;\n }\n\n private createQueryOptions(\n abortController: AbortController,\n responseFormat?: Parameters<LanguageModelV3['doGenerate']>[0]['responseFormat'],\n stderrCollector?: (data: string) => void,\n sdkOptions?: Partial<Options>,\n effectiveResume?: string\n ): Options {\n const opts: Partial<Options> & Record<string, unknown> = {\n model: this.getModel(),\n abortController,\n resume: effectiveResume ?? this.settings.resume ?? this.sessionId,\n pathToClaudeCodeExecutable: this.settings.pathToClaudeCodeExecutable,\n maxTurns: this.settings.maxTurns,\n maxThinkingTokens: this.settings.maxThinkingTokens,\n cwd: this.settings.cwd,\n executable: this.settings.executable,\n executableArgs: this.settings.executableArgs,\n permissionMode: this.settings.permissionMode,\n permissionPromptToolName: this.settings.permissionPromptToolName,\n continue: this.settings.continue,\n allowedTools: this.settings.allowedTools,\n disallowedTools: this.settings.disallowedTools,\n betas: this.settings.betas,\n allowDangerouslySkipPermissions: this.settings.allowDangerouslySkipPermissions,\n enableFileCheckpointing: this.settings.enableFileCheckpointing,\n maxBudgetUsd: this.settings.maxBudgetUsd,\n plugins: this.settings.plugins,\n resumeSessionAt: this.settings.resumeSessionAt,\n sandbox: this.settings.sandbox,\n tools: this.settings.tools,\n mcpServers: this.settings.mcpServers,\n canUseTool: this.settings.canUseTool,\n };\n // NEW: Agent SDK options with legacy mapping\n if (this.settings.systemPrompt !== undefined) {\n opts.systemPrompt = this.settings.systemPrompt;\n } else if (this.settings.customSystemPrompt !== undefined) {\n // Deprecation warning for legacy field\n this.logger.warn(\n \"[claude-code] 'customSystemPrompt' is deprecated and will be removed in a future major release. Please use 'systemPrompt' instead (string or { type: 'preset', preset: 'claude_code', append? }).\"\n );\n opts.systemPrompt = this.settings.customSystemPrompt;\n } else if (this.settings.appendSystemPrompt !== undefined) {\n // Deprecation warning for legacy field\n this.logger.warn(\n \"[claude-code] 'appendSystemPrompt' is deprecated and will be removed in a future major release. Please use 'systemPrompt: { type: 'preset', preset: 'claude_code', append: <text> }' instead.\"\n );\n opts.systemPrompt = {\n type: 'preset',\n preset: 'claude_code',\n append: this.settings.appendSystemPrompt,\n } as const;\n }\n if (this.settings.settingSources !== undefined) {\n opts.settingSources = this.settings.settingSources;\n }\n if (this.settings.additionalDirectories !== undefined) {\n opts.additionalDirectories = this.settings.additionalDirectories;\n }\n if (this.settings.agents !== undefined) {\n opts.agents = this.settings.agents;\n }\n if (this.settings.includePartialMessages !== undefined) {\n opts.includePartialMessages = this.settings.includePartialMessages;\n }\n if (this.settings.fallbackModel !== undefined) {\n opts.fallbackModel = this.settings.fallbackModel;\n }\n if (this.settings.forkSession !== undefined) {\n opts.forkSession = this.settings.forkSession;\n }\n if (this.settings.strictMcpConfig !== undefined) {\n opts.strictMcpConfig = this.settings.strictMcpConfig;\n }\n if (this.settings.extraArgs !== undefined) {\n opts.extraArgs = this.settings.extraArgs;\n }\n if (this.settings.persistSession !== undefined) {\n opts.persistSession = this.settings.persistSession;\n }\n if (this.settings.spawnClaudeCodeProcess !== undefined) {\n opts.spawnClaudeCodeProcess = this.settings.spawnClaudeCodeProcess;\n }\n // hooks is supported in newer SDKs; include it if provided\n if (this.settings.hooks) {\n opts.hooks = this.settings.hooks;\n }\n if (this.settings.sessionId !== undefined) {\n opts.sessionId = this.settings.sessionId;\n }\n if (this.settings.debug !== undefined) {\n opts.debug = this.settings.debug;\n }\n if (this.settings.debugFile !== undefined) {\n opts.debugFile = this.settings.debugFile;\n }\n\n const sdkOverrides = sdkOptions\n ? (sdkOptions as Partial<Options> & Record<string, unknown>)\n : undefined;\n const sdkEnv =\n sdkOverrides && typeof sdkOverrides.env === 'object' && sdkOverrides.env !== null\n ? (sdkOverrides.env as Record<string, string | undefined>)\n : undefined;\n const sdkStderr =\n sdkOverrides && typeof sdkOverrides.stderr === 'function'\n ? (sdkOverrides.stderr as (data: string) => void)\n : undefined;\n if (sdkOverrides) {\n const rest = { ...sdkOverrides };\n delete rest.env;\n delete rest.stderr;\n Object.assign(opts, rest);\n }\n\n // Wrap stderr callback to also collect data for error reporting\n const userStderrCallback = sdkStderr ?? this.settings.stderr;\n if (stderrCollector || userStderrCallback) {\n opts.stderr = (data: string) => {\n if (stderrCollector) stderrCollector(data);\n if (userStderrCallback) userStderrCallback(data);\n };\n }\n\n if (this.settings.env !== undefined || sdkEnv !== undefined) {\n const baseEnv = getBaseProcessEnv();\n opts.env = { ...baseEnv, ...this.settings.env, ...sdkEnv };\n }\n\n // Native structured outputs (SDK 0.1.45+)\n if (responseFormat?.type === 'json' && responseFormat.schema) {\n opts.outputFormat = {\n type: 'json_schema',\n schema: responseFormat.schema as Record<string, unknown>,\n };\n }\n\n return opts as Options;\n }\n\n private handleClaudeCodeError(\n error: unknown,\n messagesPrompt: string,\n collectedStderr?: string\n ): APICallError | LoadAPIKeyError {\n // Handle AbortError from the SDK\n if (isAbortError(error)) {\n // Return the abort reason if available, otherwise the error itself\n throw error;\n }\n\n // Type guard for error with properties\n const isErrorWithMessage = (err: unknown): err is { message?: string } => {\n return typeof err === 'object' && err !== null && 'message' in err;\n };\n\n const isErrorWithCode = (\n err: unknown\n ): err is { code?: string; exitCode?: number; stderr?: string } => {\n return typeof err === 'object' && err !== null;\n };\n\n // Check for authentication errors with improved detection\n const authErrorPatterns = [\n 'not logged in',\n 'authentication',\n 'unauthorized',\n 'auth failed',\n 'please login',\n 'claude login',\n '/login', // CLI returns \"Please run /login\"\n 'invalid api key',\n ];\n\n const errorMessage =\n isErrorWithMessage(error) && error.message ? error.message.toLowerCase() : '';\n\n const exitCode =\n isErrorWithCode(error) && typeof error.exitCode === 'number' ? error.exitCode : undefined;\n\n const isAuthError =\n authErrorPatterns.some((pattern) => errorMessage.includes(pattern)) || exitCode === 401;\n\n if (isAuthError) {\n return createAuthenticationError({\n message:\n isErrorWithMessage(error) && error.message\n ? error.message\n : 'Authentication failed. Please ensure Claude Code SDK is properly authenticated.',\n });\n }\n\n // Check for timeout errors\n const errorCode = isErrorWithCode(error) && typeof error.code === 'string' ? error.code : '';\n\n if (errorCode === 'ETIMEDOUT' || errorMessage.includes('timeout')) {\n return createTimeoutError({\n message: isErrorWithMessage(error) && error.message ? error.message : 'Request timed out',\n promptExcerpt: messagesPrompt.substring(0, 200),\n // Don't specify timeoutMs since we don't know the actual timeout value\n // It's controlled by the consumer via AbortSignal\n });\n }\n\n // Create general API call error with appropriate retry flag\n const isRetryable =\n errorCode === 'ENOENT' ||\n errorCode === 'ECONNREFUSED' ||\n errorCode === 'ETIMEDOUT' ||\n errorCode === 'ECONNRESET';\n\n // Use error.stderr if available from SDK, otherwise use collected stderr\n const stderrFromError =\n isErrorWithCode(error) && typeof error.stderr === 'string' ? error.stderr : undefined;\n const stderr = stderrFromError || collectedStderr || undefined;\n\n return createAPICallError({\n message: isErrorWithMessage(error) && error.message ? error.message : 'Claude Code SDK error',\n code: errorCode || undefined,\n exitCode: exitCode,\n stderr,\n promptExcerpt: messagesPrompt.substring(0, 200),\n isRetryable,\n });\n }\n\n private setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n const warning = validateSessionId(sessionId);\n if (warning) {\n this.logger.warn(`Claude Code Session: ${warning}`);\n }\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV3['doGenerate']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV3['doGenerate']>>> {\n this.logger.debug(`[claude-code] Starting doGenerate request with model: ${this.modelId}`);\n this.logger.debug(`[claude-code] Response format: ${options.responseFormat?.type ?? 'none'}`);\n\n const {\n messagesPrompt,\n warnings: messageWarnings,\n streamingContentParts,\n hasImageParts,\n } = convertToClaudeCodeMessages(options.prompt);\n\n this.logger.debug(\n `[claude-code] Converted ${options.prompt.length} messages, hasImageParts: ${hasImageParts}`\n );\n\n const abortController = new AbortController();\n let abortListener: (() => void) | undefined;\n if (options.abortSignal?.aborted) {\n // Propagate already-aborted state immediately with original reason\n abortController.abort(options.abortSignal.reason);\n } else if (options.abortSignal) {\n abortListener = () => abortController.abort(options.abortSignal?.reason);\n options.abortSignal.addEventListener('abort', abortListener, { once: true });\n }\n\n // Collect stderr for error reporting (SDK may not include it in errors)\n let collectedStderr = '';\n const stderrCollector = (data: string) => {\n collectedStderr += data;\n };\n\n const sdkOptions = this.getSanitizedSdkOptions();\n const effectiveResume = this.getEffectiveResume(sdkOptions);\n const queryOptions = this.createQueryOptions(\n abortController,\n options.responseFormat,\n stderrCollector,\n sdkOptions,\n effectiveResume\n );\n\n let text = '';\n let structuredOutput: unknown | undefined;\n let usage: LanguageModelV3Usage = createEmptyUsage();\n let finishReason: LanguageModelV3FinishReason = { unified: 'stop', raw: undefined };\n let wasTruncated = false;\n let costUsd: number | undefined;\n let durationMs: number | undefined;\n let modelUsage: Record<string, unknown> | undefined;\n const warnings: SharedV3Warning[] = this.generateAllWarnings(options, messagesPrompt);\n\n // Add warnings from message conversion\n if (messageWarnings) {\n messageWarnings.forEach((warning) => {\n warnings.push({\n type: 'other',\n message: warning,\n });\n });\n }\n\n const modeSetting = this.settings.streamingInput ?? 'auto';\n const effectiveCanUseTool = sdkOptions?.canUseTool ?? this.settings.canUseTool;\n const effectivePermissionPromptToolName =\n sdkOptions?.permissionPromptToolName ?? this.settings.permissionPromptToolName;\n const wantsStreamInput =\n modeSetting === 'always' || (modeSetting === 'auto' && !!effectiveCanUseTool);\n\n if (!wantsStreamInput && hasImageParts) {\n warnings.push({\n type: 'other',\n message: STREAMING_FEATURE_WARNING,\n });\n }\n\n let done = () => {};\n const outputStreamEnded = new Promise((resolve) => {\n done = () => resolve(undefined);\n });\n try {\n if (effectiveCanUseTool && effectivePermissionPromptToolName) {\n throw new Error(\n \"canUseTool requires streamingInput mode ('auto' or 'always') and cannot be used with permissionPromptToolName (SDK constraint). Set streamingInput: 'auto' (or 'always') and remove permissionPromptToolName, or remove canUseTool.\"\n );\n }\n // hold input stream open until results\n // see: https://github.com/anthropics/claude-code/issues/4775\n const sdkPrompt = wantsStreamInput\n ? toAsyncIterablePrompt(\n messagesPrompt,\n outputStreamEnded,\n effectiveResume,\n streamingContentParts,\n this.settings.onStreamStart\n )\n : messagesPrompt;\n\n this.logger.debug(\n `[claude-code] Executing query with streamingInput: ${wantsStreamInput}, session: ${effectiveResume ?? 'new'}`\n );\n\n const response = query({\n prompt: sdkPrompt,\n options: queryOptions,\n });\n\n // Invoke onQueryCreated callback to expose Query object for advanced features\n // like mid-stream message injection via query.streamInput()\n this.settings.onQueryCreated?.(response);\n\n for await (const message of response) {\n this.logger.debug(`[claude-code] Received message type: ${message.type}`);\n if (message.type === 'assistant') {\n text += message.message.content\n .map((c: { type: string; text?: string }) => (c.type === 'text' ? c.text : ''))\n .join('');\n } else if (message.type === 'result') {\n done();\n this.setSessionId(message.session_id);\n costUsd = message.total_cost_usd;\n durationMs = message.duration_ms;\n modelUsage = message.modelUsage;\n\n // Handle is_error flag in result message (e.g., auth failures)\n // The CLI returns successful JSON with is_error: true and error message in result field\n if ('is_error' in message && message.is_error === true) {\n const errorMessage =\n 'result' in message && typeof message.result === 'string'\n ? message.result\n : 'Claude Code CLI returned an error';\n throw Object.assign(new Error(errorMessage), { exitCode: 1 });\n }\n\n // Handle structured output errors (SDK 0.1.45+)\n // Use string comparison to support new SDK subtypes not yet in TypeScript definitions\n if ((message.subtype as string) === 'error_max_structured_output_retries') {\n throw new Error(\n 'Failed to generate valid structured output after maximum retries. The model could not produce a response matching the required schema.'\n );\n }\n\n // Capture structured output if available (SDK 0.1.45+)\n if ('structured_output' in message && message.structured_output !== undefined) {\n structuredOutput = message.structured_output;\n this.logger.debug('[claude-code] Received structured output from SDK');\n }\n\n this.logger.info(\n `[claude-code] Request completed - Session: ${message.session_id}, Cost: $${costUsd?.toFixed(4) ?? 'N/A'}, Duration: ${durationMs ?? 'N/A'}ms`\n );\n\n if ('usage' in message) {\n usage = convertClaudeCodeUsage(message.usage);\n\n this.logger.debug(\n `[claude-code] Token usage - Input: ${usage.inputTokens.total}, Output: ${usage.outputTokens.total}`\n );\n }\n\n const stopReason =\n 'stop_reason' in message\n ? ((message as Record<string, unknown>).stop_reason as string | null | undefined)\n : undefined;\n finishReason = mapClaudeCodeFinishReason(message.subtype, stopReason);\n this.logger.debug(`[claude-code] Finish reason: ${finishReason.unified}`);\n } else if (message.type === 'system' && message.subtype === 'init') {\n this.setSessionId(message.session_id);\n this.logger.info(`[claude-code] Session initialized: ${message.session_id}`);\n }\n }\n } catch (error: unknown) {\n done();\n this.logger.debug(\n `[claude-code] Error during doGenerate: ${error instanceof Error ? error.message : String(error)}`\n );\n\n // Special handling for AbortError to preserve abort signal reason\n if (isAbortError(error)) {\n this.logger.debug('[claude-code] Request aborted by user');\n throw options.abortSignal?.aborted ? options.abortSignal.reason : error;\n }\n\n if (isClaudeCodeTruncationError(error, text)) {\n this.logger.warn(\n `[claude-code] Detected truncated response, returning ${text.length} characters of buffered text`\n );\n wasTruncated = true;\n finishReason = { unified: 'length', raw: 'truncation' };\n warnings.push({\n type: 'other',\n message: CLAUDE_CODE_TRUNCATION_WARNING,\n });\n } else {\n // Use unified error handler\n throw this.handleClaudeCodeError(error, messagesPrompt, collectedStderr);\n }\n } finally {\n if (options.abortSignal && abortListener) {\n options.abortSignal.removeEventListener('abort', abortListener);\n }\n }\n\n // Use structured output from SDK if available (native JSON schema support)\n // Otherwise fall back to accumulated text\n const finalText = structuredOutput !== undefined ? JSON.stringify(structuredOutput) : text;\n\n return {\n content: [{ type: 'text', text: finalText }],\n usage,\n finishReason,\n warnings,\n response: {\n id: generateId(),\n timestamp: new Date(),\n modelId: this.modelId,\n },\n request: {\n body: messagesPrompt,\n },\n providerMetadata: {\n 'claude-code': {\n ...(this.sessionId !== undefined && { sessionId: this.sessionId }),\n ...(costUsd !== undefined && { costUsd }),\n ...(durationMs !== undefined && { durationMs }),\n ...(modelUsage !== undefined && { modelUsage: modelUsage as unknown as JSONValue }),\n ...(wasTruncated && { truncated: true }),\n },\n },\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV3['doStream']>[0]\n ): Promise<Awaited<ReturnType<LanguageModelV3['doStream']>>> {\n this.logger.debug(`[claude-code] Starting doStream request with model: ${this.modelId}`);\n this.logger.debug(`[claude-code] Response format: ${options.responseFormat?.type ?? 'none'}`);\n\n const {\n messagesPrompt,\n warnings: messageWarnings,\n streamingContentParts,\n hasImageParts,\n } = convertToClaudeCodeMessages(options.prompt);\n\n this.logger.debug(\n `[claude-code] Converted ${options.prompt.length} messages for streaming, hasImageParts: ${hasImageParts}`\n );\n\n const abortController = new AbortController();\n let abortListener: (() => void) | undefined;\n if (options.abortSignal?.aborted) {\n // Propagate already-aborted state immediately with original reason\n abortController.abort(options.abortSignal.reason);\n } else if (options.abortSignal) {\n abortListener = () => abortController.abort(options.abortSignal?.reason);\n options.abortSignal.addEventListener('abort', abortListener, { once: true });\n }\n\n // Collect stderr for error reporting (SDK may not include it in errors)\n let collectedStderr = '';\n const stderrCollector = (data: string) => {\n collectedStderr += data;\n };\n\n const sdkOptions = this.getSanitizedSdkOptions();\n const effectiveResume = this.getEffectiveResume(sdkOptions);\n const queryOptions = this.createQueryOptions(\n abortController,\n options.responseFormat,\n stderrCollector,\n sdkOptions,\n effectiveResume\n );\n\n // Enable partial messages for true streaming (token-by-token delivery)\n // This can be overridden by user settings, but we default to true for doStream\n if (queryOptions.includePartialMessages === undefined) {\n queryOptions.includePartialMessages = true;\n }\n\n const warnings: SharedV3Warning[] = this.generateAllWarnings(options, messagesPrompt);\n\n // Add warnings from message conversion\n if (messageWarnings) {\n messageWarnings.forEach((warning) => {\n warnings.push({\n type: 'other',\n message: warning,\n });\n });\n }\n\n const modeSetting = this.settings.streamingInput ?? 'auto';\n const effectiveCanUseTool = sdkOptions?.canUseTool ?? this.settings.canUseTool;\n const effectivePermissionPromptToolName =\n sdkOptions?.permissionPromptToolName ?? this.settings.permissionPromptToolName;\n const wantsStreamInput =\n modeSetting === 'always' || (modeSetting === 'auto' && !!effectiveCanUseTool);\n\n if (!wantsStreamInput && hasImageParts) {\n warnings.push({\n type: 'other',\n message: STREAMING_FEATURE_WARNING,\n });\n }\n\n const stream = new ReadableStream<ExtendedStreamPart>({\n start: async (controller) => {\n let done = () => {};\n const outputStreamEnded = new Promise((resolve) => {\n done = () => resolve(undefined);\n });\n const toolStates = new Map<string, ToolStreamState>();\n // Track active Task tools for subagent hierarchy\n // Using a Map instead of stack to correctly handle parallel agents\n const activeTaskTools = new Map<string, { startTime: number }>();\n\n // Helper to get fallback parent - only returns a parent when exactly ONE Task is active\n // This prevents incorrect grouping when parallel agents run simultaneously\n const getFallbackParentId = (): string | null => {\n if (activeTaskTools.size === 1) {\n return activeTaskTools.keys().next().value ?? null;\n }\n return null;\n };\n\n const streamWarnings: SharedV3Warning[] = [];\n\n const closeToolInput = (toolId: string, state: ToolStreamState) => {\n if (!state.inputClosed && state.inputStarted) {\n controller.enqueue({\n type: 'tool-input-end',\n id: toolId,\n });\n state.inputClosed = true;\n }\n };\n\n const emitToolCall = (toolId: string, state: ToolStreamState) => {\n if (state.callEmitted) {\n return;\n }\n\n closeToolInput(toolId, state);\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolId,\n toolName: state.name,\n input: state.lastSerializedInput ?? '',\n providerExecuted: true,\n dynamic: true, // V3 field: indicates tool is provider-defined (not in user's tools map)\n providerMetadata: {\n 'claude-code': {\n // rawInput preserves the original serialized format before AI SDK normalization.\n // Use this if you need the exact string sent to the Claude CLI, which may differ\n // from the `input` field after AI SDK processing.\n rawInput: state.lastSerializedInput ?? '',\n parentToolCallId: state.parentToolCallId ?? null,\n },\n },\n } as any); // eslint-disable-line @typescript-eslint/no-explicit-any\n state.callEmitted = true;\n };\n\n const finalizeToolCalls = () => {\n for (const [toolId, state] of toolStates) {\n emitToolCall(toolId, state);\n }\n toolStates.clear();\n };\n\n let usage: LanguageModelV3Usage = createEmptyUsage();\n let accumulatedText = '';\n let textPartId: string | undefined;\n let streamedTextLength = 0; // Track text already emitted via stream_events to avoid duplication\n let hasReceivedStreamEvents = false; // Track if we've received any stream_events\n let hasStreamedJson = false; // Track if JSON has been streamed via input_json_delta\n\n // Content block streaming: Map block indices to tool IDs and accumulated JSON\n const toolBlocksByIndex = new Map<number, string>();\n const toolInputAccumulators = new Map<string, string>();\n\n // Track text content blocks by index for correlating text_delta with text parts\n const textBlocksByIndex = new Map<number, string>();\n\n // Track if text was streamed via content blocks to prevent double emission in result handler\n let textStreamedViaContentBlock = false;\n\n // Extended thinking: Map block indices to reasoning part IDs\n const reasoningBlocksByIndex = new Map<number, string>();\n let currentReasoningPartId: string | undefined;\n\n try {\n // Emit stream-start with warnings\n controller.enqueue({ type: 'stream-start', warnings });\n\n if (effectiveCanUseTool && effectivePermissionPromptToolName) {\n throw new Error(\n \"canUseTool requires streamingInput mode ('auto' or 'always') and cannot be used with permissionPromptToolName (SDK constraint). Set streamingInput: 'auto' (or 'always') and remove permissionPromptToolName, or remove canUseTool.\"\n );\n }\n // hold input stream open until results\n // see: https://github.com/anthropics/claude-code/issues/4775\n const sdkPrompt = wantsStreamInput\n ? toAsyncIterablePrompt(\n messagesPrompt,\n outputStreamEnded,\n effectiveResume,\n streamingContentParts,\n this.settings.onStreamStart\n )\n : messagesPrompt;\n\n this.logger.debug(\n `[claude-code] Starting stream query with streamingInput: ${wantsStreamInput}, session: ${effectiveResume ?? 'new'}`\n );\n\n const response = query({\n prompt: sdkPrompt,\n options: queryOptions,\n });\n\n // Invoke onQueryCreated callback to expose Query object for advanced features\n // like mid-stream message injection via query.streamInput()\n this.settings.onQueryCreated?.(response);\n\n for await (const message of response) {\n this.logger.debug(`[claude-code] Stream received message type: ${message.type}`);\n\n // Handle streaming events (token-by-token delivery via includePartialMessages)\n if (message.type === 'stream_event') {\n const streamEvent = message as SDKPartialAssistantMessage;\n const event = streamEvent.event;\n\n // Check for text_delta events within content_block_delta\n if (\n event.type === 'content_block_delta' &&\n event.delta.type === 'text_delta' &&\n 'text' in event.delta &&\n event.delta.text\n ) {\n const deltaText = event.delta.text;\n hasReceivedStreamEvents = true;\n\n // Don't emit text deltas in JSON mode - accumulate instead\n if (options.responseFormat?.type === 'json') {\n accumulatedText += deltaText;\n streamedTextLength += deltaText.length;\n continue;\n }\n\n // Emit text-start if this is the first text\n if (!textPartId) {\n textPartId = generateId();\n controller.enqueue({\n type: 'text-start',\n id: textPartId,\n });\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: textPartId,\n delta: deltaText,\n });\n accumulatedText += deltaText;\n streamedTextLength += deltaText.length;\n }\n // Handle input_json_delta events for structured output streaming\n // The SDK uses a StructuredOutput tool internally, and JSON is streamed via input_json_delta\n if (\n event.type === 'content_block_delta' &&\n event.delta.type === 'input_json_delta' &&\n 'partial_json' in event.delta &&\n event.delta.partial_json\n ) {\n const jsonDelta = event.delta.partial_json;\n hasReceivedStreamEvents = true;\n const blockIndex = 'index' in event ? (event.index as number) : -1;\n\n // In JSON mode, prioritize streaming to text-delta for streamObject() support\n // The SDK's internal StructuredOutput tool uses input_json_delta to stream JSON responses\n if (options.responseFormat?.type === 'json') {\n // Emit text-start if this is the first JSON delta\n if (!textPartId) {\n textPartId = generateId();\n controller.enqueue({\n type: 'text-start',\n id: textPartId,\n });\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: textPartId,\n delta: jsonDelta,\n });\n accumulatedText += jsonDelta;\n streamedTextLength += jsonDelta.length;\n hasStreamedJson = true;\n continue;\n }\n\n // In non-JSON mode, route to tool-input-delta if we have a tracked tool\n const toolId = toolBlocksByIndex.get(blockIndex);\n if (toolId) {\n // Accumulate and emit tool-input-delta\n const accumulated = (toolInputAccumulators.get(toolId) ?? '') + jsonDelta;\n toolInputAccumulators.set(toolId, accumulated);\n\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolId,\n delta: jsonDelta,\n });\n continue;\n }\n // input_json_delta without tool context in non-JSON mode is ignored\n }\n\n // Handle content_block_start for tool_use - emit tool-input-start immediately\n if (\n event.type === 'content_block_start' &&\n 'content_block' in event &&\n event.content_block?.type === 'tool_use'\n ) {\n const blockIndex = 'index' in event ? (event.index as number) : -1;\n const toolBlock = event.content_block as {\n type: string;\n id?: string;\n name?: string;\n };\n const toolId =\n typeof toolBlock.id === 'string' && toolBlock.id.length > 0\n ? toolBlock.id\n : generateId();\n const toolName =\n typeof toolBlock.name === 'string' && toolBlock.name.length > 0\n ? toolBlock.name\n : ClaudeCodeLanguageModel.UNKNOWN_TOOL_NAME;\n\n hasReceivedStreamEvents = true;\n\n // Close any active text part before tool starts\n if (textPartId) {\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n textPartId = undefined;\n }\n\n // Track this block for later delta/stop events\n toolBlocksByIndex.set(blockIndex, toolId);\n toolInputAccumulators.set(toolId, '');\n\n // Create tool state if not exists\n let state = toolStates.get(toolId);\n if (!state) {\n // Use timing-based inference for parent (Task tools are top-level)\n const currentParentId = toolName === 'Task' ? null : getFallbackParentId();\n state = {\n name: toolName,\n inputStarted: false,\n inputClosed: false,\n callEmitted: false,\n parentToolCallId: currentParentId,\n };\n toolStates.set(toolId, state);\n }\n\n // Emit tool-input-start immediately with providerMetadata for parent context\n if (!state.inputStarted) {\n this.logger.debug(\n `[claude-code] Tool input started (content_block) - Tool: ${toolName}, ID: ${toolId}, parent: ${state.parentToolCallId}`\n );\n controller.enqueue({\n type: 'tool-input-start',\n id: toolId,\n toolName,\n providerExecuted: true,\n dynamic: true,\n providerMetadata: {\n 'claude-code': {\n parentToolCallId: state.parentToolCallId ?? null,\n },\n },\n } as any); // eslint-disable-line @typescript-eslint/no-explicit-any\n\n // Track Task tools as active so nested tools can reference them as parent\n if (toolName === 'Task') {\n activeTaskTools.set(toolId, { startTime: Date.now() });\n }\n state.inputStarted = true;\n }\n continue;\n }\n\n // Handle content_block_start for text - emit text-start early\n if (\n event.type === 'content_block_start' &&\n 'content_block' in event &&\n event.content_block?.type === 'text'\n ) {\n const blockIndex = 'index' in event ? (event.index as number) : -1;\n hasReceivedStreamEvents = true;\n\n // Generate text part ID early and map to block index\n const partId = generateId();\n textBlocksByIndex.set(blockIndex, partId);\n textPartId = partId;\n\n this.logger.debug(\n `[claude-code] Text content block started - Index: ${blockIndex}, ID: ${partId}`\n );\n\n controller.enqueue({\n type: 'text-start',\n id: partId,\n });\n textStreamedViaContentBlock = true;\n continue;\n }\n\n // Handle content_block_start for thinking - emit reasoning-start immediately\n if (\n event.type === 'content_block_start' &&\n 'content_block' in event &&\n event.content_block?.type === 'thinking'\n ) {\n const blockIndex = 'index' in event ? (event.index as number) : -1;\n hasReceivedStreamEvents = true;\n\n // Close any active text part before reasoning starts\n if (textPartId) {\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n textPartId = undefined;\n }\n\n const reasoningPartId = generateId();\n reasoningBlocksByIndex.set(blockIndex, reasoningPartId);\n currentReasoningPartId = reasoningPartId;\n\n this.logger.debug(\n `[claude-code] Reasoning started (content_block) - ID: ${reasoningPartId}`\n );\n controller.enqueue({\n type: 'reasoning-start',\n id: reasoningPartId,\n });\n continue;\n }\n\n // Handle thinking_delta for extended thinking\n if (\n event.type === 'content_block_delta' &&\n event.delta.type === 'thinking_delta' &&\n 'thinking' in event.delta &&\n event.delta.thinking\n ) {\n const blockIndex = 'index' in event ? (event.index as number) : -1;\n const reasoningPartId =\n reasoningBlocksByIndex.get(blockIndex) ?? currentReasoningPartId;\n hasReceivedStreamEvents = true;\n\n if (reasoningPartId) {\n controller.enqueue({\n type: 'reasoning-delta',\n id: reasoningPartId,\n delta: event.delta.thinking,\n });\n }\n continue;\n }\n\n // Handle content_block_stop - finalize tool input, text, or reasoning\n if (event.type === 'content_block_stop') {\n const blockIndex = 'index' in event ? (event.index as number) : -1;\n hasReceivedStreamEvents = true;\n\n // Check if this is a tool block\n const toolId = toolBlocksByIndex.get(blockIndex);\n if (toolId) {\n const state = toolStates.get(toolId);\n if (state && !state.inputClosed) {\n const accumulatedInput = toolInputAccumulators.get(toolId) ?? '';\n this.logger.debug(\n `[claude-code] Tool content block stopped - Index: ${blockIndex}, Tool: ${state.name}, ID: ${toolId}`\n );\n controller.enqueue({\n type: 'tool-input-end',\n id: toolId,\n });\n state.inputClosed = true;\n const effectiveInput = accumulatedInput || state.lastSerializedInput || '';\n state.lastSerializedInput = effectiveInput;\n\n // Emit tool-call immediately when input is complete (don't wait for result)\n // This allows UI to show \"running\" state while tool executes\n if (!state.callEmitted) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolId,\n toolName: state.name,\n input: effectiveInput,\n providerExecuted: true,\n dynamic: true,\n providerMetadata: {\n 'claude-code': {\n rawInput: effectiveInput,\n parentToolCallId: state.parentToolCallId ?? null,\n },\n },\n } as any); // eslint-disable-line @typescript-eslint/no-explicit-any\n state.callEmitted = true;\n }\n }\n toolBlocksByIndex.delete(blockIndex);\n toolInputAccumulators.delete(toolId);\n continue;\n }\n\n // Check if this is a text block\n const textId = textBlocksByIndex.get(blockIndex);\n if (textId) {\n this.logger.debug(\n `[claude-code] Text content block stopped - Index: ${blockIndex}, ID: ${textId}`\n );\n controller.enqueue({\n type: 'text-end',\n id: textId,\n });\n textBlocksByIndex.delete(blockIndex);\n if (textPartId === textId) {\n textPartId = undefined;\n }\n continue;\n }\n\n // Check if this is a reasoning block\n const reasoningPartId = reasoningBlocksByIndex.get(blockIndex);\n if (reasoningPartId) {\n this.logger.debug(\n `[claude-code] Reasoning ended (content_block) - ID: ${reasoningPartId}`\n );\n controller.enqueue({\n type: 'reasoning-end',\n id: reasoningPartId,\n });\n reasoningBlocksByIndex.delete(blockIndex);\n if (currentReasoningPartId === reasoningPartId) {\n currentReasoningPartId = undefined;\n }\n continue;\n }\n }\n\n // Other stream_event types are informational\n continue;\n }\n\n if (message.type === 'assistant') {\n if (!message.message?.content) {\n this.logger.warn(\n `[claude-code] Unexpected assistant message structure: missing content field. Message type: ${message.type}. This may indicate an SDK protocol violation.`\n );\n continue;\n }\n\n // Extract parent_tool_use_id from SDK message - this is the authoritative source\n // SDK provides this field when tool is executed within a subagent context\n const sdkParentToolUseId = (message as { parent_tool_use_id?: string })\n .parent_tool_use_id;\n\n const content = message.message.content;\n const tools = this.extractToolUses(content);\n\n // Close any active text part before tool calls start.\n // This ensures tool calls split text into separate parts.\n // We only do this if there are actual tools to avoid unnecessary text-end events.\n if (textPartId && tools.length > 0) {\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n textPartId = undefined; // Reset so next text gets a new ID\n }\n\n for (const tool of tools) {\n const toolId = tool.id;\n let state = toolStates.get(toolId);\n if (!state) {\n // Prefer SDK message-level parent (works for parallel agents)\n // Fall back to content-level parent, then timing-based inference\n // Task tools never have a parent (they're top-level)\n const currentParentId =\n tool.name === 'Task'\n ? null\n : (sdkParentToolUseId ?? tool.parentToolUseId ?? getFallbackParentId());\n state = {\n name: tool.name,\n inputStarted: false,\n inputClosed: false,\n callEmitted: false,\n parentToolCallId: currentParentId,\n };\n toolStates.set(toolId, state);\n this.logger.debug(\n `[claude-code] New tool use detected - Tool: ${tool.name}, ID: ${toolId}, SDK parent: ${sdkParentToolUseId}, resolved parent: ${currentParentId}`\n );\n } else if (!state.parentToolCallId && sdkParentToolUseId && tool.name !== 'Task') {\n // RETROACTIVE PARENT CONTEXT: Tool state was created by streaming events\n // but we now have authoritative parent from SDK message - update state\n state.parentToolCallId = sdkParentToolUseId;\n this.logger.debug(\n `[claude-code] Retroactive parent context - Tool: ${tool.name}, ID: ${toolId}, parent: ${sdkParentToolUseId}`\n );\n }\n\n state.name = tool.name;\n\n if (!state.inputStarted) {\n this.logger.debug(\n `[claude-code] Tool input started - Tool: ${tool.name}, ID: ${toolId}`\n );\n controller.enqueue({\n type: 'tool-input-start',\n id: toolId,\n toolName: tool.name,\n providerExecuted: true,\n dynamic: true, // V3 field: indicates tool is provider-defined\n providerMetadata: {\n 'claude-code': {\n parentToolCallId: state.parentToolCallId ?? null,\n },\n },\n } as any); // eslint-disable-line @typescript-eslint/no-explicit-any\n // Track Task tools as active so nested tools can reference them as parent\n if (tool.name === 'Task') {\n activeTaskTools.set(toolId, { startTime: Date.now() });\n }\n state.inputStarted = true;\n }\n\n const serializedInput = this.serializeToolInput(tool.input);\n if (serializedInput) {\n let deltaPayload = '';\n\n // First input: emit full delta only if small enough\n if (state.lastSerializedInput === undefined) {\n if (serializedInput.length <= ClaudeCodeLanguageModel.MAX_DELTA_CALC_SIZE) {\n deltaPayload = serializedInput;\n }\n } else if (\n serializedInput.length <= ClaudeCodeLanguageModel.MAX_DELTA_CALC_SIZE &&\n state.lastSerializedInput.length <=\n ClaudeCodeLanguageModel.MAX_DELTA_CALC_SIZE &&\n serializedInput.startsWith(state.lastSerializedInput)\n ) {\n deltaPayload = serializedInput.slice(state.lastSerializedInput.length);\n } else if (serializedInput !== state.lastSerializedInput) {\n // Non-prefix updates or large inputs - defer to the final tool-call payload\n deltaPayload = '';\n }\n\n if (deltaPayload) {\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolId,\n delta: deltaPayload,\n });\n }\n state.lastSerializedInput = serializedInput;\n }\n }\n\n const text = content\n .map((c: { type: string; text?: string }) => (c.type === 'text' ? c.text : ''))\n .join('');\n\n if (text) {\n // When we've received stream_events, assistant messages contain cumulative text\n // that we've already emitted via stream_event deltas - skip duplicates\n // When no stream_events received, assistant messages contain incremental text\n if (hasReceivedStreamEvents) {\n // Calculate delta: only emit text that wasn't already streamed via stream_events\n const newTextStart = streamedTextLength;\n const deltaText = text.length > newTextStart ? text.slice(newTextStart) : '';\n\n // Always accumulate for final result tracking\n accumulatedText = text; // Replace with full text (assistant msg contains full content)\n\n // In JSON mode, we accumulate the text and extract JSON at the end\n // Otherwise, stream any new text\n if (options.responseFormat?.type !== 'json' && deltaText) {\n // Emit text-start if this is the first text\n if (!textPartId) {\n textPartId = generateId();\n controller.enqueue({\n type: 'text-start',\n id: textPartId,\n });\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: textPartId,\n delta: deltaText,\n });\n }\n\n // Update streamedTextLength to match what we now know is the full text\n streamedTextLength = text.length;\n } else {\n // No stream_events - assistant messages contain incremental text chunks\n accumulatedText += text;\n\n // In JSON mode, we accumulate the text and extract JSON at the end\n // Otherwise, stream the text as it comes\n if (options.responseFormat?.type !== 'json') {\n // Emit text-start if this is the first text\n if (!textPartId) {\n textPartId = generateId();\n controller.enqueue({\n type: 'text-start',\n id: textPartId,\n });\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: textPartId,\n delta: text,\n });\n }\n }\n }\n } else if (message.type === 'user') {\n if (!message.message?.content) {\n this.logger.warn(\n `[claude-code] Unexpected user message structure: missing content field. Message type: ${message.type}. This may indicate an SDK protocol violation.`\n );\n continue;\n }\n\n // A user message signals the end of the current assistant message.\n // Reset text state to ensure the next assistant message starts with a new text part.\n // This prevents text from different assistant messages from being merged together.\n if (textPartId) {\n const closedTextId = textPartId;\n controller.enqueue({\n type: 'text-end',\n id: closedTextId,\n });\n textPartId = undefined;\n // Prevent a later content_block_stop from closing the same text part twice.\n for (const [blockIndex, blockTextId] of textBlocksByIndex) {\n if (blockTextId === closedTextId) {\n textBlocksByIndex.delete(blockIndex);\n break;\n }\n }\n accumulatedText = '';\n streamedTextLength = 0;\n this.logger.debug('[claude-code] Closed text part due to user message');\n }\n\n // Extract parent_tool_use_id from SDK message for late-arriving tool results\n const sdkParentToolUseIdForResults = (message as { parent_tool_use_id?: string })\n .parent_tool_use_id;\n\n const content = message.message.content;\n for (const result of this.extractToolResults(content)) {\n let state = toolStates.get(result.id);\n const toolName =\n result.name ?? state?.name ?? ClaudeCodeLanguageModel.UNKNOWN_TOOL_NAME;\n\n this.logger.debug(\n `[claude-code] Tool result received - Tool: ${toolName}, ID: ${result.id}`\n );\n\n if (!state) {\n this.logger.warn(\n `[claude-code] Received tool result for unknown tool ID: ${result.id}`\n );\n // Use SDK parent if available, otherwise fall back to timing-based inference\n const resolvedParentId =\n toolName === 'Task'\n ? null\n : (sdkParentToolUseIdForResults ?? getFallbackParentId());\n state = {\n name: toolName,\n inputStarted: false,\n inputClosed: false,\n callEmitted: false,\n parentToolCallId: resolvedParentId,\n };\n toolStates.set(result.id, state);\n // Synthesize input lifecycle to preserve ordering when no prior tool_use was seen\n if (!state.inputStarted) {\n controller.enqueue({\n type: 'tool-input-start',\n id: result.id,\n toolName,\n providerExecuted: true,\n dynamic: true, // V3 field: indicates tool is provider-defined\n providerMetadata: {\n 'claude-code': {\n parentToolCallId: state.parentToolCallId ?? null,\n },\n },\n } as any); // eslint-disable-line @typescript-eslint/no-explicit-any\n state.inputStarted = true;\n }\n if (!state.inputClosed) {\n controller.enqueue({\n type: 'tool-input-end',\n id: result.id,\n });\n state.inputClosed = true;\n }\n }\n state.name = toolName;\n const normalizedResult = this.normalizeToolResult(result.result);\n const rawResult =\n typeof result.result === 'string'\n ? result.result\n : (() => {\n try {\n return JSON.stringify(result.result);\n } catch {\n return String(result.result);\n }\n })();\n const maxToolResultSize = this.settings.maxToolResultSize;\n const truncatedResult = truncateToolResultForStream(\n normalizedResult,\n maxToolResultSize\n );\n const truncatedRawResult = truncateToolResultForStream(\n rawResult,\n maxToolResultSize\n ) as string;\n const rawResultTruncated = truncatedRawResult !== rawResult;\n\n emitToolCall(result.id, state);\n\n // Remove Task tools from active set when they complete\n if (toolName === 'Task') {\n activeTaskTools.delete(result.id);\n }\n\n controller.enqueue({\n type: 'tool-result',\n toolCallId: result.id,\n toolName,\n result: truncatedResult,\n isError: result.isError,\n providerExecuted: true,\n dynamic: true, // V3 field: indicates tool is provider-defined\n providerMetadata: {\n 'claude-code': {\n // rawResult preserves the original CLI output string before JSON parsing.\n // Use this when you need the exact string returned by the tool, especially\n // if the `result` field has been parsed/normalized and you need the original format.\n rawResult: truncatedRawResult,\n rawResultTruncated,\n parentToolCallId: state.parentToolCallId ?? null,\n },\n },\n } as any); // eslint-disable-line @typescript-eslint/no-explicit-any\n }\n // Handle tool errors\n for (const error of this.extractToolErrors(content)) {\n let state = toolStates.get(error.id);\n const toolName =\n error.name ?? state?.name ?? ClaudeCodeLanguageModel.UNKNOWN_TOOL_NAME;\n\n this.logger.debug(\n `[claude-code] Tool error received - Tool: ${toolName}, ID: ${error.id}`\n );\n\n if (!state) {\n this.logger.warn(\n `[claude-code] Received tool error for unknown tool ID: ${error.id}`\n );\n // Use SDK parent if available, otherwise fall back to timing-based inference\n const errorResolvedParentId =\n toolName === 'Task'\n ? null\n : (sdkParentToolUseIdForResults ?? getFallbackParentId());\n state = {\n name: toolName,\n inputStarted: true,\n inputClosed: true,\n callEmitted: false,\n parentToolCallId: errorResolvedParentId,\n };\n toolStates.set(error.id, state);\n }\n\n // Ensure tool-call is emitted before tool-error\n emitToolCall(error.id, state);\n\n // Remove Task tools from active set when they error\n if (toolName === 'Task') {\n activeTaskTools.delete(error.id);\n }\n\n const rawError =\n typeof error.error === 'string'\n ? error.error\n : typeof error.error === 'object' && error.error !== null\n ? (() => {\n try {\n return JSON.stringify(error.error);\n } catch {\n return String(error.error);\n }\n })()\n : String(error.error);\n\n controller.enqueue({\n type: 'tool-error',\n toolCallId: error.id,\n toolName,\n error: rawError,\n providerExecuted: true,\n dynamic: true, // V3 field: indicates tool is provider-defined\n providerMetadata: {\n 'claude-code': {\n rawError,\n parentToolCallId: state.parentToolCallId ?? null,\n },\n },\n } as any); // eslint-disable-line @typescript-eslint/no-explicit-any\n }\n } else if (message.type === 'result') {\n done();\n\n // Handle is_error flag in result message (e.g., auth failures)\n // The CLI returns successful JSON with is_error: true and error message in result field\n if ('is_error' in message && message.is_error === true) {\n const errorMessage =\n 'result' in message && typeof message.result === 'string'\n ? message.result\n : 'Claude Code CLI returned an error';\n throw Object.assign(new Error(errorMessage), { exitCode: 1 });\n }\n\n // Handle structured output errors (SDK 0.1.45+)\n // Use string comparison to support new SDK subtypes not yet in TypeScript definitions\n if ((message.subtype as string) === 'error_max_structured_output_retries') {\n throw new Error(\n 'Failed to generate valid structured output after maximum retries. The model could not produce a response matching the required schema.'\n );\n }\n\n this.logger.info(\n `[claude-code] Stream completed - Session: ${message.session_id}, Cost: $${message.total_cost_usd?.toFixed(4) ?? 'N/A'}, Duration: ${message.duration_ms ?? 'N/A'}ms`\n );\n\n if ('usage' in message) {\n usage = convertClaudeCodeUsage(message.usage);\n\n this.logger.debug(\n `[claude-code] Stream token usage - Input: ${usage.inputTokens.total}, Output: ${usage.outputTokens.total}`\n );\n }\n\n const stopReason =\n 'stop_reason' in message\n ? ((message as Record<string, unknown>).stop_reason as string | null | undefined)\n : undefined;\n const finishReason: LanguageModelV3FinishReason = mapClaudeCodeFinishReason(\n message.subtype,\n stopReason\n );\n\n this.logger.debug(`[claude-code] Stream finish reason: ${finishReason.unified}`);\n\n // Store session ID in the model instance\n this.setSessionId(message.session_id);\n\n // Use structured output from SDK if available (native JSON schema support)\n const structuredOutput =\n 'structured_output' in message ? message.structured_output : undefined;\n\n // Check if we've already streamed JSON via input_json_delta\n const alreadyStreamedJson =\n hasStreamedJson &&\n options.responseFormat?.type === 'json' &&\n hasReceivedStreamEvents;\n\n if (alreadyStreamedJson) {\n // We've already streamed JSON deltas; only close the text part if it's still open.\n if (textPartId) {\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n }\n } else if (structuredOutput !== undefined) {\n // Emit structured output as text (fallback when streaming didn't occur)\n const jsonTextId = generateId();\n const jsonText = JSON.stringify(structuredOutput);\n controller.enqueue({\n type: 'text-start',\n id: jsonTextId,\n });\n controller.enqueue({\n type: 'text-delta',\n id: jsonTextId,\n delta: jsonText,\n });\n controller.enqueue({\n type: 'text-end',\n id: jsonTextId,\n });\n } else if (textPartId) {\n // Close the text part if it was opened (non-JSON mode)\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n } else if (accumulatedText && !textStreamedViaContentBlock) {\n // Fallback for JSON mode without schema: emit accumulated text\n // This handles the case where responseFormat.type === 'json' but no schema\n // was provided, so the SDK returns plain text instead of structured_output\n const fallbackTextId = generateId();\n controller.enqueue({\n type: 'text-start',\n id: fallbackTextId,\n });\n controller.enqueue({\n type: 'text-delta',\n id: fallbackTextId,\n delta: accumulatedText,\n });\n controller.enqueue({\n type: 'text-end',\n id: fallbackTextId,\n });\n }\n\n finalizeToolCalls();\n\n // Prepare JSON-safe warnings for provider metadata\n const warningsJson = this.serializeWarningsForMetadata(streamWarnings);\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage,\n providerMetadata: {\n 'claude-code': {\n sessionId: message.session_id,\n ...(message.total_cost_usd !== undefined && {\n costUsd: message.total_cost_usd,\n }),\n ...(message.duration_ms !== undefined && { durationMs: message.duration_ms }),\n ...(message.modelUsage !== undefined && {\n modelUsage: message.modelUsage as unknown as JSONValue,\n }),\n // JSON validation warnings are collected during streaming and included\n // in providerMetadata since the AI SDK's finish event doesn't support\n // a top-level warnings field (unlike stream-start which was already emitted)\n ...(streamWarnings.length > 0 && {\n warnings: warningsJson as unknown as JSONValue,\n }),\n },\n },\n });\n controller.close();\n return;\n } else if (message.type === 'system' && message.subtype === 'init') {\n // Store session ID for future use\n this.setSessionId(message.session_id);\n\n this.logger.info(`[claude-code] Stream session initialized: ${message.session_id}`);\n\n // Emit response metadata when session is initialized\n controller.enqueue({\n type: 'response-metadata',\n id: message.session_id,\n timestamp: new Date(),\n modelId: this.modelId,\n });\n }\n }\n\n finalizeToolCalls();\n this.logger.debug('[claude-code] Stream finalized, closing stream');\n controller.close();\n } catch (error: unknown) {\n done();\n\n this.logger.debug(\n `[claude-code] Error during doStream: ${error instanceof Error ? error.message : String(error)}`\n );\n\n if (isClaudeCodeTruncationError(error, accumulatedText)) {\n this.logger.warn(\n `[claude-code] Detected truncated stream response, returning ${accumulatedText.length} characters of buffered text`\n );\n const truncationWarning: SharedV3Warning = {\n type: 'other',\n message: CLAUDE_CODE_TRUNCATION_WARNING,\n };\n streamWarnings.push(truncationWarning);\n\n if (textPartId) {\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n } else if (accumulatedText && !textStreamedViaContentBlock) {\n const fallbackTextId = generateId();\n controller.enqueue({\n type: 'text-start',\n id: fallbackTextId,\n });\n controller.enqueue({\n type: 'text-delta',\n id: fallbackTextId,\n delta: accumulatedText,\n });\n controller.enqueue({\n type: 'text-end',\n id: fallbackTextId,\n });\n }\n\n finalizeToolCalls();\n\n const warningsJson = this.serializeWarningsForMetadata(streamWarnings);\n\n controller.enqueue({\n type: 'finish',\n finishReason: { unified: 'length', raw: 'truncation' },\n usage,\n providerMetadata: {\n 'claude-code': {\n ...(this.sessionId !== undefined && { sessionId: this.sessionId }),\n truncated: true,\n ...(streamWarnings.length > 0 && {\n warnings: warningsJson as unknown as JSONValue,\n }),\n },\n },\n });\n\n controller.close();\n return;\n }\n\n finalizeToolCalls();\n let errorToEmit: unknown;\n\n // Special handling for AbortError to preserve abort signal reason\n if (isAbortError(error)) {\n errorToEmit = options.abortSignal?.aborted ? options.abortSignal.reason : error;\n } else {\n // Use unified error handler\n errorToEmit = this.handleClaudeCodeError(error, messagesPrompt, collectedStderr);\n }\n\n // Emit error as a stream part\n controller.enqueue({\n type: 'error',\n error: errorToEmit,\n });\n\n controller.close();\n } finally {\n if (options.abortSignal && abortListener) {\n options.abortSignal.removeEventListener('abort', abortListener);\n }\n }\n },\n cancel: () => {\n if (options.abortSignal && abortListener) {\n options.abortSignal.removeEventListener('abort', abortListener);\n }\n },\n });\n\n return {\n stream: stream as unknown as ReadableStream<LanguageModelV3StreamPart>,\n request: {\n body: messagesPrompt,\n },\n };\n }\n\n private serializeWarningsForMetadata(warnings: SharedV3Warning[]): JSONValue {\n const result = warnings.map((w) => {\n const base: Record<string, string> = { type: w.type };\n if ('message' in w) {\n const m = (w as { message?: unknown }).message;\n if (m !== undefined) base.message = String(m);\n }\n if (w.type === 'unsupported' || w.type === 'compatibility') {\n const feature = (w as { feature: unknown }).feature;\n if (feature !== undefined) base.feature = String(feature);\n if ('details' in w) {\n const d = (w as { details?: unknown }).details;\n if (d !== undefined) base.details = String(d);\n }\n }\n return base;\n });\n return result as unknown as JSONValue;\n }\n}\n","import type { ModelMessage } from 'ai';\nimport type { SDKUserMessage } from '@anthropic-ai/claude-agent-sdk';\n\ntype SDKUserContentPart = SDKUserMessage['message']['content'][number];\n\ninterface StreamingSegment {\n formatted: string;\n}\n\nconst IMAGE_URL_WARNING = 'Image URLs are not supported by this provider; supply base64/data URLs.';\nconst IMAGE_CONVERSION_WARNING = 'Unable to convert image content; supply base64/data URLs.';\n\nfunction normalizeBase64(base64: string): string {\n return base64.replace(/\\s+/g, '');\n}\n\nfunction isImageMimeType(mimeType?: string): boolean {\n return typeof mimeType === 'string' && mimeType.trim().toLowerCase().startsWith('image/');\n}\n\nfunction createImageContent(mediaType: string, data: string): SDKUserContentPart | undefined {\n const trimmedType = mediaType.trim();\n const trimmedData = normalizeBase64(data.trim());\n\n if (!trimmedType || !trimmedData) {\n return undefined;\n }\n\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: trimmedType,\n data: trimmedData,\n },\n } as SDKUserContentPart;\n}\n\nfunction extractMimeType(candidate: unknown): string | undefined {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n return undefined;\n}\n\nfunction parseObjectImage(\n imageObj: Record<string, unknown>,\n fallbackMimeType?: string\n): SDKUserContentPart | undefined {\n const data = typeof imageObj.data === 'string' ? imageObj.data : undefined;\n const mimeType = extractMimeType(\n imageObj.mimeType ?? imageObj.mediaType ?? imageObj.media_type ?? fallbackMimeType\n );\n if (!data || !mimeType) {\n return undefined;\n }\n return createImageContent(mimeType, data);\n}\n\nfunction parseStringImage(\n value: string,\n fallbackMimeType?: string\n): { content?: SDKUserContentPart; warning?: string } {\n const trimmed = value.trim();\n\n if (/^https?:\\/\\//i.test(trimmed)) {\n return { warning: IMAGE_URL_WARNING };\n }\n\n const dataUrlMatch = trimmed.match(/^data:([^;]+);base64,(.+)$/i);\n if (dataUrlMatch) {\n const [, mediaType, data] = dataUrlMatch;\n const content = createImageContent(mediaType, data);\n return content ? { content } : { warning: IMAGE_CONVERSION_WARNING };\n }\n\n const base64Match = trimmed.match(/^base64:([^,]+),(.+)$/i);\n if (base64Match) {\n const [, explicitMimeType, data] = base64Match;\n const content = createImageContent(explicitMimeType, data);\n return content ? { content } : { warning: IMAGE_CONVERSION_WARNING };\n }\n\n if (fallbackMimeType) {\n const content = createImageContent(fallbackMimeType, trimmed);\n if (content) {\n return { content };\n }\n }\n\n return { warning: IMAGE_CONVERSION_WARNING };\n}\n\nfunction parseImagePart(part: unknown): { content?: SDKUserContentPart; warning?: string } {\n if (!part || typeof part !== 'object') {\n return { warning: IMAGE_CONVERSION_WARNING };\n }\n\n const imageValue = (part as { image?: unknown }).image;\n const mimeType = extractMimeType((part as { mimeType?: unknown }).mimeType);\n\n if (typeof imageValue === 'string') {\n return parseStringImage(imageValue, mimeType);\n }\n\n if (imageValue && typeof imageValue === 'object') {\n const content = parseObjectImage(imageValue as Record<string, unknown>, mimeType);\n return content ? { content } : { warning: IMAGE_CONVERSION_WARNING };\n }\n\n return { warning: IMAGE_CONVERSION_WARNING };\n}\n\nfunction convertBinaryToBase64(data: Uint8Array | ArrayBuffer): string | undefined {\n if (typeof Buffer !== 'undefined') {\n const buffer =\n data instanceof Uint8Array ? Buffer.from(data) : Buffer.from(new Uint8Array(data));\n return buffer.toString('base64');\n }\n\n if (typeof btoa === 'function') {\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\n let binary = '';\n const chunkSize = 0x8000;\n for (let i = 0; i < bytes.length; i += chunkSize) {\n const chunk = bytes.subarray(i, i + chunkSize);\n binary += String.fromCharCode(...chunk);\n }\n return btoa(binary);\n }\n\n return undefined;\n}\n\ntype FileLikePart = {\n mediaType?: unknown;\n mimeType?: unknown;\n data?: unknown;\n};\n\nfunction parseFilePart(part: FileLikePart): { content?: SDKUserContentPart; warning?: string } {\n const mimeType = extractMimeType(part.mediaType ?? part.mimeType);\n if (!mimeType || !isImageMimeType(mimeType)) {\n return {};\n }\n\n const data = part.data;\n if (typeof data === 'string') {\n const content = createImageContent(mimeType, data);\n return content ? { content } : { warning: IMAGE_CONVERSION_WARNING };\n }\n\n if (\n data instanceof Uint8Array ||\n (typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer)\n ) {\n const base64 = convertBinaryToBase64(data);\n if (!base64) {\n return { warning: IMAGE_CONVERSION_WARNING };\n }\n const content = createImageContent(mimeType, base64);\n return content ? { content } : { warning: IMAGE_CONVERSION_WARNING };\n }\n\n return { warning: IMAGE_CONVERSION_WARNING };\n}\n\n/**\n * Converts AI SDK prompt format to Claude Code SDK message format.\n * Handles system prompts, user messages, assistant responses, and tool interactions.\n *\n * @param prompt - The AI SDK prompt containing messages\n * @returns An object containing the formatted message prompt and optional system prompt\n *\n * @example\n * ```typescript\n * const { messagesPrompt } = convertToClaudeCodeMessages(\n * [{ role: 'user', content: 'Hello!' }]\n * );\n * ```\n *\n * @remarks\n * - Image parts are collected for streaming input; unsupported variants produce warnings\n * - Tool calls are simplified to \"[Tool calls made]\" notation\n * - JSON schema enforcement is handled natively by the SDK's outputFormat option (v0.1.45+)\n */\nexport function convertToClaudeCodeMessages(prompt: readonly ModelMessage[]): {\n messagesPrompt: string;\n systemPrompt?: string;\n warnings?: string[];\n streamingContentParts: SDKUserMessage['message']['content'];\n hasImageParts: boolean;\n} {\n const messages: string[] = [];\n const warnings: string[] = [];\n let systemPrompt: string | undefined;\n const streamingSegments: StreamingSegment[] = [];\n const imageMap = new Map<number, SDKUserContentPart[]>();\n let hasImageParts = false;\n\n const addSegment = (formatted: string): number => {\n streamingSegments.push({ formatted });\n return streamingSegments.length - 1;\n };\n\n const addImageForSegment = (segmentIndex: number, content: SDKUserContentPart): void => {\n hasImageParts = true;\n if (!imageMap.has(segmentIndex)) {\n imageMap.set(segmentIndex, []);\n }\n imageMap.get(segmentIndex)?.push(content);\n };\n\n for (const message of prompt) {\n switch (message.role) {\n case 'system':\n systemPrompt = message.content;\n if (typeof message.content === 'string' && message.content.trim().length > 0) {\n addSegment(message.content);\n } else {\n addSegment('');\n }\n break;\n\n case 'user':\n if (typeof message.content === 'string') {\n messages.push(message.content);\n addSegment(`Human: ${message.content}`);\n } else {\n // Handle multi-part content\n const textParts = message.content\n .filter((part) => part.type === 'text')\n .map((part) => part.text)\n .join('\\n');\n\n const segmentIndex = addSegment(textParts ? `Human: ${textParts}` : '');\n\n if (textParts) {\n messages.push(textParts);\n }\n\n for (const part of message.content) {\n if (part.type === 'image') {\n const { content, warning } = parseImagePart(part);\n if (content) {\n addImageForSegment(segmentIndex, content);\n } else if (warning) {\n warnings.push(warning);\n }\n } else if (part.type === 'file') {\n const { content, warning } = parseFilePart(part);\n if (content) {\n addImageForSegment(segmentIndex, content);\n } else if (warning) {\n warnings.push(warning);\n }\n }\n }\n }\n break;\n\n case 'assistant': {\n let assistantContent = '';\n if (typeof message.content === 'string') {\n assistantContent = message.content;\n } else {\n const textParts = message.content\n .filter((part) => part.type === 'text')\n .map((part) => part.text)\n .join('\\n');\n\n if (textParts) {\n assistantContent = textParts;\n }\n\n // Handle tool calls if present\n const toolCalls = message.content.filter((part) => part.type === 'tool-call');\n if (toolCalls.length > 0) {\n // For now, we'll just note that tool calls were made\n assistantContent += `\\n[Tool calls made]`;\n }\n }\n const formattedAssistant = `Assistant: ${assistantContent}`;\n messages.push(formattedAssistant);\n addSegment(formattedAssistant);\n break;\n }\n\n case 'tool':\n // Tool results could be included in the conversation\n // Filter out ToolApprovalResponse parts, only process ToolResultPart\n for (const tool of message.content) {\n if (tool.type === 'tool-approval-response') {\n continue; // Skip approval responses\n }\n // Handle different ToolResultOutput types\n let resultText: string;\n const output = tool.output;\n if (output.type === 'text' || output.type === 'error-text') {\n resultText = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n resultText = JSON.stringify(output.value);\n } else if (output.type === 'execution-denied') {\n resultText = `[Execution denied${output.reason ? `: ${output.reason}` : ''}]`;\n } else if (output.type === 'content') {\n // Handle content array - extract text parts\n resultText = output.value\n .filter((part): part is { type: 'text'; text: string } => part.type === 'text')\n .map((part) => part.text)\n .join('\\n');\n } else {\n resultText = '[Unknown output type]';\n }\n const formattedToolResult = `Tool Result (${tool.toolName}): ${resultText}`;\n messages.push(formattedToolResult);\n addSegment(formattedToolResult);\n }\n break;\n }\n }\n\n // For the SDK, we need to provide a single prompt string\n // Format the conversation history properly\n\n // Combine system prompt with messages\n let finalPrompt = '';\n\n // Add system prompt at the beginning if present\n if (systemPrompt) {\n finalPrompt = systemPrompt;\n }\n\n if (messages.length > 0) {\n // Format messages\n const formattedMessages = [];\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n // Check if this is a user or assistant message based on content\n if (msg.startsWith('Assistant:') || msg.startsWith('Tool Result')) {\n formattedMessages.push(msg);\n } else {\n // User messages\n formattedMessages.push(`Human: ${msg}`);\n }\n }\n\n // Combine system prompt with messages\n if (finalPrompt) {\n const joinedMessages = formattedMessages.join('\\n\\n');\n finalPrompt = joinedMessages ? `${finalPrompt}\\n\\n${joinedMessages}` : finalPrompt;\n } else {\n finalPrompt = formattedMessages.join('\\n\\n');\n }\n }\n\n // Build streaming parts including text and images\n const streamingParts: SDKUserContentPart[] = [];\n const imagePartsInOrder: SDKUserContentPart[] = [];\n\n const appendImagesForIndex = (index: number) => {\n const images = imageMap.get(index);\n if (!images) {\n return;\n }\n images.forEach((image) => {\n streamingParts.push(image);\n imagePartsInOrder.push(image);\n });\n };\n\n if (streamingSegments.length > 0) {\n let accumulatedText = '';\n let emittedText = false;\n\n const flushText = () => {\n if (!accumulatedText) {\n return;\n }\n streamingParts.push({ type: 'text', text: accumulatedText });\n accumulatedText = '';\n emittedText = true;\n };\n\n streamingSegments.forEach((segment, index) => {\n const segmentText = segment.formatted;\n if (segmentText) {\n if (!accumulatedText) {\n accumulatedText = emittedText ? `\\n\\n${segmentText}` : segmentText;\n } else {\n accumulatedText += `\\n\\n${segmentText}`;\n }\n }\n\n if (imageMap.has(index)) {\n flushText();\n appendImagesForIndex(index);\n }\n });\n\n flushText();\n }\n\n // Note: JSON schema enforcement is now handled natively by the SDK's outputFormat option (v0.1.45+)\n // No prompt injection needed - structured outputs are guaranteed by the SDK\n\n return {\n messagesPrompt: finalPrompt,\n systemPrompt,\n ...(warnings.length > 0 && { warnings }),\n streamingContentParts:\n streamingParts.length > 0\n ? (streamingParts as SDKUserMessage['message']['content'])\n : ([\n { type: 'text', text: finalPrompt },\n ...imagePartsInOrder,\n ] as SDKUserMessage['message']['content']),\n hasImageParts,\n };\n}\n","import { APICallError, LoadAPIKeyError } from '@ai-sdk/provider';\n\n/**\n * Metadata associated with Claude Code SDK errors.\n * Provides additional context about command execution failures.\n */\nexport interface ClaudeCodeErrorMetadata {\n /**\n * Error code from the CLI process (e.g., 'ENOENT', 'ETIMEDOUT').\n */\n code?: string;\n\n /**\n * Exit code from the Claude Code SDK process.\n * Common codes:\n * - 401: Authentication error\n * - 1: General error\n */\n exitCode?: number;\n\n /**\n * Standard error output from the CLI process.\n */\n stderr?: string;\n\n /**\n * Excerpt from the prompt that caused the error.\n * Limited to first 200 characters for debugging.\n */\n promptExcerpt?: string;\n}\n\n/**\n * Creates an APICallError with Claude Code specific metadata.\n * Used for general CLI execution errors.\n *\n * @param options - Error details and metadata\n * @param options.message - Human-readable error message\n * @param options.code - Error code from the CLI process\n * @param options.exitCode - Exit code from the CLI\n * @param options.stderr - Standard error output\n * @param options.promptExcerpt - Excerpt of the prompt that caused the error\n * @param options.isRetryable - Whether the error is potentially retryable\n * @returns An APICallError instance with Claude Code metadata\n *\n * @example\n * ```typescript\n * throw createAPICallError({\n * message: 'Claude Code SDK failed',\n * code: 'ENOENT',\n * isRetryable: true\n * });\n * ```\n */\nexport function createAPICallError({\n message,\n code,\n exitCode,\n stderr,\n promptExcerpt,\n isRetryable = false,\n}: ClaudeCodeErrorMetadata & {\n message: string;\n isRetryable?: boolean;\n}): APICallError {\n const metadata: ClaudeCodeErrorMetadata = {\n code,\n exitCode,\n stderr,\n promptExcerpt,\n };\n\n return new APICallError({\n message,\n isRetryable,\n url: 'claude-code-cli://command',\n requestBodyValues: promptExcerpt ? { prompt: promptExcerpt } : undefined,\n data: metadata,\n });\n}\n\n/**\n * Creates an authentication error for Claude Code SDK login failures.\n *\n * @param options - Error configuration\n * @param options.message - Error message describing the authentication failure\n * @returns A LoadAPIKeyError instance\n *\n * @example\n * ```typescript\n * throw createAuthenticationError({\n * message: 'Please run \"claude login\" to authenticate'\n * });\n * ```\n */\nexport function createAuthenticationError({ message }: { message: string }): LoadAPIKeyError {\n return new LoadAPIKeyError({\n message:\n message || 'Authentication failed. Please ensure Claude Code SDK is properly authenticated.',\n });\n}\n\n/**\n * Creates a timeout error for Claude Code SDK operations.\n *\n * @param options - Timeout error details\n * @param options.message - Error message describing the timeout\n * @param options.promptExcerpt - Excerpt of the prompt that timed out\n * @param options.timeoutMs - Timeout duration in milliseconds\n * @returns An APICallError instance configured as a timeout error\n *\n * @example\n * ```typescript\n * throw createTimeoutError({\n * message: 'Request timed out after 2 minutes',\n * timeoutMs: 120000\n * });\n * ```\n */\nexport function createTimeoutError({\n message,\n promptExcerpt,\n timeoutMs,\n}: {\n message: string;\n promptExcerpt?: string;\n timeoutMs?: number;\n}): APICallError {\n // Store timeoutMs in metadata for potential use by error handlers\n const metadata: ClaudeCodeErrorMetadata = {\n code: 'TIMEOUT',\n promptExcerpt,\n };\n\n return new APICallError({\n message,\n isRetryable: true,\n url: 'claude-code-cli://command',\n requestBodyValues: promptExcerpt ? { prompt: promptExcerpt } : undefined,\n data: timeoutMs !== undefined ? { ...metadata, timeoutMs } : metadata,\n });\n}\n\n/**\n * Checks if an error is an authentication error.\n * Returns true for LoadAPIKeyError instances or APICallError with exit code 401.\n *\n * @param error - The error to check\n * @returns True if the error is an authentication error\n *\n * @example\n * ```typescript\n * try {\n * await model.generate(...);\n * } catch (error) {\n * if (isAuthenticationError(error)) {\n * console.log('Please authenticate with Claude Code SDK');\n * }\n * }\n * ```\n */\nexport function isAuthenticationError(error: unknown): boolean {\n if (error instanceof LoadAPIKeyError) return true;\n if (error instanceof APICallError && (error.data as ClaudeCodeErrorMetadata)?.exitCode === 401)\n return true;\n return false;\n}\n\n/**\n * Checks if an error is a timeout error.\n * Returns true for APICallError instances with code 'TIMEOUT'.\n *\n * @param error - The error to check\n * @returns True if the error is a timeout error\n *\n * @example\n * ```typescript\n * try {\n * await model.generate(...);\n * } catch (error) {\n * if (isTimeoutError(error)) {\n * console.log('Request timed out, consider retrying');\n * }\n * }\n * ```\n */\nexport function isTimeoutError(error: unknown): boolean {\n if (error instanceof APICallError && (error.data as ClaudeCodeErrorMetadata)?.code === 'TIMEOUT')\n return true;\n return false;\n}\n\n/**\n * Extracts Claude Code error metadata from an error object.\n *\n * @param error - The error to extract metadata from\n * @returns The error metadata if available, undefined otherwise\n *\n * @example\n * ```typescript\n * try {\n * await model.generate(...);\n * } catch (error) {\n * const metadata = getErrorMetadata(error);\n * if (metadata?.exitCode === 401) {\n * console.log('Authentication required');\n * }\n * }\n * ```\n */\nexport function getErrorMetadata(error: unknown): ClaudeCodeErrorMetadata | undefined {\n if (error instanceof APICallError && error.data) {\n return error.data as ClaudeCodeErrorMetadata;\n }\n return undefined;\n}\n","import type { LanguageModelV3FinishReason } from '@ai-sdk/provider';\n\n/**\n * Maps Claude Code SDK result subtypes to AI SDK finish reasons.\n *\n * When `stopReason` is provided (from the SDK's `stop_reason` field), it takes\n * priority for mapping well-known Anthropic API stop reasons. Otherwise, falls\n * back to the existing subtype-based mapping.\n *\n * @param subtype - The result subtype from Claude Code SDK\n * @param stopReason - The optional stop_reason from SDKResultSuccess/SDKResultError (v0.2.31+)\n * @returns The corresponding AI SDK finish reason with unified and raw values\n *\n * @example\n * ```typescript\n * // With stop_reason (preferred when available)\n * mapClaudeCodeFinishReason('success', 'end_turn');\n * // Returns: { unified: 'stop', raw: 'end_turn' }\n *\n * // Without stop_reason (backward compatible)\n * mapClaudeCodeFinishReason('error_max_turns');\n * // Returns: { unified: 'length', raw: 'error_max_turns' }\n * ```\n */\nexport function mapClaudeCodeFinishReason(\n subtype?: string,\n stopReason?: string | null\n): LanguageModelV3FinishReason {\n // When stop_reason is present and non-null, map known Anthropic API stop reasons\n if (stopReason != null) {\n switch (stopReason) {\n case 'end_turn':\n return { unified: 'stop', raw: 'end_turn' };\n case 'max_tokens':\n return { unified: 'length', raw: 'max_tokens' };\n case 'stop_sequence':\n return { unified: 'stop', raw: 'stop_sequence' };\n case 'tool_use':\n return { unified: 'tool-calls', raw: 'tool_use' };\n default:\n // Unknown stop_reason: fall back to subtype mapping but preserve stop_reason as raw\n break;\n }\n }\n\n // Fall back to subtype-based mapping\n const raw = stopReason ?? subtype;\n switch (subtype) {\n case 'success':\n return { unified: 'stop', raw };\n case 'error_max_turns':\n return { unified: 'length', raw };\n case 'error_during_execution':\n return { unified: 'error', raw };\n case undefined:\n return { unified: 'stop', raw };\n default:\n return { unified: 'other', raw };\n }\n}\n","import { z } from 'zod';\nimport { existsSync } from 'fs';\n\n/**\n * Validation schemas and utilities for Claude Code provider inputs.\n * Uses Zod for type-safe validation following AI SDK patterns.\n */\n\n// Helper for Zod v3/v4 compatibility\n// Use a simple z.any() for functions to work with both versions\nconst loggerFunctionSchema = z.object({\n debug: z.any().refine((val) => typeof val === 'function', {\n message: 'debug must be a function',\n }),\n info: z.any().refine((val) => typeof val === 'function', {\n message: 'info must be a function',\n }),\n warn: z.any().refine((val) => typeof val === 'function', {\n message: 'warn must be a function',\n }),\n error: z.any().refine((val) => typeof val === 'function', {\n message: 'error must be a function',\n }),\n});\n\n/**\n * Schema for validating Claude Code settings.\n * Ensures all settings are within acceptable ranges and formats.\n */\nexport const claudeCodeSettingsSchema = z\n .object({\n pathToClaudeCodeExecutable: z.string().optional(),\n customSystemPrompt: z.string().optional(),\n appendSystemPrompt: z.string().optional(),\n systemPrompt: z\n .union([\n z.string(),\n z.object({\n type: z.literal('preset'),\n preset: z.literal('claude_code'),\n append: z.string().optional(),\n }),\n ])\n .optional(),\n maxTurns: z.number().int().min(1).max(100).optional(),\n maxThinkingTokens: z.number().int().positive().max(100000).optional(),\n cwd: z\n .string()\n .refine(\n (val) => {\n // Skip directory validation in non-Node environments\n if (typeof process === 'undefined' || !process.versions?.node) {\n return true;\n }\n return !val || existsSync(val);\n },\n { message: 'Working directory must exist' }\n )\n .optional(),\n executable: z.enum(['bun', 'deno', 'node']).optional(),\n executableArgs: z.array(z.string()).optional(),\n permissionMode: z\n .enum(['default', 'acceptEdits', 'bypassPermissions', 'plan', 'delegate', 'dontAsk'])\n .optional(),\n permissionPromptToolName: z.string().optional(),\n continue: z.boolean().optional(),\n resume: z.string().optional(),\n sessionId: z.string().optional(),\n allowedTools: z.array(z.string()).optional(),\n disallowedTools: z.array(z.string()).optional(),\n betas: z.array(z.string()).optional(),\n allowDangerouslySkipPermissions: z.boolean().optional(),\n enableFileCheckpointing: z.boolean().optional(),\n maxBudgetUsd: z.number().min(0).optional(),\n plugins: z\n .array(\n z\n .object({\n type: z.string(),\n path: z.string(),\n })\n .passthrough()\n )\n .optional(),\n resumeSessionAt: z.string().optional(),\n sandbox: z\n .any()\n .refine((val) => val === undefined || typeof val === 'object', {\n message: 'sandbox must be an object',\n })\n .optional(),\n tools: z\n .union([\n z.array(z.string()),\n z.object({\n type: z.literal('preset'),\n preset: z.literal('claude_code'),\n }),\n ])\n .optional(),\n settingSources: z.array(z.enum(['user', 'project', 'local'])).optional(),\n streamingInput: z.enum(['auto', 'always', 'off']).optional(),\n // Hooks and tool-permission callback (permissive validation of shapes)\n canUseTool: z\n .any()\n .refine((v) => v === undefined || typeof v === 'function', {\n message: 'canUseTool must be a function',\n })\n .optional(),\n hooks: z\n .record(\n z.string(),\n z.array(\n z.object({\n matcher: z.string().optional(),\n hooks: z.array(z.any()).nonempty(),\n })\n )\n )\n .optional(),\n mcpServers: z\n .record(\n z.string(),\n z.union([\n // McpStdioServerConfig\n z.object({\n type: z.literal('stdio').optional(),\n command: z.string(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n }),\n // McpSSEServerConfig\n z.object({\n type: z.literal('sse'),\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n // McpHttpServerConfig\n z.object({\n type: z.literal('http'),\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n // McpSdkServerConfig (in-process custom tools)\n z.object({\n type: z.literal('sdk'),\n name: z.string(),\n instance: z.any(),\n }),\n ])\n )\n .optional(),\n verbose: z.boolean().optional(),\n debug: z.boolean().optional(),\n debugFile: z.string().optional(),\n logger: z.union([z.literal(false), loggerFunctionSchema]).optional(),\n env: z.record(z.string(), z.string().optional()).optional(),\n additionalDirectories: z.array(z.string()).optional(),\n agents: z\n .record(\n z.string(),\n z\n .object({\n description: z.string(),\n tools: z.array(z.string()).optional(),\n disallowedTools: z.array(z.string()).optional(),\n prompt: z.string(),\n model: z.enum(['sonnet', 'opus', 'haiku', 'inherit']).optional(),\n mcpServers: z\n .array(\n z.union([\n z.string(),\n z.record(z.string(), z.any()), // McpServerConfigForProcessTransport\n ])\n )\n .optional(),\n criticalSystemReminder_EXPERIMENTAL: z.string().optional(),\n })\n .passthrough()\n )\n .optional(),\n includePartialMessages: z.boolean().optional(),\n fallbackModel: z.string().optional(),\n forkSession: z.boolean().optional(),\n stderr: z\n .any()\n .refine((val) => val === undefined || typeof val === 'function', {\n message: 'stderr must be a function',\n })\n .optional(),\n strictMcpConfig: z.boolean().optional(),\n extraArgs: z.record(z.string(), z.union([z.string(), z.null()])).optional(),\n persistSession: z.boolean().optional(),\n spawnClaudeCodeProcess: z\n .any()\n .refine((val) => val === undefined || typeof val === 'function', {\n message: 'spawnClaudeCodeProcess must be a function',\n })\n .optional(),\n sdkOptions: z.record(z.string(), z.any()).optional(),\n maxToolResultSize: z.number().int().min(100).max(1000000).optional(),\n // Callback invoked when Query object is created - for mid-stream injection via streamInput()\n onQueryCreated: z\n .any()\n .refine((val) => val === undefined || typeof val === 'function', {\n message: 'onQueryCreated must be a function',\n })\n .optional(),\n onStreamStart: z\n .any()\n .refine((val) => val === undefined || typeof val === 'function', {\n message: 'onStreamStart must be a function',\n })\n .optional(),\n })\n .strict();\n\n/**\n * Validates a model ID and returns warnings if needed.\n *\n * @param modelId - The model ID to validate\n * @returns Warning message if model is unknown, undefined otherwise\n */\nexport function validateModelId(modelId: string): string | undefined {\n const knownModels = ['opus', 'sonnet', 'haiku'];\n\n // Check for empty or whitespace-only\n if (!modelId || modelId.trim() === '') {\n throw new Error('Model ID cannot be empty');\n }\n\n // Warn about unknown models but allow them\n if (!knownModels.includes(modelId)) {\n return `Unknown model ID: '${modelId}'. Proceeding with custom model. Known models are: ${knownModels.join(', ')}`;\n }\n\n return undefined;\n}\n\n/**\n * Validates Claude Code settings and returns validation results.\n *\n * @param settings - The settings object to validate\n * @returns Object with validation results and any warnings\n */\nexport function validateSettings(settings: unknown): {\n valid: boolean;\n warnings: string[];\n errors: string[];\n} {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n try {\n // Parse with Zod schema\n const result = claudeCodeSettingsSchema.safeParse(settings);\n\n if (!result.success) {\n // Extract user-friendly error messages\n // Support both Zod v3 (errors) and v4 (issues)\n const errorObject = result.error as {\n errors?: Array<{ path: string[]; message: string }>;\n issues?: Array<{ path: string[]; message: string }>;\n };\n const issues = errorObject.errors || errorObject.issues || [];\n issues.forEach((err: { path: string[]; message: string }) => {\n const path = err.path.join('.');\n errors.push(`${path ? `${path}: ` : ''}${err.message}`);\n });\n return { valid: false, warnings, errors };\n }\n\n // Additional validation warnings\n const validSettings = result.data;\n\n // Warn about high turn limits\n if (validSettings.maxTurns && validSettings.maxTurns > 20) {\n warnings.push(\n `High maxTurns value (${validSettings.maxTurns}) may lead to long-running conversations`\n );\n }\n\n // Warn about very high thinking tokens\n if (validSettings.maxThinkingTokens && validSettings.maxThinkingTokens > 50000) {\n warnings.push(\n `Very high maxThinkingTokens (${validSettings.maxThinkingTokens}) may increase response time`\n );\n }\n\n // Check if both allowedTools and disallowedTools are specified\n if (validSettings.allowedTools && validSettings.disallowedTools) {\n warnings.push(\n 'Both allowedTools and disallowedTools are specified. Only allowedTools will be used.'\n );\n }\n\n // Validate tool name format\n const validateToolNames = (tools: string[], type: string) => {\n tools.forEach((tool) => {\n // Basic validation - tool names should be alphanumeric with optional specifiers\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*(\\([^)]*\\))?$/.test(tool) && !tool.startsWith('mcp__')) {\n warnings.push(`Unusual ${type} tool name format: '${tool}'`);\n }\n });\n };\n\n if (validSettings.allowedTools) {\n validateToolNames(validSettings.allowedTools, 'allowed');\n }\n\n if (validSettings.disallowedTools) {\n validateToolNames(validSettings.disallowedTools, 'disallowed');\n }\n\n // Warn about Skills configuration issues\n if (validSettings.allowedTools?.includes('Skill') && !validSettings.settingSources) {\n warnings.push(\n \"allowedTools includes 'Skill' but settingSources is not set. Skills require settingSources (e.g., ['user', 'project']) to load skill definitions.\"\n );\n }\n\n return { valid: true, warnings, errors };\n } catch (error) {\n errors.push(`Validation error: ${error instanceof Error ? error.message : String(error)}`);\n return { valid: false, warnings, errors };\n }\n}\n\n/**\n * Validates prompt length and format.\n *\n * @param prompt - The prompt to validate\n * @returns Warning message if prompt might cause issues\n */\nexport function validatePrompt(prompt: string): string | undefined {\n // Very long prompts might cause issues\n const MAX_PROMPT_LENGTH = 100000; // ~25k tokens\n\n if (prompt.length > MAX_PROMPT_LENGTH) {\n return `Very long prompt (${prompt.length} characters) may cause performance issues or timeouts`;\n }\n\n return undefined;\n}\n\n/**\n * Validates session ID format.\n *\n * @param sessionId - The session ID to validate\n * @returns Warning message if format is unusual\n */\nexport function validateSessionId(sessionId: string): string | undefined {\n // Session IDs from Claude Code are typically UUID-like\n // But we don't want to be too strict as format might change\n if (sessionId && !/^[a-zA-Z0-9-_]+$/.test(sessionId)) {\n return `Unusual session ID format. This may cause issues with session resumption.`;\n }\n\n return undefined;\n}\n","import type { Logger } from './types.js';\n\n/**\n * Default logger that uses console with level tags.\n */\nconst defaultLogger: Logger = {\n // eslint-disable-next-line no-console\n debug: (message: string) => console.debug(`[DEBUG] ${message}`),\n // eslint-disable-next-line no-console\n info: (message: string) => console.info(`[INFO] ${message}`),\n warn: (message: string) => console.warn(`[WARN] ${message}`),\n error: (message: string) => console.error(`[ERROR] ${message}`),\n};\n\n/**\n * No-op logger that discards all messages.\n */\nconst noopLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\n/**\n * Gets the appropriate logger based on configuration.\n *\n * @param logger - Logger configuration from settings\n * @returns The logger to use\n */\nexport function getLogger(logger: Logger | false | undefined): Logger {\n if (logger === false) {\n return noopLogger;\n }\n\n if (logger === undefined) {\n return defaultLogger;\n }\n\n return logger;\n}\n\n/**\n * Creates a verbose-aware logger that only logs debug/info when verbose is enabled.\n * Warn and error are always logged regardless of verbose setting.\n *\n * @param logger - Base logger to wrap\n * @param verbose - Whether to enable verbose (debug/info) logging\n * @returns Logger with verbose-aware behavior\n */\nexport function createVerboseLogger(logger: Logger, verbose: boolean = false): Logger {\n if (verbose) {\n // When verbose is enabled, use all log levels\n return logger;\n }\n\n // When verbose is disabled, only allow warn/error\n // Bind methods to preserve 'this' context for custom loggers\n return {\n debug: () => {}, // No-op when not verbose\n info: () => {}, // No-op when not verbose\n warn: logger.warn.bind(logger),\n error: logger.error.bind(logger),\n };\n}\n","/**\n * Provider exports for creating and configuring Claude Code instances.\n * @module claude-code\n */\n\n/**\n * Creates a new Claude Code provider instance and the default provider instance.\n * @see {@link createClaudeCode} for creating custom provider instances\n * @see {@link claudeCode} for the default provider instance\n */\nexport { createClaudeCode, claudeCode } from './claude-code-provider.js';\n\n/**\n * Type definitions for the Claude Code provider.\n * @see {@link ClaudeCodeProvider} for the provider interface\n * @see {@link ClaudeCodeProviderSettings} for provider configuration options\n */\nexport type { ClaudeCodeProvider, ClaudeCodeProviderSettings } from './claude-code-provider.js';\n\n/**\n * Language model implementation for Claude Code.\n * This class implements the AI SDK's LanguageModelV3 interface.\n */\nexport { ClaudeCodeLanguageModel } from './claude-code-language-model.js';\n\n/**\n * Type definitions for Claude Code language models.\n * @see {@link ClaudeCodeModelId} for supported model identifiers\n * @see {@link ClaudeCodeLanguageModelOptions} for model configuration options\n */\nexport type {\n ClaudeCodeModelId,\n ClaudeCodeLanguageModelOptions,\n} from './claude-code-language-model.js';\n\n/**\n * Settings for configuring Claude Code behavior.\n * Includes options for customizing the CLI execution, permissions, and tool usage.\n */\nexport type { ClaudeCodeSettings, Logger, MessageInjector } from './types.js';\n\n// Convenience re-exports from the SDK for custom tools and hooks\nexport { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';\nexport { createCustomMcpServer } from './mcp-helpers.js';\nexport type { ToolAnnotations, MinimalCallToolResult } from './mcp-helpers.js';\nexport type {\n HookEvent,\n HookCallback,\n HookCallbackMatcher,\n HookInput,\n HookJSONOutput,\n PreToolUseHookInput,\n PostToolUseHookInput,\n UserPromptSubmitHookInput,\n SessionStartHookInput,\n SessionEndHookInput,\n TeammateIdleHookInput,\n TaskCompletedHookInput,\n CanUseTool,\n PermissionResult,\n PermissionUpdate,\n PermissionBehavior,\n PermissionRuleValue,\n McpServerConfig,\n McpSdkServerConfigWithInstance,\n OutputFormat,\n SpawnedProcess,\n SpawnOptions,\n AgentMcpServerSpec,\n // Query interface for mid-stream message injection via streamInput()\n Query,\n} from '@anthropic-ai/claude-agent-sdk';\n\n/**\n * Error handling utilities for Claude Code.\n * These functions help create and identify specific error types.\n *\n * @see {@link isAuthenticationError} to check for authentication failures\n * @see {@link isTimeoutError} to check for timeout errors\n * @see {@link getErrorMetadata} to extract error metadata\n * @see {@link createAPICallError} to create general API errors\n * @see {@link createAuthenticationError} to create authentication errors\n * @see {@link createTimeoutError} to create timeout errors\n */\nexport {\n isAuthenticationError,\n isTimeoutError,\n getErrorMetadata,\n createAPICallError,\n createAuthenticationError,\n createTimeoutError,\n} from './errors.js';\n\n/**\n * Metadata associated with Claude Code errors.\n * Contains additional context about CLI execution failures.\n */\nexport type { ClaudeCodeErrorMetadata } from './errors.js';\n","import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';\nimport type {\n McpSdkServerConfigWithInstance,\n SdkMcpToolDefinition,\n} from '@anthropic-ai/claude-agent-sdk';\nimport { type ZodRawShape, type ZodObject } from 'zod';\n\n/**\n * Optional annotations for content items, per MCP specification.\n * Validated against MCP SDK schema version 2025-06-18.\n */\ntype ContentAnnotations = {\n /** Intended audience(s) for this content */\n audience?: ('user' | 'assistant')[];\n /** Priority hint (0 = least important, 1 = most important) */\n priority?: number;\n /** ISO 8601 timestamp of last modification */\n lastModified?: string;\n};\n\n/**\n * MCP tool annotations for hinting tool behavior to the model.\n * Derived from the SDK's SdkMcpToolDefinition type to stay in sync\n * with the upstream MCP ToolAnnotations definition.\n */\nexport type ToolAnnotations = NonNullable<SdkMcpToolDefinition['annotations']>;\n\n/**\n * Convenience helper to create an SDK MCP server from a simple tool map.\n * Each tool provides a description, a Zod object schema, and a handler.\n *\n * Type definition validated against MCP SDK specification version 2025-06-18.\n * See: https://modelcontextprotocol.io/specification/2025-06-18/server/tools\n */\nexport type MinimalCallToolResult = {\n content: Array<\n | {\n /** Text content */\n type: 'text';\n /** The text content (plain text or structured format like JSON) */\n text: string;\n annotations?: ContentAnnotations;\n _meta?: Record<string, unknown>;\n [key: string]: unknown;\n }\n | {\n /** Image content (base64-encoded) */\n type: 'image';\n /** Base64-encoded image data */\n data: string;\n /** MIME type of the image (e.g., image/png, image/jpeg) */\n mimeType: string;\n annotations?: ContentAnnotations;\n _meta?: Record<string, unknown>;\n [key: string]: unknown;\n }\n | {\n /** Audio content (base64-encoded) */\n type: 'audio';\n /** Base64-encoded audio data */\n data: string;\n /** MIME type of the audio (e.g., audio/wav, audio/mp3) */\n mimeType: string;\n annotations?: ContentAnnotations;\n _meta?: Record<string, unknown>;\n [key: string]: unknown;\n }\n | {\n /** Embedded resource with full content (text or blob) */\n type: 'resource';\n /** Resource contents - either text or blob variant */\n resource: { uri: string; _meta?: Record<string, unknown>; [key: string]: unknown } & (\n | { text: string; mimeType?: string }\n | { blob: string; mimeType: string }\n );\n annotations?: ContentAnnotations;\n _meta?: Record<string, unknown>;\n [key: string]: unknown;\n }\n | {\n /** Resource link (reference only - no embedded content) */\n type: 'resource_link';\n /** URI of the resource */\n uri: string;\n /** Human-readable name (required per MCP spec) */\n name: string;\n /** Optional description of what this resource represents */\n description?: string;\n /** MIME type of the resource, if known */\n mimeType?: string;\n annotations?: ContentAnnotations;\n _meta?: Record<string, unknown>;\n [key: string]: unknown;\n }\n >;\n isError?: boolean;\n structuredContent?: Record<string, unknown>;\n _meta?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport function createCustomMcpServer<\n Tools extends Record<\n string,\n {\n description: string;\n inputSchema: ZodObject<ZodRawShape>;\n handler: (args: Record<string, unknown>, extra: unknown) => Promise<MinimalCallToolResult>;\n annotations?: ToolAnnotations;\n }\n >,\n>(config: { name: string; version?: string; tools: Tools }): McpSdkServerConfigWithInstance {\n const defs = Object.entries(config.tools).map(([name, def]) =>\n tool(\n name,\n def.description,\n def.inputSchema.shape as ZodRawShape,\n (args: Record<string, unknown>, extra: unknown) => def.handler(args, extra),\n def.annotations ? { annotations: def.annotations } : undefined\n )\n );\n return createSdkMcpServer({ name: config.name, version: config.version, tools: defs });\n}\n"],"mappings":"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","names":["NoSuchModelError","tool","tool","largestSize","content","tool","NoSuchModelError","createSdkMcpServer","tool"]}
|