@codedir/mimir-code 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/index.ts","../src/core/Agent.ts","../src/core/Tool.ts","../src/core/RiskAssessor.ts","../src/core/PermissionManager.ts","../src/utils/errors.ts","../src/providers/BaseLLMProvider.ts","../src/providers/DeepSeekProvider.ts","../src/providers/utils/apiClient.ts","../src/providers/pricing/pricingData.ts","../src/providers/utils/toolFormatters.ts","../src/providers/utils/streamParsers.ts","../src/providers/AnthropicProvider.ts","../src/providers/ProviderFactory.ts","../src/config/schemas.ts","../src/utils/logger.ts","../src/config/AllowlistLoader.ts","../src/config/ConfigLoader.ts","../src/platform/FileSystemAdapter.ts"],"sourcesContent":["/**\n * Core type definitions for Mimir\n */\n\n// Message types\nexport interface Message {\n role: 'system' | 'user' | 'assistant';\n content: string;\n name?: string;\n toolCalls?: ToolCall[];\n metadata?: MessageMetadata;\n}\n\nexport interface MessageMetadata {\n timestamp?: number; // Unix timestamp in milliseconds\n duration?: number; // Duration in milliseconds\n usage?: {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n };\n cost?: number; // Cost in USD\n model?: string; // Model used for this message\n provider?: string; // Provider used for this message\n}\n\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface ToolResult {\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\n// Chat response types\nexport interface ChatResponse {\n content: string;\n toolCalls?: ToolCall[];\n finishReason: 'stop' | 'tool_calls' | 'length' | 'error';\n usage: {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n };\n}\n\nexport interface ChatChunk {\n content: string;\n done: boolean;\n}\n\n// Risk assessment\nexport type RiskLevel = 'low' | 'medium' | 'high' | 'critical';\n\nexport interface PermissionDecision {\n command: string;\n riskLevel: RiskLevel;\n decision: 'allow' | 'deny' | 'always' | 'never';\n timestamp: number;\n}\n\n// Agent action types\nexport interface Action {\n type: 'tool_call' | 'finish';\n toolName?: string;\n arguments?: Record<string, unknown>;\n result?: unknown;\n}\n\nexport interface Observation {\n type: 'tool_result' | 'permission_denied' | 'error';\n data?: unknown;\n error?: string;\n}\n\n// Configuration types (will be refined with Zod schemas)\nexport interface LLMConfig {\n provider: string;\n model: string;\n apiKey?: string;\n baseURL?: string;\n temperature: number;\n maxTokens: number;\n}\n\nexport interface PermissionsConfig {\n autoAccept: boolean;\n acceptRiskLevel: RiskLevel;\n alwaysAcceptCommands: string[];\n}\n\nexport interface DockerConfig {\n enabled: boolean;\n baseImage: string;\n cpuLimit?: number;\n memoryLimit?: string;\n}\n\n// Result type for error handling\nexport type Result<T, E = Error> = { ok: true; value: T } | { ok: false; error: E };\n\n// Utility type helpers\nexport const createOk = <T>(value: T): Result<T> => ({ ok: true, value });\nexport const createErr = <E = Error>(error: E): Result<never, E> => ({ ok: false, error });\n","/**\n * Core Agent implementation (ReAct loop)\n */\n\nimport { ILLMProvider } from '../providers/ILLMProvider.js';\nimport { ToolRegistry } from './Tool.js';\nimport { Message, Action, Observation, Result, createOk, createErr } from '../types/index.js';\n\nexport interface AgentConfig {\n maxIterations: number;\n budgetLimit?: number;\n}\n\nexport class Agent {\n // private provider: ILLMProvider; // TODO: Will be used when LLM integration is implemented\n private toolRegistry: ToolRegistry;\n private config: AgentConfig;\n private conversationHistory: Message[] = [];\n private currentIteration = 0;\n\n constructor(_provider: ILLMProvider, toolRegistry: ToolRegistry, config: AgentConfig) {\n // this.provider = provider; // TODO: Uncomment when implementing LLM integration\n this.toolRegistry = toolRegistry;\n this.config = config;\n }\n\n async run(task: string): Promise<Result<unknown>> {\n this.conversationHistory = [\n {\n role: 'system',\n content: 'You are a helpful coding assistant.',\n },\n {\n role: 'user',\n content: task,\n },\n ];\n\n while (this.currentIteration < this.config.maxIterations) {\n // 1. REASON: Get next action from LLM\n const action = await this.reason();\n\n if (action.type === 'finish') {\n return createOk(action.result);\n }\n\n // 2. ACT: Execute tool\n const observation = await this.act(action);\n\n // 3. OBSERVE: Record result\n await this.observe(observation);\n\n this.currentIteration++;\n }\n\n return createErr(new Error('Max iterations reached'));\n }\n\n private async reason(): Promise<Action> {\n // TODO: Implement LLM reasoning\n // For now, return a finish action\n return {\n type: 'finish',\n result: 'Task completed',\n };\n }\n\n private async act(action: Action): Promise<Observation> {\n if (!action.toolName || !action.arguments) {\n return {\n type: 'error',\n error: 'Invalid action: missing toolName or arguments',\n };\n }\n\n // TODO: Check permissions before execution\n\n const result = await this.toolRegistry.execute(action.toolName, action.arguments);\n\n return {\n type: 'tool_result',\n data: result,\n };\n }\n\n private async observe(observation: Observation): Promise<void> {\n // TODO: Update conversation history with observation\n // For now, just a placeholder\n this.conversationHistory.push({\n role: 'assistant',\n content: JSON.stringify(observation),\n });\n }\n}\n","/**\n * Tool interface and registry\n */\n\nimport { z } from 'zod';\nimport { ToolResult } from '../types/index.js';\n\nexport interface Tool {\n name: string;\n description: string;\n schema: z.ZodObject<never>;\n execute(args: unknown): Promise<ToolResult>;\n}\n\nexport class ToolRegistry {\n private tools: Map<string, Tool> = new Map();\n\n register(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n unregister(toolName: string): void {\n this.tools.delete(toolName);\n }\n\n get(toolName: string): Tool | undefined {\n return this.tools.get(toolName);\n }\n\n getAll(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n has(toolName: string): boolean {\n return this.tools.has(toolName);\n }\n\n async execute(toolName: string, args: unknown): Promise<ToolResult> {\n const tool = this.get(toolName);\n if (!tool) {\n return {\n success: false,\n error: `Tool not found: ${toolName}`,\n };\n }\n\n try {\n // Validate arguments with Zod schema\n const validatedArgs = tool.schema.parse(args);\n return await tool.execute(validatedArgs);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n}\n","/**\n * Risk assessment for commands with detailed explanations\n */\n\nimport { RiskLevel } from '../types/index.js';\n\nexport interface RiskAssessment {\n level: RiskLevel;\n reasons: string[];\n score: number; // 0-100, higher = more risky\n}\n\nexport class RiskAssessor {\n // Critical patterns - system-destroying commands\n private criticalPatterns = [\n { pattern: /rm\\s+-rf\\s+\\/(?!tmp|var\\/tmp)/, reason: 'Deletes root filesystem' },\n { pattern: /format\\s+[a-z]:/i, reason: 'Formats entire drive' },\n { pattern: /del\\s+\\/[sf]/i, reason: 'Deletes system files (Windows)' },\n { pattern: /shutdown|reboot|poweroff/, reason: 'System shutdown/reboot' },\n { pattern: /dd\\s+.*of=\\/dev\\/(sda|hda|nvme)/, reason: 'Direct disk write (can destroy data)' },\n { pattern: /mkfs/, reason: 'Formats filesystem' },\n {\n pattern: /(>|vim|vi|nano|emacs|edit).*\\/etc\\/(passwd|shadow|sudoers)/,\n reason: 'Modifies critical system files',\n },\n { pattern: /curl.*\\|\\s*(bash|sh|python)/, reason: 'Executes remote script without inspection' },\n { pattern: /wget.*\\|\\s*(bash|sh|python)/, reason: 'Executes remote script without inspection' },\n ];\n\n // High risk patterns - destructive but recoverable\n private highPatterns = [\n { pattern: /rm\\s+-rf\\s+(?!\\/($|\\s))/, reason: 'Recursive force delete' },\n { pattern: /sudo\\s+rm/, reason: 'Elevated permissions file deletion' },\n { pattern: /git\\s+push\\s+--force/, reason: 'Force pushes can overwrite history' },\n { pattern: /npm\\s+publish/, reason: 'Publishes package to registry' },\n { pattern: /docker\\s+rmi.*-f/, reason: 'Force removes Docker images' },\n { pattern: /docker\\s+system\\s+prune\\s+-a/, reason: 'Removes all unused Docker data' },\n { pattern: /git\\s+reset\\s+--hard\\s+HEAD~/, reason: 'Permanently deletes commits' },\n { pattern: /git\\s+clean\\s+-fd/, reason: 'Deletes untracked files' },\n { pattern: /chmod\\s+777/, reason: 'Makes files world-writable (security risk)' },\n { pattern: /chown\\s+-R/, reason: 'Recursive ownership change' },\n ];\n\n // Medium risk patterns - potentially problematic\n private mediumPatterns = [\n { pattern: /npm\\s+install/, reason: 'Installs dependencies (can include malicious packages)' },\n { pattern: /yarn\\s+add/, reason: 'Installs dependencies (can include malicious packages)' },\n { pattern: /pip\\s+install/, reason: 'Installs Python packages' },\n { pattern: /git\\s+push/, reason: 'Pushes changes to remote' },\n { pattern: /docker\\s+run/, reason: 'Runs Docker container' },\n { pattern: /docker\\s+exec/, reason: 'Executes command in container' },\n { pattern: /ssh\\s+/, reason: 'Remote connection' },\n { pattern: /scp\\s+/, reason: 'Remote file transfer' },\n { pattern: /rsync\\s+/, reason: 'File synchronization' },\n { pattern: /npm\\s+run\\s+build/, reason: 'Runs build scripts' },\n ];\n\n /**\n * Assess risk level and provide detailed reasons\n */\n assess(command: string): RiskAssessment {\n const reasons: string[] = [];\n let maxScore = 0;\n\n // Check critical patterns\n for (const { pattern, reason } of this.criticalPatterns) {\n if (pattern.test(command)) {\n reasons.push(`🔴 CRITICAL: ${reason}`);\n maxScore = Math.max(maxScore, 100);\n }\n }\n\n // Check high patterns\n for (const { pattern, reason } of this.highPatterns) {\n if (pattern.test(command)) {\n reasons.push(`🟠 HIGH: ${reason}`);\n maxScore = Math.max(maxScore, 75);\n }\n }\n\n // Check medium patterns\n for (const { pattern, reason } of this.mediumPatterns) {\n if (pattern.test(command)) {\n reasons.push(`🟡 MEDIUM: ${reason}`);\n maxScore = Math.max(maxScore, 50);\n }\n }\n\n // Additional checks\n const additionalRisks = this.assessAdditionalRisks(command);\n reasons.push(...additionalRisks.reasons);\n maxScore = Math.max(maxScore, additionalRisks.score);\n\n // Determine level from score\n const level = this.scoreToLevel(maxScore);\n\n // If no specific risks found, it's low risk\n if (reasons.length === 0) {\n reasons.push('No specific risks detected');\n }\n\n return {\n level,\n reasons,\n score: maxScore,\n };\n }\n\n /**\n * Additional risk checks (file size, complexity, etc.)\n */\n private assessAdditionalRisks(command: string): { reasons: string[]; score: number } {\n const reasons: string[] = [];\n let score = 0;\n\n // Check command length (very long commands are suspicious)\n if (command.length > 500) {\n reasons.push('⚠️ Command is unusually long (possible obfuscation)');\n score = Math.max(score, 30);\n }\n\n // Check for multiple commands chained\n const chainCount = (command.match(/[;&|]+/g) || []).length;\n if (chainCount > 3) {\n reasons.push(`⚠️ Multiple chained commands (${chainCount} chains)`);\n score = Math.max(score, 40);\n }\n\n // Check for redirection to /dev/null (hiding output)\n if (/>\\/dev\\/null|2>&1/.test(command)) {\n reasons.push('⚠️ Output redirected (hiding results)');\n score = Math.max(score, 20);\n }\n\n // Check for sudo without specific command\n if (/sudo\\s*$/.test(command)) {\n reasons.push('🟠 Elevated permissions without specific command');\n score = Math.max(score, 60);\n }\n\n // Check for environment variable manipulation\n if (/export\\s+|setenv\\s+/.test(command) && /PATH/.test(command)) {\n reasons.push('🟡 Modifies PATH environment variable');\n score = Math.max(score, 45);\n }\n\n // Check for Base64 encoding (possible obfuscation)\n if (/base64\\s+--decode|echo\\s+.*\\|\\s*base64/.test(command)) {\n reasons.push('⚠️ Uses Base64 encoding (possible obfuscation)');\n score = Math.max(score, 35);\n }\n\n // Check for eval (code execution)\n if (/eval\\s+/.test(command)) {\n reasons.push('🟠 Uses eval (dynamic code execution)');\n score = Math.max(score, 65);\n }\n\n return { reasons, score };\n }\n\n /**\n * Convert numeric score to risk level\n */\n private scoreToLevel(score: number): RiskLevel {\n if (score >= 80) return 'critical';\n if (score >= 60) return 'high';\n if (score >= 30) return 'medium';\n return 'low';\n }\n\n /**\n * Check if command matches any allowed patterns\n */\n isAllowed(command: string, allowlist: string[]): boolean {\n return allowlist.some((pattern) => {\n try {\n // Try as regex\n const regex = new RegExp(pattern);\n return regex.test(command);\n } catch {\n // Fallback to simple string match\n return command.includes(pattern);\n }\n });\n }\n\n /**\n * Check if command matches any blocked patterns\n */\n isBlocked(command: string, blocklist: string[]): boolean {\n return blocklist.some((pattern) => {\n try {\n const regex = new RegExp(pattern);\n return regex.test(command);\n } catch {\n return command.includes(pattern);\n }\n });\n }\n\n /**\n * Get a human-readable summary of the risk assessment\n */\n getSummary(assessment: RiskAssessment): string {\n const levelEmoji = {\n low: '🟢',\n medium: '🟡',\n high: '🟠',\n critical: '🔴',\n };\n\n const lines = [\n `${levelEmoji[assessment.level]} Risk Level: ${assessment.level.toUpperCase()} (score: ${assessment.score}/100)`,\n '',\n 'Reasons:',\n ...assessment.reasons.map((r) => ` • ${r}`),\n ];\n\n return lines.join('\\n');\n }\n}\n","/**\n * Permission system for command execution\n */\n\nimport { RiskLevel, PermissionDecision } from '../types/index.js';\nimport { RiskAssessor, RiskAssessment } from './RiskAssessor.js';\n\nexport class PermissionManager {\n private riskAssessor: RiskAssessor;\n private allowlist: Set<string> = new Set();\n private blocklist: Set<string> = new Set();\n private auditLog: PermissionDecision[] = [];\n\n constructor() {\n this.riskAssessor = new RiskAssessor();\n }\n\n async checkPermission(command: string): Promise<{\n allowed: boolean;\n assessment: RiskAssessment;\n }> {\n const assessment = this.riskAssessor.assess(command);\n\n // Check blocklist\n if (this.riskAssessor.isBlocked(command, Array.from(this.blocklist))) {\n this.logDecision(command, assessment.level, 'deny');\n return { allowed: false, assessment };\n }\n\n // Check allowlist\n if (this.riskAssessor.isAllowed(command, Array.from(this.allowlist))) {\n this.logDecision(command, assessment.level, 'allow');\n return { allowed: true, assessment };\n }\n\n // TODO: Prompt user for permission\n // For now, auto-deny high and critical\n if (assessment.level === 'high' || assessment.level === 'critical') {\n this.logDecision(command, assessment.level, 'deny');\n return { allowed: false, assessment };\n }\n\n this.logDecision(command, assessment.level, 'allow');\n return { allowed: true, assessment };\n }\n\n addToAllowlist(pattern: string): void {\n this.allowlist.add(pattern);\n }\n\n addToBlocklist(pattern: string): void {\n this.blocklist.add(pattern);\n }\n\n private logDecision(\n command: string,\n riskLevel: RiskLevel,\n decision: 'allow' | 'deny' | 'always' | 'never'\n ): void {\n this.auditLog.push({\n command,\n riskLevel,\n decision,\n timestamp: Date.now(),\n });\n }\n\n getAuditLog(): PermissionDecision[] {\n return [...this.auditLog];\n }\n}\n","/**\n * Custom error classes\n */\n\nexport class MimirError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MimirError';\n }\n}\n\nexport class ConfigurationError extends MimirError {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigurationError';\n }\n}\n\nexport class ProviderError extends MimirError {\n constructor(\n message: string,\n public readonly provider?: string\n ) {\n super(message);\n this.name = 'ProviderError';\n }\n}\n\nexport class ToolExecutionError extends MimirError {\n constructor(\n message: string,\n public readonly toolName?: string\n ) {\n super(message);\n this.name = 'ToolExecutionError';\n }\n}\n\nexport class PermissionDeniedError extends MimirError {\n constructor(\n message: string,\n public readonly command?: string\n ) {\n super(message);\n this.name = 'PermissionDeniedError';\n }\n}\n\nexport class DockerError extends MimirError {\n constructor(message: string) {\n super(message);\n this.name = 'DockerError';\n }\n}\n\nexport class NetworkError extends MimirError {\n constructor(\n message: string,\n public readonly statusCode?: number\n ) {\n super(message);\n this.name = 'NetworkError';\n }\n}\n\nexport class RateLimitError extends MimirError {\n constructor(\n message: string,\n public readonly retryAfter?: number\n ) {\n super(message);\n this.name = 'RateLimitError';\n }\n}\n","/**\n * Base LLM Provider implementation\n * Contains common logic for retry, error handling, etc.\n */\n\nimport { ILLMProvider, LLMTool } from './ILLMProvider.js';\nimport { Message, ChatResponse, ChatChunk, LLMConfig } from '../types/index.js';\nimport { NetworkError } from '../utils/errors.js';\n\nexport interface RetryConfig {\n maxRetries: number;\n retryDelay: number;\n backoffMultiplier: number;\n}\n\nexport abstract class BaseLLMProvider implements ILLMProvider {\n protected config: LLMConfig;\n protected retryConfig: RetryConfig;\n\n constructor(config: LLMConfig, retryConfig?: RetryConfig) {\n this.config = config;\n this.retryConfig = retryConfig ?? {\n maxRetries: 3,\n retryDelay: 1000,\n backoffMultiplier: 2,\n };\n }\n\n abstract chat(messages: Message[], tools?: LLMTool[]): Promise<ChatResponse>;\n abstract streamChat(messages: Message[], tools?: LLMTool[]): AsyncGenerator<ChatChunk>;\n abstract countTokens(text: string): number;\n abstract calculateCost(inputTokens: number, outputTokens: number): number;\n\n getProviderName(): string {\n return this.config.provider;\n }\n\n getModelName(): string {\n return this.config.model;\n }\n\n /**\n * Retry wrapper for API calls\n * Only retries on NetworkError (5xx server errors)\n * Does NOT retry on auth errors, rate limits, or client errors\n */\n protected async withRetry<T>(fn: () => Promise<T>): Promise<T> {\n let lastError: Error | undefined;\n let delay = this.retryConfig.retryDelay;\n\n for (let attempt = 0; attempt <= this.retryConfig.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n // Only retry on NetworkError (transient server issues)\n // Don't retry on auth errors, rate limits, or client errors\n const shouldRetry = error instanceof NetworkError && attempt < this.retryConfig.maxRetries;\n\n if (shouldRetry) {\n await this.sleep(delay);\n delay *= this.retryConfig.backoffMultiplier;\n } else {\n // For non-retryable errors, throw immediately\n throw lastError;\n }\n }\n }\n\n throw lastError;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * DeepSeek LLM Provider\n * OpenAI-compatible API with cost-effective pricing\n */\n\nimport { encoding_for_model, type Tiktoken } from 'tiktoken';\nimport { BaseLLMProvider } from './BaseLLMProvider.js';\nimport { ILLMProvider, LLMTool } from './ILLMProvider.js';\nimport { Message, ChatResponse, ChatChunk, LLMConfig } from '../types/index.js';\nimport { APIClient } from './utils/apiClient.js';\nimport { getStaticPricing } from './pricing/pricingData.js';\nimport {\n toOpenAITools,\n parseOpenAIToolCalls,\n mapOpenAIFinishReason,\n} from './utils/toolFormatters.js';\nimport { parseOpenAIStream } from './utils/streamParsers.js';\nimport { ConfigurationError } from '../utils/errors.js';\n\nexport class DeepSeekProvider extends BaseLLMProvider implements ILLMProvider {\n private apiClient: APIClient;\n private encoder: Tiktoken;\n\n constructor(config: LLMConfig) {\n super(config);\n\n const apiKey = config.apiKey || process.env.DEEPSEEK_API_KEY;\n if (!apiKey) {\n throw new ConfigurationError(\n 'DEEPSEEK_API_KEY not found in config or environment variables. ' +\n 'Please set DEEPSEEK_API_KEY in your .env file or pass it via config.'\n );\n }\n\n const baseURL = config.baseURL || 'https://api.deepseek.com';\n\n this.apiClient = new APIClient({\n baseURL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n timeout: 60000,\n });\n\n // Use GPT-4 tokenizer (cl100k_base) - DeepSeek is OpenAI-compatible\n this.encoder = encoding_for_model('gpt-4');\n }\n\n async chat(messages: Message[], tools?: LLMTool[]): Promise<ChatResponse> {\n return this.withRetry(async () => {\n const requestBody = {\n model: this.config.model,\n messages: this.formatMessages(messages),\n tools: tools ? toOpenAITools(tools) : undefined,\n temperature: this.config.temperature,\n max_tokens: this.config.maxTokens,\n };\n\n const response = await this.apiClient.post<DeepSeekChatResponse>(\n '/chat/completions',\n requestBody\n );\n\n return this.parseResponse(response);\n });\n }\n\n async *streamChat(messages: Message[], tools?: LLMTool[]): AsyncGenerator<ChatChunk> {\n const requestBody = {\n model: this.config.model,\n messages: this.formatMessages(messages),\n tools: tools ? toOpenAITools(tools) : undefined,\n temperature: this.config.temperature,\n max_tokens: this.config.maxTokens,\n stream: true,\n };\n\n const stream = this.apiClient.stream('/chat/completions', requestBody);\n\n for await (const chunk of parseOpenAIStream(stream)) {\n yield chunk;\n }\n }\n\n countTokens(text: string): number {\n return this.encoder.encode(text).length;\n }\n\n calculateCost(inputTokens: number, outputTokens: number): number {\n const pricing = getStaticPricing('deepseek', this.config.model);\n if (!pricing) {\n return 0; // Unknown model, return 0 cost\n }\n\n return (\n (inputTokens / 1_000_000) * pricing.inputPerMillionTokens +\n (outputTokens / 1_000_000) * pricing.outputPerMillionTokens\n );\n }\n\n /**\n * Format messages for OpenAI-compatible API\n */\n private formatMessages(\n messages: Message[]\n ): Array<{ role: string; content: string; name?: string }> {\n return messages.map((msg) => ({\n role: msg.role,\n content: msg.content,\n name: msg.name,\n }));\n }\n\n /**\n * Parse DeepSeek API response\n */\n private parseResponse(response: DeepSeekChatResponse): ChatResponse {\n const choice = response.choices[0];\n const message = choice?.message;\n const usage = response.usage;\n\n if (!choice || !message) {\n throw new Error('Invalid response from DeepSeek API: missing choice or message');\n }\n\n return {\n content: message.content || '',\n toolCalls: parseOpenAIToolCalls(response),\n finishReason: mapOpenAIFinishReason(choice.finish_reason),\n usage: {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n },\n };\n }\n}\n\n/**\n * DeepSeek API response type\n */\ninterface DeepSeekChatResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: string;\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: string;\n function: {\n name: string;\n arguments: string;\n };\n }>;\n };\n finish_reason: string;\n }>;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_cache_hit_tokens?: number;\n prompt_cache_miss_tokens?: number;\n };\n}\n","/**\n * HTTP API client wrapper around axios\n * Handles request/response, error mapping, and streaming\n */\n\nimport axios, { AxiosInstance, AxiosError, AxiosResponse } from 'axios';\nimport { ProviderError, NetworkError, RateLimitError } from '../../utils/errors.js';\n\nexport interface APIClientConfig {\n baseURL: string;\n headers: Record<string, string>;\n timeout?: number;\n}\n\nexport class APIClient {\n private axiosInstance: AxiosInstance;\n private providerName: string;\n\n constructor(config: APIClientConfig) {\n this.axiosInstance = axios.create({\n baseURL: config.baseURL,\n headers: config.headers,\n timeout: config.timeout || 60000, // 60 seconds default\n });\n\n // Extract provider name from base URL for error messages\n this.providerName = this.extractProviderName(config.baseURL);\n }\n\n /**\n * POST request with JSON payload\n */\n async post<T>(endpoint: string, data: unknown): Promise<T> {\n try {\n const response: AxiosResponse<T> = await this.axiosInstance.post(endpoint, data);\n return response.data;\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n /**\n * GET request\n */\n async get<T>(endpoint: string): Promise<T> {\n try {\n const response: AxiosResponse<T> = await this.axiosInstance.get(endpoint);\n return response.data;\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n /**\n * Stream request for Server-Sent Events (SSE)\n * Returns async iterable of string chunks\n */\n async *stream(endpoint: string, data: unknown): AsyncGenerator<string, void, unknown> {\n try {\n const response = await this.axiosInstance.post(endpoint, data, {\n responseType: 'stream',\n headers: {\n Accept: 'text/event-stream',\n },\n });\n\n const stream = response.data;\n\n // Read stream chunks\n for await (const chunk of stream) {\n const chunkStr = chunk.toString('utf-8');\n yield chunkStr;\n }\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n /**\n * Map axios errors to custom error types\n */\n private mapError(error: unknown): Error {\n if (!axios.isAxiosError(error)) {\n return error as Error;\n }\n\n const axiosError = error as AxiosError;\n const status = axiosError.response?.status;\n const errorData = axiosError.response?.data as {\n error?: { message?: string };\n message?: string;\n };\n const message = errorData?.error?.message || errorData?.message || axiosError.message;\n\n // Rate limit error (429)\n if (status === 429) {\n const retryAfter = parseInt((axiosError.response?.headers['retry-after'] as string) || '60');\n return new RateLimitError(`${this.providerName} rate limit exceeded: ${message}`, retryAfter);\n }\n\n // Auth errors (401, 403)\n if (status === 401 || status === 403) {\n return new ProviderError(\n `${this.providerName} authentication failed: ${message}`,\n this.providerName\n );\n }\n\n // Server errors (5xx)\n if (status && status >= 500) {\n return new NetworkError(`${this.providerName} server error: ${message}`, status);\n }\n\n // Client errors (4xx)\n if (status && status >= 400) {\n return new ProviderError(`${this.providerName} request error: ${message}`, this.providerName);\n }\n\n // Network/timeout errors\n if (axiosError.code === 'ECONNABORTED' || axiosError.code === 'ETIMEDOUT') {\n return new NetworkError(`${this.providerName} request timeout: ${message}`);\n }\n\n // Generic provider error\n return new ProviderError(`${this.providerName} error: ${message}`, this.providerName);\n }\n\n /**\n * Extract provider name from base URL\n */\n private extractProviderName(baseURL: string): string {\n try {\n const url = new URL(baseURL);\n const hostname = url.hostname;\n\n if (hostname.includes('deepseek')) return 'DeepSeek';\n if (hostname.includes('anthropic')) return 'Anthropic';\n if (hostname.includes('openai')) return 'OpenAI';\n if (hostname.includes('google')) return 'Google';\n\n return hostname;\n } catch {\n return 'Unknown Provider';\n }\n }\n}\n","/**\n * Pricing data for LLM providers\n * Hybrid approach: Fetch from API first, fallback to static table\n */\n\nexport interface ModelPricing {\n inputPerMillionTokens: number;\n outputPerMillionTokens: number;\n}\n\n// Static fallback pricing (updated as of 2025-12-25)\nconst STATIC_PRICING_TABLE: Record<string, Record<string, ModelPricing>> = {\n deepseek: {\n 'deepseek-chat': {\n inputPerMillionTokens: 0.14,\n outputPerMillionTokens: 0.28,\n },\n 'deepseek-reasoner': {\n inputPerMillionTokens: 0.55,\n outputPerMillionTokens: 2.19,\n },\n },\n anthropic: {\n 'claude-opus-4-5-20251101': {\n inputPerMillionTokens: 15,\n outputPerMillionTokens: 75,\n },\n 'claude-opus-4-5': {\n inputPerMillionTokens: 15,\n outputPerMillionTokens: 75,\n },\n 'claude-sonnet-4-5-20250929': {\n inputPerMillionTokens: 3,\n outputPerMillionTokens: 15,\n },\n 'claude-sonnet-4-5': {\n inputPerMillionTokens: 3,\n outputPerMillionTokens: 15,\n },\n 'claude-haiku-4-5': {\n inputPerMillionTokens: 1,\n outputPerMillionTokens: 5,\n },\n 'claude-3-7-sonnet-latest': {\n inputPerMillionTokens: 3,\n outputPerMillionTokens: 15,\n },\n 'claude-3-5-haiku-latest': {\n inputPerMillionTokens: 1,\n outputPerMillionTokens: 5,\n },\n },\n};\n\n// In-memory cache for dynamic pricing (TTL: 24 hours)\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface PricingCacheEntry {\n pricing: ModelPricing;\n timestamp: number;\n}\n\nconst pricingCache = new Map<string, PricingCacheEntry>();\n\n/**\n * Get static pricing for a provider/model\n */\nexport function getStaticPricing(provider: string, model: string): ModelPricing | null {\n const providerPricing = STATIC_PRICING_TABLE[provider.toLowerCase()];\n if (!providerPricing) {\n return null;\n }\n\n return providerPricing[model] || null;\n}\n\n/**\n * Fetch dynamic pricing from provider API or documentation\n */\nexport async function fetchDynamicPricing(\n provider: string,\n model: string,\n apiKey?: string\n): Promise<ModelPricing | null> {\n const normalizedProvider = provider.toLowerCase();\n\n // DeepSeek: Scrape pricing from documentation\n if (normalizedProvider === 'deepseek') {\n try {\n const response = await fetch('https://api-docs.deepseek.com/quick_start/pricing');\n if (!response.ok) {\n return null;\n }\n\n const html = await response.text();\n\n // Parse pricing from HTML (looking for pricing table or text)\n // DeepSeek pricing is typically listed as:\n // - deepseek-chat: $0.14 / $0.28 per million tokens\n // - deepseek-reasoner: $0.55 / $2.19 per million tokens\n\n // Try to extract pricing for the specific model\n const modelLower = model.toLowerCase();\n\n // For deepseek-chat, look for the first pricing entry\n if (modelLower.includes('chat')) {\n const match = html.match(/chat.*?\\$?0\\.14.*?\\$?0\\.28/i);\n if (match) {\n return {\n inputPerMillionTokens: 0.14,\n outputPerMillionTokens: 0.28,\n };\n }\n }\n\n // For deepseek-reasoner, look for reasoner pricing\n if (modelLower.includes('reasoner')) {\n const match = html.match(/reasoner.*?\\$?0\\.55.*?\\$?2\\.19/i);\n if (match) {\n return {\n inputPerMillionTokens: 0.55,\n outputPerMillionTokens: 2.19,\n };\n }\n }\n\n // Fallback to static if scraping fails\n return null;\n } catch (error) {\n // Silently fail and use static pricing\n return null;\n }\n }\n\n // Anthropic Models API (requires API key)\n if (normalizedProvider === 'anthropic' && apiKey) {\n try {\n const response = await fetch(`https://api.anthropic.com/v1/models/${model}`, {\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n });\n\n if (!response.ok) {\n return null;\n }\n\n const data = (await response.json()) as {\n pricing?: {\n input_price_per_million_tokens?: number;\n output_price_per_million_tokens?: number;\n };\n };\n\n if (\n data.pricing?.input_price_per_million_tokens != null &&\n data.pricing?.output_price_per_million_tokens != null\n ) {\n return {\n inputPerMillionTokens: data.pricing.input_price_per_million_tokens,\n outputPerMillionTokens: data.pricing.output_price_per_million_tokens,\n };\n }\n } catch (error) {\n // Silently fail and use static pricing\n return null;\n }\n }\n\n return null;\n}\n\n/**\n * Get pricing for a model (hybrid: API first, fallback to static)\n * Caches dynamic pricing for 24 hours\n */\nexport async function getModelPricing(\n provider: string,\n model: string,\n apiKey?: string\n): Promise<ModelPricing | null> {\n const cacheKey = `${provider}:${model}`;\n\n // Check cache first\n const cached = pricingCache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {\n return cached.pricing;\n }\n\n // Try to fetch dynamic pricing\n const dynamicPricing = await fetchDynamicPricing(provider, model, apiKey);\n if (dynamicPricing) {\n // Cache the result\n pricingCache.set(cacheKey, {\n pricing: dynamicPricing,\n timestamp: Date.now(),\n });\n return dynamicPricing;\n }\n\n // Fallback to static pricing\n const staticPricing = getStaticPricing(provider, model);\n if (staticPricing) {\n // Cache static pricing too (to avoid repeated lookups)\n pricingCache.set(cacheKey, {\n pricing: staticPricing,\n timestamp: Date.now(),\n });\n }\n\n return staticPricing;\n}\n\n/**\n * Clear pricing cache (useful for testing or forcing refresh)\n */\nexport function clearPricingCache(): void {\n pricingCache.clear();\n}\n","/**\n * Tool format converters\n * Handles conversion between LLMTool interface and provider-specific formats\n */\n\nimport { LLMTool } from '../ILLMProvider.js';\nimport { ToolCall } from '../../types/index.js';\n\n/**\n * Convert LLMTool to OpenAI function calling format\n * Used by: DeepSeek, OpenAI, Qwen (OpenAI-compatible providers)\n */\nexport function toOpenAITools(tools: LLMTool[]): unknown[] {\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.schema, // Already JSON Schema\n },\n }));\n}\n\n/**\n * Convert LLMTool to Anthropic tool format\n * Used by: Anthropic Claude API\n */\nexport function toAnthropicTools(tools: LLMTool[]): unknown[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: 'object',\n ...tool.schema, // Merge with existing schema\n },\n }));\n}\n\n/**\n * Parse tool calls from OpenAI response\n */\nexport function parseOpenAIToolCalls(response: {\n choices?: Array<{\n message?: {\n tool_calls?: Array<{\n id: string;\n type: string;\n function: {\n name: string;\n arguments: string;\n };\n }>;\n };\n }>;\n}): ToolCall[] {\n const toolCalls = response.choices?.[0]?.message?.tool_calls || [];\n\n return toolCalls.map((tc) => {\n let parsedArgs: Record<string, unknown>;\n try {\n parsedArgs = JSON.parse(tc.function.arguments);\n } catch {\n parsedArgs = {};\n }\n\n return {\n id: tc.id,\n name: tc.function.name,\n arguments: parsedArgs,\n };\n });\n}\n\n/**\n * Parse tool calls from Anthropic response\n */\nexport function parseAnthropicToolCalls(response: {\n content?: Array<\n | { type: 'text'; text: string }\n | {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n }\n >;\n}): ToolCall[] {\n const content = response.content || [];\n\n return content\n .filter(\n (block): block is Extract<typeof block, { type: 'tool_use' }> => block.type === 'tool_use'\n )\n .map((block) => ({\n id: block.id,\n name: block.name,\n arguments: block.input,\n }));\n}\n\n/**\n * Map OpenAI finish reason to standard format\n */\nexport function mapOpenAIFinishReason(reason: string): 'stop' | 'tool_calls' | 'length' | 'error' {\n switch (reason) {\n case 'stop':\n return 'stop';\n case 'tool_calls':\n return 'tool_calls';\n case 'length':\n return 'length';\n case 'content_filter':\n case 'insufficient_system_resource':\n return 'error';\n default:\n return 'error';\n }\n}\n\n/**\n * Map Anthropic stop reason to standard format\n */\nexport function mapAnthropicFinishReason(\n reason: string\n): 'stop' | 'tool_calls' | 'length' | 'error' {\n switch (reason) {\n case 'end_turn':\n return 'stop';\n case 'tool_use':\n return 'tool_calls';\n case 'max_tokens':\n return 'length';\n case 'stop_sequence':\n return 'stop';\n default:\n return 'error';\n }\n}\n","/**\n * Server-Sent Events (SSE) stream parsers\n * Handles different streaming formats from various providers\n */\n\nimport { ChatChunk } from '../../types/index.js';\n\n/**\n * Parse OpenAI-format SSE stream\n * Used by: DeepSeek, OpenAI, Qwen\n *\n * Format:\n * data: {\"choices\":[{\"delta\":{\"content\":\"hello\"}}]}\n * data: [DONE]\n */\nexport async function* parseOpenAIStream(stream: AsyncIterable<string>): AsyncGenerator<ChatChunk> {\n let buffer = '';\n\n for await (const chunk of stream) {\n buffer += chunk;\n\n // Split by newlines to get individual SSE messages\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Skip empty lines\n if (!trimmed) continue;\n\n // Check for [DONE] marker\n if (trimmed === 'data: [DONE]') {\n yield { content: '', done: true };\n return;\n }\n\n // Parse data: lines\n if (trimmed.startsWith('data: ')) {\n const jsonStr = trimmed.substring(6); // Remove 'data: ' prefix\n try {\n const data = JSON.parse(jsonStr) as {\n choices?: Array<{\n delta?: {\n content?: string;\n role?: string;\n };\n finish_reason?: string | null;\n }>;\n };\n\n const delta = data.choices?.[0]?.delta;\n const content = delta?.content || '';\n const finishReason = data.choices?.[0]?.finish_reason;\n\n if (content) {\n yield { content, done: false };\n }\n\n if (finishReason) {\n yield { content: '', done: true };\n return;\n }\n } catch (error) {\n // Skip malformed JSON\n continue;\n }\n }\n }\n }\n\n // Flush any remaining buffer\n if (buffer.trim()) {\n yield { content: '', done: true };\n }\n}\n\n/**\n * Parse Anthropic-format SSE stream\n * Used by: Anthropic Claude API\n *\n * Format:\n * event: message_start\n * data: {\"type\":\"message_start\"}\n *\n * event: content_block_delta\n * data: {\"delta\":{\"text\":\"hello\"}}\n *\n * event: message_stop\n * data: {}\n */\nexport async function* parseAnthropicStream(\n stream: AsyncIterable<string>\n): AsyncGenerator<ChatChunk> {\n let buffer = '';\n let currentEvent = '';\n\n for await (const chunk of stream) {\n buffer += chunk;\n\n // Split by double newlines to get individual SSE events\n const events = buffer.split('\\n\\n');\n\n // Keep the last incomplete event in buffer\n buffer = events.pop() || '';\n\n for (const event of events) {\n const lines = event.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (trimmed.startsWith('event: ')) {\n currentEvent = trimmed.substring(7);\n } else if (trimmed.startsWith('data: ')) {\n const jsonStr = trimmed.substring(6);\n\n try {\n const data = JSON.parse(jsonStr);\n\n // Handle content_block_delta events\n if (currentEvent === 'content_block_delta') {\n const content = data.delta?.text || '';\n if (content) {\n yield { content, done: false };\n }\n }\n\n // Handle content_block_start events\n if (currentEvent === 'content_block_start') {\n const content = data.content_block?.text || '';\n if (content) {\n yield { content, done: false };\n }\n }\n\n // Handle message_delta events (may contain usage info)\n if (currentEvent === 'message_delta') {\n // No content in message_delta, just metadata\n continue;\n }\n\n // Handle message_stop event\n if (currentEvent === 'message_stop') {\n yield { content: '', done: true };\n return;\n }\n\n // Handle error events\n if (currentEvent === 'error') {\n throw new Error(data.error?.message || 'Anthropic streaming error');\n }\n } catch (error) {\n // Skip malformed JSON or propagate errors\n if (currentEvent === 'error') {\n throw error;\n }\n continue;\n }\n }\n }\n }\n }\n\n // Flush any remaining buffer\n if (buffer.trim()) {\n yield { content: '', done: true };\n }\n}\n","/**\n * Anthropic Claude LLM Provider\n * Uses Claude's Messages API with Anthropic-specific format\n */\n\nimport { encoding_for_model, type Tiktoken } from 'tiktoken';\nimport { BaseLLMProvider } from './BaseLLMProvider.js';\nimport { ILLMProvider, LLMTool } from './ILLMProvider.js';\nimport { Message, ChatResponse, ChatChunk, LLMConfig } from '../types/index.js';\nimport { APIClient } from './utils/apiClient.js';\nimport { getStaticPricing } from './pricing/pricingData.js';\nimport {\n toAnthropicTools,\n parseAnthropicToolCalls,\n mapAnthropicFinishReason,\n} from './utils/toolFormatters.js';\nimport { parseAnthropicStream } from './utils/streamParsers.js';\nimport { ConfigurationError } from '../utils/errors.js';\n\nexport class AnthropicProvider extends BaseLLMProvider implements ILLMProvider {\n private apiClient: APIClient;\n private encoder: Tiktoken;\n\n constructor(config: LLMConfig) {\n super(config);\n\n const apiKey = config.apiKey || process.env.ANTHROPIC_API_KEY;\n if (!apiKey) {\n throw new ConfigurationError(\n 'ANTHROPIC_API_KEY not found in config or environment variables. ' +\n 'Please set ANTHROPIC_API_KEY in your .env file or pass it via config.'\n );\n }\n const baseURL = config.baseURL || 'https://api.anthropic.com';\n\n this.apiClient = new APIClient({\n baseURL,\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n 'Content-Type': 'application/json',\n },\n timeout: 60000,\n });\n\n // Use GPT-4 tokenizer as approximation (within 5% accuracy for Claude)\n this.encoder = encoding_for_model('gpt-4');\n }\n\n async chat(messages: Message[], tools?: LLMTool[]): Promise<ChatResponse> {\n return this.withRetry(async () => {\n const { system, messages: userMessages } = this.formatAnthropicMessages(messages);\n\n const requestBody: AnthropicChatRequest = {\n model: this.config.model,\n messages: userMessages,\n max_tokens: this.config.maxTokens,\n temperature: this.config.temperature,\n };\n\n // Add system message if present\n if (system) {\n requestBody.system = system;\n }\n\n // Add tools if present\n if (tools && tools.length > 0) {\n requestBody.tools = toAnthropicTools(tools);\n }\n\n const response = await this.apiClient.post<AnthropicChatResponse>(\n '/v1/messages',\n requestBody\n );\n\n return this.parseResponse(response);\n });\n }\n\n async *streamChat(messages: Message[], tools?: LLMTool[]): AsyncGenerator<ChatChunk> {\n const { system, messages: userMessages } = this.formatAnthropicMessages(messages);\n\n const requestBody: AnthropicChatRequest = {\n model: this.config.model,\n messages: userMessages,\n max_tokens: this.config.maxTokens,\n temperature: this.config.temperature,\n stream: true,\n };\n\n if (system) {\n requestBody.system = system;\n }\n\n if (tools && tools.length > 0) {\n requestBody.tools = toAnthropicTools(tools);\n }\n\n const stream = this.apiClient.stream('/v1/messages', requestBody);\n\n for await (const chunk of parseAnthropicStream(stream)) {\n yield chunk;\n }\n }\n\n countTokens(text: string): number {\n return this.encoder.encode(text).length;\n }\n\n calculateCost(inputTokens: number, outputTokens: number): number {\n const pricing = getStaticPricing('anthropic', this.config.model);\n if (!pricing) {\n return 0; // Unknown model, return 0 cost\n }\n\n return (\n (inputTokens / 1_000_000) * pricing.inputPerMillionTokens +\n (outputTokens / 1_000_000) * pricing.outputPerMillionTokens\n );\n }\n\n /**\n * Format messages for Anthropic API\n * Extracts system messages into separate parameter\n */\n private formatAnthropicMessages(messages: Message[]): {\n system?: string;\n messages: Array<{ role: string; content: string }>;\n } {\n const systemMessages = messages.filter((m) => m.role === 'system');\n const userMessages = messages.filter((m) => m.role !== 'system');\n\n const system =\n systemMessages.length > 0 ? systemMessages.map((m) => m.content).join('\\n\\n') : undefined;\n\n return {\n system,\n messages: userMessages.map((msg) => ({\n role: msg.role === 'assistant' ? 'assistant' : 'user',\n content: msg.content,\n })),\n };\n }\n\n /**\n * Parse Anthropic API response\n */\n private parseResponse(response: AnthropicChatResponse): ChatResponse {\n const content = response.content || [];\n const usage = response.usage;\n\n // Extract text content from content blocks\n const textContent = content\n .filter((block) => block.type === 'text')\n .map((block) => (block as { type: 'text'; text: string }).text)\n .join('');\n\n return {\n content: textContent,\n toolCalls: parseAnthropicToolCalls(response),\n finishReason: mapAnthropicFinishReason(response.stop_reason),\n usage: {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n totalTokens: usage.input_tokens + usage.output_tokens,\n },\n };\n }\n}\n\n/**\n * Anthropic API request type\n */\ninterface AnthropicChatRequest {\n model: string;\n messages: Array<{\n role: string;\n content: string;\n }>;\n max_tokens: number;\n temperature?: number;\n system?: string;\n tools?: unknown[];\n stream?: boolean;\n}\n\n/**\n * Anthropic API response type\n */\ninterface AnthropicChatResponse {\n id: string;\n type: string;\n role: string;\n content: Array<\n | { type: 'text'; text: string }\n | {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n }\n >;\n model: string;\n stop_reason: string;\n stop_sequence?: string | null;\n usage: {\n input_tokens: number;\n output_tokens: number;\n };\n}\n","/**\n * Factory for creating LLM provider instances\n */\n\nimport { ILLMProvider } from './ILLMProvider.js';\nimport { LLMConfig } from '../types/index.js';\nimport { DeepSeekProvider } from './DeepSeekProvider.js';\nimport { AnthropicProvider } from './AnthropicProvider.js';\n\nexport class ProviderFactory {\n static create(config: LLMConfig): ILLMProvider {\n switch (config.provider.toLowerCase()) {\n case 'deepseek':\n return new DeepSeekProvider(config);\n case 'anthropic':\n return new AnthropicProvider(config);\n case 'openai':\n throw new Error(\n 'OpenAI provider coming soon - see roadmap Phase 3. ' +\n 'In the meantime, you can use DeepSeek which is OpenAI-compatible.'\n );\n case 'google':\n case 'gemini':\n throw new Error('Google/Gemini provider coming soon - see roadmap Phase 3.');\n case 'qwen':\n throw new Error(\n 'Qwen provider coming soon - see roadmap Phase 3. ' +\n 'In the meantime, you can use DeepSeek which is similar.'\n );\n case 'ollama':\n throw new Error('Ollama provider coming soon - see roadmap Phase 3.');\n default:\n throw new Error(`Unsupported provider: ${config.provider}`);\n }\n }\n}\n","/**\n * Configuration schemas with Zod validation\n */\n\nimport { z } from 'zod';\n\n// Theme options matching Claude Code + Mimir Nordic theme\nexport const ThemeSchema = z.enum([\n 'mimir',\n 'dark',\n 'light',\n 'dark-colorblind',\n 'light-colorblind',\n 'dark-ansi',\n 'light-ansi',\n]);\n\nexport const UIConfigSchema = z.object({\n theme: ThemeSchema.default('mimir'),\n syntaxHighlighting: z.boolean().default(true),\n showLineNumbers: z.boolean().default(true),\n compactMode: z.boolean().default(false),\n // Autocomplete behavior\n autocompleteAutoShow: z.boolean().default(true), // Automatically show autocomplete when suggestions available\n autocompleteExecuteOnSelect: z.boolean().default(true), // Execute command immediately if no more parameters needed\n});\n\nexport const LLMConfigSchema = z.object({\n provider: z.enum(['deepseek', 'anthropic', 'openai', 'google', 'gemini', 'qwen', 'ollama']),\n model: z.string(),\n apiKey: z.string().optional(),\n baseURL: z.string().optional(),\n temperature: z.number().min(0).max(2).default(0.7),\n maxTokens: z.number().default(4096),\n});\n\nexport const PermissionsConfigSchema = z.object({\n autoAccept: z.boolean().default(false),\n acceptRiskLevel: z.enum(['low', 'medium', 'high', 'critical']).default('medium'),\n alwaysAcceptCommands: z\n .array(z.string())\n .nullable()\n .default([])\n .transform((val) => val ?? []),\n});\n\n// Helper to accept string or array of strings for shortcuts\nconst shortcutSchema = z\n .union([z.string(), z.array(z.string()).min(1)])\n .transform((val) => (Array.isArray(val) ? val : [val]));\n\nexport const KeyBindingsConfigSchema = z.object({\n // Core actions - Ctrl+C and Escape share the same 'interrupt' logic\n interrupt: shortcutSchema.default(['Ctrl+C', 'Escape']),\n accept: shortcutSchema.default(['Enter']),\n\n // Mode and navigation\n modeSwitch: shortcutSchema.default(['Shift+Tab']),\n editCommand: shortcutSchema.default(['Ctrl+E']),\n\n // Autocomplete/tooltips\n showTooltip: shortcutSchema.default(['Ctrl+Space', 'Tab']),\n navigateUp: shortcutSchema.default(['ArrowUp']),\n navigateDown: shortcutSchema.default(['ArrowDown']),\n\n // Utility\n help: shortcutSchema.default(['?']),\n clearScreen: shortcutSchema.default(['Ctrl+L']),\n undo: shortcutSchema.default(['Ctrl+Z']),\n redo: shortcutSchema.default(['Ctrl+Y']), // Auto-converted to Cmd+Shift+Z on Mac\n\n // Legacy/deprecated - kept for backwards compatibility\n reject: shortcutSchema.default([]).optional(),\n});\n\nexport const DockerConfigSchema = z.object({\n enabled: z.boolean().default(true),\n baseImage: z.string().default('alpine:latest'),\n cpuLimit: z.number().optional(),\n memoryLimit: z.string().optional(),\n});\n\nexport const MonitoringConfigSchema = z.object({\n metricsRetentionDays: z.number().min(1).max(365).default(90),\n enableHealthChecks: z.boolean().default(true),\n healthCheckIntervalSeconds: z.number().min(10).max(3600).default(300),\n slowOperationThresholdMs: z.number().min(100).default(5000),\n batchWriteIntervalSeconds: z.number().min(1).max(60).default(10),\n});\n\nexport const BudgetConfigSchema = z.object({\n enabled: z.boolean().default(false),\n dailyLimit: z.number().min(0).optional(), // USD\n weeklyLimit: z.number().min(0).optional(),\n monthlyLimit: z.number().min(0).optional(),\n warningThreshold: z.number().min(0).max(1).default(0.8), // 80%\n});\n\nexport const RateLimitConfigSchema = z.object({\n enabled: z.boolean().default(true),\n commandsPerMinute: z.number().min(1).default(60),\n toolExecutionsPerMinute: z.number().min(1).default(30),\n llmCallsPerMinute: z.number().min(1).default(20),\n maxFileSizeMB: z.number().min(1).default(100),\n});\n\nexport const ConfigSchema = z.object({\n llm: LLMConfigSchema,\n permissions: PermissionsConfigSchema,\n keyBindings: KeyBindingsConfigSchema,\n docker: DockerConfigSchema,\n ui: UIConfigSchema,\n monitoring: MonitoringConfigSchema,\n budget: BudgetConfigSchema,\n rateLimit: RateLimitConfigSchema,\n});\n\nexport type Theme = z.infer<typeof ThemeSchema>;\nexport type UIConfig = z.infer<typeof UIConfigSchema>;\nexport type LLMConfig = z.infer<typeof LLMConfigSchema>;\nexport type PermissionsConfig = z.infer<typeof PermissionsConfigSchema>;\nexport type KeyBindingsConfig = z.infer<typeof KeyBindingsConfigSchema>;\nexport type DockerConfig = z.infer<typeof DockerConfigSchema>;\nexport type MonitoringConfig = z.infer<typeof MonitoringConfigSchema>;\nexport type BudgetConfig = z.infer<typeof BudgetConfigSchema>;\nexport type RateLimitConfig = z.infer<typeof RateLimitConfigSchema>;\nexport type Config = z.infer<typeof ConfigSchema>;\n","/**\n * Logging utility using winston\n */\n\nimport winston from 'winston';\nimport DailyRotateFile from 'winston-daily-rotate-file';\nimport fs from 'fs';\nimport path from 'path';\n\nexport type LogLevel = 'error' | 'warn' | 'info' | 'debug';\n\nexport class Logger {\n private logger: winston.Logger;\n private fileLoggingEnabled = false;\n private consoleTransport: winston.transport;\n\n constructor(logDir = '.mimir/logs') {\n // Resolve to absolute path for clarity\n const absoluteLogDir = path.resolve(process.cwd(), logDir);\n\n // Attempt to create log directory (synchronous to work in constructor)\n // Gracefully degrade to console-only logging if this fails\n try {\n if (!fs.existsSync(absoluteLogDir)) {\n fs.mkdirSync(absoluteLogDir, { recursive: true });\n }\n this.fileLoggingEnabled = true;\n } catch (error) {\n // Degrade gracefully - warn but don't crash\n console.warn(\n `[Logger] Warning: Failed to create log directory at ${absoluteLogDir}. File logging disabled. Error: ${error}`\n );\n this.fileLoggingEnabled = false;\n }\n\n // Build transports array conditionally\n // Create console transport (can be disabled later for Ink UI)\n this.consoleTransport = new winston.transports.Console({\n format: winston.format.combine(winston.format.colorize(), winston.format.simple()),\n });\n\n const transports: winston.transport[] = [this.consoleTransport];\n\n // Only add file transports if directory creation succeeded\n if (this.fileLoggingEnabled) {\n transports.push(\n // Error logs with daily rotation\n new DailyRotateFile({\n dirname: absoluteLogDir,\n filename: '%DATE%-error.log',\n datePattern: 'YYYYMMDD',\n level: 'error',\n maxSize: '10m', // Rotate when file reaches 10MB\n maxFiles: '30d', // Keep logs for 30 days\n zippedArchive: true, // Compress old logs\n }),\n // Combined logs with daily rotation\n new DailyRotateFile({\n dirname: absoluteLogDir,\n filename: '%DATE%.log',\n datePattern: 'YYYYMMDD',\n maxSize: '10m', // Rotate when file reaches 10MB\n maxFiles: '30d', // Keep logs for 30 days\n zippedArchive: true, // Compress old logs\n })\n );\n }\n\n this.logger = winston.createLogger({\n level: process.env.LOG_LEVEL || 'info',\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.errors({ stack: true }),\n winston.format.json()\n ),\n transports,\n });\n }\n\n error(message: string, meta?: Record<string, unknown>): void {\n this.logger.error(message, meta);\n }\n\n warn(message: string, meta?: Record<string, unknown>): void {\n this.logger.warn(message, meta);\n }\n\n info(message: string, meta?: Record<string, unknown>): void {\n this.logger.info(message, meta);\n }\n\n debug(message: string, meta?: Record<string, unknown>): void {\n this.logger.debug(message, meta);\n }\n\n /**\n * Disable console logging (useful when Ink UI is active)\n */\n disableConsole(): void {\n this.logger.remove(this.consoleTransport);\n }\n\n /**\n * Enable console logging\n */\n enableConsole(): void {\n if (!this.logger.transports.includes(this.consoleTransport)) {\n this.logger.add(this.consoleTransport);\n }\n }\n}\n\n// Singleton instance\nexport const logger = new Logger();\n","/**\n * Allowlist loader for team-shared command permissions\n * Loads from .mimir/allowlist.yml\n */\n\nimport { IFileSystem } from '../platform/IFileSystem.js';\nimport { logger } from '../utils/logger.js';\nimport yaml from 'yaml';\nimport path from 'path';\nimport { z } from 'zod';\n\n/**\n * Allowlist schema\n */\nexport const AllowlistSchema = z.object({\n // Command patterns that are always allowed\n commands: z.array(z.string()).default([]),\n\n // File patterns that can be modified without confirmation\n files: z.array(z.string()).default([]),\n\n // Network destinations that are allowed\n urls: z.array(z.string()).default([]),\n\n // Environment variables that can be accessed\n envVars: z.array(z.string()).default([]),\n\n // Specific bash commands that are safe\n bashCommands: z.array(z.string()).default([]),\n});\n\nexport type Allowlist = z.infer<typeof AllowlistSchema>;\n\nexport class AllowlistLoader {\n constructor(private fs: IFileSystem) {}\n\n /**\n * Load allowlist from project .mimir/allowlist.yml\n */\n async loadProjectAllowlist(projectRoot: string): Promise<Allowlist | null> {\n const allowlistPath = path.join(projectRoot, '.mimir', 'allowlist.yml');\n return await this.loadAllowlistFile(allowlistPath, 'project');\n }\n\n /**\n * Load allowlist from global ~/.mimir/allowlist.yml\n */\n async loadGlobalAllowlist(): Promise<Allowlist | null> {\n const homeDir = process.env.HOME || process.env.USERPROFILE || '~';\n const allowlistPath = path.join(homeDir, '.mimir', 'allowlist.yml');\n return await this.loadAllowlistFile(allowlistPath, 'global');\n }\n\n /**\n * Load and parse allowlist file\n */\n private async loadAllowlistFile(\n filePath: string,\n scope: 'global' | 'project'\n ): Promise<Allowlist | null> {\n try {\n if (!(await this.fs.exists(filePath))) {\n logger.debug(`No ${scope} allowlist found`, { path: filePath });\n return null;\n }\n\n const content = await this.fs.readFile(filePath);\n const parsed = yaml.parse(content) as unknown;\n\n // Validate schema\n const allowlist = AllowlistSchema.parse(parsed);\n\n logger.info(`Loaded ${scope} allowlist`, {\n path: filePath,\n commands: allowlist.commands.length,\n files: allowlist.files.length,\n urls: allowlist.urls.length,\n });\n\n return allowlist;\n } catch (error) {\n logger.error(`Failed to load ${scope} allowlist`, {\n path: filePath,\n error,\n });\n return null;\n }\n }\n\n /**\n * Merge multiple allowlists (global + project)\n * Project allowlist takes precedence\n */\n merge(global: Allowlist | null, project: Allowlist | null): Allowlist {\n const merged: Allowlist = {\n commands: [],\n files: [],\n urls: [],\n envVars: [],\n bashCommands: [],\n };\n\n // Merge global\n if (global) {\n merged.commands.push(...global.commands);\n merged.files.push(...global.files);\n merged.urls.push(...global.urls);\n merged.envVars.push(...global.envVars);\n merged.bashCommands.push(...global.bashCommands);\n }\n\n // Merge project (deduplicates)\n if (project) {\n // Use Set to deduplicate\n merged.commands = [...new Set([...merged.commands, ...project.commands])];\n merged.files = [...new Set([...merged.files, ...project.files])];\n merged.urls = [...new Set([...merged.urls, ...project.urls])];\n merged.envVars = [...new Set([...merged.envVars, ...project.envVars])];\n merged.bashCommands = [...new Set([...merged.bashCommands, ...project.bashCommands])];\n }\n\n return merged;\n }\n\n /**\n * Create example allowlist file\n */\n async createExample(filePath: string, scope: 'global' | 'project'): Promise<void> {\n const exampleContent = scope === 'global' ? this.getGlobalExample() : this.getProjectExample();\n\n try {\n const dir = path.dirname(filePath);\n if (!(await this.fs.exists(dir))) {\n await this.fs.mkdir(dir, { recursive: true });\n }\n\n await this.fs.writeFile(filePath, exampleContent);\n logger.info(`Created example ${scope} allowlist`, { path: filePath });\n } catch (error) {\n logger.error(`Failed to create example allowlist`, {\n path: filePath,\n error,\n });\n throw error;\n }\n }\n\n /**\n * Get example global allowlist\n */\n private getGlobalExample(): string {\n return `# Global Allowlist\n# Commands, files, and operations that are safe across all projects\n\n# Commands that don't require permission prompt\ncommands:\n - '/status' # Git status\n - '/diff' # Git diff\n - '/help' # Show help\n - '/version' # Show version\n - '/doctor' # System diagnostics\n\n# Safe bash commands\nbashCommands:\n - 'git status'\n - 'git diff'\n - 'git log'\n - 'ls'\n - 'pwd'\n - 'echo *'\n - 'cat *.md'\n\n# Files that can be modified without confirmation (use globs)\nfiles:\n - '**/*.md' # Documentation files\n - '**/*.txt' # Text files\n - '**/README.*' # README files\n\n# URLs that can be accessed without confirmation\nurls:\n - 'https://api.github.com/**'\n - 'https://registry.npmjs.org/**'\n\n# Environment variables that can be read\nenvVars:\n - 'NODE_ENV'\n - 'PATH'\n - 'USER'\n - 'HOME'\n`;\n }\n\n /**\n * Get example project allowlist\n */\n private getProjectExample(): string {\n return `# Project Allowlist\n# Team-shared permissions for this project\n# Commit this file to version control for consistent team experience\n\n# Custom slash commands that are safe to run\ncommands:\n - '/test' # Run test suite\n - '/lint' # Run linter\n - '/build' # Build project\n - '/test-coverage' # Run tests with coverage\n\n# Safe bash commands specific to this project\nbashCommands:\n - 'yarn test'\n - 'yarn lint'\n - 'yarn build'\n - 'npm run test'\n - 'npm run lint'\n\n# Files that can be auto-formatted or modified\nfiles:\n - 'src/**/*.ts' # TypeScript source files\n - 'src/**/*.tsx' # React TypeScript files\n - 'tests/**/*.ts' # Test files\n - '*.json' # JSON config files\n - '.prettierrc.*' # Prettier config\n - '.eslintrc.*' # ESLint config\n\n# API endpoints used by this project\nurls:\n - 'https://api.example.com/**'\n - 'https://staging.example.com/**'\n\n# Environment variables specific to this project\nenvVars:\n - 'API_KEY'\n - 'DATABASE_URL'\n - 'REDIS_URL'\n`;\n }\n}\n","/**\n * Configuration loader with hierarchy support\n * Priority: CLI flags > env vars > project config > global config > defaults\n */\n\nimport { Config, ConfigSchema } from './schemas.js';\nimport { IFileSystem } from '../platform/IFileSystem.js';\nimport { AllowlistLoader, Allowlist } from './AllowlistLoader.js';\nimport yaml from 'yaml';\nimport path from 'path';\nimport os from 'os';\nimport dotenv from 'dotenv';\nimport { logger } from '../utils/logger.js';\n\nexport interface ConfigLoadOptions {\n projectRoot?: string;\n cliFlags?: Partial<Config>;\n}\n\nexport interface ConfigLoadResult {\n config: Config;\n allowlist: Allowlist;\n}\n\nexport class ConfigLoader {\n private allowlistLoader: AllowlistLoader;\n\n constructor(private fs: IFileSystem) {\n this.allowlistLoader = new AllowlistLoader(fs);\n }\n\n /**\n * Load configuration with full hierarchy:\n * 1. Default config\n * 2. Global (~/.mimir/config.yml)\n * 3. Project (.mimir/config.yml)\n * 4. Environment variables (.env)\n * 5. CLI flags\n *\n * Also loads allowlist from:\n * 1. Global (~/.mimir/allowlist.yml)\n * 2. Project (.mimir/allowlist.yml)\n */\n async load(options: ConfigLoadOptions = {}): Promise<ConfigLoadResult> {\n // 1. Start with defaults\n let config = this.getDefaults();\n\n // 2. Load global config\n const globalConfig = await this.loadGlobalConfig();\n if (globalConfig) {\n config = this.merge(config, globalConfig);\n }\n\n // 3. Load project config\n if (options.projectRoot) {\n const projectConfig = await this.loadProjectConfig(options.projectRoot);\n if (projectConfig) {\n config = this.merge(config, projectConfig);\n }\n }\n\n // 4. Load .env file\n const envConfig = this.loadEnvConfig(options.projectRoot);\n if (envConfig) {\n config = this.merge(config, envConfig);\n }\n\n // 5. Apply CLI flags\n if (options.cliFlags) {\n config = this.merge(config, options.cliFlags);\n }\n\n // Validate final config\n const validatedConfig = ConfigSchema.parse(config);\n\n // Load allowlists\n const globalAllowlist = await this.allowlistLoader.loadGlobalAllowlist();\n const projectAllowlist = options.projectRoot\n ? await this.allowlistLoader.loadProjectAllowlist(options.projectRoot)\n : null;\n\n const mergedAllowlist = this.allowlistLoader.merge(globalAllowlist, projectAllowlist);\n\n // Merge allowlist commands with config.yml alwaysAcceptCommands\n if (mergedAllowlist.commands.length > 0) {\n validatedConfig.permissions.alwaysAcceptCommands = [\n ...new Set([\n ...validatedConfig.permissions.alwaysAcceptCommands,\n ...mergedAllowlist.commands,\n ]),\n ];\n }\n\n return {\n config: validatedConfig,\n allowlist: mergedAllowlist,\n };\n }\n\n private getDefaults(): Config {\n // Platform-specific defaults\n const isWindows = process.platform === 'win32';\n\n return {\n llm: {\n provider: 'deepseek',\n model: 'deepseek-chat',\n temperature: 0.7,\n maxTokens: 4096,\n },\n permissions: {\n autoAccept: false,\n acceptRiskLevel: 'medium',\n alwaysAcceptCommands: [],\n },\n keyBindings: {\n interrupt: ['Ctrl+C', 'Escape'],\n accept: ['Enter'],\n modeSwitch: ['Shift+Tab'],\n editCommand: ['Ctrl+E'],\n // Windows: Ctrl+Space is intercepted by terminal - use Tab only\n // macOS/Linux: Both work\n showTooltip: isWindows ? ['Tab'] : ['Ctrl+Space', 'Tab'],\n navigateUp: ['ArrowUp'],\n navigateDown: ['ArrowDown'],\n help: ['?'],\n clearScreen: ['Ctrl+L'],\n undo: ['Ctrl+Z'],\n redo: ['Ctrl+Y'],\n },\n docker: {\n enabled: true,\n baseImage: 'alpine:latest',\n },\n ui: {\n theme: 'mimir',\n syntaxHighlighting: true,\n showLineNumbers: true,\n compactMode: false,\n autocompleteAutoShow: true,\n autocompleteExecuteOnSelect: true,\n },\n monitoring: {\n metricsRetentionDays: 90,\n enableHealthChecks: true,\n healthCheckIntervalSeconds: 300,\n slowOperationThresholdMs: 5000,\n batchWriteIntervalSeconds: 10,\n },\n budget: {\n enabled: false,\n warningThreshold: 0.8,\n },\n rateLimit: {\n enabled: true,\n commandsPerMinute: 60,\n toolExecutionsPerMinute: 30,\n llmCallsPerMinute: 20,\n maxFileSizeMB: 100,\n },\n };\n }\n\n private async loadGlobalConfig(): Promise<Partial<Config> | null> {\n try {\n const configPath = path.join(os.homedir(), '.mimir', 'config.yml');\n if (!(await this.fs.exists(configPath))) {\n return null;\n }\n const content = await this.fs.readFile(configPath);\n return yaml.parse(content) as Partial<Config>;\n } catch (error) {\n logger.warn('Failed to load global config', { error });\n return null;\n }\n }\n\n private async loadProjectConfig(projectRoot: string): Promise<Partial<Config> | null> {\n try {\n const configPath = path.join(projectRoot, '.mimir', 'config.yml');\n if (!(await this.fs.exists(configPath))) {\n return null;\n }\n const content = await this.fs.readFile(configPath);\n return yaml.parse(content) as Partial<Config>;\n } catch (error) {\n logger.warn('Failed to load project config', { error });\n return null;\n }\n }\n\n private loadEnvConfig(projectRoot?: string): Partial<Config> | null {\n try {\n // Load .env from project root if provided, otherwise cwd\n const envPath = projectRoot ? path.join(projectRoot, '.env') : '.env';\n dotenv.config({ path: envPath });\n\n const envConfig: Record<string, unknown> = {};\n\n // Map environment variables to config structure\n if (\n process.env.DEEPSEEK_API_KEY ||\n process.env.ANTHROPIC_API_KEY ||\n process.env.OPENAI_API_KEY\n ) {\n const provider = process.env.LLM_PROVIDER?.toUpperCase();\n const apiKey = provider ? process.env[`${provider}_API_KEY`] : undefined;\n const baseURL = provider ? process.env[`${provider}_BASE_URL`] : undefined;\n\n if (apiKey || baseURL) {\n envConfig.llm = {\n ...(apiKey && { apiKey }),\n ...(baseURL && { baseURL }),\n };\n }\n }\n\n if (process.env.DOCKER_ENABLED) {\n envConfig.docker = {\n enabled: process.env.DOCKER_ENABLED === 'true',\n };\n }\n\n if (process.env.MIMIR_THEME) {\n envConfig.ui = {\n theme: process.env.MIMIR_THEME,\n };\n }\n\n return Object.keys(envConfig).length > 0 ? (envConfig as Partial<Config>) : null;\n } catch (error) {\n logger.warn('Failed to load .env config', { error });\n return null;\n }\n }\n\n private merge(base: Config, override: Partial<Config>): Config {\n return {\n llm: { ...base.llm, ...override.llm },\n permissions: { ...base.permissions, ...override.permissions },\n keyBindings: { ...base.keyBindings, ...override.keyBindings },\n docker: { ...base.docker, ...override.docker },\n ui: { ...base.ui, ...override.ui },\n monitoring: { ...base.monitoring, ...override.monitoring },\n budget: { ...base.budget, ...override.budget },\n rateLimit: { ...base.rateLimit, ...override.rateLimit },\n };\n }\n\n async save(\n config: Partial<Config>,\n scope: 'global' | 'project',\n projectRoot?: string\n ): Promise<void> {\n const configPath =\n scope === 'global'\n ? path.join(os.homedir(), '.mimir', 'config.yml')\n : path.join(projectRoot || process.cwd(), '.mimir', 'config.yml');\n\n const configDir = path.dirname(configPath);\n\n // Ensure directory exists\n if (!(await this.fs.exists(configDir))) {\n await this.fs.mkdir(configDir, { recursive: true });\n }\n\n const yamlContent = yaml.stringify(config);\n await this.fs.writeFile(configPath, yamlContent);\n logger.info(`Config saved to ${configPath}`);\n }\n\n validate(config: unknown): Config {\n return ConfigSchema.parse(config);\n }\n}\n","/**\n * FileSystemAdapter - Cross-platform file system implementation\n * Uses Node.js fs/promises + globby for file operations\n */\n\nimport { IFileSystem, Stats } from './IFileSystem.js';\nimport fs from 'fs/promises';\nimport { globby } from 'globby';\n\nexport class FileSystemAdapter implements IFileSystem {\n async readFile(path: string, encoding: BufferEncoding = 'utf-8'): Promise<string> {\n return fs.readFile(path, encoding);\n }\n\n async writeFile(\n path: string,\n content: string,\n encoding: BufferEncoding = 'utf-8'\n ): Promise<void> {\n await fs.writeFile(path, content, encoding);\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n await fs.mkdir(path, options);\n }\n\n async readdir(path: string): Promise<string[]> {\n return fs.readdir(path);\n }\n\n async stat(path: string): Promise<Stats> {\n const stats = await fs.stat(path);\n return {\n isFile: () => stats.isFile(),\n isDirectory: () => stats.isDirectory(),\n size: stats.size,\n mtime: stats.mtime,\n };\n }\n\n async unlink(path: string): Promise<void> {\n await fs.unlink(path);\n }\n\n async rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n await fs.rmdir(path, options);\n }\n\n async copyFile(src: string, dest: string): Promise<void> {\n await fs.copyFile(src, dest);\n }\n\n async glob(pattern: string, options?: { cwd?: string; ignore?: string[] }): Promise<string[]> {\n return globby(pattern, {\n cwd: options?.cwd,\n ignore: options?.ignore,\n });\n }\n}\n"],"mappings":"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","names":["encoding_for_model","encoding_for_model","path","z","fs","yaml","path","fs","path","yaml","fs","path"]}
1
+ {"version":3,"sources":["../src/types/index.ts","../src/core/Agent.ts","../src/core/Tool.ts","../src/core/RiskAssessor.ts","../src/core/PermissionManager.ts","../src/utils/errors.ts","../src/providers/BaseLLMProvider.ts","../src/providers/DeepSeekProvider.ts","../src/providers/utils/apiClient.ts","../src/providers/pricing/pricingData.ts","../src/providers/utils/toolFormatters.ts","../src/providers/utils/streamParsers.ts","../src/providers/AnthropicProvider.ts","../src/providers/ProviderFactory.ts","../src/config/schemas.ts","../src/utils/logger.ts","../src/config/AllowlistLoader.ts","../src/config/ConfigLoader.ts","../src/platform/FileSystemAdapter.ts"],"sourcesContent":["/**\n * Core type definitions for Mimir\n */\n\n// Message types\nexport interface Message {\n role: 'system' | 'user' | 'assistant';\n content: string;\n name?: string;\n toolCalls?: ToolCall[];\n metadata?: MessageMetadata;\n}\n\nexport interface MessageMetadata {\n timestamp?: number; // Unix timestamp in milliseconds\n duration?: number; // Duration in milliseconds\n usage?: {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n };\n cost?: number; // Cost in USD\n model?: string; // Model used for this message\n provider?: string; // Provider used for this message\n}\n\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface ToolResult {\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\n// Chat response types\nexport interface ChatResponse {\n content: string;\n toolCalls?: ToolCall[];\n finishReason: 'stop' | 'tool_calls' | 'length' | 'error';\n usage: {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n };\n}\n\nexport interface ChatChunk {\n content: string;\n done: boolean;\n}\n\n// Risk assessment\nexport type RiskLevel = 'low' | 'medium' | 'high' | 'critical';\n\nexport interface PermissionDecision {\n command: string;\n riskLevel: RiskLevel;\n decision: 'allow' | 'deny' | 'always' | 'never';\n timestamp: number;\n}\n\n// Agent action types\nexport interface Action {\n type: 'tool_call' | 'finish';\n toolName?: string;\n arguments?: Record<string, unknown>;\n result?: unknown;\n}\n\nexport interface Observation {\n type: 'tool_result' | 'permission_denied' | 'error';\n data?: unknown;\n error?: string;\n}\n\n// Configuration types (will be refined with Zod schemas)\nexport interface LLMConfig {\n provider: string;\n model: string;\n apiKey?: string;\n baseURL?: string;\n temperature: number;\n maxTokens: number;\n}\n\nexport interface PermissionsConfig {\n autoAccept: boolean;\n acceptRiskLevel: RiskLevel;\n alwaysAcceptCommands: string[];\n}\n\nexport interface DockerConfig {\n enabled: boolean;\n baseImage: string;\n cpuLimit?: number;\n memoryLimit?: string;\n}\n\n// Result type for error handling\nexport type Result<T, E = Error> = { ok: true; value: T } | { ok: false; error: E };\n\n// Utility type helpers\nexport const createOk = <T>(value: T): Result<T> => ({ ok: true, value });\nexport const createErr = <E = Error>(error: E): Result<never, E> => ({ ok: false, error });\n","/**\n * Core Agent implementation (ReAct loop)\n */\n\nimport { ILLMProvider } from '../providers/ILLMProvider.js';\nimport { ToolRegistry } from './Tool.js';\nimport { Message, Action, Observation, Result, createOk, createErr } from '../types/index.js';\n\nexport interface AgentConfig {\n maxIterations: number;\n budgetLimit?: number;\n}\n\nexport class Agent {\n // private provider: ILLMProvider; // TODO: Will be used when LLM integration is implemented\n private toolRegistry: ToolRegistry;\n private config: AgentConfig;\n private conversationHistory: Message[] = [];\n private currentIteration = 0;\n\n constructor(_provider: ILLMProvider, toolRegistry: ToolRegistry, config: AgentConfig) {\n // this.provider = provider; // TODO: Uncomment when implementing LLM integration\n this.toolRegistry = toolRegistry;\n this.config = config;\n }\n\n async run(task: string): Promise<Result<unknown>> {\n this.conversationHistory = [\n {\n role: 'system',\n content: 'You are a helpful coding assistant.',\n },\n {\n role: 'user',\n content: task,\n },\n ];\n\n while (this.currentIteration < this.config.maxIterations) {\n // 1. REASON: Get next action from LLM\n const action = await this.reason();\n\n if (action.type === 'finish') {\n return createOk(action.result);\n }\n\n // 2. ACT: Execute tool\n const observation = await this.act(action);\n\n // 3. OBSERVE: Record result\n await this.observe(observation);\n\n this.currentIteration++;\n }\n\n return createErr(new Error('Max iterations reached'));\n }\n\n private async reason(): Promise<Action> {\n // TODO: Implement LLM reasoning\n // For now, return a finish action\n return {\n type: 'finish',\n result: 'Task completed',\n };\n }\n\n private async act(action: Action): Promise<Observation> {\n if (!action.toolName || !action.arguments) {\n return {\n type: 'error',\n error: 'Invalid action: missing toolName or arguments',\n };\n }\n\n // TODO: Check permissions before execution\n\n const result = await this.toolRegistry.execute(action.toolName, action.arguments);\n\n return {\n type: 'tool_result',\n data: result,\n };\n }\n\n private async observe(observation: Observation): Promise<void> {\n // TODO: Update conversation history with observation\n // For now, just a placeholder\n this.conversationHistory.push({\n role: 'assistant',\n content: JSON.stringify(observation),\n });\n }\n}\n","/**\n * Tool interface and registry\n */\n\nimport { z } from 'zod';\nimport { ToolResult } from '../types/index.js';\n\nexport interface Tool {\n name: string;\n description: string;\n schema: z.ZodObject<never>;\n execute(args: unknown): Promise<ToolResult>;\n}\n\nexport class ToolRegistry {\n private tools: Map<string, Tool> = new Map();\n\n register(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n unregister(toolName: string): void {\n this.tools.delete(toolName);\n }\n\n get(toolName: string): Tool | undefined {\n return this.tools.get(toolName);\n }\n\n getAll(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n has(toolName: string): boolean {\n return this.tools.has(toolName);\n }\n\n async execute(toolName: string, args: unknown): Promise<ToolResult> {\n const tool = this.get(toolName);\n if (!tool) {\n return {\n success: false,\n error: `Tool not found: ${toolName}`,\n };\n }\n\n try {\n // Validate arguments with Zod schema\n const validatedArgs = tool.schema.parse(args);\n return await tool.execute(validatedArgs);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n}\n","/**\n * Risk assessment for commands with detailed explanations\n */\n\nimport { RiskLevel } from '../types/index.js';\n\nexport interface RiskAssessment {\n level: RiskLevel;\n reasons: string[];\n score: number; // 0-100, higher = more risky\n}\n\nexport class RiskAssessor {\n // Critical patterns - system-destroying commands\n private criticalPatterns = [\n { pattern: /rm\\s+-rf\\s+\\/(?!tmp|var\\/tmp)/, reason: 'Deletes root filesystem' },\n { pattern: /format\\s+[a-z]:/i, reason: 'Formats entire drive' },\n { pattern: /del\\s+\\/[sf]/i, reason: 'Deletes system files (Windows)' },\n { pattern: /shutdown|reboot|poweroff/, reason: 'System shutdown/reboot' },\n { pattern: /dd\\s+.*of=\\/dev\\/(sda|hda|nvme)/, reason: 'Direct disk write (can destroy data)' },\n { pattern: /mkfs/, reason: 'Formats filesystem' },\n {\n pattern: /(>|vim|vi|nano|emacs|edit).*\\/etc\\/(passwd|shadow|sudoers)/,\n reason: 'Modifies critical system files',\n },\n { pattern: /curl.*\\|\\s*(bash|sh|python)/, reason: 'Executes remote script without inspection' },\n { pattern: /wget.*\\|\\s*(bash|sh|python)/, reason: 'Executes remote script without inspection' },\n ];\n\n // High risk patterns - destructive but recoverable\n private highPatterns = [\n { pattern: /rm\\s+-rf\\s+(?!\\/($|\\s))/, reason: 'Recursive force delete' },\n { pattern: /sudo\\s+rm/, reason: 'Elevated permissions file deletion' },\n { pattern: /git\\s+push\\s+--force/, reason: 'Force pushes can overwrite history' },\n { pattern: /npm\\s+publish/, reason: 'Publishes package to registry' },\n { pattern: /docker\\s+rmi.*-f/, reason: 'Force removes Docker images' },\n { pattern: /docker\\s+system\\s+prune\\s+-a/, reason: 'Removes all unused Docker data' },\n { pattern: /git\\s+reset\\s+--hard\\s+HEAD~/, reason: 'Permanently deletes commits' },\n { pattern: /git\\s+clean\\s+-fd/, reason: 'Deletes untracked files' },\n { pattern: /chmod\\s+777/, reason: 'Makes files world-writable (security risk)' },\n { pattern: /chown\\s+-R/, reason: 'Recursive ownership change' },\n ];\n\n // Medium risk patterns - potentially problematic\n private mediumPatterns = [\n { pattern: /npm\\s+install/, reason: 'Installs dependencies (can include malicious packages)' },\n { pattern: /yarn\\s+add/, reason: 'Installs dependencies (can include malicious packages)' },\n { pattern: /pip\\s+install/, reason: 'Installs Python packages' },\n { pattern: /git\\s+push/, reason: 'Pushes changes to remote' },\n { pattern: /docker\\s+run/, reason: 'Runs Docker container' },\n { pattern: /docker\\s+exec/, reason: 'Executes command in container' },\n { pattern: /ssh\\s+/, reason: 'Remote connection' },\n { pattern: /scp\\s+/, reason: 'Remote file transfer' },\n { pattern: /rsync\\s+/, reason: 'File synchronization' },\n { pattern: /npm\\s+run\\s+build/, reason: 'Runs build scripts' },\n ];\n\n /**\n * Assess risk level and provide detailed reasons\n */\n assess(command: string): RiskAssessment {\n const reasons: string[] = [];\n let maxScore = 0;\n\n // Check critical patterns\n for (const { pattern, reason } of this.criticalPatterns) {\n if (pattern.test(command)) {\n reasons.push(`🔴 CRITICAL: ${reason}`);\n maxScore = Math.max(maxScore, 100);\n }\n }\n\n // Check high patterns\n for (const { pattern, reason } of this.highPatterns) {\n if (pattern.test(command)) {\n reasons.push(`🟠 HIGH: ${reason}`);\n maxScore = Math.max(maxScore, 75);\n }\n }\n\n // Check medium patterns\n for (const { pattern, reason } of this.mediumPatterns) {\n if (pattern.test(command)) {\n reasons.push(`🟡 MEDIUM: ${reason}`);\n maxScore = Math.max(maxScore, 50);\n }\n }\n\n // Additional checks\n const additionalRisks = this.assessAdditionalRisks(command);\n reasons.push(...additionalRisks.reasons);\n maxScore = Math.max(maxScore, additionalRisks.score);\n\n // Determine level from score\n const level = this.scoreToLevel(maxScore);\n\n // If no specific risks found, it's low risk\n if (reasons.length === 0) {\n reasons.push('No specific risks detected');\n }\n\n return {\n level,\n reasons,\n score: maxScore,\n };\n }\n\n /**\n * Additional risk checks (file size, complexity, etc.)\n */\n private assessAdditionalRisks(command: string): { reasons: string[]; score: number } {\n const reasons: string[] = [];\n let score = 0;\n\n // Check command length (very long commands are suspicious)\n if (command.length > 500) {\n reasons.push('⚠️ Command is unusually long (possible obfuscation)');\n score = Math.max(score, 30);\n }\n\n // Check for multiple commands chained\n const chainCount = (command.match(/[;&|]+/g) || []).length;\n if (chainCount > 3) {\n reasons.push(`⚠️ Multiple chained commands (${chainCount} chains)`);\n score = Math.max(score, 40);\n }\n\n // Check for redirection to /dev/null (hiding output)\n if (/>\\/dev\\/null|2>&1/.test(command)) {\n reasons.push('⚠️ Output redirected (hiding results)');\n score = Math.max(score, 20);\n }\n\n // Check for sudo without specific command\n if (/sudo\\s*$/.test(command)) {\n reasons.push('🟠 Elevated permissions without specific command');\n score = Math.max(score, 60);\n }\n\n // Check for environment variable manipulation\n if (/export\\s+|setenv\\s+/.test(command) && /PATH/.test(command)) {\n reasons.push('🟡 Modifies PATH environment variable');\n score = Math.max(score, 45);\n }\n\n // Check for Base64 encoding (possible obfuscation)\n if (/base64\\s+--decode|echo\\s+.*\\|\\s*base64/.test(command)) {\n reasons.push('⚠️ Uses Base64 encoding (possible obfuscation)');\n score = Math.max(score, 35);\n }\n\n // Check for eval (code execution)\n if (/eval\\s+/.test(command)) {\n reasons.push('🟠 Uses eval (dynamic code execution)');\n score = Math.max(score, 65);\n }\n\n return { reasons, score };\n }\n\n /**\n * Convert numeric score to risk level\n */\n private scoreToLevel(score: number): RiskLevel {\n if (score >= 80) return 'critical';\n if (score >= 60) return 'high';\n if (score >= 30) return 'medium';\n return 'low';\n }\n\n /**\n * Check if command matches any allowed patterns\n */\n isAllowed(command: string, allowlist: string[]): boolean {\n return allowlist.some((pattern) => {\n try {\n // Try as regex\n const regex = new RegExp(pattern);\n return regex.test(command);\n } catch {\n // Fallback to simple string match\n return command.includes(pattern);\n }\n });\n }\n\n /**\n * Check if command matches any blocked patterns\n */\n isBlocked(command: string, blocklist: string[]): boolean {\n return blocklist.some((pattern) => {\n try {\n const regex = new RegExp(pattern);\n return regex.test(command);\n } catch {\n return command.includes(pattern);\n }\n });\n }\n\n /**\n * Get a human-readable summary of the risk assessment\n */\n getSummary(assessment: RiskAssessment): string {\n const levelEmoji = {\n low: '🟢',\n medium: '🟡',\n high: '🟠',\n critical: '🔴',\n };\n\n const lines = [\n `${levelEmoji[assessment.level]} Risk Level: ${assessment.level.toUpperCase()} (score: ${assessment.score}/100)`,\n '',\n 'Reasons:',\n ...assessment.reasons.map((r) => ` • ${r}`),\n ];\n\n return lines.join('\\n');\n }\n}\n","/**\n * Permission system for command execution\n */\n\nimport { RiskLevel, PermissionDecision } from '../types/index.js';\nimport { RiskAssessor, RiskAssessment } from './RiskAssessor.js';\n\nexport class PermissionManager {\n private riskAssessor: RiskAssessor;\n private allowlist: Set<string> = new Set();\n private blocklist: Set<string> = new Set();\n private auditLog: PermissionDecision[] = [];\n\n constructor() {\n this.riskAssessor = new RiskAssessor();\n }\n\n async checkPermission(command: string): Promise<{\n allowed: boolean;\n assessment: RiskAssessment;\n }> {\n const assessment = this.riskAssessor.assess(command);\n\n // Check blocklist\n if (this.riskAssessor.isBlocked(command, Array.from(this.blocklist))) {\n this.logDecision(command, assessment.level, 'deny');\n return { allowed: false, assessment };\n }\n\n // Check allowlist\n if (this.riskAssessor.isAllowed(command, Array.from(this.allowlist))) {\n this.logDecision(command, assessment.level, 'allow');\n return { allowed: true, assessment };\n }\n\n // TODO: Prompt user for permission\n // For now, auto-deny high and critical\n if (assessment.level === 'high' || assessment.level === 'critical') {\n this.logDecision(command, assessment.level, 'deny');\n return { allowed: false, assessment };\n }\n\n this.logDecision(command, assessment.level, 'allow');\n return { allowed: true, assessment };\n }\n\n addToAllowlist(pattern: string): void {\n this.allowlist.add(pattern);\n }\n\n addToBlocklist(pattern: string): void {\n this.blocklist.add(pattern);\n }\n\n private logDecision(\n command: string,\n riskLevel: RiskLevel,\n decision: 'allow' | 'deny' | 'always' | 'never'\n ): void {\n this.auditLog.push({\n command,\n riskLevel,\n decision,\n timestamp: Date.now(),\n });\n }\n\n getAuditLog(): PermissionDecision[] {\n return [...this.auditLog];\n }\n}\n","/**\n * Custom error classes\n */\n\nexport class MimirError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MimirError';\n }\n}\n\nexport class ConfigurationError extends MimirError {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigurationError';\n }\n}\n\nexport class ProviderError extends MimirError {\n constructor(\n message: string,\n public readonly provider?: string\n ) {\n super(message);\n this.name = 'ProviderError';\n }\n}\n\nexport class ToolExecutionError extends MimirError {\n constructor(\n message: string,\n public readonly toolName?: string\n ) {\n super(message);\n this.name = 'ToolExecutionError';\n }\n}\n\nexport class PermissionDeniedError extends MimirError {\n constructor(\n message: string,\n public readonly command?: string\n ) {\n super(message);\n this.name = 'PermissionDeniedError';\n }\n}\n\nexport class DockerError extends MimirError {\n constructor(message: string) {\n super(message);\n this.name = 'DockerError';\n }\n}\n\nexport class NetworkError extends MimirError {\n constructor(\n message: string,\n public readonly statusCode?: number\n ) {\n super(message);\n this.name = 'NetworkError';\n }\n}\n\nexport class RateLimitError extends MimirError {\n constructor(\n message: string,\n public readonly retryAfter?: number\n ) {\n super(message);\n this.name = 'RateLimitError';\n }\n}\n","/**\n * Base LLM Provider implementation\n * Contains common logic for retry, error handling, etc.\n */\n\nimport { ILLMProvider, LLMTool } from './ILLMProvider.js';\nimport { Message, ChatResponse, ChatChunk, LLMConfig } from '../types/index.js';\nimport { NetworkError } from '../utils/errors.js';\n\nexport interface RetryConfig {\n maxRetries: number;\n retryDelay: number;\n backoffMultiplier: number;\n}\n\nexport abstract class BaseLLMProvider implements ILLMProvider {\n protected config: LLMConfig;\n protected retryConfig: RetryConfig;\n\n constructor(config: LLMConfig, retryConfig?: RetryConfig) {\n this.config = config;\n this.retryConfig = retryConfig ?? {\n maxRetries: 3,\n retryDelay: 1000,\n backoffMultiplier: 2,\n };\n }\n\n abstract chat(messages: Message[], tools?: LLMTool[]): Promise<ChatResponse>;\n abstract streamChat(messages: Message[], tools?: LLMTool[]): AsyncGenerator<ChatChunk>;\n abstract countTokens(text: string): number;\n abstract calculateCost(inputTokens: number, outputTokens: number): number;\n\n getProviderName(): string {\n return this.config.provider;\n }\n\n getModelName(): string {\n return this.config.model;\n }\n\n /**\n * Retry wrapper for API calls\n * Only retries on NetworkError (5xx server errors)\n * Does NOT retry on auth errors, rate limits, or client errors\n */\n protected async withRetry<T>(fn: () => Promise<T>): Promise<T> {\n let lastError: Error | undefined;\n let delay = this.retryConfig.retryDelay;\n\n for (let attempt = 0; attempt <= this.retryConfig.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n // Only retry on NetworkError (transient server issues)\n // Don't retry on auth errors, rate limits, or client errors\n const shouldRetry = error instanceof NetworkError && attempt < this.retryConfig.maxRetries;\n\n if (shouldRetry) {\n await this.sleep(delay);\n delay *= this.retryConfig.backoffMultiplier;\n } else {\n // For non-retryable errors, throw immediately\n throw lastError;\n }\n }\n }\n\n throw lastError;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * DeepSeek LLM Provider\n * OpenAI-compatible API with cost-effective pricing\n */\n\nimport { encode } from 'gpt-tokenizer';\nimport { BaseLLMProvider } from './BaseLLMProvider.js';\nimport { ILLMProvider, LLMTool } from './ILLMProvider.js';\nimport { Message, ChatResponse, ChatChunk, LLMConfig } from '../types/index.js';\nimport { APIClient } from './utils/apiClient.js';\nimport { getStaticPricing } from './pricing/pricingData.js';\nimport {\n toOpenAITools,\n parseOpenAIToolCalls,\n mapOpenAIFinishReason,\n} from './utils/toolFormatters.js';\nimport { parseOpenAIStream } from './utils/streamParsers.js';\nimport { ConfigurationError } from '../utils/errors.js';\n\nexport class DeepSeekProvider extends BaseLLMProvider implements ILLMProvider {\n private apiClient: APIClient;\n\n constructor(config: LLMConfig) {\n super(config);\n\n const apiKey = config.apiKey || process.env.DEEPSEEK_API_KEY;\n if (!apiKey) {\n throw new ConfigurationError(\n 'DEEPSEEK_API_KEY not found in config or environment variables. ' +\n 'Please set DEEPSEEK_API_KEY in your .env file or pass it via config.'\n );\n }\n\n const baseURL = config.baseURL || 'https://api.deepseek.com';\n\n this.apiClient = new APIClient({\n baseURL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n timeout: 60000,\n });\n }\n\n async chat(messages: Message[], tools?: LLMTool[]): Promise<ChatResponse> {\n return this.withRetry(async () => {\n const requestBody = {\n model: this.config.model,\n messages: this.formatMessages(messages),\n tools: tools ? toOpenAITools(tools) : undefined,\n temperature: this.config.temperature,\n max_tokens: this.config.maxTokens,\n };\n\n const response = await this.apiClient.post<DeepSeekChatResponse>(\n '/chat/completions',\n requestBody\n );\n\n return this.parseResponse(response);\n });\n }\n\n async *streamChat(messages: Message[], tools?: LLMTool[]): AsyncGenerator<ChatChunk> {\n const requestBody = {\n model: this.config.model,\n messages: this.formatMessages(messages),\n tools: tools ? toOpenAITools(tools) : undefined,\n temperature: this.config.temperature,\n max_tokens: this.config.maxTokens,\n stream: true,\n };\n\n const stream = this.apiClient.stream('/chat/completions', requestBody);\n\n for await (const chunk of parseOpenAIStream(stream)) {\n yield chunk;\n }\n }\n\n countTokens(text: string): number {\n return encode(text).length;\n }\n\n calculateCost(inputTokens: number, outputTokens: number): number {\n const pricing = getStaticPricing('deepseek', this.config.model);\n if (!pricing) {\n return 0; // Unknown model, return 0 cost\n }\n\n return (\n (inputTokens / 1_000_000) * pricing.inputPerMillionTokens +\n (outputTokens / 1_000_000) * pricing.outputPerMillionTokens\n );\n }\n\n /**\n * Format messages for OpenAI-compatible API\n */\n private formatMessages(\n messages: Message[]\n ): Array<{ role: string; content: string; name?: string }> {\n return messages.map((msg) => ({\n role: msg.role,\n content: msg.content,\n name: msg.name,\n }));\n }\n\n /**\n * Parse DeepSeek API response\n */\n private parseResponse(response: DeepSeekChatResponse): ChatResponse {\n const choice = response.choices[0];\n const message = choice?.message;\n const usage = response.usage;\n\n if (!choice || !message) {\n throw new Error('Invalid response from DeepSeek API: missing choice or message');\n }\n\n return {\n content: message.content || '',\n toolCalls: parseOpenAIToolCalls(response),\n finishReason: mapOpenAIFinishReason(choice.finish_reason),\n usage: {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n },\n };\n }\n}\n\n/**\n * DeepSeek API response type\n */\ninterface DeepSeekChatResponse {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: string;\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: string;\n function: {\n name: string;\n arguments: string;\n };\n }>;\n };\n finish_reason: string;\n }>;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_cache_hit_tokens?: number;\n prompt_cache_miss_tokens?: number;\n };\n}\n","/**\n * HTTP API client wrapper around axios\n * Handles request/response, error mapping, and streaming\n */\n\nimport axios, { AxiosInstance, AxiosError, AxiosResponse } from 'axios';\nimport { ProviderError, NetworkError, RateLimitError } from '../../utils/errors.js';\n\nexport interface APIClientConfig {\n baseURL: string;\n headers: Record<string, string>;\n timeout?: number;\n}\n\nexport class APIClient {\n private axiosInstance: AxiosInstance;\n private providerName: string;\n\n constructor(config: APIClientConfig) {\n this.axiosInstance = axios.create({\n baseURL: config.baseURL,\n headers: config.headers,\n timeout: config.timeout || 60000, // 60 seconds default\n });\n\n // Extract provider name from base URL for error messages\n this.providerName = this.extractProviderName(config.baseURL);\n }\n\n /**\n * POST request with JSON payload\n */\n async post<T>(endpoint: string, data: unknown): Promise<T> {\n try {\n const response: AxiosResponse<T> = await this.axiosInstance.post(endpoint, data);\n return response.data;\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n /**\n * GET request\n */\n async get<T>(endpoint: string): Promise<T> {\n try {\n const response: AxiosResponse<T> = await this.axiosInstance.get(endpoint);\n return response.data;\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n /**\n * Stream request for Server-Sent Events (SSE)\n * Returns async iterable of string chunks\n */\n async *stream(endpoint: string, data: unknown): AsyncGenerator<string, void, unknown> {\n try {\n const response = await this.axiosInstance.post(endpoint, data, {\n responseType: 'stream',\n headers: {\n Accept: 'text/event-stream',\n },\n });\n\n const stream = response.data;\n\n // Read stream chunks\n for await (const chunk of stream) {\n const chunkStr = chunk.toString('utf-8');\n yield chunkStr;\n }\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n /**\n * Map axios errors to custom error types\n */\n private mapError(error: unknown): Error {\n if (!axios.isAxiosError(error)) {\n return error as Error;\n }\n\n const axiosError = error as AxiosError;\n const status = axiosError.response?.status;\n const errorData = axiosError.response?.data as {\n error?: { message?: string };\n message?: string;\n };\n const message = errorData?.error?.message || errorData?.message || axiosError.message;\n\n // Rate limit error (429)\n if (status === 429) {\n const retryAfter = parseInt((axiosError.response?.headers['retry-after'] as string) || '60');\n return new RateLimitError(`${this.providerName} rate limit exceeded: ${message}`, retryAfter);\n }\n\n // Auth errors (401, 403)\n if (status === 401 || status === 403) {\n return new ProviderError(\n `${this.providerName} authentication failed: ${message}`,\n this.providerName\n );\n }\n\n // Server errors (5xx)\n if (status && status >= 500) {\n return new NetworkError(`${this.providerName} server error: ${message}`, status);\n }\n\n // Client errors (4xx)\n if (status && status >= 400) {\n return new ProviderError(`${this.providerName} request error: ${message}`, this.providerName);\n }\n\n // Network/timeout errors\n if (axiosError.code === 'ECONNABORTED' || axiosError.code === 'ETIMEDOUT') {\n return new NetworkError(`${this.providerName} request timeout: ${message}`);\n }\n\n // Generic provider error\n return new ProviderError(`${this.providerName} error: ${message}`, this.providerName);\n }\n\n /**\n * Extract provider name from base URL\n */\n private extractProviderName(baseURL: string): string {\n try {\n const url = new URL(baseURL);\n const hostname = url.hostname;\n\n if (hostname.includes('deepseek')) return 'DeepSeek';\n if (hostname.includes('anthropic')) return 'Anthropic';\n if (hostname.includes('openai')) return 'OpenAI';\n if (hostname.includes('google')) return 'Google';\n\n return hostname;\n } catch {\n return 'Unknown Provider';\n }\n }\n}\n","/**\n * Pricing data for LLM providers\n * Hybrid approach: Fetch from API first, fallback to static table\n */\n\nexport interface ModelPricing {\n inputPerMillionTokens: number;\n outputPerMillionTokens: number;\n}\n\n// Static fallback pricing (updated as of 2025-12-25)\nconst STATIC_PRICING_TABLE: Record<string, Record<string, ModelPricing>> = {\n deepseek: {\n 'deepseek-chat': {\n inputPerMillionTokens: 0.14,\n outputPerMillionTokens: 0.28,\n },\n 'deepseek-reasoner': {\n inputPerMillionTokens: 0.55,\n outputPerMillionTokens: 2.19,\n },\n },\n anthropic: {\n 'claude-opus-4-5-20251101': {\n inputPerMillionTokens: 15,\n outputPerMillionTokens: 75,\n },\n 'claude-opus-4-5': {\n inputPerMillionTokens: 15,\n outputPerMillionTokens: 75,\n },\n 'claude-sonnet-4-5-20250929': {\n inputPerMillionTokens: 3,\n outputPerMillionTokens: 15,\n },\n 'claude-sonnet-4-5': {\n inputPerMillionTokens: 3,\n outputPerMillionTokens: 15,\n },\n 'claude-haiku-4-5': {\n inputPerMillionTokens: 1,\n outputPerMillionTokens: 5,\n },\n 'claude-3-7-sonnet-latest': {\n inputPerMillionTokens: 3,\n outputPerMillionTokens: 15,\n },\n 'claude-3-5-haiku-latest': {\n inputPerMillionTokens: 1,\n outputPerMillionTokens: 5,\n },\n },\n};\n\n// In-memory cache for dynamic pricing (TTL: 24 hours)\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface PricingCacheEntry {\n pricing: ModelPricing;\n timestamp: number;\n}\n\nconst pricingCache = new Map<string, PricingCacheEntry>();\n\n/**\n * Get static pricing for a provider/model\n */\nexport function getStaticPricing(provider: string, model: string): ModelPricing | null {\n const providerPricing = STATIC_PRICING_TABLE[provider.toLowerCase()];\n if (!providerPricing) {\n return null;\n }\n\n return providerPricing[model] || null;\n}\n\n/**\n * Fetch dynamic pricing from provider API or documentation\n */\nexport async function fetchDynamicPricing(\n provider: string,\n model: string,\n apiKey?: string\n): Promise<ModelPricing | null> {\n const normalizedProvider = provider.toLowerCase();\n\n // DeepSeek: Scrape pricing from documentation\n if (normalizedProvider === 'deepseek') {\n try {\n const response = await fetch('https://api-docs.deepseek.com/quick_start/pricing');\n if (!response.ok) {\n return null;\n }\n\n const html = await response.text();\n\n // Parse pricing from HTML (looking for pricing table or text)\n // DeepSeek pricing is typically listed as:\n // - deepseek-chat: $0.14 / $0.28 per million tokens\n // - deepseek-reasoner: $0.55 / $2.19 per million tokens\n\n // Try to extract pricing for the specific model\n const modelLower = model.toLowerCase();\n\n // For deepseek-chat, look for the first pricing entry\n if (modelLower.includes('chat')) {\n const match = html.match(/chat.*?\\$?0\\.14.*?\\$?0\\.28/i);\n if (match) {\n return {\n inputPerMillionTokens: 0.14,\n outputPerMillionTokens: 0.28,\n };\n }\n }\n\n // For deepseek-reasoner, look for reasoner pricing\n if (modelLower.includes('reasoner')) {\n const match = html.match(/reasoner.*?\\$?0\\.55.*?\\$?2\\.19/i);\n if (match) {\n return {\n inputPerMillionTokens: 0.55,\n outputPerMillionTokens: 2.19,\n };\n }\n }\n\n // Fallback to static if scraping fails\n return null;\n } catch (error) {\n // Silently fail and use static pricing\n return null;\n }\n }\n\n // Anthropic Models API (requires API key)\n if (normalizedProvider === 'anthropic' && apiKey) {\n try {\n const response = await fetch(`https://api.anthropic.com/v1/models/${model}`, {\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n });\n\n if (!response.ok) {\n return null;\n }\n\n const data = (await response.json()) as {\n pricing?: {\n input_price_per_million_tokens?: number;\n output_price_per_million_tokens?: number;\n };\n };\n\n if (\n data.pricing?.input_price_per_million_tokens != null &&\n data.pricing?.output_price_per_million_tokens != null\n ) {\n return {\n inputPerMillionTokens: data.pricing.input_price_per_million_tokens,\n outputPerMillionTokens: data.pricing.output_price_per_million_tokens,\n };\n }\n } catch (error) {\n // Silently fail and use static pricing\n return null;\n }\n }\n\n return null;\n}\n\n/**\n * Get pricing for a model (hybrid: API first, fallback to static)\n * Caches dynamic pricing for 24 hours\n */\nexport async function getModelPricing(\n provider: string,\n model: string,\n apiKey?: string\n): Promise<ModelPricing | null> {\n const cacheKey = `${provider}:${model}`;\n\n // Check cache first\n const cached = pricingCache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {\n return cached.pricing;\n }\n\n // Try to fetch dynamic pricing\n const dynamicPricing = await fetchDynamicPricing(provider, model, apiKey);\n if (dynamicPricing) {\n // Cache the result\n pricingCache.set(cacheKey, {\n pricing: dynamicPricing,\n timestamp: Date.now(),\n });\n return dynamicPricing;\n }\n\n // Fallback to static pricing\n const staticPricing = getStaticPricing(provider, model);\n if (staticPricing) {\n // Cache static pricing too (to avoid repeated lookups)\n pricingCache.set(cacheKey, {\n pricing: staticPricing,\n timestamp: Date.now(),\n });\n }\n\n return staticPricing;\n}\n\n/**\n * Clear pricing cache (useful for testing or forcing refresh)\n */\nexport function clearPricingCache(): void {\n pricingCache.clear();\n}\n","/**\n * Tool format converters\n * Handles conversion between LLMTool interface and provider-specific formats\n */\n\nimport { LLMTool } from '../ILLMProvider.js';\nimport { ToolCall } from '../../types/index.js';\n\n/**\n * Convert LLMTool to OpenAI function calling format\n * Used by: DeepSeek, OpenAI, Qwen (OpenAI-compatible providers)\n */\nexport function toOpenAITools(tools: LLMTool[]): unknown[] {\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.schema, // Already JSON Schema\n },\n }));\n}\n\n/**\n * Convert LLMTool to Anthropic tool format\n * Used by: Anthropic Claude API\n */\nexport function toAnthropicTools(tools: LLMTool[]): unknown[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: 'object',\n ...tool.schema, // Merge with existing schema\n },\n }));\n}\n\n/**\n * Parse tool calls from OpenAI response\n */\nexport function parseOpenAIToolCalls(response: {\n choices?: Array<{\n message?: {\n tool_calls?: Array<{\n id: string;\n type: string;\n function: {\n name: string;\n arguments: string;\n };\n }>;\n };\n }>;\n}): ToolCall[] {\n const toolCalls = response.choices?.[0]?.message?.tool_calls || [];\n\n return toolCalls.map((tc) => {\n let parsedArgs: Record<string, unknown>;\n try {\n parsedArgs = JSON.parse(tc.function.arguments);\n } catch {\n parsedArgs = {};\n }\n\n return {\n id: tc.id,\n name: tc.function.name,\n arguments: parsedArgs,\n };\n });\n}\n\n/**\n * Parse tool calls from Anthropic response\n */\nexport function parseAnthropicToolCalls(response: {\n content?: Array<\n | { type: 'text'; text: string }\n | {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n }\n >;\n}): ToolCall[] {\n const content = response.content || [];\n\n return content\n .filter(\n (block): block is Extract<typeof block, { type: 'tool_use' }> => block.type === 'tool_use'\n )\n .map((block) => ({\n id: block.id,\n name: block.name,\n arguments: block.input,\n }));\n}\n\n/**\n * Map OpenAI finish reason to standard format\n */\nexport function mapOpenAIFinishReason(reason: string): 'stop' | 'tool_calls' | 'length' | 'error' {\n switch (reason) {\n case 'stop':\n return 'stop';\n case 'tool_calls':\n return 'tool_calls';\n case 'length':\n return 'length';\n case 'content_filter':\n case 'insufficient_system_resource':\n return 'error';\n default:\n return 'error';\n }\n}\n\n/**\n * Map Anthropic stop reason to standard format\n */\nexport function mapAnthropicFinishReason(\n reason: string\n): 'stop' | 'tool_calls' | 'length' | 'error' {\n switch (reason) {\n case 'end_turn':\n return 'stop';\n case 'tool_use':\n return 'tool_calls';\n case 'max_tokens':\n return 'length';\n case 'stop_sequence':\n return 'stop';\n default:\n return 'error';\n }\n}\n","/**\n * Server-Sent Events (SSE) stream parsers\n * Handles different streaming formats from various providers\n */\n\nimport { ChatChunk } from '../../types/index.js';\n\n/**\n * Parse OpenAI-format SSE stream\n * Used by: DeepSeek, OpenAI, Qwen\n *\n * Format:\n * data: {\"choices\":[{\"delta\":{\"content\":\"hello\"}}]}\n * data: [DONE]\n */\nexport async function* parseOpenAIStream(stream: AsyncIterable<string>): AsyncGenerator<ChatChunk> {\n let buffer = '';\n\n for await (const chunk of stream) {\n buffer += chunk;\n\n // Split by newlines to get individual SSE messages\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Skip empty lines\n if (!trimmed) continue;\n\n // Check for [DONE] marker\n if (trimmed === 'data: [DONE]') {\n yield { content: '', done: true };\n return;\n }\n\n // Parse data: lines\n if (trimmed.startsWith('data: ')) {\n const jsonStr = trimmed.substring(6); // Remove 'data: ' prefix\n try {\n const data = JSON.parse(jsonStr) as {\n choices?: Array<{\n delta?: {\n content?: string;\n role?: string;\n };\n finish_reason?: string | null;\n }>;\n };\n\n const delta = data.choices?.[0]?.delta;\n const content = delta?.content || '';\n const finishReason = data.choices?.[0]?.finish_reason;\n\n if (content) {\n yield { content, done: false };\n }\n\n if (finishReason) {\n yield { content: '', done: true };\n return;\n }\n } catch (error) {\n // Skip malformed JSON\n continue;\n }\n }\n }\n }\n\n // Flush any remaining buffer\n if (buffer.trim()) {\n yield { content: '', done: true };\n }\n}\n\n/**\n * Parse Anthropic-format SSE stream\n * Used by: Anthropic Claude API\n *\n * Format:\n * event: message_start\n * data: {\"type\":\"message_start\"}\n *\n * event: content_block_delta\n * data: {\"delta\":{\"text\":\"hello\"}}\n *\n * event: message_stop\n * data: {}\n */\nexport async function* parseAnthropicStream(\n stream: AsyncIterable<string>\n): AsyncGenerator<ChatChunk> {\n let buffer = '';\n let currentEvent = '';\n\n for await (const chunk of stream) {\n buffer += chunk;\n\n // Split by double newlines to get individual SSE events\n const events = buffer.split('\\n\\n');\n\n // Keep the last incomplete event in buffer\n buffer = events.pop() || '';\n\n for (const event of events) {\n const lines = event.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (trimmed.startsWith('event: ')) {\n currentEvent = trimmed.substring(7);\n } else if (trimmed.startsWith('data: ')) {\n const jsonStr = trimmed.substring(6);\n\n try {\n const data = JSON.parse(jsonStr);\n\n // Handle content_block_delta events\n if (currentEvent === 'content_block_delta') {\n const content = data.delta?.text || '';\n if (content) {\n yield { content, done: false };\n }\n }\n\n // Handle content_block_start events\n if (currentEvent === 'content_block_start') {\n const content = data.content_block?.text || '';\n if (content) {\n yield { content, done: false };\n }\n }\n\n // Handle message_delta events (may contain usage info)\n if (currentEvent === 'message_delta') {\n // No content in message_delta, just metadata\n continue;\n }\n\n // Handle message_stop event\n if (currentEvent === 'message_stop') {\n yield { content: '', done: true };\n return;\n }\n\n // Handle error events\n if (currentEvent === 'error') {\n throw new Error(data.error?.message || 'Anthropic streaming error');\n }\n } catch (error) {\n // Skip malformed JSON or propagate errors\n if (currentEvent === 'error') {\n throw error;\n }\n continue;\n }\n }\n }\n }\n }\n\n // Flush any remaining buffer\n if (buffer.trim()) {\n yield { content: '', done: true };\n }\n}\n","/**\n * Anthropic Claude LLM Provider\n * Uses Claude's Messages API with Anthropic-specific format\n */\n\nimport { encode } from 'gpt-tokenizer';\nimport { BaseLLMProvider } from './BaseLLMProvider.js';\nimport { ILLMProvider, LLMTool } from './ILLMProvider.js';\nimport { Message, ChatResponse, ChatChunk, LLMConfig } from '../types/index.js';\nimport { APIClient } from './utils/apiClient.js';\nimport { getStaticPricing } from './pricing/pricingData.js';\nimport {\n toAnthropicTools,\n parseAnthropicToolCalls,\n mapAnthropicFinishReason,\n} from './utils/toolFormatters.js';\nimport { parseAnthropicStream } from './utils/streamParsers.js';\nimport { ConfigurationError } from '../utils/errors.js';\n\nexport class AnthropicProvider extends BaseLLMProvider implements ILLMProvider {\n private apiClient: APIClient;\n\n constructor(config: LLMConfig) {\n super(config);\n\n const apiKey = config.apiKey || process.env.ANTHROPIC_API_KEY;\n if (!apiKey) {\n throw new ConfigurationError(\n 'ANTHROPIC_API_KEY not found in config or environment variables. ' +\n 'Please set ANTHROPIC_API_KEY in your .env file or pass it via config.'\n );\n }\n const baseURL = config.baseURL || 'https://api.anthropic.com';\n\n this.apiClient = new APIClient({\n baseURL,\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n 'Content-Type': 'application/json',\n },\n timeout: 60000,\n });\n }\n\n async chat(messages: Message[], tools?: LLMTool[]): Promise<ChatResponse> {\n return this.withRetry(async () => {\n const { system, messages: userMessages } = this.formatAnthropicMessages(messages);\n\n const requestBody: AnthropicChatRequest = {\n model: this.config.model,\n messages: userMessages,\n max_tokens: this.config.maxTokens,\n temperature: this.config.temperature,\n };\n\n // Add system message if present\n if (system) {\n requestBody.system = system;\n }\n\n // Add tools if present\n if (tools && tools.length > 0) {\n requestBody.tools = toAnthropicTools(tools);\n }\n\n const response = await this.apiClient.post<AnthropicChatResponse>(\n '/v1/messages',\n requestBody\n );\n\n return this.parseResponse(response);\n });\n }\n\n async *streamChat(messages: Message[], tools?: LLMTool[]): AsyncGenerator<ChatChunk> {\n const { system, messages: userMessages } = this.formatAnthropicMessages(messages);\n\n const requestBody: AnthropicChatRequest = {\n model: this.config.model,\n messages: userMessages,\n max_tokens: this.config.maxTokens,\n temperature: this.config.temperature,\n stream: true,\n };\n\n if (system) {\n requestBody.system = system;\n }\n\n if (tools && tools.length > 0) {\n requestBody.tools = toAnthropicTools(tools);\n }\n\n const stream = this.apiClient.stream('/v1/messages', requestBody);\n\n for await (const chunk of parseAnthropicStream(stream)) {\n yield chunk;\n }\n }\n\n countTokens(text: string): number {\n return encode(text).length;\n }\n\n calculateCost(inputTokens: number, outputTokens: number): number {\n const pricing = getStaticPricing('anthropic', this.config.model);\n if (!pricing) {\n return 0; // Unknown model, return 0 cost\n }\n\n return (\n (inputTokens / 1_000_000) * pricing.inputPerMillionTokens +\n (outputTokens / 1_000_000) * pricing.outputPerMillionTokens\n );\n }\n\n /**\n * Format messages for Anthropic API\n * Extracts system messages into separate parameter\n */\n private formatAnthropicMessages(messages: Message[]): {\n system?: string;\n messages: Array<{ role: string; content: string }>;\n } {\n const systemMessages = messages.filter((m) => m.role === 'system');\n const userMessages = messages.filter((m) => m.role !== 'system');\n\n const system =\n systemMessages.length > 0 ? systemMessages.map((m) => m.content).join('\\n\\n') : undefined;\n\n return {\n system,\n messages: userMessages.map((msg) => ({\n role: msg.role === 'assistant' ? 'assistant' : 'user',\n content: msg.content,\n })),\n };\n }\n\n /**\n * Parse Anthropic API response\n */\n private parseResponse(response: AnthropicChatResponse): ChatResponse {\n const content = response.content || [];\n const usage = response.usage;\n\n // Extract text content from content blocks\n const textContent = content\n .filter((block) => block.type === 'text')\n .map((block) => (block as { type: 'text'; text: string }).text)\n .join('');\n\n return {\n content: textContent,\n toolCalls: parseAnthropicToolCalls(response),\n finishReason: mapAnthropicFinishReason(response.stop_reason),\n usage: {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n totalTokens: usage.input_tokens + usage.output_tokens,\n },\n };\n }\n}\n\n/**\n * Anthropic API request type\n */\ninterface AnthropicChatRequest {\n model: string;\n messages: Array<{\n role: string;\n content: string;\n }>;\n max_tokens: number;\n temperature?: number;\n system?: string;\n tools?: unknown[];\n stream?: boolean;\n}\n\n/**\n * Anthropic API response type\n */\ninterface AnthropicChatResponse {\n id: string;\n type: string;\n role: string;\n content: Array<\n | { type: 'text'; text: string }\n | {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n }\n >;\n model: string;\n stop_reason: string;\n stop_sequence?: string | null;\n usage: {\n input_tokens: number;\n output_tokens: number;\n };\n}\n","/**\n * Factory for creating LLM provider instances\n */\n\nimport { ILLMProvider } from './ILLMProvider.js';\nimport { LLMConfig } from '../types/index.js';\nimport { DeepSeekProvider } from './DeepSeekProvider.js';\nimport { AnthropicProvider } from './AnthropicProvider.js';\n\nexport class ProviderFactory {\n static create(config: LLMConfig): ILLMProvider {\n switch (config.provider.toLowerCase()) {\n case 'deepseek':\n return new DeepSeekProvider(config);\n case 'anthropic':\n return new AnthropicProvider(config);\n case 'openai':\n throw new Error(\n 'OpenAI provider coming soon - see roadmap Phase 3. ' +\n 'In the meantime, you can use DeepSeek which is OpenAI-compatible.'\n );\n case 'google':\n case 'gemini':\n throw new Error('Google/Gemini provider coming soon - see roadmap Phase 3.');\n case 'qwen':\n throw new Error(\n 'Qwen provider coming soon - see roadmap Phase 3. ' +\n 'In the meantime, you can use DeepSeek which is similar.'\n );\n case 'ollama':\n throw new Error('Ollama provider coming soon - see roadmap Phase 3.');\n default:\n throw new Error(`Unsupported provider: ${config.provider}`);\n }\n }\n}\n","/**\n * Configuration schemas with Zod validation\n */\n\nimport { z } from 'zod';\n\n// Theme options matching Claude Code + Mimir Nordic theme\nexport const ThemeSchema = z.enum([\n 'mimir',\n 'dark',\n 'light',\n 'dark-colorblind',\n 'light-colorblind',\n 'dark-ansi',\n 'light-ansi',\n]);\n\nexport const UIConfigSchema = z.object({\n theme: ThemeSchema.default('mimir'),\n syntaxHighlighting: z.boolean().default(true),\n showLineNumbers: z.boolean().default(true),\n compactMode: z.boolean().default(false),\n // Autocomplete behavior\n autocompleteAutoShow: z.boolean().default(true), // Automatically show autocomplete when suggestions available\n autocompleteExecuteOnSelect: z.boolean().default(true), // Execute command immediately if no more parameters needed\n});\n\nexport const LLMConfigSchema = z.object({\n provider: z.enum(['deepseek', 'anthropic', 'openai', 'google', 'gemini', 'qwen', 'ollama']),\n model: z.string(),\n apiKey: z.string().optional(),\n baseURL: z.string().optional(),\n temperature: z.number().min(0).max(2).default(0.7),\n maxTokens: z.number().default(4096),\n});\n\nexport const PermissionsConfigSchema = z.object({\n autoAccept: z.boolean().default(false),\n acceptRiskLevel: z.enum(['low', 'medium', 'high', 'critical']).default('medium'),\n alwaysAcceptCommands: z\n .array(z.string())\n .nullable()\n .default([])\n .transform((val) => val ?? []),\n});\n\n// Helper to accept string or array of strings for shortcuts\nconst shortcutSchema = z\n .union([z.string(), z.array(z.string()).min(1)])\n .transform((val) => (Array.isArray(val) ? val : [val]));\n\nexport const KeyBindingsConfigSchema = z.object({\n // Core actions - Ctrl+C and Escape share the same 'interrupt' logic\n interrupt: shortcutSchema.default(['Ctrl+C', 'Escape']),\n accept: shortcutSchema.default(['Enter']),\n\n // Mode and navigation\n modeSwitch: shortcutSchema.default(['Shift+Tab']),\n editCommand: shortcutSchema.default(['Ctrl+E']),\n\n // Autocomplete/tooltips\n showTooltip: shortcutSchema.default(['Ctrl+Space', 'Tab']),\n navigateUp: shortcutSchema.default(['ArrowUp']),\n navigateDown: shortcutSchema.default(['ArrowDown']),\n\n // Utility\n help: shortcutSchema.default(['?']),\n clearScreen: shortcutSchema.default(['Ctrl+L']),\n undo: shortcutSchema.default(['Ctrl+Z']),\n redo: shortcutSchema.default(['Ctrl+Y']), // Auto-converted to Cmd+Shift+Z on Mac\n\n // Legacy/deprecated - kept for backwards compatibility\n reject: shortcutSchema.default([]).optional(),\n});\n\nexport const DockerConfigSchema = z.object({\n enabled: z.boolean().default(true),\n baseImage: z.string().default('alpine:latest'),\n cpuLimit: z.number().optional(),\n memoryLimit: z.string().optional(),\n});\n\nexport const MonitoringConfigSchema = z.object({\n metricsRetentionDays: z.number().min(1).max(365).default(90),\n enableHealthChecks: z.boolean().default(true),\n healthCheckIntervalSeconds: z.number().min(10).max(3600).default(300),\n slowOperationThresholdMs: z.number().min(100).default(5000),\n batchWriteIntervalSeconds: z.number().min(1).max(60).default(10),\n});\n\nexport const BudgetConfigSchema = z.object({\n enabled: z.boolean().default(false),\n dailyLimit: z.number().min(0).optional(), // USD\n weeklyLimit: z.number().min(0).optional(),\n monthlyLimit: z.number().min(0).optional(),\n warningThreshold: z.number().min(0).max(1).default(0.8), // 80%\n});\n\nexport const RateLimitConfigSchema = z.object({\n enabled: z.boolean().default(true),\n commandsPerMinute: z.number().min(1).default(60),\n toolExecutionsPerMinute: z.number().min(1).default(30),\n llmCallsPerMinute: z.number().min(1).default(20),\n maxFileSizeMB: z.number().min(1).default(100),\n});\n\nexport const ConfigSchema = z.object({\n llm: LLMConfigSchema,\n permissions: PermissionsConfigSchema,\n keyBindings: KeyBindingsConfigSchema,\n docker: DockerConfigSchema,\n ui: UIConfigSchema,\n monitoring: MonitoringConfigSchema,\n budget: BudgetConfigSchema,\n rateLimit: RateLimitConfigSchema,\n});\n\nexport type Theme = z.infer<typeof ThemeSchema>;\nexport type UIConfig = z.infer<typeof UIConfigSchema>;\nexport type LLMConfig = z.infer<typeof LLMConfigSchema>;\nexport type PermissionsConfig = z.infer<typeof PermissionsConfigSchema>;\nexport type KeyBindingsConfig = z.infer<typeof KeyBindingsConfigSchema>;\nexport type DockerConfig = z.infer<typeof DockerConfigSchema>;\nexport type MonitoringConfig = z.infer<typeof MonitoringConfigSchema>;\nexport type BudgetConfig = z.infer<typeof BudgetConfigSchema>;\nexport type RateLimitConfig = z.infer<typeof RateLimitConfigSchema>;\nexport type Config = z.infer<typeof ConfigSchema>;\n","/**\n * Logging utility using winston\n */\n\nimport winston from 'winston';\nimport DailyRotateFile from 'winston-daily-rotate-file';\nimport fs from 'fs';\nimport path from 'path';\n\nexport type LogLevel = 'error' | 'warn' | 'info' | 'debug';\n\nexport class Logger {\n private logger: winston.Logger;\n private fileLoggingEnabled = false;\n private consoleTransport: winston.transport;\n\n constructor(logDir = '.mimir/logs') {\n // Resolve to absolute path for clarity\n const absoluteLogDir = path.resolve(process.cwd(), logDir);\n\n // Attempt to create log directory (synchronous to work in constructor)\n // Gracefully degrade to console-only logging if this fails\n try {\n if (!fs.existsSync(absoluteLogDir)) {\n fs.mkdirSync(absoluteLogDir, { recursive: true });\n }\n this.fileLoggingEnabled = true;\n } catch (error) {\n // Degrade gracefully - warn but don't crash\n console.warn(\n `[Logger] Warning: Failed to create log directory at ${absoluteLogDir}. File logging disabled. Error: ${error}`\n );\n this.fileLoggingEnabled = false;\n }\n\n // Build transports array conditionally\n // Create console transport (can be disabled later for Ink UI)\n this.consoleTransport = new winston.transports.Console({\n format: winston.format.combine(winston.format.colorize(), winston.format.simple()),\n });\n\n const transports: winston.transport[] = [this.consoleTransport];\n\n // Only add file transports if directory creation succeeded\n if (this.fileLoggingEnabled) {\n transports.push(\n // Error logs with daily rotation\n new DailyRotateFile({\n dirname: absoluteLogDir,\n filename: '%DATE%-error.log',\n datePattern: 'YYYYMMDD',\n level: 'error',\n maxSize: '10m', // Rotate when file reaches 10MB\n maxFiles: '30d', // Keep logs for 30 days\n zippedArchive: true, // Compress old logs\n }),\n // Combined logs with daily rotation\n new DailyRotateFile({\n dirname: absoluteLogDir,\n filename: '%DATE%.log',\n datePattern: 'YYYYMMDD',\n maxSize: '10m', // Rotate when file reaches 10MB\n maxFiles: '30d', // Keep logs for 30 days\n zippedArchive: true, // Compress old logs\n })\n );\n }\n\n this.logger = winston.createLogger({\n level: process.env.LOG_LEVEL || 'info',\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.errors({ stack: true }),\n winston.format.json()\n ),\n transports,\n });\n }\n\n error(message: string, meta?: Record<string, unknown>): void {\n this.logger.error(message, meta);\n }\n\n warn(message: string, meta?: Record<string, unknown>): void {\n this.logger.warn(message, meta);\n }\n\n info(message: string, meta?: Record<string, unknown>): void {\n this.logger.info(message, meta);\n }\n\n debug(message: string, meta?: Record<string, unknown>): void {\n this.logger.debug(message, meta);\n }\n\n /**\n * Disable console logging (useful when Ink UI is active)\n */\n disableConsole(): void {\n this.logger.remove(this.consoleTransport);\n }\n\n /**\n * Enable console logging\n */\n enableConsole(): void {\n if (!this.logger.transports.includes(this.consoleTransport)) {\n this.logger.add(this.consoleTransport);\n }\n }\n}\n\n// Singleton instance\nexport const logger = new Logger();\n","/**\n * Allowlist loader for team-shared command permissions\n * Loads from .mimir/allowlist.yml\n */\n\nimport { IFileSystem } from '../platform/IFileSystem.js';\nimport { logger } from '../utils/logger.js';\nimport yaml from 'yaml';\nimport path from 'path';\nimport { z } from 'zod';\n\n/**\n * Allowlist schema\n */\nexport const AllowlistSchema = z.object({\n // Command patterns that are always allowed\n commands: z.array(z.string()).default([]),\n\n // File patterns that can be modified without confirmation\n files: z.array(z.string()).default([]),\n\n // Network destinations that are allowed\n urls: z.array(z.string()).default([]),\n\n // Environment variables that can be accessed\n envVars: z.array(z.string()).default([]),\n\n // Specific bash commands that are safe\n bashCommands: z.array(z.string()).default([]),\n});\n\nexport type Allowlist = z.infer<typeof AllowlistSchema>;\n\nexport class AllowlistLoader {\n constructor(private fs: IFileSystem) {}\n\n /**\n * Load allowlist from project .mimir/allowlist.yml\n */\n async loadProjectAllowlist(projectRoot: string): Promise<Allowlist | null> {\n const allowlistPath = path.join(projectRoot, '.mimir', 'allowlist.yml');\n return await this.loadAllowlistFile(allowlistPath, 'project');\n }\n\n /**\n * Load allowlist from global ~/.mimir/allowlist.yml\n */\n async loadGlobalAllowlist(): Promise<Allowlist | null> {\n const homeDir = process.env.HOME || process.env.USERPROFILE || '~';\n const allowlistPath = path.join(homeDir, '.mimir', 'allowlist.yml');\n return await this.loadAllowlistFile(allowlistPath, 'global');\n }\n\n /**\n * Load and parse allowlist file\n */\n private async loadAllowlistFile(\n filePath: string,\n scope: 'global' | 'project'\n ): Promise<Allowlist | null> {\n try {\n if (!(await this.fs.exists(filePath))) {\n logger.debug(`No ${scope} allowlist found`, { path: filePath });\n return null;\n }\n\n const content = await this.fs.readFile(filePath);\n const parsed = yaml.parse(content) as unknown;\n\n // Validate schema\n const allowlist = AllowlistSchema.parse(parsed);\n\n logger.info(`Loaded ${scope} allowlist`, {\n path: filePath,\n commands: allowlist.commands.length,\n files: allowlist.files.length,\n urls: allowlist.urls.length,\n });\n\n return allowlist;\n } catch (error) {\n logger.error(`Failed to load ${scope} allowlist`, {\n path: filePath,\n error,\n });\n return null;\n }\n }\n\n /**\n * Merge multiple allowlists (global + project)\n * Project allowlist takes precedence\n */\n merge(global: Allowlist | null, project: Allowlist | null): Allowlist {\n const merged: Allowlist = {\n commands: [],\n files: [],\n urls: [],\n envVars: [],\n bashCommands: [],\n };\n\n // Merge global\n if (global) {\n merged.commands.push(...global.commands);\n merged.files.push(...global.files);\n merged.urls.push(...global.urls);\n merged.envVars.push(...global.envVars);\n merged.bashCommands.push(...global.bashCommands);\n }\n\n // Merge project (deduplicates)\n if (project) {\n // Use Set to deduplicate\n merged.commands = [...new Set([...merged.commands, ...project.commands])];\n merged.files = [...new Set([...merged.files, ...project.files])];\n merged.urls = [...new Set([...merged.urls, ...project.urls])];\n merged.envVars = [...new Set([...merged.envVars, ...project.envVars])];\n merged.bashCommands = [...new Set([...merged.bashCommands, ...project.bashCommands])];\n }\n\n return merged;\n }\n\n /**\n * Create example allowlist file\n */\n async createExample(filePath: string, scope: 'global' | 'project'): Promise<void> {\n const exampleContent = scope === 'global' ? this.getGlobalExample() : this.getProjectExample();\n\n try {\n const dir = path.dirname(filePath);\n if (!(await this.fs.exists(dir))) {\n await this.fs.mkdir(dir, { recursive: true });\n }\n\n await this.fs.writeFile(filePath, exampleContent);\n logger.info(`Created example ${scope} allowlist`, { path: filePath });\n } catch (error) {\n logger.error(`Failed to create example allowlist`, {\n path: filePath,\n error,\n });\n throw error;\n }\n }\n\n /**\n * Get example global allowlist\n */\n private getGlobalExample(): string {\n return `# Global Allowlist\n# Commands, files, and operations that are safe across all projects\n\n# Commands that don't require permission prompt\ncommands:\n - '/status' # Git status\n - '/diff' # Git diff\n - '/help' # Show help\n - '/version' # Show version\n - '/doctor' # System diagnostics\n\n# Safe bash commands\nbashCommands:\n - 'git status'\n - 'git diff'\n - 'git log'\n - 'ls'\n - 'pwd'\n - 'echo *'\n - 'cat *.md'\n\n# Files that can be modified without confirmation (use globs)\nfiles:\n - '**/*.md' # Documentation files\n - '**/*.txt' # Text files\n - '**/README.*' # README files\n\n# URLs that can be accessed without confirmation\nurls:\n - 'https://api.github.com/**'\n - 'https://registry.npmjs.org/**'\n\n# Environment variables that can be read\nenvVars:\n - 'NODE_ENV'\n - 'PATH'\n - 'USER'\n - 'HOME'\n`;\n }\n\n /**\n * Get example project allowlist\n */\n private getProjectExample(): string {\n return `# Project Allowlist\n# Team-shared permissions for this project\n# Commit this file to version control for consistent team experience\n\n# Custom slash commands that are safe to run\ncommands:\n - '/test' # Run test suite\n - '/lint' # Run linter\n - '/build' # Build project\n - '/test-coverage' # Run tests with coverage\n\n# Safe bash commands specific to this project\nbashCommands:\n - 'yarn test'\n - 'yarn lint'\n - 'yarn build'\n - 'npm run test'\n - 'npm run lint'\n\n# Files that can be auto-formatted or modified\nfiles:\n - 'src/**/*.ts' # TypeScript source files\n - 'src/**/*.tsx' # React TypeScript files\n - 'tests/**/*.ts' # Test files\n - '*.json' # JSON config files\n - '.prettierrc.*' # Prettier config\n - '.eslintrc.*' # ESLint config\n\n# API endpoints used by this project\nurls:\n - 'https://api.example.com/**'\n - 'https://staging.example.com/**'\n\n# Environment variables specific to this project\nenvVars:\n - 'API_KEY'\n - 'DATABASE_URL'\n - 'REDIS_URL'\n`;\n }\n}\n","/**\n * Configuration loader with hierarchy support\n * Priority: CLI flags > env vars > project config > global config > defaults\n */\n\nimport { Config, ConfigSchema } from './schemas.js';\nimport { IFileSystem } from '../platform/IFileSystem.js';\nimport { AllowlistLoader, Allowlist } from './AllowlistLoader.js';\nimport yaml from 'yaml';\nimport path from 'path';\nimport os from 'os';\nimport dotenv from 'dotenv';\nimport { logger } from '../utils/logger.js';\n\nexport interface ConfigLoadOptions {\n projectRoot?: string;\n cliFlags?: Partial<Config>;\n}\n\nexport interface ConfigLoadResult {\n config: Config;\n allowlist: Allowlist;\n}\n\nexport class ConfigLoader {\n private allowlistLoader: AllowlistLoader;\n\n constructor(private fs: IFileSystem) {\n this.allowlistLoader = new AllowlistLoader(fs);\n }\n\n /**\n * Load configuration with full hierarchy:\n * 1. Default config\n * 2. Global (~/.mimir/config.yml)\n * 3. Project (.mimir/config.yml)\n * 4. Environment variables (.env)\n * 5. CLI flags\n *\n * Also loads allowlist from:\n * 1. Global (~/.mimir/allowlist.yml)\n * 2. Project (.mimir/allowlist.yml)\n */\n async load(options: ConfigLoadOptions = {}): Promise<ConfigLoadResult> {\n // 1. Start with defaults\n let config = this.getDefaults();\n\n // 2. Load global config\n const globalConfig = await this.loadGlobalConfig();\n if (globalConfig) {\n config = this.merge(config, globalConfig);\n }\n\n // 3. Load project config\n if (options.projectRoot) {\n const projectConfig = await this.loadProjectConfig(options.projectRoot);\n if (projectConfig) {\n config = this.merge(config, projectConfig);\n }\n }\n\n // 4. Load .env file\n const envConfig = this.loadEnvConfig(options.projectRoot);\n if (envConfig) {\n config = this.merge(config, envConfig);\n }\n\n // 5. Apply CLI flags\n if (options.cliFlags) {\n config = this.merge(config, options.cliFlags);\n }\n\n // Validate final config\n const validatedConfig = ConfigSchema.parse(config);\n\n // Load allowlists\n const globalAllowlist = await this.allowlistLoader.loadGlobalAllowlist();\n const projectAllowlist = options.projectRoot\n ? await this.allowlistLoader.loadProjectAllowlist(options.projectRoot)\n : null;\n\n const mergedAllowlist = this.allowlistLoader.merge(globalAllowlist, projectAllowlist);\n\n // Merge allowlist commands with config.yml alwaysAcceptCommands\n if (mergedAllowlist.commands.length > 0) {\n validatedConfig.permissions.alwaysAcceptCommands = [\n ...new Set([\n ...validatedConfig.permissions.alwaysAcceptCommands,\n ...mergedAllowlist.commands,\n ]),\n ];\n }\n\n return {\n config: validatedConfig,\n allowlist: mergedAllowlist,\n };\n }\n\n private getDefaults(): Config {\n // Platform-specific defaults\n const isWindows = process.platform === 'win32';\n\n return {\n llm: {\n provider: 'deepseek',\n model: 'deepseek-chat',\n temperature: 0.7,\n maxTokens: 4096,\n },\n permissions: {\n autoAccept: false,\n acceptRiskLevel: 'medium',\n alwaysAcceptCommands: [],\n },\n keyBindings: {\n interrupt: ['Ctrl+C', 'Escape'],\n accept: ['Enter'],\n modeSwitch: ['Shift+Tab'],\n editCommand: ['Ctrl+E'],\n // Windows: Ctrl+Space is intercepted by terminal - use Tab only\n // macOS/Linux: Both work\n showTooltip: isWindows ? ['Tab'] : ['Ctrl+Space', 'Tab'],\n navigateUp: ['ArrowUp'],\n navigateDown: ['ArrowDown'],\n help: ['?'],\n clearScreen: ['Ctrl+L'],\n undo: ['Ctrl+Z'],\n redo: ['Ctrl+Y'],\n },\n docker: {\n enabled: true,\n baseImage: 'alpine:latest',\n },\n ui: {\n theme: 'mimir',\n syntaxHighlighting: true,\n showLineNumbers: true,\n compactMode: false,\n autocompleteAutoShow: true,\n autocompleteExecuteOnSelect: true,\n },\n monitoring: {\n metricsRetentionDays: 90,\n enableHealthChecks: true,\n healthCheckIntervalSeconds: 300,\n slowOperationThresholdMs: 5000,\n batchWriteIntervalSeconds: 10,\n },\n budget: {\n enabled: false,\n warningThreshold: 0.8,\n },\n rateLimit: {\n enabled: true,\n commandsPerMinute: 60,\n toolExecutionsPerMinute: 30,\n llmCallsPerMinute: 20,\n maxFileSizeMB: 100,\n },\n };\n }\n\n private async loadGlobalConfig(): Promise<Partial<Config> | null> {\n try {\n const configPath = path.join(os.homedir(), '.mimir', 'config.yml');\n if (!(await this.fs.exists(configPath))) {\n return null;\n }\n const content = await this.fs.readFile(configPath);\n return yaml.parse(content) as Partial<Config>;\n } catch (error) {\n logger.warn('Failed to load global config', { error });\n return null;\n }\n }\n\n private async loadProjectConfig(projectRoot: string): Promise<Partial<Config> | null> {\n try {\n const configPath = path.join(projectRoot, '.mimir', 'config.yml');\n if (!(await this.fs.exists(configPath))) {\n return null;\n }\n const content = await this.fs.readFile(configPath);\n return yaml.parse(content) as Partial<Config>;\n } catch (error) {\n logger.warn('Failed to load project config', { error });\n return null;\n }\n }\n\n private loadEnvConfig(projectRoot?: string): Partial<Config> | null {\n try {\n // Load .env from project root if provided, otherwise cwd\n const envPath = projectRoot ? path.join(projectRoot, '.env') : '.env';\n dotenv.config({ path: envPath });\n\n const envConfig: Record<string, unknown> = {};\n\n // Map environment variables to config structure\n if (\n process.env.DEEPSEEK_API_KEY ||\n process.env.ANTHROPIC_API_KEY ||\n process.env.OPENAI_API_KEY\n ) {\n const provider = process.env.LLM_PROVIDER?.toUpperCase();\n const apiKey = provider ? process.env[`${provider}_API_KEY`] : undefined;\n const baseURL = provider ? process.env[`${provider}_BASE_URL`] : undefined;\n\n if (apiKey || baseURL) {\n envConfig.llm = {\n ...(apiKey && { apiKey }),\n ...(baseURL && { baseURL }),\n };\n }\n }\n\n if (process.env.DOCKER_ENABLED) {\n envConfig.docker = {\n enabled: process.env.DOCKER_ENABLED === 'true',\n };\n }\n\n if (process.env.MIMIR_THEME) {\n envConfig.ui = {\n theme: process.env.MIMIR_THEME,\n };\n }\n\n return Object.keys(envConfig).length > 0 ? (envConfig as Partial<Config>) : null;\n } catch (error) {\n logger.warn('Failed to load .env config', { error });\n return null;\n }\n }\n\n private merge(base: Config, override: Partial<Config>): Config {\n return {\n llm: { ...base.llm, ...override.llm },\n permissions: { ...base.permissions, ...override.permissions },\n keyBindings: { ...base.keyBindings, ...override.keyBindings },\n docker: { ...base.docker, ...override.docker },\n ui: { ...base.ui, ...override.ui },\n monitoring: { ...base.monitoring, ...override.monitoring },\n budget: { ...base.budget, ...override.budget },\n rateLimit: { ...base.rateLimit, ...override.rateLimit },\n };\n }\n\n async save(\n config: Partial<Config>,\n scope: 'global' | 'project',\n projectRoot?: string\n ): Promise<void> {\n const configPath =\n scope === 'global'\n ? path.join(os.homedir(), '.mimir', 'config.yml')\n : path.join(projectRoot || process.cwd(), '.mimir', 'config.yml');\n\n const configDir = path.dirname(configPath);\n\n // Ensure directory exists\n if (!(await this.fs.exists(configDir))) {\n await this.fs.mkdir(configDir, { recursive: true });\n }\n\n const yamlContent = yaml.stringify(config);\n await this.fs.writeFile(configPath, yamlContent);\n logger.info(`Config saved to ${configPath}`);\n }\n\n validate(config: unknown): Config {\n return ConfigSchema.parse(config);\n }\n}\n","/**\n * FileSystemAdapter - Cross-platform file system implementation\n * Uses Node.js fs/promises + fast-glob for file operations\n */\n\nimport { IFileSystem, Stats } from './IFileSystem.js';\nimport fs from 'fs/promises';\nimport fg from 'fast-glob';\n\nexport class FileSystemAdapter implements IFileSystem {\n async readFile(path: string, encoding: BufferEncoding = 'utf-8'): Promise<string> {\n return fs.readFile(path, encoding);\n }\n\n async writeFile(\n path: string,\n content: string,\n encoding: BufferEncoding = 'utf-8'\n ): Promise<void> {\n await fs.writeFile(path, content, encoding);\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n await fs.mkdir(path, options);\n }\n\n async readdir(path: string): Promise<string[]> {\n return fs.readdir(path);\n }\n\n async stat(path: string): Promise<Stats> {\n const stats = await fs.stat(path);\n return {\n isFile: () => stats.isFile(),\n isDirectory: () => stats.isDirectory(),\n size: stats.size,\n mtime: stats.mtime,\n };\n }\n\n async unlink(path: string): Promise<void> {\n await fs.unlink(path);\n }\n\n async rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n await fs.rmdir(path, options);\n }\n\n async copyFile(src: string, dest: string): Promise<void> {\n await fs.copyFile(src, dest);\n }\n\n async glob(pattern: string, options?: { cwd?: string; ignore?: string[] }): Promise<string[]> {\n return fg(pattern, {\n cwd: options?.cwd,\n ignore: options?.ignore,\n });\n }\n}\n"],"mappings":"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","names":["encode","encode","path","z","fs","yaml","path","fs","path","yaml","fs","path"]}