ai-sdk-provider-claude-code 1.1.2 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +18 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +18 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -474,7 +474,7 @@ function isAbortError(err) {
|
|
|
474
474
|
}
|
|
475
475
|
return false;
|
|
476
476
|
}
|
|
477
|
-
function toAsyncIterablePrompt(messagesPrompt, sessionId) {
|
|
477
|
+
function toAsyncIterablePrompt(messagesPrompt, outputStreamEnded, sessionId) {
|
|
478
478
|
const msg = {
|
|
479
479
|
type: "user",
|
|
480
480
|
message: {
|
|
@@ -487,6 +487,7 @@ function toAsyncIterablePrompt(messagesPrompt, sessionId) {
|
|
|
487
487
|
return {
|
|
488
488
|
async *[Symbol.asyncIterator]() {
|
|
489
489
|
yield msg;
|
|
490
|
+
await outputStreamEnded;
|
|
490
491
|
}
|
|
491
492
|
};
|
|
492
493
|
}
|
|
@@ -701,13 +702,18 @@ var ClaudeCodeLanguageModel = class {
|
|
|
701
702
|
});
|
|
702
703
|
});
|
|
703
704
|
}
|
|
705
|
+
let done = () => {
|
|
706
|
+
};
|
|
707
|
+
const outputStreamEnded = new Promise((resolve) => {
|
|
708
|
+
done = () => resolve(void 0);
|
|
709
|
+
});
|
|
704
710
|
try {
|
|
705
711
|
const modeSetting = this.settings.streamingInput ?? "auto";
|
|
706
712
|
const wantsStream = modeSetting === "always" || modeSetting === "auto" && !!this.settings.canUseTool;
|
|
707
713
|
if (this.settings.canUseTool && this.settings.permissionPromptToolName) {
|
|
708
714
|
throw new Error("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.");
|
|
709
715
|
}
|
|
710
|
-
const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, this.settings.resume ?? this.sessionId) : messagesPrompt;
|
|
716
|
+
const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, outputStreamEnded, this.settings.resume ?? this.sessionId) : messagesPrompt;
|
|
711
717
|
const response = (0, import_claude_code.query)({
|
|
712
718
|
prompt: sdkPrompt,
|
|
713
719
|
options: queryOptions
|
|
@@ -718,6 +724,7 @@ var ClaudeCodeLanguageModel = class {
|
|
|
718
724
|
(c) => c.type === "text" ? c.text : ""
|
|
719
725
|
).join("");
|
|
720
726
|
} else if (message.type === "result") {
|
|
727
|
+
done();
|
|
721
728
|
this.setSessionId(message.session_id);
|
|
722
729
|
costUsd = message.total_cost_usd;
|
|
723
730
|
durationMs = message.duration_ms;
|
|
@@ -735,6 +742,7 @@ var ClaudeCodeLanguageModel = class {
|
|
|
735
742
|
}
|
|
736
743
|
}
|
|
737
744
|
} catch (error) {
|
|
745
|
+
done();
|
|
738
746
|
if (isAbortError(error)) {
|
|
739
747
|
throw options.abortSignal?.aborted ? options.abortSignal.reason : error;
|
|
740
748
|
}
|
|
@@ -802,6 +810,11 @@ var ClaudeCodeLanguageModel = class {
|
|
|
802
810
|
}
|
|
803
811
|
const stream = new ReadableStream({
|
|
804
812
|
start: async (controller) => {
|
|
813
|
+
let done = () => {
|
|
814
|
+
};
|
|
815
|
+
const outputStreamEnded = new Promise((resolve) => {
|
|
816
|
+
done = () => resolve(void 0);
|
|
817
|
+
});
|
|
805
818
|
try {
|
|
806
819
|
controller.enqueue({ type: "stream-start", warnings });
|
|
807
820
|
const modeSetting = this.settings.streamingInput ?? "auto";
|
|
@@ -809,7 +822,7 @@ var ClaudeCodeLanguageModel = class {
|
|
|
809
822
|
if (this.settings.canUseTool && this.settings.permissionPromptToolName) {
|
|
810
823
|
throw new Error("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.");
|
|
811
824
|
}
|
|
812
|
-
const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, this.settings.resume ?? this.sessionId) : messagesPrompt;
|
|
825
|
+
const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, outputStreamEnded, this.settings.resume ?? this.sessionId) : messagesPrompt;
|
|
813
826
|
const response = (0, import_claude_code.query)({
|
|
814
827
|
prompt: sdkPrompt,
|
|
815
828
|
options: queryOptions
|
|
@@ -838,6 +851,7 @@ var ClaudeCodeLanguageModel = class {
|
|
|
838
851
|
}
|
|
839
852
|
}
|
|
840
853
|
} else if (message.type === "result") {
|
|
854
|
+
done();
|
|
841
855
|
let rawUsage;
|
|
842
856
|
if ("usage" in message) {
|
|
843
857
|
rawUsage = message.usage;
|
|
@@ -897,6 +911,7 @@ var ClaudeCodeLanguageModel = class {
|
|
|
897
911
|
}
|
|
898
912
|
controller.close();
|
|
899
913
|
} catch (error) {
|
|
914
|
+
done();
|
|
900
915
|
let errorToEmit;
|
|
901
916
|
if (isAbortError(error)) {
|
|
902
917
|
errorToEmit = options.abortSignal?.aborted ? options.abortSignal.reason : error;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/claude-code-provider.ts","../src/claude-code-language-model.ts","../src/convert-to-claude-code-messages.ts","../src/extract-json.ts","../src/errors.ts","../src/map-claude-code-finish-reason.ts","../src/validation.ts","../src/logger.ts","../src/mcp-helpers.ts"],"sourcesContent":["/**\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 LanguageModelV1 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 { ClaudeCodeModelId, ClaudeCodeLanguageModelOptions } 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 } from './types.js';\n\n// Convenience re-exports from the SDK for custom tools and hooks\nexport { createSdkMcpServer, tool } from '@anthropic-ai/claude-code';\nexport { createCustomMcpServer } 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 CanUseTool,\n PermissionResult,\n PermissionUpdate,\n PermissionBehavior,\n PermissionRuleValue,\n McpServerConfig,\n McpSdkServerConfigWithInstance,\n} from '@anthropic-ai/claude-code';\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 type { LanguageModelV2, ProviderV2 } 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 ProviderV1.\n * Provides methods to create language models for interacting with Claude via the CLI.\n * \n * @example\n * ```typescript\n * import { claudeCode } from 'ai-sdk-provider-claude-code';\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 ProviderV2 {\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): LanguageModelV2;\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(\n modelId: ClaudeCodeModelId,\n settings?: ClaudeCodeSettings,\n ): LanguageModelV2;\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(\n modelId: ClaudeCodeModelId,\n settings?: ClaudeCodeSettings,\n ): LanguageModelV2;\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(\n options: ClaudeCodeProviderSettings = {},\n): 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 ): LanguageModelV2 => {\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 (\n modelId: ClaudeCodeModelId,\n settings?: ClaudeCodeSettings,\n ) {\n if (new.target) {\n throw new Error(\n 'The Claude Code model function cannot be called with the new keyword.',\n );\n }\n\n return createModel(modelId, settings);\n };\n\n provider.languageModel = createModel;\n provider.chat = createModel; // Alias for languageModel\n\n // Add textEmbeddingModel method that throws NoSuchModelError\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'textEmbeddingModel',\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 'ai-sdk-provider-claude-code';\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();","import type {\n LanguageModelV2,\n LanguageModelV2CallWarning,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n JSONValue,\n} from '@ai-sdk/provider';\nimport { NoSuchModelError, APICallError, LoadAPIKeyError } from '@ai-sdk/provider';\nimport { generateId } from '@ai-sdk/provider-utils';\nimport type { ClaudeCodeSettings, Logger } from './types.js';\nimport { convertToClaudeCodeMessages } from './convert-to-claude-code-messages.js';\nimport { extractJson } from './extract-json.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 } from './logger.js';\n\nimport { query, type Options } from '@anthropic-ai/claude-code';\nimport type { SDKUserMessage } from '@anthropic-ai/claude-code';\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\nfunction toAsyncIterablePrompt(messagesPrompt: string, sessionId?: string): AsyncIterable<SDKUserMessage> {\n const msg: SDKUserMessage = {\n type: 'user',\n message: {\n role: 'user',\n content: [{ type: 'text', text: messagesPrompt }],\n },\n parent_tool_use_id: null,\n session_id: sessionId ?? '',\n };\n return {\n async *[Symbol.asyncIterator]() {\n yield msg;\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', 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 4 Opus model (most capable)\n * - 'sonnet': Claude 4 Sonnet model (balanced performance)\n * - Custom string: Any other model identifier supported by the CLI\n * \n * @example\n * ```typescript\n * const opusModel = claudeCode('opus');\n * const sonnetModel = claudeCode('sonnet');\n * const customModel = claudeCode('claude-3-opus-20240229');\n * ```\n */\nexport type ClaudeCodeModelId = 'opus' | 'sonnet' | (string & {});\n\nconst modelMap: Record<string, string> = {\n 'opus': 'opus',\n 'sonnet': 'sonnet',\n};\n\n/**\n * Language model implementation for Claude Code SDK.\n * This class implements the AI SDK's LanguageModelV1 interface to provide\n * integration with Claude models through the Claude Code SDK.\n * \n * Features:\n * - Supports streaming and non-streaming generation\n * - Handles JSON object generation mode\n * - Manages CLI sessions for conversation continuity\n * - Provides detailed error handling and retry logic\n * \n * Limitations:\n * - Does not support image inputs\n * - Does not support structured outputs (tool 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 */\nexport class ClaudeCodeLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2' as const;\n readonly defaultObjectGenerationMode = 'json' as const;\n readonly supportsImageUrls = false;\n readonly supportedUrls = {};\n readonly supportsStructuredOutputs = false;\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 this.logger = getLogger(this.settings.logger);\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 generateAllWarnings(\n options: Parameters<LanguageModelV2['doGenerate']>[0] | Parameters<LanguageModelV2['doStream']>[0],\n prompt: string\n ): LanguageModelV2CallWarning[] {\n const warnings: LanguageModelV2CallWarning[] = [];\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) 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-setting',\n setting: param as 'temperature' | 'maxTokens' | 'topP' | 'topK' | 'presencePenalty' | 'frequencyPenalty' | 'stopSequences' | 'seed',\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 // 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(abortController: AbortController): Options {\n const opts: Partial<Options> & Record<string, unknown> = {\n model: this.getModel(),\n abortController,\n resume: this.settings.resume ?? this.sessionId,\n pathToClaudeCodeExecutable: this.settings.pathToClaudeCodeExecutable,\n customSystemPrompt: this.settings.customSystemPrompt,\n appendSystemPrompt: this.settings.appendSystemPrompt,\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 mcpServers: this.settings.mcpServers,\n canUseTool: this.settings.canUseTool,\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 return opts as Options;\n }\n\n private handleClaudeCodeError(\n error: unknown,\n messagesPrompt: 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 = (err: unknown): 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 ];\n \n const errorMessage = isErrorWithMessage(error) && error.message \n ? error.message.toLowerCase() \n : '';\n \n const exitCode = isErrorWithCode(error) && typeof error.exitCode === 'number' \n ? error.exitCode \n : undefined;\n \n const isAuthError = authErrorPatterns.some(pattern => errorMessage.includes(pattern)) ||\n exitCode === 401;\n\n if (isAuthError) {\n return createAuthenticationError({\n message: 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' \n ? error.code \n : '';\n \n if (errorCode === 'ETIMEDOUT' || errorMessage.includes('timeout')) {\n return createTimeoutError({\n message: isErrorWithMessage(error) && error.message \n ? error.message \n : '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 = errorCode === 'ENOENT' || \n errorCode === 'ECONNREFUSED' ||\n errorCode === 'ETIMEDOUT' ||\n errorCode === 'ECONNRESET';\n\n return createAPICallError({\n message: isErrorWithMessage(error) && error.message \n ? error.message \n : 'Claude Code SDK error',\n code: errorCode || undefined,\n exitCode: exitCode,\n stderr: isErrorWithCode(error) && typeof error.stderr === 'string' \n ? error.stderr \n : undefined,\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 private validateJsonExtraction(\n originalText: string,\n extractedJson: string\n ): { valid: boolean; warning?: LanguageModelV2CallWarning } {\n // If the extracted JSON is the same as original, extraction likely failed\n if (extractedJson === originalText) {\n return {\n valid: false,\n warning: {\n type: 'other',\n message: 'JSON extraction from model response may be incomplete or modified. The model may not have returned valid JSON.',\n },\n };\n }\n\n // Try to parse the extracted JSON to validate it\n try {\n JSON.parse(extractedJson);\n return { valid: true };\n } catch {\n return {\n valid: false,\n warning: {\n type: 'other',\n message: 'JSON extraction resulted in invalid JSON. The response may be malformed.',\n },\n };\n }\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n // Determine mode based on responseFormat\n const mode = options.responseFormat?.type === 'json' \n ? { type: 'object-json' as const } \n : { type: 'regular' as const };\n \n const { messagesPrompt, warnings: messageWarnings } = convertToClaudeCodeMessages(\n options.prompt, \n mode,\n options.responseFormat?.type === 'json' ? options.responseFormat.schema : undefined\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 const queryOptions = this.createQueryOptions(abortController);\n\n let text = '';\n let usage: LanguageModelV2Usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n let finishReason: LanguageModelV2FinishReason = 'stop';\n let costUsd: number | undefined;\n let durationMs: number | undefined;\n let rawUsage: unknown | undefined;\n const warnings: LanguageModelV2CallWarning[] = 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 try {\n const modeSetting = this.settings.streamingInput ?? 'auto';\n const wantsStream = modeSetting === 'always' || (modeSetting === 'auto' && !!this.settings.canUseTool);\n if (this.settings.canUseTool && this.settings.permissionPromptToolName) {\n throw new Error(\"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 const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, this.settings.resume ?? this.sessionId) : messagesPrompt;\n const response = query({\n prompt: sdkPrompt,\n options: queryOptions,\n });\n\n for await (const message of response) {\n if (message.type === 'assistant') {\n text += message.message.content.map((c: { type: string; text?: string }) => \n c.type === 'text' ? c.text : ''\n ).join('');\n } else if (message.type === 'result') {\n this.setSessionId(message.session_id);\n costUsd = message.total_cost_usd;\n durationMs = message.duration_ms;\n \n if ('usage' in message) {\n rawUsage = message.usage;\n usage = {\n inputTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0),\n outputTokens: message.usage.output_tokens ?? 0,\n totalTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0) + \n (message.usage.output_tokens ?? 0),\n };\n }\n\n finishReason = mapClaudeCodeFinishReason(message.subtype);\n } else if (message.type === 'system' && message.subtype === 'init') {\n this.setSessionId(message.session_id);\n }\n }\n } catch (error: unknown) {\n // Special handling for AbortError to preserve abort signal reason\n if (isAbortError(error)) {\n throw options.abortSignal?.aborted ? options.abortSignal.reason : error;\n }\n \n // Use unified error handler\n throw this.handleClaudeCodeError(error, messagesPrompt);\n } finally {\n if (options.abortSignal && abortListener) {\n options.abortSignal.removeEventListener('abort', abortListener);\n }\n }\n\n // Extract JSON if responseFormat indicates JSON mode\n if (options.responseFormat?.type === 'json' && text) {\n const extracted = extractJson(text);\n const validation = this.validateJsonExtraction(text, extracted);\n \n if (!validation.valid && validation.warning) {\n warnings.push(validation.warning);\n }\n \n text = extracted;\n }\n\n return {\n content: [{ type: 'text', text }],\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 ...(rawUsage !== undefined && { rawUsage: rawUsage as JSONValue }),\n },\n },\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n // Determine mode based on responseFormat\n const mode = options.responseFormat?.type === 'json' \n ? { type: 'object-json' as const } \n : { type: 'regular' as const };\n \n const { messagesPrompt, warnings: messageWarnings } = convertToClaudeCodeMessages(\n options.prompt, \n mode,\n options.responseFormat?.type === 'json' ? options.responseFormat.schema : undefined\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 const queryOptions = this.createQueryOptions(abortController);\n\n const warnings: LanguageModelV2CallWarning[] = 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 stream = new ReadableStream<LanguageModelV2StreamPart>({\n start: async (controller) => {\n try {\n // Emit stream-start with warnings\n controller.enqueue({ type: 'stream-start', warnings });\n \n const modeSetting = this.settings.streamingInput ?? 'auto';\n const wantsStream = modeSetting === 'always' || (modeSetting === 'auto' && !!this.settings.canUseTool);\n if (this.settings.canUseTool && this.settings.permissionPromptToolName) {\n throw new Error(\"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 const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, this.settings.resume ?? this.sessionId) : messagesPrompt;\n const response = query({\n prompt: sdkPrompt,\n options: queryOptions,\n });\n\n let usage: LanguageModelV2Usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n let accumulatedText = '';\n let textPartId: string | undefined;\n\n for await (const message of response) {\n if (message.type === 'assistant') {\n const text = message.message.content\n .map((c: { type: string; text?: string }) => (c.type === 'text' ? c.text : ''))\n .join('');\n \n if (text) {\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 } else if (message.type === 'result') {\n let rawUsage: unknown | undefined;\n if ('usage' in message) {\n rawUsage = message.usage;\n usage = {\n inputTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0),\n outputTokens: message.usage.output_tokens ?? 0,\n totalTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0) + \n (message.usage.output_tokens ?? 0),\n };\n }\n\n const finishReason: LanguageModelV2FinishReason = mapClaudeCodeFinishReason(message.subtype);\n\n // Store session ID in the model instance\n this.setSessionId(message.session_id);\n \n // Check if we need to extract JSON based on responseFormat\n if (options.responseFormat?.type === 'json' && accumulatedText) {\n const extractedJson = extractJson(accumulatedText);\n this.validateJsonExtraction(accumulatedText, extractedJson);\n \n // If validation failed, we should add a warning but we can't modify warnings array in stream\n // So we'll just send the extracted JSON anyway\n // In the future, we could emit a warning stream part if the SDK supports it\n \n // Emit text-start/delta/end for JSON content\n const jsonTextId = generateId();\n controller.enqueue({\n type: 'text-start',\n id: jsonTextId,\n });\n controller.enqueue({\n type: 'text-delta',\n id: jsonTextId,\n delta: extractedJson,\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\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n }\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 && { costUsd: message.total_cost_usd }),\n ...(message.duration_ms !== undefined && { durationMs: message.duration_ms }),\n ...(rawUsage !== undefined && { rawUsage: rawUsage as JSONValue }),\n },\n },\n });\n } else if (message.type === 'system' && message.subtype === 'init') {\n // Store session ID for future use\n this.setSessionId(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 controller.close();\n } catch (error: unknown) {\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);\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,\n request: {\n body: messagesPrompt,\n },\n };\n }\n}\n","import type { ModelMessage } from 'ai';\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 * @param mode - Optional mode for specialized output formats (e.g., JSON generation)\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 * { type: 'regular' }\n * );\n * ```\n * \n * @remarks\n * - Image inputs are not supported and will be ignored with a warning\n * - Tool calls are simplified to \"[Tool calls made]\" notation\n * - In 'object-json' mode, explicit JSON instructions are appended\n */\nexport function convertToClaudeCodeMessages(\n prompt: readonly ModelMessage[],\n mode: { type: 'regular' | 'object-json' | 'object-tool' } = { type: 'regular' },\n jsonSchema?: unknown\n): {\n messagesPrompt: string;\n systemPrompt?: string;\n warnings?: string[];\n} {\n const messages: string[] = [];\n const warnings: string[] = [];\n let systemPrompt: string | undefined;\n\n for (const message of prompt) {\n switch (message.role) {\n case 'system':\n systemPrompt = message.content;\n break;\n \n case 'user':\n if (typeof message.content === 'string') {\n messages.push(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 if (textParts) {\n messages.push(textParts);\n }\n \n // Note: Image parts are not supported by Claude Code SDK\n const imageParts = message.content.filter(part => part.type === 'image');\n if (imageParts.length > 0) {\n warnings.push('Claude Code SDK does not support image inputs. Images will be ignored.');\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 messages.push(`Assistant: ${assistantContent}`);\n break;\n }\n \n case 'tool':\n // Tool results could be included in the conversation\n for (const tool of message.content) {\n const resultText = tool.output.type === 'text' \n ? tool.output.value \n : JSON.stringify(tool.output.value);\n messages.push(`Tool Result (${tool.toolName}): ${resultText}`);\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 return { messagesPrompt: finalPrompt, systemPrompt };\n }\n \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 finalPrompt = finalPrompt + '\\n\\n' + formattedMessages.join('\\n\\n');\n } else {\n finalPrompt = formattedMessages.join('\\n\\n');\n }\n \n // For JSON mode, add explicit instruction to ensure JSON output\n if (mode?.type === 'object-json' && jsonSchema) {\n // Prepend JSON instructions at the very beginning, before any messages\n const schemaStr = JSON.stringify(jsonSchema, null, 2);\n \n finalPrompt = `CRITICAL: You MUST respond with ONLY a JSON object. NO other text, NO explanations, NO questions.\n\nYour response MUST start with { and end with }\n\nThe JSON MUST match this EXACT schema:\n${schemaStr}\n\nNow, based on the following conversation, generate ONLY the JSON object with the exact fields specified above:\n\n${finalPrompt}\n\nRemember: Your ENTIRE response must be ONLY the JSON object, starting with { and ending with }`;\n }\n \n return {\n messagesPrompt: finalPrompt,\n systemPrompt,\n ...(warnings.length > 0 && { warnings }),\n };\n}","/**\n * Extract JSON from Claude's response using a tolerant parser.\n *\n * The function removes common wrappers such as markdown fences or variable\n * declarations and then attempts to parse the remaining text with\n * `jsonc-parser`. If valid JSON (or JSONC) can be parsed, it is returned as a\n * string via `JSON.stringify`. Otherwise the original text is returned.\n *\n * @param text - Raw text which may contain JSON\n * @returns A valid JSON string if extraction succeeds, otherwise the original text\n */\nimport { parse, type ParseError } from 'jsonc-parser';\n\nexport function extractJson(text: string): string {\n let content = text.trim();\n\n // Strip ```json or ``` fences\n const fenceMatch = /```(?:json)?\\s*([\\s\\S]*?)\\s*```/i.exec(content);\n if (fenceMatch) {\n content = fenceMatch[1];\n }\n\n // Strip variable declarations like `const foo =` or `let foo =`\n const varMatch = /^\\s*(?:const|let|var)\\s+\\w+\\s*=\\s*([\\s\\S]*)/i.exec(content);\n if (varMatch) {\n content = varMatch[1];\n // Remove trailing semicolon if present\n if (content.trim().endsWith(';')) {\n content = content.trim().slice(0, -1);\n }\n }\n\n // Find the first opening bracket\n const firstObj = content.indexOf('{');\n const firstArr = content.indexOf('[');\n if (firstObj === -1 && firstArr === -1) {\n return text;\n }\n const start = firstArr === -1 ? firstObj : firstObj === -1 ? firstArr : Math.min(firstObj, firstArr);\n content = content.slice(start);\n\n // Try to parse the entire string with jsonc-parser\n const tryParse = (value: string): string | undefined => {\n const errors: ParseError[] = [];\n try {\n const result = parse(value, errors, { allowTrailingComma: true });\n if (errors.length === 0) {\n return JSON.stringify(result, null, 2);\n }\n } catch {\n // ignore\n }\n return undefined;\n };\n\n const parsed = tryParse(content);\n if (parsed !== undefined) {\n return parsed;\n }\n\n // If parsing the full string failed, use a more efficient approach\n // to find valid JSON boundaries\n const openChar = content[0];\n const closeChar = openChar === '{' ? '}' : ']';\n \n // Find all potential closing positions by tracking nesting depth\n const closingPositions: number[] = [];\n let depth = 0;\n let inString = false;\n let escapeNext = false;\n \n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n \n if (escapeNext) {\n escapeNext = false;\n continue;\n }\n \n if (char === '\\\\') {\n escapeNext = true;\n continue;\n }\n \n if (char === '\"' && !inString) {\n inString = true;\n continue;\n }\n \n if (char === '\"' && inString) {\n inString = false;\n continue;\n }\n \n // Skip content inside strings\n if (inString) continue;\n \n if (char === openChar) {\n depth++;\n } else if (char === closeChar) {\n depth--;\n if (depth === 0) {\n closingPositions.push(i + 1);\n }\n }\n }\n \n // Try parsing at each valid closing position, starting from the end\n for (let i = closingPositions.length - 1; i >= 0; i--) {\n const attempt = tryParse(content.slice(0, closingPositions[i]));\n if (attempt !== undefined) {\n return attempt;\n }\n }\n \n // As a final fallback, try the original character-by-character approach\n // but only for the last 1000 characters to limit performance impact\n const searchStart = Math.max(0, content.length - 1000);\n for (let end = content.length - 1; end > searchStart; end--) {\n const attempt = tryParse(content.slice(0, end));\n if (attempt !== undefined) {\n return attempt;\n }\n }\n\n return text;\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({\n message,\n}: {\n message: string;\n}): LoadAPIKeyError {\n return new LoadAPIKeyError({\n message: 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) 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') 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}","import type { LanguageModelV2FinishReason } from '@ai-sdk/provider';\n\n/**\n * Maps Claude Code SDK result subtypes to AI SDK finish reasons.\n * \n * @param subtype - The result subtype from Claude Code SDK\n * @returns The corresponding AI SDK finish reason\n * \n * @example\n * ```typescript\n * const finishReason = mapClaudeCodeFinishReason('error_max_turns');\n * // Returns: 'length'\n * ```\n * \n * @remarks\n * Mappings:\n * - 'success' -> 'stop' (normal completion)\n * - 'error_max_turns' -> 'length' (hit turn limit)\n * - 'error_during_execution' -> 'error' (execution error)\n * - default -> 'stop' (unknown subtypes treated as normal completion)\n */\nexport function mapClaudeCodeFinishReason(\n subtype?: string\n): LanguageModelV2FinishReason {\n switch (subtype) {\n case 'success':\n return 'stop';\n case 'error_max_turns':\n return 'length';\n case 'error_during_execution':\n return 'error';\n default:\n return 'stop';\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 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.object({\n pathToClaudeCodeExecutable: z.string().optional(),\n customSystemPrompt: z.string().optional(),\n appendSystemPrompt: z.string().optional(),\n maxTurns: z.number().int().min(1).max(100).optional(),\n maxThinkingTokens: z.number().int().positive().max(100000).optional(),\n cwd: z.string().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 ).optional(),\n executable: z.enum(['bun', 'deno', 'node']).optional(),\n executableArgs: z.array(z.string()).optional(),\n permissionMode: z.enum(['default', 'acceptEdits', 'bypassPermissions', 'plan']).optional(),\n permissionPromptToolName: z.string().optional(),\n continue: z.boolean().optional(),\n resume: z.string().optional(),\n allowedTools: z.array(z.string()).optional(),\n disallowedTools: z.array(z.string()).optional(),\n streamingInput: z.enum(['auto', 'always', 'off']).optional(),\n // Hooks and tool-permission callback (permissive validation of shapes)\n canUseTool: z.any().refine((v) => v === undefined || typeof v === 'function', {\n message: 'canUseTool must be a function'\n }).optional(),\n hooks: z.record(z.string(), z.array(z.object({\n matcher: z.string().optional(),\n hooks: z.array(z.any()).nonempty(),\n }))).optional(),\n mcpServers: z.record(z.string(), 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 ])).optional(),\n verbose: z.boolean().optional(),\n logger: z.union([\n z.literal(false),\n loggerFunctionSchema\n ]).optional(),\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'];\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 { errors?: Array<{ path: string[]; message: string }>; issues?: Array<{ path: string[]; message: string }> };\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(`High maxTurns value (${validSettings.maxTurns}) may lead to long-running conversations`);\n }\n \n // Warn about very high thinking tokens\n if (validSettings.maxThinkingTokens && validSettings.maxThinkingTokens > 50000) {\n warnings.push(`Very high maxThinkingTokens (${validSettings.maxThinkingTokens}) may increase response time`);\n }\n \n // Check if both allowedTools and disallowedTools are specified\n if (validSettings.allowedTools && validSettings.disallowedTools) {\n warnings.push('Both allowedTools and disallowedTools are specified. Only allowedTools will be used.');\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 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.\n */\nconst defaultLogger: Logger = {\n warn: (message: string) => console.warn(message),\n error: (message: string) => console.error(message),\n};\n\n/**\n * No-op logger that discards all messages.\n */\nconst noopLogger: Logger = {\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}","import { createSdkMcpServer, tool } from '@anthropic-ai/claude-code';\nimport type { McpSdkServerConfigWithInstance } from '@anthropic-ai/claude-code';\nimport { type ZodRawShape, type ZodObject } from 'zod';\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 */\nexport type MinimalCallToolResult = {\n content: Array<{ type: string; [key: string]: unknown }>;\n isError?: boolean;\n structuredContent?: unknown;\n};\n\nexport function createCustomMcpServer<Tools extends Record<string, {\n description: string;\n inputSchema: ZodObject<ZodRawShape>;\n handler: (args: Record<string, unknown>, extra: unknown) => Promise<MinimalCallToolResult>;\n}>>(config: {\n name: string;\n version?: string;\n tools: Tools;\n}): 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 )\n );\n return createSdkMcpServer({ name: config.name, version: config.version, tools: defs });\n}\n"],"mappings":"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","names":["import_provider","import_provider","tool","tool","import_claude_code","import_claude_code","import_zod"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/claude-code-provider.ts","../src/claude-code-language-model.ts","../src/convert-to-claude-code-messages.ts","../src/extract-json.ts","../src/errors.ts","../src/map-claude-code-finish-reason.ts","../src/validation.ts","../src/logger.ts","../src/mcp-helpers.ts"],"sourcesContent":["/**\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 LanguageModelV1 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 { ClaudeCodeModelId, ClaudeCodeLanguageModelOptions } 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 } from './types.js';\n\n// Convenience re-exports from the SDK for custom tools and hooks\nexport { createSdkMcpServer, tool } from '@anthropic-ai/claude-code';\nexport { createCustomMcpServer } 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 CanUseTool,\n PermissionResult,\n PermissionUpdate,\n PermissionBehavior,\n PermissionRuleValue,\n McpServerConfig,\n McpSdkServerConfigWithInstance,\n} from '@anthropic-ai/claude-code';\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 type { LanguageModelV2, ProviderV2 } 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 ProviderV1.\n * Provides methods to create language models for interacting with Claude via the CLI.\n * \n * @example\n * ```typescript\n * import { claudeCode } from 'ai-sdk-provider-claude-code';\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 ProviderV2 {\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): LanguageModelV2;\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(\n modelId: ClaudeCodeModelId,\n settings?: ClaudeCodeSettings,\n ): LanguageModelV2;\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(\n modelId: ClaudeCodeModelId,\n settings?: ClaudeCodeSettings,\n ): LanguageModelV2;\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(\n options: ClaudeCodeProviderSettings = {},\n): 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 ): LanguageModelV2 => {\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 (\n modelId: ClaudeCodeModelId,\n settings?: ClaudeCodeSettings,\n ) {\n if (new.target) {\n throw new Error(\n 'The Claude Code model function cannot be called with the new keyword.',\n );\n }\n\n return createModel(modelId, settings);\n };\n\n provider.languageModel = createModel;\n provider.chat = createModel; // Alias for languageModel\n\n // Add textEmbeddingModel method that throws NoSuchModelError\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'textEmbeddingModel',\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 'ai-sdk-provider-claude-code';\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();","import type {\n LanguageModelV2,\n LanguageModelV2CallWarning,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n JSONValue,\n} from '@ai-sdk/provider';\nimport { NoSuchModelError, APICallError, LoadAPIKeyError } from '@ai-sdk/provider';\nimport { generateId } from '@ai-sdk/provider-utils';\nimport type { ClaudeCodeSettings, Logger } from './types.js';\nimport { convertToClaudeCodeMessages } from './convert-to-claude-code-messages.js';\nimport { extractJson } from './extract-json.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 } from './logger.js';\n\nimport { query, type Options } from '@anthropic-ai/claude-code';\nimport type { SDKUserMessage } from '@anthropic-ai/claude-code';\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\nfunction toAsyncIterablePrompt(messagesPrompt: string, outputStreamEnded: Promise<unknown>, sessionId?: string): AsyncIterable<SDKUserMessage> {\n const msg: SDKUserMessage = {\n type: 'user',\n message: {\n role: 'user',\n content: [{ type: 'text', text: messagesPrompt }],\n },\n parent_tool_use_id: null,\n session_id: sessionId ?? '',\n };\n return {\n async *[Symbol.asyncIterator]() {\n yield msg;\n await outputStreamEnded;\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', 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 4 Opus model (most capable)\n * - 'sonnet': Claude 4 Sonnet model (balanced performance)\n * - Custom string: Any other model identifier supported by the CLI\n * \n * @example\n * ```typescript\n * const opusModel = claudeCode('opus');\n * const sonnetModel = claudeCode('sonnet');\n * const customModel = claudeCode('claude-3-opus-20240229');\n * ```\n */\nexport type ClaudeCodeModelId = 'opus' | 'sonnet' | (string & {});\n\nconst modelMap: Record<string, string> = {\n 'opus': 'opus',\n 'sonnet': 'sonnet',\n};\n\n/**\n * Language model implementation for Claude Code SDK.\n * This class implements the AI SDK's LanguageModelV1 interface to provide\n * integration with Claude models through the Claude Code SDK.\n * \n * Features:\n * - Supports streaming and non-streaming generation\n * - Handles JSON object generation mode\n * - Manages CLI sessions for conversation continuity\n * - Provides detailed error handling and retry logic\n * \n * Limitations:\n * - Does not support image inputs\n * - Does not support structured outputs (tool 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 */\nexport class ClaudeCodeLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2' as const;\n readonly defaultObjectGenerationMode = 'json' as const;\n readonly supportsImageUrls = false;\n readonly supportedUrls = {};\n readonly supportsStructuredOutputs = false;\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 this.logger = getLogger(this.settings.logger);\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 generateAllWarnings(\n options: Parameters<LanguageModelV2['doGenerate']>[0] | Parameters<LanguageModelV2['doStream']>[0],\n prompt: string\n ): LanguageModelV2CallWarning[] {\n const warnings: LanguageModelV2CallWarning[] = [];\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) 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-setting',\n setting: param as 'temperature' | 'maxTokens' | 'topP' | 'topK' | 'presencePenalty' | 'frequencyPenalty' | 'stopSequences' | 'seed',\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 // 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(abortController: AbortController): Options {\n const opts: Partial<Options> & Record<string, unknown> = {\n model: this.getModel(),\n abortController,\n resume: this.settings.resume ?? this.sessionId,\n pathToClaudeCodeExecutable: this.settings.pathToClaudeCodeExecutable,\n customSystemPrompt: this.settings.customSystemPrompt,\n appendSystemPrompt: this.settings.appendSystemPrompt,\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 mcpServers: this.settings.mcpServers,\n canUseTool: this.settings.canUseTool,\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 return opts as Options;\n }\n\n private handleClaudeCodeError(\n error: unknown,\n messagesPrompt: 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 = (err: unknown): 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 ];\n \n const errorMessage = isErrorWithMessage(error) && error.message \n ? error.message.toLowerCase() \n : '';\n \n const exitCode = isErrorWithCode(error) && typeof error.exitCode === 'number' \n ? error.exitCode \n : undefined;\n \n const isAuthError = authErrorPatterns.some(pattern => errorMessage.includes(pattern)) ||\n exitCode === 401;\n\n if (isAuthError) {\n return createAuthenticationError({\n message: 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' \n ? error.code \n : '';\n \n if (errorCode === 'ETIMEDOUT' || errorMessage.includes('timeout')) {\n return createTimeoutError({\n message: isErrorWithMessage(error) && error.message \n ? error.message \n : '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 = errorCode === 'ENOENT' || \n errorCode === 'ECONNREFUSED' ||\n errorCode === 'ETIMEDOUT' ||\n errorCode === 'ECONNRESET';\n\n return createAPICallError({\n message: isErrorWithMessage(error) && error.message \n ? error.message \n : 'Claude Code SDK error',\n code: errorCode || undefined,\n exitCode: exitCode,\n stderr: isErrorWithCode(error) && typeof error.stderr === 'string' \n ? error.stderr \n : undefined,\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 private validateJsonExtraction(\n originalText: string,\n extractedJson: string\n ): { valid: boolean; warning?: LanguageModelV2CallWarning } {\n // If the extracted JSON is the same as original, extraction likely failed\n if (extractedJson === originalText) {\n return {\n valid: false,\n warning: {\n type: 'other',\n message: 'JSON extraction from model response may be incomplete or modified. The model may not have returned valid JSON.',\n },\n };\n }\n\n // Try to parse the extracted JSON to validate it\n try {\n JSON.parse(extractedJson);\n return { valid: true };\n } catch {\n return {\n valid: false,\n warning: {\n type: 'other',\n message: 'JSON extraction resulted in invalid JSON. The response may be malformed.',\n },\n };\n }\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n // Determine mode based on responseFormat\n const mode = options.responseFormat?.type === 'json' \n ? { type: 'object-json' as const } \n : { type: 'regular' as const };\n \n const { messagesPrompt, warnings: messageWarnings } = convertToClaudeCodeMessages(\n options.prompt, \n mode,\n options.responseFormat?.type === 'json' ? options.responseFormat.schema : undefined\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 const queryOptions = this.createQueryOptions(abortController);\n\n let text = '';\n let usage: LanguageModelV2Usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n let finishReason: LanguageModelV2FinishReason = 'stop';\n let costUsd: number | undefined;\n let durationMs: number | undefined;\n let rawUsage: unknown | undefined;\n const warnings: LanguageModelV2CallWarning[] = 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 let done = () => {};\n const outputStreamEnded = new Promise(resolve => { done = () => resolve(undefined); });\n try {\n const modeSetting = this.settings.streamingInput ?? 'auto';\n const wantsStream = modeSetting === 'always' || (modeSetting === 'auto' && !!this.settings.canUseTool);\n if (this.settings.canUseTool && this.settings.permissionPromptToolName) {\n throw new Error(\"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 // hold input stream open until results\n // see: https://github.com/anthropics/claude-code/issues/4775\n const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, outputStreamEnded, this.settings.resume ?? this.sessionId) : messagesPrompt;\n const response = query({\n prompt: sdkPrompt,\n options: queryOptions,\n });\n\n for await (const message of response) {\n if (message.type === 'assistant') {\n text += message.message.content.map((c: { type: string; text?: string }) => \n 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 \n if ('usage' in message) {\n rawUsage = message.usage;\n usage = {\n inputTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0),\n outputTokens: message.usage.output_tokens ?? 0,\n totalTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0) + \n (message.usage.output_tokens ?? 0),\n };\n }\n\n finishReason = mapClaudeCodeFinishReason(message.subtype);\n } else if (message.type === 'system' && message.subtype === 'init') {\n this.setSessionId(message.session_id);\n }\n }\n } catch (error: unknown) {\n done();\n // Special handling for AbortError to preserve abort signal reason\n if (isAbortError(error)) {\n throw options.abortSignal?.aborted ? options.abortSignal.reason : error;\n }\n \n // Use unified error handler\n throw this.handleClaudeCodeError(error, messagesPrompt);\n } finally {\n if (options.abortSignal && abortListener) {\n options.abortSignal.removeEventListener('abort', abortListener);\n }\n }\n\n // Extract JSON if responseFormat indicates JSON mode\n if (options.responseFormat?.type === 'json' && text) {\n const extracted = extractJson(text);\n const validation = this.validateJsonExtraction(text, extracted);\n \n if (!validation.valid && validation.warning) {\n warnings.push(validation.warning);\n }\n \n text = extracted;\n }\n\n return {\n content: [{ type: 'text', text }],\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 ...(rawUsage !== undefined && { rawUsage: rawUsage as JSONValue }),\n },\n },\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n // Determine mode based on responseFormat\n const mode = options.responseFormat?.type === 'json' \n ? { type: 'object-json' as const } \n : { type: 'regular' as const };\n \n const { messagesPrompt, warnings: messageWarnings } = convertToClaudeCodeMessages(\n options.prompt, \n mode,\n options.responseFormat?.type === 'json' ? options.responseFormat.schema : undefined\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 const queryOptions = this.createQueryOptions(abortController);\n\n const warnings: LanguageModelV2CallWarning[] = 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 stream = new ReadableStream<LanguageModelV2StreamPart>({\n start: async (controller) => {\n let done = () => {};\n const outputStreamEnded = new Promise(resolve => { done = () => resolve(undefined); });\n try {\n // Emit stream-start with warnings\n controller.enqueue({ type: 'stream-start', warnings });\n \n const modeSetting = this.settings.streamingInput ?? 'auto';\n const wantsStream = modeSetting === 'always' || (modeSetting === 'auto' && !!this.settings.canUseTool);\n if (this.settings.canUseTool && this.settings.permissionPromptToolName) {\n throw new Error(\"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 // hold input stream open until results\n // see: https://github.com/anthropics/claude-code/issues/4775\n const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, outputStreamEnded, this.settings.resume ?? this.sessionId) : messagesPrompt;\n const response = query({\n prompt: sdkPrompt,\n options: queryOptions,\n });\n\n let usage: LanguageModelV2Usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n let accumulatedText = '';\n let textPartId: string | undefined;\n\n for await (const message of response) {\n if (message.type === 'assistant') {\n const text = message.message.content\n .map((c: { type: string; text?: string }) => (c.type === 'text' ? c.text : ''))\n .join('');\n \n if (text) {\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 } else if (message.type === 'result') {\n done();\n let rawUsage: unknown | undefined;\n if ('usage' in message) {\n rawUsage = message.usage;\n usage = {\n inputTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0),\n outputTokens: message.usage.output_tokens ?? 0,\n totalTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0) + \n (message.usage.output_tokens ?? 0),\n };\n }\n\n const finishReason: LanguageModelV2FinishReason = mapClaudeCodeFinishReason(message.subtype);\n\n // Store session ID in the model instance\n this.setSessionId(message.session_id);\n \n // Check if we need to extract JSON based on responseFormat\n if (options.responseFormat?.type === 'json' && accumulatedText) {\n const extractedJson = extractJson(accumulatedText);\n this.validateJsonExtraction(accumulatedText, extractedJson);\n \n // If validation failed, we should add a warning but we can't modify warnings array in stream\n // So we'll just send the extracted JSON anyway\n // In the future, we could emit a warning stream part if the SDK supports it\n \n // Emit text-start/delta/end for JSON content\n const jsonTextId = generateId();\n controller.enqueue({\n type: 'text-start',\n id: jsonTextId,\n });\n controller.enqueue({\n type: 'text-delta',\n id: jsonTextId,\n delta: extractedJson,\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\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n }\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 && { costUsd: message.total_cost_usd }),\n ...(message.duration_ms !== undefined && { durationMs: message.duration_ms }),\n ...(rawUsage !== undefined && { rawUsage: rawUsage as JSONValue }),\n },\n },\n });\n } else if (message.type === 'system' && message.subtype === 'init') {\n // Store session ID for future use\n this.setSessionId(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 controller.close();\n } catch (error: unknown) {\n done();\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);\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,\n request: {\n body: messagesPrompt,\n },\n };\n }\n}\n","import type { ModelMessage } from 'ai';\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 * @param mode - Optional mode for specialized output formats (e.g., JSON generation)\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 * { type: 'regular' }\n * );\n * ```\n * \n * @remarks\n * - Image inputs are not supported and will be ignored with a warning\n * - Tool calls are simplified to \"[Tool calls made]\" notation\n * - In 'object-json' mode, explicit JSON instructions are appended\n */\nexport function convertToClaudeCodeMessages(\n prompt: readonly ModelMessage[],\n mode: { type: 'regular' | 'object-json' | 'object-tool' } = { type: 'regular' },\n jsonSchema?: unknown\n): {\n messagesPrompt: string;\n systemPrompt?: string;\n warnings?: string[];\n} {\n const messages: string[] = [];\n const warnings: string[] = [];\n let systemPrompt: string | undefined;\n\n for (const message of prompt) {\n switch (message.role) {\n case 'system':\n systemPrompt = message.content;\n break;\n \n case 'user':\n if (typeof message.content === 'string') {\n messages.push(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 if (textParts) {\n messages.push(textParts);\n }\n \n // Note: Image parts are not supported by Claude Code SDK\n const imageParts = message.content.filter(part => part.type === 'image');\n if (imageParts.length > 0) {\n warnings.push('Claude Code SDK does not support image inputs. Images will be ignored.');\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 messages.push(`Assistant: ${assistantContent}`);\n break;\n }\n \n case 'tool':\n // Tool results could be included in the conversation\n for (const tool of message.content) {\n const resultText = tool.output.type === 'text' \n ? tool.output.value \n : JSON.stringify(tool.output.value);\n messages.push(`Tool Result (${tool.toolName}): ${resultText}`);\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 return { messagesPrompt: finalPrompt, systemPrompt };\n }\n \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 finalPrompt = finalPrompt + '\\n\\n' + formattedMessages.join('\\n\\n');\n } else {\n finalPrompt = formattedMessages.join('\\n\\n');\n }\n \n // For JSON mode, add explicit instruction to ensure JSON output\n if (mode?.type === 'object-json' && jsonSchema) {\n // Prepend JSON instructions at the very beginning, before any messages\n const schemaStr = JSON.stringify(jsonSchema, null, 2);\n \n finalPrompt = `CRITICAL: You MUST respond with ONLY a JSON object. NO other text, NO explanations, NO questions.\n\nYour response MUST start with { and end with }\n\nThe JSON MUST match this EXACT schema:\n${schemaStr}\n\nNow, based on the following conversation, generate ONLY the JSON object with the exact fields specified above:\n\n${finalPrompt}\n\nRemember: Your ENTIRE response must be ONLY the JSON object, starting with { and ending with }`;\n }\n \n return {\n messagesPrompt: finalPrompt,\n systemPrompt,\n ...(warnings.length > 0 && { warnings }),\n };\n}","/**\n * Extract JSON from Claude's response using a tolerant parser.\n *\n * The function removes common wrappers such as markdown fences or variable\n * declarations and then attempts to parse the remaining text with\n * `jsonc-parser`. If valid JSON (or JSONC) can be parsed, it is returned as a\n * string via `JSON.stringify`. Otherwise the original text is returned.\n *\n * @param text - Raw text which may contain JSON\n * @returns A valid JSON string if extraction succeeds, otherwise the original text\n */\nimport { parse, type ParseError } from 'jsonc-parser';\n\nexport function extractJson(text: string): string {\n let content = text.trim();\n\n // Strip ```json or ``` fences\n const fenceMatch = /```(?:json)?\\s*([\\s\\S]*?)\\s*```/i.exec(content);\n if (fenceMatch) {\n content = fenceMatch[1];\n }\n\n // Strip variable declarations like `const foo =` or `let foo =`\n const varMatch = /^\\s*(?:const|let|var)\\s+\\w+\\s*=\\s*([\\s\\S]*)/i.exec(content);\n if (varMatch) {\n content = varMatch[1];\n // Remove trailing semicolon if present\n if (content.trim().endsWith(';')) {\n content = content.trim().slice(0, -1);\n }\n }\n\n // Find the first opening bracket\n const firstObj = content.indexOf('{');\n const firstArr = content.indexOf('[');\n if (firstObj === -1 && firstArr === -1) {\n return text;\n }\n const start = firstArr === -1 ? firstObj : firstObj === -1 ? firstArr : Math.min(firstObj, firstArr);\n content = content.slice(start);\n\n // Try to parse the entire string with jsonc-parser\n const tryParse = (value: string): string | undefined => {\n const errors: ParseError[] = [];\n try {\n const result = parse(value, errors, { allowTrailingComma: true });\n if (errors.length === 0) {\n return JSON.stringify(result, null, 2);\n }\n } catch {\n // ignore\n }\n return undefined;\n };\n\n const parsed = tryParse(content);\n if (parsed !== undefined) {\n return parsed;\n }\n\n // If parsing the full string failed, use a more efficient approach\n // to find valid JSON boundaries\n const openChar = content[0];\n const closeChar = openChar === '{' ? '}' : ']';\n \n // Find all potential closing positions by tracking nesting depth\n const closingPositions: number[] = [];\n let depth = 0;\n let inString = false;\n let escapeNext = false;\n \n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n \n if (escapeNext) {\n escapeNext = false;\n continue;\n }\n \n if (char === '\\\\') {\n escapeNext = true;\n continue;\n }\n \n if (char === '\"' && !inString) {\n inString = true;\n continue;\n }\n \n if (char === '\"' && inString) {\n inString = false;\n continue;\n }\n \n // Skip content inside strings\n if (inString) continue;\n \n if (char === openChar) {\n depth++;\n } else if (char === closeChar) {\n depth--;\n if (depth === 0) {\n closingPositions.push(i + 1);\n }\n }\n }\n \n // Try parsing at each valid closing position, starting from the end\n for (let i = closingPositions.length - 1; i >= 0; i--) {\n const attempt = tryParse(content.slice(0, closingPositions[i]));\n if (attempt !== undefined) {\n return attempt;\n }\n }\n \n // As a final fallback, try the original character-by-character approach\n // but only for the last 1000 characters to limit performance impact\n const searchStart = Math.max(0, content.length - 1000);\n for (let end = content.length - 1; end > searchStart; end--) {\n const attempt = tryParse(content.slice(0, end));\n if (attempt !== undefined) {\n return attempt;\n }\n }\n\n return text;\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({\n message,\n}: {\n message: string;\n}): LoadAPIKeyError {\n return new LoadAPIKeyError({\n message: 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) 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') 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}","import type { LanguageModelV2FinishReason } from '@ai-sdk/provider';\n\n/**\n * Maps Claude Code SDK result subtypes to AI SDK finish reasons.\n * \n * @param subtype - The result subtype from Claude Code SDK\n * @returns The corresponding AI SDK finish reason\n * \n * @example\n * ```typescript\n * const finishReason = mapClaudeCodeFinishReason('error_max_turns');\n * // Returns: 'length'\n * ```\n * \n * @remarks\n * Mappings:\n * - 'success' -> 'stop' (normal completion)\n * - 'error_max_turns' -> 'length' (hit turn limit)\n * - 'error_during_execution' -> 'error' (execution error)\n * - default -> 'stop' (unknown subtypes treated as normal completion)\n */\nexport function mapClaudeCodeFinishReason(\n subtype?: string\n): LanguageModelV2FinishReason {\n switch (subtype) {\n case 'success':\n return 'stop';\n case 'error_max_turns':\n return 'length';\n case 'error_during_execution':\n return 'error';\n default:\n return 'stop';\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 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.object({\n pathToClaudeCodeExecutable: z.string().optional(),\n customSystemPrompt: z.string().optional(),\n appendSystemPrompt: z.string().optional(),\n maxTurns: z.number().int().min(1).max(100).optional(),\n maxThinkingTokens: z.number().int().positive().max(100000).optional(),\n cwd: z.string().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 ).optional(),\n executable: z.enum(['bun', 'deno', 'node']).optional(),\n executableArgs: z.array(z.string()).optional(),\n permissionMode: z.enum(['default', 'acceptEdits', 'bypassPermissions', 'plan']).optional(),\n permissionPromptToolName: z.string().optional(),\n continue: z.boolean().optional(),\n resume: z.string().optional(),\n allowedTools: z.array(z.string()).optional(),\n disallowedTools: z.array(z.string()).optional(),\n streamingInput: z.enum(['auto', 'always', 'off']).optional(),\n // Hooks and tool-permission callback (permissive validation of shapes)\n canUseTool: z.any().refine((v) => v === undefined || typeof v === 'function', {\n message: 'canUseTool must be a function'\n }).optional(),\n hooks: z.record(z.string(), z.array(z.object({\n matcher: z.string().optional(),\n hooks: z.array(z.any()).nonempty(),\n }))).optional(),\n mcpServers: z.record(z.string(), 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 ])).optional(),\n verbose: z.boolean().optional(),\n logger: z.union([\n z.literal(false),\n loggerFunctionSchema\n ]).optional(),\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'];\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 { errors?: Array<{ path: string[]; message: string }>; issues?: Array<{ path: string[]; message: string }> };\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(`High maxTurns value (${validSettings.maxTurns}) may lead to long-running conversations`);\n }\n \n // Warn about very high thinking tokens\n if (validSettings.maxThinkingTokens && validSettings.maxThinkingTokens > 50000) {\n warnings.push(`Very high maxThinkingTokens (${validSettings.maxThinkingTokens}) may increase response time`);\n }\n \n // Check if both allowedTools and disallowedTools are specified\n if (validSettings.allowedTools && validSettings.disallowedTools) {\n warnings.push('Both allowedTools and disallowedTools are specified. Only allowedTools will be used.');\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 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.\n */\nconst defaultLogger: Logger = {\n warn: (message: string) => console.warn(message),\n error: (message: string) => console.error(message),\n};\n\n/**\n * No-op logger that discards all messages.\n */\nconst noopLogger: Logger = {\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}","import { createSdkMcpServer, tool } from '@anthropic-ai/claude-code';\nimport type { McpSdkServerConfigWithInstance } from '@anthropic-ai/claude-code';\nimport { type ZodRawShape, type ZodObject } from 'zod';\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 */\nexport type MinimalCallToolResult = {\n content: Array<{ type: string; [key: string]: unknown }>;\n isError?: boolean;\n structuredContent?: unknown;\n};\n\nexport function createCustomMcpServer<Tools extends Record<string, {\n description: string;\n inputSchema: ZodObject<ZodRawShape>;\n handler: (args: Record<string, unknown>, extra: unknown) => Promise<MinimalCallToolResult>;\n}>>(config: {\n name: string;\n version?: string;\n tools: Tools;\n}): 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 )\n );\n return createSdkMcpServer({ name: config.name, version: config.version, tools: defs });\n}\n"],"mappings":"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","names":["import_provider","import_provider","tool","tool","import_claude_code","import_claude_code","import_zod"]}
|
package/dist/index.js
CHANGED
|
@@ -437,7 +437,7 @@ function isAbortError(err) {
|
|
|
437
437
|
}
|
|
438
438
|
return false;
|
|
439
439
|
}
|
|
440
|
-
function toAsyncIterablePrompt(messagesPrompt, sessionId) {
|
|
440
|
+
function toAsyncIterablePrompt(messagesPrompt, outputStreamEnded, sessionId) {
|
|
441
441
|
const msg = {
|
|
442
442
|
type: "user",
|
|
443
443
|
message: {
|
|
@@ -450,6 +450,7 @@ function toAsyncIterablePrompt(messagesPrompt, sessionId) {
|
|
|
450
450
|
return {
|
|
451
451
|
async *[Symbol.asyncIterator]() {
|
|
452
452
|
yield msg;
|
|
453
|
+
await outputStreamEnded;
|
|
453
454
|
}
|
|
454
455
|
};
|
|
455
456
|
}
|
|
@@ -664,13 +665,18 @@ var ClaudeCodeLanguageModel = class {
|
|
|
664
665
|
});
|
|
665
666
|
});
|
|
666
667
|
}
|
|
668
|
+
let done = () => {
|
|
669
|
+
};
|
|
670
|
+
const outputStreamEnded = new Promise((resolve) => {
|
|
671
|
+
done = () => resolve(void 0);
|
|
672
|
+
});
|
|
667
673
|
try {
|
|
668
674
|
const modeSetting = this.settings.streamingInput ?? "auto";
|
|
669
675
|
const wantsStream = modeSetting === "always" || modeSetting === "auto" && !!this.settings.canUseTool;
|
|
670
676
|
if (this.settings.canUseTool && this.settings.permissionPromptToolName) {
|
|
671
677
|
throw new Error("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.");
|
|
672
678
|
}
|
|
673
|
-
const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, this.settings.resume ?? this.sessionId) : messagesPrompt;
|
|
679
|
+
const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, outputStreamEnded, this.settings.resume ?? this.sessionId) : messagesPrompt;
|
|
674
680
|
const response = query({
|
|
675
681
|
prompt: sdkPrompt,
|
|
676
682
|
options: queryOptions
|
|
@@ -681,6 +687,7 @@ var ClaudeCodeLanguageModel = class {
|
|
|
681
687
|
(c) => c.type === "text" ? c.text : ""
|
|
682
688
|
).join("");
|
|
683
689
|
} else if (message.type === "result") {
|
|
690
|
+
done();
|
|
684
691
|
this.setSessionId(message.session_id);
|
|
685
692
|
costUsd = message.total_cost_usd;
|
|
686
693
|
durationMs = message.duration_ms;
|
|
@@ -698,6 +705,7 @@ var ClaudeCodeLanguageModel = class {
|
|
|
698
705
|
}
|
|
699
706
|
}
|
|
700
707
|
} catch (error) {
|
|
708
|
+
done();
|
|
701
709
|
if (isAbortError(error)) {
|
|
702
710
|
throw options.abortSignal?.aborted ? options.abortSignal.reason : error;
|
|
703
711
|
}
|
|
@@ -765,6 +773,11 @@ var ClaudeCodeLanguageModel = class {
|
|
|
765
773
|
}
|
|
766
774
|
const stream = new ReadableStream({
|
|
767
775
|
start: async (controller) => {
|
|
776
|
+
let done = () => {
|
|
777
|
+
};
|
|
778
|
+
const outputStreamEnded = new Promise((resolve) => {
|
|
779
|
+
done = () => resolve(void 0);
|
|
780
|
+
});
|
|
768
781
|
try {
|
|
769
782
|
controller.enqueue({ type: "stream-start", warnings });
|
|
770
783
|
const modeSetting = this.settings.streamingInput ?? "auto";
|
|
@@ -772,7 +785,7 @@ var ClaudeCodeLanguageModel = class {
|
|
|
772
785
|
if (this.settings.canUseTool && this.settings.permissionPromptToolName) {
|
|
773
786
|
throw new Error("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.");
|
|
774
787
|
}
|
|
775
|
-
const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, this.settings.resume ?? this.sessionId) : messagesPrompt;
|
|
788
|
+
const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, outputStreamEnded, this.settings.resume ?? this.sessionId) : messagesPrompt;
|
|
776
789
|
const response = query({
|
|
777
790
|
prompt: sdkPrompt,
|
|
778
791
|
options: queryOptions
|
|
@@ -801,6 +814,7 @@ var ClaudeCodeLanguageModel = class {
|
|
|
801
814
|
}
|
|
802
815
|
}
|
|
803
816
|
} else if (message.type === "result") {
|
|
817
|
+
done();
|
|
804
818
|
let rawUsage;
|
|
805
819
|
if ("usage" in message) {
|
|
806
820
|
rawUsage = message.usage;
|
|
@@ -860,6 +874,7 @@ var ClaudeCodeLanguageModel = class {
|
|
|
860
874
|
}
|
|
861
875
|
controller.close();
|
|
862
876
|
} catch (error) {
|
|
877
|
+
done();
|
|
863
878
|
let errorToEmit;
|
|
864
879
|
if (isAbortError(error)) {
|
|
865
880
|
errorToEmit = options.abortSignal?.aborted ? options.abortSignal.reason : error;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/claude-code-provider.ts","../src/claude-code-language-model.ts","../src/convert-to-claude-code-messages.ts","../src/extract-json.ts","../src/errors.ts","../src/map-claude-code-finish-reason.ts","../src/validation.ts","../src/logger.ts","../src/index.ts","../src/mcp-helpers.ts"],"sourcesContent":["import type { LanguageModelV2, ProviderV2 } 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 ProviderV1.\n * Provides methods to create language models for interacting with Claude via the CLI.\n * \n * @example\n * ```typescript\n * import { claudeCode } from 'ai-sdk-provider-claude-code';\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 ProviderV2 {\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): LanguageModelV2;\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(\n modelId: ClaudeCodeModelId,\n settings?: ClaudeCodeSettings,\n ): LanguageModelV2;\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(\n modelId: ClaudeCodeModelId,\n settings?: ClaudeCodeSettings,\n ): LanguageModelV2;\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(\n options: ClaudeCodeProviderSettings = {},\n): 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 ): LanguageModelV2 => {\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 (\n modelId: ClaudeCodeModelId,\n settings?: ClaudeCodeSettings,\n ) {\n if (new.target) {\n throw new Error(\n 'The Claude Code model function cannot be called with the new keyword.',\n );\n }\n\n return createModel(modelId, settings);\n };\n\n provider.languageModel = createModel;\n provider.chat = createModel; // Alias for languageModel\n\n // Add textEmbeddingModel method that throws NoSuchModelError\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'textEmbeddingModel',\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 'ai-sdk-provider-claude-code';\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();","import type {\n LanguageModelV2,\n LanguageModelV2CallWarning,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n JSONValue,\n} from '@ai-sdk/provider';\nimport { NoSuchModelError, APICallError, LoadAPIKeyError } from '@ai-sdk/provider';\nimport { generateId } from '@ai-sdk/provider-utils';\nimport type { ClaudeCodeSettings, Logger } from './types.js';\nimport { convertToClaudeCodeMessages } from './convert-to-claude-code-messages.js';\nimport { extractJson } from './extract-json.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 } from './logger.js';\n\nimport { query, type Options } from '@anthropic-ai/claude-code';\nimport type { SDKUserMessage } from '@anthropic-ai/claude-code';\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\nfunction toAsyncIterablePrompt(messagesPrompt: string, sessionId?: string): AsyncIterable<SDKUserMessage> {\n const msg: SDKUserMessage = {\n type: 'user',\n message: {\n role: 'user',\n content: [{ type: 'text', text: messagesPrompt }],\n },\n parent_tool_use_id: null,\n session_id: sessionId ?? '',\n };\n return {\n async *[Symbol.asyncIterator]() {\n yield msg;\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', 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 4 Opus model (most capable)\n * - 'sonnet': Claude 4 Sonnet model (balanced performance)\n * - Custom string: Any other model identifier supported by the CLI\n * \n * @example\n * ```typescript\n * const opusModel = claudeCode('opus');\n * const sonnetModel = claudeCode('sonnet');\n * const customModel = claudeCode('claude-3-opus-20240229');\n * ```\n */\nexport type ClaudeCodeModelId = 'opus' | 'sonnet' | (string & {});\n\nconst modelMap: Record<string, string> = {\n 'opus': 'opus',\n 'sonnet': 'sonnet',\n};\n\n/**\n * Language model implementation for Claude Code SDK.\n * This class implements the AI SDK's LanguageModelV1 interface to provide\n * integration with Claude models through the Claude Code SDK.\n * \n * Features:\n * - Supports streaming and non-streaming generation\n * - Handles JSON object generation mode\n * - Manages CLI sessions for conversation continuity\n * - Provides detailed error handling and retry logic\n * \n * Limitations:\n * - Does not support image inputs\n * - Does not support structured outputs (tool 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 */\nexport class ClaudeCodeLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2' as const;\n readonly defaultObjectGenerationMode = 'json' as const;\n readonly supportsImageUrls = false;\n readonly supportedUrls = {};\n readonly supportsStructuredOutputs = false;\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 this.logger = getLogger(this.settings.logger);\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 generateAllWarnings(\n options: Parameters<LanguageModelV2['doGenerate']>[0] | Parameters<LanguageModelV2['doStream']>[0],\n prompt: string\n ): LanguageModelV2CallWarning[] {\n const warnings: LanguageModelV2CallWarning[] = [];\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) 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-setting',\n setting: param as 'temperature' | 'maxTokens' | 'topP' | 'topK' | 'presencePenalty' | 'frequencyPenalty' | 'stopSequences' | 'seed',\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 // 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(abortController: AbortController): Options {\n const opts: Partial<Options> & Record<string, unknown> = {\n model: this.getModel(),\n abortController,\n resume: this.settings.resume ?? this.sessionId,\n pathToClaudeCodeExecutable: this.settings.pathToClaudeCodeExecutable,\n customSystemPrompt: this.settings.customSystemPrompt,\n appendSystemPrompt: this.settings.appendSystemPrompt,\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 mcpServers: this.settings.mcpServers,\n canUseTool: this.settings.canUseTool,\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 return opts as Options;\n }\n\n private handleClaudeCodeError(\n error: unknown,\n messagesPrompt: 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 = (err: unknown): 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 ];\n \n const errorMessage = isErrorWithMessage(error) && error.message \n ? error.message.toLowerCase() \n : '';\n \n const exitCode = isErrorWithCode(error) && typeof error.exitCode === 'number' \n ? error.exitCode \n : undefined;\n \n const isAuthError = authErrorPatterns.some(pattern => errorMessage.includes(pattern)) ||\n exitCode === 401;\n\n if (isAuthError) {\n return createAuthenticationError({\n message: 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' \n ? error.code \n : '';\n \n if (errorCode === 'ETIMEDOUT' || errorMessage.includes('timeout')) {\n return createTimeoutError({\n message: isErrorWithMessage(error) && error.message \n ? error.message \n : '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 = errorCode === 'ENOENT' || \n errorCode === 'ECONNREFUSED' ||\n errorCode === 'ETIMEDOUT' ||\n errorCode === 'ECONNRESET';\n\n return createAPICallError({\n message: isErrorWithMessage(error) && error.message \n ? error.message \n : 'Claude Code SDK error',\n code: errorCode || undefined,\n exitCode: exitCode,\n stderr: isErrorWithCode(error) && typeof error.stderr === 'string' \n ? error.stderr \n : undefined,\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 private validateJsonExtraction(\n originalText: string,\n extractedJson: string\n ): { valid: boolean; warning?: LanguageModelV2CallWarning } {\n // If the extracted JSON is the same as original, extraction likely failed\n if (extractedJson === originalText) {\n return {\n valid: false,\n warning: {\n type: 'other',\n message: 'JSON extraction from model response may be incomplete or modified. The model may not have returned valid JSON.',\n },\n };\n }\n\n // Try to parse the extracted JSON to validate it\n try {\n JSON.parse(extractedJson);\n return { valid: true };\n } catch {\n return {\n valid: false,\n warning: {\n type: 'other',\n message: 'JSON extraction resulted in invalid JSON. The response may be malformed.',\n },\n };\n }\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n // Determine mode based on responseFormat\n const mode = options.responseFormat?.type === 'json' \n ? { type: 'object-json' as const } \n : { type: 'regular' as const };\n \n const { messagesPrompt, warnings: messageWarnings } = convertToClaudeCodeMessages(\n options.prompt, \n mode,\n options.responseFormat?.type === 'json' ? options.responseFormat.schema : undefined\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 const queryOptions = this.createQueryOptions(abortController);\n\n let text = '';\n let usage: LanguageModelV2Usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n let finishReason: LanguageModelV2FinishReason = 'stop';\n let costUsd: number | undefined;\n let durationMs: number | undefined;\n let rawUsage: unknown | undefined;\n const warnings: LanguageModelV2CallWarning[] = 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 try {\n const modeSetting = this.settings.streamingInput ?? 'auto';\n const wantsStream = modeSetting === 'always' || (modeSetting === 'auto' && !!this.settings.canUseTool);\n if (this.settings.canUseTool && this.settings.permissionPromptToolName) {\n throw new Error(\"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 const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, this.settings.resume ?? this.sessionId) : messagesPrompt;\n const response = query({\n prompt: sdkPrompt,\n options: queryOptions,\n });\n\n for await (const message of response) {\n if (message.type === 'assistant') {\n text += message.message.content.map((c: { type: string; text?: string }) => \n c.type === 'text' ? c.text : ''\n ).join('');\n } else if (message.type === 'result') {\n this.setSessionId(message.session_id);\n costUsd = message.total_cost_usd;\n durationMs = message.duration_ms;\n \n if ('usage' in message) {\n rawUsage = message.usage;\n usage = {\n inputTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0),\n outputTokens: message.usage.output_tokens ?? 0,\n totalTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0) + \n (message.usage.output_tokens ?? 0),\n };\n }\n\n finishReason = mapClaudeCodeFinishReason(message.subtype);\n } else if (message.type === 'system' && message.subtype === 'init') {\n this.setSessionId(message.session_id);\n }\n }\n } catch (error: unknown) {\n // Special handling for AbortError to preserve abort signal reason\n if (isAbortError(error)) {\n throw options.abortSignal?.aborted ? options.abortSignal.reason : error;\n }\n \n // Use unified error handler\n throw this.handleClaudeCodeError(error, messagesPrompt);\n } finally {\n if (options.abortSignal && abortListener) {\n options.abortSignal.removeEventListener('abort', abortListener);\n }\n }\n\n // Extract JSON if responseFormat indicates JSON mode\n if (options.responseFormat?.type === 'json' && text) {\n const extracted = extractJson(text);\n const validation = this.validateJsonExtraction(text, extracted);\n \n if (!validation.valid && validation.warning) {\n warnings.push(validation.warning);\n }\n \n text = extracted;\n }\n\n return {\n content: [{ type: 'text', text }],\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 ...(rawUsage !== undefined && { rawUsage: rawUsage as JSONValue }),\n },\n },\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n // Determine mode based on responseFormat\n const mode = options.responseFormat?.type === 'json' \n ? { type: 'object-json' as const } \n : { type: 'regular' as const };\n \n const { messagesPrompt, warnings: messageWarnings } = convertToClaudeCodeMessages(\n options.prompt, \n mode,\n options.responseFormat?.type === 'json' ? options.responseFormat.schema : undefined\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 const queryOptions = this.createQueryOptions(abortController);\n\n const warnings: LanguageModelV2CallWarning[] = 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 stream = new ReadableStream<LanguageModelV2StreamPart>({\n start: async (controller) => {\n try {\n // Emit stream-start with warnings\n controller.enqueue({ type: 'stream-start', warnings });\n \n const modeSetting = this.settings.streamingInput ?? 'auto';\n const wantsStream = modeSetting === 'always' || (modeSetting === 'auto' && !!this.settings.canUseTool);\n if (this.settings.canUseTool && this.settings.permissionPromptToolName) {\n throw new Error(\"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 const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, this.settings.resume ?? this.sessionId) : messagesPrompt;\n const response = query({\n prompt: sdkPrompt,\n options: queryOptions,\n });\n\n let usage: LanguageModelV2Usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n let accumulatedText = '';\n let textPartId: string | undefined;\n\n for await (const message of response) {\n if (message.type === 'assistant') {\n const text = message.message.content\n .map((c: { type: string; text?: string }) => (c.type === 'text' ? c.text : ''))\n .join('');\n \n if (text) {\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 } else if (message.type === 'result') {\n let rawUsage: unknown | undefined;\n if ('usage' in message) {\n rawUsage = message.usage;\n usage = {\n inputTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0),\n outputTokens: message.usage.output_tokens ?? 0,\n totalTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0) + \n (message.usage.output_tokens ?? 0),\n };\n }\n\n const finishReason: LanguageModelV2FinishReason = mapClaudeCodeFinishReason(message.subtype);\n\n // Store session ID in the model instance\n this.setSessionId(message.session_id);\n \n // Check if we need to extract JSON based on responseFormat\n if (options.responseFormat?.type === 'json' && accumulatedText) {\n const extractedJson = extractJson(accumulatedText);\n this.validateJsonExtraction(accumulatedText, extractedJson);\n \n // If validation failed, we should add a warning but we can't modify warnings array in stream\n // So we'll just send the extracted JSON anyway\n // In the future, we could emit a warning stream part if the SDK supports it\n \n // Emit text-start/delta/end for JSON content\n const jsonTextId = generateId();\n controller.enqueue({\n type: 'text-start',\n id: jsonTextId,\n });\n controller.enqueue({\n type: 'text-delta',\n id: jsonTextId,\n delta: extractedJson,\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\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n }\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 && { costUsd: message.total_cost_usd }),\n ...(message.duration_ms !== undefined && { durationMs: message.duration_ms }),\n ...(rawUsage !== undefined && { rawUsage: rawUsage as JSONValue }),\n },\n },\n });\n } else if (message.type === 'system' && message.subtype === 'init') {\n // Store session ID for future use\n this.setSessionId(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 controller.close();\n } catch (error: unknown) {\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);\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,\n request: {\n body: messagesPrompt,\n },\n };\n }\n}\n","import type { ModelMessage } from 'ai';\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 * @param mode - Optional mode for specialized output formats (e.g., JSON generation)\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 * { type: 'regular' }\n * );\n * ```\n * \n * @remarks\n * - Image inputs are not supported and will be ignored with a warning\n * - Tool calls are simplified to \"[Tool calls made]\" notation\n * - In 'object-json' mode, explicit JSON instructions are appended\n */\nexport function convertToClaudeCodeMessages(\n prompt: readonly ModelMessage[],\n mode: { type: 'regular' | 'object-json' | 'object-tool' } = { type: 'regular' },\n jsonSchema?: unknown\n): {\n messagesPrompt: string;\n systemPrompt?: string;\n warnings?: string[];\n} {\n const messages: string[] = [];\n const warnings: string[] = [];\n let systemPrompt: string | undefined;\n\n for (const message of prompt) {\n switch (message.role) {\n case 'system':\n systemPrompt = message.content;\n break;\n \n case 'user':\n if (typeof message.content === 'string') {\n messages.push(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 if (textParts) {\n messages.push(textParts);\n }\n \n // Note: Image parts are not supported by Claude Code SDK\n const imageParts = message.content.filter(part => part.type === 'image');\n if (imageParts.length > 0) {\n warnings.push('Claude Code SDK does not support image inputs. Images will be ignored.');\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 messages.push(`Assistant: ${assistantContent}`);\n break;\n }\n \n case 'tool':\n // Tool results could be included in the conversation\n for (const tool of message.content) {\n const resultText = tool.output.type === 'text' \n ? tool.output.value \n : JSON.stringify(tool.output.value);\n messages.push(`Tool Result (${tool.toolName}): ${resultText}`);\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 return { messagesPrompt: finalPrompt, systemPrompt };\n }\n \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 finalPrompt = finalPrompt + '\\n\\n' + formattedMessages.join('\\n\\n');\n } else {\n finalPrompt = formattedMessages.join('\\n\\n');\n }\n \n // For JSON mode, add explicit instruction to ensure JSON output\n if (mode?.type === 'object-json' && jsonSchema) {\n // Prepend JSON instructions at the very beginning, before any messages\n const schemaStr = JSON.stringify(jsonSchema, null, 2);\n \n finalPrompt = `CRITICAL: You MUST respond with ONLY a JSON object. NO other text, NO explanations, NO questions.\n\nYour response MUST start with { and end with }\n\nThe JSON MUST match this EXACT schema:\n${schemaStr}\n\nNow, based on the following conversation, generate ONLY the JSON object with the exact fields specified above:\n\n${finalPrompt}\n\nRemember: Your ENTIRE response must be ONLY the JSON object, starting with { and ending with }`;\n }\n \n return {\n messagesPrompt: finalPrompt,\n systemPrompt,\n ...(warnings.length > 0 && { warnings }),\n };\n}","/**\n * Extract JSON from Claude's response using a tolerant parser.\n *\n * The function removes common wrappers such as markdown fences or variable\n * declarations and then attempts to parse the remaining text with\n * `jsonc-parser`. If valid JSON (or JSONC) can be parsed, it is returned as a\n * string via `JSON.stringify`. Otherwise the original text is returned.\n *\n * @param text - Raw text which may contain JSON\n * @returns A valid JSON string if extraction succeeds, otherwise the original text\n */\nimport { parse, type ParseError } from 'jsonc-parser';\n\nexport function extractJson(text: string): string {\n let content = text.trim();\n\n // Strip ```json or ``` fences\n const fenceMatch = /```(?:json)?\\s*([\\s\\S]*?)\\s*```/i.exec(content);\n if (fenceMatch) {\n content = fenceMatch[1];\n }\n\n // Strip variable declarations like `const foo =` or `let foo =`\n const varMatch = /^\\s*(?:const|let|var)\\s+\\w+\\s*=\\s*([\\s\\S]*)/i.exec(content);\n if (varMatch) {\n content = varMatch[1];\n // Remove trailing semicolon if present\n if (content.trim().endsWith(';')) {\n content = content.trim().slice(0, -1);\n }\n }\n\n // Find the first opening bracket\n const firstObj = content.indexOf('{');\n const firstArr = content.indexOf('[');\n if (firstObj === -1 && firstArr === -1) {\n return text;\n }\n const start = firstArr === -1 ? firstObj : firstObj === -1 ? firstArr : Math.min(firstObj, firstArr);\n content = content.slice(start);\n\n // Try to parse the entire string with jsonc-parser\n const tryParse = (value: string): string | undefined => {\n const errors: ParseError[] = [];\n try {\n const result = parse(value, errors, { allowTrailingComma: true });\n if (errors.length === 0) {\n return JSON.stringify(result, null, 2);\n }\n } catch {\n // ignore\n }\n return undefined;\n };\n\n const parsed = tryParse(content);\n if (parsed !== undefined) {\n return parsed;\n }\n\n // If parsing the full string failed, use a more efficient approach\n // to find valid JSON boundaries\n const openChar = content[0];\n const closeChar = openChar === '{' ? '}' : ']';\n \n // Find all potential closing positions by tracking nesting depth\n const closingPositions: number[] = [];\n let depth = 0;\n let inString = false;\n let escapeNext = false;\n \n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n \n if (escapeNext) {\n escapeNext = false;\n continue;\n }\n \n if (char === '\\\\') {\n escapeNext = true;\n continue;\n }\n \n if (char === '\"' && !inString) {\n inString = true;\n continue;\n }\n \n if (char === '\"' && inString) {\n inString = false;\n continue;\n }\n \n // Skip content inside strings\n if (inString) continue;\n \n if (char === openChar) {\n depth++;\n } else if (char === closeChar) {\n depth--;\n if (depth === 0) {\n closingPositions.push(i + 1);\n }\n }\n }\n \n // Try parsing at each valid closing position, starting from the end\n for (let i = closingPositions.length - 1; i >= 0; i--) {\n const attempt = tryParse(content.slice(0, closingPositions[i]));\n if (attempt !== undefined) {\n return attempt;\n }\n }\n \n // As a final fallback, try the original character-by-character approach\n // but only for the last 1000 characters to limit performance impact\n const searchStart = Math.max(0, content.length - 1000);\n for (let end = content.length - 1; end > searchStart; end--) {\n const attempt = tryParse(content.slice(0, end));\n if (attempt !== undefined) {\n return attempt;\n }\n }\n\n return text;\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({\n message,\n}: {\n message: string;\n}): LoadAPIKeyError {\n return new LoadAPIKeyError({\n message: 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) 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') 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}","import type { LanguageModelV2FinishReason } from '@ai-sdk/provider';\n\n/**\n * Maps Claude Code SDK result subtypes to AI SDK finish reasons.\n * \n * @param subtype - The result subtype from Claude Code SDK\n * @returns The corresponding AI SDK finish reason\n * \n * @example\n * ```typescript\n * const finishReason = mapClaudeCodeFinishReason('error_max_turns');\n * // Returns: 'length'\n * ```\n * \n * @remarks\n * Mappings:\n * - 'success' -> 'stop' (normal completion)\n * - 'error_max_turns' -> 'length' (hit turn limit)\n * - 'error_during_execution' -> 'error' (execution error)\n * - default -> 'stop' (unknown subtypes treated as normal completion)\n */\nexport function mapClaudeCodeFinishReason(\n subtype?: string\n): LanguageModelV2FinishReason {\n switch (subtype) {\n case 'success':\n return 'stop';\n case 'error_max_turns':\n return 'length';\n case 'error_during_execution':\n return 'error';\n default:\n return 'stop';\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 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.object({\n pathToClaudeCodeExecutable: z.string().optional(),\n customSystemPrompt: z.string().optional(),\n appendSystemPrompt: z.string().optional(),\n maxTurns: z.number().int().min(1).max(100).optional(),\n maxThinkingTokens: z.number().int().positive().max(100000).optional(),\n cwd: z.string().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 ).optional(),\n executable: z.enum(['bun', 'deno', 'node']).optional(),\n executableArgs: z.array(z.string()).optional(),\n permissionMode: z.enum(['default', 'acceptEdits', 'bypassPermissions', 'plan']).optional(),\n permissionPromptToolName: z.string().optional(),\n continue: z.boolean().optional(),\n resume: z.string().optional(),\n allowedTools: z.array(z.string()).optional(),\n disallowedTools: z.array(z.string()).optional(),\n streamingInput: z.enum(['auto', 'always', 'off']).optional(),\n // Hooks and tool-permission callback (permissive validation of shapes)\n canUseTool: z.any().refine((v) => v === undefined || typeof v === 'function', {\n message: 'canUseTool must be a function'\n }).optional(),\n hooks: z.record(z.string(), z.array(z.object({\n matcher: z.string().optional(),\n hooks: z.array(z.any()).nonempty(),\n }))).optional(),\n mcpServers: z.record(z.string(), 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 ])).optional(),\n verbose: z.boolean().optional(),\n logger: z.union([\n z.literal(false),\n loggerFunctionSchema\n ]).optional(),\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'];\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 { errors?: Array<{ path: string[]; message: string }>; issues?: Array<{ path: string[]; message: string }> };\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(`High maxTurns value (${validSettings.maxTurns}) may lead to long-running conversations`);\n }\n \n // Warn about very high thinking tokens\n if (validSettings.maxThinkingTokens && validSettings.maxThinkingTokens > 50000) {\n warnings.push(`Very high maxThinkingTokens (${validSettings.maxThinkingTokens}) may increase response time`);\n }\n \n // Check if both allowedTools and disallowedTools are specified\n if (validSettings.allowedTools && validSettings.disallowedTools) {\n warnings.push('Both allowedTools and disallowedTools are specified. Only allowedTools will be used.');\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 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.\n */\nconst defaultLogger: Logger = {\n warn: (message: string) => console.warn(message),\n error: (message: string) => console.error(message),\n};\n\n/**\n * No-op logger that discards all messages.\n */\nconst noopLogger: Logger = {\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 * 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 LanguageModelV1 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 { ClaudeCodeModelId, ClaudeCodeLanguageModelOptions } 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 } from './types.js';\n\n// Convenience re-exports from the SDK for custom tools and hooks\nexport { createSdkMcpServer, tool } from '@anthropic-ai/claude-code';\nexport { createCustomMcpServer } 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 CanUseTool,\n PermissionResult,\n PermissionUpdate,\n PermissionBehavior,\n PermissionRuleValue,\n McpServerConfig,\n McpSdkServerConfigWithInstance,\n} from '@anthropic-ai/claude-code';\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-code';\nimport type { McpSdkServerConfigWithInstance } from '@anthropic-ai/claude-code';\nimport { type ZodRawShape, type ZodObject } from 'zod';\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 */\nexport type MinimalCallToolResult = {\n content: Array<{ type: string; [key: string]: unknown }>;\n isError?: boolean;\n structuredContent?: unknown;\n};\n\nexport function createCustomMcpServer<Tools extends Record<string, {\n description: string;\n inputSchema: ZodObject<ZodRawShape>;\n handler: (args: Record<string, unknown>, extra: unknown) => Promise<MinimalCallToolResult>;\n}>>(config: {\n name: string;\n version?: string;\n tools: Tools;\n}): 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 )\n );\n return createSdkMcpServer({ name: config.name, version: config.version, tools: defs });\n}\n"],"mappings":"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","names":["NoSuchModelError","tool","tool","NoSuchModelError","createSdkMcpServer","tool"]}
|
|
1
|
+
{"version":3,"sources":["../src/claude-code-provider.ts","../src/claude-code-language-model.ts","../src/convert-to-claude-code-messages.ts","../src/extract-json.ts","../src/errors.ts","../src/map-claude-code-finish-reason.ts","../src/validation.ts","../src/logger.ts","../src/index.ts","../src/mcp-helpers.ts"],"sourcesContent":["import type { LanguageModelV2, ProviderV2 } 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 ProviderV1.\n * Provides methods to create language models for interacting with Claude via the CLI.\n * \n * @example\n * ```typescript\n * import { claudeCode } from 'ai-sdk-provider-claude-code';\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 ProviderV2 {\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): LanguageModelV2;\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(\n modelId: ClaudeCodeModelId,\n settings?: ClaudeCodeSettings,\n ): LanguageModelV2;\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(\n modelId: ClaudeCodeModelId,\n settings?: ClaudeCodeSettings,\n ): LanguageModelV2;\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(\n options: ClaudeCodeProviderSettings = {},\n): 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 ): LanguageModelV2 => {\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 (\n modelId: ClaudeCodeModelId,\n settings?: ClaudeCodeSettings,\n ) {\n if (new.target) {\n throw new Error(\n 'The Claude Code model function cannot be called with the new keyword.',\n );\n }\n\n return createModel(modelId, settings);\n };\n\n provider.languageModel = createModel;\n provider.chat = createModel; // Alias for languageModel\n\n // Add textEmbeddingModel method that throws NoSuchModelError\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'textEmbeddingModel',\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 'ai-sdk-provider-claude-code';\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();","import type {\n LanguageModelV2,\n LanguageModelV2CallWarning,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n LanguageModelV2Usage,\n JSONValue,\n} from '@ai-sdk/provider';\nimport { NoSuchModelError, APICallError, LoadAPIKeyError } from '@ai-sdk/provider';\nimport { generateId } from '@ai-sdk/provider-utils';\nimport type { ClaudeCodeSettings, Logger } from './types.js';\nimport { convertToClaudeCodeMessages } from './convert-to-claude-code-messages.js';\nimport { extractJson } from './extract-json.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 } from './logger.js';\n\nimport { query, type Options } from '@anthropic-ai/claude-code';\nimport type { SDKUserMessage } from '@anthropic-ai/claude-code';\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\nfunction toAsyncIterablePrompt(messagesPrompt: string, outputStreamEnded: Promise<unknown>, sessionId?: string): AsyncIterable<SDKUserMessage> {\n const msg: SDKUserMessage = {\n type: 'user',\n message: {\n role: 'user',\n content: [{ type: 'text', text: messagesPrompt }],\n },\n parent_tool_use_id: null,\n session_id: sessionId ?? '',\n };\n return {\n async *[Symbol.asyncIterator]() {\n yield msg;\n await outputStreamEnded;\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', 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 4 Opus model (most capable)\n * - 'sonnet': Claude 4 Sonnet model (balanced performance)\n * - Custom string: Any other model identifier supported by the CLI\n * \n * @example\n * ```typescript\n * const opusModel = claudeCode('opus');\n * const sonnetModel = claudeCode('sonnet');\n * const customModel = claudeCode('claude-3-opus-20240229');\n * ```\n */\nexport type ClaudeCodeModelId = 'opus' | 'sonnet' | (string & {});\n\nconst modelMap: Record<string, string> = {\n 'opus': 'opus',\n 'sonnet': 'sonnet',\n};\n\n/**\n * Language model implementation for Claude Code SDK.\n * This class implements the AI SDK's LanguageModelV1 interface to provide\n * integration with Claude models through the Claude Code SDK.\n * \n * Features:\n * - Supports streaming and non-streaming generation\n * - Handles JSON object generation mode\n * - Manages CLI sessions for conversation continuity\n * - Provides detailed error handling and retry logic\n * \n * Limitations:\n * - Does not support image inputs\n * - Does not support structured outputs (tool 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 */\nexport class ClaudeCodeLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2' as const;\n readonly defaultObjectGenerationMode = 'json' as const;\n readonly supportsImageUrls = false;\n readonly supportedUrls = {};\n readonly supportsStructuredOutputs = false;\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 this.logger = getLogger(this.settings.logger);\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 generateAllWarnings(\n options: Parameters<LanguageModelV2['doGenerate']>[0] | Parameters<LanguageModelV2['doStream']>[0],\n prompt: string\n ): LanguageModelV2CallWarning[] {\n const warnings: LanguageModelV2CallWarning[] = [];\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) 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-setting',\n setting: param as 'temperature' | 'maxTokens' | 'topP' | 'topK' | 'presencePenalty' | 'frequencyPenalty' | 'stopSequences' | 'seed',\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 // 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(abortController: AbortController): Options {\n const opts: Partial<Options> & Record<string, unknown> = {\n model: this.getModel(),\n abortController,\n resume: this.settings.resume ?? this.sessionId,\n pathToClaudeCodeExecutable: this.settings.pathToClaudeCodeExecutable,\n customSystemPrompt: this.settings.customSystemPrompt,\n appendSystemPrompt: this.settings.appendSystemPrompt,\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 mcpServers: this.settings.mcpServers,\n canUseTool: this.settings.canUseTool,\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 return opts as Options;\n }\n\n private handleClaudeCodeError(\n error: unknown,\n messagesPrompt: 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 = (err: unknown): 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 ];\n \n const errorMessage = isErrorWithMessage(error) && error.message \n ? error.message.toLowerCase() \n : '';\n \n const exitCode = isErrorWithCode(error) && typeof error.exitCode === 'number' \n ? error.exitCode \n : undefined;\n \n const isAuthError = authErrorPatterns.some(pattern => errorMessage.includes(pattern)) ||\n exitCode === 401;\n\n if (isAuthError) {\n return createAuthenticationError({\n message: 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' \n ? error.code \n : '';\n \n if (errorCode === 'ETIMEDOUT' || errorMessage.includes('timeout')) {\n return createTimeoutError({\n message: isErrorWithMessage(error) && error.message \n ? error.message \n : '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 = errorCode === 'ENOENT' || \n errorCode === 'ECONNREFUSED' ||\n errorCode === 'ETIMEDOUT' ||\n errorCode === 'ECONNRESET';\n\n return createAPICallError({\n message: isErrorWithMessage(error) && error.message \n ? error.message \n : 'Claude Code SDK error',\n code: errorCode || undefined,\n exitCode: exitCode,\n stderr: isErrorWithCode(error) && typeof error.stderr === 'string' \n ? error.stderr \n : undefined,\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 private validateJsonExtraction(\n originalText: string,\n extractedJson: string\n ): { valid: boolean; warning?: LanguageModelV2CallWarning } {\n // If the extracted JSON is the same as original, extraction likely failed\n if (extractedJson === originalText) {\n return {\n valid: false,\n warning: {\n type: 'other',\n message: 'JSON extraction from model response may be incomplete or modified. The model may not have returned valid JSON.',\n },\n };\n }\n\n // Try to parse the extracted JSON to validate it\n try {\n JSON.parse(extractedJson);\n return { valid: true };\n } catch {\n return {\n valid: false,\n warning: {\n type: 'other',\n message: 'JSON extraction resulted in invalid JSON. The response may be malformed.',\n },\n };\n }\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n // Determine mode based on responseFormat\n const mode = options.responseFormat?.type === 'json' \n ? { type: 'object-json' as const } \n : { type: 'regular' as const };\n \n const { messagesPrompt, warnings: messageWarnings } = convertToClaudeCodeMessages(\n options.prompt, \n mode,\n options.responseFormat?.type === 'json' ? options.responseFormat.schema : undefined\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 const queryOptions = this.createQueryOptions(abortController);\n\n let text = '';\n let usage: LanguageModelV2Usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n let finishReason: LanguageModelV2FinishReason = 'stop';\n let costUsd: number | undefined;\n let durationMs: number | undefined;\n let rawUsage: unknown | undefined;\n const warnings: LanguageModelV2CallWarning[] = 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 let done = () => {};\n const outputStreamEnded = new Promise(resolve => { done = () => resolve(undefined); });\n try {\n const modeSetting = this.settings.streamingInput ?? 'auto';\n const wantsStream = modeSetting === 'always' || (modeSetting === 'auto' && !!this.settings.canUseTool);\n if (this.settings.canUseTool && this.settings.permissionPromptToolName) {\n throw new Error(\"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 // hold input stream open until results\n // see: https://github.com/anthropics/claude-code/issues/4775\n const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, outputStreamEnded, this.settings.resume ?? this.sessionId) : messagesPrompt;\n const response = query({\n prompt: sdkPrompt,\n options: queryOptions,\n });\n\n for await (const message of response) {\n if (message.type === 'assistant') {\n text += message.message.content.map((c: { type: string; text?: string }) => \n 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 \n if ('usage' in message) {\n rawUsage = message.usage;\n usage = {\n inputTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0),\n outputTokens: message.usage.output_tokens ?? 0,\n totalTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0) + \n (message.usage.output_tokens ?? 0),\n };\n }\n\n finishReason = mapClaudeCodeFinishReason(message.subtype);\n } else if (message.type === 'system' && message.subtype === 'init') {\n this.setSessionId(message.session_id);\n }\n }\n } catch (error: unknown) {\n done();\n // Special handling for AbortError to preserve abort signal reason\n if (isAbortError(error)) {\n throw options.abortSignal?.aborted ? options.abortSignal.reason : error;\n }\n \n // Use unified error handler\n throw this.handleClaudeCodeError(error, messagesPrompt);\n } finally {\n if (options.abortSignal && abortListener) {\n options.abortSignal.removeEventListener('abort', abortListener);\n }\n }\n\n // Extract JSON if responseFormat indicates JSON mode\n if (options.responseFormat?.type === 'json' && text) {\n const extracted = extractJson(text);\n const validation = this.validateJsonExtraction(text, extracted);\n \n if (!validation.valid && validation.warning) {\n warnings.push(validation.warning);\n }\n \n text = extracted;\n }\n\n return {\n content: [{ type: 'text', text }],\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 ...(rawUsage !== undefined && { rawUsage: rawUsage as JSONValue }),\n },\n },\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n // Determine mode based on responseFormat\n const mode = options.responseFormat?.type === 'json' \n ? { type: 'object-json' as const } \n : { type: 'regular' as const };\n \n const { messagesPrompt, warnings: messageWarnings } = convertToClaudeCodeMessages(\n options.prompt, \n mode,\n options.responseFormat?.type === 'json' ? options.responseFormat.schema : undefined\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 const queryOptions = this.createQueryOptions(abortController);\n\n const warnings: LanguageModelV2CallWarning[] = 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 stream = new ReadableStream<LanguageModelV2StreamPart>({\n start: async (controller) => {\n let done = () => {};\n const outputStreamEnded = new Promise(resolve => { done = () => resolve(undefined); });\n try {\n // Emit stream-start with warnings\n controller.enqueue({ type: 'stream-start', warnings });\n \n const modeSetting = this.settings.streamingInput ?? 'auto';\n const wantsStream = modeSetting === 'always' || (modeSetting === 'auto' && !!this.settings.canUseTool);\n if (this.settings.canUseTool && this.settings.permissionPromptToolName) {\n throw new Error(\"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 // hold input stream open until results\n // see: https://github.com/anthropics/claude-code/issues/4775\n const sdkPrompt = wantsStream ? toAsyncIterablePrompt(messagesPrompt, outputStreamEnded, this.settings.resume ?? this.sessionId) : messagesPrompt;\n const response = query({\n prompt: sdkPrompt,\n options: queryOptions,\n });\n\n let usage: LanguageModelV2Usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n let accumulatedText = '';\n let textPartId: string | undefined;\n\n for await (const message of response) {\n if (message.type === 'assistant') {\n const text = message.message.content\n .map((c: { type: string; text?: string }) => (c.type === 'text' ? c.text : ''))\n .join('');\n \n if (text) {\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 } else if (message.type === 'result') {\n done();\n let rawUsage: unknown | undefined;\n if ('usage' in message) {\n rawUsage = message.usage;\n usage = {\n inputTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0),\n outputTokens: message.usage.output_tokens ?? 0,\n totalTokens: (message.usage.cache_creation_input_tokens ?? 0) + \n (message.usage.cache_read_input_tokens ?? 0) +\n (message.usage.input_tokens ?? 0) + \n (message.usage.output_tokens ?? 0),\n };\n }\n\n const finishReason: LanguageModelV2FinishReason = mapClaudeCodeFinishReason(message.subtype);\n\n // Store session ID in the model instance\n this.setSessionId(message.session_id);\n \n // Check if we need to extract JSON based on responseFormat\n if (options.responseFormat?.type === 'json' && accumulatedText) {\n const extractedJson = extractJson(accumulatedText);\n this.validateJsonExtraction(accumulatedText, extractedJson);\n \n // If validation failed, we should add a warning but we can't modify warnings array in stream\n // So we'll just send the extracted JSON anyway\n // In the future, we could emit a warning stream part if the SDK supports it\n \n // Emit text-start/delta/end for JSON content\n const jsonTextId = generateId();\n controller.enqueue({\n type: 'text-start',\n id: jsonTextId,\n });\n controller.enqueue({\n type: 'text-delta',\n id: jsonTextId,\n delta: extractedJson,\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\n controller.enqueue({\n type: 'text-end',\n id: textPartId,\n });\n }\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 && { costUsd: message.total_cost_usd }),\n ...(message.duration_ms !== undefined && { durationMs: message.duration_ms }),\n ...(rawUsage !== undefined && { rawUsage: rawUsage as JSONValue }),\n },\n },\n });\n } else if (message.type === 'system' && message.subtype === 'init') {\n // Store session ID for future use\n this.setSessionId(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 controller.close();\n } catch (error: unknown) {\n done();\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);\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,\n request: {\n body: messagesPrompt,\n },\n };\n }\n}\n","import type { ModelMessage } from 'ai';\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 * @param mode - Optional mode for specialized output formats (e.g., JSON generation)\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 * { type: 'regular' }\n * );\n * ```\n * \n * @remarks\n * - Image inputs are not supported and will be ignored with a warning\n * - Tool calls are simplified to \"[Tool calls made]\" notation\n * - In 'object-json' mode, explicit JSON instructions are appended\n */\nexport function convertToClaudeCodeMessages(\n prompt: readonly ModelMessage[],\n mode: { type: 'regular' | 'object-json' | 'object-tool' } = { type: 'regular' },\n jsonSchema?: unknown\n): {\n messagesPrompt: string;\n systemPrompt?: string;\n warnings?: string[];\n} {\n const messages: string[] = [];\n const warnings: string[] = [];\n let systemPrompt: string | undefined;\n\n for (const message of prompt) {\n switch (message.role) {\n case 'system':\n systemPrompt = message.content;\n break;\n \n case 'user':\n if (typeof message.content === 'string') {\n messages.push(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 if (textParts) {\n messages.push(textParts);\n }\n \n // Note: Image parts are not supported by Claude Code SDK\n const imageParts = message.content.filter(part => part.type === 'image');\n if (imageParts.length > 0) {\n warnings.push('Claude Code SDK does not support image inputs. Images will be ignored.');\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 messages.push(`Assistant: ${assistantContent}`);\n break;\n }\n \n case 'tool':\n // Tool results could be included in the conversation\n for (const tool of message.content) {\n const resultText = tool.output.type === 'text' \n ? tool.output.value \n : JSON.stringify(tool.output.value);\n messages.push(`Tool Result (${tool.toolName}): ${resultText}`);\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 return { messagesPrompt: finalPrompt, systemPrompt };\n }\n \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 finalPrompt = finalPrompt + '\\n\\n' + formattedMessages.join('\\n\\n');\n } else {\n finalPrompt = formattedMessages.join('\\n\\n');\n }\n \n // For JSON mode, add explicit instruction to ensure JSON output\n if (mode?.type === 'object-json' && jsonSchema) {\n // Prepend JSON instructions at the very beginning, before any messages\n const schemaStr = JSON.stringify(jsonSchema, null, 2);\n \n finalPrompt = `CRITICAL: You MUST respond with ONLY a JSON object. NO other text, NO explanations, NO questions.\n\nYour response MUST start with { and end with }\n\nThe JSON MUST match this EXACT schema:\n${schemaStr}\n\nNow, based on the following conversation, generate ONLY the JSON object with the exact fields specified above:\n\n${finalPrompt}\n\nRemember: Your ENTIRE response must be ONLY the JSON object, starting with { and ending with }`;\n }\n \n return {\n messagesPrompt: finalPrompt,\n systemPrompt,\n ...(warnings.length > 0 && { warnings }),\n };\n}","/**\n * Extract JSON from Claude's response using a tolerant parser.\n *\n * The function removes common wrappers such as markdown fences or variable\n * declarations and then attempts to parse the remaining text with\n * `jsonc-parser`. If valid JSON (or JSONC) can be parsed, it is returned as a\n * string via `JSON.stringify`. Otherwise the original text is returned.\n *\n * @param text - Raw text which may contain JSON\n * @returns A valid JSON string if extraction succeeds, otherwise the original text\n */\nimport { parse, type ParseError } from 'jsonc-parser';\n\nexport function extractJson(text: string): string {\n let content = text.trim();\n\n // Strip ```json or ``` fences\n const fenceMatch = /```(?:json)?\\s*([\\s\\S]*?)\\s*```/i.exec(content);\n if (fenceMatch) {\n content = fenceMatch[1];\n }\n\n // Strip variable declarations like `const foo =` or `let foo =`\n const varMatch = /^\\s*(?:const|let|var)\\s+\\w+\\s*=\\s*([\\s\\S]*)/i.exec(content);\n if (varMatch) {\n content = varMatch[1];\n // Remove trailing semicolon if present\n if (content.trim().endsWith(';')) {\n content = content.trim().slice(0, -1);\n }\n }\n\n // Find the first opening bracket\n const firstObj = content.indexOf('{');\n const firstArr = content.indexOf('[');\n if (firstObj === -1 && firstArr === -1) {\n return text;\n }\n const start = firstArr === -1 ? firstObj : firstObj === -1 ? firstArr : Math.min(firstObj, firstArr);\n content = content.slice(start);\n\n // Try to parse the entire string with jsonc-parser\n const tryParse = (value: string): string | undefined => {\n const errors: ParseError[] = [];\n try {\n const result = parse(value, errors, { allowTrailingComma: true });\n if (errors.length === 0) {\n return JSON.stringify(result, null, 2);\n }\n } catch {\n // ignore\n }\n return undefined;\n };\n\n const parsed = tryParse(content);\n if (parsed !== undefined) {\n return parsed;\n }\n\n // If parsing the full string failed, use a more efficient approach\n // to find valid JSON boundaries\n const openChar = content[0];\n const closeChar = openChar === '{' ? '}' : ']';\n \n // Find all potential closing positions by tracking nesting depth\n const closingPositions: number[] = [];\n let depth = 0;\n let inString = false;\n let escapeNext = false;\n \n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n \n if (escapeNext) {\n escapeNext = false;\n continue;\n }\n \n if (char === '\\\\') {\n escapeNext = true;\n continue;\n }\n \n if (char === '\"' && !inString) {\n inString = true;\n continue;\n }\n \n if (char === '\"' && inString) {\n inString = false;\n continue;\n }\n \n // Skip content inside strings\n if (inString) continue;\n \n if (char === openChar) {\n depth++;\n } else if (char === closeChar) {\n depth--;\n if (depth === 0) {\n closingPositions.push(i + 1);\n }\n }\n }\n \n // Try parsing at each valid closing position, starting from the end\n for (let i = closingPositions.length - 1; i >= 0; i--) {\n const attempt = tryParse(content.slice(0, closingPositions[i]));\n if (attempt !== undefined) {\n return attempt;\n }\n }\n \n // As a final fallback, try the original character-by-character approach\n // but only for the last 1000 characters to limit performance impact\n const searchStart = Math.max(0, content.length - 1000);\n for (let end = content.length - 1; end > searchStart; end--) {\n const attempt = tryParse(content.slice(0, end));\n if (attempt !== undefined) {\n return attempt;\n }\n }\n\n return text;\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({\n message,\n}: {\n message: string;\n}): LoadAPIKeyError {\n return new LoadAPIKeyError({\n message: 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) 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') 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}","import type { LanguageModelV2FinishReason } from '@ai-sdk/provider';\n\n/**\n * Maps Claude Code SDK result subtypes to AI SDK finish reasons.\n * \n * @param subtype - The result subtype from Claude Code SDK\n * @returns The corresponding AI SDK finish reason\n * \n * @example\n * ```typescript\n * const finishReason = mapClaudeCodeFinishReason('error_max_turns');\n * // Returns: 'length'\n * ```\n * \n * @remarks\n * Mappings:\n * - 'success' -> 'stop' (normal completion)\n * - 'error_max_turns' -> 'length' (hit turn limit)\n * - 'error_during_execution' -> 'error' (execution error)\n * - default -> 'stop' (unknown subtypes treated as normal completion)\n */\nexport function mapClaudeCodeFinishReason(\n subtype?: string\n): LanguageModelV2FinishReason {\n switch (subtype) {\n case 'success':\n return 'stop';\n case 'error_max_turns':\n return 'length';\n case 'error_during_execution':\n return 'error';\n default:\n return 'stop';\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 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.object({\n pathToClaudeCodeExecutable: z.string().optional(),\n customSystemPrompt: z.string().optional(),\n appendSystemPrompt: z.string().optional(),\n maxTurns: z.number().int().min(1).max(100).optional(),\n maxThinkingTokens: z.number().int().positive().max(100000).optional(),\n cwd: z.string().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 ).optional(),\n executable: z.enum(['bun', 'deno', 'node']).optional(),\n executableArgs: z.array(z.string()).optional(),\n permissionMode: z.enum(['default', 'acceptEdits', 'bypassPermissions', 'plan']).optional(),\n permissionPromptToolName: z.string().optional(),\n continue: z.boolean().optional(),\n resume: z.string().optional(),\n allowedTools: z.array(z.string()).optional(),\n disallowedTools: z.array(z.string()).optional(),\n streamingInput: z.enum(['auto', 'always', 'off']).optional(),\n // Hooks and tool-permission callback (permissive validation of shapes)\n canUseTool: z.any().refine((v) => v === undefined || typeof v === 'function', {\n message: 'canUseTool must be a function'\n }).optional(),\n hooks: z.record(z.string(), z.array(z.object({\n matcher: z.string().optional(),\n hooks: z.array(z.any()).nonempty(),\n }))).optional(),\n mcpServers: z.record(z.string(), 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 ])).optional(),\n verbose: z.boolean().optional(),\n logger: z.union([\n z.literal(false),\n loggerFunctionSchema\n ]).optional(),\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'];\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 { errors?: Array<{ path: string[]; message: string }>; issues?: Array<{ path: string[]; message: string }> };\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(`High maxTurns value (${validSettings.maxTurns}) may lead to long-running conversations`);\n }\n \n // Warn about very high thinking tokens\n if (validSettings.maxThinkingTokens && validSettings.maxThinkingTokens > 50000) {\n warnings.push(`Very high maxThinkingTokens (${validSettings.maxThinkingTokens}) may increase response time`);\n }\n \n // Check if both allowedTools and disallowedTools are specified\n if (validSettings.allowedTools && validSettings.disallowedTools) {\n warnings.push('Both allowedTools and disallowedTools are specified. Only allowedTools will be used.');\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 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.\n */\nconst defaultLogger: Logger = {\n warn: (message: string) => console.warn(message),\n error: (message: string) => console.error(message),\n};\n\n/**\n * No-op logger that discards all messages.\n */\nconst noopLogger: Logger = {\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 * 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 LanguageModelV1 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 { ClaudeCodeModelId, ClaudeCodeLanguageModelOptions } 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 } from './types.js';\n\n// Convenience re-exports from the SDK for custom tools and hooks\nexport { createSdkMcpServer, tool } from '@anthropic-ai/claude-code';\nexport { createCustomMcpServer } 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 CanUseTool,\n PermissionResult,\n PermissionUpdate,\n PermissionBehavior,\n PermissionRuleValue,\n McpServerConfig,\n McpSdkServerConfigWithInstance,\n} from '@anthropic-ai/claude-code';\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-code';\nimport type { McpSdkServerConfigWithInstance } from '@anthropic-ai/claude-code';\nimport { type ZodRawShape, type ZodObject } from 'zod';\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 */\nexport type MinimalCallToolResult = {\n content: Array<{ type: string; [key: string]: unknown }>;\n isError?: boolean;\n structuredContent?: unknown;\n};\n\nexport function createCustomMcpServer<Tools extends Record<string, {\n description: string;\n inputSchema: ZodObject<ZodRawShape>;\n handler: (args: Record<string, unknown>, extra: unknown) => Promise<MinimalCallToolResult>;\n}>>(config: {\n name: string;\n version?: string;\n tools: Tools;\n}): 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 )\n );\n return createSdkMcpServer({ name: config.name, version: config.version, tools: defs });\n}\n"],"mappings":"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","names":["NoSuchModelError","tool","tool","NoSuchModelError","createSdkMcpServer","tool"]}
|